V20260210 #184

Merged
hjjeong merged 2 commits from V20260210 into main 2026-03-25 08:12:21 +00:00
6 changed files with 274 additions and 379 deletions

View File

@@ -1418,22 +1418,17 @@
</tr>
<tr>
<td class="input_title"><label for="">수주상태 <span style="color:red;">*</span></label></td>
<td>
<select name="contract_result" id="contract_result" required reqTitle="수주상태" type="select" class="select2">
<option value="">선택</option>
${code_map.contract_result}
</select>
</td>
<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 colspan="3">
<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>
</td>
</tr>

View File

@@ -151,6 +151,23 @@ $(document).ready(function(){
document.form1.submit();
});
// 수주확정
$("#btnOrderConfirm").click(function(){
var selectedData = _tabulGrid.getSelectedData();
if(selectedData.length < 1){
Swal.fire("수주확정할 행을 선택해주십시오.");
return false;
} else if(selectedData.length > 1){
Swal.fire("한번에 한개의 수주만 확정 가능합니다.");
return false;
}
var contractObjId = fnc_checkNull(selectedData[0].OBJID);
var currentStatus = fnc_checkNull(selectedData[0].CONTRACT_RESULT_NAME);
fn_openOrderConfirmPopup(contractObjId, currentStatus);
});
// 수주취소
$("#btnOrderCancel").click(function(){
var selectedData = _tabulGrid.getSelectedData();
@@ -710,6 +727,73 @@ function fn_displaySerialNoList(serialNumbers){
});
}
// 수주확정 팝업 - 수주상태 선택하여 저장
function fn_openOrderConfirmPopup(contractObjId, currentStatus){
// 검색 필터의 수주상태 select에서 옵션 목록을 가져와서 SweetAlert에서 사용
var optionsHtml = '';
$("#contract_result option").each(function(){
var val = $(this).val();
var text = $(this).text();
if(val !== ''){
optionsHtml += '<option value="' + val + '">' + text + '</option>';
}
});
Swal.fire({
title: '수주확정',
html: '<div style="text-align:left; padding:10px;">' +
'<div style="margin-bottom:10px;"><strong>현재 수주상태:</strong> ' + (currentStatus || '-') + '</div>' +
'<div style="margin-bottom:5px;"><label for="swal_contract_result"><strong>변경할 수주상태 <span style="color:red;">*</span></strong></label></div>' +
'<select id="swal_contract_result" class="swal2-select" style="width:100%; padding:8px; border:1px solid #ddd; border-radius:4px;">' +
'<option value="">선택</option>' +
optionsHtml +
'</select>' +
'</div>',
width: 400,
showCancelButton: true,
confirmButtonColor: '#3085d6',
cancelButtonColor: '#d33',
confirmButtonText: '확정',
cancelButtonText: '취소',
preConfirm: function() {
var selectedVal = document.getElementById('swal_contract_result').value;
if(!selectedVal) {
Swal.showValidationMessage('수주상태를 선택해주세요.');
return false;
}
return selectedVal;
}
}).then(function(result) {
if(result.isConfirmed) {
$.ajax({
url: "/contractMgmt/updateOrderStatus.do",
type: "POST",
data: {
objId: contractObjId,
contract_result: result.value
},
dataType: "json",
success: function(data){
if(data.result === "SUCCESS"){
Swal.fire({
title: '수주확정 완료',
text: '수주상태가 변경되었습니다.',
icon: 'success'
}).then(function(){
fn_search();
});
} else {
Swal.fire("수주확정 저장 중 오류가 발생했습니다.");
}
},
error: function(){
Swal.fire("서버 통신 오류가 발생했습니다.");
}
});
}
});
}
// 수주취소 팝업 - 품목별 취소 수량 입력
function fn_openOrderCancelPopup(contractObjId){
$.ajax({
@@ -971,7 +1055,8 @@ function openProjectFormPopUp(objId){
</h2>
<div class="btnArea">
<input type="button" value="조회" class="plm_btns" id="btnSearch" name="btnSearch">
<input type="button" value="수주등록" class="plm_btns btnRegist">
<input type="button" value="수주입력" class="plm_btns btnRegist">
<input type="button" value="수주확정" class="plm_btns" id="btnOrderConfirm" style="background-color:#2ecc71; color:#fff;">
<input type="button" value="수주취소" class="plm_btns" id="btnOrderCancel" style="background-color:#e74c3c; color:#fff;">
<input type="button" value="결재상신" class="plm_btns" id="btnApproval">
</div>

View File

@@ -444,27 +444,21 @@
<col width="35%" />
</colgroup>
<!-- 첫번째 행: 수주상태, 발주번호 -->
<!-- 첫번째 행: 발주번호 -->
<tr>
<td class="input_title"><label for="">수주상태 <span style="color:red;">*</span></label></td>
<td class="input_title"><label for="">발주번호</label></td>
<td>
<select name="contract_result" id="contract_result" required reqTitle="수주상태" type="select" class="select2">
<option value="">선택</option>
${code_map.contract_result}
</select>
<input type="text" name="po_no" id="po_no" value="${info.PO_NO}" />
</td>
<td class="input_title"><label for="">발주번호</label></td>
<td>
<input type="text" name="po_no" id="po_no" value="${info.PO_NO}" />
</td>
</tr>
<!-- 두번째 행: 발주일, 견적환종 -->
<tr>
<input type="hidden" name="contract_result" id="contract_result" value="${info.CONTRACT_RESULT}" />
<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>
</tr>
<tr>
<td class="input_title"><label for="">견적환종</label></td>
<td>
<select name="contract_currency" id="contract_currency" reqTitle="환종" type="select" class="select2">
@@ -472,12 +466,8 @@
${code_map.contract_currency}
</select>
</td>
</tr>
<!-- 세번째 행: 견적환율 -->
<tr>
<td class="input_title"><label for="">견적환율</label></td>
<td colspan="3">
<td colspan="">
<input type="text" name="exchange_rate" id="exchange_rate" reqTitle="환율" value="${info.EXCHANGE_RATE}" numberOnly />
</td>
</tr>

View File

@@ -187,8 +187,8 @@ function _fnc_datepick(){
${code_map.project_no}
</select>
</td>
</tr>
<tr>
<!-- </tr>
<tr> -->
<td><label for="product">제품구분</label></td>
<td>
<select name="product" id="product" class="select2" autocomplete="off">
@@ -199,7 +199,7 @@ function _fnc_datepick(){
<td><label for="part_no">품번</label></td>
<td>
<input type="text" name="part_no" id="part_no" value="${param.part_no}" style="width:130px" />
<input type="text" name="part_no" id="part_no" value="${param.part_no}" style="width:200px" />
</td>
<td><label for="part_name">품명</label></td>

View File

@@ -1560,10 +1560,12 @@
,CONTRACT_DEL_DATE = #{contract_del_date}
,CONTRACT_COMPANY = #{contract_company}
,CONTRACT_DATE = #{contract_date}
,PO_NO = #{po_no}
,MANUFACTURE_PLANT = #{manufacture_plant}
,CONTRACT_RESULT = #{contract_result}
,PROJECT_NAME = #{project_name}
,PO_NO = #{po_no}
,MANUFACTURE_PLANT = #{manufacture_plant}
<if test="contract_result != null and contract_result != ''">
,CONTRACT_RESULT = #{contract_result}
</if>
,PROJECT_NAME = #{project_name}
,SPEC_USER_ID = #{spec_user_id}
,SPEC_PLAN_DATE = #{spec_plan_date}
,SPEC_COMP_DATE = #{spec_comp_date}
@@ -1730,10 +1732,12 @@
,CONTRACT_DEL_DATE = #{contract_del_date}
,CONTRACT_COMPANY = #{contract_company}
,CONTRACT_DATE = #{contract_date}
,PO_NO = #{po_no}
,MANUFACTURE_PLANT = #{manufacture_plant}
,CONTRACT_RESULT = #{contract_result}
,PROJECT_NAME = #{project_name}
,PO_NO = #{po_no}
,MANUFACTURE_PLANT = #{manufacture_plant}
<if test="contract_result != null and contract_result != ''">
,CONTRACT_RESULT = #{contract_result}
</if>
,PROJECT_NAME = #{project_name}
,AREA_CD = #{area_cd} -->
</update>
@@ -4991,7 +4995,9 @@ WHERE
<update id="updateOrderInfo" parameterType="map">
UPDATE CONTRACT_MGMT
SET
<if test="contract_result != null and contract_result != ''">
CONTRACT_RESULT = #{contract_result},
</if>
PO_NO = #{po_no},
ORDER_DATE = #{order_date},
CONTRACT_CURRENCY = #{contract_currency},
@@ -5083,7 +5089,9 @@ WHERE
PAID_TYPE = #{paid_type},
RECEIPT_DATE = #{receipt_date},
REQ_DEL_DATE = #{req_del_date},
<if test="contract_result != null and contract_result != ''">
CONTRACT_RESULT = #{contract_result},
</if>
PO_NO = #{po_no},
ORDER_DATE = #{order_date},
CONTRACT_CURRENCY = #{contract_currency},

View File

@@ -603,75 +603,17 @@ public class ContractMgmtService {
PersonBean person = (PersonBean)request.getSession().getAttribute(Constants.PERSON_BEAN);
paramMap.put("writer", person.getUserId());
int cnt = sqlSession.update("contractMgmt.saveContractMgmtInfo", paramMap);
//영업 수주 완료시 자동 프로젝트 등록 로직
String result_cd= CommonUtils.checkNull(paramMap.get("contract_result"));
String contract_objid= CommonUtils.checkNull(paramMap.get("objId"));
String category_cd= CommonUtils.checkNull(paramMap.get("category_cd"));
String target_project_no= CommonUtils.checkNull(paramMap.get("target_project_no_direct"));
int overhaul_order = Integer.parseInt(CommonUtils.checkNull(paramMap.get("overhaul_order"),"1"));
int project_cnt= Integer.parseInt(CommonUtils.checkNull(paramMap.get("facility_qty"), "1"));
double contract_price_currency= Double.parseDouble(CommonUtils.checkNull(paramMap.get("contract_price_currency"), "0").replace(",", ""));
double contract_price= Double.parseDouble(CommonUtils.checkNull(paramMap.get("contract_price"), "0").replace(",", ""));
//수주가와 금액은 대수로 나누어서 등록
paramMap.put("contract_price_currency", String.valueOf(contract_price_currency/project_cnt));
paramMap.put("contract_price", String.valueOf(contract_price/project_cnt));
if("0000964".equals(result_cd)){
resultList = sqlSession.selectOne("contractMgmt.getProjectListBycontractObjid", paramMap);
System.out.println("resultList:::"+resultList);
//resultList = sqlSession.selectOne("contractMgmt.getProjectCnt", paramMap);
if(null==resultList){
for (int i=0; i<project_cnt; i++){
paramMap.put("OBJID", CommonUtils.createObjId());
paramMap.put("is_temp", '1');
paramMap.put("facility_qty", '1');
if("0000170".equals(category_cd) || "0000171".equals(category_cd)){
paramMap.put("overhaul_project_no", target_project_no);
paramMap.put("overhaul_order", overhaul_order+i);
}else{
}
//프로젝트 등록
cnt = sqlSession.update("project.createProject", paramMap);
//프로젝트 TASK 등록
cnt = sqlSession.insert("contractMgmt.insertProjectTask", paramMap);
//프로젝트 SETUP_TASK 등록
cnt = sqlSession.insert("contractMgmt.insertProjectSetupTask", paramMap);
//project_no - unit 폴더 생성
//paramMap.put("OBJID", paramMap.get("OBJID"));
Map<String,Object> projectInfo = (Map)sqlSession.selectOne("project.getProjectMngInfo", paramMap);
paramMap.put("contract_objid", paramMap.get("objId"));
paramMap.put("customer_product", paramMap.get("mechanical_type"));
List<Map<String,Object>> taskUnitList = (ArrayList)sqlSession.selectList("project.getWbsTaskListByProject", paramMap);
if(CommonUtils.isNotEmpty(taskUnitList) && !taskUnitList.isEmpty()){
String projectNo = (String)projectInfo.get("project_no");
String filepath = Constants.FILE_STORAGE+"\\PART_DATA\\";
for (Map<String, Object> map : taskUnitList) {
File file = new File(filepath+File.separator+projectNo+File.separator+CommonUtils.checkNull((String)map.get("unit_no"))+"-"+CommonUtils.checkNull((String)map.get("task_name")));
if(!file.exists()){
file.mkdirs();
}
}
}
}
}else{
sqlSession.update("project.ModifyProjectByContract", paramMap);
}
// 프로젝트 생성은 수주확정(updateOrderStatus)에서 처리
// 프로젝트가 이미 존재하는 경우에는 수량/납기 등 업데이트 반영
resultList = sqlSession.selectOne("contractMgmt.getProjectListBycontractObjid", paramMap);
if(resultList != null) {
sqlSession.update("project.ModifyProjectByContract", paramMap);
}
if(cnt > 0){
//계약완료 일시 메일
if("0000964".equals(CommonUtils.checkNull(paramMap.get("contract_result")))){
commonService.SendMail(paramMap,"CONTRACT_COMP",CommonUtils.checkNull(paramMap.get("pm_user_id")));
//그냥 등록일때 메일
}else{
if("regist".equals(CommonUtils.checkNull(paramMap.get("actionType")))){
if("regist".equals(CommonUtils.checkNull(paramMap.get("actionType")))){
commonService.SendMail(paramMap,"CONTRACT_REG",CommonUtils.checkNull(paramMap.get("")));
}
}
}
resultMap.put("result", true);
@@ -2792,39 +2734,23 @@ private String encodeImageToBase64(String imagePath) {
// 합계만 별도 업데이트 (기본 정보는 이미 saveEstimateAndOrderInfo에서 저장됨)
sqlSession.update("contractMgmt.updateOrderTotalAmounts", paramMap);
// 4. 프로젝트 생성 로직 (수주 또는 수주(FCST)인 경우)
String result_cd = CommonUtils.checkNull(paramMap.get("contract_result"));
String category_cd = CommonUtils.checkNull(paramMap.get("category_cd"));
String target_project_no = CommonUtils.checkNull(paramMap.get("target_project_no_direct"));
// 수주(0000964) 또는 수주(FCST)(0000968)인 경우 프로젝트 생성
if("0000964".equals(result_cd) || "0000968".equals(result_cd)){
// CONTRACT_OBJID로 프로젝트 존재 여부 확인
Map resultList = sqlSession.selectOne("contractMgmt.getProjectListBycontractObjid", paramMap);
boolean hasProject = (resultList != null);
// 제품구분 확인 (DB에서 조회)
// 프로젝트 생성은 수주확정(updateOrderStatus)에서 처리
// 프로젝트가 이미 존재하는 경우에는 수량/납기 등 업데이트 반영
String contract_objid_for_project = CommonUtils.checkNull(paramMap.get("objId"));
Map projectCheckResult = sqlSession.selectOne("contractMgmt.getProjectListBycontractObjid", paramMap);
if(projectCheckResult != 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);
if(isMachine) {
System.out.println("제품구분: Machine(0000928) - 품목별 수량만큼 프로젝트 생성");
}
// 품목별로 프로젝트 생성 또는 업데이트 (같은 트랜잭션의 sqlSession 사용)
paramMap.put("contractObjId", contract_objid);
List contractItemsRaw = sqlSession.selectList("contractMgmt.getContractItems", paramMap);
List<Map<String, Object>> contractItems = CommonUtils.toUpperCaseMapKey(contractItemsRaw);
paramMap.put("contractObjId", contract_objid_for_project);
List contractItemsRaw = sqlSession.selectList("contractMgmt.getContractItems", paramMap);
List<Map<String, Object>> contractItems = CommonUtils.toUpperCaseMapKey(contractItemsRaw);
if(contractItems != null && !contractItems.isEmpty()) {
System.out.println("품목 개수: " + contractItems.size() + "개 - 프로젝트 " + (hasProject ? "업데이트" : "생성") + " 시작" + (isMachine ? " (Machine - 수량별 생성)" : ""));
for(Map item : contractItems) {
// 수량 가져오기 (소수점 형태 "2.00"도 처리)
Object quantityObj = item.get("ORDER_QUANTITY") != null ? item.get("ORDER_QUANTITY") : item.get("QUANTITY");
int itemQuantity = 1;
try {
@@ -2832,109 +2758,22 @@ private String encodeImageToBase64(String imagePath) {
} catch (Exception e) {
itemQuantity = 1;
}
// Machine인 경우 수량만큼 반복, 아니면 1번만 실행
int loopCount = (isMachine && !hasProject) ? itemQuantity : 1;
for(int q = 0; q < loopCount; q++) {
if(!hasProject) {
// 프로젝트가 없으면 모든 품목에 대해 생성
Map<String, Object> projectParam = new HashMap<String, Object>();
projectParam.putAll(paramMap); // 기본 정보 복사
// 품목별 정보 설정
projectParam.put("OBJID", CommonUtils.createObjId());
projectParam.put("is_temp", '1');
projectParam.put("part_objid", item.get("PART_OBJID"));
projectParam.put("contract_item_objid", String.valueOf(item.get("OBJID")));
projectParam.put("part_no", item.get("PART_NO"));
projectParam.put("part_name", item.get("PART_NAME"));
// Machine인 경우 각 프로젝트의 수량은 1, 아니면 원래 수량
projectParam.put("quantity", isMachine ? "1" : String.valueOf(itemQuantity));
projectParam.put("due_date", item.get("DUE_DATE"));
if("0000170".equals(category_cd) || "0000171".equals(category_cd)){
projectParam.put("overhaul_project_no", target_project_no);
}
if(isMachine) {
System.out.println("프로젝트 생성 [" + (q+1) + "/" + loopCount + "] - PART_OBJID: " + item.get("PART_OBJID") + ", 품번: " + item.get("PART_NO") + ", 품명: " + item.get("PART_NAME") + ", 수량: 1");
} else {
System.out.println("프로젝트 생성 - PART_OBJID: " + item.get("PART_OBJID") + ", 품번: " + item.get("PART_NO") + ", 품명: " + item.get("PART_NAME") + ", 수량: " + itemQuantity);
}
// 프로젝트 등록
cnt = sqlSession.update("project.createProject", projectParam);
// WBS 자동생성 주석처리
// // 프로젝트 TASK 등록
// cnt = sqlSession.insert("contractMgmt.insertProjectTask", projectParam);
// // 프로젝트 SETUP_TASK 등록
// cnt = sqlSession.insert("contractMgmt.insertProjectSetupTask", projectParam);
// 동일 품번 M-BOM 자동 복사 제거 - 수주 시점에는 총생산수량 미확정이므로
// M-BOM관리에서 생산계획 입력 후 수동 복사하도록 변경
// if(!isMachine) {
// copyMbomIfSamePartNoExists(sqlSession,
// (String)projectParam.get("OBJID"),
// CommonUtils.checkNull(item.get("PART_NO")),
// CommonUtils.checkNull(item.get("PART_NAME")),
// person.getUserId(),
// itemQuantity);
// }
// WBS 폴더 생성 주석처리
// // project_no - unit 폴더 생성
// Map<String,Object> projectInfo = (Map)sqlSession.selectOne("project.getProjectMngInfo", projectParam);
//
// projectParam.put("contract_objid", contract_objid);
// projectParam.put("customer_product", projectParam.get("mechanical_type"));
// List<Map<String,Object>> taskUnitList = (ArrayList)sqlSession.selectList("project.getWbsTaskListByProject", projectParam);
// if(CommonUtils.isNotEmpty(taskUnitList) && !taskUnitList.isEmpty()){
// String projectNo = (String)projectInfo.get("project_no");
// String filepath = Constants.FILE_STORAGE+"\\PART_DATA\\";
// for (Map<String, Object> map : taskUnitList) {
// File file = new File(filepath+File.separator+projectNo+File.separator+CommonUtils.checkNull((String)map.get("unit_no"))+"-"+CommonUtils.checkNull((String)map.get("task_name")));
// if(!file.exists()){
// file.mkdirs();
// }
// }
// }
} else {
// 프로젝트가 있으면 모든 품목 업데이트 (수량, 금액 등만)
Map<String, Object> updateParam = new HashMap<String, Object>();
updateParam.putAll(paramMap);
updateParam.put("part_objid", item.get("PART_OBJID"));
// Machine인 경우 수량은 변경하지 않음 (프로젝트별 1로 유지)
if(isMachine) {
updateParam.remove("quantity");
} else {
updateParam.put("quantity", String.valueOf(itemQuantity));
}
updateParam.put("due_date", item.get("DUE_DATE"));
System.out.println("프로젝트 업데이트 - PART_OBJID: " + item.get("PART_OBJID") + (isMachine ? ", 수량: 변경안함(Machine)" : ", 수량: " + itemQuantity));
sqlSession.update("project.ModifyProjectByContract", updateParam);
}
Map<String, Object> updateParam = new HashMap<String, Object>();
updateParam.putAll(paramMap);
updateParam.put("part_objid", item.get("PART_OBJID"));
if(isMachine) {
updateParam.remove("quantity");
} else {
updateParam.put("quantity", String.valueOf(itemQuantity));
}
updateParam.put("due_date", item.get("DUE_DATE"));
sqlSession.update("project.ModifyProjectByContract", updateParam);
}
} else {
System.out.println("품목이 없습니다 - 기존 방식으로 프로젝트 생성");
// 품목이 없는 경우 기존 방식대로 처리
if(!hasProject){
paramMap.put("OBJID", CommonUtils.createObjId());
paramMap.put("is_temp", '1');
if("0000170".equals(category_cd) || "0000171".equals(category_cd)){
paramMap.put("overhaul_project_no", target_project_no);
}
cnt = sqlSession.update("project.createProject", paramMap);
cnt = sqlSession.insert("contractMgmt.insertProjectTask", paramMap);
cnt = sqlSession.insert("contractMgmt.insertProjectSetupTask", paramMap);
}else{
sqlSession.update("project.ModifyProjectByContract", paramMap);
}
sqlSession.update("project.ModifyProjectByContract", paramMap);
}
}
sqlSession.commit();
resultMap.put("result", "true");
resultMap.put("msg", "저장되었습니다.");
@@ -3018,48 +2857,23 @@ private String encodeImageToBase64(String imagePath) {
// 기본 수주 정보 및 합계 업데이트
int cnt = sqlSession.update("contractMgmt.updateOrderInfo", paramMap);
//영업 수주 완료시 자동 프로젝트 등록 로직
String result_cd= CommonUtils.checkNull(paramMap.get("contract_result"));
String category_cd= CommonUtils.checkNull(paramMap.get("category_cd"));
String target_project_no= CommonUtils.checkNull(paramMap.get("target_project_no_direct"));
//int overhaul_order = Integer.parseInt(CommonUtils.checkNull(paramMap.get("overhaul_order"),"1"));
//int project_cnt= Integer.parseInt(CommonUtils.checkNull(paramMap.get("facility_qty"), "1"));
//long contract_price_currency= Long.parseLong(CommonUtils.checkNull(paramMap.get("contract_price_currency"), "0"));
//long contract_price= Long.parseLong(CommonUtils.checkNull(paramMap.get("contract_price"), "0"));
//수주가와 금액은 대수로 나누어서 등록
//paramMap.put("contract_price_currency", contract_price_currency/project_cnt + "");
//paramMap.put("contract_price", contract_price/project_cnt + "");
if("0000964".equals(result_cd) || "0000968".equals(result_cd)){
// CONTRACT_OBJID로 프로젝트 존재 여부 확인 (한 번만 체크)
resultList = sqlSession.selectOne("contractMgmt.getProjectListBycontractObjid", paramMap);
boolean hasProject = (resultList != null);
// 제품구분 확인 (DB에서 조회)
// 프로젝트 생성은 수주확정(updateOrderStatus)에서 처리
// 프로젝트가 이미 존재하는 경우에는 수량/납기 등 업데이트 반영
resultList = sqlSession.selectOne("contractMgmt.getProjectListBycontractObjid", paramMap);
if(resultList != null) {
// 제품구분 확인
Map<String, Object> contractInfo = (Map<String, Object>) sqlSession.selectOne("contractMgmt.getContractBasicInfo", paramMap);
// MyBatis resultType="map"은 소문자로 반환되므로 대문자로 변환
contractInfo = CommonUtils.toUpperCaseMapKey(contractInfo);
String product_cd = contractInfo != null ? CommonUtils.checkNull(contractInfo.get("PRODUCT")) : "";
boolean isMachine = "0000928".equals(product_cd);
if(isMachine) {
System.out.println("제품구분: Machine(0000928) - 품목별 수량만큼 프로젝트 생성");
}
// 품목별로 프로젝트 생성 또는 업데이트 (같은 트랜잭션의 sqlSession 사용)
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()) {
System.out.println("품목 개수: " + contractItems.size() + "개 - 프로젝트 " + (hasProject ? "업데이트" : "생성") + " 시작" + (isMachine ? " (Machine - 수량별 생성)" : ""));
for(Map item : contractItems) {
// 수량 가져오기 (소수점 형태 "2.00"도 처리)
Object quantityObj = item.get("ORDER_QUANTITY") != null ? item.get("ORDER_QUANTITY") : item.get("QUANTITY");
int itemQuantity = 1;
try {
@@ -3067,120 +2881,22 @@ private String encodeImageToBase64(String imagePath) {
} catch (Exception e) {
itemQuantity = 1;
}
// Machine인 경우 수량만큼 반복, 아니면 1번만 실행
int loopCount = (isMachine && !hasProject) ? itemQuantity : 1;
for(int q = 0; q < loopCount; q++) {
if(!hasProject) {
// 프로젝트가 없으면 모든 품목에 대해 생성
Map<String, Object> projectParam = new HashMap<String, Object>();
projectParam.putAll(paramMap); // 기본 정보 복사
// 품목별 정보 설정
projectParam.put("OBJID", CommonUtils.createObjId());
projectParam.put("is_temp", '1');
projectParam.put("contract_item_objid", String.valueOf(item.get("OBJID")));
System.out.println("CONTRACT_ITEM_OBJID 매핑: " + item.get("OBJID") + " (type: " + (item.get("OBJID") != null ? item.get("OBJID").getClass().getName() : "null") + ")");
projectParam.put("part_objid", item.get("PART_OBJID"));
projectParam.put("part_no", item.get("PART_NO"));
projectParam.put("part_name", item.get("PART_NAME"));
// Machine인 경우 각 프로젝트의 수량은 1, 아니면 원래 수량
projectParam.put("quantity", isMachine ? "1" : String.valueOf(itemQuantity));
projectParam.put("due_date", item.get("DUE_DATE"));
if("0000170".equals(category_cd) || "0000171".equals(category_cd)){
projectParam.put("overhaul_project_no", target_project_no);
}
if(isMachine) {
System.out.println("프로젝트 생성 [" + (q+1) + "/" + loopCount + "] - PART_OBJID: " + item.get("PART_OBJID") + ", 품번: " + item.get("PART_NO") + ", 품명: " + item.get("PART_NAME") + ", 수량: 1");
} else {
System.out.println("프로젝트 생성 - PART_OBJID: " + item.get("PART_OBJID") + ", 품번: " + item.get("PART_NO") + ", 품명: " + item.get("PART_NAME") + ", 수량: " + itemQuantity);
}
// 프로젝트 등록
cnt = sqlSession.update("project.createProject", projectParam);
// WBS 자동생성 주석처리
// // 프로젝트 TASK 등록
// cnt = sqlSession.insert("contractMgmt.insertProjectTask", projectParam);
// // 프로젝트 SETUP_TASK 등록
// cnt = sqlSession.insert("contractMgmt.insertProjectSetupTask", projectParam);
// 동일 품번 M-BOM 자동 복사 제거 - 수주 시점에는 총생산수량 미확정이므로
// M-BOM관리에서 생산계획 입력 후 수동 복사하도록 변경
// if(!isMachine) {
// copyMbomIfSamePartNoExists(sqlSession,
// (String)projectParam.get("OBJID"),
// CommonUtils.checkNull(item.get("PART_NO")),
// CommonUtils.checkNull(item.get("PART_NAME")),
// person.getUserId(),
// itemQuantity);
// }
// WBS 폴더 생성 주석처리
// // project_no - unit 폴더 생성
// Map<String,Object> projectInfo = (Map)sqlSession.selectOne("project.getProjectMngInfo", projectParam);
//
// projectParam.put("contract_objid", contract_objid);
// projectParam.put("customer_product", projectParam.get("mechanical_type"));
// List<Map<String,Object>> taskUnitList = (ArrayList)sqlSession.selectList("project.getWbsTaskListByProject", projectParam);
// if(CommonUtils.isNotEmpty(taskUnitList) && !taskUnitList.isEmpty()){
// String projectNo = (String)projectInfo.get("project_no");
// String filepath = Constants.FILE_STORAGE+"\\PART_DATA\\";
// for (Map<String, Object> map : taskUnitList) {
// File file = new File(filepath+File.separator+projectNo+File.separator+CommonUtils.checkNull((String)map.get("unit_no"))+"-"+CommonUtils.checkNull((String)map.get("task_name")));
// if(!file.exists()){
// file.mkdirs();
// }
// }
// }
} else {
// 프로젝트가 있으면 모든 품목 업데이트 (수량, 금액 등만)
Map<String, Object> updateParam = new HashMap<String, Object>();
updateParam.putAll(paramMap);
updateParam.put("part_objid", item.get("PART_OBJID"));
// Machine인 경우 수량은 변경하지 않음 (프로젝트별 1로 유지)
if(isMachine) {
updateParam.remove("quantity");
} else {
updateParam.put("quantity", String.valueOf(itemQuantity));
}
updateParam.put("due_date", item.get("DUE_DATE"));
System.out.println("프로젝트 업데이트 - PART_OBJID: " + item.get("PART_OBJID") + (isMachine ? ", 수량: 변경안함(Machine)" : ", 수량: " + itemQuantity));
sqlSession.update("project.ModifyProjectByContract", updateParam);
}
Map<String, Object> updateParam = new HashMap<String, Object>();
updateParam.putAll(paramMap);
updateParam.put("part_objid", item.get("PART_OBJID"));
if(isMachine) {
updateParam.remove("quantity");
} else {
updateParam.put("quantity", String.valueOf(itemQuantity));
}
updateParam.put("due_date", item.get("DUE_DATE"));
sqlSession.update("project.ModifyProjectByContract", updateParam);
}
} else {
System.out.println("품목이 없습니다 - 기존 방식으로 프로젝트 생성");
// 품목이 없는 경우 기존 방식대로 처리
if(!hasProject){
paramMap.put("OBJID", CommonUtils.createObjId());
paramMap.put("is_temp", '1');
if("0000170".equals(category_cd) || "0000171".equals(category_cd)){
paramMap.put("overhaul_project_no", target_project_no);
}
cnt = sqlSession.update("project.createProject", paramMap);
cnt = sqlSession.insert("contractMgmt.insertProjectTask", paramMap);
cnt = sqlSession.insert("contractMgmt.insertProjectSetupTask", paramMap);
}else{
} else {
sqlSession.update("project.ModifyProjectByContract", paramMap);
}
}
}
// if(cnt > 0){
//계약완료 일시 메일
// if("0000964".equals(CommonUtils.checkNull(paramMap.get("contract_result")))){
// commonService.SendMail(paramMap,"CONTRACT_COMP",CommonUtils.checkNull(paramMap.get("pm_user_id")));
//그냥 등록일때 메일
// }else{
// if("regist".equals(CommonUtils.checkNull(paramMap.get("actionType")))){
// commonService.SendMail(paramMap,"CONTRACT_REG",CommonUtils.checkNull(paramMap.get("")));
// }
// }
// }
resultMap.put("result", true);
resultMap.put("msg", Message.SAVE_SUCCESS);
sqlSession.commit();
@@ -3205,21 +2921,122 @@ private String encodeImageToBase64(String imagePath) {
SqlSession sqlSession = null;
try {
sqlSession = SqlMapConfig.getInstance().getSqlSession();
// 수주상태 업데이트
sqlSession.update("contractMgmt.updateOrderStatusOnly", paramMap);
// 수주(0000964) 또는 수주(FCST)(0000968)인 경우 프로젝트 생성 로직 실행
String contract_result = CommonUtils.checkNull(paramMap.get("contract_result"));
if("0000964".equals(contract_result)) {
// 프로젝트가 없으면 생성
String objId = CommonUtils.checkNull(paramMap.get("objId"));
// 수주(0000964) 또는 수주(FCST)(0000968)인 경우 프로젝트 생성 로직 실행
if("0000964".equals(contract_result) || "0000968".equals(contract_result)){
// CONTRACT_OBJID로 프로젝트 존재 여부 확인
Map resultList = sqlSession.selectOne("contractMgmt.getProjectListBycontractObjid", paramMap);
if(resultList == null) {
// 프로젝트 생성 로직은 기존 saveOrderInfo와 동일하게 처리
System.out.println("수주 확정으로 변경 - 프로젝트 생성 필요시 saveOrderInfo 호출 권장");
boolean hasProject = (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")) : "";
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);
List contractItemsRaw = sqlSession.selectList("contractMgmt.getContractItems", paramMap);
List<Map<String, Object>> contractItems = CommonUtils.toUpperCaseMapKey(contractItemsRaw);
if(contractItems != null && !contractItems.isEmpty()) {
System.out.println("[수주확정] 품목 개수: " + contractItems.size() + "개 - 프로젝트 " + (hasProject ? "업데이트" : "생성") + " 시작" + (isMachine ? " (Machine - 수량별 생성)" : ""));
for(Map item : contractItems) {
// 수량 가져오기 (소수점 형태 "2.00"도 처리)
Object quantityObj = item.get("ORDER_QUANTITY") != null ? item.get("ORDER_QUANTITY") : item.get("QUANTITY");
int itemQuantity = 1;
try {
itemQuantity = (int) Double.parseDouble(String.valueOf(quantityObj).replaceAll("[^0-9.]", ""));
} catch (Exception e) {
itemQuantity = 1;
}
// Machine인 경우 수량만큼 반복, 아니면 1번만 실행
int loopCount = (isMachine && !hasProject) ? itemQuantity : 1;
for(int q = 0; q < loopCount; q++) {
if(!hasProject) {
// 프로젝트가 없으면 모든 품목에 대해 생성
Map<String, Object> projectParam = new HashMap<String, Object>();
projectParam.putAll(paramMap);
// 품목별 정보 설정
projectParam.put("OBJID", CommonUtils.createObjId());
projectParam.put("is_temp", '1');
projectParam.put("contract_item_objid", String.valueOf(item.get("OBJID")));
projectParam.put("part_objid", item.get("PART_OBJID"));
projectParam.put("part_no", item.get("PART_NO"));
projectParam.put("part_name", item.get("PART_NAME"));
// Machine인 경우 각 프로젝트의 수량은 1, 아니면 원래 수량
projectParam.put("quantity", isMachine ? "1" : String.valueOf(itemQuantity));
projectParam.put("due_date", item.get("DUE_DATE"));
// 오버홀/개조인 경우
String target_project_no = CommonUtils.checkNull(paramMap.get("target_project_no_direct"));
if("0000170".equals(category_cd) || "0000171".equals(category_cd)){
projectParam.put("overhaul_project_no", target_project_no);
}
if(isMachine) {
System.out.println("[수주확정] 프로젝트 생성 [" + (q+1) + "/" + loopCount + "] - PART_OBJID: " + item.get("PART_OBJID") + ", 품번: " + item.get("PART_NO") + ", 품명: " + item.get("PART_NAME") + ", 수량: 1");
} else {
System.out.println("[수주확정] 프로젝트 생성 - PART_OBJID: " + item.get("PART_OBJID") + ", 품번: " + item.get("PART_NO") + ", 품명: " + item.get("PART_NAME") + ", 수량: " + itemQuantity);
}
// 프로젝트 등록
sqlSession.update("project.createProject", projectParam);
} else {
// 프로젝트가 있으면 모든 품목 업데이트 (수량, 금액 등만)
Map<String, Object> updateParam = new HashMap<String, Object>();
updateParam.putAll(paramMap);
updateParam.put("part_objid", item.get("PART_OBJID"));
// Machine인 경우 수량은 변경하지 않음 (프로젝트별 1로 유지)
if(isMachine) {
updateParam.remove("quantity");
} else {
updateParam.put("quantity", String.valueOf(itemQuantity));
}
updateParam.put("due_date", item.get("DUE_DATE"));
System.out.println("[수주확정] 프로젝트 업데이트 - PART_OBJID: " + item.get("PART_OBJID") + (isMachine ? ", 수량: 변경안함(Machine)" : ", 수량: " + itemQuantity));
sqlSession.update("project.ModifyProjectByContract", updateParam);
}
}
}
} else {
System.out.println("[수주확정] 품목이 없습니다 - 기존 방식으로 프로젝트 생성");
// 품목이 없는 경우 기존 방식대로 처리
if(!hasProject){
paramMap.put("OBJID", CommonUtils.createObjId());
paramMap.put("is_temp", '1');
String target_project_no = CommonUtils.checkNull(paramMap.get("target_project_no_direct"));
if("0000170".equals(category_cd) || "0000171".equals(category_cd)){
paramMap.put("overhaul_project_no", target_project_no);
}
sqlSession.update("project.createProject", paramMap);
sqlSession.insert("contractMgmt.insertProjectTask", paramMap);
sqlSession.insert("contractMgmt.insertProjectSetupTask", paramMap);
} else {
sqlSession.update("project.ModifyProjectByContract", paramMap);
}
}
}
sqlSession.commit();
} catch(Exception e) {
if(sqlSession != null) sqlSession.rollback();