From a0d806d42b2d5c2ac5b484164f84e136fe1aa8b5 Mon Sep 17 00:00:00 2001 From: leeheejin Date: Tue, 16 Dec 2025 09:43:11 +0900 Subject: [PATCH 01/10] =?UTF-8?q?=EC=BB=AC=EB=9F=BC=EC=9D=B4=EB=A6=84=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../WEB-INF/view/purchaseOrder/deliveryMngAcceptanceList.jsp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WebContent/WEB-INF/view/purchaseOrder/deliveryMngAcceptanceList.jsp b/WebContent/WEB-INF/view/purchaseOrder/deliveryMngAcceptanceList.jsp index 823e697..f7a1eb3 100644 --- a/WebContent/WEB-INF/view/purchaseOrder/deliveryMngAcceptanceList.jsp +++ b/WebContent/WEB-INF/view/purchaseOrder/deliveryMngAcceptanceList.jsp @@ -105,7 +105,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); From 140d87bb82b516a5798d7d692e4bc7fb77dc3b43 Mon Sep 17 00:00:00 2001 From: leeheejin Date: Tue, 16 Dec 2025 14:52:19 +0900 Subject: [PATCH 02/10] =?UTF-8?q?=ED=99=95=EC=9D=B8=EC=A0=84=20=EC=BB=A4?= =?UTF-8?q?=EB=B0=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../classes/com/pms/mapper/purchaseOrder.xml | 169 +- .../classes/com/pms/mapper/quality.xml | 1424 ++++++++++++++++- .../semiProductInspectionFormPopUp.jsp | 702 +++++++- .../quality/semiProductInspectionList.jsp | 170 +- .../controller/PurchaseOrderController.java | 24 + src/com/pms/controller/QualityController.java | 44 +- src/com/pms/mapper/purchaseOrder.xml | 22 + src/com/pms/mapper/quality.xml | 357 ++++- src/com/pms/service/PurchaseOrderService.java | 11 + src/com/pms/service/QualityService.java | 270 ++++ 10 files changed, 2981 insertions(+), 212 deletions(-) diff --git a/WebContent/WEB-INF/classes/com/pms/mapper/purchaseOrder.xml b/WebContent/WEB-INF/classes/com/pms/mapper/purchaseOrder.xml index 66fd97a..e4fbb29 100644 --- a/WebContent/WEB-INF/classes/com/pms/mapper/purchaseOrder.xml +++ b/WebContent/WEB-INF/classes/com/pms/mapper/purchaseOrder.xml @@ -544,11 +544,14 @@ EFFECTIVE_DATE, PAYMENT_TERMS, REMARK, + REQUEST_CONTENT, WRITER, REGDATE, STATUS, SALES_REQUEST_OBJID, - SALES_MNG_USER_ID + SALES_MNG_USER_ID, + SALES_MNG_USER_ID2, + FORM_TYPE ,TITLE ,PURCHASE_DATE ,CONTRACT_MGMT_OBJID @@ -562,6 +565,7 @@ ,TOTAL_REAL_SUPPLY_PRICE ,DISCOUNT_PRICE ,TOTAL_PRICE + ,TOTAL_PRICE_ALL ,NEGO_RATE ,SUPPLY_BUS_NO ,SUPPLY_USER_NAME @@ -597,14 +601,17 @@ #{EFFECTIVE_DATE}, #{PAYMENT_TERMS}, #{REMARK}, + #{REQUEST_CONTENT}, #{WRITER}, NOW(), #{STATUS}, #{SALES_REQUEST_OBJID}, - #{SALES_MNG_USER_ID} + #{SALES_MNG_USER_ID}, + #{SALES_MNG_USER_ID2}, + #{FORM_TYPE} ,#{TITLE} ,#{PURCHASE_DATE} - ,#{CONTRACT_MGMT_OBJID}::NUMERIC + ,#{CONTRACT_MGMT_OBJID} ,#{TYPE } ,#{INSPECT_METHOD } ,#{TOTAL_PRICE_TXT } @@ -615,6 +622,7 @@ ,#{TOTAL_REAL_SUPPLY_PRICE} ,#{DISCOUNT_PRICE } ,#{TOTAL_PRICE } + ,#{TOTAL_PRICE_ALL } ,#{NEGO_RATE } ,#{SUPPLY_BUS_NO } ,#{SUPPLY_USER_NAME } @@ -650,12 +658,17 @@ EFFECTIVE_DATE = #{EFFECTIVE_DATE}, PAYMENT_TERMS = #{PAYMENT_TERMS}, REMARK = #{REMARK}, + REQUEST_CONTENT = #{REQUEST_CONTENT}, WRITER = #{WRITER}, STATUS = #{STATUS}, - SALES_MNG_USER_ID = #{SALES_MNG_USER_ID} + SALES_MNG_USER_ID = #{SALES_MNG_USER_ID}, + SALES_MNG_USER_ID2 = #{SALES_MNG_USER_ID2} + + ,FORM_TYPE = #{FORM_TYPE} + ,TITLE = #{TITLE} ,PURCHASE_DATE = #{PURCHASE_DATE} - ,CONTRACT_MGMT_OBJID = #{CONTRACT_MGMT_OBJID}::NUMERIC + ,CONTRACT_MGMT_OBJID = #{CONTRACT_MGMT_OBJID} ,TYPE = #{TYPE } ,INSPECT_METHOD = #{INSPECT_METHOD } ,TOTAL_PRICE_TXT = #{TOTAL_PRICE_TXT } @@ -669,6 +682,7 @@ ,TOTAL_REAL_SUPPLY_PRICE = #{TOTAL_REAL_SUPPLY_PRICE} ,DISCOUNT_PRICE = #{DISCOUNT_PRICE } ,TOTAL_PRICE = #{TOTAL_PRICE } + ,TOTAL_PRICE_ALL = #{TOTAL_PRICE_ALL } ,NEGO_RATE = #{NEGO_RATE } ,SUPPLY_BUS_NO = #{SUPPLY_BUS_NO } ,SUPPLY_USER_NAME = #{SUPPLY_USER_NAME } @@ -736,7 +750,8 @@ REGDATE, STATUS, SALES_REQUEST_OBJID, - SALES_MNG_USER_ID + SALES_MNG_USER_ID, + FORM_TYPE ,TITLE ,PURCHASE_DATE ,CONTRACT_MGMT_OBJID @@ -775,7 +790,8 @@ NOW(), 'create', #{SALES_REQUEST_OBJID}, - #{SALES_MNG_USER_ID} + #{SALES_MNG_USER_ID}, + #{FORM_TYPE} ,#{TITLE} ,#{PURCHASE_DATE} ,NULLIF(#{PROJECT_NO}::TEXT, '')::NUMERIC @@ -813,7 +829,7 @@ SALES_MNG_USER_ID = #{SALES_MNG_USER_ID} ,TITLE = #{TITLE} ,PURCHASE_DATE = #{PURCHASE_DATE} - ,CONTRACT_MGMT_OBJID = NULLIF(#{CONTRACT_MGMT_OBJID}::TEXT, '')::NUMERIC + ,CONTRACT_MGMT_OBJID = #{CONTRACT_MGMT_OBJID} ,TYPE = #{TYPE } ,INSPECT_METHOD = #{INSPECT_METHOD } ,TOTAL_PRICE_TXT = #{TOTAL_PRICE_TXT } @@ -970,7 +986,7 @@ #{SALES_MNG_USER_ID} ,#{TITLE} ,#{PURCHASE_DATE} - ,#{CONTRACT_MGMT_OBJID}::NUMERIC + ,#{CONTRACT_MGMT_OBJID} ,#{TYPE } ,#{INSPECT_METHOD } ,#{TOTAL_PRICE_TXT } @@ -1157,6 +1173,10 @@ ,STOCK_QTY ,REAL_ORDER_QTY ,REAL_SUPPLY_PRICE + ,PART_DELIVERY_PLACE + ,PRODUCT_NAME + ,WORK_ORDER_NO + ,DELIVERY_REQUEST_DATE ) VALUES ( @@ -1196,6 +1216,10 @@ ,REPLACE(#{STOCK_QTY} ::VARCHAR, ',', '') ,REPLACE(#{REAL_ORDER_QTY} ::VARCHAR, ',', '') ,REPLACE(#{REAL_SUPPLY_PRICE} ::VARCHAR, ',', '') + ,#{PART_DELIVERY_PLACE} + ,#{PRODUCT_NAME} + ,#{WORK_ORDER_NO} + ,#{DELIVERY_REQUEST_DATE} ) ON CONFLICT (OBJID) DO UPDATE SET @@ -1223,6 +1247,10 @@ ,STOCK_QTY = REPLACE(#{STOCK_QTY} ::VARCHAR, ',', '') ,REAL_ORDER_QTY = REPLACE(#{REAL_ORDER_QTY} ::VARCHAR, ',', '') ,REAL_SUPPLY_PRICE = REPLACE(#{REAL_SUPPLY_PRICE} ::VARCHAR, ',', '') + ,PART_DELIVERY_PLACE = #{PART_DELIVERY_PLACE} + ,PRODUCT_NAME = #{PRODUCT_NAME} + ,WORK_ORDER_NO = #{WORK_ORDER_NO} + ,DELIVERY_REQUEST_DATE = #{DELIVERY_REQUEST_DATE} SELECT T1.OBJID ,T1.BUS_REG_NO AS SUPPLY_BUS_NO - ,(CASE WHEN T2.OBJID IS NULL THEN T1.CHARGE_USER_NAME ELSE T2.CHARGER_NAME END) AS SUPPLY_USER_NAME - ,(CASE WHEN T2.OBJID IS NULL THEN T1.SUPPLY_TEL_NO ELSE T2.PHONE END) AS SUPPLY_USER_HP - ,(CASE WHEN T2.OBJID IS NULL THEN T1.OFFICE_NO ELSE T2.TEL END) AS SUPPLY_USER_TEL - ,(CASE WHEN T2.OBJID IS NULL THEN T1.SUPPLY_FAX_NO ELSE T2.FAX END) AS SUPPLY_USER_FAX - ,(CASE WHEN T2.OBJID IS NULL THEN T1.EMAIL ELSE T2.EMAIL END) AS SUPPLY_USER_EMAIL - ,T1.SUPPLY_ADDRESS AS SUPPLY_ADDR - FROM ADMIN_SUPPLY_MNG AS T1 - LEFT OUTER JOIN - (SELECT * FROM (SELECT DENSE_RANK() OVER(PARTITION BY T.SUPPLY_OBJID ORDER BY T.CHARGER_NAME ASC) AS TOP, T.* - FROM SUPPLY_CHARGER_MNG T WHERE CHARGER_TYPE = '0000330' /*발주서공급처담당*/ - ) AS T WHERE TOP = 1 - ) AS T2 - ON T1.OBJID = T2.SUPPLY_OBJID::NUMERIC + ,T1.CEO_NM AS SUPPLY_USER_NAME + ,T1.VENDOR_MOBILE AS SUPPLY_USER_HP + ,T1.TEL_NO AS SUPPLY_USER_TEL + ,T1.FAX_NO AS SUPPLY_USER_FAX + ,T1.EMAIL AS SUPPLY_USER_EMAIL + ,CONCAT(COALESCE(T1.ADDR1,''), ' ', COALESCE(T1.ADDR2,'')) AS SUPPLY_ADDR + FROM CLIENT_MNG AS T1 WHERE 1=1 - AND T1.OBJID = #{PARTNER_OBJID}::NUMERIC + AND T1.OBJID::VARCHAR = #{PARTNER_OBJID}::VARCHAR + SELECT + AP.ORDER_PART_OBJID AS OBJID + ,AP.PART_OBJID + ,COALESCE(CASE WHEN POM.TYPE IN ('0001070','0001069') THEN PM.PART_NO ELSE POP.PART_NO END, PM.PART_NO, '') AS PART_NO + ,COALESCE(POP.PART_NAME, PM.PART_NAME, '') AS PART_NAME + ,COALESCE(POP.PART_NAME, PM.PART_NAME, '') AS MODEL_NAME + ,COALESCE(POM.PURCHASE_ORDER_NO, '') AS WORK_ORDER_NO + ,COALESCE(SUM(AP.RECEIPT_QTY::NUMERIC), 0) AS RECEIPT_QTY + FROM ARRIVAL_PLAN AP + LEFT JOIN PURCHASE_ORDER_PART POP ON POP.OBJID = AP.ORDER_PART_OBJID + LEFT JOIN PART_MNG PM ON PM.OBJID::VARCHAR = AP.PART_OBJID OR PM.OBJID = POP.PART_OBJID + LEFT JOIN PURCHASE_ORDER_MASTER POM ON POM.OBJID = AP.PARENT_OBJID + WHERE AP.RECEIPT_QTY IS NOT NULL + AND AP.RECEIPT_QTY::NUMERIC > 0 + AND AP.INVENTORY_STATUS = 'Y' + GROUP BY AP.ORDER_PART_OBJID, AP.PART_OBJID, POP.PART_NO, POP.PART_NAME, PM.PART_NO, PM.PART_NAME, POM.PURCHASE_ORDER_NO, POM.TYPE + ORDER BY PART_NO + + \ No newline at end of file diff --git a/WebContent/WEB-INF/classes/com/pms/mapper/quality.xml b/WebContent/WEB-INF/classes/com/pms/mapper/quality.xml index 43abae3..ddf54e4 100644 --- a/WebContent/WEB-INF/classes/com/pms/mapper/quality.xml +++ b/WebContent/WEB-INF/classes/com/pms/mapper/quality.xml @@ -660,64 +660,139 @@ @@ -731,13 +806,13 @@ , A.INSPECTION_MEMO , A.WRITER , TO_CHAR(A.REG_DATE, 'YYYY-MM-DD') AS REG_DATE - FROM PMS_QUALITY_INCOMING_INSPECTION A + FROM QUALITY_INCOMING_INSPECTION A WHERE A.OBJID = #{OBJID} - INSERT INTO PMS_QUALITY_INCOMING_INSPECTION ( + INSERT INTO QUALITY_INCOMING_INSPECTION ( OBJID , PURCHASE_ORDER_MASTER_OBJID , INSPECTOR_ID @@ -760,7 +835,7 @@ - UPDATE PMS_QUALITY_INCOMING_INSPECTION + UPDATE QUALITY_INCOMING_INSPECTION SET INSPECTOR_ID = #{INSPECTOR_ID} , INSPECTION_DATE = TO_DATE(#{INSPECTION_DATE}, 'YYYY-MM-DD') , INSPECTION_RESULT = #{INSPECTION_RESULT} @@ -768,38 +843,1239 @@ WHERE OBJID = #{OBJID} - + + + + + + + + + + + + + + + INSERT INTO PROCESS_INSPECTION_MASTER ( + OBJID + , INSPECTION_DATE + , INSPECTOR_ID + , REMARK + , WRITER + , REG_DATE + ) VALUES ( + #{OBJID} + , #{INSPECTION_DATE} + , #{INSPECTOR_ID} + , #{REMARK} + , #{WRITER} + , NOW() + ) + + + + + UPDATE PROCESS_INSPECTION_MASTER SET + INSPECTION_DATE = #{INSPECTION_DATE} + , INSPECTOR_ID = #{INSPECTOR_ID} + , REMARK = #{REMARK} + , MOD_DATE = NOW() + WHERE OBJID = #{OBJID} + + + + + INSERT INTO PROCESS_INSPECTION_DETAIL ( + OBJID + , MASTER_OBJID + , PROCESS_CD + , PROJECT_OBJID + , PART_OBJID + , PART_NO + , PART_NAME + , INSPECTION_QTY + , DEFECT_QTY + , WORK_ENV_STATUS + , MEASURING_DEVICE + , DEPT_CD + , USER_ID + , REMARK + , ACTION_STATUS + , INSPECTION_RESULT + , WRITER + , REG_DATE + ) VALUES ( + #{OBJID} + , #{MASTER_OBJID} + , #{PROCESS_CD} + , #{PROJECT_OBJID} + , #{PART_OBJID} + , #{PART_NO} + , #{PART_NAME} + , NULLIF(#{INSPECTION_QTY}, '')::NUMERIC + , NULLIF(#{DEFECT_QTY}, '')::NUMERIC + , #{WORK_ENV_STATUS} + , #{MEASURING_DEVICE} + , #{DEPT_CD} + , #{USER_ID} + , #{REMARK} + , #{ACTION_STATUS} + , #{INSPECTION_RESULT} + , #{WRITER} + , NOW() + ) + ON CONFLICT (OBJID) DO UPDATE SET + PROCESS_CD = #{PROCESS_CD} + , PROJECT_OBJID = #{PROJECT_OBJID} + , PART_OBJID = #{PART_OBJID} + , PART_NO = #{PART_NO} + , PART_NAME = #{PART_NAME} + , INSPECTION_QTY = NULLIF(#{INSPECTION_QTY}, '')::NUMERIC + , DEFECT_QTY = NULLIF(#{DEFECT_QTY}, '')::NUMERIC + , WORK_ENV_STATUS = #{WORK_ENV_STATUS} + , MEASURING_DEVICE = #{MEASURING_DEVICE} + , DEPT_CD = #{DEPT_CD} + , USER_ID = #{USER_ID} + , REMARK = #{REMARK} + , ACTION_STATUS = #{ACTION_STATUS} + , INSPECTION_RESULT = #{INSPECTION_RESULT} + , MOD_DATE = NOW() + + + + + DELETE FROM PROCESS_INSPECTION_DETAIL WHERE MASTER_OBJID = #{MASTER_OBJID} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + INSERT INTO PMS_QUALITY_SEMI_PRODUCT_INSPECTION ( + OBJID + , PROJECT_NO + , WORK_ORDER_NO + , PART_NO + , PART_NAME + , RECEIPT_QTY + , DISPOSITION_TYPE + , REMARK + , WRITER + , REG_DATE + ) VALUES ( + #{OBJID} + , #{PROJECT_NO} + , #{WORK_ORDER_NO} + , #{PART_NO} + , #{PART_NAME} + , #{RECEIPT_QTY}::NUMERIC + , #{DISPOSITION_TYPE} + , #{REMARK} + , #{WRITER} + , NOW() + ) + + + + + UPDATE PMS_QUALITY_SEMI_PRODUCT_INSPECTION + SET PROJECT_NO = #{PROJECT_NO} + , WORK_ORDER_NO = #{WORK_ORDER_NO} + , PART_NO = #{PART_NO} + , PART_NAME = #{PART_NAME} + , RECEIPT_QTY = #{RECEIPT_QTY}::NUMERIC + , DISPOSITION_TYPE = #{DISPOSITION_TYPE} + , REMARK = #{REMARK} + , WRITER = #{WRITER} + , REG_DATE = NOW() + WHERE OBJID = #{OBJID} + + + + + INSERT INTO PMS_QUALITY_SEMI_PRODUCT_INSPECTION ( + OBJID + , MODEL_NAME + , PRODUCT_TYPE + , WORK_ORDER_NO + , PART_NO + , PART_NAME + , RECEIPT_QTY + , GOOD_QTY + , DEFECT_QTY + , DEFECT_TYPE + , DEFECT_CAUSE + , RESPONSIBLE_DEPT + , PROCESS_STATUS + , INSPECTION_DATE + , INSPECTOR + , DISPOSITION_TYPE + , REMARK + , WRITER + , REG_DATE + , DATA_TYPE + , INSPECTION_GROUP_ID + ) VALUES ( + #{OBJID} + , #{MODEL_NAME} + , #{PRODUCT_TYPE} + , #{WORK_ORDER_NO} + , #{PART_NO} + , #{PART_NAME} + , COALESCE(NULLIF(#{RECEIPT_QTY}, '')::NUMERIC, 0) + , COALESCE(NULLIF(#{GOOD_QTY}, '')::NUMERIC, 0) + , COALESCE(NULLIF(#{DEFECT_QTY}, '')::NUMERIC, 0) + , #{DEFECT_TYPE} + , #{DEFECT_CAUSE} + , #{RESPONSIBLE_DEPT} + , #{PROCESS_STATUS} + , CASE WHEN #{INSPECTION_DATE} = '' THEN NULL ELSE #{INSPECTION_DATE}::DATE END + , #{INSPECTOR} + , #{DISPOSITION_TYPE} + , #{REMARK} + , #{WRITER} + , NOW() + , #{DATA_TYPE} + , #{INSPECTION_GROUP_ID} + ) + + + + + + + + + + + + + + + + INSERT INTO CUSTOMER_CS ( + OBJID + , RECEIPT_NO + , RECEIPT_DATE + , QTY + , CUSTOMER_OBJID + , MODEL_NAME + , PRODUCT_NO + , PRODUCT_NAME + , PART_NO + , PART_NAME + , PRODUCTION_DATE + , SALES_DATE + , SERIAL_NO + , MANUFACTURER + , COMPLAINT_CONTENT + , BLAME_DECISION + , STATUS + , REMARK + , WRITER + , REG_DATE + ) VALUES ( + #{OBJID} + , #{RECEIPT_NO} + , #{RECEIPT_DATE} + , NULLIF(#{QTY}, '')::NUMERIC + , #{CUSTOMER_OBJID} + , #{MODEL_NAME} + , #{PRODUCT_NO} + , #{PRODUCT_NAME} + , #{PART_NO} + , #{PART_NAME} + , #{PRODUCTION_DATE} + , #{SALES_DATE} + , #{SERIAL_NO} + , #{MANUFACTURER} + , #{COMPLAINT_CONTENT} + , #{BLAME_DECISION} + , #{STATUS} + , #{REMARK} + , #{WRITER} + , NOW() + ) + + + + + UPDATE CUSTOMER_CS SET + RECEIPT_DATE = #{RECEIPT_DATE} + , QTY = NULLIF(#{QTY}, '')::NUMERIC + , CUSTOMER_OBJID = #{CUSTOMER_OBJID} + , MODEL_NAME = #{MODEL_NAME} + , PRODUCT_NO = #{PRODUCT_NO} + , PRODUCT_NAME = #{PRODUCT_NAME} + , PART_NO = #{PART_NO} + , PART_NAME = #{PART_NAME} + , PRODUCTION_DATE = #{PRODUCTION_DATE} + , SALES_DATE = #{SALES_DATE} + , SERIAL_NO = #{SERIAL_NO} + , MANUFACTURER = #{MANUFACTURER} + , COMPLAINT_CONTENT = #{COMPLAINT_CONTENT} + , MOD_DATE = NOW() + WHERE OBJID = #{OBJID} + + + + + UPDATE CUSTOMER_CS SET + ACTION_CONTENT = #{ACTION_CONTENT} + , BLAME_DECISION = #{BLAME_DECISION} + , ACTION_DATE = #{ACTION_DATE} + , ACTION_USER_ID = #{ACTION_USER_ID} + , STATUS = #{STATUS} + , REMARK = #{REMARK} + , MOD_DATE = NOW() + WHERE OBJID = #{OBJID} + + + + + + + + + + + + + + + + INSERT INTO PMS_QUALITY_ECR ( + OBJID + , ECR_NO + , REQUEST_DATE + , REQUESTER_ID + , PART_OBJID + , PART_NO + , PART_NAME + , ISSUE_CONTENT + , DUE_DATE + , ACTION_DEPT + , ACTION_MANAGER_ID + , ATTACH_FILE_OBJID + , REMARK + , WRITER + , REG_DATE + ) VALUES ( + #{OBJID} + , #{ECR_NO} + , #{REQUEST_DATE} + , #{REQUESTER_ID} + , #{PART_OBJID} + , #{PART_NO} + , #{PART_NAME} + , #{ISSUE_CONTENT} + , #{DUE_DATE} + , #{ACTION_DEPT} + , #{ACTION_MANAGER_ID} + , #{ATTACH_FILE_OBJID} + , #{REMARK} + , #{WRITER} + , NOW() + ) + + + + + UPDATE PMS_QUALITY_ECR SET + REQUEST_DATE = #{REQUEST_DATE} + , REQUESTER_ID = #{REQUESTER_ID} + , PART_OBJID = #{PART_OBJID} + , PART_NO = #{PART_NO} + , PART_NAME = #{PART_NAME} + , ISSUE_CONTENT = #{ISSUE_CONTENT} + , DUE_DATE = #{DUE_DATE} + , ACTION_DEPT = #{ACTION_DEPT} + , ACTION_MANAGER_ID = #{ACTION_MANAGER_ID} + , REMARK = #{REMARK} + , MODIFIER = #{WRITER} + , MOD_DATE = NOW() + WHERE OBJID = #{OBJID} + + + + + UPDATE PMS_QUALITY_ECR SET + ACTION_USER_ID = #{ACTION_USER_ID} + , ACTION_CONTENT = #{ACTION_CONTENT} + , COMPLETE_DATE = #{COMPLETE_DATE} + , MODIFIER = #{MODIFIER} + , MOD_DATE = NOW() + WHERE OBJID = #{OBJID} + + + + + + + + + + + + + INSERT INTO INCOMING_INSPECTION_DETAIL ( + OBJID + , INVENTORY_IN_OBJID + , PURCHASE_ORDER_MASTER_OBJID + , INSPECTION_DATE + , INSPECTOR_ID + , INSPECTION_TYPE + , INSPECTION_YN + , DEFECT_TYPE + , DEFECT_REASON + , ACTION_STATUS + , INSPECTION_QTY + , DEFECT_QTY + , INSPECTION_RESULT + , ATTACH_FILE_OBJID + , REMARK + , WRITER + , REG_DATE + ) VALUES ( + #{NEW_OBJID} + , #{OBJID} + , #{PURCHASE_ORDER_MASTER_OBJID} + , #{INSPECTION_DATE} + , #{INSPECTOR_ID} + , #{INSPECTION_TYPE} + , #{INSPECTION_YN} + , #{DEFECT_TYPE} + , #{DEFECT_REASON} + , #{ACTION_STATUS} + , #{INSPECTION_QTY} + , #{DEFECT_QTY} + , #{INSPECTION_RESULT} + , #{ATTACH_FILE_OBJID} + , #{REMARK} + , #{WRITER} + , 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} + , MODIFIER = #{WRITER} + , MOD_DATE = NOW() + + \ No newline at end of file diff --git a/WebContent/WEB-INF/view/quality/semiProductInspectionFormPopUp.jsp b/WebContent/WEB-INF/view/quality/semiProductInspectionFormPopUp.jsp index 489a000..0035d7e 100644 --- a/WebContent/WEB-INF/view/quality/semiProductInspectionFormPopUp.jsp +++ b/WebContent/WEB-INF/view/quality/semiProductInspectionFormPopUp.jsp @@ -6,85 +6,669 @@ <%@include file= "/init.jsp" %> <% String menuObjId = request.getParameter("menuObjId"); -String menuName = CommonUtils.getMenuName(menuObjId, "반제품검사 등록"); +String menuName = CommonUtils.getMenuName(menuObjId, "반제품검사"); +String OBJID = CommonUtils.checkNull(request.getParameter("OBJID")); +String INSPECTION_GROUP_ID = CommonUtils.checkNull(request.getParameter("INSPECTION_GROUP_ID")); +String WORK_ORDER_NO = CommonUtils.checkNull(request.getParameter("WORK_ORDER_NO")); +String actionType = CommonUtils.checkNull(request.getParameter("actionType")); +Map info = (Map)request.getAttribute("info"); + +// 로그인 사용자 정보 +PersonBean person = (PersonBean)session.getAttribute(Constants.PERSON_BEAN); +String loginUserName = CommonUtils.checkNull(person.getUserName()); +String loginUserId = CommonUtils.checkNull(person.getUserId()); %> - <%=Constants.SYSTEM_NAME%> + <%=Constants.SYSTEM_NAME%> + + + + + + + + + - - -
- -
- diff --git a/WebContent/WEB-INF/view/quality/semiProductInspectionList.jsp b/WebContent/WEB-INF/view/quality/semiProductInspectionList.jsp index ef66061..9f2d387 100644 --- a/WebContent/WEB-INF/view/quality/semiProductInspectionList.jsp +++ b/WebContent/WEB-INF/view/quality/semiProductInspectionList.jsp @@ -18,15 +18,45 @@ String menuName = CommonUtils.getMenuName(menuObjId, "반제품검사 관리"); @@ -231,7 +219,6 @@ function fn_excelDownload(){
-
diff --git a/WebContent/WEB-INF/view/quality/processInspectionList.jsp b/WebContent/WEB-INF/view/quality/processInspectionList.jsp index 4fc59a7..8f83344 100644 --- a/WebContent/WEB-INF/view/quality/processInspectionList.jsp +++ b/WebContent/WEB-INF/view/quality/processInspectionList.jsp @@ -79,11 +79,6 @@ $(document).ready(function(){ fn_registPopUp(); }); - // 엑셀 다운로드 - $("#btnExcel").click(function(){ - fn_excelDownload(); - }); - fn_search(); }); @@ -147,13 +142,6 @@ function fn_registPopUp(){ window.open(url, "processInspectionPopUp", "width=" + popup_width + ",height=" + popup_height + ",scrollbars=yes,resizable=yes"); } -// 엑셀 다운로드 -function fn_excelDownload(){ - var form = document.form1; - form.action = "/quality/processInspectionExcelDownload.do"; - form.submit(); - form.action = ""; -} @@ -172,7 +160,6 @@ function fn_excelDownload(){
-
diff --git a/WebContent/WEB-INF/view/quality/semiProductInspectionExcel.jsp b/WebContent/WEB-INF/view/quality/semiProductInspectionExcel.jsp new file mode 100644 index 0000000..3851585 --- /dev/null +++ b/WebContent/WEB-INF/view/quality/semiProductInspectionExcel.jsp @@ -0,0 +1,96 @@ +<%@ page isThreadSafe = "true" %> +<%@ page buffer="256kb" %> +<%@ page autoFlush = "true" %> +<%@ page contentType="application/vnd.ms-excel;charset=UTF-8" %> +<%@ page import="com.pms.common.utils.*"%> +<%@ page import="java.util.*" %> +<% +java.text.SimpleDateFormat frm= new java.text.SimpleDateFormat ("yyyy_MM_dd_HH_mm"); +Calendar cal = Calendar.getInstance(); +String todayKor = frm.format(cal.getTime()); + +String excelName = "품질관리_반제품검사관리"; +String encodeName = excelName + todayKor + ".xls"; +String fileName = java.net.URLEncoder.encode(encodeName,"UTF-8"); + +response.setHeader("Content-Disposition", "attachment;filename=" + fileName); +response.setHeader("Content-Description", "JSP Generated Data"); +List list = (List)request.getAttribute("LIST"); +%> + + + + + +<%=Constants.SYSTEM_NAME%> + + +
+ +
+ + + diff --git a/WebContent/WEB-INF/view/quality/semiProductInspectionList.jsp b/WebContent/WEB-INF/view/quality/semiProductInspectionList.jsp index 9f2d387..f51747a 100644 --- a/WebContent/WEB-INF/view/quality/semiProductInspectionList.jsp +++ b/WebContent/WEB-INF/view/quality/semiProductInspectionList.jsp @@ -76,7 +76,7 @@ $(document).ready(function(){ fn_registPopUp(); }); - // 엑셀 다운로드 + // 엑셀 다운로드 (원본 데이터) $("#btnExcel").click(function(){ fn_excelDownload(); }); @@ -84,6 +84,153 @@ $(document).ready(function(){ fn_search(); }); +// 엑셀 다운로드 (원본 데이터 - 외 N건 풀어서) +function fn_excelDownload(){ + // 서버에서 원본 데이터 가져오기 + var params = { + search_model_name: $("#search_model_name").val() || "", + search_work_order_no: $("#search_work_order_no").val() || "", + search_part_no: $("#search_part_no").val() || "", + search_part_name: $("#search_part_name").val() || "", + search_inspection_date: $("#search_inspection_date").val() || "", + search_writer: $("#search_writer").val() || "" + }; + + $.ajax({ + url: "/quality/getSemiProductInspectionListForExcel.do", + type: "POST", + data: params, + dataType: "json", + success: function(result){ + if(result && result.list && result.list.length > 0){ + createExcelFile(result.list); + } else { + Swal.fire("다운로드할 데이터가 없습니다."); + } + }, + error: function(xhr, status, error){ + console.error("엑셀 데이터 조회 실패:", error); + Swal.fire("엑셀 데이터 조회 중 오류가 발생했습니다."); + } + }); +} + +// ExcelJS로 원본 데이터 엑셀 파일 생성 (공통 스타일 적용) +async function createExcelFile(data){ + var pageTitle = "반제품검사관리"; + const workbook = new ExcelJS.Workbook(); + const worksheet = workbook.addWorksheet(pageTitle); + + // 헤더 설정 + var headers = ["No", "품명(모델명)", "제품구분", "작업지시번호", "부품품번", "부품명", + "입고수량 합계", "양품수량 합계", "불량수량 합계", "불량율(%)", "재생수량 합계", "최종양품수량 합계", + "검사일", "검사자", "불량유형", "불량원인", "귀책부서", "처리현황", "처리결과", "비고"]; + + // 열 너비 설정 + var colWidths = [6, 25, 12, 18, 20, 25, 15, 15, 15, 12, 15, 18, 12, 12, 15, 15, 12, 12, 12, 20]; + colWidths.forEach(function(width, idx){ + worksheet.getColumn(idx + 1).width = width; + }); + + // 제목 행 추가 + worksheet.mergeCells('A1:T1'); + var titleCell = worksheet.getCell('A1'); + titleCell.value = pageTitle; + titleCell.font = { size: 16, bold: true }; + titleCell.alignment = { vertical: 'middle', horizontal: 'center' }; + worksheet.getRow(1).height = 30; + + // 빈 행 추가 + worksheet.addRow([]); + + // 헤더 행 추가 (3행) + var headerRow = worksheet.addRow(headers); + + // 헤더 스타일 (공통 스타일: 파란색 배경, 흰색 글자) + headerRow.eachCell(function(cell){ + cell.fill = { + type: 'pattern', + pattern: 'solid', + fgColor: { argb: 'FF4472C4' } // 파란색 + }; + cell.font = { + color: { argb: 'FFFFFFFF' }, // 흰색 글자 + bold: true + }; + cell.alignment = { + vertical: 'middle', + horizontal: 'center', + wrapText: true + }; + cell.border = { + top: { style: 'thin' }, + left: { style: 'thin' }, + bottom: { style: 'thin' }, + right: { style: 'thin' } + }; + }); + headerRow.height = 25; + + // 데이터 추가 + data.forEach(function(item, index){ + var row = worksheet.addRow([ + index + 1, + item.model_name || item.MODEL_NAME || "", + item.product_type || item.PRODUCT_TYPE || "", + item.work_order_no || item.WORK_ORDER_NO || "", + item.part_no || item.PART_NO || "", + item.part_name || item.PART_NAME || "", + item.receipt_qty || item.RECEIPT_QTY || 0, + item.good_qty || item.GOOD_QTY || 0, + item.defect_qty || item.DEFECT_QTY || 0, + item.defect_rate || item.DEFECT_RATE || 0, + item.regeneration_qty || item.REGENERATION_QTY || 0, + item.final_good_qty || item.FINAL_GOOD_QTY || 0, + item.inspection_date || item.INSPECTION_DATE || "", + item.writer_name || item.WRITER_NAME || "", + item.defect_type || item.DEFECT_TYPE || "", + item.defect_cause || item.DEFECT_CAUSE || "", + item.responsible_dept || item.RESPONSIBLE_DEPT || "", + item.process_status || item.PROCESS_STATUS || "", + item.disposition_type || item.DISPOSITION_TYPE || "", + item.remark || item.REMARK || "" + ]); + + // 데이터 행 스타일 (테두리) + row.eachCell(function(cell, colNumber){ + cell.border = { + top: { style: 'thin' }, + left: { style: 'thin' }, + bottom: { style: 'thin' }, + right: { style: 'thin' } + }; + // 숫자 컬럼 오른쪽 정렬 (7~12번 컬럼: 수량, 불량율) + if(colNumber >= 7 && colNumber <= 12){ + cell.alignment = { horizontal: 'right' }; + // 숫자에 천단위 구분자 (불량율 제외) + if(colNumber !== 10 && typeof cell.value === 'number'){ + cell.numFmt = '#,##0'; + } + } else if(colNumber === 1){ + cell.alignment = { horizontal: 'center' }; + } + }); + }); + + // 파일명 생성 + var date = new Date(); + var currentDate = date.getFullYear() + + ("0" + (date.getMonth() + 1)).slice(-2) + + ("0" + date.getDate()).slice(-2) + "_" + + ("0" + date.getHours()).slice(-2) + + ("0" + date.getMinutes()).slice(-2); + var fileName = pageTitle + "_" + currentDate + ".xlsx"; + + // 다운로드 + const buffer = await workbook.xlsx.writeBuffer(); + saveAs(new Blob([buffer]), fileName); +} + // 컬럼: 품명(모델명), 작업지시번호, 부품품번, 부품명, 입고수량 합계, 양품수량 합계, 불량수량 합계, 불량율, 재생수량 합계, 최종 양품수량 합계, 검사일, 검사자 var columns = [ {headerHozAlign:'center', hozAlign:'left', minWidth:150, widthGrow:2, title:'품명(모델명)', field:'MODEL_NAME'}, @@ -171,13 +318,6 @@ function fn_registPopUp(){ hiddenForm.submit(); } -// 엑셀 다운로드 -function fn_excelDownload(){ - var form = document.form1; - form.action = "/quality/semiProductInspectionExcelDownload.do"; - form.submit(); - form.action = ""; -} @@ -193,6 +333,7 @@ function fn_excelDownload(){
+
@@ -202,7 +343,7 @@ function fn_excelDownload(){
- +
diff --git a/src/com/pms/controller/QualityController.java b/src/com/pms/controller/QualityController.java index c65ed81..a447ffd 100644 --- a/src/com/pms/controller/QualityController.java +++ b/src/com/pms/controller/QualityController.java @@ -469,7 +469,10 @@ public class QualityController { */ @RequestMapping("/quality/semiProductInspectionList.do") public String semiProductInspectionList(HttpServletRequest request, @RequestParam Map paramMap){ + String actionType = CommonUtils.checkNull(paramMap.get("actionType")); + System.out.println("[DEBUG] semiProductInspectionList actionType: " + actionType); Map code_map = new HashMap(); + List list = null; try { // 품명(모델명) 드롭박스 code_map.put("model_name", commonService.bizMakeOptionList("", (String)paramMap.get("search_model_name"), "quality.getSemiProductModelNameList")); @@ -482,10 +485,16 @@ public class QualityController { // 검사자 드롭박스 code_map.put("writer", commonService.bizMakeOptionList("", (String)paramMap.get("search_writer"), "quality.getSemiProductWriterList")); request.setAttribute("code_map", code_map); + + // 엑셀 다운로드 + if("excel".equals(actionType)){ + list = commonService.selectList("quality.getSemiProductInspectionListForExcel", request, paramMap); + request.setAttribute("LIST", list); + } } catch(Exception e) { e.printStackTrace(); } - return "/quality/semiProductInspectionList"; + return "/quality/semiProductInspectionList" + ("excel".equals(actionType) ? "Excel" : ""); } /** @@ -528,7 +537,7 @@ public class QualityController { } /** - * 반제품검사 엑셀 다운로드 + * 반제품검사 엑셀 다운로드 (JSP 방식) */ @RequestMapping("/quality/semiProductInspectionExcelDownload.do") public String semiProductInspectionExcelDownload(HttpServletRequest request, @RequestParam Map paramMap){ @@ -537,6 +546,18 @@ public class QualityController { return "/quality/semiProductInspectionExcel"; } + /** + * 반제품검사 엑셀 데이터 조회 (AJAX JSON) + */ + @ResponseBody + @RequestMapping("/quality/getSemiProductInspectionListForExcel.do") + public Map getSemiProductInspectionListForExcel(HttpServletRequest request, @RequestParam Map paramMap){ + Map result = new HashMap(); + List list = service.getSemiProductInspectionListForExcel(paramMap); + result.put("list", list); + return result; + } + // ===================================================== // 고객 CS 관리 // ===================================================== diff --git a/src/com/pms/mapper/quality.xml b/src/com/pms/mapper/quality.xml index c6eb1af..4d6357e 100644 --- a/src/com/pms/mapper/quality.xml +++ b/src/com/pms/mapper/quality.xml @@ -1340,61 +1340,96 @@ ORDER BY MIN(T.INSPECTION_DATE) DESC, T.INSPECTION_GROUP_ID - + From 7e4f6599248140a7d854c6c09c160cae8bf0cc0a Mon Sep 17 00:00:00 2001 From: leeheejin Date: Tue, 16 Dec 2025 17:08:08 +0900 Subject: [PATCH 05/10] =?UTF-8?q?=EC=97=91=EC=85=80=EC=AA=BD=20=EC=BB=A4?= =?UTF-8?q?=EB=B0=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../view/quality/semiProductInspectionFormPopUp.jsp | 2 +- .../WEB-INF/view/quality/semiProductInspectionList.jsp | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/WebContent/WEB-INF/view/quality/semiProductInspectionFormPopUp.jsp b/WebContent/WEB-INF/view/quality/semiProductInspectionFormPopUp.jsp index 0035d7e..4ea2d53 100644 --- a/WebContent/WEB-INF/view/quality/semiProductInspectionFormPopUp.jsp +++ b/WebContent/WEB-INF/view/quality/semiProductInspectionFormPopUp.jsp @@ -244,7 +244,7 @@ var partNoList = []; // 부품품번 목록 var partNameList = []; // 부품명 목록 // 코드 목록 (드롭박스용) -var productTypeList = ["Machine", "A/S", "D/S", "S/A", "기타"]; // 제품구분 +var productTypeList = ["Machine", "A/S", "D/S", "B/S", "C/T", "A/C", "W/M", "기타"]; // 제품구분 var defectTypeList = ["외관불량", "치수불량", "기능불량", "재료불량", "조립불량", "도장불량", "용접불량", "기타"]; // 불량유형 var defectCauseList = ["작업자 실수", "설비 이상", "자재 불량", "설계 오류", "공정 이상", "환경 요인", "기타"]; // 불량원인 var responsibleDeptList = ["사용자 정보(부서)", "구매", "생산기술", "제조1팀", "제조2팀", "제조3팀", "연구소", "외주업체", "품질"]; // 귀책부서 diff --git a/WebContent/WEB-INF/view/quality/semiProductInspectionList.jsp b/WebContent/WEB-INF/view/quality/semiProductInspectionList.jsp index f51747a..1dd4449 100644 --- a/WebContent/WEB-INF/view/quality/semiProductInspectionList.jsp +++ b/WebContent/WEB-INF/view/quality/semiProductInspectionList.jsp @@ -274,8 +274,8 @@ function fn_search(){ // 검사일 클릭 시 검사결과 확인/수정 팝업 function fn_openInspectionPopUp(rowData){ - var popup_width = 1000; - var popup_height = 600; + var popup_width = 1500; + var popup_height = 900; var hiddenForm = document.hiddenForm; var target = "semiProductInspectionPopUp"; var url = "/quality/semiProductInspectionFormPopUp.do"; @@ -297,8 +297,8 @@ function fn_openInspectionPopUp(rowData){ // 반제품검사 등록 팝업 (신규 등록) function fn_registPopUp(){ - var popup_width = 1200; - var popup_height = 700; + var popup_width = 1800; + var popup_height = 1050; var hiddenForm = document.hiddenForm; var target = "semiProductInspectionPopUp"; var url = "/quality/semiProductInspectionFormPopUp.do"; From fa7797fdd9e97a59dee9cf91ba478d6dfb83653b Mon Sep 17 00:00:00 2001 From: leeheejin Date: Tue, 16 Dec 2025 17:59:55 +0900 Subject: [PATCH 06/10] =?UTF-8?q?=ED=8C=8C=EC=9D=BC=EC=A0=80=EC=9E=A5?= =?UTF-8?q?=EB=8F=84=20=ED=99=95=EC=9D=B8=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../classes/com/pms/mapper/quality.xml | 314 +++++++++- .../semiProductInspectionFormPopUp.jsp | 583 ++++++++++++------ src/com/pms/mapper/quality.xml | 45 ++ src/com/pms/service/QualityService.java | 113 +++- 4 files changed, 828 insertions(+), 227 deletions(-) diff --git a/WebContent/WEB-INF/classes/com/pms/mapper/quality.xml b/WebContent/WEB-INF/classes/com/pms/mapper/quality.xml index 4d6357e..5179bf6 100644 --- a/WebContent/WEB-INF/classes/com/pms/mapper/quality.xml +++ b/WebContent/WEB-INF/classes/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,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 @@ -1497,6 +1563,7 @@ + + + @@ -2062,6 +2224,8 @@ OBJID , INVENTORY_IN_OBJID , PURCHASE_ORDER_MASTER_OBJID + , REQUEST_DATE + , REQUEST_USER_ID , INSPECTION_DATE , INSPECTOR_ID , INSPECTION_TYPE @@ -2080,6 +2244,8 @@ #{NEW_OBJID} , #{OBJID} , #{PURCHASE_ORDER_MASTER_OBJID} + , #{REQUEST_DATE} + , #{REQUEST_USER_ID} , #{INSPECTION_DATE} , #{INSPECTOR_ID} , #{INSPECTION_TYPE} @@ -2096,20 +2262,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/WebContent/WEB-INF/view/quality/semiProductInspectionFormPopUp.jsp b/WebContent/WEB-INF/view/quality/semiProductInspectionFormPopUp.jsp index 4ea2d53..924e006 100644 --- a/WebContent/WEB-INF/view/quality/semiProductInspectionFormPopUp.jsp +++ b/WebContent/WEB-INF/view/quality/semiProductInspectionFormPopUp.jsp @@ -18,6 +18,8 @@ PersonBean person = (PersonBean)session.getAttribute(Constants.PERSON_BEAN); String loginUserName = CommonUtils.checkNull(person.getUserName()); String loginUserId = CommonUtils.checkNull(person.getUserId()); %> + + @@ -48,7 +50,8 @@ String loginUserId = CommonUtils.checkNull(person.getUserId()); justify-content: space-between; align-items: center; padding: 10px 15px; - background: #f5f5f5; + background: #4a5568; + color: white; border-bottom: 1px solid #ddd; } @@ -62,57 +65,59 @@ String loginUserId = CommonUtils.checkNull(person.getUserId()); display: flex; flex: 1; overflow: hidden; + gap: 10px; + padding: 10px; } - /* 왼쪽 영역 */ - .left_section { - width: 50%; + /* 좌측 패널 (35%) */ + .left_panel { + width: 35%; display: flex; flex-direction: column; - border-right: 2px solid #ccc; - padding: 10px; - box-sizing: border-box; + border: 1px solid #ddd; + border-radius: 4px; + overflow: hidden; } - /* 오른쪽 영역 */ - .right_section { - width: 50%; + /* 우측 패널 (65%) */ + .right_panel { + width: 65%; display: flex; flex-direction: column; - padding: 10px; - box-sizing: border-box; + border: 1px solid #ddd; + border-radius: 4px; + overflow: hidden; } - .section_header { + .panel_header { display: flex; justify-content: space-between; align-items: center; - margin-bottom: 8px; - padding-bottom: 5px; - border-bottom: 1px solid #e0e0e0; - } - - .section_header h3 { - margin: 0; - font-size: 14px; + padding: 8px 12px; + background: #4a5568; + color: white; font-weight: bold; - color: #333; + font-size: 13px; } - .section_header .btn_area { + .panel_header .btn_group { display: flex; gap: 5px; } - .grid_wrap { + .panel_body { flex: 1; - overflow: hidden; + overflow: auto; + } + + .grid_wrap { + height: 100%; } /* 버튼 스타일 */ .btn_add { - padding: 4px 12px; - background: #4CAF50; + padding: 4px 10px; + background: #48bb78; color: white; border: none; border-radius: 3px; @@ -121,12 +126,12 @@ String loginUserId = CommonUtils.checkNull(person.getUserId()); } .btn_add:hover { - background: #45a049; + background: #38a169; } .btn_del { - padding: 4px 12px; - background: #f44336; + padding: 4px 10px; + background: #e53e3e; color: white; border: none; border-radius: 3px; @@ -135,12 +140,12 @@ String loginUserId = CommonUtils.checkNull(person.getUserId()); } .btn_del:hover { - background: #da190b; + background: #c53030; } .btn_save { padding: 6px 20px; - background: #2196F3; + background: #3182ce; color: white; border: none; border-radius: 3px; @@ -150,12 +155,12 @@ String loginUserId = CommonUtils.checkNull(person.getUserId()); } .btn_save:hover { - background: #1976D2; + background: #2b6cb0; } .btn_close { padding: 6px 20px; - background: #757575; + background: #718096; color: white; border: none; border-radius: 3px; @@ -165,7 +170,7 @@ String loginUserId = CommonUtils.checkNull(person.getUserId()); } .btn_close:hover { - background: #616161; + background: #4a5568; } /* 헤더 버튼 영역 */ @@ -174,9 +179,20 @@ String loginUserId = CommonUtils.checkNull(person.getUserId()); gap: 8px; } - /* Tabulator 편집 가능 셀 스타일 */ - .tabulator .tabulator-cell.editable-cell { - background-color: #fffde7; + /* 선택된 행 하이라이트 */ + .tabulator-row.tabulator-selected { + background-color: #e3f2fd !important; + } + + /* 비활성화 안내 */ + .disabled_notice { + display: flex; + align-items: center; + justify-content: center; + height: 100%; + color: #999; + font-size: 14px; + background: #f5f5f5; } /* Select2 스타일 */ @@ -202,54 +218,69 @@ String loginUserId = CommonUtils.checkNull(person.getUserId());