From 14ba98167551de747bde72bd529416cb14f0d63a Mon Sep 17 00:00:00 2001 From: chpark Date: Mon, 9 Feb 2026 17:07:28 +0900 Subject: [PATCH] =?UTF-8?q?=ED=92=88=EB=AA=A9=20=EC=A0=95=EB=B3=B4=20API?= =?UTF-8?q?=20=EC=97=B0=EA=B3=84=EA=B3=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../WEB-INF/classes/com/pms/mapper/admin.xml | 2 +- .../WEB-INF/classes/com/pms/mapper/part.xml | 2 - .../classes/com/pms/mapper/salesMng.xml | 1578 ++++++++++++++++- .../salesmgmt/mapper/salesNcollectMgmt.xml | 72 +- .../admin/warehouseList/warehouseMngList.jsp | 54 +- .../WEB-INF/view/partMng/partMngTempList.jsp | 34 +- src/com/pms/mapper/part.xml | 31 - src/com/pms/mapper/partMng.xml | 29 + src/com/pms/service/BatchService.java | 4 +- src/com/pms/service/PartMngService.java | 22 + 10 files changed, 1686 insertions(+), 142 deletions(-) diff --git a/WebContent/WEB-INF/classes/com/pms/mapper/admin.xml b/WebContent/WEB-INF/classes/com/pms/mapper/admin.xml index c31397c..1bf6bd3 100644 --- a/WebContent/WEB-INF/classes/com/pms/mapper/admin.xml +++ b/WebContent/WEB-INF/classes/com/pms/mapper/admin.xml @@ -2689,7 +2689,7 @@ INSERT INTO OEM_MNG VALUES ( #{objid}::numeric, - LPAD(nextval('seq_comm_code')::varchar,7,'0'), + LPAD((COALESCE((SELECT MAX(CODE_ID::numeric) FROM COMM_CODE WHERE CODE_ID ~ '^[0-9]+$'), 0) + 1)::varchar, 7, '0'), #{parentCodeId}, #{codeName}, #{id}, diff --git a/WebContent/WEB-INF/classes/com/pms/mapper/part.xml b/WebContent/WEB-INF/classes/com/pms/mapper/part.xml index 2799c9c..e6bdfea 100644 --- a/WebContent/WEB-INF/classes/com/pms/mapper/part.xml +++ b/WebContent/WEB-INF/classes/com/pms/mapper/part.xml @@ -3394,6 +3394,4 @@ ORDER BY PATH, AND PART_NO = #{OBJID} ) T - - \ No newline at end of file diff --git a/WebContent/WEB-INF/classes/com/pms/mapper/salesMng.xml b/WebContent/WEB-INF/classes/com/pms/mapper/salesMng.xml index 3009f6a..3061ba6 100644 --- a/WebContent/WEB-INF/classes/com/pms/mapper/salesMng.xml +++ b/WebContent/WEB-INF/classes/com/pms/mapper/salesMng.xml @@ -613,7 +613,7 @@ VALUES ( #{SALES_REQUEST_MASTER_OBJID }, - (SELECT 'R'||TO_CHAR(NOW(),'YYYYMMDD')||'-'||LPAD((COALESCE(MAX(SUBSTR(REQUEST_MNG_NO,11,13)),'0')::INTEGER+1)::TEXT,3,'0') FROM SALES_REQUEST_MASTER WHERE DOC_TYPE = 'PURCHASE_REQUEST' OR DOC_TYPE IS NULL), + (SELECT 'R'||TO_CHAR(NOW(),'YYYYMMDD')||'-'||LPAD((COALESCE(MAX(SUBSTR(REQUEST_MNG_NO,11,13)),'0')::INTEGER+1)::TEXT,3,'0') FROM SALES_REQUEST_MASTER WHERE DOC_TYPE IN ('PURCHASE_REQUEST', 'PURCHASE_REG') OR DOC_TYPE IS NULL), #{REQUEST_CD }, #{PROJECT_NO }, #{RELEASE }, @@ -633,7 +633,7 @@ VALUES #{AREA_CD }, #{CUSTOMER_OBJID }, #{PAID_TYPE }, - 'PURCHASE_REQUEST' + COALESCE(NULLIF(#{DOC_TYPE}, ''), 'PURCHASE_REQUEST') ) ON CONFLICT (OBJID) DO UPDATE SET @@ -721,7 +721,8 @@ VALUES COALESCE(NULLIF(SRM.AREA_CD, ''), SM.AREA_CD) AS AREA_CD, -- 국내/해외 COALESCE(NULLIF(SRM.CUSTOMER_OBJID, ''), SM.OBJID::VARCHAR) AS CUSTOMER_OBJID, -- 고객사 COALESCE(NULLIF(SRM.PAID_TYPE, ''), CM.PAID_TYPE) AS PAID_TYPE, -- 유/무상 - CM.CATEGORY_CD AS CATEGORY_CD -- 제품유형 코드 ID (드롭다운 선택용) + CM.CATEGORY_CD AS CATEGORY_CD, -- 제품유형 코드 ID (드롭다운 선택용) + SRM.DOC_TYPE -- 문서유형 (PURCHASE_REQUEST, PURCHASE_REG, PROPOSAL 등) -- 품번/품명: 첫 번째 품목 + 외 N건 형태 - ) - VALUES + ) + VALUES ( #{SALES_REQUEST_PART_OBJID }, #{SALES_BOM_QTY_OBJID }, @@ -788,8 +789,8 @@ VALUES #{STATUS} ) ON CONFLICT (OBJID) DO - UPDATE - SET + UPDATE + SET SALES_BOM_QTY_OBJID = #{SALES_BOM_QTY_OBJID }, PART_OBJID = #{PART_OBJID }, SALES_REQUEST_MASTER_OBJID = #{SALES_REQUEST_MASTER_OBJID}, @@ -989,11 +990,24 @@ VALUES -- 문서유형 (PURCHASE_REQUEST: 구매요청서, PROPOSAL: 품의서) SRM.DOC_TYPE, - -- 구매요청서 작성 여부 (SALES_REQUEST_PART에 DOC_TYPE이 PURCHASE_REQUEST인 데이터가 있으면 'Y') - (SELECT CASE WHEN COUNT(*) > 0 THEN 'Y' ELSE 'N' END - FROM SALES_REQUEST_PART - WHERE SALES_REQUEST_MASTER_OBJID = SRM.OBJID - AND (DOC_TYPE = 'PURCHASE_REQUEST' OR DOC_TYPE IS NULL)) AS HAS_PURCHASE_REQUEST, + -- 구매요청서 작성 여부 + -- M-BOM 기반이면 MBOM_HEADER_OBJID가 있으므로 'Y' + -- 수동 작성이면 SALES_REQUEST_PART에 데이터가 있으면 'Y' + CASE + WHEN SRM.MBOM_HEADER_OBJID IS NOT NULL AND SRM.MBOM_HEADER_OBJID::VARCHAR != '' THEN 'Y' + WHEN (SELECT COUNT(*) FROM SALES_REQUEST_PART WHERE SALES_REQUEST_MASTER_OBJID = SRM.OBJID AND (DOC_TYPE = 'PURCHASE_REQUEST' OR DOC_TYPE IS NULL)) > 0 THEN 'Y' + ELSE 'N' + END AS HAS_PURCHASE_REQUEST, + + -- 견적요청서 존재 여부 (QUOTATION_REQUEST_MASTER에 데이터가 있으면 'Y') + COALESCE((SELECT CASE WHEN COUNT(*) > 0 THEN 'Y' ELSE 'N' END + FROM QUOTATION_REQUEST_MASTER + WHERE SALES_REQUEST_MASTER_OBJID::VARCHAR = SRM.OBJID::VARCHAR), 'N') AS HAS_QUOTATION_REQUEST, + + -- 견적요청서 개수 + COALESCE((SELECT COUNT(*) + FROM QUOTATION_REQUEST_MASTER + WHERE SALES_REQUEST_MASTER_OBJID::VARCHAR = SRM.OBJID::VARCHAR), 0) AS QUOTATION_REQUEST_COUNT, -- M-BOM 관련 컬럼 SRM.MBOM_HEADER_OBJID, @@ -1117,6 +1131,15 @@ VALUES (SELECT O.UNIT_NO || '-' || O.TASK_NAME FROM PMS_WBS_TASK AS O WHERE O.OBJID = SRM.UNIT_NAME) AS UNIT_CODE_NAME, SRM.STATUS, CASE + -- PURCHASE_REG(구매요청서작성) 페이지용 상태 + WHEN SRM.DOC_TYPE = 'PURCHASE_REG' THEN + CASE + -- 품의서 생성 여부 확인 (PROPOSAL 타입의 SALES_REQUEST_MASTER가 연결되어 있는지) + WHEN EXISTS (SELECT 1 FROM SALES_REQUEST_MASTER P WHERE P.DOC_TYPE = 'PROPOSAL' AND P.PROJECT_NO = SRM.OBJID::VARCHAR) THEN '품의서생성' + WHEN SRM.STATUS = 'confirmed' THEN '확정' + ELSE '작성중' + END + -- 기존 PURCHASE_REQUEST용 상태 WHEN ((SELECT COUNT(1) FROM PURCHASE_ORDER_MASTER AS O WHERE O.SALES_REQUEST_OBJID IN (SRM.OBJID)) >= (SELECT COUNT(1) FROM SALES_REQUEST_PART AS SRP WHERE srp.SALES_REQUEST_master_OBJID = SRM.OBJID )) and ((SELECT COUNT(1) FROM PURCHASE_ORDER_MASTER AS O WHERE O.SALES_REQUEST_OBJID IN (SRM.OBJID)) > 0) THEN '발주완료' WHEN ((SELECT COUNT(1) FROM PURCHASE_ORDER_MASTER AS O WHERE O.SALES_REQUEST_OBJID IN (SRM.OBJID)) < (SELECT COUNT(1) FROM SALES_REQUEST_PART AS SRP WHERE srp.SALES_REQUEST_master_OBJID = SRM.OBJID )) and ((SELECT COUNT(1) FROM PURCHASE_ORDER_MASTER AS O WHERE O.SALES_REQUEST_OBJID IN (SRM.OBJID)) > 0) THEN '발주부분완료' WHEN SRM.STATUS = 'create' THEN '등록' @@ -1125,7 +1148,7 @@ VALUES WHEN SRM.STATUS = 'approvalRequest' THEN '결재중' WHEN SRM.STATUS = 'approvalComplete' THEN '결재완료' WHEN SRM.STATUS = 'reject' THEN '반려' - + WHEN SRM.STATUS = 'confirmed' THEN '확정' ELSE '' END STATUS_TITLE, SRM.RECEIPT_USER_ID, @@ -1224,7 +1247,15 @@ VALUES AND SRP.SUB_RNUM = 1 --> WHERE 1=1 -- 구매요청서만 조회 (품의서 제외) - AND (SRM.DOC_TYPE = 'PURCHASE_REQUEST' OR SRM.DOC_TYPE IS NULL) + -- DOC_TYPE_FILTER가 있으면 해당 값으로 필터링, 없으면 기존 조건 적용 + + + AND SRM.DOC_TYPE = #{DOC_TYPE_FILTER} + + + AND (SRM.DOC_TYPE = 'PURCHASE_REQUEST' OR SRM.DOC_TYPE IS NULL) + + AND TO_CHAR(REGDATE,'YYYY') = #{Year} @@ -1308,6 +1339,59 @@ VALUES AND SRM.REGDATE::DATE #{regdate_end}::DATE + + + AND ( + -- 프로젝트에서 고객사 조회 + SRM.PROJECT_NO IN ( + SELECT PM.OBJID::VARCHAR + FROM PROJECT_MGMT PM + LEFT JOIN CONTRACT_MGMT CM ON CM.OBJID = PM.CONTRACT_OBJID + WHERE CM.CUSTOMER_OBJID::VARCHAR = #{customer_cd} + ) + -- 직접 저장된 고객사 + OR SRM.CUSTOMER_OBJID = #{customer_cd} + ) + + + + + AND (SRM.REQUEST_USER_ID = #{request_user} OR SRM.WRITER = #{request_user}) + + + + + AND ( + -- 프로젝트에서 제품구분 조회 + SRM.PROJECT_NO IN ( + SELECT PM.OBJID::VARCHAR + FROM PROJECT_MGMT PM + LEFT JOIN CONTRACT_MGMT CM ON CM.OBJID = PM.CONTRACT_OBJID + WHERE CM.PRODUCT = #{part_type} + ) + -- 직접 저장된 제품구분 + OR SRM.PRODUCT_NAME = #{part_type} + ) + + + + + AND SRM.PROJECT_NO = #{project_no} + + + + + AND SRM.PURCHASE_TYPE IN + + #{item} + + + + + + AND (SRM.REQUEST_USER_ID = #{writer} OR SRM.WRITER = #{writer}) + + ORDER BY SRM.REGDATE desc @@ -1403,24 +1487,24 @@ VALUES SELECT @@ -3097,7 +3181,11 @@ UPDATE SET COALESCE(SRP.VENDOR_PM, SRP.PARTNER_OBJID) AS VENDOR_PM, COALESCE(SRP.UNIT_PRICE, NULLIF(SRP.PARTNER_PRICE, '')::numeric, 0) AS UNIT_PRICE, COALESCE(SRP.TOTAL_PRICE, 0) AS TOTAL_PRICE, + 0 AS PROCESSING_UNIT_PRICE, + 0 AS PROCESSING_TOTAL_PRICE, + 0 AS GRAND_TOTAL_PRICE, SRP.PROPOSAL_DATE, + NULL AS PROCESSING_PROPOSAL_DATE, 'SRP' AS DATA_SOURCE -- 데이터 소스 구분용 FROM SALES_REQUEST_PART SRP @@ -3108,7 +3196,8 @@ UPDATE SET SRP.REGDATE - + + + + + @@ -3382,6 +3814,9 @@ ORDER BY V.PATH2 PROCESSING_VENDOR = #{PROCESSING_VENDOR}, UNIT_PRICE = COALESCE(NULLIF(TRIM(#{UNIT_PRICE}::TEXT), '')::NUMERIC, 0), TOTAL_PRICE = COALESCE(NULLIF(TRIM(#{TOTAL_PRICE}::TEXT), '')::NUMERIC, 0), + PROCESSING_UNIT_PRICE = COALESCE(NULLIF(TRIM(#{PROCESSING_UNIT_PRICE}::TEXT), '')::NUMERIC, 0), + PROCESSING_TOTAL_PRICE = COALESCE(NULLIF(TRIM(#{PROCESSING_TOTAL_PRICE}::TEXT), '')::NUMERIC, 0), + GRAND_TOTAL_PRICE = COALESCE(NULLIF(TRIM(#{GRAND_TOTAL_PRICE}::TEXT), '')::NUMERIC, 0), EDITER = #{EDITER}, EDIT_DATE = NOW() WHERE OBJID::VARCHAR = #{OBJID} @@ -3397,6 +3832,9 @@ ORDER BY V.PATH2 PROCESSING_VENDOR = #{PROCESSING_VENDOR}, UNIT_PRICE = COALESCE(NULLIF(TRIM(#{UNIT_PRICE}::TEXT), '')::NUMERIC, 0), TOTAL_PRICE = COALESCE(NULLIF(TRIM(#{TOTAL_PRICE}::TEXT), '')::NUMERIC, 0), + PROCESSING_UNIT_PRICE = COALESCE(NULLIF(TRIM(#{PROCESSING_UNIT_PRICE}::TEXT), '')::NUMERIC, 0), + PROCESSING_TOTAL_PRICE = COALESCE(NULLIF(TRIM(#{PROCESSING_TOTAL_PRICE}::TEXT), '')::NUMERIC, 0), + GRAND_TOTAL_PRICE = COALESCE(NULLIF(TRIM(#{GRAND_TOTAL_PRICE}::TEXT), '')::NUMERIC, 0), WRITER = #{EDITER} WHERE OBJID::VARCHAR = #{OBJID} @@ -3418,16 +3856,16 @@ ORDER BY V.PATH2 @@ -3459,7 +3897,7 @@ ORDER BY V.PATH2 - + - + + + + - + + + + - + + + + + + + INSERT INTO SALES_REQUEST_MASTER ( @@ -3606,11 +4170,11 @@ ORDER BY V.PATH2 'create', #{WRITER}, NOW(), - 'PROPOSAL' + #{DOC_TYPE} ) - + INSERT INTO SALES_REQUEST_PART ( OBJID, @@ -3645,7 +4209,42 @@ ORDER BY V.PATH2 WHERE OBJID = #{SOURCE_OBJID} - + + + INSERT INTO SALES_REQUEST_PART ( + OBJID, + SALES_REQUEST_MASTER_OBJID, + PART_OBJID, + QTY, + UNIT_PRICE, + TOTAL_PRICE, + VENDOR_PM, + NET_QTY, + PO_QTY, + USE_YN, + PROPOSAL_DATE, + WRITER, + REGDATE + ) + SELECT + #{NEW_OBJID}, + #{PROPOSAL_MASTER_OBJID}, + PART_OBJID, + PRODUCTION_QTY AS QTY, + PROCESSING_UNIT_PRICE AS UNIT_PRICE, + PROCESSING_TOTAL_PRICE AS TOTAL_PRICE, + PROCESSING_VENDOR AS VENDOR_PM, + NET_QTY, + PO_QTY, + USE_YN, + NOW() AS PROPOSAL_DATE, + #{WRITER}, + NOW() + FROM MBOM_DETAIL + WHERE OBJID = #{SOURCE_OBJID} + + + INSERT INTO SALES_REQUEST_PART ( OBJID, @@ -3680,7 +4279,42 @@ ORDER BY V.PATH2 WHERE OBJID = #{SOURCE_OBJID} - + + + INSERT INTO SALES_REQUEST_PART ( + OBJID, + SALES_REQUEST_MASTER_OBJID, + PART_OBJID, + QTY, + UNIT_PRICE, + TOTAL_PRICE, + VENDOR_PM, + NET_QTY, + PO_QTY, + USE_YN, + PROPOSAL_DATE, + WRITER, + REGDATE + ) + SELECT + #{NEW_OBJID}, + #{PROPOSAL_MASTER_OBJID}, + PART_OBJID, + PRODUCTION_QTY AS QTY, + PROCESSING_UNIT_PRICE AS UNIT_PRICE, + PROCESSING_TOTAL_PRICE AS TOTAL_PRICE, + PROCESSING_VENDOR AS VENDOR_PM, + NET_QTY, + PO_QTY, + USE_YN, + NOW() AS PROPOSAL_DATE, + #{WRITER}, + NOW() + FROM SALES_REQUEST_PART + WHERE OBJID = #{SOURCE_OBJID} + + + UPDATE SALES_REQUEST_PART SET PROPOSAL_DATE = NOW() @@ -3690,16 +4324,62 @@ ORDER BY V.PATH2 - - - UPDATE MBOM_DETAIL - SET PROPOSAL_DATE = NOW() + + + UPDATE SALES_REQUEST_PART + SET PROCESSING_PROPOSAL_DATE = NOW() WHERE OBJID IN #{objid} + + + + UPDATE MBOM_DETAIL + SET PROPOSAL_DATE = NOW() + WHERE OBJID IN ( + SELECT MD2.OBJID + FROM MBOM_DETAIL MD2 + WHERE MD2.PART_OBJID IN ( + SELECT MD3.PART_OBJID FROM MBOM_DETAIL MD3 WHERE MD3.OBJID IN + + #{objid} + + ) + AND MD2.MBOM_HEADER_OBJID IN ( + SELECT MD3.MBOM_HEADER_OBJID FROM MBOM_DETAIL MD3 WHERE MD3.OBJID IN + + #{objid} + + ) + ) + + + + + + UPDATE MBOM_DETAIL + SET PROCESSING_PROPOSAL_DATE = NOW() + WHERE OBJID IN ( + SELECT MD2.OBJID + FROM MBOM_DETAIL MD2 + WHERE MD2.PART_OBJID IN ( + SELECT MD3.PART_OBJID FROM MBOM_DETAIL MD3 WHERE MD3.OBJID IN + + #{objid} + + ) + AND MD2.MBOM_HEADER_OBJID IN ( + SELECT MD3.MBOM_HEADER_OBJID FROM MBOM_DETAIL MD3 WHERE MD3.OBJID IN + + #{objid} + + ) + ) + + + + + @@ -4004,4 +4849,627 @@ ORDER BY V.PATH2 WHERE OBJID = #{PART_OBJID} + + + + + + + + + + + + + + + + + + + + + + INSERT INTO QUOTATION_REQUEST_MASTER ( + OBJID, + QUOTATION_REQUEST_NO, + SALES_REQUEST_MASTER_OBJID, + PROJECT_MGMT_OBJID, + VENDOR_OBJID, + VENDOR_TYPE, + STATUS, + DUE_DATE, + REMARK, + WRITER, + REG_DATE + ) VALUES ( + #{OBJID}::NUMERIC, + #{QUOTATION_REQUEST_NO}, + #{SALES_REQUEST_MASTER_OBJID}::NUMERIC, + #{PROJECT_MGMT_OBJID}::NUMERIC, + #{VENDOR_OBJID}::NUMERIC, + #{VENDOR_TYPE}, + 'create', + #{DUE_DATE}::DATE + NULL, + #{REMARK}, + #{WRITER}, + NOW() + ) + + + + + INSERT INTO QUOTATION_REQUEST_DETAIL ( + OBJID, + QUOTATION_REQUEST_MASTER_OBJID, + SALES_REQUEST_PART_OBJID, + PART_OBJID, + PART_NO, + PART_NAME, + RAW_MATERIAL, + SIZE, + QTY, + UNIT_PRICE, + REMARK, + REG_DATE + ) VALUES ( + #{OBJID}::NUMERIC, + #{QUOTATION_REQUEST_MASTER_OBJID}::NUMERIC, + #{SALES_REQUEST_PART_OBJID}::NUMERIC, + #{PART_OBJID}::NUMERIC, + #{PART_NO}, + #{PART_NAME}, + #{RAW_MATERIAL}, + #{SIZE}, + COALESCE(#{QTY}::NUMERIC, 0), + COALESCE(#{UNIT_PRICE}::NUMERIC, 0), + #{REMARK}, + NOW() + ) + + + + + UPDATE QUOTATION_REQUEST_DETAIL SET + UNIT_PRICE = #{UNIT_PRICE}::NUMERIC, + TOTAL_PRICE = #{QTY}::NUMERIC * #{UNIT_PRICE}::NUMERIC, + EDIT_DATE = NOW() + WHERE OBJID = #{OBJID}::NUMERIC + + + + + UPDATE QUOTATION_REQUEST_MASTER SET + STATUS = #{STATUS}, + EDIT_DATE = NOW() + + , MAIL_SEND_YN = #{MAIL_SEND_YN} + , MAIL_SEND_DATE = NOW() + + WHERE OBJID = #{QUOTATION_REQUEST_MASTER_OBJID}::NUMERIC + + + + + + UPDATE MBOM_DETAIL SET + + UNIT_PRICE = #{UNIT_PRICE}::NUMERIC + + + PROCESSING_UNIT_PRICE = #{UNIT_PRICE}::NUMERIC + + , EDIT_DATE = NOW() + WHERE OBJID IN ( + SELECT MD2.OBJID + FROM MBOM_DETAIL MD2 + WHERE MD2.PART_OBJID = (SELECT PART_OBJID FROM MBOM_DETAIL WHERE OBJID = #{SALES_REQUEST_PART_OBJID}) + AND MD2.MBOM_HEADER_OBJID = (SELECT MBOM_HEADER_OBJID FROM MBOM_DETAIL WHERE OBJID = #{SALES_REQUEST_PART_OBJID}) + ) + + + + + + UPDATE MBOM_DETAIL SET + UNIT_PRICE = 0, + PROCESSING_UNIT_PRICE = 0, + TOTAL_PRICE = 0, + PROCESSING_TOTAL_PRICE = 0, + GRAND_TOTAL_PRICE = 0, + EDIT_DATE = NOW() + WHERE MBOM_HEADER_OBJID = #{MBOM_HEADER_OBJID} + + + + + + + + + + + + DELETE FROM QUOTATION_REQUEST_MASTER WHERE OBJID = #{QUOTATION_REQUEST_MASTER_OBJID}::NUMERIC + + + + + DELETE FROM QUOTATION_REQUEST_DETAIL WHERE QUOTATION_REQUEST_MASTER_OBJID = #{QUOTATION_REQUEST_MASTER_OBJID}::NUMERIC + + + + + UPDATE QUOTATION_REQUEST_MASTER + SET MAIL_SEND_YN = 'Y', + MAIL_SEND_DATE = NOW() + WHERE OBJID = #{QUOTATION_REQUEST_MASTER_OBJID}::NUMERIC + + + + + + + + + + + + + INSERT INTO SALES_REQUEST_MASTER ( + OBJID, + REQUEST_MNG_NO, + PROJECT_NO, + PURCHASE_TYPE, + ORDER_TYPE, + PRODUCT_NAME, + AREA_CD, + CUSTOMER_OBJID, + PAID_TYPE, + REQUEST_USER_ID, + DELIVERY_REQUEST_DATE, + STATUS, + WRITER, + REGDATE, + DOC_TYPE + ) VALUES ( + #{OBJID}, + #{REQUEST_MNG_NO}, + #{PROJECT_NO}, + #{PURCHASE_TYPE}, + #{ORDER_TYPE}, + #{PRODUCT_NAME}, + #{AREA_CD}, + #{CUSTOMER_OBJID}, + #{PAID_TYPE}, + #{REQUEST_USER_ID}, + #{DELIVERY_REQUEST_DATE}, + 'create', + #{WRITER}, + NOW(), + 'PURCHASE_REG_PROPOSAL' + ) + + + + + INSERT INTO SALES_REQUEST_PART ( + OBJID, + SALES_REQUEST_MASTER_OBJID, + PART_OBJID, + QTY, + UNIT_PRICE, + TOTAL_PRICE, + VENDOR_PM, + NET_QTY, + PO_QTY, + USE_YN, + PROPOSAL_DATE, + WRITER, + REGDATE + ) + SELECT + #{NEW_OBJID}, + #{PROPOSAL_MASTER_OBJID}, + PART_OBJID, + QTY, + CASE + WHEN UNIT_PRICE IS NOT NULL AND UNIT_PRICE > 0 THEN UNIT_PRICE + WHEN PARTNER_PRICE IS NOT NULL AND PARTNER_PRICE != '' THEN PARTNER_PRICE::NUMERIC + ELSE 0 + END AS UNIT_PRICE, + CASE + WHEN TOTAL_PRICE IS NOT NULL AND TOTAL_PRICE > 0 THEN TOTAL_PRICE + ELSE COALESCE(QTY::NUMERIC, 0) * + CASE + WHEN UNIT_PRICE IS NOT NULL AND UNIT_PRICE > 0 THEN UNIT_PRICE + WHEN PARTNER_PRICE IS NOT NULL AND PARTNER_PRICE != '' THEN PARTNER_PRICE::NUMERIC + ELSE 0 + END + END AS TOTAL_PRICE, + COALESCE(NULLIF(VENDOR_PM, ''), PARTNER_OBJID) AS VENDOR_PM, + NET_QTY, + COALESCE(QTY::NUMERIC, 0) AS PO_QTY, -- 발주수량에 QTY 값 저장 + USE_YN, + NOW() AS PROPOSAL_DATE, + #{WRITER}, + NOW() + FROM SALES_REQUEST_PART + WHERE OBJID = #{SOURCE_OBJID} + + + + + UPDATE SALES_REQUEST_PART + SET PROPOSAL_DATE = NOW() + WHERE OBJID IN + + #{objid} + + + \ No newline at end of file diff --git a/WebContent/WEB-INF/classes/com/pms/salesmgmt/mapper/salesNcollectMgmt.xml b/WebContent/WEB-INF/classes/com/pms/salesmgmt/mapper/salesNcollectMgmt.xml index b41b6eb..d778578 100644 --- a/WebContent/WEB-INF/classes/com/pms/salesmgmt/mapper/salesNcollectMgmt.xml +++ b/WebContent/WEB-INF/classes/com/pms/salesmgmt/mapper/salesNcollectMgmt.xml @@ -926,7 +926,17 @@ (SELECT USER_NAME FROM USER_INFO WHERE USER_ID = T.PM_USER_ID) ) AS MANAGER, COALESCE(SR.incoterms, '') AS INCOTERMS, - T.SALES_STATUS, + -- 판매상태: 수주수량과 판매수량 비교하여 동적 계산 + CASE + WHEN COALESCE((SELECT SUM(sales_quantity) FROM sales_registration WHERE project_no LIKE T.PROJECT_NO || '%'), 0) = 0 + THEN '미판매' + WHEN COALESCE((SELECT SUM(sales_quantity) FROM sales_registration WHERE project_no LIKE T.PROJECT_NO || '%'), 0) >= COALESCE(T.QUANTITY::numeric, 0) + THEN '완판' + WHEN COALESCE((SELECT SUM(sales_quantity) FROM sales_registration WHERE project_no LIKE T.PROJECT_NO || '%'), 0) > 0 + AND COALESCE((SELECT SUM(sales_quantity) FROM sales_registration WHERE project_no LIKE T.PROJECT_NO || '%'), 0) COALESCE(T.QUANTITY::numeric, 0) + THEN '분할판매' + ELSE '' + END AS SALES_STATUS, T.OBJID::VARCHAR AS SALE_NO, 'ORIGINAL' AS RECORD_TYPE, '' AS SPLIT_LOG_ID, @@ -1069,15 +1079,27 @@ AND SR.project_no IS NOT NULL AND SR.incoterms = #{incoterms} - - - - AND (T.SALES_STATUS IS NULL OR T.SALES_STATUS = '' OR T.SALES_STATUS != '완료') - - - AND T.SALES_STATUS = #{salesStatus} - - + + + AND ( + 1=0 + + + + OR (COALESCE((SELECT SUM(sales_quantity) FROM sales_registration WHERE project_no LIKE T.PROJECT_NO || '%'), 0) >= COALESCE(T.QUANTITY::numeric, 0) + AND COALESCE(T.QUANTITY::numeric, 0) > 0) + + + + OR (COALESCE((SELECT SUM(sales_quantity) FROM sales_registration WHERE project_no LIKE T.PROJECT_NO || '%'), 0) > 0 + AND COALESCE((SELECT SUM(sales_quantity) FROM sales_registration WHERE project_no LIKE T.PROJECT_NO || '%'), 0) COALESCE(T.QUANTITY::numeric, 0)) + + + + OR COALESCE((SELECT SUM(sales_quantity) FROM sales_registration WHERE project_no LIKE T.PROJECT_NO || '%'), 0) = 0 + + + ) @@ -1248,15 +1270,27 @@ ORDER BY T.REGDATE DESC, T.PROJECT_NO DESC AND SR.incoterms = #{incoterms} ) - - - - AND (T.SALES_STATUS IS NULL OR T.SALES_STATUS = '' OR T.SALES_STATUS != '완료') - - - AND T.SALES_STATUS = #{salesStatus} - - + + + AND ( + 1=0 + + + + OR (COALESCE((SELECT SUM(sales_quantity) FROM sales_registration WHERE project_no LIKE T.PROJECT_NO || '%'), 0) >= COALESCE(T.QUANTITY::numeric, 0) + AND COALESCE(T.QUANTITY::numeric, 0) > 0) + + + + OR (COALESCE((SELECT SUM(sales_quantity) FROM sales_registration WHERE project_no LIKE T.PROJECT_NO || '%'), 0) > 0 + AND COALESCE((SELECT SUM(sales_quantity) FROM sales_registration WHERE project_no LIKE T.PROJECT_NO || '%'), 0) COALESCE(T.QUANTITY::numeric, 0)) + + + + OR COALESCE((SELECT SUM(sales_quantity) FROM sales_registration WHERE project_no LIKE T.PROJECT_NO || '%'), 0) = 0 + + + ) diff --git a/WebContent/WEB-INF/view/admin/warehouseList/warehouseMngList.jsp b/WebContent/WEB-INF/view/admin/warehouseList/warehouseMngList.jsp index b9567a5..c273da1 100644 --- a/WebContent/WEB-INF/view/admin/warehouseList/warehouseMngList.jsp +++ b/WebContent/WEB-INF/view/admin/warehouseList/warehouseMngList.jsp @@ -34,6 +34,11 @@ fn_delete(); }); + //ERP 창고 동기화 + $("#btnSyncErp").click(function(){ + fn_syncErp(); + }); + fn_search(); }); @@ -124,6 +129,52 @@ function openwarehouseListInfoPopUp(objid){ hiddenForm.action = "/admin/warehouseListFormPopUp.do"; hiddenForm.submit(); } + +function fn_syncErp(){ + if(confirm("ERP 시스템의 창고 정보를 동기화하시겠습니까?")){ + // 로딩 표시 + Swal.fire({ + title: '동기화 중...', + text: 'ERP 창고 데이터를 가져오는 중입니다. 잠시만 기다려주세요.', + allowOutsideClick: false, + didOpen: () => { + Swal.showLoading(); + } + }); + + $.ajax({ + type : "POST", + url : "/admin/syncWarehouseDataManual.do", + dataType:"json", + success:function(data){ + Swal.close(); + if(data.success){ + Swal.fire({ + icon: 'success', + title: '동기화 완료', + text: data.message + }).then(function(){ + fn_search(); // 목록 새로고침 + }); + } else { + Swal.fire({ + icon: 'error', + title: '동기화 실패', + text: data.message + }); + } + }, + error: function(jqxhr, status, error){ + Swal.close(); + Swal.fire({ + icon: 'error', + title: '오류 발생', + text: '배치 실행 중 오류가 발생했습니다.' + }); + } + }); + } +} @@ -140,8 +191,9 @@ function openwarehouseListInfoPopUp(objid){
- + +
diff --git a/WebContent/WEB-INF/view/partMng/partMngTempList.jsp b/WebContent/WEB-INF/view/partMng/partMngTempList.jsp index a87a365..768c82f 100644 --- a/WebContent/WEB-INF/view/partMng/partMngTempList.jsp +++ b/WebContent/WEB-INF/view/partMng/partMngTempList.jsp @@ -292,18 +292,9 @@ ui-jqgrid tr.jqgrow td { //data:{"OBJID":OBJID}, dataType:"json", success:function(data){ - Swal.fire(data.msg); - fn_search(); - - // 확정 성공 시 ERP로 전송 - if(data.result == true || data.result == 'true'){ - var selectedData = _tabulGrid.getSelectedData(); - if(selectedData && selectedData.length > 0){ - var partObjid = selectedData[0].OBJID; - fn_sendSinglePartToErp(partObjid); - } - } - }, + Swal.fire(data.msg); + fn_search(); + }, error: function(jqxhr, status, error){ } }); @@ -586,25 +577,6 @@ ui-jqgrid tr.jqgrow td { window.open(url, target,"width=1520, height=860, menubars=no, scrollbars=yes, resizable=yes"); } - // 단일 PART ERP 전송 - function fn_sendSinglePartToErp(partObjid){ - $.ajax({ - type : "POST", - url : "/admin/sendSinglePartToErp.do", - data : {partObjid: partObjid}, - dataType:"json", - success:function(data){ - if(data.success){ - console.log("ERP 전송 성공: " + data.message); - } else { - console.log("ERP 전송 실패: " + data.message); - } - }, - error: function(jqxhr, status, error){ - console.log("ERP 전송 오류"); - } - }); - } diff --git a/src/com/pms/mapper/part.xml b/src/com/pms/mapper/part.xml index bc5d146..e6bdfea 100644 --- a/src/com/pms/mapper/part.xml +++ b/src/com/pms/mapper/part.xml @@ -3394,35 +3394,4 @@ ORDER BY PATH, AND PART_NO = #{OBJID} ) T - - - - - - - - \ No newline at end of file diff --git a/src/com/pms/mapper/partMng.xml b/src/com/pms/mapper/partMng.xml index e0261f1..9750f5a 100644 --- a/src/com/pms/mapper/partMng.xml +++ b/src/com/pms/mapper/partMng.xml @@ -8131,5 +8131,34 @@ SELECT PM.OBJID WHERE OBJID::VARCHAR = #{partObjId} LIMIT 1 + + + + + + \ No newline at end of file diff --git a/src/com/pms/service/BatchService.java b/src/com/pms/service/BatchService.java index 6ad441c..ef3fde4 100644 --- a/src/com/pms/service/BatchService.java +++ b/src/com/pms/service/BatchService.java @@ -998,7 +998,7 @@ public class BatchService extends BaseService { String baseUrl = "https://erp.rps-korea.com"; // DB에서 전체 PART 목록 조회 - List> partList = sqlSession.selectList("part.selectAllPartListForErp"); + List> partList = sqlSession.selectList("partMng.selectAllPartListForErp"); if (partList == null || partList.isEmpty()) { result.put("success", false); @@ -1104,7 +1104,7 @@ public class BatchService extends BaseService { // DB에서 PART 정보 조회 Map paramMap = new HashMap(); paramMap.put("objid", partObjid); - Map part = sqlSession.selectOne("part.selectPartByObjid", paramMap); + Map part = sqlSession.selectOne("partMng.selectPartByObjid", paramMap); if (part == null) { result.put("success", false); diff --git a/src/com/pms/service/PartMngService.java b/src/com/pms/service/PartMngService.java index c22a18b..5d42790 100644 --- a/src/com/pms/service/PartMngService.java +++ b/src/com/pms/service/PartMngService.java @@ -48,6 +48,9 @@ public class PartMngService extends BaseService { CommonService commonService = null; + @Autowired + private BatchService batchService; + @Autowired ProjectService projectService; @@ -793,6 +796,25 @@ public class PartMngService extends BaseService { } sqlSession.commit(); + + // 배포 성공 후 ERP로 전송 + for (Map data : dataList) { + String partObjid = CommonUtils.checkNull(data.get("OBJID")); + if (!partObjid.isEmpty()) { + try { + Map erpResult = batchService.sendSinglePartToErp(partObjid); + if (erpResult != null && Boolean.TRUE.equals(erpResult.get("success"))) { + System.out.println("PART 배포 후 ERP 전송 성공: " + partObjid); + } else { + System.err.println("PART 배포 후 ERP 전송 실패: " + partObjid + " - " + erpResult.get("message")); + } + } catch (Exception e) { + System.err.println("PART 배포 후 ERP 전송 중 오류: " + partObjid + " - " + e.getMessage()); + e.printStackTrace(); + } + } + } + resultMap.put("result", true); resultMap.put("msg", Message.SAVE_SUCCESS); }