diff --git a/WebContent/WEB-INF/view/partMng/openBomReportExcelImportPopUp.jsp b/WebContent/WEB-INF/view/partMng/openBomReportExcelImportPopUp.jsp index 96aedd3..1b9a6a6 100644 --- a/WebContent/WEB-INF/view/partMng/openBomReportExcelImportPopUp.jsp +++ b/WebContent/WEB-INF/view/partMng/openBomReportExcelImportPopUp.jsp @@ -240,7 +240,10 @@ $(document).ready(function(){ var part_type = part_type_val && part_type_val.trim() !== '' ? $.parseJSON(part_type_val) : {}; var acctfg_code = acctfg_code_val && acctfg_code_val.trim() !== '' ? $.parseJSON(acctfg_code_val) : {}; var sup_code = sup_code_val && sup_code_val.trim() !== '' ? $.parseJSON(sup_code_val) : {}; - + + var unit_dc_code_val = $("#unit_dc_code").val(); + var unit_dc_code = unit_dc_code_val && unit_dc_code_val.trim() !== '' ? $.parseJSON(unit_dc_code_val) : {}; + //Excel File Upload된 파일 목록 부분을 초기화 한다. $("#excelImportList").hide(); @@ -384,16 +387,24 @@ $(document).ready(function(){ } } } - ,{name:"UNIT_DC",index:"UNIT_DC", width: 70, align:"center", hidden: false, sortable:false, editable:true + ,{name:"UNIT_DC",index:"UNIT_DC", width: 80, align:"center", hidden: false, sortable:false, editable:true + ,edittype :"select" + ,formatter :"select" ,editoptions:{ - dataInit : function(e){ + value: unit_dc_code + ,dataInit : function(e){ + e.style.width = "92%"; e.style.fontSize = 13; } } } - ,{name:"UNITMANG_DC",index:"UNITMANG_DC", width: 70, align:"center", hidden: false, sortable:false, editable:true + ,{name:"UNITMANG_DC",index:"UNITMANG_DC", width: 80, align:"center", hidden: false, sortable:false, editable:true + ,edittype :"select" + ,formatter :"select" ,editoptions:{ - dataInit : function(e){ + value: unit_dc_code + ,dataInit : function(e){ + e.style.width = "92%"; e.style.fontSize = 13; } } @@ -479,7 +490,7 @@ $(document).ready(function(){ //,cellsubmit : "clientArray" ,rownumbers : true ,viewrecords : true - ,width : 1500 + ,width : "auto" ,height : 420 ,multiselect : false ,shrinkToFit : false @@ -1369,6 +1380,7 @@ function fn_save(){ + \ No newline at end of file diff --git a/WebContent/WEB-INF/view/partMng/openPartExcelImportPopUp.jsp b/WebContent/WEB-INF/view/partMng/openPartExcelImportPopUp.jsp index 1be877a..58e1b91 100644 --- a/WebContent/WEB-INF/view/partMng/openPartExcelImportPopUp.jsp +++ b/WebContent/WEB-INF/view/partMng/openPartExcelImportPopUp.jsp @@ -38,6 +38,7 @@ $(document).ready(function(){ var part_type = $.parseJSON($("#part_type").val()); //jqGrid 구분 var acctfg_code = $.parseJSON($("#acctfg_code").val()); //jqGrid 계정구분 var sup_code = $.parseJSON($("#sup_code").val()); //jqGrid 구분 + var unit_dc_code = $("#unit_dc_code").val() ? $.parseJSON($("#unit_dc_code").val()) : {}; //jqGrid 단위 //Excel File Upload된 파일 목록 부분을 초기화 한다. $("#excelImportList").hide(); @@ -187,16 +188,24 @@ $(document).ready(function(){ } } } - ,{name:"UNIT_DC",index:"UNIT_DC", width: 70, align:"center", hidden: false, sortable:false, editable:true + ,{name:"UNIT_DC",index:"UNIT_DC", width: 80, align:"center", hidden: false, sortable:false, editable:true + ,edittype :"select" + ,formatter :"select" ,editoptions:{ - dataInit : function(e){ + value: unit_dc_code + ,dataInit : function(e){ + e.style.width = "92%"; e.style.fontSize = 13; } } } - ,{name:"UNITMANG_DC",index:"UNITMANG_DC", width: 70, align:"center", hidden: false, sortable:false, editable:true + ,{name:"UNITMANG_DC",index:"UNITMANG_DC", width: 80, align:"center", hidden: false, sortable:false, editable:true + ,edittype :"select" + ,formatter :"select" ,editoptions:{ - dataInit : function(e){ + value: unit_dc_code + ,dataInit : function(e){ + e.style.width = "92%"; e.style.fontSize = 13; } } @@ -293,7 +302,7 @@ $(document).ready(function(){ ,height : 530 //'auto' //520 ,multiselect : false ,shrinkToFit : false - ,autowidth : true + ,autowidth : false ,sortable : false ,rowNum : 5000 ,forceFit : false //컬럼의 width를 변화시킬때 그리드의 width를 고정 여부 @@ -1084,6 +1093,7 @@ function fn_save(){ + \ No newline at end of file diff --git a/WebContent/WEB-INF/view/partMng/partMngDetailPopUp.jsp b/WebContent/WEB-INF/view/partMng/partMngDetailPopUp.jsp index 3f7b38d..26a078d 100644 --- a/WebContent/WEB-INF/view/partMng/partMngDetailPopUp.jsp +++ b/WebContent/WEB-INF/view/partMng/partMngDetailPopUp.jsp @@ -461,9 +461,19 @@ section { } .plm_btn_wrap_center { flex-direction: row !important; + display: flex !important; + justify-content: center !important; + position: relative !important; + left: auto !important; + transform: none !important; } .plm_btns, .btns { width: auto !important; + float: none !important; + } + .btn_wrap { + padding: 10px 5px !important; + height: auto !important; } } @@ -609,13 +619,13 @@ section { - + - + diff --git a/WebContent/WEB-INF/view/partMng/partMngFormPopUp.jsp b/WebContent/WEB-INF/view/partMng/partMngFormPopUp.jsp index 169eed2..d702f16 100644 --- a/WebContent/WEB-INF/view/partMng/partMngFormPopUp.jsp +++ b/WebContent/WEB-INF/view/partMng/partMngFormPopUp.jsp @@ -293,6 +293,31 @@ function fn_overlapPartMng(){ .input_title {border-left:1px solid #ccc;} .input_sub_title {border-left:1px solid #ccc;} .pmsPopupForm tr:last-child td{border-bottom:1px solid #ccc;} +@media (max-width: 768px) { + .pmsPopupForm td { + display: table-cell !important; + width: auto !important; + } + .input_title { + border-right: 1px solid #ccc !important; + } + .plm_btn_wrap_center { + flex-direction: row !important; + display: flex !important; + justify-content: center !important; + position: relative !important; + left: auto !important; + transform: none !important; + } + .plm_btns, .btns { + width: auto !important; + float: none !important; + } + .btn_wrap { + padding: 10px 5px !important; + height: auto !important; + } +}
@@ -405,7 +430,7 @@ function fn_overlapPartMng(){ - + @@ -426,13 +451,19 @@ function fn_overlapPartMng(){ - + - + diff --git a/WebContent/WEB-INF/view/partMng/partMngList.jsp b/WebContent/WEB-INF/view/partMng/partMngList.jsp index 071c468..bf9a759 100644 --- a/WebContent/WEB-INF/view/partMng/partMngList.jsp +++ b/WebContent/WEB-INF/view/partMng/partMngList.jsp @@ -219,8 +219,8 @@ String connector = person.getUserId(); {headerHozAlign : 'center', hozAlign : 'left', width : '100', title : '규격', field : 'SPEC' }, {headerHozAlign : 'center', hozAlign : 'center', width : '80', title : '계정구분', field : 'ACCTFG_NM' }, {headerHozAlign : 'center', hozAlign : 'center', width : '80', title : '조달구분', field : 'ODRFG_NM' }, - {headerHozAlign : 'center', hozAlign : 'center', width : '80', title : '재고단위', field : 'UNIT_DC' }, - {headerHozAlign : 'center', hozAlign : 'center', width : '80', title : '관리단위', field : 'UNITMANG_DC' }, + {headerHozAlign : 'center', hozAlign : 'center', width : '80', title : '재고단위', field : 'UNIT_DC_NM' }, + {headerHozAlign : 'center', hozAlign : 'center', width : '80', title : '관리단위', field : 'UNITMANG_DC_NM' }, {headerHozAlign : 'center', hozAlign : 'center', width : '80', title : '환산수량', field : 'UNITCHNG_NB' }, {headerHozAlign : 'center', hozAlign : 'center', width : '80', title : 'LOT구분', field : 'LOT_FG_NM' }, {headerHozAlign : 'center', hozAlign : 'center', width : '80', title : '사용여부', field : 'USE_YN_NM' }, diff --git a/WebContent/WEB-INF/view/partMng/partMngTempList.jsp b/WebContent/WEB-INF/view/partMng/partMngTempList.jsp index 5f2543a..b3cd320 100644 --- a/WebContent/WEB-INF/view/partMng/partMngTempList.jsp +++ b/WebContent/WEB-INF/view/partMng/partMngTempList.jsp @@ -189,8 +189,8 @@ ui-jqgrid tr.jqgrow td { {headerHozAlign : 'center', hozAlign : 'left', width : '100', title : '규격', field : 'SPEC' }, {headerHozAlign : 'center', hozAlign : 'center', width : '80', title : '계정구분', field : 'ACCTFG_NM' }, {headerHozAlign : 'center', hozAlign : 'center', width : '80', title : '조달구분', field : 'ODRFG_NM' }, - {headerHozAlign : 'center', hozAlign : 'center', width : '80', title : '재고단위', field : 'UNIT_DC' }, - {headerHozAlign : 'center', hozAlign : 'center', width : '80', title : '관리단위', field : 'UNITMANG_DC' }, + {headerHozAlign : 'center', hozAlign : 'center', width : '80', title : '재고단위', field : 'UNIT_DC_NM' }, + {headerHozAlign : 'center', hozAlign : 'center', width : '80', title : '관리단위', field : 'UNITMANG_DC_NM' }, {headerHozAlign : 'center', hozAlign : 'center', width : '80', title : '환산수량', field : 'UNITCHNG_NB' }, {headerHozAlign : 'center', hozAlign : 'center', width : '80', title : 'LOT구분', field : 'LOT_FG_NM' }, {headerHozAlign : 'center', hozAlign : 'center', width : '80', title : '사용여부', field : 'USE_YN_NM' }, diff --git a/WebContent/WEB-INF/view/project/WBSExcelImportPopUp.jsp b/WebContent/WEB-INF/view/project/WBSExcelImportPopUp.jsp index 273a2d7..c3168d5 100644 --- a/WebContent/WEB-INF/view/project/WBSExcelImportPopUp.jsp +++ b/WebContent/WEB-INF/view/project/WBSExcelImportPopUp.jsp @@ -233,29 +233,119 @@ function generateObjId(){ return String(Math.abs(Math.floor(Math.random() * 2147483647))) + String(++rowSeq); } +function findLastDescendant(parentTr){ + var parentDepth = getRowDepth(parentTr[0]); + var lastDescendant = parentTr; + parentTr.nextAll("tr").each(function(){ + if(getRowDepth(this) > parentDepth){ + lastDescendant = $(this); + } else { + return false; + } + }); + return lastDescendant; +} + +function renumberAllRows(){ + var rows = $("#wbsTaskList tr:not(#row_total)"); + var counters = [0, 0, 0]; + rows.each(function(){ + var objId = $(this).find("input[name='WBS_TASK_OBJID']").val(); + var depth = parseInt($("#TASK_LEVEL_" + objId).val()) || 0; + if(depth < 1 || depth > 3) return true; + + if(depth === 1){ + counters[0]++; + counters[1] = 0; + counters[2] = 0; + } else if(depth === 2){ + counters[1]++; + counters[2] = 0; + } else { + counters[2]++; + } + + var unitNo; + if(depth === 1) unitNo = String(counters[0]); + else if(depth === 2) unitNo = counters[0] + "." + counters[1]; + else unitNo = counters[0] + "." + counters[1] + "." + counters[2]; + + $("#UNIT_NO_" + objId).val(unitNo); + $(this).find(".lvl_input").val(""); + $(this).find(".lvl_input[data-level='" + depth + "']").val(unitNo); + }); +} + function addRow(){ var objId = generateObjId(); + var checked = $("input[name='rowCheck']:checked"); + var autoLevel = ""; + var insertAfterTr = null; + + if(checked.length > 0){ + var selectedTr = checked.last().closest("tr"); + var selectedDepth = getRowDepth(selectedTr[0]); + autoLevel = selectedDepth; + insertAfterTr = findLastDescendant(selectedTr); + checked.prop("checked", false); + } + var tr = ''; tr += ''; tr += ''; tr += ''; tr += ''; - tr += ''; + tr += ''; tr += ''; tr += ''; tr += ''; tr += ''; tr += ''; - var checked = $("input[name='rowCheck']:checked"); - if(checked.length > 0){ - checked.last().closest("tr").after(tr); - checked.prop("checked", false); + if(insertAfterTr){ + insertAfterTr.after(tr); } else { $("#wbsTaskList").append(tr); } bindLevelInput(objId); + renumberAllRows(); +} + +function addChildRow(){ + var checked = $("input[name='rowCheck']:checked"); + if(checked.length == 0){ + Swal.fire('부모 행을 선택해 주세요'); + return; + } + var selectedTr = checked.last().closest("tr"); + var selectedDepth = getRowDepth(selectedTr[0]); + + if(selectedDepth >= 3){ + Swal.fire('수준 3 이하로는 추가할 수 없습니다'); + return; + } + + var objId = generateObjId(); + var autoLevel = selectedDepth + 1; + var insertAfterTr = findLastDescendant(selectedTr); + + var tr = ''; + tr += ''; + tr += ''; + tr += ''; + tr += ''; + tr += ''; + tr += ''; + tr += ''; + tr += ''; + tr += ''; + tr += ''; + + insertAfterTr.after(tr); + checked.prop("checked", false); + bindLevelInput(objId); + renumberAllRows(); } function deleteRow(){ @@ -264,10 +354,35 @@ function deleteRow(){ Swal.fire('삭제할 행을 선택해 주세요'); return; } + var removeTargets = []; + var hasChildren = false; checked.each(function(){ var objId = $(this).val(); - if($("#row_" + objId).attr("id") !== "row_total"){ - $("#row_" + objId).remove(); + var tr = $("#row_" + objId); + if(tr.attr("id") === "row_total") return true; + removeTargets.push(tr); + var parentDepth = getRowDepth(tr[0]); + tr.nextAll("tr").each(function(){ + if(getRowDepth(this) > parentDepth){ + removeTargets.push($(this)); + hasChildren = true; + } else { + return false; + } + }); + }); + + var msg = hasChildren ? '하위 항목도 함께 삭제됩니다. 삭제하시겠습니까?' : '삭제하시겠습니까?'; + Swal.fire({ + title: msg, + icon: 'warning', + showCancelButton: true, + confirmButtonText: '삭제', + cancelButtonText: '취소' + }).then(function(result){ + if(result.isConfirmed){ + $.each(removeTargets, function(i, tr){ tr.remove(); }); + renumberAllRows(); } }); } @@ -439,6 +554,7 @@ function saveWBS(){
+ diff --git a/WebContent/WEB-INF/view/purchaseOrder/projectPurchaseDeliveryStatus.jsp b/WebContent/WEB-INF/view/purchaseOrder/projectPurchaseDeliveryStatus.jsp new file mode 100644 index 0000000..545dbc1 --- /dev/null +++ b/WebContent/WEB-INF/view/purchaseOrder/projectPurchaseDeliveryStatus.jsp @@ -0,0 +1,218 @@ +<%@ 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" %> + + + + + <%=Constants.SYSTEM_NAME%> + + + + + + + + + + + + + + +
+
+
+
+

+ 프로젝트별 발주/입고 현황 +

+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+ + + + + +
+
+ <%@include file= "/WEB-INF/view/common/common_gridArea.jsp" %> +
+
+
+ + + \ No newline at end of file diff --git a/WebContent/template/WBS_EXCEL_IMPORT_TEMPLATE.xlsx b/WebContent/template/WBS_EXCEL_IMPORT_TEMPLATE.xlsx index 952250e..db0e131 100644 Binary files a/WebContent/template/WBS_EXCEL_IMPORT_TEMPLATE.xlsx and b/WebContent/template/WBS_EXCEL_IMPORT_TEMPLATE.xlsx differ diff --git a/src/com/pms/controller/PartMngController.java b/src/com/pms/controller/PartMngController.java index fa47ebd..44ecad9 100644 --- a/src/com/pms/controller/PartMngController.java +++ b/src/com/pms/controller/PartMngController.java @@ -401,12 +401,16 @@ public class PartMngController { } + // 단위 코드 셀렉트박스 + code_map.put("unit_dc_cd", commonService.bizMakeOptionList("0001399", CommonUtils.nullToEmpty((String)resultMap.get("UNIT_DC")), "common.getCodeselect")); + code_map.put("unitmang_dc_cd", commonService.bizMakeOptionList("0001399", CommonUtils.nullToEmpty((String)resultMap.get("UNITMANG_DC")), "common.getCodeselect")); + }catch(Exception e){ e.printStackTrace(); } request.setAttribute("code_map", code_map); request.setAttribute("resultMap", resultMap); - + return "/partMng/partMngFormPopUp"; } @@ -456,6 +460,10 @@ public class PartMngController { resultMap.put("OBJID", objId); } + // 단위 코드 셀렉트박스 + code_map.put("unit_dc_cd", commonService.bizMakeOptionList("0001399", CommonUtils.nullToEmpty((String)resultMap.get("UNIT_DC")), "common.getCodeselect")); + code_map.put("unitmang_dc_cd", commonService.bizMakeOptionList("0001399", CommonUtils.nullToEmpty((String)resultMap.get("UNITMANG_DC")), "common.getCodeselect")); + }catch(Exception e){ e.printStackTrace(); } @@ -676,7 +684,12 @@ public class PartMngController { Map acctfgParam = new HashMap(); acctfgParam.put("codeId", Constants.ACCTFG_CODE); code_map.put("acctfg_code", commonService.getJqGridSelectBoxJsonData("common.getCodeList", acctfgParam, "선택")); - + + // 단위(UNIT_DC) 공통코드 조회 - jqGrid selectBox용 JSON + Map unitDcParam = new HashMap(); + unitDcParam.put("codeId", "0001399"); + code_map.put("unit_dc_code", commonService.getJqGridSelectBoxJsonData("common.getCodeList", unitDcParam, "선택")); + /* code_map.put("customer_cd",commonService.bizMakeOptionList("", (String)paramMap.get("customer_cd"),"common.getsupplyselect")); code_map.put("project_name",commonService.bizMakeOptionList("", (String)paramMap.get("project_name"),"common.getProjectNameList")); @@ -1962,6 +1975,11 @@ public class PartMngController { acctfgParam.put("codeId", Constants.ACCTFG_CODE); code_map.put("acctfg_code", commonService.getJqGridSelectBoxJsonData("common.getCodeList", acctfgParam, "선택")); + // 단위(UNIT_DC) 공통코드 조회 - jqGrid selectBox용 JSON + Map unitDcParam = new HashMap(); + unitDcParam.put("codeId", "0001399"); + code_map.put("unit_dc_code", commonService.getJqGridSelectBoxJsonData("common.getCodeList", unitDcParam, "선택")); + sqlSession = SqlMapConfig.getInstance().getSqlSession(); // 통합 템플릿으로 변경하면서 unit_code 관련 로직은 사용하지 않음 diff --git a/src/com/pms/controller/PurchaseOrderController.java b/src/com/pms/controller/PurchaseOrderController.java index b8c2f6e..302b50a 100644 --- a/src/com/pms/controller/PurchaseOrderController.java +++ b/src/com/pms/controller/PurchaseOrderController.java @@ -1302,6 +1302,33 @@ public class PurchaseOrderController { return paramMap; } + /** + * 프로젝트별 발주/입고 현황 + */ + @RequestMapping("/purchaseOrder/projectPurchaseDeliveryStatus.do") + public String projectPurchaseDeliveryStatus(HttpServletRequest request, @RequestParam Map paramMap){ + Map code_map = new HashMap(); + try{ + code_map.put("customer_cd", commonService.bizMakeOptionList("", CommonUtils.nullToEmpty((String)paramMap.get("customer_objid")), "common.getsupplyselect")); + code_map.put("project_no", commonService.bizMakeOptionList("", CommonUtils.nullToEmpty((String)paramMap.get("project_no")), "common.getProjectNameList")); + code_map.put("product_cd", commonService.bizMakeOptionList("0000001", CommonUtils.nullToEmpty((String)paramMap.get("product")), "common.getCodeselect")); + }catch(Exception e){ + e.printStackTrace(); + } + request.setAttribute("code_map", code_map); + return "/purchaseOrder/projectPurchaseDeliveryStatus"; + } + + /** + * 프로젝트별 발주/입고 현황 그리드 조회 + */ + @ResponseBody + @RequestMapping("/purchaseOrder/projectPurchaseDeliveryStatusGridList.do") + public Map projectPurchaseDeliveryStatusGridList(HttpSession session, HttpServletRequest request, @RequestParam Map paramMap){ + commonService.selectListPagingNew("purchaseOrder.projectPurchaseDeliveryStatus", request, paramMap); + return paramMap; + } + /** * 수입검사 관리 */ diff --git a/src/com/pms/mapper/batch.xml b/src/com/pms/mapper/batch.xml index d85c107..f344234 100644 --- a/src/com/pms/mapper/batch.xml +++ b/src/com/pms/mapper/batch.xml @@ -188,6 +188,7 @@ UPDATE user_info SET user_id = #{login_id} + ,email = #{emailAddr} WHERE empseq = #{empseq} AND empseq IS NOT NULL AND empseq != '' diff --git a/src/com/pms/mapper/partMng.xml b/src/com/pms/mapper/partMng.xml index c389df4..f73d71e 100644 --- a/src/com/pms/mapper/partMng.xml +++ b/src/com/pms/mapper/partMng.xml @@ -162,7 +162,9 @@ P.ODRFG, CASE WHEN P.ODRFG = '0' THEN '구매' WHEN P.ODRFG = '1' THEN '생산' WHEN P.ODRFG = '8' THEN 'Phantom' ELSE '' END AS ODRFG_NM, P.UNIT_DC, + (SELECT CODE_NAME FROM COMM_CODE WHERE CODE_ID = P.UNIT_DC) AS UNIT_DC_NM, P.UNITMANG_DC, + (SELECT CODE_NAME FROM COMM_CODE WHERE CODE_ID = P.UNITMANG_DC) AS UNITMANG_DC_NM, P.UNITCHNG_NB, P.LOT_FG, CASE WHEN P.LOT_FG = '1' THEN '사용' WHEN P.LOT_FG = '0' THEN '미사용' ELSE '' END AS LOT_FG_NM, @@ -7925,12 +7927,21 @@ SELECT PM.OBJID + + + + + + \ No newline at end of file diff --git a/src/com/pms/service/BatchService.java b/src/com/pms/service/BatchService.java index 778f20a..3a18996 100644 --- a/src/com/pms/service/BatchService.java +++ b/src/com/pms/service/BatchService.java @@ -218,22 +218,24 @@ public class BatchService extends BaseService { int updateCount = 0; int skipCount = 0; - // empseq 기준으로 user_id 업데이트 + // empseq 기준으로 user_id, email 업데이트 for (Map amaranthUser : amaranthUserList) { String empSeq = (String) amaranthUser.get("empSeq"); String loginId = (String) amaranthUser.get("loginId"); + String emailAddr = (String) amaranthUser.get("emailAddr"); if (empSeq != null && !empSeq.isEmpty() && loginId != null && !loginId.isEmpty()) { Map updateParam = new HashMap(); updateParam.put("empseq", empSeq); updateParam.put("login_id", loginId); + updateParam.put("emailAddr", emailAddr); int updated = sqlSession.update("batch.updateLoginId", updateParam); if (updated > 0) { updateCount++; if (updateCount <= 10) { - System.out.println("[업데이트 " + updateCount + "] empseq: " + empSeq + " → loginId: " + loginId); + System.out.println("[업데이트 " + updateCount + "] empseq: " + empSeq + " → loginId: " + loginId + ", email: " + emailAddr); } } else { skipCount++; @@ -329,22 +331,24 @@ public class BatchService extends BaseService { int updateCount = 0; int skipCount = 0; - // empseq 기준으로 user_id 업데이트 + // empseq 기준으로 user_id, email 업데이트 for (Map amaranthUser : amaranthUserList) { String empSeq = (String) amaranthUser.get("empSeq"); String loginId = (String) amaranthUser.get("loginId"); + String emailAddr = (String) amaranthUser.get("emailAddr"); if (empSeq != null && !empSeq.isEmpty() && loginId != null && !loginId.isEmpty()) { Map updateParam = new HashMap(); updateParam.put("empseq", empSeq); updateParam.put("login_id", loginId); + updateParam.put("emailAddr", emailAddr); int updated = sqlSession.update("batch.updateLoginId", updateParam); if (updated > 0) { updateCount++; if (updateCount <= 10) { - System.out.println("[업데이트 " + updateCount + "] empseq: " + empSeq + " → loginId: " + loginId); + System.out.println("[업데이트 " + updateCount + "] empseq: " + empSeq + " → loginId: " + loginId + ", email: " + emailAddr); } } else { skipCount++; @@ -459,6 +463,15 @@ public class BatchService extends BaseService { user.put("loginId", loginId); } + // email 추출 (emailAddr + "@" + emailDomain 조합) + String emailAddr = extractJsonValue(jsonObject, "emailAddr"); + String emailDomain = extractJsonValue(jsonObject, "emailDomain"); + if (emailAddr != null && !emailAddr.isEmpty() && emailDomain != null && !emailDomain.isEmpty()) { + user.put("emailAddr", emailAddr + "@" + emailDomain); + } else if (emailAddr != null && !emailAddr.isEmpty()) { + user.put("emailAddr", emailAddr); + } + } catch (Exception e) { System.err.println("Amaranth 사용자 객체 파싱 오류: " + e.getMessage()); return null; diff --git a/src/com/pms/service/PartMngService.java b/src/com/pms/service/PartMngService.java index 836519f..91ec663 100644 --- a/src/com/pms/service/PartMngService.java +++ b/src/com/pms/service/PartMngService.java @@ -3106,10 +3106,40 @@ public class PartMngService extends BaseService { } // ERP 연동 필드 파싱 String unitDc = getCellValue(row, columnIndex++, formatter, emptyColCnt); - partMap.put("UNIT_DC", unitDc.trim()); - + if(!StringUtils.isBlank(unitDc)){ + if(unitDc.trim().matches("\\d+")){ + partMap.put("UNIT_DC", unitDc.trim()); + } else { + Map unitDcParam = new HashMap(); + unitDcParam.put("CODE_NAME", unitDc.trim()); + Map unitDcResult = sqlSession.selectOne("partMng.getUnitDcCode", unitDcParam); + if(unitDcResult != null && !StringUtils.isBlank((String)unitDcResult.get("code_id"))){ + partMap.put("UNIT_DC", unitDcResult.get("code_id")); + } else { + partMap.put("UNIT_DC", unitDc.trim()); + } + } + } else { + partMap.put("UNIT_DC", ""); + } + String unitmangDc = getCellValue(row, columnIndex++, formatter, emptyColCnt); - partMap.put("UNITMANG_DC", unitmangDc.trim()); + if(!StringUtils.isBlank(unitmangDc)){ + if(unitmangDc.trim().matches("\\d+")){ + partMap.put("UNITMANG_DC", unitmangDc.trim()); + } else { + Map unitmangParam = new HashMap(); + unitmangParam.put("CODE_NAME", unitmangDc.trim()); + Map unitmangResult = sqlSession.selectOne("partMng.getUnitDcCode", unitmangParam); + if(unitmangResult != null && !StringUtils.isBlank((String)unitmangResult.get("code_id"))){ + partMap.put("UNITMANG_DC", unitmangResult.get("code_id")); + } else { + partMap.put("UNITMANG_DC", unitmangDc.trim()); + } + } + } else { + partMap.put("UNITMANG_DC", ""); + } String unitchngNb = getCellValue(row, columnIndex++, formatter, emptyColCnt); partMap.put("UNITCHNG_NB", unitchngNb.trim()); @@ -3678,9 +3708,40 @@ public class PartMngService extends BaseService { } else { partMap.put("ODRFG", ""); } - // ERP 연동 필드 - partMap.put("UNIT_DC", unitDc.trim()); - partMap.put("UNITMANG_DC", unitmangDc.trim()); + // 재고단위(UNIT_DC) - 코드명 입력 시 코드값으로 변환 + if(!StringUtils.isBlank(unitDc)){ + if(unitDc.trim().matches("\\d+")){ + partMap.put("UNIT_DC", unitDc.trim()); + } else { + Map unitDcParam = new HashMap(); + unitDcParam.put("CODE_NAME", unitDc.trim()); + Map unitDcResult = sqlSession.selectOne("partMng.getUnitDcCode", unitDcParam); + if(unitDcResult != null && !StringUtils.isBlank((String)unitDcResult.get("code_id"))){ + partMap.put("UNIT_DC", unitDcResult.get("code_id")); + } else { + partMap.put("UNIT_DC", unitDc.trim()); + } + } + } else { + partMap.put("UNIT_DC", ""); + } + // 관리단위(UNITMANG_DC) - 코드명 입력 시 코드값으로 변환 + if(!StringUtils.isBlank(unitmangDc)){ + if(unitmangDc.trim().matches("\\d+")){ + partMap.put("UNITMANG_DC", unitmangDc.trim()); + } else { + Map unitmangParam = new HashMap(); + unitmangParam.put("CODE_NAME", unitmangDc.trim()); + Map unitmangResult = sqlSession.selectOne("partMng.getUnitDcCode", unitmangParam); + if(unitmangResult != null && !StringUtils.isBlank((String)unitmangResult.get("code_id"))){ + partMap.put("UNITMANG_DC", unitmangResult.get("code_id")); + } else { + partMap.put("UNITMANG_DC", unitmangDc.trim()); + } + } + } else { + partMap.put("UNITMANG_DC", ""); + } partMap.put("UNITCHNG_NB", unitchngNb.trim()); // LOT구분 - 한글명 입력 시 코드값으로 변환 (0:미사용, 1:사용) if(!CommonUtils.isBlank(lotFg)){ @@ -4198,7 +4259,7 @@ public class PartMngService extends BaseService { int emptyRowCnt = 0; AtomicInteger emptyColCnt = new AtomicInteger(0); Map partNoUniqueMap = new HashMap(); - + for(int rowIndex= 1 ; rowIndex < rows ; rowIndex++){ // 2번째 행(index 1)부터 시작 (헤더 1줄 건너뜀) Row row = sheet.getRow(rowIndex); if(null != row){ @@ -4390,9 +4451,40 @@ public class PartMngService extends BaseService { partMap.put("ODRFG", ""); } - // ERP 연동 필드 - partMap.put("UNIT_DC", unitDc); - partMap.put("UNITMANG_DC", unitmangDc); + // 재고단위(UNIT_DC) - 코드명 입력 시 코드값으로 변환 + if(!StringUtils.isBlank(unitDc)){ + if(unitDc.trim().matches("\\d+")){ + partMap.put("UNIT_DC", unitDc.trim()); + } else { + Map unitDcParam = new HashMap(); + unitDcParam.put("CODE_NAME", unitDc.trim()); + Map unitDcResult = sqlSession.selectOne("partMng.getUnitDcCode", unitDcParam); + if(unitDcResult != null && !StringUtils.isBlank((String)unitDcResult.get("code_id"))){ + partMap.put("UNIT_DC", unitDcResult.get("code_id")); + } else { + partMap.put("UNIT_DC", unitDc.trim()); + } + } + } else { + partMap.put("UNIT_DC", ""); + } + // 관리단위(UNITMANG_DC) - 코드명 입력 시 코드값으로 변환 + if(!StringUtils.isBlank(unitmangDc)){ + if(unitmangDc.trim().matches("\\d+")){ + partMap.put("UNITMANG_DC", unitmangDc.trim()); + } else { + Map unitmangParam = new HashMap(); + unitmangParam.put("CODE_NAME", unitmangDc.trim()); + Map unitmangResult = sqlSession.selectOne("partMng.getUnitDcCode", unitmangParam); + if(unitmangResult != null && !StringUtils.isBlank((String)unitmangResult.get("code_id"))){ + partMap.put("UNITMANG_DC", unitmangResult.get("code_id")); + } else { + partMap.put("UNITMANG_DC", unitmangDc.trim()); + } + } + } else { + partMap.put("UNITMANG_DC", ""); + } partMap.put("UNITCHNG_NB", unitchngNb); // LOT구분 - 한글명 입력 시 코드값으로 변환 @@ -5789,4 +5881,5 @@ public class PartMngService extends BaseService { } } } + } diff --git a/src/com/pms/service/ProjectService.java b/src/com/pms/service/ProjectService.java index a5170ac..47e5432 100644 --- a/src/com/pms/service/ProjectService.java +++ b/src/com/pms/service/ProjectService.java @@ -2786,7 +2786,7 @@ public class ProjectService { String path = CommonUtils.checkNull(fileMap.get("FILE_PATH")); String fileName = CommonUtils.checkNull(fileMap.get("SAVED_FILE_NAME")); - int lastColumnIndex = 2; + int lastColumnIndex = 4; FileInputStream fis = new FileInputStream(path + File.separator + fileName); XSSFWorkbook workBook = new XSSFWorkbook(fis); @@ -2803,13 +2803,12 @@ public class ProjectService { wbsMap.put("WBS_OBJID", CommonUtils.createObjId()); - String deptCode = ""; + String[] levelValues = new String[3]; + String taskName = ""; for(int columnIndex = 0 ; columnIndex < lastColumnIndex ; columnIndex++){ XSSFCell cell = row.getCell(columnIndex); - System.out.println("cell :: " + cell); - //데이버 유형별 get date String cellValue = ""; if(null == cell){ @@ -2818,27 +2817,19 @@ public class ProjectService { switch(cell.getCellType()){ case XSSFCell.CELL_TYPE_FORMULA: cellValue = cell.getCellFormula(); - System.out.println(columnIndex+":"+"XSSFCell.CELL_TYPE_FORMULA:"+cellValue); break; case XSSFCell.CELL_TYPE_NUMERIC: - DataFormatter formatter = new DataFormatter(); - cellValue = formatter.formatCellValue(cell); - System.out.println(columnIndex+":"+"XSSFCell.CELL_TYPE_STRING:"+cellValue); break; - case XSSFCell.CELL_TYPE_STRING: cellValue = cell.getStringCellValue()+""; - System.out.println(columnIndex+":"+"XSSFCell.CELL_TYPE_STRING:"+cellValue); break; case XSSFCell.CELL_TYPE_BLANK: - cellValue = cell.getBooleanCellValue()+""; - System.out.println(columnIndex+":"+"XSSFCell.CELL_TYPE_BLANK:"+cellValue); + cellValue = ""; break; case XSSFCell.CELL_TYPE_ERROR: cellValue = cell.getErrorCellValue()+""; - System.out.println(columnIndex+":"+"XSSFCell.CELL_TYPE_ERROR:"+cellValue); break; } } @@ -2849,56 +2840,29 @@ public class ProjectService { cellValue = CommonUtils.checkNull(cellValue); - //기본정보 시작=========================== - -/* //단계 - if(0 == columnIndex){ - wbsMap.put("STEP", cellValue); + if(columnIndex <= 2){ + levelValues[columnIndex] = cellValue; } - - //TASK명 - if(1 == columnIndex){ - wbsMap.put("TASK1", cellValue); - }*/ - - //공정명 - if(0 == columnIndex){ - wbsMap.put("TASK_NAME", cellValue); + if(columnIndex == 3){ + taskName = cellValue; } - //공정명 - if(1 == columnIndex){ - wbsMap.put("UNIT_NO", cellValue); - - resultList.add(wbsMap); - - System.out.println("wbsMap:"+wbsMap); - - break; - - } - - //담당자 - /*if(1 == columnIndex){ - wbsMap.put("USER_NAME", cellValue); - - if(!"".equals(cellValue)){ - - Map resultMap = new HashMap(); - Map codeParamMap = new HashMap(); - codeParamMap.put("USER_NAME", cellValue); - resultMap = commonService.getUserMap(codeParamMap); - - if(null != resultMap){ - wbsMap.put("USER_ID", CommonUtils.checkNull(resultMap.get("USER_ID"))); - wbsMap.put("USER_NAME", CommonUtils.checkNull(resultMap.get("USER_NAME"))); - } - } - resultList.add(wbsMap); - - System.out.println("wbsMap:"+wbsMap); - - break; - }*/ + } + + // 수준1/2/3 중 값이 있는 컬럼에서 UNIT_NO 결정 + String unitNo = ""; + if(!"".equals(CommonUtils.checkNull(levelValues[2]))){ + unitNo = levelValues[2]; + } else if(!"".equals(CommonUtils.checkNull(levelValues[1]))){ + unitNo = levelValues[1]; + } else if(!"".equals(CommonUtils.checkNull(levelValues[0]))){ + unitNo = levelValues[0]; + } + + if(!"".equals(unitNo) && !"".equals(taskName)){ + wbsMap.put("UNIT_NO", unitNo); + wbsMap.put("TASK_NAME", taskName); + resultList.add(wbsMap); + System.out.println("wbsMap:"+wbsMap); } } } diff --git a/src/com/pms/service/PurchaseOrderService.java b/src/com/pms/service/PurchaseOrderService.java index c676741..94a3fef 100644 --- a/src/com/pms/service/PurchaseOrderService.java +++ b/src/com/pms/service/PurchaseOrderService.java @@ -318,7 +318,7 @@ public class PurchaseOrderService { sqlSession.update("purchaseOrder.mergePurchaseOrderMaster", paramMap); - sqlSession.update("purchaseOrder.initPurchaseOrderPart", paramMap); + //sqlSession.update("purchaseOrder.initPurchaseOrderPart", paramMap); // POP OBJID 보존을 위해 전체삭제 제거 String partObjList[] = request.getParameterValues("OBJID"); @@ -340,7 +340,6 @@ public class PurchaseOrderService { } } - sqlSession.commit(); resultMap.put("result", true); @@ -1520,7 +1519,7 @@ public class PurchaseOrderService { List> gridDataList = JsonUtil.JsonToList(CommonUtils.checkNull(paramMap.get("jqGrid"))); //sqlSession = SqlMapConfig.getInstance().getSqlSession(false); paramMap.put("PURCHASE_ORDER_MASTER_OBJID", MASTER_OBJID); - cnt = sqlSession.delete("purchaseOrder.initPurchaseOrderPart", paramMap); + //cnt = sqlSession.delete("purchaseOrder.initPurchaseOrderPart", paramMap); // POP OBJID 보존을 위해 전체삭제 제거 //파트 등록 int [] ARR_STOCK_QTY = new int[gridDataList.size()]; //실발주수량 @@ -1553,7 +1552,7 @@ public class PurchaseOrderService { //System.out.println("innerTextString:"+innerTextString); } - insertMap.put("OBJID", CommonUtils.createObjId()); + //insertMap.put("OBJID", CommonUtils.createObjId()); // POP OBJID 보존을 위해 신규 OBJID 생성 제거 (기존 OBJID로 UPSERT) insertMap.put("PURCHASE_ORDER_MASTER_OBJID", MASTER_OBJID); sqlSession.insert("purchaseOrder.mergePurchaseOrderPartInfo", insertMap); //구매봄 단가 수정 @@ -1680,7 +1679,16 @@ public class PurchaseOrderService { cnt = sqlSession.update("purchaseOrder.mergePurchaseOrderMaster", paramMap); //cnt = sqlSession.update("purchaseOrder.mergePurchaseOrderMulti", paramMap); - cnt = sqlSession.delete("purchaseOrder.initPurchaseOrderPart", paramMap); //발주서 파트 삭제 + //cnt = sqlSession.delete("purchaseOrder.initPurchaseOrderPart", paramMap); // POP OBJID 보존을 위해 전체삭제 제거 + + // 기존 자식 POP 목록 조회 (PART_OBJID → POP.OBJID 매핑) + Map existingPopParam = new HashMap(); + existingPopParam.put("PURCHASE_ORDER_MASTER_OBJID", APPLICATION_OBJID); + List existingChildPops = sqlSession.selectList("purchaseOrder.getPURCHASE_ORDER_PART", existingPopParam); + Map partToPopObjid = new HashMap(); + for(Map pop : existingChildPops) { + partToPopObjid.put(CommonUtils.checkNull((String)pop.get("part_objid")), CommonUtils.checkNull((String)pop.get("objid"))); + } boolean changeOrderQty = false; String partObjid = ""; @@ -1689,9 +1697,6 @@ public class PurchaseOrderService { insertMap.clear(); insertMap.putAll(orgMap); - //insertMap.put("OBJID", newMASTER_OBJID); - partObjid = CommonUtils.createObjId(); - insertMap.put("OBJID", partObjid); insertMap.put("PURCHASE_ORDER_MASTER_OBJID", APPLICATION_OBJID); System.out.println("insertMap:"+insertMap); String partNo = CommonUtils.checkNull((String)insertMap.get("PART_NO")); @@ -1743,9 +1748,19 @@ public class PurchaseOrderService { throw new Exception(APPLICATION_PROJECT_NUMBER + " (" + partName + ") 동시발주건 구매BOM part가 존재하지 않습니다.(품번:"+partNo+")"); }else { //해당 프로젝트의 파트정보로 변경 - insertMap.put("PART_OBJID", resultList2.get(0).get("objid_part")); + String childPartObjid = (String)resultList2.get(0).get("objid_part"); + insertMap.put("PART_OBJID", childPartObjid); insertMap.put("PART_NAME", resultList2.get(0).get("part_name")); insertMap.put("PART_NO", resultList2.get(0).get("part_no")); + + // 기존 POP OBJID 보존: PART_OBJID로 매칭, 없으면 신규 생성 + String existingPopObjid = partToPopObjid.get(childPartObjid); + if(existingPopObjid != null && !"".equals(existingPopObjid)) { + insertMap.put("OBJID", existingPopObjid); + } else { + insertMap.put("OBJID", CommonUtils.createObjId()); + } + sqlSession.insert("purchaseOrder.mergePurchaseOrderPartInfo", insertMap); }