diff --git a/WebContent/WEB-INF/view/purchaseOrder/purchaseOrderFormPopup_new.jsp b/WebContent/WEB-INF/view/purchaseOrder/purchaseOrderFormPopup_new.jsp index 6684211..5df81f7 100644 --- a/WebContent/WEB-INF/view/purchaseOrder/purchaseOrderFormPopup_new.jsp +++ b/WebContent/WEB-INF/view/purchaseOrder/purchaseOrderFormPopup_new.jsp @@ -91,7 +91,7 @@ $(document).ready(function(){ //상신된 결재라인 가져오기 fn_getApprLine(); //구매요청서 정보 가져오기 - fn_getSalesRequest(); + //fn_getSalesRequest(); //grid.data = $.parseJSON($("#gridDetailList").val()); @@ -108,227 +108,38 @@ $(document).ready(function(){ ,datatype: "local" ,data : $.parseJSON($("#gridDetailList").val()) ,colNames: ["OBJID","PART_OBJID","LD_PART_OBJID" - ,"품명" - ,"품번" - //,"품번2" - ,"규격","메이커","단위","설계수량","수량","실발주수량" - ,"공급단가" - //,"레이져단가","용접단가","가공단가","후처리단가" - ,"공급가","부가세","부가세포함공급가" - ,"총발주수량","재고수량","재고수량(org)","총실발주수량","실공급가" //sum + ,"품명","품번","규격","메이커","단위" + ,"수량","단가","공급가" ] ,colModel: [ - {name:"OBJID" , index:"", width: 0, align:"center", hidden: true, sortable:false, editable:false} - ,{name:"PART_OBJID" , index:"", width: 0, align:"center", hidden: true, sortable:false, editable:false} - ,{name:"LD_PART_OBJID" , index:"", width: 0, align:"center", hidden: true, sortable:false, editable:false} - ,{name:"PART_NAME" , index:"", width:200, align:"left", hidden:false, sortable:false, editable:false + {name:"OBJID" , hidden: true, sortable:false, editable:false} + ,{name:"PART_OBJID" , hidden: true, sortable:false, editable:false} + ,{name:"LD_PART_OBJID" , hidden: true, sortable:false, editable:false} + ,{name:"PART_NAME" , width:300, align:"left", sortable:false, editable:false} + ,{name:"PART_NO" , width:300, align:"left", sortable:false, editable:false, formatter:setLink} + ,{name:"SPEC" , width:180, align:"left", sortable:false, editable:false} + ,{name:"MAKER" , width:180, align:"left", sortable:false, editable:false} + ,{name:"UNIT" , width:60, align:"center", sortable:false, editable:true + ,edittype:"select", formatter:"select" + ,editoptions:{ value: unit_cd } + } + ,{name:"ORDER_QTY" , width:90, align:"right", sortable:false, editable:false + ,formatter:"integer", formatoptions:{thousandsSeparator:","} ,editoptions:{ - dataInit: function(e){ e.style.textAlign = "left"; e.style.fontSize = 13; } - ,dataEvents: [ {type:"change", fn:function(e) { }} ] + dataInit: function(e){ e.style.textAlign = "right"; } + ,dataEvents: [{type:"change", fn:function(e){ gridFn.calcRowAll(e); }}] } } - ,{name:"PART_NO" , index:"", width:200, align:"left", hidden:false, sortable:false, editable:false - <%-- - ,formatter:'showlink' - ,formatoptions:{baseLinkUrl:'/partMng/partMngDetailPopUp.do', //?OBJID= - //addParam: '&action=display&OBJID=' - //baseLinkUrl:'javascript:openPartMngPopup()', - idName:'OBJID', - addParam: function (options) { - //console.log(options.rowData.PART_OBJID); - //return "/partMng/partMngDetailPopUp.do?OBJID=" + options.rowData.PART_OBJID; - //return 'openPartMngPopup(\"" + rowObject.PART_OBJID + "\");' - //return 'openPartMngPopup(' + rowData.PART_OBJID + ')'; - return rowData.PART_OBJID; - } - } - --%> - ,formatter:setLink + ,{name:"PARTNER_PRICE" , width:110, align:"right", sortable:false, editable:false + ,formatter:"integer", formatoptions:{thousandsSeparator:","} ,editoptions:{ - dataInit: function(e){ e.style.textAlign = "left"; e.style.fontSize = 13; } - ,dataEvents: [ {type:"change", fn:function(e) { }} ] + dataInit: function(e){ e.style.textAlign = "right"; } + ,dataEvents: [{type:"change", fn:function(e){ gridFn.calcRowAll(e); }}] } } - <%-- - ,{name:"PART_OBJID" , index:"", width:110, align:"left", hidden:false, sortable:false, editable:false - ,formatter:'showlink' - ,formatoptions:{baseLinkUrl:'/partMng/partMngDetailPopUp.do', //?OBJID= - //addParam: '&action=display&OBJID=' - //baseLinkUrl:'javascript:openPartMngPopup()', - idName:'PART_OBJID', - /* - addParam: function (options) { - //console.log(options.rowData.PART_OBJID); - //return "/partMng/partMngDetailPopUp.do?OBJID=" + options.rowData.PART_OBJID; - //return 'openPartMngPopup(\"" + rowObject.PART_OBJID + "\");' - //return 'openPartMngPopup(' + rowData.PART_OBJID + ')'; - return rowData.PART_OBJID; - } - */ - } - //,formatter:setLink - ,editoptions:{ - dataInit: function(e){ e.style.textAlign = "left"; e.style.fontSize = 13; } - ,dataEvents: [ {type:"change", fn:function(e) { }} ] - } + ,{name:"SUPPLY_UNIT_PRICE", width:130, align:"right", sortable:false, editable:false + ,formatter:"integer", formatoptions:{thousandsSeparator:","} } - --%> - ,{name:"SPEC" , index:"", width:140, align:"left", hidden:false, sortable:false, editable:false - ,editoptions:{ - dataInit: function(e){ e.style.textAlign = "left"; e.style.fontSize = 13; } - ,dataEvents: [ {type:"change", fn:function(e) { }} ] - } - } - ,{name:"MAKER" , index:"", width:110, align:"left", hidden:false, sortable:false, editable:false - ,editoptions:{ - dataInit: function(e){ e.style.textAlign = "left"; e.style.fontSize = 13; } - ,dataEvents: [ {type:"change", fn:function(e) { }} ] - } - } - ,{name:"UNIT" , index:"", width:52, align:"center", hidden:false, sortable:false, editable: true - ,edittype :"select" - ,formatter :"select" - ,editoptions:{ - value: unit_cd - ,dataInit : function(e){ - e.style.width = "92%"; - e.style.fontSize = 13; - } - } - } - ,{name:"BOM_QTY" , index:"", width:53, align: "right", hidden:true, sortable:false, editable: false - ,formatter: "integer", formatoptions:{thousandsSeparator:","} - ,editoptions:{ - dataInit: function(e){ e.style.textAlign = "right"; e.style.fontSize = 13; } - ,dataEvents: [ {type:"change", fn:function(e) { gridFn.calcRowAll(e); }} ] - } - } - ,{name:"QTY" , index:"", width:40, align: "right", hidden:false, sortable:false, editable: (<%=isModify%> && ('${info.TYPE}' == TYPE_BUY_ITEM ||'${info.TYPE}' == TYPE_ETC || '${info.TYPE}' == TYPE_LONG_DLV || '${info.TYPE}' == TYPE_SUBCONTRACT || "${info.ORDER_TYPE_CD}" == '0001408') ? true : false) <%--=isModify--%> - //,formatter: "integer", formatoptions:{thousandsSeparator:","} - ,editoptions:{ - dataInit: function(e){ e.style.textAlign = "right"; e.style.fontSize = 13; } - ,dataEvents: [ {type:"change", fn:function(e) { gridFn.calcRowAll(e); }} ] - } - } - ,{name:"ORDER_QTY" , index:"", width:53, align: "right", hidden:false, sortable:false, editable: false - //,formatter: "integer", formatoptions:{thousandsSeparator:","} - ,editoptions:{ - dataInit: function(e){ e.style.textAlign = "right"; e.style.fontSize = 13; } - ,dataEvents: [ {type:"change", fn:function(e) { gridFn.calcRowAll(e); }} ] - } - } - ,{name:"PARTNER_PRICE" , index:"", width:80, align: "right", hidden:false, sortable:false, editable: true - ,formatter: "integer", formatoptions:{//decimalPlaces: 0, // 소수점 자리수 (0으로 설정하면 정수만 표시) - thousandsSeparator:","} - ,editoptions:{ - dataInit: function(e){ e.style.textAlign = "right"; e.style.fontSize = 13; } - ,dataEvents: [ {type:"change", fn:function(e) { gridFn.calcRowAll(e); } - } - /* - ,{type:"onclick", fn:function(e) { - var rowid = this.id.replace("_PARTNER_PRICE",""); - var value = zero_to_null(this.value); - grid.jqGrid('setCell', rowid, 'PARTNER_PRICE', value); - } - } - */ - ] - } - } - // ,{name:"PRICE1" , index:"", width:70, align: "right", hidden:false, sortable:false, editable: true - // ,formatter: "integer", formatoptions:{thousandsSeparator:","} - // ,editoptions:{ - // dataInit: function(e){ e.style.textAlign = "right"; e.style.fontSize = 13; } - // ,dataEvents: [ {type:"change", fn:function(e) { gridFn.calcRowAll(e); }} - /* - , - {type:"focus", fn:function(e) { - var rowid = this.id.replace("_PRICE1",""); - var value = zero_to_null(this.value); - grid.jqGrid('setCell', rowid, 'PRICE1', value); - } - } - */ - // ] - // } - // } - // ,{name:"PRICE2" , index:"", width:60, align: "right", hidden:false, sortable:false, editable: true - // ,formatter: "integer", formatoptions:{thousandsSeparator:","} - // ,editoptions:{ - // dataInit: function(e){ e.style.textAlign = "right"; e.style.fontSize = 13; } - // ,dataEvents: [ {type:"change", fn:function(e) { gridFn.calcRowAll(e); }} ] - // } - // } - // ,{name:"PRICE3" , index:"", width:60, align: "right", hidden:false, sortable:false, editable: true - // ,formatter: "integer", formatoptions:{thousandsSeparator:","} - // ,editoptions:{ - // dataInit: function(e){ e.style.textAlign = "right"; e.style.fontSize = 13; } - // ,dataEvents: [ {type:"change", fn:function(e) { - // gridFn.calcRowAll(e); }} ] - // } - // } - // ,{name:"PRICE4" , index:"", width:70, align: "right", hidden:false, sortable:false, editable: true - // ,formatter: "integer", formatoptions:{thousandsSeparator:","} - // ,editoptions:{ - // dataInit: function(e){ e.style.textAlign = "right"; e.style.fontSize = 13; } - // ,dataEvents: [ {type:"change", fn:function(e) { - // gridFn.calcRowAll(e); }} ] - // } - // } - ,{name:"SUPPLY_UNIT_PRICE", index:"", width:100, align: "right", hidden:false, sortable:false, editable: true - ,formatter: "integer", formatoptions:{thousandsSeparator:","} - ,editoptions:{ - dataInit: function(e){ e.style.textAlign = "right"; e.style.fontSize = 13; } - ,dataEvents: [ {type:"change", fn:function(e) { gridFn.calcRowAll(e); }} ] - } - } - ,{name:"SUPPLY_UNIT_VAT_PRICE", index:"", /* width:70, */ align: "right", hidden:true, sortable:false, editable: true - ,formatter: "integer", formatoptions:{thousandsSeparator:","} - ,editoptions:{ - dataInit: function(e){ e.style.textAlign = "right"; e.style.fontSize = 13; } - ,dataEvents: [ {type:"change", fn:function(e) { gridFn.calcRowAll(e); }} ] - } - } - ,{name:"SUPPLY_UNIT_VAT_SUM_PRICE", index:"", width:110, align: "right", hidden:true, sortable:false, editable: true - ,formatter: "integer", formatoptions:{thousandsSeparator:","} - ,editoptions:{ - dataInit: function(e){ e.style.textAlign = "right"; e.style.fontSize = 13; } - ,dataEvents: [ {type:"change", fn:function(e) { gridFn.calcRowAll(e);gridFn.calcRowAll(e); }} ] - } - } - ,{name:"TOTAL_ORDER_QTY" , index:"", width:66, align: "right", hidden:false, sortable:false, editable: false - ,formatter: "integer", formatoptions:{thousandsSeparator:","} - ,editoptions:{ - dataInit: function(e){ e.style.textAlign = "right"; e.style.fontSize = 13; } - ,dataEvents: [ {type:"change", fn:function(e) { gridFn.calcRowAll(e); }} ] - } - } - ,{name:"STOCK_QTY" , index:"", width:55, align: "right", hidden:false, sortable:false, editable: <%=isModify%> //240426 임시로 수정 가능하게 반영 editable: editable - ,formatter: "integer", formatoptions:{thousandsSeparator:","} - ,editoptions:{ - dataInit: function(e){ e.style.textAlign = "right"; e.style.fontSize = 13; } - ,dataEvents: [ {type:"change", fn:function(e) { gridFn.calcRowAll(e); }} ] - } - } - ,{name:"STOCK_QTY_ORG" , index:"", width:55, align: "right", hidden:true, sortable:false, editable: false - ,formatter: "integer", formatoptions:{thousandsSeparator:","} - ,editoptions:{ - dataInit: function(e){ e.style.textAlign = "right"; e.style.fontSize = 13; } - ,dataEvents: [ {type:"change", fn:function(e) { gridFn.calcRowAll(e); }} ] - } - } - ,{name:"REAL_ORDER_QTY" , index:"", width:79, align: "right", hidden:false, sortable:false, editable: false //240501 입력으로 변경하려다 stop - ,formatter: "integer", formatoptions:{thousandsSeparator:","} - ,editoptions:{ - dataInit: function(e){ e.style.textAlign = "right"; e.style.fontSize = 13; } - } - } - ,{name:"REAL_SUPPLY_PRICE" , index:"", width:96, align: "right", hidden:false, sortable:false, editable: false - ,formatter: "integer", formatoptions:{thousandsSeparator:","} - ,editoptions:{ - dataInit: function(e){ e.style.textAlign = "right"; e.style.fontSize = 13; } - } - } ] ,ignoreCase : true ,rownumbers : false @@ -346,22 +157,12 @@ $(document).ready(function(){ ,userDataOnFooter: true //바닥합계 //,caption :"제목" ,loadComplete: function(){ - - /* - var ids = $("#grid1").jqGrid('getDataIDs'); - //var arrNumColumNames = ['PARTNER_PRICE', 'PRICE1', 'PRICE2', 'PRICE3', 'PRICE4'] - for (var i = 0; i < ids.length; i++) { - var rowId = ids[i]; - var cellValue = $("#grid").jqGrid('getCell', rowId, 'PARTNER_PRICE'); - //var formattedValue = cellValue.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","); - $("#grid").jqGrid('setCell', rowId, 'PARTNER_PRICE', numberWithCommas(cellValue)); - } - */ - var gid = this.id; var grid_wrap_div = $("#gbox_"+gid); setTimeout("fn_jqGrid_init($('#"+gid+"'), false);", 50); //윈도우크기 비례 자동조절 + // 디버깅: 데이터 확인 + //footer 커스텀.. var $fr = $(this.grid.sDiv).find("tr.footrow"); var $frNew1; @@ -415,6 +216,9 @@ $(document).ready(function(){ $("td", $(".footerRowNew1")).slice(0,_idx+1).css({"background-color":"#e4e4e4"}); $("td", $(".footerRowNew1")).slice(_idx+1).css({"background-color":"#e4e4e4"}); //(옅은핑크) $("#TOTAL_SUPPLY_PRICE,#TOTAL_SUPPLY_UNIT_PRICE,#TOTAL_REAL_SUPPLY_PRICE").css({"background-color":"#fbead9"}); + + // 합계 계산 + setTimeout(function(){ gridFn.footerSummary(); }, 100); } ,beforeSubmitCell: function (rowid, cellname, value, iRow, iCol) { // 'linkColumn' 컬럼에 대해서만 링크 태그를 제외하고 값만 전송 @@ -432,11 +236,27 @@ $(document).ready(function(){ }, }); - if("${info.PARTNER_OBJID}" != "" && ("${info.SALES_REQUEST_OBJID}" != "" || "${info.SALES_REQUEST_OBJID}" != null)){ - changelist("${info.PARTNER_OBJID}"); + // 이미 저장된 발주서(OBJID가 있는 경우)는 그리드 데이터는 유지하고 공급처 정보만 가져옴 + if("${info.OBJID}" != "" && "${info.PARTNER_OBJID}" != ""){ + // 공급처 정보만 가져오기 + var list = fnc_getJsonAllDataListBySqlId({"sqlId":"purchaseOrder.purchaseOrderAdminSupplyInfo", "PARTNER_OBJID":"${info.PARTNER_OBJID}"}); + if(fnc_checkNull(list) != ""){ + var row = list[0]; + $("#SUPPLY_BUS_NO").val(row["SUPPLY_BUS_NO"]); + $("#SUPPLY_USER_NAME").val(row["SUPPLY_USER_NAME"]); + $("#SUPPLY_USER_HP").val(row["SUPPLY_USER_HP"]); + $("#SUPPLY_USER_TEL").val(row["SUPPLY_USER_TEL"]); + $("#SUPPLY_USER_FAX").val(row["SUPPLY_USER_FAX"]); + $("#SUPPLY_USER_EMAIL").val(row["SUPPLY_USER_EMAIL"]); + $("#SUPPLY_ADDR").val(row["SUPPLY_ADDR"]); + } + } else if("${info.PARTNER_OBJID}" != "" && "${info.SALES_REQUEST_OBJID}" != ""){ + // 신규 작성시 changelist 호출 + changelist("${info.PARTNER_OBJID}"); } gridFn.opennEdit(); //수정가능 + gridFn.footerSummary(); // 합계 계산 <% if(isModify){ %> @@ -604,54 +424,55 @@ $(document).ready(function(){ fn_setMultiInfo(val); //동시적용 정보 셋팅 }); //발주구분,프로젝트,유닛명,공급업체 변경시 - 구매BOM에서 등록한 PART정보를 가져온다 - $("#TYPE,#CONTRACT_MGMT_OBJID,#UNIT_CODE,#PARTNER_OBJID").change(function(){ + //$("#TYPE,#CONTRACT_MGMT_OBJID,#UNIT_CODE,#PARTNER_OBJID").change(function(){ //alert(_PRE_ORDER_TYPE_CD); - var ORDER_TYPE_CD = $("#ORDER_TYPE_CD").val(); //발주구분 - if("${info.SALES_REQUEST_OBJID}"=="" || "${info.SALES_REQUEST_OBJID}" == null){ - if(ORDER_TYPE_CD == '0001407'){ //신규면 자동조회 //재발주(0001408)가 아니면 초기화(자동 조회) - addBomPart(); //이전 발주 목록 - } - } - }); + // var ORDER_TYPE_CD = $("#ORDER_TYPE_CD").val(); //발주구분 + // if("${info.SALES_REQUEST_OBJID}"=="" || "${info.SALES_REQUEST_OBJID}" == null){ + // if(ORDER_TYPE_CD == '0001407'){ //신규면 자동조회 //재발주(0001408)가 아니면 초기화(자동 조회) + // addBomPart(); //이전 발주 목록 + // } + // } + //}); - $("#ORDER_TYPE_CD").change(function(){ //발주구분 - var ORDER_TYPE_CD = $("#PURCHASE_ORDER_NO_ORG").val(""); + // $("#ORDER_TYPE_CD").change(function(){ //발주구분 + // var ORDER_TYPE_CD = $("#PURCHASE_ORDER_NO_ORG").val(""); - //alert(_PRE_ORDER_TYPE_CD); - if(!fnc_isEmpty(_PRE_ORDER_TYPE_CD) || fnc_isEmpty(ORDER_TYPE_CD)){ //이전이 선택이 아니거나 선택 선택하면 초기화 - getPartData(''); //품목 초기화 - } - if($(this).val() == '0001408'){//재발주 - var partnerObjid = $("#PARTNER_OBJID").val(); - //alert("partnerObjid:"+partnerObjid); - $("#PURCHASE_ORDER_NO_ORG").prop("disabled",""); - $("#PURCHASE_ORDER_NO_ORG").prop("required","required"); - fnc_getPurchaseOrderCdListAppend("PURCHASE_ORDER_NO_ORG","${info.PURCHASE_ORDER_NO_ORG}","",partnerObjid); //발주 정보목록 - }else{ - $("#PURCHASE_ORDER_NO_ORG").prop("disabled","disabled"); - $("#PURCHASE_ORDER_NO_ORG").prop("required",""); - if($(this).val() == '0001407'){//신규 - addBomPart(); - } - } - $("#PURCHASE_ORDER_NO_ORG").trigger("change"); - //$("#PARTNER_OBJID").trigger("change"); - _PRE_ORDER_TYPE_CD = $(this).val(); //이전 값 저장 - }); + // //alert(_PRE_ORDER_TYPE_CD); + // // if(!fnc_isEmpty(_PRE_ORDER_TYPE_CD) || fnc_isEmpty(ORDER_TYPE_CD)){ //이전이 선택이 아니거나 선택 선택하면 초기화 + // // getPartData(''); //품목 초기화 + // // } + // if($(this).val() == '0001408'){//재발주 + // var partnerObjid = $("#PARTNER_OBJID").val(); + // //alert("partnerObjid:"+partnerObjid); + // $("#PURCHASE_ORDER_NO_ORG").prop("disabled",""); + // $("#PURCHASE_ORDER_NO_ORG").prop("required","required"); + // fnc_getPurchaseOrderCdListAppend("PURCHASE_ORDER_NO_ORG","${info.PURCHASE_ORDER_NO_ORG}","",partnerObjid); //발주 정보목록 + // }else{ + // $("#PURCHASE_ORDER_NO_ORG").prop("disabled","disabled"); + // $("#PURCHASE_ORDER_NO_ORG").prop("required",""); + // if($(this).val() == '0001407'){//신규 + // addBomPart(); + // } + // } + // $("#PURCHASE_ORDER_NO_ORG").trigger("change"); + // //$("#PARTNER_OBJID").trigger("change"); + // _PRE_ORDER_TYPE_CD = $(this).val(); //이전 값 저장 + // }); - $("#PURCHASE_ORDER_NO_ORG").change(function(){ - var val = $(this).val(); - if(fnc_isNotEmpty(val)){ - getPartData(val); - //changelist(val); - }else{ - } - }); + // $("#PURCHASE_ORDER_NO_ORG").change(function(){ + // var val = $(this).val(); + // if(fnc_isNotEmpty(val)){ + // getPartData(val); + // //changelist(val); + // }else{ + // } + // }); fnc_datepick(); //달력 $(".select2").select2(); gridFn.opennEdit(); //수정가능 + gridFn.footerSummary(); // 합계 계산 //버튼 $("#btnAdd" ).click(function(){ fn_openPartMngListPopUp(); }); //행추가 @@ -701,23 +522,23 @@ $(document).ready(function(){ }); //유닛명 - if("${info.CONTRACT_MGMT_OBJID}"!=""){ - fn_UnitCodeList("${info.CONTRACT_MGMT_OBJID}", "UNIT_CODE",""); - $("#UNIT_CODE").val("${info.UNIT_CODE}"); - } + // if("${info.CONTRACT_MGMT_OBJID}"!=""){ + // fn_UnitCodeList("${info.CONTRACT_MGMT_OBJID}", "UNIT_CODE",""); + // $("#UNIT_CODE").val("${info.UNIT_CODE}"); + // } //프로젝트번호 triggger로 동시적용 정보 셋팅(240109) - $("#CONTRACT_MGMT_OBJID").val("${info.CONTRACT_MGMT_OBJID}"); + //$("#CONTRACT_MGMT_OBJID").val("${info.CONTRACT_MGMT_OBJID}"); //$("#CONTRACT_MGMT_OBJID").trigger("change"); - fn_setMultiInfo("${info.CONTRACT_MGMT_OBJID}") - fn_setMultiInfoForSaved("${info.CONTRACT_MGMT_OBJID}"); //동시적용 정보 셋팅 + //fn_setMultiInfo("${info.CONTRACT_MGMT_OBJID}") + //fn_setMultiInfoForSaved("${info.CONTRACT_MGMT_OBJID}"); //동시적용 정보 셋팅 fnc_datepick(); //달력 $(".select2").select2(); //동시프로젝트 선택 - $(".APPLICATION_PROJECT_NO").on("change", function() { - reCalculatePrice(); - }); + // $(".APPLICATION_PROJECT_NO").on("change", function() { + // reCalculatePrice(); + // }); addZeroEvtAtPriceInput(); @@ -1087,18 +908,17 @@ function zero_to_null(value){ } } function setLink(cellval, options, rowObject) { - if(typeof(cellval) == "undefined") { - return ""; + return ""; } - + if(fnc_isEmpty(rowObject.PART_OBJID)){ - return rowObject.PART_NO + return rowObject.PART_NO; }else{ if(rowObject.PART_NO.indexOf('openPartMngPopup') < 0){ return "" + rowObject.PART_NO + ""; }else{ - return rowObject.PART_NO + return rowObject.PART_NO; } } } @@ -1148,6 +968,7 @@ function fn_getApprLine(){ } function fn_getSalesRequest(){ + //alert("1234") if('${param.sales_request_objid}'!=''){ $.ajax({ url:"/salesMng/getSalesRequest.do", @@ -1513,65 +1334,24 @@ function fn_save(){ function fn_checkQty(){ var isValid = true; var $g = $("#grid1"); - //var rowId = $g.jqGrid('getGridParam', 'selrow'); //선택된행 번호 - var isValid = true; var ids = grid.jqGrid("getDataIDs"); for (var i = 0; i < ids.length; i++) { - var rowId = ids[i]; //수정중인 행번호 (행선택은 안될수있음) - var v1 = Number( fnc_checkNullDefaultValue($g.find("#"+rowId+"_ORDER_QTY").val(), grid.jqGrid('getCell', rowId, "ORDER_QTY")).replace(/,/gi,"") ); - var v2 = Number( $g.find("#"+rowId+"_PARTNER_PRICE").val().replace(/,/gi,"") ); - var v3 = Number( $g.find("#"+rowId+"_PRICE1").val().replace(/,/gi,"") ); - var v4 = Number( $g.find("#"+rowId+"_PRICE2").val().replace(/,/gi,"") ); - var v5 = Number( $g.find("#"+rowId+"_PRICE3").val().replace(/,/gi,"") ); - var v6 = Number( $g.find("#"+rowId+"_PRICE4").val().replace(/,/gi,"") ); - //var q1 = Number( $g.find("#"+rowId+"_TOTAL_ORDER_QTY").val().replace(/,/gi,"") ); - var q1 = grid.jqGrid('getCell', rowId, "TOTAL_ORDER_QTY").replace(/,/gi,""); - var q2 = Number( fnc_checkNullDefaultValue($g.find("#"+rowId+"_STOCK_QTY").val(), grid.jqGrid('getCell', rowId, "STOCK_QTY")).replace(/,/gi,"") ); - var q3 = grid.jqGrid('getCell', rowId, "REAL_ORDER_QTY").replace(/,/gi,""); - //var q3 = Number( $g.find("#"+rowId+"_REAL_ORDER_QTY").val().replace(/,/gi,"") ); - //var v6 = Number( $g.find("#"+rowId+"_SUPPLY_UNIT_PRICE").val() ); - - var sameProjectCount = fn_getProjectCount(); - //alert(v1); - /* - if(!$.isNumeric( fnc_checkNullDefaultValue(eVal,"0")) ){ - Swal.fire("숫자를 입력해주세요."); $(e.target).select(); return; - } - else if(v1<=q2){ - Swal.fire("재고수량은 마지막 동시발주건의 수량이 입력되도록 수량보다 작아야 합니다."); $(e.target).select(); return; - } - */ + var rowId = ids[i]; + // 수량 + var qtyVal = fnc_checkNullDefaultValue($g.find("#"+rowId+"_ORDER_QTY").val(), grid.jqGrid('getCell', rowId, "ORDER_QTY")); + var v1 = Number((qtyVal || "0").toString().replace(/,/gi,"")); + // 단가 + var priceVal = fnc_checkNullDefaultValue($g.find("#"+rowId+"_PARTNER_PRICE").val(), grid.jqGrid('getCell', rowId, "PARTNER_PRICE")); + var v2 = Number((priceVal || "0").toString().replace(/,/gi,"")); - if( !$.isNumeric(v1) - || !$.isNumeric(v2) - || !$.isNumeric(v3) - || !$.isNumeric(v4) - || !$.isNumeric(v5) - || !$.isNumeric(v6) - || !$.isNumeric(q1) - || !$.isNumeric(q2) - || !$.isNumeric(q3) - ){ - Swal.fire("단가와 수량은 숫자로 입력해 주세요."); $(e.target).select(); return; + if(!$.isNumeric(v1) || !$.isNumeric(v2)){ + Swal.fire("단가와 수량은 숫자로 입력해 주세요."); + isValid = false; + break; } else if(v1 < 1){ - Swal.fire("실발주수량은 0보다 커야합니다."); + Swal.fire("수량은 0보다 커야합니다."); isValid = false; break; - }else if(q3 < 1){ - Swal.fire("총실발주수량이 0보다 커야합니다."); - isValid = false; - break; - /* - }else if(sameProjectCount > 1 && q1 - q2 < v1){ - Swal.fire("총 발주수량이 수량만큼은 확보되도록 재고수량을 입력해 주세요."); - isValid = false; - break; - */ - }else if(q1){ - //$("#"+rowId+"_QTY").val(numberWithCommas( ORDER_QTY )); - $("#"+rowId+"_ORDER_QTY").val(numberWithCommas( ORDER_QTY )); - }else{ - //$g.jqGrid('setCell', rowId, "QTY", numberWithCommas( ORDER_QTY )); - $g.jqGrid('setCell', rowId, "ORDER_QTY", numberWithCommas( ORDER_QTY )); - } - $g.jqGrid('setCell', rowId, "ORDER_QTY", numberWithCommas( ORDER_QTY )); - } - - if(v1 < 1){ - Swal.fire("실발주수량은 0보다 커야합니다."); $(e.target).select(); return; - }else if(realQ < 1){ - Swal.fire("총실발주수량이 0보다 커야합니다."); $(e.target).select(); return; - /* - }else if(sameProjectCount > 1 && q1 - q2 < v1){ - Swal.fire("총 발주수량이 수량만큼은 확보되도록 재고수량을 입력해 주세요."); $(e.target).select(); return; - */ - }else if(q1 - 유닛명 +

발 주 서

(Purchase Order)

@@ -2124,7 +1774,7 @@ function fn_price_save(){ - 발주서 No. + + 제목 + + 부가세포함 발주금액(원) + <%-- @@ -2183,7 +1833,7 @@ function fn_price_save(){ -
+ -
+ diff --git a/WebContent/WEB-INF/view/purchaseOrder/purchaseOrderFormPopup_new_back2.jsp b/WebContent/WEB-INF/view/purchaseOrder/purchaseOrderFormPopup_new_back2.jsp new file mode 100644 index 0000000..6684211 --- /dev/null +++ b/WebContent/WEB-INF/view/purchaseOrder/purchaseOrderFormPopup_new_back2.jsp @@ -0,0 +1,2308 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> +<%@ page import="com.pms.common.utils.*"%> +<%@ page import="java.util.*"%> +<%@include file="/init_jqGrid.jsp"%> +<% + Map info = (HashMap)(request.getAttribute("info")); + boolean isModify = true; + if(info!=null && + ( CommonUtils.checkNull(info.get("APPR_STATUS")).equals( "결재중" ) + ||CommonUtils.checkNull(info.get("APPR_STATUS")).equals( "결재완료" ) + ||CommonUtils.checkNull(info.get("MULTI_YN")).equals( "Y") && !CommonUtils.checkNull(info.get("MULTI_MASTER_YN")).equals( "Y") + ||CommonUtils.checkNull(info.get("STATUS")).equals( "cancel" ) + ) + ){ + isModify = false; //수정불가 + } + String actType = (String)request.getAttribute("actType"); + + boolean isPriceInput = false; + if(info!=null && CommonUtils.checkNull(info.get("STATUS")).equals( "approvalComplete" )){ + isPriceInput = true; + } +%> + + + + + + + + + + + + +
+ +
+ +
+ + + + + +
+
+

발주서

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <%-- + + + --%> + +
발주번호발주부품 + + 프로젝트번호 + + 유닛명 + +

발 주 서

(Purchase Order)

결재담당검토결재대표
발주처회사명 + + + 공급처회사명 + +
사업자번호${info.SALES_REG_NO }사업자번호
담당자 + + HP대표자HP
전 화FAX전 화FAX
E-MAIL${info.SALES_EMAIL }E-MAIL
주 소${info.SALES_SUPPLY_ADDRESS }주 소
아래의 자재를 발주하오니 기일 내 필히 납품하여 주시기 바랍니다.
발주구분 + + 납품장소 + + 검수방법 + + 결제조건 + + 입고요청일
발주서 No. + <%if(isModify){ %> + + <%}else{ %> + ${info.PURCHASE_ORDER_NO_ORG_NO} + <%}%> + 제목부가세포함 발주금액(원) + 부가세 + +
+
+ +
+
+ <% if(isModify){ %> + + + + + + + + + <% }else{ %> + + + + + <% } %> + +
+
+ +
+
+
+ + +
+
+ +
+
+
+ + + + + + + + + + + + + + + + + <%-- + + + + --%> + +
할인금액(원)네고율${info.NEGO_RATE}할인공급가(원)
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
동시적용 프로젝트번호
입고계획일
입고계획수량
작업지시사항 + +
★거래명세서 자동생성은 발주서 기준으로 입고수량 대비 정품수량 동일시 구매팀 확인후 발주서 기준으로 자동생성 된다.
+
+
+ + + +
+ + \ No newline at end of file diff --git a/WebContent/WEB-INF/view/purchaseOrder/purchaseOrderList_new.jsp b/WebContent/WEB-INF/view/purchaseOrder/purchaseOrderList_new.jsp index d26a567..b4b1c5c 100644 --- a/WebContent/WEB-INF/view/purchaseOrder/purchaseOrderList_new.jsp +++ b/WebContent/WEB-INF/view/purchaseOrder/purchaseOrderList_new.jsp @@ -59,6 +59,12 @@ $(document).ready(function(){ $("#btnExcel").click(function() { fn_excel(); }); + + // 발주서 송부 버튼 클릭 + $("#btnSend").click(function(){ + fn_sendPurchaseOrder(); + }); + //수주활동 복사 팝업 $("#btnCopy").click(function(){ var checkedObj = _tabulGrid.getSelectedData(); @@ -72,10 +78,10 @@ $(document).ready(function(){ fn_formPopUp(objId, "copy"); } }); - $("#project_no").change(function(){ + //$("#project_no").change(function(){ //fnc_productUPGNEWList(this.value,"","upg_no", ""); - fn_UnitCodeList(this.value, "unit_code", ""); - }); + // fn_UnitCodeList(this.value, "unit_code", ""); + //}); //결재상신 $("#btnApproval").click(function(){ @@ -324,10 +330,22 @@ var columns = [ {headerHozAlign:'center', hozAlign:'left', widthGrow:1.5, title:'품번', field:'PART_NO'}, {headerHozAlign:'center', hozAlign:'left', widthGrow:2, title:'품명', field:'PART_NAME'}, {headerHozAlign:'center', hozAlign:'left', widthGrow:1.5, title:'공급업체', field:'PARTNER_NAME'}, - {headerHozAlign:'center', hozAlign:'right', widthGrow:1.2, title:'총액', field:'TOTAL_PRICE_ALL', + {headerHozAlign:'center', hozAlign:'right', widthGrow:1.2, title:'총액', field:'TOTAL_SUPPLY_PRICE', formatter:"money", formatterParams:{thousand:",", symbolAfter:"p", precision:false} }, - {headerHozAlign:'center', hozAlign:'center', widthGrow:1, title:'메일발송', field:'MAIL_SEND_YN'}, + // {headerHozAlign:'center', hozAlign:'right', widthGrow:1.2, title:'총액', field:'TOTAL_PRICE_ALL', + // formatter:"money", formatterParams:{thousand:",", symbolAfter:"p", precision:false} + // }, + {headerHozAlign:'center', hozAlign:'center', widthGrow:1, title:'메일발송', field:'MAIL_SEND_YN', + formatter: function(cell, formatterParams, onRendered){ + var value = fnc_checkNull(cell.getValue()); + if(value === 'Y'){ + return '발송완료'; + } else { + return ''; + } + } + }, {headerHozAlign:'center', hozAlign:'center', widthGrow:1, title:'발주일', field:'REGDATE'} ]; @@ -696,6 +714,71 @@ function col_custom_fmt_un(cellvalue, options, cell) { return cellvalue; } +// 발주서 송부 (메일 발송 팝업) +function fn_sendPurchaseOrder(){ + var selectedData = _tabulGrid.getSelectedData(); + + if(selectedData.length < 1){ + Swal.fire("발주서를 송부할 행을 선택해주세요."); + return false; + } else if(selectedData.length > 1){ + Swal.fire("한번에 한 개의 발주서만 발송 가능합니다."); + return false; + } + + var status = fnc_checkNull(selectedData[0].STATUS); + var objId = fnc_checkNull(selectedData[0].OBJID); + var MULTI_YN = fnc_checkNull(selectedData[0].MULTI_YN); + var MULTI_MASTER_YN = fnc_checkNull(selectedData[0].MULTI_MASTER_YN); + var mailSendYn = fnc_checkNull(selectedData[0].MAIL_SEND_YN); + + // 취소 상태 확인 + if(status === "cancel"){ + Swal.fire("취소된 발주서는 발송할 수 없습니다."); + return false; + } + + // 동시발주 하위건 확인 + if(MULTI_YN === 'Y' && MULTI_MASTER_YN !== 'Y'){ + Swal.fire("동시발주 하위건은 마스터건으로 발송해주세요."); + return false; + } + + // 이미 발송된 경우 재발송 확인 + if(mailSendYn === 'Y'){ + Swal.fire({ + title: '이미 발송된 발주서입니다.', + text: '다시 발송하시겠습니까?', + icon: 'warning', + showCancelButton: true, + confirmButtonText: '재발송', + cancelButtonText: '취소' + }).then((result) => { + if(result.isConfirmed){ + fn_openMailFormPopup(objId); + } + }); + return false; + } + + // 메일 발송 팝업 열기 + fn_openMailFormPopup(objId); +} + +// 발주서 메일 발송 팝업 열기 +function fn_openMailFormPopup(purchaseOrderObjId){ + if(!purchaseOrderObjId || purchaseOrderObjId === ''){ + Swal.fire("잘못된 요청입니다."); + return; + } + + var popup_width = 900; + var popup_height = 750; + var url = "/purchaseOrder/purchaseOrderMailFormPopup.do?purchaseOrderObjId=" + purchaseOrderObjId; + + window.open(url, "purchaseOrderMailForm", "width="+popup_width+",height="+popup_height+",menubar=no,scrollbars=yes,resizable=yes"); +} +
@@ -749,11 +832,11 @@ function col_custom_fmt_un(cellvalue, options, cell) { - + diff --git a/WebContent/WEB-INF/view/purchaseOrder/purchaseOrderMailFormPopup.jsp b/WebContent/WEB-INF/view/purchaseOrder/purchaseOrderMailFormPopup.jsp new file mode 100644 index 0000000..6ed486b --- /dev/null +++ b/WebContent/WEB-INF/view/purchaseOrder/purchaseOrderMailFormPopup.jsp @@ -0,0 +1,539 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@ page import="com.pms.common.utils.*"%> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> +<%@ page import="java.util.*" %> +<%@include file= "/init.jsp" %> +<% +PersonBean person = (PersonBean)session.getAttribute(Constants.PERSON_BEAN); +String connector = person.getUserId(); +String purchaseOrderObjId = request.getParameter("purchaseOrderObjId"); +%> + + + + + 발주서 메일 발송 + + + +
+
발주서 메일 발송
+ + +
+
+ 발주번호: + - +
+
+ 공급업체: + - +
+
+ 프로젝트: + - +
+
+ +
+ + 첨부파일: 발주서 및 도면 파일이 자동으로 첨부됩니다. +
+ + + + + +
+ +
+
담당자 정보를 불러오는 중...
+
+
+ + +
+ + +
예: email1@example.com, email2@example.com
+
+ + +
+ + +
발주 담당자 이메일이 자동으로 참조에 추가됩니다.
+
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ +
+ + + + + diff --git a/WebContent/WEB-INF/view/salesMng/proposalMngList.jsp b/WebContent/WEB-INF/view/salesMng/proposalMngList.jsp index 6a0c85f..aabba3c 100644 --- a/WebContent/WEB-INF/view/salesMng/proposalMngList.jsp +++ b/WebContent/WEB-INF/view/salesMng/proposalMngList.jsp @@ -247,7 +247,7 @@ function _fnc_datepick(){ ~ - + ~ + diff --git a/WebContent/WEB-INF/view/salesMng/purchaseListFormPopUp.jsp b/WebContent/WEB-INF/view/salesMng/purchaseListFormPopUp.jsp index 1808499..f42f843 100644 --- a/WebContent/WEB-INF/view/salesMng/purchaseListFormPopUp.jsp +++ b/WebContent/WEB-INF/view/salesMng/purchaseListFormPopUp.jsp @@ -324,12 +324,12 @@ function fn_initGrid() { title: '표면처리', field: 'SURFACE_TREATMENT' }, - // 14. 공급업체 + // 14. 메이커 { headerHozAlign: 'center', hozAlign: 'left', width: 150, - title: '공급업체', + title: '메이커', field: 'VENDOR' }, // 15. 범주 이름 diff --git a/WebContent/WEB-INF/view/salesMng/salesRequestMngRegList.jsp b/WebContent/WEB-INF/view/salesMng/salesRequestMngRegList.jsp index b3f6dd0..e6f6109 100644 --- a/WebContent/WEB-INF/view/salesMng/salesRequestMngRegList.jsp +++ b/WebContent/WEB-INF/view/salesMng/salesRequestMngRegList.jsp @@ -164,7 +164,9 @@ var columns = [ {title:'PURCHASE_ORDER_MASTER_OBJID', field:'PURCHASE_ORDER_MASTER_OBJID' ,visible: false}, {title:'APPROVAL_OBJID' , field:'APPROVAL_OBJID' ,visible:false}, {title:'ROUTE_OBJID' , field:'ROUTE_OBJID' ,visible:false}, - {title:'MBOM_HEADER_OBJID' , field:'MBOM_HEADER_OBJID' ,visible:false} + {title:'MBOM_HEADER_OBJID' , field:'MBOM_HEADER_OBJID' ,visible:false}, + {title:'DOC_TYPE' , field:'DOC_TYPE' ,visible:false}, + {title:'HAS_PURCHASE_REQUEST' , field:'HAS_PURCHASE_REQUEST' ,visible:false} ,{headerHozAlign : 'center', hozAlign : 'center', title : "요청번호", field :"REQUEST_MNG_NO" , widthGrow:1.3, formatter: fnc_createGridAnchorTag, @@ -173,31 +175,42 @@ var columns = [ } } ,{headerHozAlign : 'center', hozAlign : 'center', title : "구매유형", field :"PURCHASE_TYPE_NAME" , widthGrow:1.1 } - ,{headerHozAlign : 'center', hozAlign : 'left' , title : "프로젝트번호", field :"PROJECT_NUMBER" , widthGrow:1.4 } + ,{headerHozAlign : 'center', hozAlign : 'left' , title : "프로젝트번호", field :"PROJECT_NUMBER" , widthGrow:1.4, + formatter: fnc_createGridAnchorTag, + cellClick: function(e, cell){ + var orderNo = fnc_checkNull(cell.getData().PROJECT_NUMBER); + // 프로젝트 번호가 없으면 팝업 열지 않음 + if(orderNo == '' || orderNo == null) { + return; + } + // 프로젝트 번호 클릭 시: 결재 정보 조회 모드 (saleNo에 "detail" 전달) + fn_openSaleRegPopup(orderNo, "detail"); + } + } ,{headerHozAlign : 'center', hozAlign : 'center', title : "주문유형", field :"ORDER_TYPE_NAME" , widthGrow:1.1 } ,{headerHozAlign : 'center', hozAlign : 'center', title : "제품구분", field :"PRODUCT_NAME_FULL" , widthGrow:1.1} ,{headerHozAlign : 'center', hozAlign : 'left' , title : "고객사", field :"CUSTOMER_NAME" , widthGrow:1.5 } ,{headerHozAlign : 'center', hozAlign : 'center', title : "유/무상", field :"PAID_TYPE_NAME" , widthGrow:0.9 } ,{headerHozAlign : 'center', hozAlign : 'left', title : "품번", field :"PART_NO" , widthGrow:1.4} ,{headerHozAlign : 'center', hozAlign : 'left' , title : "품명", field :"PART_NAME" , widthGrow:1.8 } - ,{headerHozAlign : 'center', hozAlign : 'center', title : "구매요청서", field :"REQUEST_MNG_NO" , widthGrow:1.1, + ,{headerHozAlign : 'center', hozAlign : 'center', title : "구매요청서", field :"HAS_PURCHASE_REQUEST" , widthGrow:1.1, formatter: function(cell, formatterParams, onRendered){ - // 구매요청서 작성 여부: PART_NO가 있으면 품목이 저장된 것 (구매요청서 작성됨) + // 구매요청서 작성 여부: HAS_PURCHASE_REQUEST가 'Y'이면 구매요청서 작성됨 var data = cell.getData(); - var partNo = fnc_checkNull(data.PART_NO); - var iconClass = (partNo != '' && partNo != null) ? 'file_icon' : 'file_empty_icon'; + var hasPurchaseRequest = fnc_checkNull(data.HAS_PURCHASE_REQUEST); + var iconClass = (hasPurchaseRequest == 'Y') ? 'file_icon' : 'file_empty_icon'; return ''; }, cellClick : function(e, cell) { var data = cell.getData(); - var partNo = fnc_checkNull(data.PART_NO); + var hasPurchaseRequest = fnc_checkNull(data.HAS_PURCHASE_REQUEST); // 구매요청서가 작성된 경우(파란색 아이콘)만 팝업 열기 - if(partNo != '' && partNo != null) { + if(hasPurchaseRequest == 'Y') { fn_openSalesRequestFormPopUp(data.OBJID); } + } } - } ,{headerHozAlign : 'center', hozAlign : 'center', title : "요청인", field :"REQUEST_USER_NAME" , widthGrow:1.1 } ,{headerHozAlign : 'center', hozAlign : 'center', title : "입고요청일", field :"DELIVERY_REQUEST_DATE" , widthGrow:1.1 } ,{headerHozAlign : 'center', hozAlign : 'center', title : "작성일", field :"REGDATE_TITLE" , widthGrow:1.1 } @@ -416,6 +429,14 @@ function fn_salesMngBOMOpenPopUp(bom_report_objid){ window.open("/salesMng/salesRequestDetailPopUp.do?"+param, "_strListPopup", "width=1200, height=800, toolbar=no, status=no, menubar=no, location=no, scrollbars=yes, resizable=yes"); } +function fn_openSaleRegPopup(orderNo, saleNo){ + var popup_width = 1000; + var popup_height = 550; + // 한글 프로젝트 번호 인코딩 처리 + var url = "/salesMgmt/salesRegForm.do?orderNo=" + encodeURIComponent(orderNo) + "&saleNo=" + (saleNo ? encodeURIComponent(saleNo) : ""); + fn_centerPopup(popup_width, popup_height, url); +} + function _fnc_datepick(){ var $dateinput = $("input.date_icon"); for(var i=0; i<$dateinput.length; i++){ @@ -640,14 +661,14 @@ function fn_executeCreateProposal(salesRequestObjid, targetParts) { - + <%-- 품명 활성화 --%> - + <%-- 상태 주석처리 @@ -662,11 +683,11 @@ function fn_executeCreateProposal(salesRequestObjid, targetParts) { --%> - <%-- --%> + <%-- --%> <%-- 접수자 주석처리 - + @@ -677,8 +698,8 @@ function fn_executeCreateProposal(salesRequestObjid, targetParts) { <%-- 작성일 활성화 --%> - ~ - + ~ + diff --git a/src/com/pms/controller/PurchaseOrderController.java b/src/com/pms/controller/PurchaseOrderController.java index 111114c..e18f312 100644 --- a/src/com/pms/controller/PurchaseOrderController.java +++ b/src/com/pms/controller/PurchaseOrderController.java @@ -1644,4 +1644,135 @@ public class PurchaseOrderController { } return result; } + + /** + * 발주서 메일 발송 팝업 + * @param request + * @param paramMap - purchaseOrderObjId + * @return + */ + @RequestMapping("/purchaseOrder/purchaseOrderMailFormPopup.do") + public String purchaseOrderMailFormPopup(HttpServletRequest request, @RequestParam Map paramMap){ + return "/purchaseOrder/purchaseOrderMailFormPopup"; + } + + /** + * 발주서 정보 조회 (메일 발송용) (AJAX) + * @param request + * @param paramMap - objId (PURCHASE_ORDER_MASTER_OBJID) + * @return + */ + @ResponseBody + @RequestMapping("/purchaseOrder/getPurchaseOrderInfoForMail.do") + public Map getPurchaseOrderInfoForMail(HttpServletRequest request, @RequestParam Map paramMap){ + Map resultMap = new HashMap(); + + try { + String objId = CommonUtils.checkNull(paramMap.get("objId")); + + if("".equals(objId)){ + resultMap.put("result", "error"); + resultMap.put("message", "잘못된 요청입니다."); + return resultMap; + } + + paramMap.put("PURCHASE_ORDER_MASTER_OBJID", objId); + Map purchaseOrderInfo = purchaseOrderService.getPurchaseOrderMasterInfo(request, paramMap); + + if(purchaseOrderInfo != null){ + // 키를 대문자로 변환 + purchaseOrderInfo = CommonUtils.toUpperCaseMapKey(purchaseOrderInfo); + resultMap.put("result", "success"); + resultMap.put("purchaseOrderInfo", purchaseOrderInfo); + } else { + resultMap.put("result", "error"); + resultMap.put("message", "발주서 정보를 찾을 수 없습니다."); + } + } catch (Exception e) { + e.printStackTrace(); + resultMap.put("result", "error"); + resultMap.put("message", "발주서 정보 조회 중 오류가 발생했습니다."); + } + + return resultMap; + } + + /** + * 공급업체 담당자 목록 조회 (AJAX) + * @param request + * @param paramMap - partnerObjId + * @return + */ + @ResponseBody + @RequestMapping("/purchaseOrder/getPartnerManagerList.do") + public Map getPartnerManagerList(HttpServletRequest request, @RequestParam Map paramMap){ + Map resultMap = new HashMap(); + + try { + String partnerObjId = CommonUtils.checkNull(paramMap.get("partnerObjId")); + + if("".equals(partnerObjId)){ + resultMap.put("result", "error"); + resultMap.put("message", "공급업체 정보가 없습니다."); + return resultMap; + } + + // 공급업체 담당자 목록 조회 + paramMap.put("SUPPLY_OBJID", partnerObjId); + List managerList = commonService.selectList("admin.getSupplyManagerList", request, paramMap); + + if(managerList != null && managerList.size() > 0){ + // 키를 대문자로 변환 + managerList = CommonUtils.keyChangeUpperList(managerList); + resultMap.put("result", "success"); + resultMap.put("managers", managerList); + } else { + resultMap.put("result", "success"); + resultMap.put("managers", new ArrayList()); + } + } catch (Exception e) { + e.printStackTrace(); + resultMap.put("result", "error"); + resultMap.put("message", "담당자 목록 조회 중 오류가 발생했습니다."); + } + + return resultMap; + } + + /** + * 발주서 메일 발송 (AJAX) + * @param session + * @param request + * @param paramMap - objId, toEmails, ccEmails, subject, contents + * @return + */ + @ResponseBody + @RequestMapping("/purchaseOrder/sendPurchaseOrderMail.do") + public Map sendPurchaseOrderMail(HttpSession session, HttpServletRequest request, @RequestParam Map paramMap){ + Map resultMap = new HashMap(); + + try { + PersonBean person = (PersonBean)session.getAttribute(Constants.PERSON_BEAN); + paramMap.put("WRITER", CommonUtils.checkNull(person.getUserId())); + paramMap.put("WRITER_EMAIL", CommonUtils.checkNull(person.getEmail())); + + String objId = CommonUtils.checkNull(paramMap.get("objId")); + + if("".equals(objId)){ + resultMap.put("result", "error"); + resultMap.put("message", "잘못된 요청입니다."); + return resultMap; + } + + // 메일 발송 서비스 호출 + resultMap = purchaseOrderService.sendPurchaseOrderMailManual(request, paramMap); + + } catch (Exception e) { + e.printStackTrace(); + resultMap.put("result", "error"); + resultMap.put("message", "메일 발송 중 오류가 발생했습니다: " + e.getMessage()); + } + + return resultMap; + } } diff --git a/src/com/pms/mapper/admin.xml b/src/com/pms/mapper/admin.xml index 5d2fbe0..02d18a9 100644 --- a/src/com/pms/mapper/admin.xml +++ b/src/com/pms/mapper/admin.xml @@ -9366,4 +9366,17 @@ SELECT LIMIT 1 + + + \ No newline at end of file diff --git a/src/com/pms/mapper/purchaseOrder.xml b/src/com/pms/mapper/purchaseOrder.xml index f999a60..8ca58b5 100644 --- a/src/com/pms/mapper/purchaseOrder.xml +++ b/src/com/pms/mapper/purchaseOrder.xml @@ -3078,6 +3078,8 @@ SELECT POM.OBJID ,POM.MULTI_MASTER_OBJID ,CASE WHEN POM.MULTI_MASTER_YN = 'Y' THEN '' ELSE POM.MULTI_YN END MULTI_YN_MAKED + ,POM.MAIL_SEND_YN + ,POM.MAIL_SEND_DATE ,POM.STATUS ,A.APPR_STATUS ,CASE WHEN POM.STATUS = 'cancel' then '취소' @@ -5862,4 +5864,13 @@ FROM( AND P.PART_OBJID = #{objId} + + + UPDATE PURCHASE_ORDER_MASTER + SET + MAIL_SEND_YN = #{MAIL_SEND_YN} + ,MAIL_SEND_DATE = #{MAIL_SEND_DATE} + WHERE OBJID = #{OBJID} + + \ No newline at end of file diff --git a/src/com/pms/mapper/salesMng.xml b/src/com/pms/mapper/salesMng.xml index 7aebd7e..7449abc 100644 --- a/src/com/pms/mapper/salesMng.xml +++ b/src/com/pms/mapper/salesMng.xml @@ -961,17 +961,31 @@ VALUES SRM.REQUEST_CD, (SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = SRM.REQUEST_CD) AS REQUEST_CD_NAME, - -- 구매요청서 작성 여부 (SALES_REQUEST_PART에 데이터가 있으면 'Y') - (SELECT CASE WHEN COUNT(*) > 0 THEN 'Y' ELSE 'N' END FROM SALES_REQUEST_PART WHERE SALES_REQUEST_MASTER_OBJID = SRM.OBJID) AS HAS_PURCHASE_REQUEST, + -- 문서유형 (PURCHASE_REQUEST: 구매요청서, PROPOSAL: 품의서) + SRM.DOC_TYPE, + + -- 구매요청서 작성 여부 (SALES_REQUEST_PART에 DOC_TYPE이 PURCHASE_REQUEST인 데이터가 있으면 'Y') + (SELECT CASE WHEN COUNT(*) > 0 THEN 'Y' ELSE 'N' END + FROM SALES_REQUEST_PART + WHERE SALES_REQUEST_MASTER_OBJID = SRM.OBJID + AND (DOC_TYPE = 'PURCHASE_REQUEST' OR DOC_TYPE IS NULL)) AS HAS_PURCHASE_REQUEST, -- M-BOM 관련 컬럼 SRM.MBOM_HEADER_OBJID, -- 추가된 컬럼들 SRM.PURCHASE_TYPE, - (SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = SRM.PURCHASE_TYPE) AS PURCHASE_TYPE_NAME, - SRM.ORDER_TYPE, - (SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = SRM.ORDER_TYPE) AS ORDER_TYPE_NAME, + CODE_NAME(SRM.PURCHASE_TYPE) AS PURCHASE_TYPE_NAME, + + -- 주문유형: 프로젝트 정보(CATEGORY_CD) 우선, 없으면 SALES_REQUEST_MASTER 값 + COALESCE( + (SELECT PM.CATEGORY_CD FROM PROJECT_MGMT PM WHERE PM.OBJID::VARCHAR = SRM.PROJECT_NO), + SRM.ORDER_TYPE + ) AS ORDER_TYPE, + CODE_NAME(COALESCE( + (SELECT PM.CATEGORY_CD FROM PROJECT_MGMT PM WHERE PM.OBJID::VARCHAR = SRM.PROJECT_NO), + SRM.ORDER_TYPE + )) AS ORDER_TYPE_NAME, -- 제품구분: 프로젝트 정보 우선, 없으면 SALES_REQUEST_MASTER 값 COALESCE( @@ -1010,28 +1024,51 @@ VALUES ) AS PAID_TYPE_NAME, -- 품번/품명 ("외 N건" 형태로 표시) - ( - SELECT - CASE - WHEN COUNT(*) > 1 THEN - (SELECT PM.PART_NO FROM PART_MNG PM WHERE PM.OBJID::VARCHAR = (SELECT PART_OBJID FROM SALES_REQUEST_PART WHERE SALES_REQUEST_MASTER_OBJID = SRM.OBJID ORDER BY REGDATE LIMIT 1)) || ' 외 ' || (COUNT(*) - 1) || '건' - ELSE - (SELECT PM.PART_NO FROM PART_MNG PM WHERE PM.OBJID::VARCHAR = (SELECT PART_OBJID FROM SALES_REQUEST_PART WHERE SALES_REQUEST_MASTER_OBJID = SRM.OBJID ORDER BY REGDATE LIMIT 1)) - END - FROM SALES_REQUEST_PART - WHERE SALES_REQUEST_MASTER_OBJID = SRM.OBJID - ) AS PART_NO, - ( - SELECT - CASE - WHEN COUNT(*) > 1 THEN - (SELECT PM.PART_NAME FROM PART_MNG PM WHERE PM.OBJID::VARCHAR = (SELECT PART_OBJID FROM SALES_REQUEST_PART WHERE SALES_REQUEST_MASTER_OBJID = SRM.OBJID ORDER BY REGDATE LIMIT 1)) || ' 외 ' || (COUNT(*) - 1) || '건' - ELSE - (SELECT PM.PART_NAME FROM PART_MNG PM WHERE PM.OBJID::VARCHAR = (SELECT PART_OBJID FROM SALES_REQUEST_PART WHERE SALES_REQUEST_MASTER_OBJID = SRM.OBJID ORDER BY REGDATE LIMIT 1)) - END - FROM SALES_REQUEST_PART - WHERE SALES_REQUEST_MASTER_OBJID = SRM.OBJID - ) AS PART_NAME, + -- M-BOM이 있으면 MBOM_DETAIL에서, 없으면 SALES_REQUEST_PART에서 조회 + CASE + WHEN SRM.MBOM_HEADER_OBJID IS NOT NULL AND SRM.MBOM_HEADER_OBJID != '' THEN + (SELECT + CASE + WHEN COUNT(*) > 1 THEN + (SELECT PM.PART_NO FROM PART_MNG PM WHERE PM.OBJID::VARCHAR = (SELECT PART_OBJID FROM MBOM_DETAIL WHERE MBOM_HEADER_OBJID = SRM.MBOM_HEADER_OBJID ORDER BY REGDATE LIMIT 1)) || ' 외 ' || (COUNT(*) - 1) || '건' + WHEN COUNT(*) = 1 THEN + (SELECT PM.PART_NO FROM PART_MNG PM WHERE PM.OBJID::VARCHAR = (SELECT PART_OBJID FROM MBOM_DETAIL WHERE MBOM_HEADER_OBJID = SRM.MBOM_HEADER_OBJID ORDER BY REGDATE LIMIT 1)) + ELSE NULL + END + FROM MBOM_DETAIL WHERE MBOM_HEADER_OBJID = SRM.MBOM_HEADER_OBJID) + ELSE + (SELECT + CASE + WHEN COUNT(*) > 1 THEN + (SELECT PM.PART_NO FROM PART_MNG PM WHERE PM.OBJID::VARCHAR = (SELECT PART_OBJID FROM SALES_REQUEST_PART WHERE SALES_REQUEST_MASTER_OBJID = SRM.OBJID ORDER BY REGDATE LIMIT 1)) || ' 외 ' || (COUNT(*) - 1) || '건' + WHEN COUNT(*) = 1 THEN + (SELECT PM.PART_NO FROM PART_MNG PM WHERE PM.OBJID::VARCHAR = (SELECT PART_OBJID FROM SALES_REQUEST_PART WHERE SALES_REQUEST_MASTER_OBJID = SRM.OBJID ORDER BY REGDATE LIMIT 1)) + ELSE NULL + END + FROM SALES_REQUEST_PART WHERE SALES_REQUEST_MASTER_OBJID = SRM.OBJID) + END AS PART_NO, + CASE + WHEN SRM.MBOM_HEADER_OBJID IS NOT NULL AND SRM.MBOM_HEADER_OBJID != '' THEN + (SELECT + CASE + WHEN COUNT(*) > 1 THEN + (SELECT PM.PART_NAME FROM PART_MNG PM WHERE PM.OBJID::VARCHAR = (SELECT PART_OBJID FROM MBOM_DETAIL WHERE MBOM_HEADER_OBJID = SRM.MBOM_HEADER_OBJID ORDER BY REGDATE LIMIT 1)) || ' 외 ' || (COUNT(*) - 1) || '건' + WHEN COUNT(*) = 1 THEN + (SELECT PM.PART_NAME FROM PART_MNG PM WHERE PM.OBJID::VARCHAR = (SELECT PART_OBJID FROM MBOM_DETAIL WHERE MBOM_HEADER_OBJID = SRM.MBOM_HEADER_OBJID ORDER BY REGDATE LIMIT 1)) + ELSE NULL + END + FROM MBOM_DETAIL WHERE MBOM_HEADER_OBJID = SRM.MBOM_HEADER_OBJID) + ELSE + (SELECT + CASE + WHEN COUNT(*) > 1 THEN + (SELECT PM.PART_NAME FROM PART_MNG PM WHERE PM.OBJID::VARCHAR = (SELECT PART_OBJID FROM SALES_REQUEST_PART WHERE SALES_REQUEST_MASTER_OBJID = SRM.OBJID ORDER BY REGDATE LIMIT 1)) || ' 외 ' || (COUNT(*) - 1) || '건' + WHEN COUNT(*) = 1 THEN + (SELECT PM.PART_NAME FROM PART_MNG PM WHERE PM.OBJID::VARCHAR = (SELECT PART_OBJID FROM SALES_REQUEST_PART WHERE SALES_REQUEST_MASTER_OBJID = SRM.OBJID ORDER BY REGDATE LIMIT 1)) + ELSE NULL + END + FROM SALES_REQUEST_PART WHERE SALES_REQUEST_MASTER_OBJID = SRM.OBJID) + END AS PART_NAME, SRM.PROJECT_NO, (SELECT PROJECT_NO FROM PROJECT_MGMT PM WHERE PM.OBJID = SRM.PROJECT_NO) AS PROJECT_NUMBER, @@ -1190,26 +1227,40 @@ VALUES - AND SRM.OBJID IN ( - SELECT - SRP.SALES_REQUEST_MASTER_OBJID - FROM - SALES_REQUEST_PART SRP - LEFT OUTER JOIN PART_MNG PM - ON SRP.PART_OBJID::VARCHAR = PM.OBJID::VARCHAR - WHERE PM.PART_NO LIKE '%${SEARCH_PART_NO}%' - ) + AND ( + -- SALES_REQUEST_PART에서 검색 + SRM.OBJID IN ( + SELECT SRP.SALES_REQUEST_MASTER_OBJID + FROM SALES_REQUEST_PART SRP + LEFT OUTER JOIN PART_MNG PM ON SRP.PART_OBJID::VARCHAR = PM.OBJID::VARCHAR + WHERE PM.PART_NO LIKE UPPER('%${SEARCH_PART_NO}%') + ) + -- MBOM_DETAIL에서 검색 (M-BOM이 있는 경우) + OR SRM.MBOM_HEADER_OBJID IN ( + SELECT MD.MBOM_HEADER_OBJID + FROM MBOM_DETAIL MD + LEFT OUTER JOIN PART_MNG PM ON MD.PART_OBJID::VARCHAR = PM.OBJID::VARCHAR + WHERE PM.PART_NO LIKE UPPER('%${SEARCH_PART_NO}%') + ) + ) - AND SRM.OBJID IN ( - SELECT - SRP.SALES_REQUEST_MASTER_OBJID - FROM - SALES_REQUEST_PART SRP - LEFT OUTER JOIN PART_MNG PM - ON SRP.PART_OBJID::VARCHAR = PM.OBJID::VARCHAR - WHERE PM.PART_NAME LIKE '%${SEARCH_PART_NAME}%' - ) + AND ( + -- SALES_REQUEST_PART에서 검색 + SRM.OBJID IN ( + SELECT SRP.SALES_REQUEST_MASTER_OBJID + FROM SALES_REQUEST_PART SRP + LEFT OUTER JOIN PART_MNG PM ON SRP.PART_OBJID::VARCHAR = PM.OBJID::VARCHAR + WHERE PM.PART_NAME LIKE UPPER('%${SEARCH_PART_NAME}%') + ) + -- MBOM_DETAIL에서 검색 (M-BOM이 있는 경우) + OR SRM.MBOM_HEADER_OBJID IN ( + SELECT MD.MBOM_HEADER_OBJID + FROM MBOM_DETAIL MD + LEFT OUTER JOIN PART_MNG PM ON MD.PART_OBJID::VARCHAR = PM.OBJID::VARCHAR + WHERE PM.PART_NAME LIKE UPPER('%${SEARCH_PART_NAME}%') + ) + ) @@ -3567,10 +3618,17 @@ ORDER BY V.PATH2 (SELECT PROJECT_NO FROM PROJECT_MGMT PM WHERE PM.OBJID = SRM.PROJECT_NO) AS PROJECT_NUMBER, SRM.PURCHASE_TYPE, (SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = SRM.PURCHASE_TYPE) AS PURCHASE_TYPE_NAME, - SRM.ORDER_TYPE, - (SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = SRM.ORDER_TYPE) AS ORDER_TYPE_NAME, + -- 주문유형: 프로젝트 정보(CATEGORY_CD) 우선, 없으면 SALES_REQUEST_MASTER 값 + COALESCE( + (SELECT PM.CATEGORY_CD FROM PROJECT_MGMT PM WHERE PM.OBJID::VARCHAR = SRM.PROJECT_NO), + SRM.ORDER_TYPE + ) AS ORDER_TYPE, + CODE_NAME(COALESCE( + (SELECT PM.CATEGORY_CD FROM PROJECT_MGMT PM WHERE PM.OBJID::VARCHAR = SRM.PROJECT_NO), + SRM.ORDER_TYPE + )) AS ORDER_TYPE_NAME, SRM.PRODUCT_NAME, - (SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = SRM.PRODUCT_NAME) AS PRODUCT_NAME_TITLE, + CODE_NAME(SRM.PRODUCT_NAME) AS PRODUCT_NAME_TITLE, -- 품번/품명 ("외 N건" 형태로 표시) - 품의서는 항상 SALES_REQUEST_PART에 데이터가 있음 ( SELECT @@ -3612,7 +3670,13 @@ ORDER BY V.PATH2 -- (SELECT CASE WHEN COUNT(*) > 0 THEN 'Y' ELSE 'N' END FROM PURCHASE_ORDER_MASTER WHERE SALES_REQUEST_OBJID = SRM.OBJID AND MAIL_SENT = 'Y') AS MAIL_SENT, -- 발주일 (일단 주석처리) -- (SELECT TO_CHAR(MAX(ORDER_DATE), 'YYYY-MM-DD') FROM PURCHASE_ORDER_MASTER WHERE SALES_REQUEST_OBJID = SRM.OBJID) AS ORDER_DATE, - SRM.STATUS, + -- 상태: 결재 테이블 상태 우선, 없으면 SRM.STATUS + CASE + WHEN A.ROUTE_STATUS = 'complete' THEN 'approvalComplete' + WHEN A.ROUTE_STATUS = 'inProcess' THEN 'inProcess' + WHEN A.ROUTE_STATUS = 'reject' THEN 'reject' + ELSE SRM.STATUS + END AS STATUS, CASE WHEN A.APPR_STATUS IS NOT NULL THEN A.APPR_STATUS WHEN SRM.STATUS = 'create' THEN '작성중' @@ -3631,6 +3695,7 @@ ORDER BY V.PATH2 LEFT OUTER JOIN ( SELECT B.OBJID AS ROUTE_OBJID, + B.STATUS AS ROUTE_STATUS, CASE B.STATUS WHEN 'inProcess' THEN '결재중' WHEN 'complete' THEN '결재완료' @@ -3675,7 +3740,14 @@ ORDER BY V.PATH2 - AND SRM.STATUS = #{SEARCH_STATUS} + AND ( + CASE + WHEN A.ROUTE_STATUS = 'complete' THEN 'approvalComplete' + WHEN A.ROUTE_STATUS = 'inProcess' THEN 'inProcess' + WHEN A.ROUTE_STATUS = 'reject' THEN 'reject' + ELSE SRM.STATUS + END + ) = #{SEARCH_STATUS} diff --git a/src/com/pms/service/PurchaseOrderService.java b/src/com/pms/service/PurchaseOrderService.java index 1e12eae..179c978 100644 --- a/src/com/pms/service/PurchaseOrderService.java +++ b/src/com/pms/service/PurchaseOrderService.java @@ -2279,6 +2279,7 @@ public class PurchaseOrderService { /** * 발주서 결재완료 후처리 + * - 자동 메일 발송 기능 비활성화 (2024.12 - 발주서 송부 버튼으로 수동 발송으로 변경) */ public void afterApprovalCompleteRouteInfo(SqlSession sqlSession, Map routeMap, Map targetMap, Map sqlParamMap) { String targetObjId = CommonUtils.checkNull(sqlParamMap.get("targetObjId")); @@ -2305,6 +2306,10 @@ public class PurchaseOrderService { sqlParamMap.put("act_status", "0001065"); //발주완료 sqlSession.update("purchaseOrder.salesPartChgActStatusByPurchaseOrderId", sqlParamMap); + // 2024.12 - 자동 메일 발송 비활성화 + // 발주서 메일 발송은 목록 화면의 "발주서 송부" 버튼을 통해 수동으로 발송합니다. + // 수동 발송 메서드: sendPurchaseOrderMailManual() + /* //2. 발주서 메일발송 try{ @@ -2332,13 +2337,6 @@ public class PurchaseOrderService { String subject = poNo + poTitle; //내용 - /*Map param = new HashMap(); - param.put("SUBJECT" , subject); - param.put("CAR_CODE" , "CAR-BENZ0001"); - param.put("CAR_NAME" , "G63 AMG 6x6"); - param.put("PRODUCT_GROUP_NAME", "메르세데스벤츠"); - param.put("PRODUCT_NAME" , "지바겐"); - String contents = MailUtil.getHTMLContents("mailTemplate2", param);*/ String contents_table = this.makePoContentsTable(masterInfo, detailList, apprList, multiMasterList); String contents = this.makeMailContents(contents_table); @@ -2370,6 +2368,7 @@ public class PurchaseOrderService { }catch(Exception e){ e.printStackTrace(); } + */ } /** @@ -2914,4 +2913,194 @@ public class PurchaseOrderService { sqlSession.close(); } } + + /** + * 발주서 메일 수동 발송 (버튼 클릭 시) + * @param request + * @param paramMap - objId, toEmails, ccEmails, subject, contents + * @return 발송 결과 + */ + public Map sendPurchaseOrderMailManual(HttpServletRequest request, Map paramMap) { + Map resultMap = new HashMap(); + + try { + String targetObjId = CommonUtils.checkNull(paramMap.get("objId")); + String toEmails = CommonUtils.checkNull(paramMap.get("toEmails")); + String ccEmails = CommonUtils.checkNull(paramMap.get("ccEmails")); + String subject = CommonUtils.checkNull(paramMap.get("subject")); + String contents = CommonUtils.checkNull(paramMap.get("contents")); + String writerEmail = CommonUtils.checkNull(paramMap.get("WRITER_EMAIL")); + String writer = CommonUtils.checkNull(paramMap.get("WRITER")); + + // 발주서 정보 조회 + Map infoParam = new HashMap(); + infoParam.put("objId", targetObjId); + infoParam.put("PURCHASE_ORDER_MASTER_OBJID", targetObjId); + + Map masterInfo = commonService.selectOne("purchaseOrder.getPurchaseOrderMasterInfo", null, infoParam); + + if(masterInfo == null) { + resultMap.put("result", "error"); + resultMap.put("message", "발주서 정보를 찾을 수 없습니다."); + return resultMap; + } + + // 발주부품목록, 결재정보, 동시발주목록, 도면목록 조회 + infoParam.put("MULTI_MASTER_OBJID", targetObjId); + List detailList = commonService.selectList("purchaseOrder.getPURCHASE_ORDER_PART", null, infoParam); + List apprList = commonService.getApprovalLine(infoParam); + List multiMasterList = commonService.selectList("purchaseOrder.selectPurchaseOrderMasterList", null, infoParam); + ArrayList partFileList = commonService.selectList("purchaseOrder.purchaseOrderPartFileListForMail", null, infoParam); + + SimpleDateFormat frm = new SimpleDateFormat("yyyyMMddHHmm"); + SimpleDateFormat frm2 = new SimpleDateFormat("yyyy-MM-dd"); + Calendar cal = Calendar.getInstance(); + String todayKor = frm.format(cal.getTime()); + String poNo = CommonUtils.checkNull((String)masterInfo.get("PURCHASE_ORDER_NO")); + String excelName = "발주서_" + poNo + "_" + todayKor + ".xls"; + String zipName = "도면_" + poNo + "_" + todayKor + ".zip"; + masterInfo.put("EXCELFILE_NAME", excelName); + masterInfo.put("APPR_COMPLETE_DATE", frm2.format(cal.getTime())); + + // 발주서 테이블 내용 생성 + String contents_table = this.makePoContentsTable(masterInfo, detailList, apprList, multiMasterList); + + // 메일 본문 생성 (사용자 입력 내용 + 발주서 테이블) + String mailContents = this.makeMailContentsWithUserInput(contents, contents_table); + + // 수신인 이메일 목록 생성 + ArrayList toUserIdList = new ArrayList(); + ArrayList toEmailList = new ArrayList(); + String[] toEmailArr = toEmails.split(","); + for(String email : toEmailArr) { + email = email.trim(); + if(!"".equals(email)) { + toEmailList.add(email); + toUserIdList.add(""); // 이름은 비워둠 + } + } + + // 참조 이메일 목록 생성 + ArrayList ccEmailList = new ArrayList(); + if(!"".equals(ccEmails)) { + String[] ccEmailArr = ccEmails.split(","); + for(String email : ccEmailArr) { + email = email.trim(); + if(!"".equals(email)) { + ccEmailList.add(email); + } + } + } + // 작성자 이메일을 참조에 추가 (중복 방지) + if(!"".equals(writerEmail) && !ccEmailList.contains(writerEmail)) { + ccEmailList.add(writerEmail); + } + + // 첨부파일 목록 생성 + ArrayList attachFileList = new ArrayList(); + + // 1. 발주서 엑셀 파일 첨부 + HashMap excelFile = this.makeMailAttachFileOrderSheet(masterInfo, contents_table); + if(excelFile != null) { + attachFileList.add(excelFile); + } + + // 2. 도면 파일 압축 첨부 + if(partFileList != null && partFileList.size() > 0) { + File zf = MailUtil.zipFileListMail(zipName, partFileList); + if(zf != null && zf.exists()) { + HashMap hm = new HashMap(); + hm.put(Constants.Db.COL_FILE_REAL_NAME, zf.getName()); + hm.put(Constants.Db.COL_FILE_SAVED_NAME, zf.getName()); + hm.put(Constants.Db.COL_FILE_PATH, zf.getPath().replace("\\" + zf.getName(), "")); + attachFileList.add(hm); + } + } + + // 메일 발송 + String fromUser = writer; + String fromEmail = writerEmail; + if("".equals(fromEmail)) { + fromEmail = CommonUtils.checkNull((String)masterInfo.get("WRITER_EMAIL")); + } + if("".equals(fromUser)) { + fromUser = CommonUtils.checkNull((String)masterInfo.get("WRITER")); + } + + boolean sendResult = MailUtil.sendMailWithAttachFile(fromUser, fromEmail, toUserIdList, toEmailList, ccEmailList, null, null, subject, mailContents, attachFileList, "PURCHASE_ORDER"); + + if(sendResult) { + // 메일 발송 성공 시 DB 업데이트 + SqlSession sqlSession = SqlMapConfig.getInstance().getSqlSession(false); + try { + Map updateParam = new HashMap(); + updateParam.put("OBJID", targetObjId); + updateParam.put("MAIL_SEND_YN", "Y"); + updateParam.put("MAIL_SEND_DATE", frm2.format(cal.getTime())); + sqlSession.update("purchaseOrder.updateMailSendStatus", updateParam); + sqlSession.commit(); + } catch(Exception e) { + sqlSession.rollback(); + e.printStackTrace(); + } finally { + sqlSession.close(); + } + + resultMap.put("result", "success"); + resultMap.put("message", "메일이 성공적으로 발송되었습니다."); + } else { + resultMap.put("result", "error"); + resultMap.put("message", "메일 발송에 실패했습니다."); + } + + } catch(Exception e) { + e.printStackTrace(); + resultMap.put("result", "error"); + resultMap.put("message", "메일 발송 중 오류가 발생했습니다: " + e.getMessage()); + } + + return resultMap; + } + + /** + * 사용자 입력 내용과 발주서 테이블을 합친 메일 본문 생성 + * @param userContents 사용자가 입력한 메일 내용 + * @param poContentsTable 발주서 테이블 HTML + * @return 완성된 메일 본문 + */ + private String makeMailContentsWithUserInput(String userContents, String poContentsTable) { + StringBuffer sb = new StringBuffer(); + sb.append(""); + sb.append(""); + sb.append(" "); + sb.append(" "); + sb.append(""); + sb.append(""); + + // 사용자 입력 내용 (줄바꿈을
로 변환) + sb.append("
"); + sb.append(userContents.replace("\n", "
")); + sb.append("
"); + + // 구분선 + sb.append("
"); + + // 발주서 테이블 + sb.append("
"); + sb.append("

[ 발주서 상세 ]

"); + sb.append(poContentsTable); + sb.append("
"); + + sb.append("
※발신전용 메일입니다.
"); + sb.append(""); + sb.append(""); + + return sb.toString(); + } }