From 2fb4ee6e3438db2341fbde213e51a872d69c3c2a Mon Sep 17 00:00:00 2001 From: hjjeong Date: Tue, 16 Dec 2025 11:37:48 +0900 Subject: [PATCH 1/3] =?UTF-8?q?=EC=9E=85=EA=B3=A0=EA=B4=80=EB=A6=AC=20?= =?UTF-8?q?=EB=A7=A4=EC=9E=85=EB=A7=88=EA=B0=90,=20=EB=B0=9C=EC=A3=BC?= =?UTF-8?q?=EA=B8=88=EC=95=A1=20=ED=91=9C=EC=8B=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../deliveryMngAcceptanceList.jsp | 135 +++++++++++++++++- .../controller/PurchaseOrderController.java | 11 ++ src/com/pms/mapper/purchaseOrder.xml | 13 ++ src/com/pms/service/PurchaseOrderService.java | 32 +++++ 4 files changed, 188 insertions(+), 3 deletions(-) diff --git a/WebContent/WEB-INF/view/purchaseOrder/deliveryMngAcceptanceList.jsp b/WebContent/WEB-INF/view/purchaseOrder/deliveryMngAcceptanceList.jsp index 823e697..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) { @@ -105,7 +113,7 @@ var columns = [ {headerHozAlign : 'center', hozAlign : 'right', minWidth : 90, widthGrow : 1, title : '미입고수량', field : 'NON_DELIVERY_QTY', formatter:"money", formatterParams:{thousand:",", symbolAfter:"p", precision:false } }, - {headerHozAlign : 'center', hozAlign : 'center', minWidth : 100, widthGrow : 1, title : '검사성적서', field : 'INSPECTION_FILE_CNT', + {headerHozAlign : 'center', hozAlign : 'center', minWidth : 100, widthGrow : 1, title : '업체성적서', field : 'INSPECTION_FILE_CNT', formatter:fnc_subInfoValueFormatter, cellClick:function(e, cell){ var objid = fnc_checkNull(cell.getData().OBJID); @@ -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/src/com/pms/controller/PurchaseOrderController.java b/src/com/pms/controller/PurchaseOrderController.java index 70b5517..631fe44 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/mapper/purchaseOrder.xml b/src/com/pms/mapper/purchaseOrder.xml index d7b2ffb..2d74ade 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 + + +
+ +
+
+ 입고품목 +
+
+
+
+
+ + +
+
+ 불량상세 +
+ + +
+
+
+
+
+
+
+ + <%@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/QualityController.java b/src/com/pms/controller/QualityController.java index 9035e09..b4e33dd 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 @@ -687,4 +815,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/quality.xml b/src/com/pms/mapper/quality.xml index a5eede3..0d109cb 100644 --- a/src/com/pms/mapper/quality.xml +++ b/src/com/pms/mapper/quality.xml @@ -666,7 +666,7 @@ ,POM.PURCHASE_ORDER_NO ,CM.PROJECT_NO - + ,CODE_NAME(CM.PRODUCT) AS PRODUCT_NAME ,(SELECT CASE @@ -702,24 +702,83 @@ 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 */ + ,(CASE WHEN DEFECT.NG_COUNT > 0 THEN 'NG' + WHEN DEFECT.DEFECT_TOTAL_COUNT > 0 AND DEFECT.DEFECT_TOTAL_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(*) AS DEFECT_TOTAL_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 @@ -1643,7 +1702,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 @@ -1666,6 +1728,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 + + + + @@ -1685,6 +1795,8 @@ OBJID , INVENTORY_IN_OBJID , PURCHASE_ORDER_MASTER_OBJID + , REQUEST_DATE + , REQUEST_USER_ID , INSPECTION_DATE , INSPECTOR_ID , INSPECTION_TYPE @@ -1703,6 +1815,8 @@ #{NEW_OBJID} , #{OBJID} , #{PURCHASE_ORDER_MASTER_OBJID} + , #{REQUEST_DATE} + , #{REQUEST_USER_ID} , #{INSPECTION_DATE} , #{INSPECTOR_ID} , #{INSPECTION_TYPE} @@ -1719,20 +1833,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/QualityService.java b/src/com/pms/service/QualityService.java index aedbb1c..5f7b8c2 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")); @@ -1152,4 +1213,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; + } + } From 9bf6a94331fa4023ba08076f86925e5457db018e Mon Sep 17 00:00:00 2001 From: hjjeong Date: Tue, 16 Dec 2025 16:11:36 +0900 Subject: [PATCH 3/3] =?UTF-8?q?=ED=92=88=EC=A7=88=EA=B4=80=EB=A6=AC=5F?= =?UTF-8?q?=EC=88=98=EC=9E=85=EA=B2=80=EC=82=AC=EC=9A=94=EC=B2=AD,=20?= =?UTF-8?q?=EA=B4=80=EB=A6=AC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../view/quality/incomingInspectionList.jsp | 27 +++++++- .../incomingInspectionProgressList.jsp | 8 +++ .../incomingInspectionProgressPopUp.jsp | 62 ++++++++++++++----- src/com/pms/mapper/quality.xml | 15 +++-- 4 files changed, 90 insertions(+), 22 deletions(-) diff --git a/WebContent/WEB-INF/view/quality/incomingInspectionList.jsp b/WebContent/WEB-INF/view/quality/incomingInspectionList.jsp index 3bd43ce..c23a3f5 100644 --- a/WebContent/WEB-INF/view/quality/incomingInspectionList.jsp +++ b/WebContent/WEB-INF/view/quality/incomingInspectionList.jsp @@ -105,7 +105,14 @@ var columns = [ {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:'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'}, @@ -184,6 +191,23 @@ function fn_excelDownload(){ form.submit(); form.action = ""; } + +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(); +} @@ -191,6 +215,7 @@ function fn_excelDownload(){ + diff --git a/WebContent/WEB-INF/view/quality/incomingInspectionProgressList.jsp b/WebContent/WEB-INF/view/quality/incomingInspectionProgressList.jsp index bb29d8f..d1240fb 100644 --- a/WebContent/WEB-INF/view/quality/incomingInspectionProgressList.jsp +++ b/WebContent/WEB-INF/view/quality/incomingInspectionProgressList.jsp @@ -150,6 +150,14 @@ function fn_search(){ value: selectedProjectNos }).appendTo('#form1'); + // 수입검사 진행 리스트는 요청완료 건만 조회 + $('input[name="request_status_filter"]').remove(); + $('').attr({ + type: 'hidden', + name: 'request_status_filter', + value: '요청완료' + }).appendTo('#form1'); + _tabulGrid = fnc_tabul_search(_tabul_layout_fitColumns, _tabulGrid, "/quality/incomingInspectionGridList.do", columns, true); } diff --git a/WebContent/WEB-INF/view/quality/incomingInspectionProgressPopUp.jsp b/WebContent/WEB-INF/view/quality/incomingInspectionProgressPopUp.jsp index 156d044..a825251 100644 --- a/WebContent/WEB-INF/view/quality/incomingInspectionProgressPopUp.jsp +++ b/WebContent/WEB-INF/view/quality/incomingInspectionProgressPopUp.jsp @@ -626,40 +626,68 @@ function fn_openPartDetailPopUp(partObjId) { function fn_openImageFilePopUp(objId) { var popup_width = 650; var popup_height = 550; - var url = "/common/ImageRegistPopup.do?targetObjId=" + objId + "&docType=INSPECTION_DEFECT_IMAGE&docTypeName=검사이미지&callbackFnc=fn_refreshRightGrid"; + var url = "/common/ImageRegistPopup.do?targetObjId=" + objId + "&docType=INSPECTION_DEFECT_IMAGE&docTypeName=검사이미지"; var popup = window.open(url, "imageFilePopUp", "width=" + popup_width + ",height=" + popup_height + ",scrollbars=yes,resizable=yes"); - // 팝업 닫힘 감지하여 우측 그리드 새로고침 - var checkPopup = setInterval(function() { - if(popup.closed) { - clearInterval(checkPopup); - fn_refreshRightGrid(); - } - }, 500); + // 팝업 닫힘 감지하여 해당 행의 파일 카운트만 업데이트 + fn_watchPopupClose(popup, objId, 'IMAGE_FILE_CNT', 'INSPECTION_DEFECT_IMAGE'); } // 첨부파일 팝업 function fn_openAttachFilePopUp(objId) { var popup_width = 800; var popup_height = 300; - var params = "?targetObjId=" + objId + "&docType=INSPECTION_DEFECT_FILE&docTypeName=검사첨부&callbackFnc=fn_refreshRightGrid"; - var url = "/projectConcept/FileRegistPopup.do" + params; + var params = "?targetObjId=" + objId + "&docType=INSPECTION_DEFECT_FILE&docTypeName=검사첨부"; + var url = "/common/FileRegistPopup.do" + params; var popup = window.open(url, "attachFilePopUp", "width=" + popup_width + ",height=" + popup_height + ",scrollbars=yes,resizable=yes"); - // 팝업 닫힘 감지하여 우측 그리드 새로고침 + // 팝업 닫힘 감지하여 해당 행의 파일 카운트만 업데이트 + fn_watchPopupClose(popup, objId, 'ATTACH_FILE_CNT', 'INSPECTION_DEFECT_FILE'); +} + +// 팝업 닫힘 감지 및 파일 카운트 업데이트 +function fn_watchPopupClose(popup, objId, fieldName, docType) { var checkPopup = setInterval(function() { if(popup.closed) { clearInterval(checkPopup); - fn_refreshRightGrid(); + // 파일 카운트 조회 후 해당 행만 업데이트 + fn_updateRightGridFileCnt(objId, fieldName, docType); } }, 500); } -// 우측 그리드 새로고침 (파일 업로드 후 콜백) -function fn_refreshRightGrid() { - if(selectedDetailObjid) { - fn_searchRightGrid(selectedDetailObjid); - } +// 우측 그리드 파일 카운트 업데이트 +function fn_updateRightGridFileCnt(objId, fieldName, docType) { + $.ajax({ + url: "/common/getFileList.do", + type: "POST", + data: { targetObjId: objId, docType: docType }, + dataType: "json", + success: function(data) { + var cnt = data ? data.length : 0; + var rows = rightGrid.getRows(); + rows.forEach(function(row) { + if(row.getData().OBJID === objId) { + var updateData = {}; + updateData[fieldName] = cnt; + row.update(updateData); + } + }); + } + }); +} + +// 공통 fnc_tabulCallbackFnc 오버라이드 (이 페이지에서는 rightGrid 사용) +function fnc_tabulCallbackFnc(objId, docType, columnField, fileCnt) { + var rows = rightGrid.getRows(); + rows.forEach(function(row) { + if(row.getData().OBJID === objId) { + var updateData = {}; + var targetField = (columnField && columnField !== '') ? columnField : 'FILE_CNT'; + updateData[targetField] = fileCnt; + row.update(updateData); + } + }); } // ===================================================== diff --git a/src/com/pms/mapper/quality.xml b/src/com/pms/mapper/quality.xml index 0d109cb..75d1183 100644 --- a/src/com/pms/mapper/quality.xml +++ b/src/com/pms/mapper/quality.xml @@ -711,9 +711,9 @@ ,DEFECT.INSPECTOR_NAME_DISPLAY AS INSPECTOR_NAME /* 검사일: YYYY-MM-DD 외 N건 형태 */ ,DEFECT.INSPECTION_DATE_DISPLAY AS INSPECTION_DATE - /* 검사결과: 하나라도 NG면 NG */ + /* 검사결과: 하나라도 NG면 NG, 검사 대상(스킵 제외) 모두 검사완료면 OK, 일부만 검사면 검사중 */ ,(CASE WHEN DEFECT.NG_COUNT > 0 THEN 'NG' - WHEN DEFECT.DEFECT_TOTAL_COUNT > 0 AND DEFECT.DEFECT_TOTAL_COUNT = DEFECT.INSPECTED_COUNT THEN 'OK' + 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 @@ -743,7 +743,7 @@ 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건" 형태로 표시 */ @@ -762,7 +762,9 @@ THEN TO_CHAR(MIN(IDF.INSPECTION_DATE), 'YYYY-MM-DD') ELSE '' END AS INSPECTION_DATE_DISPLAY - ,COUNT(*) AS DEFECT_TOTAL_COUNT + /* 검사 대상 건수 (스킵 제외, 검사인 항목만) */ + ,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 @@ -851,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