diff --git a/WebContent/WEB-INF/view/purchaseOrder/deliveryMngAcceptanceList.jsp b/WebContent/WEB-INF/view/purchaseOrder/deliveryMngAcceptanceList.jsp
index f7a1eb3..92c7133 100644
--- a/WebContent/WEB-INF/view/purchaseOrder/deliveryMngAcceptanceList.jsp
+++ b/WebContent/WEB-INF/view/purchaseOrder/deliveryMngAcceptanceList.jsp
@@ -73,12 +73,20 @@ $(document).ready(function(){
//fnc_productUPGNEWList(this.value,"","upg_no", "");
fn_UnitCodeList(this.value, "unit_code", "");
});
+
+ // 매입마감 버튼 클릭
+ $("#btnClose").click(function(){
+ fn_purchaseClose();
+ });
+
fn_search();
});
var columns = [
// 요구사항: 품의서 No, 발주서 No, 프로젝트번호, 품번, 품명, 공급업체, 발주수량, 입고수량, 미입고수량, 검사성적서, 입고결과
+ {title:'TOTAL_SUPPLY_PRICE' ,field:'TOTAL_SUPPLY_PRICE' ,visible:false, frozen:true},
+ {title:'TOTAL_DELIVERY_PRICE' ,field:'TOTAL_DELIVERY_PRICE' ,visible:false, frozen:true},
{headerHozAlign : 'center', hozAlign : 'center', minWidth : 130, widthGrow : 1, title : '품의서 No', field : 'PROPOSAL_NO',
formatter: fnc_createGridAnchorTag,
cellClick : function(e, cell) {
@@ -120,7 +128,8 @@ var columns = [
var purchaseOrderNo = fnc_checkNull(cell.getData().PURCHASE_ORDER_NO);
fn_deliveryAcceptanceViewPopUp(objId,DELIVERY_STATUS);
}
- }
+ },
+ {headerHozAlign : 'center', hozAlign : 'center', minWidth : 140, widthGrow : 1, title : '매입마감', field : 'PURCHASE_CLOSE_DATE'}
];
//var grid;
@@ -140,7 +149,56 @@ function fn_search(){
value: selectedIdValues
}).appendTo('#form1');
+ // 그리드 조회
_tabulGrid = fnc_tabul_search(_tabul_layout_fitColumns, _tabulGrid, "/purchaseOrder/deliveryMngAcceptanceGridList.do", columns, true);
+
+ // 데이터 렌더링 완료 후 합계 계산 및 높이 조절
+ if(_tabulGrid) {
+ _tabulGrid.off("renderComplete");
+ _tabulGrid.on("renderComplete", function(){
+ fn_calculateTotalAmount();
+ // 그리드 렌더링 완료 후 높이 계산
+ fnc_calculateContentHeight("gridDiv", 30);
+ });
+ }
+
+ // 윈도우 리사이즈 이벤트 (한 번만 등록)
+ $(window).off("resize.gridHeight").on("resize.gridHeight", function() {
+ fnc_calculateContentHeight("gridDiv", 30);
+ });
+}
+
+// 발주금액 합계 계산 (그리드 데이터 기반)
+function fn_calculateTotalAmount(){
+ if(!_tabulGrid) {
+ $("#totalOrderAmount").text("0");
+ $("#deliveredAmount").text("0");
+ $("#notDeliveredAmount").text("0");
+ return;
+ }
+
+ // 현재 그리드에 표시된 데이터 가져오기
+ var data = _tabulGrid.getData();
+ var totalOrderAmount = 0; // 총 발주금액
+ var totalDeliveredAmount = 0; // 입고금액
+ var totalNotDeliveredAmount = 0; // 미입고금액
+
+ if(data.length > 0) {
+ data.forEach(function(row) {
+ var rowTotalPrice = parseFloat(row.TOTAL_SUPPLY_PRICE || 0);
+ var rowDeliveredPrice = parseFloat(row.TOTAL_DELIVERY_PRICE || 0);
+ var rowNotDeliveredPrice = rowTotalPrice - rowDeliveredPrice;
+
+ totalOrderAmount += rowTotalPrice;
+ totalDeliveredAmount += rowDeliveredPrice;
+ totalNotDeliveredAmount += rowNotDeliveredPrice;
+ });
+ }
+
+ // 합계 표시
+ $("#totalOrderAmount").text(Number(Math.round(totalOrderAmount)).toLocaleString());
+ $("#deliveredAmount").text(Number(Math.round(totalDeliveredAmount)).toLocaleString());
+ $("#notDeliveredAmount").text(Number(Math.round(totalNotDeliveredAmount)).toLocaleString());
}
//수입검사등록
@@ -303,8 +361,69 @@ function fn_FileRegist(objId, docType, docTypeName){
fn_centerPopup(popup_width, popup_height, url);
}
+// 매입마감 처리
+function fn_purchaseClose(){
+ var selected = _tabulGrid.getSelectedData();
+ if(selected.length == 0){
+ Swal.fire("선택된 데이터가 없습니다.");
+ return;
+ }
+
+ // 이미 마감된 건 체크
+ var alreadyClosed = selected.filter(function(item){
+ return fnc_checkNull(item.PURCHASE_CLOSE_DATE) != '';
+ });
+ if(alreadyClosed.length > 0){
+ Swal.fire("이미 매입마감 처리된 건이 포함되어 있습니다.");
+ return;
+ }
+
+ // 입고완료 건만 마감 가능
+ var notCompleted = selected.filter(function(item){
+ return item.DELIVERY_STATUS != '입고완료';
+ });
+ if(notCompleted.length > 0){
+ Swal.fire("입고완료 건만 매입마감 처리가 가능합니다.");
+ return;
+ }
+
+ Swal.fire({
+ title: '매입마감',
+ text: '선택한 ' + selected.length + '건을 매입마감 처리하시겠습니까?',
+ icon: 'question',
+ showCancelButton: true,
+ confirmButtonText: '확인',
+ cancelButtonText: '취소'
+ }).then((result) => {
+ if(result.isConfirmed){
+ var objIds = selected.map(function(item){
+ return item.OBJID;
+ }).join(',');
+
+ $.ajax({
+ url: '/purchaseOrder/purchaseClose.do',
+ type: 'POST',
+ data: { objIds: objIds },
+ dataType: 'json',
+ success: function(response){
+ if(response.result == 'SUCCESS'){
+ Swal.fire('매입마감 처리가 완료되었습니다.').then(function(){
+ fn_search();
+ });
+ } else {
+ Swal.fire('매입마감 처리 중 오류가 발생했습니다.');
+ }
+ },
+ error: function(){
+ Swal.fire('서버 통신 중 오류가 발생했습니다.');
+ }
+ });
+ }
+ });
+}
+
-
+
@@ -217,7 +215,7 @@ function fn_formPopUp(objId){
<%=menuName%>
-
+
@@ -259,22 +257,13 @@ function fn_formPopUp(objId){
- |
- |
+ |
+ |
- |
+ |
- ~
-
- |
-
- |
-
-
+ ~
+
|
diff --git a/WebContent/WEB-INF/view/quality/incomingInspectionProgressList.jsp b/WebContent/WEB-INF/view/quality/incomingInspectionProgressList.jsp
new file mode 100644
index 0000000..d1240fb
--- /dev/null
+++ b/WebContent/WEB-INF/view/quality/incomingInspectionProgressList.jsp
@@ -0,0 +1,348 @@
+<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
+<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
+<%@ page import="com.pms.common.utils.*"%>
+<%@ page import="java.util.*" %>
+<%@include file= "/init.jsp" %>
+
+
+<%
+String menuObjId = request.getParameter("menuObjId");
+String menuName = CommonUtils.getMenuName(menuObjId, "수입검사 진행");
+%>
+
+
+
+
+ <%=Constants.SYSTEM_NAME%>
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/WebContent/WEB-INF/view/quality/incomingInspectionProgressPopUp.jsp b/WebContent/WEB-INF/view/quality/incomingInspectionProgressPopUp.jsp
new file mode 100644
index 0000000..a825251
--- /dev/null
+++ b/WebContent/WEB-INF/view/quality/incomingInspectionProgressPopUp.jsp
@@ -0,0 +1,844 @@
+<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
+<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
+<%@ page import="com.pms.common.utils.*"%>
+<%@ page import="java.util.*" %>
+<%@include file= "/init.jsp" %>
+<%
+PersonBean person = (PersonBean) session.getAttribute(Constants.PERSON_BEAN);
+String connector = person.getUserId();
+%>
+
+
+
+
+
+
+ <%=Constants.SYSTEM_NAME%>
+
+
+
+
+
+
+
+
+
+
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%>
+
+
+
+
+
+
+
+
+
+
diff --git a/src/com/pms/controller/PurchaseOrderController.java b/src/com/pms/controller/PurchaseOrderController.java
index b8801be..2824457 100644
--- a/src/com/pms/controller/PurchaseOrderController.java
+++ b/src/com/pms/controller/PurchaseOrderController.java
@@ -1324,6 +1324,17 @@ public class PurchaseOrderController {
return paramMap;
}
+ /**
+ * 매입마감 처리
+ * PURCHASE_ORDER_MASTER의 PURCHASE_CLOSE_DATE를 현재일자로 업데이트
+ */
+ @ResponseBody
+ @RequestMapping("/purchaseOrder/purchaseClose.do")
+ public Map purchaseClose(HttpSession session, HttpServletRequest request, @RequestParam Map paramMap){
+ String objIds = (String) paramMap.get("objIds");
+ return purchaseOrderService.updatePurchaseCloseDate(objIds);
+ }
+
/**
* 입고 관리
*/
diff --git a/src/com/pms/controller/QualityController.java b/src/com/pms/controller/QualityController.java
index a447ffd..499278b 100644
--- a/src/com/pms/controller/QualityController.java
+++ b/src/com/pms/controller/QualityController.java
@@ -259,7 +259,7 @@ public class QualityController {
// =====================================================
/**
- * 수입검사 관리 목록 화면
+ * 수입검사 요청 목록 화면
* @param request
* @param paramMap
* @return
@@ -269,6 +269,36 @@ public class QualityController {
ArrayList list = new ArrayList();
Map code_map = new HashMap();
+ try {
+ // 프로젝트번호
+ code_map.put("project_no", commonService.bizMakeOptionList("", (String)paramMap.get("project_no"), "common.getProjectNameList"));
+ // 공급업체 (CLIENT_MNG)
+ code_map.put("partner_objid", commonService.bizMakeOptionList("", (String)paramMap.get("partner_objid"), "common.getClientMngSupplySelect"));
+ // 요청자
+ code_map.put("request_user_id", commonService.bizMakeOptionList("", (String)paramMap.get("request_user_id"), "common.getUserselect"));
+
+ list = commonService.selectListPaging("quality.getIncomingInspectionList", request, paramMap);
+ } catch(Exception e) {
+ e.printStackTrace();
+ }
+
+ request.setAttribute("code_map", code_map);
+ request.setAttribute("LIST", JsonUtil.ListToJson(list));
+
+ return "/quality/incomingInspectionList";
+ }
+
+ /**
+ * 수입검사 진행 목록 화면
+ * @param request
+ * @param paramMap
+ * @return
+ */
+ @RequestMapping("/quality/incomingInspectionProgressList.do")
+ public String incomingInspectionProgressList(HttpServletRequest request, @RequestParam Map paramMap){
+ ArrayList list = new ArrayList();
+ Map code_map = new HashMap();
+
try {
// 프로젝트번호
code_map.put("project_no", commonService.bizMakeOptionList("", (String)paramMap.get("project_no"), "common.getProjectNameList"));
@@ -285,7 +315,7 @@ public class QualityController {
request.setAttribute("code_map", code_map);
request.setAttribute("LIST", JsonUtil.ListToJson(list));
- return "/quality/incomingInspectionList";
+ return "/quality/incomingInspectionProgressList";
}
/**
@@ -302,7 +332,79 @@ public class QualityController {
}
/**
- * 수입검사 등록 팝업
+ * 수입검사 요청 팝업
+ * @param request
+ * @param paramMap
+ * @return
+ */
+ @RequestMapping("/quality/incomingInspectionRequestPopUp.do")
+ public String incomingInspectionRequestPopUp(HttpServletRequest request, @RequestParam Map paramMap){
+ Map code_map = new HashMap();
+
+ try {
+ // 로그인 사용자 정보
+ PersonBean person = (PersonBean) request.getSession().getAttribute(Constants.PERSON_BEAN);
+ String loginUserId = person != null ? person.getUserId() : "";
+
+ // 기존 요청 정보 조회 (요청자, 요청일 가져오기)
+ Map info = service.getIncomingInspectionDetailInfo(paramMap);
+ String savedRequestUserId = "";
+ if(info != null && info.get("request_user_id") != null) {
+ savedRequestUserId = (String) info.get("request_user_id");
+ request.setAttribute("info", CommonUtils.toUpperCaseMapKey(info));
+ } else {
+ // 저장된 값 없으면 로그인 사용자로 기본 설정
+ savedRequestUserId = loginUserId;
+ }
+
+ // 요청자 목록 (기존 값 또는 로그인 사용자 selected)
+ code_map.put("request_user_id", commonService.bizMakeOptionList("", savedRequestUserId, "common.getUserselect"));
+ } catch(Exception e) {
+ e.printStackTrace();
+ }
+
+ request.setAttribute("code_map", code_map);
+ return "/quality/incomingInspectionRequestPopUp";
+ }
+
+ /**
+ * 수입검사 진행 팝업
+ * @param request
+ * @param paramMap
+ * @return
+ */
+ @RequestMapping("/quality/incomingInspectionProgressPopUp.do")
+ public String incomingInspectionProgressPopUp(HttpServletRequest request, @RequestParam Map paramMap){
+ Map code_map = new HashMap();
+
+ try {
+ // 로그인 사용자 정보
+ PersonBean person = (PersonBean) request.getSession().getAttribute(Constants.PERSON_BEAN);
+ String loginUserId = person != null ? person.getUserId() : "";
+
+ // 기존 검사 정보 조회 (검사자, 검사일 가져오기)
+ Map info = service.getIncomingInspectionDetailInfo(paramMap);
+ String savedInspectorId = "";
+ if(info != null && info.get("inspector_id") != null) {
+ savedInspectorId = (String) info.get("inspector_id");
+ request.setAttribute("info", CommonUtils.toUpperCaseMapKey(info));
+ } else {
+ // 저장된 값 없으면 로그인 사용자로 기본 설정
+ savedInspectorId = loginUserId;
+ }
+
+ // 검사자 목록 (기존 값 또는 로그인 사용자 selected)
+ code_map.put("inspector_id", commonService.bizMakeOptionList("", savedInspectorId, "common.getUserselect"));
+ } catch(Exception e) {
+ e.printStackTrace();
+ }
+
+ request.setAttribute("code_map", code_map);
+ return "/quality/incomingInspectionProgressPopUp";
+ }
+
+ /**
+ * 수입검사 등록 팝업 (기존 - 호환용)
* @param request
* @param paramMap
* @return
@@ -321,7 +423,7 @@ public class QualityController {
String savedInspectorId = "";
if(info != null && info.get("inspector_id") != null) {
savedInspectorId = (String) info.get("inspector_id");
- request.setAttribute("info", info);
+ request.setAttribute("info", CommonUtils.toUpperCaseMapKey(info));
} else {
// 저장된 값 없으면 로그인 사용자로 기본 설정
savedInspectorId = loginUserId;
@@ -350,6 +452,32 @@ public class QualityController {
return paramMap;
}
+ /**
+ * 수입검사 진행 상세 그리드 목록 조회 (검사여부='검사'인 항목만)
+ * @param request
+ * @param paramMap
+ * @return
+ */
+ @ResponseBody
+ @RequestMapping("/quality/incomingInspectionProgressDetailGridList.do")
+ public Map incomingInspectionProgressDetailGridList(HttpServletRequest request, @RequestParam Map paramMap){
+ commonService.selectListPagingNew("quality.getIncomingInspectionProgressDetailList", request, paramMap);
+ return paramMap;
+ }
+
+ /**
+ * 수입검사 요청 저장
+ * @param request
+ * @param paramMap
+ * @return
+ */
+ @RequestMapping("/quality/saveIncomingInspectionRequest.do")
+ public String saveIncomingInspectionRequest(HttpServletRequest request, @RequestParam Map paramMap){
+ Map map = service.saveIncomingInspectionRequest(request, paramMap);
+ request.setAttribute("RESULT", CommonUtils.getJsonMap(map));
+ return "/ajax/ajaxResult";
+ }
+
/**
* 수입검사 저장
* @param request
@@ -744,4 +872,36 @@ public class QualityController {
return service.saveEcrResult(request, paramMap);
}
+ // =====================================================
+ // 수입검사 불량상세 관련
+ // =====================================================
+
+ /**
+ * 불량상세 목록 조회
+ */
+ @ResponseBody
+ @RequestMapping("/quality/getIncomingInspectionDefectList.do")
+ public Map getIncomingInspectionDefectList(HttpServletRequest request, @RequestParam Map paramMap){
+ Map result = new HashMap();
+ try {
+ List list = service.getIncomingInspectionDefectList(paramMap);
+ result.put("list", list);
+ result.put("result", true);
+ } catch(Exception e) {
+ e.printStackTrace();
+ result.put("result", false);
+ result.put("msg", e.getMessage());
+ }
+ return result;
+ }
+
+ /**
+ * 수입검사 진행 저장 (입고품목 + 불량상세)
+ */
+ @ResponseBody
+ @RequestMapping("/quality/saveIncomingInspectionProgress.do")
+ public Map saveIncomingInspectionProgress(HttpServletRequest request, @RequestParam Map paramMap){
+ return service.saveIncomingInspectionProgress(request, paramMap);
+ }
+
}
diff --git a/src/com/pms/mapper/purchaseOrder.xml b/src/com/pms/mapper/purchaseOrder.xml
index e4fbb29..b0b40d3 100644
--- a/src/com/pms/mapper/purchaseOrder.xml
+++ b/src/com/pms/mapper/purchaseOrder.xml
@@ -1115,6 +1115,14 @@
WHERE OBJID = (SELECT PURCHASE_ORDER_MASTER_OBJID FROM PURCHASE_ORDER_PART POP WHERE OBJID = #{PURCHASE_ORDER_PART_OBJID })
-->
+
+
+
+ UPDATE PURCHASE_ORDER_MASTER
+ SET PURCHASE_CLOSE_DATE = TO_CHAR(NOW(), 'YYYY-MM-DD')
+ WHERE OBJID = #{OBJID}
+
+
UPDATE PURCHASE_ORDER_MASTER SET
TOTAL_PRICE_TXT_ALL = NUM_TO_KOR((T.REAL_SUPPLY_PRICE_VAT)::varchar,'일금 ',' 원정 (₩ ') || TRIM(TO_CHAR((T.REAL_SUPPLY_PRICE_VAT), '999,999,999,999')) ||')'
@@ -4273,6 +4281,7 @@ SELECT POM.OBJID
,POM.TOTAL_PRICE
,POM.DISCOUNT_PRICE
,POM.TOTAL_SUPPLY_UNIT_PRICE
+ ,POM.TOTAL_SUPPLY_PRICE
,POM.NEGO_RATE
,POM.MULTI_MASTER_YN
,POM.MULTI_YN
@@ -4282,6 +4291,7 @@ SELECT POM.OBJID
,S1.CUR_DELIVERY_DATE
,S1.TOTAL_DELIVERY_QTY
+ ,S1.TOTAL_DELIVERY_PRICE
,((SELECT SUM(ORDER_QTY::NUMERIC) FROM PURCHASE_ORDER_PART AS O WHERE POM.OBJID::VARCHAR = O.PURCHASE_ORDER_MASTER_OBJID) - (S1.TOTAL_DELIVERY_QTY )) AS NON_DELIVERY_QTY
@@ -4299,6 +4309,7 @@ SELECT POM.OBJID
,(SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = POM.ORDER_TYPE_CD) AS ORDER_TYPE_CD_NAME
,(SELECT user_name(RECEIVER_ID) FROM ARRIVAL_PLAN AP WHERE AP.parent_objid = POM.OBJID ORDER BY AP.RECEIPT_DATE desc LIMIT 1) AS CUR_RECEIVER_NAME
,(SELECT COUNT(1) FROM ATTACH_FILE_INFO AF WHERE AF.TARGET_OBJID = POM.OBJID AND AF.DOC_TYPE = 'INSPECTION_FILE' AND UPPER(AF.STATUS) = 'ACTIVE') AS INSPECTION_FILE_CNT
+ ,POM.PURCHASE_CLOSE_DATE
FROM PURCHASE_ORDER_MASTER AS POM
,(SELECT
CASE
@@ -702,24 +702,85 @@
ELSE '입고중'
END) AS DELIVERY_STATUS
-
- ,(SELECT U.USER_NAME FROM USER_INFO U WHERE U.USER_ID = IID.INSPECTOR_ID) AS INSPECTOR_NAME
- ,IID.INSPECTION_DATE
- ,(CASE WHEN IID.NG_COUNT > 0 THEN 'NG'
- WHEN IID.TOTAL_COUNT > 0 AND IID.TOTAL_COUNT = IID.INSPECTED_COUNT THEN 'OK'
- WHEN IID.INSPECTED_COUNT > 0 THEN '검사중'
+
+ ,(SELECT U.USER_NAME FROM USER_INFO U WHERE U.USER_ID = IID.REQUEST_USER_ID) AS REQUEST_USER_NAME
+ ,IID.REQUEST_DATE
+
+
+ /* 검사자: XXX 외 N건 형태 */
+ ,DEFECT.INSPECTOR_NAME_DISPLAY AS INSPECTOR_NAME
+ /* 검사일: YYYY-MM-DD 외 N건 형태 */
+ ,DEFECT.INSPECTION_DATE_DISPLAY AS INSPECTION_DATE
+ /* 검사결과: 하나라도 NG면 NG, 검사 대상(스킵 제외) 모두 검사완료면 OK, 일부만 검사면 검사중 */
+ ,(CASE WHEN DEFECT.NG_COUNT > 0 THEN 'NG'
+ WHEN DEFECT.INSPECTION_TARGET_COUNT > 0 AND DEFECT.INSPECTION_TARGET_COUNT = DEFECT.INSPECTED_COUNT THEN 'OK'
+ WHEN DEFECT.INSPECTED_COUNT > 0 THEN '검사중'
ELSE '' END) AS INSPECTION_RESULT
+
+ /* 검사여부: 검사가 하나라도 있으면 '검사', 모두 스킵이면 '스킵', 아무것도 없으면 빈값 */
+ ,(CASE WHEN IID.INSPECTION_YN_COUNT > 0 THEN '검사'
+ WHEN IID.SKIP_YN_COUNT > 0 AND IID.INSPECTION_YN_COUNT = 0 THEN '스킵'
+ ELSE '' END) AS INSPECTION_YN
+
+ /* 요청현황: 입고내역 기준으로 검사여부 선택 현황 계산
+ 미요청: 입고건이 있지만 전부 검사여부 미선택
+ 요청중: 일부만 검사여부 선택됨
+ 요청완료: 전부 검사여부 선택됨 */
+ ,(CASE WHEN REQ.DELIVERY_TOTAL_COUNT IS NULL OR REQ.DELIVERY_TOTAL_COUNT = 0 THEN ''
+ WHEN REQ.SELECTED_COUNT = 0 THEN '미요청'
+ WHEN REQ.SELECTED_COUNT REQ.DELIVERY_TOTAL_COUNT THEN '요청중'
+ ELSE '요청완료' END) AS REQUEST_STATUS
+ ,(SELECT COUNT(1) FROM ATTACH_FILE_INFO AF WHERE AF.TARGET_OBJID = POM.OBJID AND AF.DOC_TYPE = 'INSPECTION_FILE' AND UPPER(AF.STATUS) = 'ACTIVE') AS INSPECTION_FILE_CNT
FROM PURCHASE_ORDER_MASTER AS POM
LEFT OUTER JOIN (
SELECT PURCHASE_ORDER_MASTER_OBJID
- ,MAX(INSPECTOR_ID) AS INSPECTOR_ID
- ,MAX(INSPECTION_DATE) AS INSPECTION_DATE
+ ,MAX(REQUEST_USER_ID) AS REQUEST_USER_ID
+ ,MAX(REQUEST_DATE) AS REQUEST_DATE
,COUNT(*) AS TOTAL_COUNT
- ,COUNT(CASE WHEN INSPECTION_RESULT IS NOT NULL AND INSPECTION_RESULT != '' THEN 1 END) AS INSPECTED_COUNT
- ,COUNT(CASE WHEN INSPECTION_RESULT = 'NG' THEN 1 END) AS NG_COUNT
+ /* 검사여부 카운트: 검사 선택 건수, 스킵 선택 건수 */
+ ,COUNT(CASE WHEN INSPECTION_YN = '검사' THEN 1 END) AS INSPECTION_YN_COUNT
+ ,COUNT(CASE WHEN INSPECTION_YN = '스킵' THEN 1 END) AS SKIP_YN_COUNT
FROM INCOMING_INSPECTION_DETAIL
GROUP BY PURCHASE_ORDER_MASTER_OBJID
) AS IID ON POM.OBJID::VARCHAR = IID.PURCHASE_ORDER_MASTER_OBJID
+ /* 불량상세 테이블에서 검사일/검사자/검사결과 집계 (스킵 항목 제외) */
+ LEFT OUTER JOIN (
+ SELECT IID2.PURCHASE_ORDER_MASTER_OBJID
+ /* 검사자: 여러명이면 "XXX 외 N건" 형태로 표시 */
+ ,CASE
+ WHEN COUNT(DISTINCT IDF.INSPECTOR_ID) > 1
+ THEN (SELECT USER_NAME FROM USER_INFO WHERE USER_ID = MIN(IDF.INSPECTOR_ID)) || ' 외 ' || (COUNT(DISTINCT IDF.INSPECTOR_ID) - 1) || '건'
+ WHEN COUNT(DISTINCT IDF.INSPECTOR_ID) = 1
+ THEN (SELECT USER_NAME FROM USER_INFO WHERE USER_ID = MIN(IDF.INSPECTOR_ID))
+ ELSE ''
+ END AS INSPECTOR_NAME_DISPLAY
+ /* 검사일: 여러개면 "YYYY-MM-DD 외 N건" 형태로 표시 */
+ ,CASE
+ WHEN COUNT(DISTINCT IDF.INSPECTION_DATE) > 1
+ THEN TO_CHAR(MIN(IDF.INSPECTION_DATE), 'YYYY-MM-DD') || ' 외 ' || (COUNT(DISTINCT IDF.INSPECTION_DATE) - 1) || '건'
+ WHEN COUNT(DISTINCT IDF.INSPECTION_DATE) = 1
+ THEN TO_CHAR(MIN(IDF.INSPECTION_DATE), 'YYYY-MM-DD')
+ ELSE ''
+ END AS INSPECTION_DATE_DISPLAY
+ /* 검사 대상 건수 (스킵 제외, 검사인 항목만) */
+ ,COUNT(CASE WHEN IID2.INSPECTION_YN = '검사' THEN 1 END) AS INSPECTION_TARGET_COUNT
+ /* 검사결과 입력된 건수 */
+ ,COUNT(CASE WHEN IDF.INSPECTION_RESULT IS NOT NULL AND IDF.INSPECTION_RESULT != '' THEN 1 END) AS INSPECTED_COUNT
+ ,COUNT(CASE WHEN IDF.INSPECTION_RESULT = 'NG' THEN 1 END) AS NG_COUNT
+ FROM INCOMING_INSPECTION_DETAIL IID2
+ LEFT JOIN INCOMING_INSPECTION_DEFECT IDF ON IDF.INSPECTION_DETAIL_OBJID = IID2.OBJID
+ GROUP BY IID2.PURCHASE_ORDER_MASTER_OBJID
+ ) AS DEFECT ON POM.OBJID::VARCHAR = DEFECT.PURCHASE_ORDER_MASTER_OBJID
+ /* 입고내역 기준 검사여부 선택 현황 (요청현황 계산용) */
+ LEFT OUTER JOIN (
+ SELECT IMI.PURCHASE_ORDER_MASTER_OBJID
+ ,COUNT(*) AS DELIVERY_TOTAL_COUNT
+ ,COUNT(CASE WHEN IID.INSPECTION_YN IS NOT NULL AND IID.INSPECTION_YN != '' THEN 1 END) AS SELECTED_COUNT
+ FROM INVENTORY_MGMT_IN IMI
+ LEFT JOIN INCOMING_INSPECTION_DETAIL IID ON IID.INVENTORY_IN_OBJID = IMI.OBJID
+ WHERE IMI.PURCHASE_ORDER_MASTER_OBJID IS NOT NULL
+ GROUP BY IMI.PURCHASE_ORDER_MASTER_OBJID
+ ) AS REQ ON POM.OBJID::VARCHAR = REQ.PURCHASE_ORDER_MASTER_OBJID
LEFT OUTER JOIN (
SELECT POP.PURCHASE_ORDER_MASTER_OBJID
,SUM(POP.ORDER_QTY::NUMERIC) AS TOTAL_PO_QTY
@@ -792,6 +853,11 @@
WHEN IID.INSPECTED_COUNT > 0 THEN '검사중'
ELSE '' END) = #{search_inspection_result}
+
+
+ AND REQ.DELIVERY_TOTAL_COUNT = REQ.SELECTED_COUNT
+ AND REQ.SELECTED_COUNT > 0
+
ORDER BY POM.REGDATE DESC
@@ -2020,7 +2086,10 @@
) THEN 'Y' ELSE 'N' END AS INSPECTION_FILE
, IID.OBJID AS INSPECTION_DETAIL_OBJID
, IID.INSPECTION_TYPE
- , COALESCE(IID.INSPECTION_YN, '검사') AS INSPECTION_YN
+ , COALESCE(IID.INSPECTION_YN, '') AS INSPECTION_YN
+ , IID.REQUEST_DATE
+ , IID.REQUEST_USER_ID
+ , (SELECT USER_NAME FROM USER_INFO WHERE USER_ID = IID.REQUEST_USER_ID) AS REQUEST_USER_NAME
, IID.DEFECT_TYPE
, (SELECT CODE_NAME FROM COMM_CODE WHERE CODE_ID = IID.DEFECT_TYPE) AS DEFECT_TYPE_NAME
, IID.DEFECT_REASON
@@ -2043,6 +2112,54 @@
LEFT JOIN PURCHASE_ORDER_MASTER POM ON POM.OBJID = IMI.PURCHASE_ORDER_MASTER_OBJID
LEFT JOIN INCOMING_INSPECTION_DETAIL IID ON IID.INVENTORY_IN_OBJID = IMI.OBJID
WHERE IMI.PURCHASE_ORDER_MASTER_OBJID = #{PURCHASE_ORDER_MASTER_OBJID}
+
+ ORDER BY IMI.REGDATE, PM.PART_NO
+
+
+
+
@@ -2062,6 +2179,8 @@
OBJID
, INVENTORY_IN_OBJID
, PURCHASE_ORDER_MASTER_OBJID
+ , REQUEST_DATE
+ , REQUEST_USER_ID
, INSPECTION_DATE
, INSPECTOR_ID
, INSPECTION_TYPE
@@ -2080,6 +2199,8 @@
#{NEW_OBJID}
, #{OBJID}
, #{PURCHASE_ORDER_MASTER_OBJID}
+ , #{REQUEST_DATE}
+ , #{REQUEST_USER_ID}
, #{INSPECTION_DATE}
, #{INSPECTOR_ID}
, #{INSPECTION_TYPE}
@@ -2096,20 +2217,120 @@
, NOW()
)
ON CONFLICT (INVENTORY_IN_OBJID) DO UPDATE SET
- INSPECTION_DATE = #{INSPECTION_DATE}
- , INSPECTOR_ID = #{INSPECTOR_ID}
- , INSPECTION_TYPE = #{INSPECTION_TYPE}
- , INSPECTION_YN = #{INSPECTION_YN}
- , DEFECT_TYPE = #{DEFECT_TYPE}
- , DEFECT_REASON = #{DEFECT_REASON}
- , ACTION_STATUS = #{ACTION_STATUS}
- , INSPECTION_QTY = #{INSPECTION_QTY}
- , DEFECT_QTY = #{DEFECT_QTY}
- , INSPECTION_RESULT = #{INSPECTION_RESULT}
- , ATTACH_FILE_OBJID = #{ATTACH_FILE_OBJID}
- , REMARK = #{REMARK}
+ REQUEST_DATE = COALESCE(#{REQUEST_DATE}, INCOMING_INSPECTION_DETAIL.REQUEST_DATE)
+ , REQUEST_USER_ID = COALESCE(#{REQUEST_USER_ID}, INCOMING_INSPECTION_DETAIL.REQUEST_USER_ID)
+ , INSPECTION_DATE = COALESCE(#{INSPECTION_DATE}, INCOMING_INSPECTION_DETAIL.INSPECTION_DATE)
+ , INSPECTOR_ID = COALESCE(#{INSPECTOR_ID}, INCOMING_INSPECTION_DETAIL.INSPECTOR_ID)
+ , INSPECTION_TYPE = COALESCE(#{INSPECTION_TYPE}, INCOMING_INSPECTION_DETAIL.INSPECTION_TYPE)
+ , INSPECTION_YN = COALESCE(#{INSPECTION_YN}, INCOMING_INSPECTION_DETAIL.INSPECTION_YN)
+ , DEFECT_TYPE = COALESCE(#{DEFECT_TYPE}, INCOMING_INSPECTION_DETAIL.DEFECT_TYPE)
+ , DEFECT_REASON = COALESCE(#{DEFECT_REASON}, INCOMING_INSPECTION_DETAIL.DEFECT_REASON)
+ , ACTION_STATUS = COALESCE(#{ACTION_STATUS}, INCOMING_INSPECTION_DETAIL.ACTION_STATUS)
+ , INSPECTION_QTY = COALESCE(#{INSPECTION_QTY}, INCOMING_INSPECTION_DETAIL.INSPECTION_QTY)
+ , DEFECT_QTY = COALESCE(#{DEFECT_QTY}, INCOMING_INSPECTION_DETAIL.DEFECT_QTY)
+ , INSPECTION_RESULT = COALESCE(#{INSPECTION_RESULT}, INCOMING_INSPECTION_DETAIL.INSPECTION_RESULT)
+ , ATTACH_FILE_OBJID = COALESCE(#{ATTACH_FILE_OBJID}, INCOMING_INSPECTION_DETAIL.ATTACH_FILE_OBJID)
+ , REMARK = COALESCE(#{REMARK}, INCOMING_INSPECTION_DETAIL.REMARK)
, MODIFIER = #{WRITER}
, MOD_DATE = NOW()
+
+
+
+
+
+
+
+ INSERT INTO INCOMING_INSPECTION_DEFECT (
+ OBJID
+ , INSPECTION_DETAIL_OBJID
+ , INSPECTION_TYPE
+ , INSPECTION_DATE
+ , INSPECTOR_ID
+ , DEFECT_TYPE
+ , DEFECT_REASON
+ , ACTION_STATUS
+ , ACTION_RESULT
+ , INSPECTION_QTY
+ , DEFECT_QTY
+ , INSPECTION_RESULT
+ , REMARK
+ , WRITER
+ , REG_DATE
+ ) VALUES (
+ #{OBJID}
+ , #{INSPECTION_DETAIL_OBJID}
+ , #{INSPECTION_TYPE}
+ , #{INSPECTION_DATE}::DATE
+ , #{INSPECTOR_ID}
+ , #{DEFECT_TYPE}
+ , #{DEFECT_REASON}
+ , #{ACTION_STATUS}
+ , #{ACTION_RESULT}
+ , #{INSPECTION_QTY}
+ , #{DEFECT_QTY}
+ , #{INSPECTION_RESULT}
+ , #{REMARK}
+ , #{WRITER}
+ , NOW()
+ )
+ ON CONFLICT (OBJID) DO UPDATE SET
+ INSPECTION_TYPE = #{INSPECTION_TYPE}
+ , INSPECTION_DATE = #{INSPECTION_DATE}::DATE
+ , INSPECTOR_ID = #{INSPECTOR_ID}
+ , DEFECT_TYPE = #{DEFECT_TYPE}
+ , DEFECT_REASON = #{DEFECT_REASON}
+ , ACTION_STATUS = #{ACTION_STATUS}
+ , ACTION_RESULT = #{ACTION_RESULT}
+ , INSPECTION_QTY = #{INSPECTION_QTY}
+ , DEFECT_QTY = #{DEFECT_QTY}
+ , INSPECTION_RESULT = #{INSPECTION_RESULT}
+ , REMARK = #{REMARK}
+ , MODIFIER = #{WRITER}
+ , MOD_DATE = NOW()
+
+
+
+
+ DELETE FROM INCOMING_INSPECTION_DEFECT
+ WHERE OBJID = #{OBJID}
+
+
+
+
+ DELETE FROM INCOMING_INSPECTION_DEFECT
+ WHERE INSPECTION_DETAIL_OBJID = #{INSPECTION_DETAIL_OBJID}
+
+
\ No newline at end of file
diff --git a/src/com/pms/service/PurchaseOrderService.java b/src/com/pms/service/PurchaseOrderService.java
index 17e03f1..cf43668 100644
--- a/src/com/pms/service/PurchaseOrderService.java
+++ b/src/com/pms/service/PurchaseOrderService.java
@@ -3145,4 +3145,36 @@ public class PurchaseOrderService {
public List getDeliveryListForDropdown(HttpServletRequest request, Map paramMap) throws Exception {
return commonService.selectList("purchaseOrder.getDeliveryListForDropdown", request, paramMap);
}
+
+ /**
+ * 매입마감 처리
+ * PURCHASE_ORDER_MASTER의 PURCHASE_CLOSE_DATE를 현재일자로 업데이트
+ * @param objIds 쉼표로 구분된 OBJID 목록
+ * @return 처리 결과
+ */
+ public Map updatePurchaseCloseDate(String objIds) {
+ Map resultMap = new HashMap();
+ SqlSession sqlSession = SqlMapConfig.getInstance().getSqlSession(false);
+
+ try {
+ if(objIds != null && !objIds.isEmpty()) {
+ String[] objIdArr = objIds.split(",");
+ for(String objId : objIdArr) {
+ Map updateParam = new HashMap();
+ updateParam.put("OBJID", objId.trim());
+ sqlSession.update("purchaseOrder.updatePurchaseCloseDate", updateParam);
+ }
+ }
+ sqlSession.commit();
+ resultMap.put("result", "SUCCESS");
+ } catch(Exception e) {
+ sqlSession.rollback();
+ e.printStackTrace();
+ resultMap.put("result", "FAIL");
+ resultMap.put("message", e.getMessage());
+ } finally {
+ sqlSession.close();
+ }
+ return resultMap;
+ }
}
diff --git a/src/com/pms/service/QualityService.java b/src/com/pms/service/QualityService.java
index 651df24..f4c1e8b 100644
--- a/src/com/pms/service/QualityService.java
+++ b/src/com/pms/service/QualityService.java
@@ -17,6 +17,7 @@ import com.pms.common.bean.PersonBean;
import com.pms.common.service.BaseService;
import com.pms.common.utils.CommonUtils;
import com.pms.common.utils.Constants;
+import com.pms.common.JsonUtil;
@Service
public class QualityService extends BaseService{
@@ -661,8 +662,60 @@ public class QualityService extends BaseService{
return resultMap;
}
+ /**
+ * 수입검사 요청 저장 (검사여부, 요청일, 요청자만 저장)
+ */
+ public Map saveIncomingInspectionRequest(HttpServletRequest request, Map paramMap){
+ Map resultMap = new HashMap();
+ SqlSession sqlSession = null;
+ try{
+ sqlSession = SqlMapConfig.getInstance().getSqlSession(false);
+
+ PersonBean person = (PersonBean)request.getSession().getAttribute(Constants.PERSON_BEAN);
+ String writer = CommonUtils.checkNull(person.getUserId());
+
+ String requestDate = CommonUtils.checkNull(paramMap.get("REQUEST_DATE"));
+ String requestUserId = CommonUtils.checkNull(paramMap.get("REQUEST_USER_ID"));
+ String purchaseOrderMasterObjId = CommonUtils.checkNull(paramMap.get("PURCHASE_ORDER_MASTER_OBJID"));
+ String dataListJson = CommonUtils.checkNull(paramMap.get("dataListJson"));
+
+ // JSON 파싱
+ com.google.gson.Gson gson = new com.google.gson.Gson();
+ java.lang.reflect.Type listType = new com.google.gson.reflect.TypeToken>>(){}.getType();
+ List