diff --git a/WebContent/WEB-INF/view/purchaseOrder/deliveryMngAcceptanceList.jsp b/WebContent/WEB-INF/view/purchaseOrder/deliveryMngAcceptanceList.jsp index f7a1eb3..92c7133 100644 --- a/WebContent/WEB-INF/view/purchaseOrder/deliveryMngAcceptanceList.jsp +++ b/WebContent/WEB-INF/view/purchaseOrder/deliveryMngAcceptanceList.jsp @@ -73,12 +73,20 @@ $(document).ready(function(){ //fnc_productUPGNEWList(this.value,"","upg_no", ""); fn_UnitCodeList(this.value, "unit_code", ""); }); + + // 매입마감 버튼 클릭 + $("#btnClose").click(function(){ + fn_purchaseClose(); + }); + fn_search(); }); var columns = [ // 요구사항: 품의서 No, 발주서 No, 프로젝트번호, 품번, 품명, 공급업체, 발주수량, 입고수량, 미입고수량, 검사성적서, 입고결과 + {title:'TOTAL_SUPPLY_PRICE' ,field:'TOTAL_SUPPLY_PRICE' ,visible:false, frozen:true}, + {title:'TOTAL_DELIVERY_PRICE' ,field:'TOTAL_DELIVERY_PRICE' ,visible:false, frozen:true}, {headerHozAlign : 'center', hozAlign : 'center', minWidth : 130, widthGrow : 1, title : '품의서 No', field : 'PROPOSAL_NO', formatter: fnc_createGridAnchorTag, cellClick : function(e, cell) { @@ -120,7 +128,8 @@ var columns = [ var purchaseOrderNo = fnc_checkNull(cell.getData().PURCHASE_ORDER_NO); fn_deliveryAcceptanceViewPopUp(objId,DELIVERY_STATUS); } - } + }, + {headerHozAlign : 'center', hozAlign : 'center', minWidth : 140, widthGrow : 1, title : '매입마감', field : 'PURCHASE_CLOSE_DATE'} ]; //var grid; @@ -140,7 +149,56 @@ function fn_search(){ value: selectedIdValues }).appendTo('#form1'); + // 그리드 조회 _tabulGrid = fnc_tabul_search(_tabul_layout_fitColumns, _tabulGrid, "/purchaseOrder/deliveryMngAcceptanceGridList.do", columns, true); + + // 데이터 렌더링 완료 후 합계 계산 및 높이 조절 + if(_tabulGrid) { + _tabulGrid.off("renderComplete"); + _tabulGrid.on("renderComplete", function(){ + fn_calculateTotalAmount(); + // 그리드 렌더링 완료 후 높이 계산 + fnc_calculateContentHeight("gridDiv", 30); + }); + } + + // 윈도우 리사이즈 이벤트 (한 번만 등록) + $(window).off("resize.gridHeight").on("resize.gridHeight", function() { + fnc_calculateContentHeight("gridDiv", 30); + }); +} + +// 발주금액 합계 계산 (그리드 데이터 기반) +function fn_calculateTotalAmount(){ + if(!_tabulGrid) { + $("#totalOrderAmount").text("0"); + $("#deliveredAmount").text("0"); + $("#notDeliveredAmount").text("0"); + return; + } + + // 현재 그리드에 표시된 데이터 가져오기 + var data = _tabulGrid.getData(); + var totalOrderAmount = 0; // 총 발주금액 + var totalDeliveredAmount = 0; // 입고금액 + var totalNotDeliveredAmount = 0; // 미입고금액 + + if(data.length > 0) { + data.forEach(function(row) { + var rowTotalPrice = parseFloat(row.TOTAL_SUPPLY_PRICE || 0); + var rowDeliveredPrice = parseFloat(row.TOTAL_DELIVERY_PRICE || 0); + var rowNotDeliveredPrice = rowTotalPrice - rowDeliveredPrice; + + totalOrderAmount += rowTotalPrice; + totalDeliveredAmount += rowDeliveredPrice; + totalNotDeliveredAmount += rowNotDeliveredPrice; + }); + } + + // 합계 표시 + $("#totalOrderAmount").text(Number(Math.round(totalOrderAmount)).toLocaleString()); + $("#deliveredAmount").text(Number(Math.round(totalDeliveredAmount)).toLocaleString()); + $("#notDeliveredAmount").text(Number(Math.round(totalNotDeliveredAmount)).toLocaleString()); } //수입검사등록 @@ -303,8 +361,69 @@ function fn_FileRegist(objId, docType, docTypeName){ fn_centerPopup(popup_width, popup_height, url); } +// 매입마감 처리 +function fn_purchaseClose(){ + var selected = _tabulGrid.getSelectedData(); + if(selected.length == 0){ + Swal.fire("선택된 데이터가 없습니다."); + return; + } + + // 이미 마감된 건 체크 + var alreadyClosed = selected.filter(function(item){ + return fnc_checkNull(item.PURCHASE_CLOSE_DATE) != ''; + }); + if(alreadyClosed.length > 0){ + Swal.fire("이미 매입마감 처리된 건이 포함되어 있습니다."); + return; + } + + // 입고완료 건만 마감 가능 + var notCompleted = selected.filter(function(item){ + return item.DELIVERY_STATUS != '입고완료'; + }); + if(notCompleted.length > 0){ + Swal.fire("입고완료 건만 매입마감 처리가 가능합니다."); + return; + } + + Swal.fire({ + title: '매입마감', + text: '선택한 ' + selected.length + '건을 매입마감 처리하시겠습니까?', + icon: 'question', + showCancelButton: true, + confirmButtonText: '확인', + cancelButtonText: '취소' + }).then((result) => { + if(result.isConfirmed){ + var objIds = selected.map(function(item){ + return item.OBJID; + }).join(','); + + $.ajax({ + url: '/purchaseOrder/purchaseClose.do', + type: 'POST', + data: { objIds: objIds }, + dataType: 'json', + success: function(response){ + if(response.result == 'SUCCESS'){ + Swal.fire('매입마감 처리가 완료되었습니다.').then(function(){ + fn_search(); + }); + } else { + Swal.fire('매입마감 처리 중 오류가 발생했습니다.'); + } + }, + error: function(){ + Swal.fire('서버 통신 중 오류가 발생했습니다.'); + } + }); + } + }); +} + - +
@@ -324,6 +443,7 @@ function fn_FileRegist(objId, docType, docTypeName){
+ <%-- --%>
@@ -398,6 +518,15 @@ function fn_FileRegist(objId, docType, docTypeName){ + +
+ + 발주 금액: 0 원 + (입고: 0 원, + 미입고: 0 원) + +
+ <%@include file= "/WEB-INF/view/common/common_gridArea.jsp" %> diff --git a/WebContent/WEB-INF/view/quality/incomingInspectionList.jsp b/WebContent/WEB-INF/view/quality/incomingInspectionList.jsp index a37be9b..0088b76 100644 --- a/WebContent/WEB-INF/view/quality/incomingInspectionList.jsp +++ b/WebContent/WEB-INF/view/quality/incomingInspectionList.jsp @@ -8,7 +8,7 @@ <% String menuObjId = request.getParameter("menuObjId"); -String menuName = CommonUtils.getMenuName(menuObjId, "수입검사 관리"); +String menuName = CommonUtils.getMenuName(menuObjId, "수입검사 요청"); %> @@ -71,50 +71,47 @@ $(document).ready(function(){ fn_search(); }); - // 수입검사 등록 - $("#btnRegist").click(function(){ - fn_registPopUp(); + // 수입검사 요청 + $("#btnRequest").click(function(){ + fn_requestPopUp(); }); fn_search(); }); -// 컬럼: 품의서 No, 발주서 No, 프로젝트번호, 품번, 품명, 공급업체, 입고결과, 검사자, 검사일, 검사결과 +// 컬럼: 품의서 No, 발주서 No, 프로젝트번호, 품번, 품명, 공급업체, 입고결과, 요청일, 요청자 var columns = [ - {headerHozAlign:'center', hozAlign:'center', minWidth:120, widthGrow:1, title:'품의서 No', field:'PROPOSAL_NO', - formatter:fnc_createGridAnchorTag, - cellClick:function(e, cell){ - var objId = fnc_checkNull(cell.getData().PROPOSAL_OBJID); - if(objId != '') fn_openProposalPopUp(objId); - } + {headerHozAlign:'center', hozAlign:'center', minWidth:120, widthGrow:1, title:'품의서 No', field:'PROPOSAL_NO' + // formatter:fnc_createGridAnchorTag, + // cellClick:function(e, cell){ + // var objId = fnc_checkNull(cell.getData().PROPOSAL_OBJID); + // if(objId != '') fn_openProposalPopUp(objId); + // } }, - {headerHozAlign:'center', hozAlign:'center', minWidth:120, widthGrow:1, title:'발주서 No', field:'PURCHASE_ORDER_NO', - formatter:fnc_createGridAnchorTag, - cellClick:function(e, cell){ - var objId = fnc_checkNull(cell.getData().OBJID); - fn_formPopUp(objId); - } + {headerHozAlign:'center', hozAlign:'center', minWidth:120, widthGrow:1, title:'발주서 No', field:'PURCHASE_ORDER_NO' + // formatter:fnc_createGridAnchorTag, + // cellClick:function(e, cell){ + // var objId = fnc_checkNull(cell.getData().OBJID); + // fn_formPopUp(objId); + // } }, {headerHozAlign:'center', hozAlign:'center', minWidth:130, widthGrow:1, title:'프로젝트번호', field:'PROJECT_NO'}, + {headerHozAlign:'center', hozAlign:'center', minWidth:110, widthGrow:1, title:'제품구분', field:'PRODUCT_NAME'}, {headerHozAlign:'center', hozAlign:'left', minWidth:120, widthGrow:2, title:'품번', field:'PART_NO'}, {headerHozAlign:'center', hozAlign:'left', minWidth:150, widthGrow:3, title:'품명', field:'PART_NAME'}, {headerHozAlign:'center', hozAlign:'left', minWidth:130, widthGrow:2, title:'공급업체', field:'PARTNER_NAME'}, - {headerHozAlign:'center', hozAlign:'center', minWidth:80, widthGrow:1, title:'입고결과', field:'DELIVERY_STATUS'}, - {headerHozAlign:'center', hozAlign:'center', minWidth:80, widthGrow:1, title:'검사자', field:'INSPECTOR_NAME'}, - {headerHozAlign:'center', hozAlign:'center', minWidth:100, widthGrow:1, title:'검사일', field:'INSPECTION_DATE'}, - {headerHozAlign:'center', hozAlign:'center', minWidth:80, widthGrow:1, title:'검사결과', field:'INSPECTION_RESULT', - formatter: function(cell, formatterParams, onRendered){ - var val = fnc_checkNull(cell.getValue()); - if(val === 'NG') return 'NG'; - if(val === 'OK') return 'OK'; - return val; - }, - cellClick:function(e, cell){ - var objId = fnc_checkNull(cell.getData().OBJID); - var result = fnc_checkNull(cell.getData().INSPECTION_RESULT); - if(result != '') fn_resultPopUp(objId); - } - } + {headerHozAlign:'center', hozAlign:'center', minWidth:80, widthGrow:1, title:'입고결과', field:'DELIVERY_STATUS', + formatter:fnc_createGridAnchorTag, + cellClick:function(e, cell){ + var objId = fnc_checkNull(cell.getData().OBJID); + var DELIVERY_STATUS = fnc_checkNull(cell.getData().DELIVERY_STATUS); + fn_deliveryAcceptanceViewPopUp(objId,DELIVERY_STATUS); + } + }, + {headerHozAlign:'center', hozAlign:'center', minWidth:100, widthGrow:1, title:'요청일', field:'REQUEST_DATE'}, + {headerHozAlign:'center', hozAlign:'center', minWidth:80, widthGrow:1, title:'요청자', field:'REQUEST_USER_NAME'}, + {headerHozAlign:'center', hozAlign:'center', minWidth:100, widthGrow:1, title:'검사여부', field:'INSPECTION_YN'}, + {headerHozAlign:'center', hozAlign:'center', minWidth:80, widthGrow:1, title:'요청현황', field:'REQUEST_STATUS'} ]; // 조회 @@ -131,8 +128,8 @@ function fn_search(){ _tabulGrid = fnc_tabul_search(_tabul_layout_fitColumns, _tabulGrid, "/quality/incomingInspectionGridList.do", columns, true); } -// 수입검사 등록 팝업 -function fn_registPopUp(){ +// 수입검사 요청 팝업 +function fn_requestPopUp(){ var selected = _tabulGrid.getSelectedData(); if(selected.length == 0){ Swal.fire("선택된 데이터가 없습니다."); @@ -143,11 +140,11 @@ function fn_registPopUp(){ return; } - var popup_width = 1700; - var popup_height = 700; + var popup_width = 1200; + var popup_height = 600; var hiddenForm = document.hiddenForm; - var target = "incomingInspectionPopUp"; - var url = "/quality/incomingInspectionFormPopUp.do"; + var target = "incomingInspectionRequestPopUp"; + var url = "/quality/incomingInspectionRequestPopUp.do"; fn_centerPopup(popup_width, popup_height, "", target); @@ -158,23 +155,6 @@ function fn_registPopUp(){ hiddenForm.submit(); } -// 검사결과 확인/수정 팝업 -function fn_resultPopUp(objId){ - var popup_width = 1700; - var popup_height = 700; - var hiddenForm = document.hiddenForm; - var target = "inspectionResultPopUp"; - var url = "/quality/incomingInspectionFormPopUp.do"; - - fn_centerPopup(popup_width, popup_height, "", target); - - hiddenForm.action = url; - hiddenForm.OBJID.value = objId; - hiddenForm.actionType.value = 'view'; - hiddenForm.target = target; - hiddenForm.submit(); -} - // 품의서 팝업 function fn_openProposalPopUp(objId){ var popup_width = 1200; @@ -199,6 +179,23 @@ function fn_formPopUp(objId){ hiddenForm.submit(); } +// 입고결과 조회 팝업 (view 전용) +function fn_deliveryAcceptanceViewPopUp(objId,DELIVERY_STATUS){ + var popup_width = 1560; + var popup_height = 1050; + + var hiddenForm = document.hiddenForm; + var target = "deliveryAcceptancePopUp"; + var url = "/purchaseOrder/deliveryAcceptanceFormPopUp_new.do"; + fn_centerPopup(popup_width, popup_height, "", target); + + hiddenForm.action = url; + hiddenForm.PURCHASE_ORDER_MASTER_OBJID.value = objId; + hiddenForm.DELIVERY_STATUS.value = DELIVERY_STATUS; + hiddenForm.actionType.value = 'view'; // 뷰 전용으로 설정 + hiddenForm.target = target; + hiddenForm.submit(); +} @@ -206,6 +203,7 @@ function fn_formPopUp(objId){ +
@@ -217,7 +215,7 @@ function fn_formPopUp(objId){ <%=menuName%>
- +
@@ -259,22 +257,13 @@ function fn_formPopUp(objId){ - - + + - + - ~ - - - - - - + ~ + diff --git a/WebContent/WEB-INF/view/quality/incomingInspectionProgressList.jsp b/WebContent/WEB-INF/view/quality/incomingInspectionProgressList.jsp new file mode 100644 index 0000000..d1240fb --- /dev/null +++ b/WebContent/WEB-INF/view/quality/incomingInspectionProgressList.jsp @@ -0,0 +1,348 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@ page import="com.pms.common.utils.*"%> +<%@ page import="java.util.*" %> +<%@include file= "/init.jsp" %> + + +<% +String menuObjId = request.getParameter("menuObjId"); +String menuName = CommonUtils.getMenuName(menuObjId, "수입검사 진행"); +%> + + + + + <%=Constants.SYSTEM_NAME%> + + + + + + + +
+ + + + + +
+ +
+
+
+
+

+ <%=menuName%> +

+
+ + + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + ~ + + + +
+
+ + <%@include file= "/WEB-INF/view/common/common_gridArea.jsp" %> +
+
+
+ + diff --git a/WebContent/WEB-INF/view/quality/incomingInspectionProgressPopUp.jsp b/WebContent/WEB-INF/view/quality/incomingInspectionProgressPopUp.jsp new file mode 100644 index 0000000..a825251 --- /dev/null +++ b/WebContent/WEB-INF/view/quality/incomingInspectionProgressPopUp.jsp @@ -0,0 +1,844 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> +<%@ page import="com.pms.common.utils.*"%> +<%@ page import="java.util.*" %> +<%@include file= "/init.jsp" %> +<% +PersonBean person = (PersonBean) session.getAttribute(Constants.PERSON_BEAN); +String connector = person.getUserId(); +%> + + + + + + + <%=Constants.SYSTEM_NAME%> + + + + + + + +
+ + + + +
+

수입검사 진행

+
+ + +
+
+ + + + +
+ +
+
+ 입고품목 +
+
+
+
+
+ + +
+
+ 불량상세 +
+ + +
+
+
+
+
+
+
+ + <%@include file= "/WEB-INF/view/common/common_gridArea.jsp" %> +
+ + diff --git a/WebContent/WEB-INF/view/quality/incomingInspectionRequestPopUp.jsp b/WebContent/WEB-INF/view/quality/incomingInspectionRequestPopUp.jsp new file mode 100644 index 0000000..c780acd --- /dev/null +++ b/WebContent/WEB-INF/view/quality/incomingInspectionRequestPopUp.jsp @@ -0,0 +1,265 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> +<%@ page import="com.pms.common.utils.*"%> +<%@ page import="java.util.*" %> +<%@include file= "/init.jsp" %> +<% +PersonBean person = (PersonBean) session.getAttribute(Constants.PERSON_BEAN); +String connector = person.getUserId(); +String connectorName = person.getUserName(); +%> + + + + + + + <%=Constants.SYSTEM_NAME%> + + + + + + + +
+ + +
+

수입검사 요청

+
+ + + + +
+
+ + <%@include file= "/WEB-INF/view/common/common_gridArea.jsp" %> +
+ + diff --git a/src/com/pms/controller/PurchaseOrderController.java b/src/com/pms/controller/PurchaseOrderController.java index b8801be..2824457 100644 --- a/src/com/pms/controller/PurchaseOrderController.java +++ b/src/com/pms/controller/PurchaseOrderController.java @@ -1324,6 +1324,17 @@ public class PurchaseOrderController { return paramMap; } + /** + * 매입마감 처리 + * PURCHASE_ORDER_MASTER의 PURCHASE_CLOSE_DATE를 현재일자로 업데이트 + */ + @ResponseBody + @RequestMapping("/purchaseOrder/purchaseClose.do") + public Map purchaseClose(HttpSession session, HttpServletRequest request, @RequestParam Map paramMap){ + String objIds = (String) paramMap.get("objIds"); + return purchaseOrderService.updatePurchaseCloseDate(objIds); + } + /** * 입고 관리 */ diff --git a/src/com/pms/controller/QualityController.java b/src/com/pms/controller/QualityController.java index a447ffd..499278b 100644 --- a/src/com/pms/controller/QualityController.java +++ b/src/com/pms/controller/QualityController.java @@ -259,7 +259,7 @@ public class QualityController { // ===================================================== /** - * 수입검사 관리 목록 화면 + * 수입검사 요청 목록 화면 * @param request * @param paramMap * @return @@ -269,6 +269,36 @@ public class QualityController { ArrayList list = new ArrayList(); Map code_map = new HashMap(); + try { + // 프로젝트번호 + code_map.put("project_no", commonService.bizMakeOptionList("", (String)paramMap.get("project_no"), "common.getProjectNameList")); + // 공급업체 (CLIENT_MNG) + code_map.put("partner_objid", commonService.bizMakeOptionList("", (String)paramMap.get("partner_objid"), "common.getClientMngSupplySelect")); + // 요청자 + code_map.put("request_user_id", commonService.bizMakeOptionList("", (String)paramMap.get("request_user_id"), "common.getUserselect")); + + list = commonService.selectListPaging("quality.getIncomingInspectionList", request, paramMap); + } catch(Exception e) { + e.printStackTrace(); + } + + request.setAttribute("code_map", code_map); + request.setAttribute("LIST", JsonUtil.ListToJson(list)); + + return "/quality/incomingInspectionList"; + } + + /** + * 수입검사 진행 목록 화면 + * @param request + * @param paramMap + * @return + */ + @RequestMapping("/quality/incomingInspectionProgressList.do") + public String incomingInspectionProgressList(HttpServletRequest request, @RequestParam Map paramMap){ + ArrayList list = new ArrayList(); + Map code_map = new HashMap(); + try { // 프로젝트번호 code_map.put("project_no", commonService.bizMakeOptionList("", (String)paramMap.get("project_no"), "common.getProjectNameList")); @@ -285,7 +315,7 @@ public class QualityController { request.setAttribute("code_map", code_map); request.setAttribute("LIST", JsonUtil.ListToJson(list)); - return "/quality/incomingInspectionList"; + return "/quality/incomingInspectionProgressList"; } /** @@ -302,7 +332,79 @@ public class QualityController { } /** - * 수입검사 등록 팝업 + * 수입검사 요청 팝업 + * @param request + * @param paramMap + * @return + */ + @RequestMapping("/quality/incomingInspectionRequestPopUp.do") + public String incomingInspectionRequestPopUp(HttpServletRequest request, @RequestParam Map paramMap){ + Map code_map = new HashMap(); + + try { + // 로그인 사용자 정보 + PersonBean person = (PersonBean) request.getSession().getAttribute(Constants.PERSON_BEAN); + String loginUserId = person != null ? person.getUserId() : ""; + + // 기존 요청 정보 조회 (요청자, 요청일 가져오기) + Map info = service.getIncomingInspectionDetailInfo(paramMap); + String savedRequestUserId = ""; + if(info != null && info.get("request_user_id") != null) { + savedRequestUserId = (String) info.get("request_user_id"); + request.setAttribute("info", CommonUtils.toUpperCaseMapKey(info)); + } else { + // 저장된 값 없으면 로그인 사용자로 기본 설정 + savedRequestUserId = loginUserId; + } + + // 요청자 목록 (기존 값 또는 로그인 사용자 selected) + code_map.put("request_user_id", commonService.bizMakeOptionList("", savedRequestUserId, "common.getUserselect")); + } catch(Exception e) { + e.printStackTrace(); + } + + request.setAttribute("code_map", code_map); + return "/quality/incomingInspectionRequestPopUp"; + } + + /** + * 수입검사 진행 팝업 + * @param request + * @param paramMap + * @return + */ + @RequestMapping("/quality/incomingInspectionProgressPopUp.do") + public String incomingInspectionProgressPopUp(HttpServletRequest request, @RequestParam Map paramMap){ + Map code_map = new HashMap(); + + try { + // 로그인 사용자 정보 + PersonBean person = (PersonBean) request.getSession().getAttribute(Constants.PERSON_BEAN); + String loginUserId = person != null ? person.getUserId() : ""; + + // 기존 검사 정보 조회 (검사자, 검사일 가져오기) + Map info = service.getIncomingInspectionDetailInfo(paramMap); + String savedInspectorId = ""; + if(info != null && info.get("inspector_id") != null) { + savedInspectorId = (String) info.get("inspector_id"); + request.setAttribute("info", CommonUtils.toUpperCaseMapKey(info)); + } else { + // 저장된 값 없으면 로그인 사용자로 기본 설정 + savedInspectorId = loginUserId; + } + + // 검사자 목록 (기존 값 또는 로그인 사용자 selected) + code_map.put("inspector_id", commonService.bizMakeOptionList("", savedInspectorId, "common.getUserselect")); + } catch(Exception e) { + e.printStackTrace(); + } + + request.setAttribute("code_map", code_map); + return "/quality/incomingInspectionProgressPopUp"; + } + + /** + * 수입검사 등록 팝업 (기존 - 호환용) * @param request * @param paramMap * @return @@ -321,7 +423,7 @@ public class QualityController { String savedInspectorId = ""; if(info != null && info.get("inspector_id") != null) { savedInspectorId = (String) info.get("inspector_id"); - request.setAttribute("info", info); + request.setAttribute("info", CommonUtils.toUpperCaseMapKey(info)); } else { // 저장된 값 없으면 로그인 사용자로 기본 설정 savedInspectorId = loginUserId; @@ -350,6 +452,32 @@ public class QualityController { return paramMap; } + /** + * 수입검사 진행 상세 그리드 목록 조회 (검사여부='검사'인 항목만) + * @param request + * @param paramMap + * @return + */ + @ResponseBody + @RequestMapping("/quality/incomingInspectionProgressDetailGridList.do") + public Map incomingInspectionProgressDetailGridList(HttpServletRequest request, @RequestParam Map paramMap){ + commonService.selectListPagingNew("quality.getIncomingInspectionProgressDetailList", request, paramMap); + return paramMap; + } + + /** + * 수입검사 요청 저장 + * @param request + * @param paramMap + * @return + */ + @RequestMapping("/quality/saveIncomingInspectionRequest.do") + public String saveIncomingInspectionRequest(HttpServletRequest request, @RequestParam Map paramMap){ + Map map = service.saveIncomingInspectionRequest(request, paramMap); + request.setAttribute("RESULT", CommonUtils.getJsonMap(map)); + return "/ajax/ajaxResult"; + } + /** * 수입검사 저장 * @param request @@ -744,4 +872,36 @@ public class QualityController { return service.saveEcrResult(request, paramMap); } + // ===================================================== + // 수입검사 불량상세 관련 + // ===================================================== + + /** + * 불량상세 목록 조회 + */ + @ResponseBody + @RequestMapping("/quality/getIncomingInspectionDefectList.do") + public Map getIncomingInspectionDefectList(HttpServletRequest request, @RequestParam Map paramMap){ + Map result = new HashMap(); + try { + List list = service.getIncomingInspectionDefectList(paramMap); + result.put("list", list); + result.put("result", true); + } catch(Exception e) { + e.printStackTrace(); + result.put("result", false); + result.put("msg", e.getMessage()); + } + return result; + } + + /** + * 수입검사 진행 저장 (입고품목 + 불량상세) + */ + @ResponseBody + @RequestMapping("/quality/saveIncomingInspectionProgress.do") + public Map saveIncomingInspectionProgress(HttpServletRequest request, @RequestParam Map paramMap){ + return service.saveIncomingInspectionProgress(request, paramMap); + } + } diff --git a/src/com/pms/mapper/purchaseOrder.xml b/src/com/pms/mapper/purchaseOrder.xml index e4fbb29..b0b40d3 100644 --- a/src/com/pms/mapper/purchaseOrder.xml +++ b/src/com/pms/mapper/purchaseOrder.xml @@ -1115,6 +1115,14 @@ WHERE OBJID = (SELECT PURCHASE_ORDER_MASTER_OBJID FROM PURCHASE_ORDER_PART POP WHERE OBJID = #{PURCHASE_ORDER_PART_OBJID }) --> + + + + UPDATE PURCHASE_ORDER_MASTER + SET PURCHASE_CLOSE_DATE = TO_CHAR(NOW(), 'YYYY-MM-DD') + WHERE OBJID = #{OBJID} + + UPDATE PURCHASE_ORDER_MASTER SET TOTAL_PRICE_TXT_ALL = NUM_TO_KOR((T.REAL_SUPPLY_PRICE_VAT)::varchar,'일금 ',' 원정 (₩ ') || TRIM(TO_CHAR((T.REAL_SUPPLY_PRICE_VAT), '999,999,999,999')) ||')' @@ -4273,6 +4281,7 @@ SELECT POM.OBJID ,POM.TOTAL_PRICE ,POM.DISCOUNT_PRICE ,POM.TOTAL_SUPPLY_UNIT_PRICE + ,POM.TOTAL_SUPPLY_PRICE ,POM.NEGO_RATE ,POM.MULTI_MASTER_YN ,POM.MULTI_YN @@ -4282,6 +4291,7 @@ SELECT POM.OBJID ,S1.CUR_DELIVERY_DATE ,S1.TOTAL_DELIVERY_QTY + ,S1.TOTAL_DELIVERY_PRICE ,((SELECT SUM(ORDER_QTY::NUMERIC) FROM PURCHASE_ORDER_PART AS O WHERE POM.OBJID::VARCHAR = O.PURCHASE_ORDER_MASTER_OBJID) - (S1.TOTAL_DELIVERY_QTY )) AS NON_DELIVERY_QTY @@ -4299,6 +4309,7 @@ SELECT POM.OBJID ,(SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = POM.ORDER_TYPE_CD) AS ORDER_TYPE_CD_NAME ,(SELECT user_name(RECEIVER_ID) FROM ARRIVAL_PLAN AP WHERE AP.parent_objid = POM.OBJID ORDER BY AP.RECEIPT_DATE desc LIMIT 1) AS CUR_RECEIVER_NAME ,(SELECT COUNT(1) FROM ATTACH_FILE_INFO AF WHERE AF.TARGET_OBJID = POM.OBJID AND AF.DOC_TYPE = 'INSPECTION_FILE' AND UPPER(AF.STATUS) = 'ACTIVE') AS INSPECTION_FILE_CNT + ,POM.PURCHASE_CLOSE_DATE FROM PURCHASE_ORDER_MASTER AS POM ,(SELECT CASE @@ -702,24 +702,85 @@ ELSE '입고중' END) AS DELIVERY_STATUS - - ,(SELECT U.USER_NAME FROM USER_INFO U WHERE U.USER_ID = IID.INSPECTOR_ID) AS INSPECTOR_NAME - ,IID.INSPECTION_DATE - ,(CASE WHEN IID.NG_COUNT > 0 THEN 'NG' - WHEN IID.TOTAL_COUNT > 0 AND IID.TOTAL_COUNT = IID.INSPECTED_COUNT THEN 'OK' - WHEN IID.INSPECTED_COUNT > 0 THEN '검사중' + + ,(SELECT U.USER_NAME FROM USER_INFO U WHERE U.USER_ID = IID.REQUEST_USER_ID) AS REQUEST_USER_NAME + ,IID.REQUEST_DATE + + + /* 검사자: XXX 외 N건 형태 */ + ,DEFECT.INSPECTOR_NAME_DISPLAY AS INSPECTOR_NAME + /* 검사일: YYYY-MM-DD 외 N건 형태 */ + ,DEFECT.INSPECTION_DATE_DISPLAY AS INSPECTION_DATE + /* 검사결과: 하나라도 NG면 NG, 검사 대상(스킵 제외) 모두 검사완료면 OK, 일부만 검사면 검사중 */ + ,(CASE WHEN DEFECT.NG_COUNT > 0 THEN 'NG' + WHEN DEFECT.INSPECTION_TARGET_COUNT > 0 AND DEFECT.INSPECTION_TARGET_COUNT = DEFECT.INSPECTED_COUNT THEN 'OK' + WHEN DEFECT.INSPECTED_COUNT > 0 THEN '검사중' ELSE '' END) AS INSPECTION_RESULT + + /* 검사여부: 검사가 하나라도 있으면 '검사', 모두 스킵이면 '스킵', 아무것도 없으면 빈값 */ + ,(CASE WHEN IID.INSPECTION_YN_COUNT > 0 THEN '검사' + WHEN IID.SKIP_YN_COUNT > 0 AND IID.INSPECTION_YN_COUNT = 0 THEN '스킵' + ELSE '' END) AS INSPECTION_YN + + /* 요청현황: 입고내역 기준으로 검사여부 선택 현황 계산 + 미요청: 입고건이 있지만 전부 검사여부 미선택 + 요청중: 일부만 검사여부 선택됨 + 요청완료: 전부 검사여부 선택됨 */ + ,(CASE WHEN REQ.DELIVERY_TOTAL_COUNT IS NULL OR REQ.DELIVERY_TOTAL_COUNT = 0 THEN '' + WHEN REQ.SELECTED_COUNT = 0 THEN '미요청' + WHEN REQ.SELECTED_COUNT REQ.DELIVERY_TOTAL_COUNT THEN '요청중' + ELSE '요청완료' END) AS REQUEST_STATUS + ,(SELECT COUNT(1) FROM ATTACH_FILE_INFO AF WHERE AF.TARGET_OBJID = POM.OBJID AND AF.DOC_TYPE = 'INSPECTION_FILE' AND UPPER(AF.STATUS) = 'ACTIVE') AS INSPECTION_FILE_CNT FROM PURCHASE_ORDER_MASTER AS POM LEFT OUTER JOIN ( SELECT PURCHASE_ORDER_MASTER_OBJID - ,MAX(INSPECTOR_ID) AS INSPECTOR_ID - ,MAX(INSPECTION_DATE) AS INSPECTION_DATE + ,MAX(REQUEST_USER_ID) AS REQUEST_USER_ID + ,MAX(REQUEST_DATE) AS REQUEST_DATE ,COUNT(*) AS TOTAL_COUNT - ,COUNT(CASE WHEN INSPECTION_RESULT IS NOT NULL AND INSPECTION_RESULT != '' THEN 1 END) AS INSPECTED_COUNT - ,COUNT(CASE WHEN INSPECTION_RESULT = 'NG' THEN 1 END) AS NG_COUNT + /* 검사여부 카운트: 검사 선택 건수, 스킵 선택 건수 */ + ,COUNT(CASE WHEN INSPECTION_YN = '검사' THEN 1 END) AS INSPECTION_YN_COUNT + ,COUNT(CASE WHEN INSPECTION_YN = '스킵' THEN 1 END) AS SKIP_YN_COUNT FROM INCOMING_INSPECTION_DETAIL GROUP BY PURCHASE_ORDER_MASTER_OBJID ) AS IID ON POM.OBJID::VARCHAR = IID.PURCHASE_ORDER_MASTER_OBJID + /* 불량상세 테이블에서 검사일/검사자/검사결과 집계 (스킵 항목 제외) */ + LEFT OUTER JOIN ( + SELECT IID2.PURCHASE_ORDER_MASTER_OBJID + /* 검사자: 여러명이면 "XXX 외 N건" 형태로 표시 */ + ,CASE + WHEN COUNT(DISTINCT IDF.INSPECTOR_ID) > 1 + THEN (SELECT USER_NAME FROM USER_INFO WHERE USER_ID = MIN(IDF.INSPECTOR_ID)) || ' 외 ' || (COUNT(DISTINCT IDF.INSPECTOR_ID) - 1) || '건' + WHEN COUNT(DISTINCT IDF.INSPECTOR_ID) = 1 + THEN (SELECT USER_NAME FROM USER_INFO WHERE USER_ID = MIN(IDF.INSPECTOR_ID)) + ELSE '' + END AS INSPECTOR_NAME_DISPLAY + /* 검사일: 여러개면 "YYYY-MM-DD 외 N건" 형태로 표시 */ + ,CASE + WHEN COUNT(DISTINCT IDF.INSPECTION_DATE) > 1 + THEN TO_CHAR(MIN(IDF.INSPECTION_DATE), 'YYYY-MM-DD') || ' 외 ' || (COUNT(DISTINCT IDF.INSPECTION_DATE) - 1) || '건' + WHEN COUNT(DISTINCT IDF.INSPECTION_DATE) = 1 + THEN TO_CHAR(MIN(IDF.INSPECTION_DATE), 'YYYY-MM-DD') + ELSE '' + END AS INSPECTION_DATE_DISPLAY + /* 검사 대상 건수 (스킵 제외, 검사인 항목만) */ + ,COUNT(CASE WHEN IID2.INSPECTION_YN = '검사' THEN 1 END) AS INSPECTION_TARGET_COUNT + /* 검사결과 입력된 건수 */ + ,COUNT(CASE WHEN IDF.INSPECTION_RESULT IS NOT NULL AND IDF.INSPECTION_RESULT != '' THEN 1 END) AS INSPECTED_COUNT + ,COUNT(CASE WHEN IDF.INSPECTION_RESULT = 'NG' THEN 1 END) AS NG_COUNT + FROM INCOMING_INSPECTION_DETAIL IID2 + LEFT JOIN INCOMING_INSPECTION_DEFECT IDF ON IDF.INSPECTION_DETAIL_OBJID = IID2.OBJID + GROUP BY IID2.PURCHASE_ORDER_MASTER_OBJID + ) AS DEFECT ON POM.OBJID::VARCHAR = DEFECT.PURCHASE_ORDER_MASTER_OBJID + /* 입고내역 기준 검사여부 선택 현황 (요청현황 계산용) */ + LEFT OUTER JOIN ( + SELECT IMI.PURCHASE_ORDER_MASTER_OBJID + ,COUNT(*) AS DELIVERY_TOTAL_COUNT + ,COUNT(CASE WHEN IID.INSPECTION_YN IS NOT NULL AND IID.INSPECTION_YN != '' THEN 1 END) AS SELECTED_COUNT + FROM INVENTORY_MGMT_IN IMI + LEFT JOIN INCOMING_INSPECTION_DETAIL IID ON IID.INVENTORY_IN_OBJID = IMI.OBJID + WHERE IMI.PURCHASE_ORDER_MASTER_OBJID IS NOT NULL + GROUP BY IMI.PURCHASE_ORDER_MASTER_OBJID + ) AS REQ ON POM.OBJID::VARCHAR = REQ.PURCHASE_ORDER_MASTER_OBJID LEFT OUTER JOIN ( SELECT POP.PURCHASE_ORDER_MASTER_OBJID ,SUM(POP.ORDER_QTY::NUMERIC) AS TOTAL_PO_QTY @@ -792,6 +853,11 @@ WHEN IID.INSPECTED_COUNT > 0 THEN '검사중' ELSE '' END) = #{search_inspection_result} + + + AND REQ.DELIVERY_TOTAL_COUNT = REQ.SELECTED_COUNT + AND REQ.SELECTED_COUNT > 0 + ORDER BY POM.REGDATE DESC @@ -2020,7 +2086,10 @@ ) THEN 'Y' ELSE 'N' END AS INSPECTION_FILE , IID.OBJID AS INSPECTION_DETAIL_OBJID , IID.INSPECTION_TYPE - , COALESCE(IID.INSPECTION_YN, '검사') AS INSPECTION_YN + , COALESCE(IID.INSPECTION_YN, '') AS INSPECTION_YN + , IID.REQUEST_DATE + , IID.REQUEST_USER_ID + , (SELECT USER_NAME FROM USER_INFO WHERE USER_ID = IID.REQUEST_USER_ID) AS REQUEST_USER_NAME , IID.DEFECT_TYPE , (SELECT CODE_NAME FROM COMM_CODE WHERE CODE_ID = IID.DEFECT_TYPE) AS DEFECT_TYPE_NAME , IID.DEFECT_REASON @@ -2043,6 +2112,54 @@ LEFT JOIN PURCHASE_ORDER_MASTER POM ON POM.OBJID = IMI.PURCHASE_ORDER_MASTER_OBJID LEFT JOIN INCOMING_INSPECTION_DETAIL IID ON IID.INVENTORY_IN_OBJID = IMI.OBJID WHERE IMI.PURCHASE_ORDER_MASTER_OBJID = #{PURCHASE_ORDER_MASTER_OBJID} + + ORDER BY IMI.REGDATE, PM.PART_NO + + + + @@ -2062,6 +2179,8 @@ OBJID , INVENTORY_IN_OBJID , PURCHASE_ORDER_MASTER_OBJID + , REQUEST_DATE + , REQUEST_USER_ID , INSPECTION_DATE , INSPECTOR_ID , INSPECTION_TYPE @@ -2080,6 +2199,8 @@ #{NEW_OBJID} , #{OBJID} , #{PURCHASE_ORDER_MASTER_OBJID} + , #{REQUEST_DATE} + , #{REQUEST_USER_ID} , #{INSPECTION_DATE} , #{INSPECTOR_ID} , #{INSPECTION_TYPE} @@ -2096,20 +2217,120 @@ , NOW() ) ON CONFLICT (INVENTORY_IN_OBJID) DO UPDATE SET - INSPECTION_DATE = #{INSPECTION_DATE} - , INSPECTOR_ID = #{INSPECTOR_ID} - , INSPECTION_TYPE = #{INSPECTION_TYPE} - , INSPECTION_YN = #{INSPECTION_YN} - , DEFECT_TYPE = #{DEFECT_TYPE} - , DEFECT_REASON = #{DEFECT_REASON} - , ACTION_STATUS = #{ACTION_STATUS} - , INSPECTION_QTY = #{INSPECTION_QTY} - , DEFECT_QTY = #{DEFECT_QTY} - , INSPECTION_RESULT = #{INSPECTION_RESULT} - , ATTACH_FILE_OBJID = #{ATTACH_FILE_OBJID} - , REMARK = #{REMARK} + REQUEST_DATE = COALESCE(#{REQUEST_DATE}, INCOMING_INSPECTION_DETAIL.REQUEST_DATE) + , REQUEST_USER_ID = COALESCE(#{REQUEST_USER_ID}, INCOMING_INSPECTION_DETAIL.REQUEST_USER_ID) + , INSPECTION_DATE = COALESCE(#{INSPECTION_DATE}, INCOMING_INSPECTION_DETAIL.INSPECTION_DATE) + , INSPECTOR_ID = COALESCE(#{INSPECTOR_ID}, INCOMING_INSPECTION_DETAIL.INSPECTOR_ID) + , INSPECTION_TYPE = COALESCE(#{INSPECTION_TYPE}, INCOMING_INSPECTION_DETAIL.INSPECTION_TYPE) + , INSPECTION_YN = COALESCE(#{INSPECTION_YN}, INCOMING_INSPECTION_DETAIL.INSPECTION_YN) + , DEFECT_TYPE = COALESCE(#{DEFECT_TYPE}, INCOMING_INSPECTION_DETAIL.DEFECT_TYPE) + , DEFECT_REASON = COALESCE(#{DEFECT_REASON}, INCOMING_INSPECTION_DETAIL.DEFECT_REASON) + , ACTION_STATUS = COALESCE(#{ACTION_STATUS}, INCOMING_INSPECTION_DETAIL.ACTION_STATUS) + , INSPECTION_QTY = COALESCE(#{INSPECTION_QTY}, INCOMING_INSPECTION_DETAIL.INSPECTION_QTY) + , DEFECT_QTY = COALESCE(#{DEFECT_QTY}, INCOMING_INSPECTION_DETAIL.DEFECT_QTY) + , INSPECTION_RESULT = COALESCE(#{INSPECTION_RESULT}, INCOMING_INSPECTION_DETAIL.INSPECTION_RESULT) + , ATTACH_FILE_OBJID = COALESCE(#{ATTACH_FILE_OBJID}, INCOMING_INSPECTION_DETAIL.ATTACH_FILE_OBJID) + , REMARK = COALESCE(#{REMARK}, INCOMING_INSPECTION_DETAIL.REMARK) , MODIFIER = #{WRITER} , MOD_DATE = NOW() + + + + + + + + INSERT INTO INCOMING_INSPECTION_DEFECT ( + OBJID + , INSPECTION_DETAIL_OBJID + , INSPECTION_TYPE + , INSPECTION_DATE + , INSPECTOR_ID + , DEFECT_TYPE + , DEFECT_REASON + , ACTION_STATUS + , ACTION_RESULT + , INSPECTION_QTY + , DEFECT_QTY + , INSPECTION_RESULT + , REMARK + , WRITER + , REG_DATE + ) VALUES ( + #{OBJID} + , #{INSPECTION_DETAIL_OBJID} + , #{INSPECTION_TYPE} + , #{INSPECTION_DATE}::DATE + , #{INSPECTOR_ID} + , #{DEFECT_TYPE} + , #{DEFECT_REASON} + , #{ACTION_STATUS} + , #{ACTION_RESULT} + , #{INSPECTION_QTY} + , #{DEFECT_QTY} + , #{INSPECTION_RESULT} + , #{REMARK} + , #{WRITER} + , NOW() + ) + ON CONFLICT (OBJID) DO UPDATE SET + INSPECTION_TYPE = #{INSPECTION_TYPE} + , INSPECTION_DATE = #{INSPECTION_DATE}::DATE + , INSPECTOR_ID = #{INSPECTOR_ID} + , DEFECT_TYPE = #{DEFECT_TYPE} + , DEFECT_REASON = #{DEFECT_REASON} + , ACTION_STATUS = #{ACTION_STATUS} + , ACTION_RESULT = #{ACTION_RESULT} + , INSPECTION_QTY = #{INSPECTION_QTY} + , DEFECT_QTY = #{DEFECT_QTY} + , INSPECTION_RESULT = #{INSPECTION_RESULT} + , REMARK = #{REMARK} + , MODIFIER = #{WRITER} + , MOD_DATE = NOW() + + + + + DELETE FROM INCOMING_INSPECTION_DEFECT + WHERE OBJID = #{OBJID} + + + + + DELETE FROM INCOMING_INSPECTION_DEFECT + WHERE INSPECTION_DETAIL_OBJID = #{INSPECTION_DETAIL_OBJID} + + \ No newline at end of file diff --git a/src/com/pms/service/PurchaseOrderService.java b/src/com/pms/service/PurchaseOrderService.java index 17e03f1..cf43668 100644 --- a/src/com/pms/service/PurchaseOrderService.java +++ b/src/com/pms/service/PurchaseOrderService.java @@ -3145,4 +3145,36 @@ public class PurchaseOrderService { public List getDeliveryListForDropdown(HttpServletRequest request, Map paramMap) throws Exception { return commonService.selectList("purchaseOrder.getDeliveryListForDropdown", request, paramMap); } + + /** + * 매입마감 처리 + * PURCHASE_ORDER_MASTER의 PURCHASE_CLOSE_DATE를 현재일자로 업데이트 + * @param objIds 쉼표로 구분된 OBJID 목록 + * @return 처리 결과 + */ + public Map updatePurchaseCloseDate(String objIds) { + Map resultMap = new HashMap(); + SqlSession sqlSession = SqlMapConfig.getInstance().getSqlSession(false); + + try { + if(objIds != null && !objIds.isEmpty()) { + String[] objIdArr = objIds.split(","); + for(String objId : objIdArr) { + Map updateParam = new HashMap(); + updateParam.put("OBJID", objId.trim()); + sqlSession.update("purchaseOrder.updatePurchaseCloseDate", updateParam); + } + } + sqlSession.commit(); + resultMap.put("result", "SUCCESS"); + } catch(Exception e) { + sqlSession.rollback(); + e.printStackTrace(); + resultMap.put("result", "FAIL"); + resultMap.put("message", e.getMessage()); + } finally { + sqlSession.close(); + } + return resultMap; + } } diff --git a/src/com/pms/service/QualityService.java b/src/com/pms/service/QualityService.java index 651df24..f4c1e8b 100644 --- a/src/com/pms/service/QualityService.java +++ b/src/com/pms/service/QualityService.java @@ -17,6 +17,7 @@ import com.pms.common.bean.PersonBean; import com.pms.common.service.BaseService; import com.pms.common.utils.CommonUtils; import com.pms.common.utils.Constants; +import com.pms.common.JsonUtil; @Service public class QualityService extends BaseService{ @@ -661,8 +662,60 @@ public class QualityService extends BaseService{ return resultMap; } + /** + * 수입검사 요청 저장 (검사여부, 요청일, 요청자만 저장) + */ + public Map saveIncomingInspectionRequest(HttpServletRequest request, Map paramMap){ + Map resultMap = new HashMap(); + SqlSession sqlSession = null; + try{ + sqlSession = SqlMapConfig.getInstance().getSqlSession(false); + + PersonBean person = (PersonBean)request.getSession().getAttribute(Constants.PERSON_BEAN); + String writer = CommonUtils.checkNull(person.getUserId()); + + String requestDate = CommonUtils.checkNull(paramMap.get("REQUEST_DATE")); + String requestUserId = CommonUtils.checkNull(paramMap.get("REQUEST_USER_ID")); + String purchaseOrderMasterObjId = CommonUtils.checkNull(paramMap.get("PURCHASE_ORDER_MASTER_OBJID")); + String dataListJson = CommonUtils.checkNull(paramMap.get("dataListJson")); + + // JSON 파싱 + com.google.gson.Gson gson = new com.google.gson.Gson(); + java.lang.reflect.Type listType = new com.google.gson.reflect.TypeToken>>(){}.getType(); + List> dataList = gson.fromJson(dataListJson, listType); + + // 각 행별로 저장 (요청 정보만) + for(Map data : dataList){ + Map sqlParamMap = new HashMap(); + sqlParamMap.put("NEW_OBJID", CommonUtils.createObjId()); // 신규 OBJID 생성 + sqlParamMap.put("OBJID", data.get("OBJID")); // INVENTORY_MGMT_IN.OBJID + sqlParamMap.put("PURCHASE_ORDER_MASTER_OBJID", purchaseOrderMasterObjId); + sqlParamMap.put("REQUEST_DATE", requestDate); + sqlParamMap.put("REQUEST_USER_ID", requestUserId); + sqlParamMap.put("INSPECTION_YN", data.get("INSPECTION_YN")); + sqlParamMap.put("WRITER", writer); + + sqlSession.update("quality.saveIncomingInspectionDetail", sqlParamMap); + } + + sqlSession.commit(); + resultMap.put("result", true); + resultMap.put("msg", Message.SAVE_SUCCESS); + }catch(Exception e){ + resultMap.put("result", false); + resultMap.put("msg", Message.SAVE_FAILED); + if(sqlSession != null) sqlSession.rollback(); + e.printStackTrace(); + }finally{ + if(sqlSession != null) sqlSession.close(); + } + return resultMap; + } + /** * 수입검사 저장 (그리드 데이터 일괄 저장) + * - 요청일/요청자: 각 행별로 개별 저장 + * - 검사일/검사자: 헤더에서 공통 적용 (진행 팝업에서 사용) */ public Map saveIncomingInspection(HttpServletRequest request, Map paramMap){ Map resultMap = new HashMap(); @@ -673,6 +726,7 @@ public class QualityService extends BaseService{ PersonBean person = (PersonBean)request.getSession().getAttribute(Constants.PERSON_BEAN); String writer = CommonUtils.checkNull(person.getUserId()); + // 헤더에서 가져오는 값 (진행 팝업용) String inspectionDate = CommonUtils.checkNull(paramMap.get("INSPECTION_DATE")); String inspectorId = CommonUtils.checkNull(paramMap.get("INSPECTOR_ID")); String purchaseOrderMasterObjId = CommonUtils.checkNull(paramMap.get("PURCHASE_ORDER_MASTER_OBJID")); @@ -689,8 +743,15 @@ public class QualityService extends BaseService{ sqlParamMap.put("NEW_OBJID", CommonUtils.createObjId()); // 신규 OBJID 생성 sqlParamMap.put("OBJID", data.get("OBJID")); // INVENTORY_MGMT_IN.OBJID sqlParamMap.put("PURCHASE_ORDER_MASTER_OBJID", purchaseOrderMasterObjId); + + // 검사일/검사자: 헤더 값 사용 (진행 팝업) sqlParamMap.put("INSPECTION_DATE", inspectionDate); sqlParamMap.put("INSPECTOR_ID", inspectorId); + + // 요청일/요청자: 각 행별 개별 값 사용 (요청 팝업) + sqlParamMap.put("REQUEST_DATE", data.get("REQUEST_DATE")); + sqlParamMap.put("REQUEST_USER_ID", data.get("REQUEST_USER_ID")); + sqlParamMap.put("INSPECTION_TYPE", data.get("INSPECTION_TYPE")); sqlParamMap.put("INSPECTION_YN", data.get("INSPECTION_YN")); sqlParamMap.put("DEFECT_TYPE", data.get("DEFECT_TYPE")); @@ -1422,4 +1483,117 @@ public class QualityService extends BaseService{ /*edhwang end*/ + // ===================================================== + // 수입검사 불량상세 관련 + // ===================================================== + + /** + * 불량상세 목록 조회 + */ + public List getIncomingInspectionDefectList(Map paramMap){ + SqlSession sqlSession = null; + List resultList = new ArrayList(); + + try{ + sqlSession = SqlMapConfig.getInstance().getSqlSession(); + resultList = sqlSession.selectList("quality.getIncomingInspectionDefectList", paramMap); + resultList = CommonUtils.keyChangeUpperList(resultList); + }catch(Exception e){ + e.printStackTrace(); + }finally{ + if(sqlSession != null) sqlSession.close(); + } + + return resultList; + } + + /** + * 수입검사 진행 저장 (입고품목 + 불량상세) + */ + public Map saveIncomingInspectionProgress(HttpServletRequest request, Map paramMap){ + Map resultMap = new HashMap(); + SqlSession sqlSession = null; + + try{ + sqlSession = SqlMapConfig.getInstance().getSqlSession(); + + // 작성자 정보 설정 + PersonBean person = (PersonBean) request.getSession().getAttribute(Constants.PERSON_BEAN); + String writer = person != null ? person.getUserId() : ""; + + String purchaseOrderMasterObjid = CommonUtils.checkNull(paramMap.get("PURCHASE_ORDER_MASTER_OBJID")); + String inspectionDate = CommonUtils.checkNull(paramMap.get("INSPECTION_DATE")); + String inspectorId = CommonUtils.checkNull(paramMap.get("INSPECTOR_ID")); + + // 1. 입고품목 데이터 저장 (검사구분 등) + String dataListJson = CommonUtils.checkNull(paramMap.get("dataListJson")); + if(!dataListJson.isEmpty()) { + List> dataList = JsonUtil.JsonToList(dataListJson); + + for(Map data : dataList) { + Map sqlParamMap = new HashMap(); + sqlParamMap.put("NEW_OBJID", CommonUtils.createObjId()); // 신규 OBJID 생성 + sqlParamMap.put("OBJID", CommonUtils.checkNull(data.get("OBJID"))); // INVENTORY_MGMT_IN.OBJID + sqlParamMap.put("PURCHASE_ORDER_MASTER_OBJID", purchaseOrderMasterObjid); + sqlParamMap.put("INSPECTION_TYPE", CommonUtils.checkNull(data.get("INSPECTION_TYPE"))); + sqlParamMap.put("INSPECTION_DATE", inspectionDate); + sqlParamMap.put("INSPECTOR_ID", inspectorId); + sqlParamMap.put("WRITER", writer); + + sqlSession.update("quality.saveIncomingInspectionDetail", sqlParamMap); + } + } + + // 2. 불량상세 데이터 저장 + String defectListJson = CommonUtils.checkNull(paramMap.get("defectListJson")); + String selectedDetailObjid = CommonUtils.checkNull(paramMap.get("selectedDetailObjid")); + + if(!defectListJson.isEmpty() && !selectedDetailObjid.isEmpty()) { + List> defectList = JsonUtil.JsonToList(defectListJson); + + for(Map defect : defectList) { + String gridStatus = CommonUtils.checkNull(defect.get("GRID_STATUS")); + + Map sqlParamMap = new HashMap(); + sqlParamMap.put("OBJID", CommonUtils.checkNull(defect.get("OBJID"))); + sqlParamMap.put("INSPECTION_DETAIL_OBJID", selectedDetailObjid); + sqlParamMap.put("INSPECTION_TYPE", CommonUtils.checkNull(defect.get("INSPECTION_TYPE"))); + sqlParamMap.put("INSPECTION_DATE", CommonUtils.checkNull(defect.get("INSPECTION_DATE"))); + sqlParamMap.put("INSPECTOR_ID", CommonUtils.checkNull(defect.get("INSPECTOR_ID"))); + sqlParamMap.put("DEFECT_TYPE", CommonUtils.checkNull(defect.get("DEFECT_TYPE"))); + sqlParamMap.put("DEFECT_REASON", CommonUtils.checkNull(defect.get("DEFECT_REASON"))); + sqlParamMap.put("ACTION_STATUS", CommonUtils.checkNull(defect.get("ACTION_STATUS"))); + sqlParamMap.put("ACTION_RESULT", CommonUtils.checkNull(defect.get("ACTION_RESULT"))); + sqlParamMap.put("INSPECTION_QTY", CommonUtils.checkNull(defect.get("INSPECTION_QTY"))); + sqlParamMap.put("DEFECT_QTY", CommonUtils.checkNull(defect.get("DEFECT_QTY"))); + sqlParamMap.put("INSPECTION_RESULT", CommonUtils.checkNull(defect.get("INSPECTION_RESULT"))); + sqlParamMap.put("REMARK", CommonUtils.checkNull(defect.get("REMARK"))); + sqlParamMap.put("WRITER", writer); + + if("D".equals(gridStatus)) { + // 삭제 + sqlSession.delete("quality.deleteIncomingInspectionDefect", sqlParamMap); + } else { + // 신규/수정 + sqlSession.insert("quality.saveIncomingInspectionDefect", sqlParamMap); + } + } + } + + sqlSession.commit(); + resultMap.put("result", true); + resultMap.put("msg", "저장되었습니다."); + + }catch(Exception e){ + if(sqlSession != null) sqlSession.rollback(); + resultMap.put("result", false); + resultMap.put("msg", e.getMessage()); + e.printStackTrace(); + }finally{ + if(sqlSession != null) sqlSession.close(); + } + + return resultMap; + } + }