From 30b5f76010a647c4381926fc40acf72195951b8c Mon Sep 17 00:00:00 2001 From: hjjeong Date: Tue, 10 Mar 2026 19:03:42 +0900 Subject: [PATCH 1/5] =?UTF-8?q?[=ED=96=89=EC=9C=84]=20Amaranth=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=EC=9E=90=20=EB=8F=99=EA=B8=B0=ED=99=94=20=EC=8B=9C=20?= =?UTF-8?q?=EC=9D=B4=EB=A9=94=EC=9D=BC=20=EC=A3=BC=EC=86=8C=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20=EC=A0=80=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - parseAmaranthUserObject에서 emailAddr + emailDomain 조합으로 전체 이메일 생성 - updateLoginId 배치(자동/수동) 실행 시 user_info.email 컬럼에 이메일 업데이트 - batch.xml updateLoginId 쿼리에 email 컬럼 SET 추가 Made-with: Cursor --- src/com/pms/mapper/batch.xml | 1 + src/com/pms/service/BatchService.java | 21 +++++++++++++++++---- 2 files changed, 18 insertions(+), 4 deletions(-) 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/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; From c856a9b4ad3de251ed976a1c813b23be6571bafd Mon Sep 17 00:00:00 2001 From: hjjeong Date: Wed, 11 Mar 2026 10:49:03 +0900 Subject: [PATCH 2/5] =?UTF-8?q?=ED=8C=8C=ED=8A=B8=20=EC=9E=AC=EA=B3=A0?= =?UTF-8?q?=EB=8B=A8=EC=9C=84,=20=EA=B4=80=EB=A6=AC=EB=8B=A8=EC=9C=84=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../view/partMng/openPartExcelImportPopUp.jsp | 20 +++- .../view/partMng/partMngDetailPopUp.jsp | 14 ++- .../WEB-INF/view/partMng/partMngFormPopUp.jsp | 37 +++++- .../WEB-INF/view/partMng/partMngList.jsp | 4 +- .../WEB-INF/view/partMng/partMngTempList.jsp | 4 +- src/com/pms/controller/PartMngController.java | 17 ++- src/com/pms/mapper/partMng.xml | 15 ++- src/com/pms/service/PartMngService.java | 113 ++++++++++++++++-- 8 files changed, 196 insertions(+), 28 deletions(-) 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/src/com/pms/controller/PartMngController.java b/src/com/pms/controller/PartMngController.java index fa47ebd..38557e0 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")); 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/controller/PartMngController.java b/src/com/pms/controller/PartMngController.java index 38557e0..44ecad9 100644 --- a/src/com/pms/controller/PartMngController.java +++ b/src/com/pms/controller/PartMngController.java @@ -1975,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 관련 로직은 사용하지 않음 From 53dcb5b1339bc6ede948a2442d4a94320c1bf591 Mon Sep 17 00:00:00 2001 From: hjjeong Date: Wed, 11 Mar 2026 15:41:46 +0900 Subject: [PATCH 4/5] =?UTF-8?q?=ED=94=84=EB=A1=9C=EC=A0=9D=ED=8A=B8?= =?UTF-8?q?=EB=B3=84=20=EB=B0=9C=EC=A3=BC/=EC=9E=85=EA=B3=A0=20=ED=98=84?= =?UTF-8?q?=ED=99=A9=20=EB=A9=94=EB=89=B4=20=EC=8B=A0=EA=B7=9C=EA=B0=9C?= =?UTF-8?q?=EB=B0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../projectPurchaseDeliveryStatus.jsp | 218 +++++++++++++++++ .../controller/PurchaseOrderController.java | 27 +++ src/com/pms/mapper/purchaseOrder.xml | 227 +++++++++++++++++- src/com/pms/service/PurchaseOrderService.java | 33 ++- 4 files changed, 488 insertions(+), 17 deletions(-) create mode 100644 WebContent/WEB-INF/view/purchaseOrder/projectPurchaseDeliveryStatus.jsp 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/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/purchaseOrder.xml b/src/com/pms/mapper/purchaseOrder.xml index 6abceba..47e1124 100644 --- a/src/com/pms/mapper/purchaseOrder.xml +++ b/src/com/pms/mapper/purchaseOrder.xml @@ -2032,6 +2032,33 @@ DELETE FROM PURCHASE_ORDER_PART WHERE PURCHASE_ORDER_MASTER_OBJID = #{PURCHASE_ORDER_MASTER_OBJID} + + + + DELETE FROM PURCHASE_ORDER_PART + WHERE PURCHASE_ORDER_MASTER_OBJID = #{PURCHASE_ORDER_MASTER_OBJID} + + AND 0 = POSITION(OBJID::TEXT || ',' IN #{savedObjIds} || ',') + + + + + + UPDATE ARRIVAL_PLAN + SET ORDER_PART_OBJID = ( + SELECT POP.OBJID::VARCHAR + FROM PURCHASE_ORDER_PART POP + WHERE POP.PURCHASE_ORDER_MASTER_OBJID = #{PURCHASE_ORDER_MASTER_OBJID} + AND POP.PART_OBJID = ARRIVAL_PLAN.PART_OBJID + LIMIT 1 + ) + WHERE PARENT_OBJID::VARCHAR = #{PURCHASE_ORDER_MASTER_OBJID} + AND EXISTS ( + SELECT 1 FROM PURCHASE_ORDER_PART POP2 + WHERE POP2.PURCHASE_ORDER_MASTER_OBJID = #{PURCHASE_ORDER_MASTER_OBJID} + AND POP2.PART_OBJID = ARRIVAL_PLAN.PART_OBJID + ) + DELETE FROM PURCHASE_ORDER_PART @@ -4429,13 +4456,15 @@ SELECT POM.OBJID ,SUM(COALESCE(POP.PARTNER_PRICE::NUMERIC, 0) * (COALESCE(POP.ORDER_QTY::NUMERIC, 0) - COALESCE(AP_AGG.SUM_RECEIPT_QTY, 0))) AS TOTAL_NOT_DELIVERY_PRICE FROM PURCHASE_ORDER_PART POP LEFT OUTER JOIN ( - -- ARRIVAL_PLAN을 ORDER_PART_OBJID별로 먼저 집계 - SELECT ORDER_PART_OBJID + -- ARRIVAL_PLAN을 PARENT_OBJID(POM) + PART_OBJID 기준 집계 (POP 삭제/재생성 대응) + SELECT PARENT_OBJID + ,PART_OBJID ,SUM(RECEIPT_QTY::NUMERIC) AS SUM_RECEIPT_QTY ,MAX(RECEIPT_DATE) AS MAX_RECEIPT_DATE FROM ARRIVAL_PLAN - GROUP BY ORDER_PART_OBJID - ) AP_AGG ON POP.OBJID = AP_AGG.ORDER_PART_OBJID + GROUP BY PARENT_OBJID, PART_OBJID + ) AP_AGG ON AP_AGG.PARENT_OBJID::VARCHAR = POP.PURCHASE_ORDER_MASTER_OBJID + AND AP_AGG.PART_OBJID = POP.PART_OBJID GROUP BY POP.PURCHASE_ORDER_MASTER_OBJID ) AS S1 ON POM.OBJID::VARCHAR = S1.PURCHASE_ORDER_MASTER_OBJID LEFT OUTER JOIN PROJECT_MGMT AS CM @@ -6315,13 +6344,15 @@ FROM( INNER JOIN PURCHASE_ORDER_MASTER POM ON POM.OBJID::VARCHAR = POP.PURCHASE_ORDER_MASTER_OBJID LEFT OUTER JOIN PROJECT_MGMT CM ON POM.CONTRACT_MGMT_OBJID = CM.OBJID - + LEFT OUTER JOIN ( - SELECT ORDER_PART_OBJID + SELECT PARENT_OBJID + ,PART_OBJID ,SUM(COALESCE(RECEIPT_QTY::NUMERIC, 0)) AS DELIVERY_QTY FROM ARRIVAL_PLAN - GROUP BY ORDER_PART_OBJID - ) AP_AGG ON POP.OBJID = AP_AGG.ORDER_PART_OBJID + GROUP BY PARENT_OBJID, PART_OBJID + ) AP_AGG ON POM.OBJID = AP_AGG.PARENT_OBJID + AND POP.PART_OBJID = AP_AGG.PART_OBJID LEFT OUTER JOIN ( @@ -6634,4 +6665,184 @@ FROM( ORDER BY AP.RECEIPT_DATE DESC, POM.PURCHASE_ORDER_NO, POP.PART_NO + + + \ No newline at end of file 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); } From ad7e72c12910e90d3d23730e6ebf984aba735197 Mon Sep 17 00:00:00 2001 From: hjjeong Date: Wed, 11 Mar 2026 16:44:12 +0900 Subject: [PATCH 5/5] =?UTF-8?q?WBS=20=ED=85=9C=ED=94=8C=EB=A6=BF=20(?= =?UTF-8?q?=EC=A0=9C=ED=92=88=EA=B4=80=EB=A6=AC=5Funit=EA=B4=80=EB=A6=AC)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../view/project/WBSExcelImportPopUp.jsp | 130 +++++++++++++++++- .../template/WBS_EXCEL_IMPORT_TEMPLATE.xlsx | Bin 8685 -> 9303 bytes src/com/pms/service/ProjectService.java | 86 ++++-------- 3 files changed, 148 insertions(+), 68 deletions(-) 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/template/WBS_EXCEL_IMPORT_TEMPLATE.xlsx b/WebContent/template/WBS_EXCEL_IMPORT_TEMPLATE.xlsx index 952250ef83817961040a6df6cce3bf6ec1d53ad5..db0e131f179321ee9444b698a8a7fef0d29fe540 100644 GIT binary patch delta 5956 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 F{{Urf`Ii6y delta 5324 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 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); } } }