V2025120101 #90
347
WebContent/WEB-INF/view/common/ImageRegistPopup.jsp
Normal file
347
WebContent/WEB-INF/view/common/ImageRegistPopup.jsp
Normal file
@@ -0,0 +1,347 @@
|
||||
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
|
||||
<%@ page import="com.pms.common.utils.*"%>
|
||||
<%@ page import="java.util.*" %>
|
||||
<%@include file= "/init.jsp" %>
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
<title><%=Constants.SYSTEM_NAME%></title>
|
||||
<style>
|
||||
/* 이미지 미리보기 영역 */
|
||||
.image-preview-container {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 10px;
|
||||
padding: 10px;
|
||||
max-height: 300px;
|
||||
overflow-y: auto;
|
||||
border: 1px solid #ddd;
|
||||
border-radius: 4px;
|
||||
background: #f9f9f9;
|
||||
}
|
||||
.image-preview-item {
|
||||
position: relative;
|
||||
width: 120px;
|
||||
height: 120px;
|
||||
border: 1px solid #ccc;
|
||||
border-radius: 4px;
|
||||
overflow: hidden;
|
||||
background: #fff;
|
||||
}
|
||||
.image-preview-item img {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
object-fit: cover;
|
||||
cursor: pointer;
|
||||
}
|
||||
.image-preview-item .delete-btn {
|
||||
position: absolute;
|
||||
top: 2px;
|
||||
right: 2px;
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
background: rgba(255, 0, 0, 0.8);
|
||||
color: white;
|
||||
border: none;
|
||||
border-radius: 50%;
|
||||
cursor: pointer;
|
||||
font-size: 12px;
|
||||
line-height: 18px;
|
||||
text-align: center;
|
||||
}
|
||||
.image-preview-item .delete-btn:hover {
|
||||
background: rgba(255, 0, 0, 1);
|
||||
}
|
||||
.image-preview-item .file-name {
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
background: rgba(0,0,0,0.6);
|
||||
color: white;
|
||||
font-size: 10px;
|
||||
padding: 2px 4px;
|
||||
text-overflow: ellipsis;
|
||||
overflow: hidden;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.no-image-msg {
|
||||
width: 100%;
|
||||
text-align: center;
|
||||
color: #999;
|
||||
padding: 30px;
|
||||
}
|
||||
/* 드래그앤드롭 영역 */
|
||||
.drop-zone {
|
||||
border: 2px dashed #ccc;
|
||||
border-radius: 8px;
|
||||
padding: 20px;
|
||||
text-align: center;
|
||||
color: #666;
|
||||
margin-bottom: 10px;
|
||||
transition: all 0.3s;
|
||||
}
|
||||
.drop-zone.dragover {
|
||||
border-color: #007bff;
|
||||
background: #e8f4ff;
|
||||
}
|
||||
.drop-zone p {
|
||||
margin: 0;
|
||||
font-size: 14px;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<script>
|
||||
var callbackFnc = "${param.callbackFnc}";
|
||||
var _isChanged = false;
|
||||
var _fileCnt = 0;
|
||||
|
||||
// 이미지 확장자 목록
|
||||
var allowedExtensions = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp'];
|
||||
|
||||
$(document).ready(function(){
|
||||
|
||||
$("#btn_close").click(function(){
|
||||
openerCallback();
|
||||
self.close(0);
|
||||
});
|
||||
|
||||
// 드래그앤드롭 이벤트 설정
|
||||
setupDropZone();
|
||||
|
||||
// 이미지 목록 조회
|
||||
loadImageList();
|
||||
|
||||
// 파일 선택 시 확장자 검사
|
||||
$("#imageFile").change(function(){
|
||||
validateImageFiles(this.files);
|
||||
});
|
||||
|
||||
// 업로드 버튼
|
||||
$("#btnUpload").click(function(){
|
||||
var files = $("#imageFile")[0].files;
|
||||
if(files.length > 0){
|
||||
if(validateImageFiles(files)){
|
||||
uploadImages(files);
|
||||
}
|
||||
}else{
|
||||
Swal.fire("선택된 이미지가 없습니다.");
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// 드래그앤드롭 영역 설정
|
||||
function setupDropZone(){
|
||||
var dropZone = document.getElementById("imageDropZone");
|
||||
|
||||
dropZone.addEventListener("dragover", function(e){
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
$(this).addClass("dragover");
|
||||
});
|
||||
|
||||
dropZone.addEventListener("dragleave", function(e){
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
$(this).removeClass("dragover");
|
||||
});
|
||||
|
||||
dropZone.addEventListener("drop", function(e){
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
$(this).removeClass("dragover");
|
||||
|
||||
var files = e.dataTransfer.files;
|
||||
if(files.length > 0){
|
||||
if(validateImageFiles(files)){
|
||||
uploadImages(files);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// 이미지 파일 검증
|
||||
function validateImageFiles(files){
|
||||
for(var i = 0; i < files.length; i++){
|
||||
var fileName = files[i].name;
|
||||
var ext = fileName.split('.').pop().toLowerCase();
|
||||
|
||||
if(allowedExtensions.indexOf(ext) === -1){
|
||||
Swal.fire({
|
||||
icon: 'error',
|
||||
title: '허용되지 않는 파일 형식',
|
||||
text: '이미지 파일만 업로드 가능합니다.\n허용 확장자: ' + allowedExtensions.join(', ')
|
||||
});
|
||||
$("#imageFile").val("");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
// 이미지 업로드 - 기존 fnc_fileMultiUpload 함수 사용
|
||||
function uploadImages(files){
|
||||
fnc_fileMultiUpload(files, null, "${param.targetObjId}", "${param.docType}", "${param.docTypeName}", null, "loadImageList", null, "");
|
||||
}
|
||||
|
||||
// 이미지 목록 조회
|
||||
function loadImageList(){
|
||||
$.ajax({
|
||||
url: "/common/getFileList.do",
|
||||
type: "POST",
|
||||
data: {
|
||||
"targetObjId": "${param.targetObjId}",
|
||||
"docType": "${param.docType}"
|
||||
},
|
||||
dataType: "json",
|
||||
async: false,
|
||||
success: function(data){
|
||||
// 부모 창 새로고침
|
||||
if(opener && typeof opener.fn_search == "function"){
|
||||
opener.fn_search();
|
||||
}
|
||||
_fileCnt = data.length;
|
||||
renderImageList(data);
|
||||
openerCallback();
|
||||
},
|
||||
error: function(){
|
||||
console.error("이미지 목록 조회 실패");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// 이미지 목록 렌더링
|
||||
function renderImageList(data){
|
||||
var container = $("#imagePreviewArea");
|
||||
container.empty();
|
||||
|
||||
if(data.length == 0){
|
||||
container.append('<div class="no-image-msg">등록된 이미지가 없습니다.</div>');
|
||||
return;
|
||||
}
|
||||
|
||||
$.each(data, function(i, file){
|
||||
var ext = file.UPPER_FILE_EXT;
|
||||
// 이미지 파일인 경우만 표시
|
||||
if(allowedExtensions.indexOf(ext.toLowerCase()) > -1){
|
||||
// objId 기반으로 이미지 표시 (viewImageByObjId.do 사용)
|
||||
var imgSrc = "/common/viewImageByObjId.do?objId=" + file.OBJID;
|
||||
|
||||
var html = '<div class="image-preview-item">';
|
||||
html += '<img src="' + imgSrc + '" onclick="viewImage(\'' + imgSrc + '\')" title="클릭하여 원본보기">';
|
||||
// 삭제 권한 체크
|
||||
if(file.WRITER == "${connectUserId}" || "${connectUserId}" == "plm_admin"){
|
||||
html += '<button type="button" class="delete-btn" onclick="deleteImage(\'' + file.OBJID + '\', event)" title="삭제">×</button>';
|
||||
}
|
||||
html += '<div class="file-name" title="' + file.REAL_FILE_NAME + '">' + file.REAL_FILE_NAME + '</div>';
|
||||
html += '</div>';
|
||||
container.append(html);
|
||||
}
|
||||
});
|
||||
|
||||
// 이미지가 하나도 없는 경우
|
||||
if(container.children().length == 0){
|
||||
container.append('<div class="no-image-msg">등록된 이미지가 없습니다.</div>');
|
||||
}
|
||||
}
|
||||
|
||||
// 이미지 원본 보기 - 새 창에서 이미지 표시
|
||||
function viewImage(imgUrl){
|
||||
var img = new Image();
|
||||
img.src = imgUrl;
|
||||
// 이미지 크기에 맞게 팝업 열기
|
||||
img.onload = function(){
|
||||
var width = Math.min(img.width + 30, 1200);
|
||||
var height = Math.min(img.height + 30, 800);
|
||||
window.open(imgUrl, "ImageViewPopUp", "width=" + width + ",height=" + height + ",scrollbars=yes,resizable=yes");
|
||||
};
|
||||
// 이미지 로딩 실패시 기본 크기로 열기
|
||||
img.onerror = function(){
|
||||
window.open(imgUrl, "ImageViewPopUp", "width=800,height=600,scrollbars=yes,resizable=yes");
|
||||
};
|
||||
}
|
||||
|
||||
// 이미지 삭제
|
||||
function deleteImage(fileObjId, event){
|
||||
// 이벤트 전파 방지
|
||||
if(event){
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
}
|
||||
|
||||
if(confirm("이미지를 삭제하시겠습니까?")){
|
||||
$.ajax({
|
||||
url: "/common/deleteFileInfo.do",
|
||||
type: "POST",
|
||||
data: {"objId": fileObjId},
|
||||
dataType: "json",
|
||||
success: function(){
|
||||
loadImageList();
|
||||
// 부모 창 새로고침
|
||||
if(opener && typeof opener.fn_search == "function"){
|
||||
opener.fn_search();
|
||||
}
|
||||
},
|
||||
error: function(){
|
||||
alert("삭제 실패: 서버 통신 오류가 발생했습니다.");
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// 부모 창 콜백
|
||||
function openerCallback(){
|
||||
if((fnc_isEmpty(callbackFnc) || callbackFnc == "fnc_tabulCallbackFnc") && opener && opener.fnc_tabulCallbackFnc){
|
||||
opener.fnc_tabulCallbackFnc("${param.targetObjId}", "${param.docType}", "${param.columnField}", _fileCnt);
|
||||
}else if(fnc_checkNull(callbackFnc) != "" && opener){
|
||||
opener.eval(callbackFnc+"();");
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<body>
|
||||
<form name="form1" action="" method="post">
|
||||
<input type="hidden" name="fileList" id="fileList" />
|
||||
<section class="business_staff_popup_min_width">
|
||||
<div class="plm_menu_name">
|
||||
<h2>
|
||||
<span>이미지 등록</span>
|
||||
</h2>
|
||||
</div>
|
||||
<div id="businessPopupFormWrap">
|
||||
<table class="pmsPopupForm">
|
||||
<tr>
|
||||
<td class="input_title align_c" style="width:80px;">이미지<br>업로드</td>
|
||||
<td>
|
||||
<!-- 드래그앤드롭 영역 -->
|
||||
<div id="imageDropZone" class="drop-zone">
|
||||
<p>📷 이미지 파일을 여기에 드래그하거나 아래에서 선택하세요</p>
|
||||
<p style="font-size:11px; color:#999; margin-top:5px;">허용 확장자: jpg, jpeg, png, gif, bmp, webp</p>
|
||||
</div>
|
||||
<!-- 파일 선택 -->
|
||||
<div style="margin-bottom: 10px;">
|
||||
<input type="file" name="imageFile" id="imageFile" multiple accept="image/*">
|
||||
<input type="button" id="btnUpload" value="업로드" class="plm_btns">
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="input_title align_c">이미지<br>목록</td>
|
||||
<td>
|
||||
<!-- 이미지 미리보기 영역 -->
|
||||
<div id="imagePreviewArea" class="image-preview-container">
|
||||
<div class="no-image-msg">등록된 이미지가 없습니다.</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<div class="btn_wrap">
|
||||
<div class="plm_btn_wrap_center">
|
||||
<input type="button" value="닫기" id="btn_close" class="plm_btns">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</form>
|
||||
</body>
|
||||
</html>
|
||||
@@ -3,23 +3,84 @@
|
||||
<%@ 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" %>
|
||||
<%@include file= "/init_new.jsp" %>
|
||||
<%
|
||||
String menuObjId = request.getParameter("menuObjId");
|
||||
String menuName = CommonUtils.getMenuName(menuObjId, "조치결과 등록");
|
||||
String actionType = CommonUtils.checkNull(request.getParameter("actionType"));
|
||||
// 뷰 모드인지 판단
|
||||
boolean isViewMode = "view".equals(actionType);
|
||||
String menuName = isViewMode ? "조치결과 조회" : CommonUtils.getMenuName(menuObjId, "조치결과 등록");
|
||||
|
||||
Map info = (Map)request.getAttribute("info");
|
||||
if(info == null) info = new HashMap();
|
||||
|
||||
String objId = CommonUtils.checkNull(info.get("objid"));
|
||||
|
||||
// 오늘 날짜
|
||||
String today = new java.text.SimpleDateFormat("yyyy-MM-dd").format(new java.util.Date());
|
||||
String actionDate = CommonUtils.checkNull(info.get("action_date"));
|
||||
if(actionDate.isEmpty()) actionDate = today;
|
||||
|
||||
// 조치자
|
||||
String actionUserName = CommonUtils.checkNull(info.get("action_user_name"));
|
||||
if(actionUserName.isEmpty()) actionUserName = connectUserName;
|
||||
%>
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
<title><%=Constants.SYSTEM_NAME%></title>
|
||||
<style>
|
||||
body { min-height: auto !important; }
|
||||
.two_column_container {
|
||||
display: flex;
|
||||
gap: 15px;
|
||||
padding: 10px;
|
||||
}
|
||||
.two_column_container > div {
|
||||
flex: 1;
|
||||
}
|
||||
.two_column_container .pmsPopuptable tr {
|
||||
height: 38px;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<script type="text/javascript">
|
||||
var isViewMode = <%=isViewMode%>;
|
||||
|
||||
$(document).ready(function(){
|
||||
fnc_datepick();
|
||||
$('.select2').select2();
|
||||
|
||||
// 기존 값 선택
|
||||
var savedBlameDecision = "${info.blame_decision}";
|
||||
var savedStatus = "${info.status}";
|
||||
if(savedBlameDecision) $("#BLAME_DECISION").val(savedBlameDecision).trigger('change');
|
||||
if(savedStatus) $("#STATUS").val(savedStatus).trigger('change');
|
||||
|
||||
// 뷰 모드일 경우 입력 필드 비활성화
|
||||
if(isViewMode){
|
||||
$("#form1 input, #form1 textarea, #form1 select").prop("disabled", true);
|
||||
$("#btnSave, #btnUpload, #file1").hide();
|
||||
// 파일 삭제 버튼 숨기기
|
||||
$(".delete_btn").parent().hide();
|
||||
} else {
|
||||
// 첨부파일 드래그앤드랍 설정 (뷰 모드가 아닐 때만)
|
||||
fnc_setFileDropZone("srDropZone", "<%=objId%>", "CUSTOMER_CS_ACTION", "조치첨부", "srAreaDraw", false, null, null, null, "");
|
||||
}
|
||||
srAreaDraw();
|
||||
|
||||
// 파일 업로드 버튼
|
||||
$("#btnUpload").click(function(){
|
||||
var files = $("#file1")[0].files;
|
||||
if(files.length > 0){
|
||||
fnc_fileMultiUpload(files, null, "<%=objId%>", "CUSTOMER_CS_ACTION", "조치첨부", null, "srAreaDraw", null, "");
|
||||
$("#file1").val("");
|
||||
}else{
|
||||
Swal.fire("선택된 파일이 없습니다.");
|
||||
}
|
||||
});
|
||||
|
||||
// 저장
|
||||
$("#btnSave").click(function(){
|
||||
@@ -32,105 +93,321 @@ $(document).ready(function(){
|
||||
});
|
||||
});
|
||||
|
||||
// 첨부파일 목록 새로고침
|
||||
function srAreaDraw(){
|
||||
fn_fileCallback("sr", "CUSTOMER_CS_ACTION");
|
||||
}
|
||||
|
||||
// 첨부파일 목록 조회
|
||||
function fn_fileCallback(areaId, fileType){
|
||||
$.ajax({
|
||||
url: "/common/getFileList.do",
|
||||
type: "POST",
|
||||
data: {"targetObjId": "<%=objId%>", "docType": fileType},
|
||||
dataType: "json",
|
||||
async: false,
|
||||
success: function(data){
|
||||
$("#" + areaId + "FileArea").empty();
|
||||
if(data.length > 0){
|
||||
$.each(data, function(i){
|
||||
var appendText = "";
|
||||
var fileExt = data[i].UPPER_FILE_EXT;
|
||||
appendText += "<tr>";
|
||||
appendText += "<td>" + (i + 1) + "</td>";
|
||||
if(fileExt == 'PDF'){
|
||||
appendText += "<td class='align_l'><a href='javascript:fnc_viewPdfFile(\"" + data[i].OBJID + "\")'> " + data[i].REAL_FILE_NAME + "</a>";
|
||||
}else{
|
||||
appendText += "<td class='align_l'><a href='javascript:fnc_downloadFile(\"" + data[i].OBJID + "\")'> " + data[i].REAL_FILE_NAME + "</a>";
|
||||
}
|
||||
// 뷰 모드가 아닐 때만 삭제 버튼 표시
|
||||
if(!isViewMode){
|
||||
appendText += "<a href='javascript:fn_fileDelete(\"" + data[i].OBJID + "\")'><div class='delete_btn'></div></a>";
|
||||
}
|
||||
appendText += "</td>";
|
||||
appendText += "<td>" + data[i].REGDATE + "</td>";
|
||||
appendText += "<td>" + data[i].FILE_SIZE + "</td>";
|
||||
appendText += "</tr>";
|
||||
$("#" + areaId + "FileArea").append(appendText);
|
||||
});
|
||||
}else{
|
||||
var appendText = "<tr><td colspan='4'>첨부 파일이 없습니다.</td></tr>";
|
||||
$("#" + areaId + "FileArea").append(appendText);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// PDF 미리보기
|
||||
function fnc_viewPdfFile(fileObjId){
|
||||
window.open("/common/downloadFile.do?objId=" + fileObjId, "_blank");
|
||||
}
|
||||
|
||||
// 첨부파일 삭제
|
||||
function fn_fileDelete(fileObjId){
|
||||
// 뷰 모드에서는 삭제 불가
|
||||
if(isViewMode) return;
|
||||
|
||||
if(confirm("파일을 삭제하시겠습니까?")){
|
||||
$.ajax({
|
||||
url: "/common/deleteFileInfo.do",
|
||||
type: "POST",
|
||||
data: {"objId": fileObjId},
|
||||
dataType: "json",
|
||||
async: false,
|
||||
success: function(data){
|
||||
srAreaDraw();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function fn_save(){
|
||||
// TODO: 저장 로직 구현
|
||||
Swal.fire("저장 기능 준비중입니다.");
|
||||
// 유효성 검사
|
||||
if(!fnc_valitate("form1")){
|
||||
return;
|
||||
}
|
||||
|
||||
Swal.fire({
|
||||
title: '저장하시겠습니까?',
|
||||
icon: 'question',
|
||||
showCancelButton: true,
|
||||
confirmButtonText: '저장',
|
||||
cancelButtonText: '취소'
|
||||
}).then((result) => {
|
||||
if(result.isConfirmed){
|
||||
$.ajax({
|
||||
url: "/quality/saveCustomerCsAction.do",
|
||||
type: "POST",
|
||||
data: $("#form1").serialize(),
|
||||
dataType: "json",
|
||||
success: function(result){
|
||||
if(result.RESULT == "SUCCESS"){
|
||||
Swal.fire({
|
||||
title: '저장되었습니다.',
|
||||
icon: 'success'
|
||||
}).then(() => {
|
||||
if(window.opener && window.opener.fn_search){
|
||||
window.opener.fn_search();
|
||||
}
|
||||
window.close();
|
||||
});
|
||||
} else {
|
||||
Swal.fire({
|
||||
title: '저장 실패',
|
||||
text: result.MESSAGE || '저장 중 오류가 발생했습니다.',
|
||||
icon: 'error'
|
||||
});
|
||||
}
|
||||
},
|
||||
error: function(xhr, status, error){
|
||||
Swal.fire({
|
||||
title: '저장 실패',
|
||||
text: '서버 통신 오류가 발생했습니다.',
|
||||
icon: 'error'
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
|
||||
<body>
|
||||
<form name="form1" id="form1" method="post">
|
||||
<input type="hidden" name="OBJID" id="OBJID" value="<%=CommonUtils.checkNull(info.get("OBJID"))%>">
|
||||
<div class="popup_wrap">
|
||||
<div class="popup_header">
|
||||
<h2><%=menuName%></h2>
|
||||
<div class="btnArea">
|
||||
<input type="button" class="plm_btns" value="저장" id="btnSave">
|
||||
<input type="button" class="plm_btns" value="닫기" id="btnClose">
|
||||
<input type="hidden" name="OBJID" id="OBJID" value="${info.objid}">
|
||||
|
||||
<section class="business_staff_popup_min_width">
|
||||
<div class="plm_menu_name">
|
||||
<h2>
|
||||
<span><%=menuName%></span>
|
||||
</h2>
|
||||
</div>
|
||||
|
||||
<div id="EntirePopupFormWrap">
|
||||
<div class="two_column_container">
|
||||
<!-- 왼쪽: 접수 정보 -->
|
||||
<div>
|
||||
<div class="form_popup_title">
|
||||
<span>접수 정보</span>
|
||||
</div>
|
||||
<table class="">
|
||||
<colgroup>
|
||||
<col width="90%" />
|
||||
</colgroup>
|
||||
<tr>
|
||||
<td>
|
||||
<table class="pmsPopuptable">
|
||||
<colgroup>
|
||||
<col width="20%" />
|
||||
<col width="30%" />
|
||||
<col width="20%" />
|
||||
<col width="30%" />
|
||||
</colgroup>
|
||||
<tr>
|
||||
<!-- <td class="input_title"><label>접수번호</label></td>
|
||||
<td>${info.receipt_no}</td> -->
|
||||
<td class="input_title"><label>접수일</label></td>
|
||||
<td>${info.receipt_date}</td>
|
||||
<td class="input_title"><label>수량</label></td>
|
||||
<td>${info.qty}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="input_title"><label>고객사</label></td>
|
||||
<td>${info.customer_name}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<!-- <td class="input_title"><label>모델명</label></td>
|
||||
<td>${info.model_name}</td> -->
|
||||
<td class="input_title"><label>품명</label></td>
|
||||
<td>${info.product_name}</td>
|
||||
<td class="input_title"><label>품번</label></td>
|
||||
<td>${info.product_no}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="input_title"><label>부품품명</label></td>
|
||||
<td>${info.part_name}</td>
|
||||
<td class="input_title"><label>부품품번</label></td>
|
||||
<td>${info.part_no}</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td class="input_title"><label>생산일</label></td>
|
||||
<td>${info.production_date}</td>
|
||||
<td class="input_title"><label>판매일</label></td>
|
||||
<td>${info.sales_date}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="input_title"><label>S/N</label></td>
|
||||
<td>${info.serial_no}</td>
|
||||
<td class="input_title"><label>제조사</label></td>
|
||||
<td colspan="3">${info.manufacturer}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="input_title"><label>불만내용</label></td>
|
||||
<td colspan="3">
|
||||
<textarea rows="4" style="width:100%;" readonly>${info.complaint_content}</textarea>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<!-- 오른쪽: 조치결과 등록 -->
|
||||
<div>
|
||||
<div class="form_popup_title">
|
||||
<span>조치결과 등록</span>
|
||||
</div>
|
||||
<table class="">
|
||||
<colgroup>
|
||||
<col width="110%" />
|
||||
</colgroup>
|
||||
<tr>
|
||||
<td>
|
||||
<table class="pmsPopuptable">
|
||||
<colgroup>
|
||||
<col width="20%" />
|
||||
<col width="30%" />
|
||||
<col width="20%" />
|
||||
<col width="30%" />
|
||||
</colgroup>
|
||||
<tr>
|
||||
<td class="input_title"><label>귀책판정 <span style="color:red;">*</span></label></td>
|
||||
<td>
|
||||
<select name="BLAME_DECISION" id="BLAME_DECISION" class="select2" required reqTitle="귀책판정" type="select">
|
||||
<option value="">선택</option>
|
||||
<option value="R">R</option>
|
||||
<option value="C">C</option>
|
||||
<option value="O">O</option>
|
||||
</select>
|
||||
</td>
|
||||
<td class="input_title"><label>상태 <span style="color:red;">*</span></label></td>
|
||||
<td>
|
||||
<select name="STATUS" id="STATUS" class="select2" required reqTitle="상태" type="select">
|
||||
<option value="">선택</option>
|
||||
<option value="Open">Open</option>
|
||||
<option value="Closed">Closed</option>
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="input_title"><label>조치일 <span style="color:red;">*</span></label></td>
|
||||
<td>
|
||||
<input type="text" name="ACTION_DATE" id="ACTION_DATE" class="date_icon" value="<%=actionDate%>" required reqTitle="조치일">
|
||||
</td>
|
||||
<td class="input_title"><label>조치자 <span style="color:red;">*</span></label></td>
|
||||
<td>
|
||||
<input type="text" name="ACTION_USER_NAME" id="ACTION_USER_NAME" value="<%=actionUserName%>" readonly>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="input_title"><label>조치내용 <span style="color:red;">*</span></label></td>
|
||||
<td colspan="3">
|
||||
<textarea name="ACTION_CONTENT" id="ACTION_CONTENT" rows="3" style="width:100%;" required reqTitle="조치내용" type="text">${info.action_content}</textarea>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="input_title"><label>비고</label></td>
|
||||
<td colspan="3">
|
||||
<textarea name="REMARK" id="REMARK" rows="2" style="width:100%;">${info.remark}</textarea>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="input_title"><label>첨부파일</label></td>
|
||||
<td colspan="3">
|
||||
<div style="margin-bottom: 5px;">
|
||||
<input type="file" name="file1" id="file1" multiple style="width:80%;">
|
||||
<input type="button" id="btnUpload" value="업로드" class="plm_btns">
|
||||
</div>
|
||||
<div id="srFileAreaTable" class="spec_data_in_table">
|
||||
<div style="overflow-y:auto;">
|
||||
<table class="fileListscrollThead" style="width:100% !important;">
|
||||
<colgroup>
|
||||
<col width="30px">
|
||||
<col width="*">
|
||||
<col width="80px">
|
||||
<col width="60px">
|
||||
</colgroup>
|
||||
<tr>
|
||||
<td>No</td>
|
||||
<td>파일명</td>
|
||||
<td>등록일</td>
|
||||
<td>Size</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div style="max-height: 80px; overflow-y: auto; border-bottom: 1px solid #cacaca;">
|
||||
<table class="fileListscrollTbody">
|
||||
<colgroup>
|
||||
<col width="30px">
|
||||
<col width="*">
|
||||
<col width="80px">
|
||||
<col width="60px">
|
||||
</colgroup>
|
||||
<tbody id="srFileArea">
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<div class="popup_content">
|
||||
<h3 style="margin-bottom:10px;">■ 접수 정보</h3>
|
||||
<table class="plm_form_table">
|
||||
<colgroup>
|
||||
<col width="100px"><col width="*">
|
||||
<col width="100px"><col width="*">
|
||||
<col width="100px"><col width="*">
|
||||
</colgroup>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="label">접수번호</td>
|
||||
<td><input type="text" name="RECEIPT_NO" id="RECEIPT_NO" value="<%=CommonUtils.checkNull(info.get("RECEIPT_NO"))%>" readonly></td>
|
||||
<td class="label">접수일</td>
|
||||
<td><input type="text" name="RECEIPT_DATE" id="RECEIPT_DATE" value="<%=CommonUtils.checkNull(info.get("RECEIPT_DATE"))%>" readonly></td>
|
||||
<td class="label">고객사</td>
|
||||
<td><input type="text" name="CUSTOMER_NAME" id="CUSTOMER_NAME" value="<%=CommonUtils.checkNull(info.get("CUSTOMER_NAME"))%>" readonly></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="label">모델명</td>
|
||||
<td><input type="text" name="MODEL_NAME" id="MODEL_NAME" value="<%=CommonUtils.checkNull(info.get("MODEL_NAME"))%>" readonly></td>
|
||||
<td class="label">제품명</td>
|
||||
<td><input type="text" name="PRODUCT_NAME" id="PRODUCT_NAME" value="<%=CommonUtils.checkNull(info.get("PRODUCT_NAME"))%>" readonly></td>
|
||||
<td class="label">품번</td>
|
||||
<td><input type="text" name="PART_NO" id="PART_NO" value="<%=CommonUtils.checkNull(info.get("PART_NO"))%>" readonly></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="label">불만내용</td>
|
||||
<td colspan="5"><textarea name="COMPLAINT_CONTENT" id="COMPLAINT_CONTENT" rows="2" style="width:100%;" readonly><%=CommonUtils.checkNull(info.get("COMPLAINT_CONTENT"))%></textarea></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<h3 style="margin:20px 0 10px 0;">■ 조치 정보</h3>
|
||||
<table class="plm_form_table">
|
||||
<colgroup>
|
||||
<col width="100px"><col width="*">
|
||||
<col width="100px"><col width="*">
|
||||
<col width="100px"><col width="*">
|
||||
</colgroup>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="label">조치일</td>
|
||||
<td><input type="text" name="ACTION_DATE" id="ACTION_DATE" class="date_icon" value="<%=CommonUtils.checkNull(info.get("ACTION_DATE"))%>"></td>
|
||||
<td class="label">조치자</td>
|
||||
<td><input type="text" name="ACTION_USER_NAME" id="ACTION_USER_NAME" value="<%=CommonUtils.checkNull(info.get("ACTION_USER_NAME"))%>"></td>
|
||||
<td class="label">상태</td>
|
||||
<td>
|
||||
<select name="STATUS" id="STATUS">
|
||||
<option value="접수" <%="접수".equals(info.get("STATUS"))?"selected":""%>>접수</option>
|
||||
<option value="처리중" <%="처리중".equals(info.get("STATUS"))?"selected":""%>>처리중</option>
|
||||
<option value="완료" <%="완료".equals(info.get("STATUS"))?"selected":""%>>완료</option>
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="label">귀책판정</td>
|
||||
<td>
|
||||
<select name="BLAME_DECISION" id="BLAME_DECISION">
|
||||
<option value="">선택</option>
|
||||
<option value="자사" <%="자사".equals(info.get("BLAME_DECISION"))?"selected":""%>>자사</option>
|
||||
<option value="고객" <%="고객".equals(info.get("BLAME_DECISION"))?"selected":""%>>고객</option>
|
||||
<option value="협력사" <%="협력사".equals(info.get("BLAME_DECISION"))?"selected":""%>>협력사</option>
|
||||
</select>
|
||||
</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="label">조치내용</td>
|
||||
<td colspan="5"><textarea name="ACTION_CONTENT" id="ACTION_CONTENT" rows="3" style="width:100%;"><%=CommonUtils.checkNull(info.get("ACTION_CONTENT"))%></textarea></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="label">비고</td>
|
||||
<td colspan="5"><textarea name="REMARK" id="REMARK" rows="2" style="width:100%;"><%=CommonUtils.checkNull(info.get("REMARK"))%></textarea></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<div class="btn_wrap">
|
||||
<div class="plm_btn_wrap_center">
|
||||
<input type="button" value="저장" id="btnSave" class="plm_btns">
|
||||
<input type="button" value="닫기" id="btnClose" class="plm_btns">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</section>
|
||||
</form>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
||||
@@ -3,21 +3,40 @@
|
||||
<%@ 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" %>
|
||||
<%@include file= "/init_new.jsp" %>
|
||||
<%
|
||||
String menuObjId = request.getParameter("menuObjId");
|
||||
String menuName = CommonUtils.getMenuName(menuObjId, "고객 불량 등록");
|
||||
String actionType = CommonUtils.checkNull(request.getParameter("actionType"));
|
||||
|
||||
// OBJID가 없으면 신규 생성 (첨부파일 연결용)
|
||||
String objId = CommonUtils.checkNull(request.getAttribute("info") != null ? ((Map)request.getAttribute("info")).get("objid") : "");
|
||||
boolean isNew = objId.isEmpty() || "new".equals(actionType);
|
||||
if(objId.isEmpty()){
|
||||
objId = String.valueOf(CommonUtils.createObjId());
|
||||
}
|
||||
%>
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
<title><%=Constants.SYSTEM_NAME%></title>
|
||||
<style>
|
||||
body { min-height: auto !important; }
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<script type="text/javascript">
|
||||
$(document).ready(function(){
|
||||
fnc_datepick();
|
||||
$('.select2').select2();
|
||||
|
||||
// 수정 모드인 경우 기존 값 선택
|
||||
var savedBlameDecision = "${info.blame_decision}";
|
||||
var savedStatus = "${info.status}";
|
||||
if(savedBlameDecision) $("#BLAME_DECISION").val(savedBlameDecision).trigger('change');
|
||||
if(savedStatus) $("#STATUS").val(savedStatus).trigger('change');
|
||||
|
||||
|
||||
// 저장
|
||||
$("#btnSave").click(function(){
|
||||
@@ -30,88 +49,173 @@ $(document).ready(function(){
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
|
||||
// PDF 미리보기
|
||||
function fnc_viewPdfFile(fileObjId){
|
||||
window.open("/common/downloadFile.do?objId=" + fileObjId, "_blank");
|
||||
}
|
||||
|
||||
|
||||
function fn_save(){
|
||||
// TODO: 저장 로직 구현
|
||||
Swal.fire("저장 기능 준비중입니다.");
|
||||
// 유효성 검사
|
||||
if(!fnc_valitate("form1")){
|
||||
return;
|
||||
}
|
||||
|
||||
Swal.fire({
|
||||
title: '저장하시겠습니까?',
|
||||
icon: 'question',
|
||||
showCancelButton: true,
|
||||
confirmButtonText: '저장',
|
||||
cancelButtonText: '취소'
|
||||
}).then((result) => {
|
||||
if(result.isConfirmed){
|
||||
$.ajax({
|
||||
url: "/quality/saveCustomerCsDefect.do",
|
||||
type: "POST",
|
||||
data: $("#form1").serialize(),
|
||||
dataType: "json",
|
||||
success: function(result){
|
||||
if(result.RESULT == "SUCCESS"){
|
||||
Swal.fire({
|
||||
title: '저장되었습니다.',
|
||||
icon: 'success'
|
||||
}).then(() => {
|
||||
if(window.opener && window.opener.fn_search){
|
||||
window.opener.fn_search();
|
||||
}
|
||||
window.close();
|
||||
});
|
||||
} else {
|
||||
Swal.fire({
|
||||
title: '저장 실패',
|
||||
text: result.MESSAGE || '저장 중 오류가 발생했습니다.',
|
||||
icon: 'error'
|
||||
});
|
||||
}
|
||||
},
|
||||
error: function(xhr, status, error){
|
||||
Swal.fire({
|
||||
title: '저장 실패',
|
||||
text: '서버 통신 오류가 발생했습니다.',
|
||||
icon: 'error'
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
|
||||
<body>
|
||||
<form name="form1" id="form1" method="post">
|
||||
<div class="popup_wrap">
|
||||
<div class="popup_header">
|
||||
<h2><%=menuName%></h2>
|
||||
<div class="btnArea">
|
||||
<input type="button" class="plm_btns" value="저장" id="btnSave">
|
||||
<input type="button" class="plm_btns" value="닫기" id="btnClose">
|
||||
</div>
|
||||
<input type="hidden" name="OBJID" id="OBJID" value="<%=objId%>">
|
||||
<input type="hidden" name="ATTACH_FILE_OBJID" id="ATTACH_FILE_OBJID" value="<%=objId%>">
|
||||
<input type="hidden" name="IS_NEW" id="IS_NEW" value="<%=isNew%>">
|
||||
|
||||
<section class="business_staff_popup_min_width">
|
||||
<div class="plm_menu_name">
|
||||
<h2>
|
||||
<span><%=menuName%></span>
|
||||
</h2>
|
||||
</div>
|
||||
|
||||
<div id="EntirePopupFormWrap">
|
||||
<div class="form_popup_title">
|
||||
<span>기본정보</span>
|
||||
</div>
|
||||
<div class="popup_content">
|
||||
<table class="plm_form_table">
|
||||
<colgroup>
|
||||
<col width="100px"><col width="*">
|
||||
<col width="100px"><col width="*">
|
||||
<col width="100px"><col width="*">
|
||||
</colgroup>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="label">접수일</td>
|
||||
<td><input type="text" name="RECEIPT_DATE" id="RECEIPT_DATE" class="date_icon"></td>
|
||||
<td class="label">수량</td>
|
||||
<td><input type="text" name="QTY" id="QTY"></td>
|
||||
<td class="label">고객사</td>
|
||||
<td><input type="text" name="CUSTOMER_NAME" id="CUSTOMER_NAME"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="label">모델명</td>
|
||||
<td><input type="text" name="MODEL_NAME" id="MODEL_NAME"></td>
|
||||
<td class="label">제품명</td>
|
||||
<td><input type="text" name="PRODUCT_NAME" id="PRODUCT_NAME"></td>
|
||||
<td class="label">품번</td>
|
||||
<td><input type="text" name="PART_NO" id="PART_NO"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="label">생산일</td>
|
||||
<td><input type="text" name="PRODUCTION_DATE" id="PRODUCTION_DATE" class="date_icon"></td>
|
||||
<td class="label">판매일</td>
|
||||
<td><input type="text" name="SALES_DATE" id="SALES_DATE" class="date_icon"></td>
|
||||
<td class="label">S/N</td>
|
||||
<td><input type="text" name="SERIAL_NO" id="SERIAL_NO"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="label">제조사</td>
|
||||
<td><input type="text" name="MANUFACTURER" id="MANUFACTURER"></td>
|
||||
<td class="label">귀책판정</td>
|
||||
<td>
|
||||
<select name="BLAME_DECISION" id="BLAME_DECISION">
|
||||
<option value="">선택</option>
|
||||
<option value="자사">자사</option>
|
||||
<option value="고객">고객</option>
|
||||
<option value="협력사">협력사</option>
|
||||
</select>
|
||||
</td>
|
||||
<td class="label">상태</td>
|
||||
<td>
|
||||
<select name="STATUS" id="STATUS">
|
||||
<option value="접수">접수</option>
|
||||
<option value="처리중">처리중</option>
|
||||
<option value="완료">완료</option>
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="label">불만내용</td>
|
||||
<td colspan="5"><textarea name="COMPLAINT_CONTENT" id="COMPLAINT_CONTENT" rows="3" style="width:100%;"></textarea></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="label">비고</td>
|
||||
<td colspan="5"><textarea name="REMARK" id="REMARK" rows="2" style="width:100%;"></textarea></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<table class="pmsPopupForm">
|
||||
<colgroup>
|
||||
<col width="15%" />
|
||||
<col width="35%" />
|
||||
<col width="15%" />
|
||||
<col width="35%" />
|
||||
</colgroup>
|
||||
|
||||
<tr>
|
||||
<td class="input_title"><label>접수일 <span style="color:red;">*</span></label></td>
|
||||
<td>
|
||||
<input type="text" name="RECEIPT_DATE" id="RECEIPT_DATE" class="date_icon" required reqTitle="접수일" value="${info.receipt_date}">
|
||||
</td>
|
||||
<td class="input_title"><label>수량 <span style="color:red;">*</span></label></td>
|
||||
<td>
|
||||
<input type="text" name="QTY" id="QTY" value="${info.qty}" required reqTitle="수량">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="input_title"><label>고객사 <span style="color:red;">*</span></label></td>
|
||||
<td>
|
||||
<select name="CUSTOMER_OBJID" id="CUSTOMER_OBJID" class="select2" required reqTitle="고객사" type="select" style="width:100%;">
|
||||
<option value="">선택</option>
|
||||
${code_map.customer_cd}
|
||||
</select>
|
||||
</td>
|
||||
<!-- <td class="input_title"><label>모델명 <span style="color:red;">*</span></label></td>
|
||||
<td>
|
||||
<input type="text" name="MODEL_NAME" id="MODEL_NAME" value="${info.model_name}" required reqTitle="모델명">
|
||||
</td> -->
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td class="input_title"><label>품명 <span style="color:red;">*</span></label></td>
|
||||
<td>
|
||||
<input type="text" name="PRODUCT_NAME" id="PRODUCT_NAME" value="${info.product_name}" required reqTitle="품명">
|
||||
</td>
|
||||
<td class="input_title"><label>품번 <span style="color:red;">*</span></label></td>
|
||||
<td>
|
||||
<input type="text" name="PRODUCT_NO" id="PRODUCT_NO" value="${info.product_no}" required reqTitle="품번">
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td class="input_title"><label>부품품명 <span style="color:red;">*</span></label></td>
|
||||
<td>
|
||||
<input type="text" name="PART_NAME" id="PART_NAME" value="${info.part_name}" required reqTitle="부품품명">
|
||||
</td>
|
||||
<td class="input_title"><label>부품품번 <span style="color:red;">*</span></label></td>
|
||||
<td>
|
||||
<input type="text" name="PART_NO" id="PART_NO" value="${info.part_no}" required reqTitle="부품품번">
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td class="input_title"><label>생산일</label></td>
|
||||
<td>
|
||||
<input type="text" name="PRODUCTION_DATE" id="PRODUCTION_DATE" class="date_icon" value="${info.production_date}">
|
||||
</td>
|
||||
<td class="input_title"><label>판매일</label></td>
|
||||
<td>
|
||||
<input type="text" name="SALES_DATE" id="SALES_DATE" class="date_icon" value="${info.sales_date}">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="input_title"><label>S/N</label></td>
|
||||
<td>
|
||||
<input type="text" name="SERIAL_NO" id="SERIAL_NO" value="${info.serial_no}">
|
||||
</td>
|
||||
<td class="input_title"><label>제조사</label></td>
|
||||
<td>
|
||||
<input type="text" name="MANUFACTURER" id="MANUFACTURER" value="${info.manufacturer}">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="input_title"><label>불만내용 <span style="color:red;">*</span></label></td>
|
||||
<td colspan="3">
|
||||
<textarea name="COMPLAINT_CONTENT" id="COMPLAINT_CONTENT" rows="3" style="width:100%;" required reqTitle="불만내용" type="text">${info.complaint_content}</textarea>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<div class="btn_wrap">
|
||||
<div class="plm_btn_wrap_center">
|
||||
<input type="button" value="저장" id="btnSave" class="plm_btns">
|
||||
<input type="button" value="닫기" id="btnClose" class="plm_btns">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</section>
|
||||
</form>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
||||
@@ -22,11 +22,12 @@ String menuName = CommonUtils.getMenuName(menuObjId, "고객 CS 관리");
|
||||
.status-receipt { color: #007bff; font-weight: bold; }
|
||||
.status-progress { color: #ffc107; font-weight: bold; }
|
||||
.status-complete { color: #28a745; font-weight: bold; }
|
||||
|
||||
/* 검색필터 아이템 스타일 */
|
||||
.search-item { display: flex; align-items: center; gap: 5px; }
|
||||
.search-item label { font-weight: bold; white-space: nowrap; min-width: 60px; }
|
||||
.search-item input, .search-item select { height: 28px; }
|
||||
body, html {
|
||||
overflow-x: hidden;
|
||||
width: 100%;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
</style>
|
||||
|
||||
<script type="text/javascript">
|
||||
@@ -61,17 +62,42 @@ $(document).ready(function(){
|
||||
fn_search();
|
||||
});
|
||||
|
||||
// 접수번호 클릭 시 조치결과 뷰 팝업
|
||||
function fn_viewActionPopUp(objId){
|
||||
var popup_width = 1200;
|
||||
var popup_height = 600;
|
||||
var hiddenForm = document.hiddenForm;
|
||||
var target = "customerCsActionViewPopUp";
|
||||
var url = "/quality/customerCsActionFormPopUp.do";
|
||||
|
||||
fn_centerPopup(popup_width, popup_height, "", target);
|
||||
|
||||
hiddenForm.action = url;
|
||||
hiddenForm.OBJID.value = objId;
|
||||
hiddenForm.actionType.value = 'view'; // 뷰 모드
|
||||
hiddenForm.target = target;
|
||||
hiddenForm.submit();
|
||||
}
|
||||
|
||||
// 컬럼: 접수번호, 접수일, 수량, 고객사, 모델명, 제품명, 품번, 생산일, 판매일, S/N, 제조사, 불만내용, 조치내용, 귀책판정, 상태, 비고, 조치일, 조치자, 첨부파일
|
||||
var columns = [
|
||||
{headerHozAlign:'center', hozAlign:'center', minWidth:110, widthGrow:1, title:'접수번호', field:'RECEIPT_NO'},
|
||||
{headerHozAlign:'center', hozAlign:'center', minWidth:120, widthGrow:1, title:'접수번호', field:'RECEIPT_NO', frozen: true,
|
||||
formatter:fnc_createGridAnchorTag,
|
||||
cellClick: function(e, cell){
|
||||
var objId = fnc_checkNull(cell.getData().OBJID);
|
||||
fn_viewActionPopUp(objId);
|
||||
}
|
||||
},
|
||||
{headerHozAlign:'center', hozAlign:'center', minWidth:100, widthGrow:1, title:'접수일', field:'RECEIPT_DATE'},
|
||||
{headerHozAlign:'center', hozAlign:'right', minWidth:70, widthGrow:1, title:'수량', field:'QTY',
|
||||
formatter:"money", formatterParams:{thousand:",", precision:false}
|
||||
},
|
||||
{headerHozAlign:'center', hozAlign:'left', minWidth:100, widthGrow:1, title:'고객사', field:'CUSTOMER_NAME'},
|
||||
{headerHozAlign:'center', hozAlign:'left', minWidth:100, widthGrow:1, title:'모델명', field:'MODEL_NAME'},
|
||||
{headerHozAlign:'center', hozAlign:'left', minWidth:100, widthGrow:1, title:'제품명', field:'PRODUCT_NAME'},
|
||||
{headerHozAlign:'center', hozAlign:'left', minWidth:150, widthGrow:1, title:'고객사', field:'CUSTOMER_NAME'},
|
||||
//{headerHozAlign:'center', hozAlign:'left', minWidth:100, widthGrow:1, title:'모델명', field:'MODEL_NAME'},
|
||||
{headerHozAlign:'center', hozAlign:'left', minWidth:100, widthGrow:1, title:'품명', field:'PART_NAME'},
|
||||
{headerHozAlign:'center', hozAlign:'left', minWidth:100, widthGrow:1, title:'품번', field:'PART_NO'},
|
||||
{headerHozAlign:'center', hozAlign:'left', minWidth:100, widthGrow:1, title:'제품품명', field:'PRODUCT_NAME'},
|
||||
{headerHozAlign:'center', hozAlign:'left', minWidth:100, widthGrow:1, title:'제품품번', field:'PRODUCT_NO'},
|
||||
{headerHozAlign:'center', hozAlign:'center', minWidth:90, widthGrow:1, title:'생산일', field:'PRODUCTION_DATE'},
|
||||
{headerHozAlign:'center', hozAlign:'center', minWidth:90, widthGrow:1, title:'판매일', field:'SALES_DATE'},
|
||||
{headerHozAlign:'center', hozAlign:'center', minWidth:100, widthGrow:1, title:'S/N', field:'SERIAL_NO'},
|
||||
@@ -91,17 +117,18 @@ var columns = [
|
||||
{headerHozAlign:'center', hozAlign:'left', minWidth:100, widthGrow:1, title:'비고', field:'REMARK'},
|
||||
{headerHozAlign:'center', hozAlign:'center', minWidth:90, widthGrow:1, title:'조치일', field:'ACTION_DATE'},
|
||||
{headerHozAlign:'center', hozAlign:'center', minWidth:80, widthGrow:1, title:'조치자', field:'ACTION_USER_NAME'},
|
||||
{headerHozAlign:'center', hozAlign:'center', minWidth:70, widthGrow:1, title:'첨부파일', field:'ATTACH_FILE',
|
||||
formatter: function(cell, formatterParams, onRendered){
|
||||
var fileYn = fnc_checkNull(cell.getValue());
|
||||
if(fileYn === 'Y'){
|
||||
return '<a href="#" class="file_icon" style="display:inline-block; width:20px; height:20px;"></a>';
|
||||
}
|
||||
return '<a href="#" class="file_empty_icon" style="display:inline-block; width:20px; height:20px;"></a>';
|
||||
},
|
||||
{headerHozAlign:'center', hozAlign:'center', minWidth:80, widthGrow:1, title:'이미지', field:'IMAGE_FILE',
|
||||
formatter:fnc_subInfoValueFormatter,
|
||||
cellClick:function(e, cell){
|
||||
var objId = fnc_checkNull(cell.getData().OBJID);
|
||||
fn_openAttachFilePopUp(objId);
|
||||
fn_openImageFilePopUp(objId);
|
||||
}
|
||||
},
|
||||
{headerHozAlign:'center', hozAlign:'center', minWidth:80, widthGrow:1, title:'첨부파일', field:'ATTACH_FILE',
|
||||
formatter:fnc_subInfoValueFormatter,
|
||||
cellClick:function(e, cell){
|
||||
var objid = fnc_checkNull(cell.getData().OBJID);
|
||||
fn_FileRegist(objid,"CUSTOMER_CS_ACTION","조치첨부");
|
||||
}
|
||||
}
|
||||
];
|
||||
@@ -130,8 +157,10 @@ function fn_reset(){
|
||||
|
||||
// 고객 불량 등록 팝업
|
||||
function fn_registDefectPopUp(){
|
||||
var popup_width = 1200;
|
||||
var popup_height = 800;
|
||||
var selected = _tabulGrid.getSelectedData();
|
||||
|
||||
var popup_width = 800;
|
||||
var popup_height = 450;
|
||||
var hiddenForm = document.hiddenForm;
|
||||
var target = "customerCsDefectPopUp";
|
||||
var url = "/quality/customerCsDefectFormPopUp.do";
|
||||
@@ -139,7 +168,14 @@ function fn_registDefectPopUp(){
|
||||
fn_centerPopup(popup_width, popup_height, "", target);
|
||||
|
||||
hiddenForm.action = url;
|
||||
hiddenForm.actionType.value = 'new';
|
||||
// 선택된 행이 있으면 수정 모드, 없으면 신규 등록
|
||||
if(selected.length == 1){
|
||||
hiddenForm.OBJID.value = selected[0].OBJID;
|
||||
hiddenForm.actionType.value = 'edit';
|
||||
} else {
|
||||
hiddenForm.OBJID.value = '';
|
||||
hiddenForm.actionType.value = 'new';
|
||||
}
|
||||
hiddenForm.target = target;
|
||||
hiddenForm.submit();
|
||||
}
|
||||
@@ -157,7 +193,7 @@ function fn_registActionPopUp(){
|
||||
}
|
||||
|
||||
var popup_width = 1200;
|
||||
var popup_height = 800;
|
||||
var popup_height = 600;
|
||||
var hiddenForm = document.hiddenForm;
|
||||
var target = "customerCsActionPopUp";
|
||||
var url = "/quality/customerCsActionFormPopUp.do";
|
||||
@@ -171,12 +207,26 @@ function fn_registActionPopUp(){
|
||||
hiddenForm.submit();
|
||||
}
|
||||
|
||||
// 이미지 파일 팝업
|
||||
function fn_openImageFilePopUp(objId){
|
||||
var popup_width = 650;
|
||||
var popup_height = 550;
|
||||
var url = "/common/ImageRegistPopup.do?targetObjId=" + objId + "&docType=CUSTOMER_CS_IMAGE&docTypeName=이미지";
|
||||
window.open(url, "imageFilePopUp", "width="+popup_width+",height="+popup_height+",scrollbars=yes,resizable=yes");
|
||||
}
|
||||
|
||||
// 첨부파일 팝업
|
||||
function fn_openAttachFilePopUp(objId){
|
||||
var popup_width = 800;
|
||||
var popup_height = 600;
|
||||
var url = "/common/filePopUp.do?OBJID=" + objId + "&FILE_TYPE=ATTACH";
|
||||
window.open(url, "attachFilePopUp", "width="+popup_width+",height="+popup_height+",scrollbars=yes,resizable=yes");
|
||||
function fn_FileRegist(objId, docType, docTypeName){
|
||||
var popup_width = 800;
|
||||
var popup_height = 300;
|
||||
|
||||
var objId = objId;
|
||||
var docType = docType;
|
||||
var docTypeName = docTypeName;
|
||||
var params = "?targetObjId="+objId+"&docType="+docType+"&docTypeName="+docTypeName;
|
||||
var url = "/projectConcept/FileRegistPopup.do"+params;
|
||||
|
||||
fn_centerPopup(popup_width, popup_height, url);
|
||||
}
|
||||
</script>
|
||||
|
||||
@@ -201,66 +251,63 @@ function fn_openAttachFilePopUp(objId){
|
||||
</div>
|
||||
|
||||
<div id="plmSearchZon">
|
||||
<div style="display:flex; flex-wrap:wrap; gap:10px; align-items:center;">
|
||||
<div class="search-item">
|
||||
<label>접수일</label>
|
||||
<input type="text" name="search_receipt_date_from" id="search_receipt_date_from" class="date_icon" style="width:100px;" autocomplete="off">
|
||||
<span>~</span>
|
||||
<input type="text" name="search_receipt_date_to" id="search_receipt_date_to" class="date_icon" style="width:100px;" autocomplete="off">
|
||||
</div>
|
||||
<div class="search-item">
|
||||
<label>고객사</label>
|
||||
<input type="text" name="search_customer_name" id="search_customer_name" style="width:100px;" autocomplete="off">
|
||||
</div>
|
||||
<div class="search-item">
|
||||
<label>모델명</label>
|
||||
<input type="text" name="search_model_name" id="search_model_name" style="width:100px;" autocomplete="off">
|
||||
</div>
|
||||
<div class="search-item">
|
||||
<label>제품명</label>
|
||||
<input type="text" name="search_product_name" id="search_product_name" style="width:100px;" autocomplete="off">
|
||||
</div>
|
||||
<div class="search-item">
|
||||
<label>품번</label>
|
||||
<input type="text" name="search_part_no" id="search_part_no" style="width:100px;" autocomplete="off">
|
||||
</div>
|
||||
<div class="search-item">
|
||||
<label>S/N</label>
|
||||
<input type="text" name="search_serial_no" id="search_serial_no" style="width:100px;" autocomplete="off">
|
||||
</div>
|
||||
<div class="search-item">
|
||||
<label>제조사</label>
|
||||
<input type="text" name="search_manufacturer" id="search_manufacturer" style="width:100px;" autocomplete="off">
|
||||
</div>
|
||||
<div class="search-item">
|
||||
<label>귀책판정</label>
|
||||
<select name="search_blame_decision" id="search_blame_decision" style="width:90px;">
|
||||
<option value="">전체</option>
|
||||
<option value="자사">자사</option>
|
||||
<option value="고객">고객</option>
|
||||
<option value="협력사">협력사</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="search-item">
|
||||
<label>상태</label>
|
||||
<select name="search_status" id="search_status" style="width:90px;">
|
||||
<option value="">전체</option>
|
||||
<option value="접수">접수</option>
|
||||
<option value="처리중">처리중</option>
|
||||
<option value="완료">완료</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="search-item">
|
||||
<label>조치일</label>
|
||||
<input type="text" name="search_action_date_from" id="search_action_date_from" class="date_icon" style="width:100px;" autocomplete="off">
|
||||
<span>~</span>
|
||||
<input type="text" name="search_action_date_to" id="search_action_date_to" class="date_icon" style="width:100px;" autocomplete="off">
|
||||
</div>
|
||||
<div class="search-item">
|
||||
<label>조치자</label>
|
||||
<input type="text" name="search_action_user" id="search_action_user" style="width:100px;" autocomplete="off">
|
||||
</div>
|
||||
</div>
|
||||
<table class="">
|
||||
<tr>
|
||||
<td><label>접수일</label></td>
|
||||
<td>
|
||||
<input type="text" name="search_receipt_date_from" id="search_receipt_date_from" class="date_icon" style="width:100px;" autocomplete="off">~
|
||||
<input type="text" name="search_receipt_date_to" id="search_receipt_date_to" class="date_icon" style="width:100px;" autocomplete="off">
|
||||
</td>
|
||||
<td><label>고객사</label></td>
|
||||
<td>
|
||||
<select name="search_customer_objid" id="search_customer_objid" class="select2" autocomplete="off" style="width:230px;">
|
||||
<option value="">전체</option>
|
||||
${code_map.customer_cd}
|
||||
</select>
|
||||
</td>
|
||||
<td><label>품번</label></td>
|
||||
<td><input type="text" name="search_product_no" id="search_product_no" style="" autocomplete="off"></td>
|
||||
<td><label>품명</label></td>
|
||||
<td><input type="text" name="search_product_name" id="search_product_name" style="" autocomplete="off"></td>
|
||||
<td><label>부품품번</label></td>
|
||||
<td><input type="text" name="search_part_no" id="search_part_no" style="width:215px;" autocomplete="off"></td>
|
||||
<td><label>부품품명</label></td>
|
||||
<td><input type="text" name="search_part_name" id="search_part_name" style="" autocomplete="off"></td>
|
||||
|
||||
|
||||
</tr>
|
||||
<tr>
|
||||
<td><label>S/N</label></td>
|
||||
<td><input type="text" name="search_serial_no" id="search_serial_no" style="width:215px;" autocomplete="off"></td>
|
||||
<td><label>제조사</label></td>
|
||||
<td><input type="text" name="search_manufacturer" id="search_manufacturer" style="width:230px;" autocomplete="off"></td>
|
||||
|
||||
<td><label>귀책판정</label></td>
|
||||
<td>
|
||||
<select name="search_blame_decision" id="search_blame_decision" class="select2" autocomplete="off" style="">
|
||||
<option value="">전체</option>
|
||||
<option value="R">R</option>
|
||||
<option value="C">C</option>
|
||||
<option value="O">O</option>
|
||||
</select>
|
||||
</td>
|
||||
<td><label>상태</label></td>
|
||||
<td>
|
||||
<select name="search_status" id="search_status" class="select2" autocomplete="off" style="">
|
||||
<option value="">전체</option>
|
||||
<option value="Open">Open</option>
|
||||
<option value="Closed">Closed</option>
|
||||
</select>
|
||||
</td>
|
||||
<td><label>조치일</label></td>
|
||||
<td>
|
||||
<input type="text" name="search_action_date_from" id="search_action_date_from" class="date_icon" style="width:100px;" autocomplete="off">~
|
||||
<input type="text" name="search_action_date_to" id="search_action_date_to" class="date_icon" style="width:100px;" autocomplete="off">
|
||||
</td>
|
||||
<td><label>조치자</label></td>
|
||||
<td><input type="text" name="search_action_user" id="search_action_user" style="" autocomplete="off"></td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<%@include file= "/WEB-INF/view/common/common_gridArea.jsp" %>
|
||||
|
||||
@@ -43,6 +43,13 @@ String menuName = CommonUtils.getMenuName(menuObjId, "수입검사 관리");
|
||||
.inspection-ng { color: #dc3545; font-weight: bold; cursor: pointer; }
|
||||
.inspection-ok { color: #28a745; font-weight: bold; cursor: pointer; }
|
||||
.inspection-ng:hover, .inspection-ok:hover { text-decoration: underline; }
|
||||
|
||||
body, html {
|
||||
overflow-x: hidden;
|
||||
width: 100%;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
</style>
|
||||
|
||||
<script type="text/javascript">
|
||||
|
||||
@@ -1,13 +1,16 @@
|
||||
<%@ 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"%>
|
||||
<%@ 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" %>
|
||||
<script type="text/javascript" src="/js/tabulator/tabulator_custom.js"></script>
|
||||
<%
|
||||
String menuObjId = request.getParameter("menuObjId");
|
||||
String menuName = CommonUtils.getMenuName(menuObjId, "공정검사 등록");
|
||||
PersonBean person = (PersonBean) session.getAttribute(Constants.PERSON_BEAN);
|
||||
String connector = person.getUserId();
|
||||
%>
|
||||
<c:set var="now" value="<%=new java.util.Date()%>" />
|
||||
<c:set var="today"><fmt:formatDate value="${now}" pattern="yyyy-MM-dd" /></c:set>
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
@@ -15,88 +18,471 @@ String menuName = CommonUtils.getMenuName(menuObjId, "공정검사 등록");
|
||||
<title><%=Constants.SYSTEM_NAME%></title>
|
||||
</head>
|
||||
|
||||
<style>
|
||||
.form-header {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 20px;
|
||||
padding: 10px 15px;
|
||||
background: #f8f9fa;
|
||||
border-bottom: 1px solid #ddd;
|
||||
}
|
||||
.form-header label {
|
||||
font-weight: bold;
|
||||
margin-right: 5px;
|
||||
}
|
||||
.form-header .required {
|
||||
color: red;
|
||||
}
|
||||
.form-header input, .form-header select {
|
||||
padding: 5px 10px;
|
||||
border: 1px solid #ccc;
|
||||
border-radius: 3px;
|
||||
}
|
||||
/* 검사결과 스타일 */
|
||||
.inspection-ng { color: #dc3545; font-weight: bold; }
|
||||
.inspection-ok { color: #28a745; font-weight: bold; }
|
||||
</style>
|
||||
|
||||
<script type="text/javascript">
|
||||
var _editable = true;
|
||||
var grid;
|
||||
var rowIndex = 0;
|
||||
|
||||
// 진행공정 목록
|
||||
var _PROCESS_LIST = [];
|
||||
// 프로젝트 목록
|
||||
var _PROJECT_LIST = [];
|
||||
// 작업환경상태 목록
|
||||
var _WORK_ENV_STATUS_LIST = [
|
||||
{"CODE": "", "NAME": "선택"},
|
||||
{"CODE": "양호", "NAME": "양호"},
|
||||
{"CODE": "불량", "NAME": "불량"}
|
||||
];
|
||||
// 측정기 목록 (양호/불량)
|
||||
var _MEASURING_DEVICE_LIST = [
|
||||
{"CODE": "", "NAME": "선택"},
|
||||
{"CODE": "양호", "NAME": "양호"},
|
||||
{"CODE": "불량", "NAME": "불량"}
|
||||
];
|
||||
// 담당팀 목록
|
||||
var _DEPT_LIST = [];
|
||||
// 담당자 목록
|
||||
var _USER_LIST = [];
|
||||
// 검사결과 목록
|
||||
var _INSPECTION_RESULT_LIST = [
|
||||
{"CODE": "", "NAME": "선택"},
|
||||
{"CODE": "OK", "NAME": "OK"},
|
||||
{"CODE": "NG", "NAME": "NG"}
|
||||
];
|
||||
|
||||
$(document).ready(function(){
|
||||
fnc_datepick();
|
||||
$('.select2').select2();
|
||||
|
||||
// 저장
|
||||
// 진행공정 목록 조회 (더존 기준정보>내부공정)
|
||||
_PROCESS_LIST = [{"CODE": "", "NAME": "선택"}].concat(
|
||||
fnc_getJsonAllDataListBySqlId({"sqlId": "common.getCodeselect", "code": "0001870"})
|
||||
);
|
||||
|
||||
// 프로젝트 목록 조회
|
||||
_PROJECT_LIST = [{"CODE": "", "NAME": "선택"}].concat(
|
||||
fnc_getJsonAllDataListBySqlId({"sqlId": "common.getProjectNameList"})
|
||||
);
|
||||
|
||||
// 담당팀 목록 조회
|
||||
_DEPT_LIST = [{"CODE": "", "NAME": "선택"}].concat(
|
||||
fnc_getJsonAllDataListBySqlId({"sqlId": "common.getDeptselect"})
|
||||
);
|
||||
|
||||
// 담당자 목록 조회
|
||||
_USER_LIST = [{"CODE": "", "NAME": "선택"}].concat(
|
||||
fnc_getJsonAllDataListBySqlId({"sqlId": "common.getUserselect"})
|
||||
);
|
||||
|
||||
// 검사일 기본 설정 (저장된 값 없으면 오늘 날짜)
|
||||
var savedInspectionDate = "${info.inspection_date}";
|
||||
if(savedInspectionDate != '' && savedInspectionDate != 'null'){
|
||||
$("#INSPECTION_DATE").val(savedInspectionDate);
|
||||
} else if($("#INSPECTION_DATE").val() == ''){
|
||||
$("#INSPECTION_DATE").val("${today}");
|
||||
}
|
||||
|
||||
// 행추가 버튼
|
||||
$("#btnAddRow").click(function(){
|
||||
fn_addRow();
|
||||
});
|
||||
|
||||
// 행삭제 버튼
|
||||
$("#btnDelRow").click(function(){
|
||||
fn_deleteRow();
|
||||
});
|
||||
|
||||
// 저장 버튼
|
||||
$("#btnSave").click(function(){
|
||||
fn_save();
|
||||
});
|
||||
|
||||
// 닫기
|
||||
// 닫기 버튼
|
||||
$("#btnClose").click(function(){
|
||||
window.close();
|
||||
self.close();
|
||||
});
|
||||
|
||||
// 그리드 초기화 및 조회
|
||||
fn_search();
|
||||
});
|
||||
|
||||
function fn_save(){
|
||||
// TODO: 저장 로직 구현
|
||||
Swal.fire("저장 기능 준비중입니다.");
|
||||
// 프로젝트별 파트 목록 캐시
|
||||
var _PART_LIST_CACHE = {};
|
||||
|
||||
// 프로젝트번호로 MBOM 파트 목록 조회
|
||||
function fn_getPartListByProject(projectNo) {
|
||||
if (!projectNo) return [{"CODE": "", "NAME": "선택"}];
|
||||
|
||||
// 캐시에 있으면 캐시에서 반환
|
||||
if (_PART_LIST_CACHE[projectNo]) {
|
||||
return _PART_LIST_CACHE[projectNo];
|
||||
}
|
||||
|
||||
// 서버에서 조회
|
||||
var partList = [{"CODE": "", "NAME": "선택"}].concat(
|
||||
fnc_getJsonAllDataListBySqlId({"sqlId": "common.getMbomPartListByProjectNo", "PROJECT_NO": projectNo})
|
||||
);
|
||||
|
||||
// 캐시에 저장
|
||||
_PART_LIST_CACHE[projectNo] = partList;
|
||||
|
||||
return partList;
|
||||
}
|
||||
|
||||
// 그리드 초기화 및 조회
|
||||
function fn_search(){
|
||||
var columns = [
|
||||
{formatter:"rowSelection", titleFormatter:"rowSelection", hozAlign:"center", headerSort:false, width:30},
|
||||
{title:'진행공정', field:'PROCESS_CD', headerHozAlign:'center', hozAlign:'center', width:130,
|
||||
editor: fnc_customSelectEditor,
|
||||
formatter: function(cell) {
|
||||
return fnc_customSelectFormatter(cell, {valueId:"CODE", labelId:"NAME", values:_PROCESS_LIST});
|
||||
},
|
||||
editorParams: {valueId:"CODE", labelId:"NAME", values:_PROCESS_LIST}
|
||||
},
|
||||
{title:'프로젝트번호', field:'PROJECT_OBJID', headerHozAlign:'center', hozAlign:'center', width:130,
|
||||
editor: fnc_customSelectEditor,
|
||||
formatter: function(cell) {
|
||||
return fnc_customSelectFormatter(cell, {valueId:"CODE", labelId:"NAME", values:_PROJECT_LIST});
|
||||
},
|
||||
editorParams: {valueId:"CODE", labelId:"NAME", values:_PROJECT_LIST}
|
||||
},
|
||||
{title:'품번', field:'PART_OBJID', headerHozAlign:'center', hozAlign:'left', width:250,
|
||||
editor: fnc_customSelectEditor,
|
||||
formatter: function(cell) {
|
||||
var projectObjid = cell.getData().PROJECT_OBJID;
|
||||
var partList = fn_getPartListByProject(projectObjid);
|
||||
return fnc_customSelectFormatter(cell, {valueId:"CODE", labelId:"NAME", values: partList});
|
||||
},
|
||||
editorParams: function(cell) {
|
||||
var projectObjid = cell.getData().PROJECT_OBJID;
|
||||
var partList = fn_getPartListByProject(projectObjid);
|
||||
return {valueId:"CODE", labelId:"NAME", values: partList};
|
||||
}
|
||||
},
|
||||
{title:'품명', field:'PART_NAME', headerHozAlign:'center', hozAlign:'left', width:180,
|
||||
editor: false
|
||||
},
|
||||
{title:'검사수량', field:'INSPECTION_QTY', headerHozAlign:'center', hozAlign:'right', width:80,
|
||||
editor:"input",
|
||||
formatter:"money", formatterParams:{thousand:",", precision:false}
|
||||
},
|
||||
{title:'불량수량', field:'DEFECT_QTY', headerHozAlign:'center', hozAlign:'right', width:80,
|
||||
editor:"input",
|
||||
formatter:"money", formatterParams:{thousand:",", precision:false}
|
||||
},
|
||||
{title:'작업환경상태', field:'WORK_ENV_STATUS', headerHozAlign:'center', hozAlign:'center', width:100,
|
||||
editor: fnc_customSelectEditor,
|
||||
formatter: function(cell) {
|
||||
return fnc_customSelectFormatter(cell, {valueId:"CODE", labelId:"NAME", values:_WORK_ENV_STATUS_LIST});
|
||||
},
|
||||
editorParams: {valueId:"CODE", labelId:"NAME", values:_WORK_ENV_STATUS_LIST}
|
||||
},
|
||||
{title:'측정기', field:'MEASURING_DEVICE', headerHozAlign:'center', hozAlign:'center', width:100,
|
||||
editor: fnc_customSelectEditor,
|
||||
formatter: function(cell) {
|
||||
return fnc_customSelectFormatter(cell, {valueId:"CODE", labelId:"NAME", values:_MEASURING_DEVICE_LIST});
|
||||
},
|
||||
editorParams: {valueId:"CODE", labelId:"NAME", values:_MEASURING_DEVICE_LIST}
|
||||
},
|
||||
{title:'담당팀', field:'DEPT_CD', headerHozAlign:'center', hozAlign:'center', width:100,
|
||||
editor: fnc_customSelectEditor,
|
||||
formatter: function(cell) {
|
||||
return fnc_customSelectFormatter(cell, {valueId:"CODE", labelId:"NAME", values:_DEPT_LIST});
|
||||
},
|
||||
editorParams: {valueId:"CODE", labelId:"NAME", values:_DEPT_LIST}
|
||||
},
|
||||
{title:'담당자', field:'USER_ID', headerHozAlign:'center', hozAlign:'center', width:100,
|
||||
editor: fnc_customSelectEditor,
|
||||
formatter: function(cell) {
|
||||
return fnc_customSelectFormatter(cell, {valueId:"CODE", labelId:"NAME", values:_USER_LIST});
|
||||
},
|
||||
editorParams: {valueId:"CODE", labelId:"NAME", values:_USER_LIST}
|
||||
},
|
||||
{title:'특이사항', field:'REMARK', headerHozAlign:'center', hozAlign:'left', width:150,
|
||||
editor:"input"
|
||||
},
|
||||
{title:'조치현황', field:'ACTION_STATUS', headerHozAlign:'center', hozAlign:'left', width:150,
|
||||
editor:"input"
|
||||
},
|
||||
{title:'검사결과', field:'INSPECTION_RESULT', headerHozAlign:'center', hozAlign:'center', width:80,
|
||||
editor: fnc_customSelectEditor,
|
||||
formatter: function(cell) {
|
||||
var val = cell.getValue();
|
||||
if(val === 'NG') return '<span class="inspection-ng">NG</span>';
|
||||
if(val === 'OK') return '<span class="inspection-ok">OK</span>';
|
||||
return fnc_customSelectFormatter(cell, {valueId:"CODE", labelId:"NAME", values:_INSPECTION_RESULT_LIST});
|
||||
},
|
||||
editorParams: {valueId:"CODE", labelId:"NAME", values:_INSPECTION_RESULT_LIST}
|
||||
}
|
||||
];
|
||||
|
||||
// 그리드가 없으면 생성
|
||||
if(!grid){
|
||||
grid = new Tabulator("#grid", {
|
||||
layout: "fitColumns",
|
||||
height: "calc(100vh - 150px)",
|
||||
columns: columns,
|
||||
data: [],
|
||||
selectableRows: true,
|
||||
placeholder: "데이터가 없습니다."
|
||||
});
|
||||
|
||||
// 셀 편집 이벤트
|
||||
grid.on("cellEdited", function(cell) {
|
||||
var row = cell.getRow();
|
||||
var field = cell.getField();
|
||||
|
||||
// 프로젝트 변경 시 파트 초기화 및 목록 갱신
|
||||
if (field === 'PROJECT_OBJID') {
|
||||
var projectObjid = cell.getValue();
|
||||
// 파트 목록 미리 로드 (캐시에 저장)
|
||||
if (projectObjid) {
|
||||
fn_getPartListByProject(projectObjid);
|
||||
}
|
||||
// 파트 초기화
|
||||
row.update({
|
||||
"PART_OBJID": "",
|
||||
"PART_NO": "",
|
||||
"PART_NAME": ""
|
||||
});
|
||||
// 행 다시 렌더링
|
||||
row.reformat();
|
||||
}
|
||||
|
||||
// 파트 선택 시 품번/품명 자동 설정
|
||||
if (field === 'PART_OBJID') {
|
||||
var partObjid = cell.getValue();
|
||||
var projectObjid = row.getData().PROJECT_OBJID;
|
||||
if (partObjid && projectObjid) {
|
||||
var partList = fn_getPartListByProject(projectObjid);
|
||||
for (var i = 0; i < partList.length; i++) {
|
||||
if (partList[i].CODE == partObjid) {
|
||||
row.update({
|
||||
"PART_NO": partList[i].PART_NO || '',
|
||||
"PART_NAME": partList[i].PART_NAME || ''
|
||||
});
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 불량수량 입력 시 검사결과 자동 설정
|
||||
if (field === 'DEFECT_QTY') {
|
||||
var defectQty = parseInt(cell.getValue()) || 0;
|
||||
if (defectQty > 0) {
|
||||
row.update({"INSPECTION_RESULT": "NG"});
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// 데이터 조회 (마스터 OBJID가 있을 때만)
|
||||
var masterObjId = $("#MASTER_OBJID").val();
|
||||
if(masterObjId){
|
||||
var param = {
|
||||
MASTER_OBJID: masterObjId
|
||||
};
|
||||
grid = fnc_tabul_search(_tabul_layout_fitDataStretch, grid, "/quality/processInspectionDetailGridList.do", columns, false, false, true, param);
|
||||
}
|
||||
}
|
||||
|
||||
// 행 추가
|
||||
function fn_addRow(){
|
||||
rowIndex++;
|
||||
var newRow = {
|
||||
"ROW_INDEX": rowIndex,
|
||||
"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": ""
|
||||
};
|
||||
grid.addRow(newRow, false);
|
||||
}
|
||||
|
||||
// 행 삭제
|
||||
function fn_deleteRow(){
|
||||
var selectedRows = grid.getSelectedRows();
|
||||
if(selectedRows.length == 0){
|
||||
Swal.fire("삭제할 행을 선택하세요.");
|
||||
return;
|
||||
}
|
||||
|
||||
Swal.fire({
|
||||
title: '선택한 ' + selectedRows.length + '건을 삭제하시겠습니까?',
|
||||
icon: 'warning',
|
||||
showCancelButton: true,
|
||||
confirmButtonText: '삭제',
|
||||
cancelButtonText: '취소'
|
||||
}).then((result) => {
|
||||
if(result.isConfirmed){
|
||||
selectedRows.forEach(function(row){
|
||||
row.delete();
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// 저장
|
||||
function fn_save(){
|
||||
var inspectionDate = $("#INSPECTION_DATE").val();
|
||||
var inspectorId = $("#INSPECTOR_ID").val();
|
||||
|
||||
if(inspectionDate == ''){
|
||||
Swal.fire("검사일을 입력하세요.");
|
||||
$("#INSPECTION_DATE").focus();
|
||||
return;
|
||||
}
|
||||
if(inspectorId == ''){
|
||||
Swal.fire("검사자를 선택하세요.");
|
||||
$("#INSPECTOR_ID").focus();
|
||||
return;
|
||||
}
|
||||
|
||||
var gridData = grid.getData();
|
||||
if(gridData.length == 0){
|
||||
Swal.fire("저장할 데이터가 없습니다.");
|
||||
return;
|
||||
}
|
||||
|
||||
// 필수값 검증
|
||||
for(var i = 0; i < gridData.length; i++){
|
||||
if(!gridData[i].PROCESS_CD){
|
||||
Swal.fire((i+1) + "번째 행의 진행공정을 선택하세요.");
|
||||
return;
|
||||
}
|
||||
if(!gridData[i].PART_NO){
|
||||
Swal.fire((i+1) + "번째 행의 품번을 입력하세요.");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
Swal.fire({
|
||||
title: '저장하시겠습니까?',
|
||||
icon: 'question',
|
||||
showCancelButton: true,
|
||||
confirmButtonText: '저장',
|
||||
cancelButtonText: '취소'
|
||||
}).then((result) => {
|
||||
if(result.isConfirmed){
|
||||
$.ajax({
|
||||
url: "/quality/saveProcessInspection.do",
|
||||
type: "POST",
|
||||
data: {
|
||||
"MASTER_OBJID": $("#MASTER_OBJID").val(),
|
||||
"INSPECTION_DATE": inspectionDate,
|
||||
"INSPECTOR_ID": inspectorId,
|
||||
"dataList": JSON.stringify(gridData)
|
||||
},
|
||||
dataType: "json",
|
||||
success: function(result){
|
||||
if(result.RESULT == "SUCCESS"){
|
||||
// 저장된 마스터 OBJID 저장
|
||||
if(result.MASTER_OBJID){
|
||||
$("#MASTER_OBJID").val(result.MASTER_OBJID);
|
||||
}
|
||||
Swal.fire({
|
||||
title: '저장되었습니다.',
|
||||
icon: 'success'
|
||||
}).then(() => {
|
||||
if(window.opener && window.opener.fn_search){
|
||||
window.opener.fn_search();
|
||||
}
|
||||
});
|
||||
} else {
|
||||
Swal.fire({
|
||||
title: '저장 실패',
|
||||
text: result.MESSAGE || '저장 중 오류가 발생했습니다.',
|
||||
icon: 'error'
|
||||
});
|
||||
}
|
||||
},
|
||||
error: function(xhr, status, error){
|
||||
Swal.fire({
|
||||
title: '저장 실패',
|
||||
text: '서버 통신 오류가 발생했습니다.',
|
||||
icon: 'error'
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// 팝업 닫힐 때 부모 새로고침
|
||||
window.addEventListener('unload', function() {
|
||||
if(window.opener && window.opener.fn_search) {
|
||||
window.opener.fn_search();
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<body>
|
||||
<form name="form1" id="form1" method="post">
|
||||
<div class="popup_wrap">
|
||||
<div class="popup_header">
|
||||
<h2><%=menuName%></h2>
|
||||
<div class="btnArea">
|
||||
<input type="button" class="plm_btns" value="저장" id="btnSave">
|
||||
<input type="button" class="plm_btns" value="닫기" id="btnClose">
|
||||
</div>
|
||||
</div>
|
||||
<div class="popup_content">
|
||||
<table class="plm_form_table">
|
||||
<colgroup>
|
||||
<col width="120px"><col width="*">
|
||||
<col width="120px"><col width="*">
|
||||
</colgroup>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="label">검사일</td>
|
||||
<td><input type="text" name="INSPECTION_DATE" id="INSPECTION_DATE" class="date_icon"></td>
|
||||
<td class="label">프로젝트번호</td>
|
||||
<td><input type="text" name="PROJECT_NO" id="PROJECT_NO"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="label">품번</td>
|
||||
<td><input type="text" name="PART_NO" id="PART_NO"></td>
|
||||
<td class="label">품명</td>
|
||||
<td><input type="text" name="PART_NAME" id="PART_NAME"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="label">불량수량</td>
|
||||
<td><input type="text" name="DEFECT_QTY" id="DEFECT_QTY"></td>
|
||||
<td class="label">작업환경상태</td>
|
||||
<td><input type="text" name="WORK_ENV_STATUS" id="WORK_ENV_STATUS"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="label">측정기</td>
|
||||
<td><input type="text" name="MEASURING_DEVICE" id="MEASURING_DEVICE"></td>
|
||||
<td class="label">검사자</td>
|
||||
<td><input type="text" name="INSPECTOR_NAME" id="INSPECTOR_NAME"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="label">검사결과</td>
|
||||
<td>
|
||||
<select name="INSPECTION_RESULT" id="INSPECTION_RESULT">
|
||||
<option value="">선택</option>
|
||||
<option value="OK">OK</option>
|
||||
<option value="NG">NG</option>
|
||||
</select>
|
||||
</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="label">비고</td>
|
||||
<td colspan="3"><textarea name="REMARK" id="REMARK" rows="3" style="width:100%;"></textarea></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<body style="overflow-x: hidden;">
|
||||
<form name="form1" id="form1" action="" method="post" onsubmit="return false">
|
||||
<input type="hidden" name="MASTER_OBJID" id="MASTER_OBJID" value="${param.OBJID}">
|
||||
|
||||
<div class="plm_menu_name_gdnsi">
|
||||
<h2><span>공정검사 등록</span></h2>
|
||||
<div class="btnArea">
|
||||
<input type="button" value="행추가" class="plm_btns" id="btnAddRow">
|
||||
<input type="button" value="행삭제" class="plm_btns" id="btnDelRow">
|
||||
<input type="button" value="저장" class="plm_btns" id="btnSave">
|
||||
<input type="button" value="닫기" class="plm_btns" id="btnClose">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-header">
|
||||
<div>
|
||||
<label>검사일<span class="required">*</span></label>
|
||||
<input type="text" name="INSPECTION_DATE" id="INSPECTION_DATE" class="date_icon" style="width:120px;" value="${info.inspection_date}">
|
||||
</div>
|
||||
<div>
|
||||
<label>검사자<span class="required">*</span></label>
|
||||
<select name="INSPECTOR_ID" id="INSPECTOR_ID" class="select2" style="width:150px;">
|
||||
<option value="">선택</option>
|
||||
${code_map.inspector_id}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="grid" style="margin: 10px;"></div>
|
||||
</form>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -18,6 +18,12 @@ String menuName = CommonUtils.getMenuName(menuObjId, "공정검사 관리");
|
||||
</head>
|
||||
|
||||
<style>
|
||||
body, html {
|
||||
overflow-x: hidden;
|
||||
width: 100%;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
.select2-selection__choice {
|
||||
font-size: 11px;
|
||||
background-color: #fff !important;
|
||||
@@ -83,11 +89,16 @@ $(document).ready(function(){
|
||||
|
||||
// 컬럼: 검사일, 프로젝트번호, 품번, 품명, 불량수량, 작업환경상태, 측정기, 검사자, 검사결과
|
||||
var columns = [
|
||||
{headerHozAlign:'center', hozAlign:'center', minWidth:110, widthGrow:1, title:'검사일', field:'INSPECTION_DATE'},
|
||||
{headerHozAlign:'center', hozAlign:'center', minWidth:130, widthGrow:1, title:'프로젝트번호', field:'PROJECT_NO'},
|
||||
{headerHozAlign:'center', hozAlign:'left', minWidth:140, widthGrow:2, title:'품번', field:'PART_NO'},
|
||||
{headerHozAlign:'center', hozAlign:'left', minWidth:180, widthGrow:3, title:'품명', field:'PART_NAME'},
|
||||
{headerHozAlign:'center', hozAlign:'right', minWidth:100, widthGrow:1, title:'불량수량', field:'DEFECT_QTY',
|
||||
{headerHozAlign:'center', hozAlign:'center', minWidth:110, widthGrow:1, title:'검사일', field:'INSPECTION_DATE',
|
||||
formatter: fnc_createGridAnchorTag,
|
||||
cellClick: function(e, cell){
|
||||
fn_openFormPopUp(cell.getData().OBJID);
|
||||
}
|
||||
},
|
||||
{headerHozAlign:'center', hozAlign:'center', minWidth:150, widthGrow:2, title:'프로젝트번호', field:'PROJECT_NO'},
|
||||
{headerHozAlign:'center', hozAlign:'left', minWidth:180, widthGrow:2, title:'품번', field:'PART_NO'},
|
||||
{headerHozAlign:'center', hozAlign:'left', minWidth:200, widthGrow:3, title:'품명', field:'PART_NAME'},
|
||||
{headerHozAlign:'center', hozAlign:'right', minWidth:100, widthGrow:1, title:'불량수량 합계', field:'DEFECT_QTY',
|
||||
formatter:"money", formatterParams:{thousand:",", precision:false}
|
||||
},
|
||||
{headerHozAlign:'center', hozAlign:'center', minWidth:120, widthGrow:1, title:'작업환경상태', field:'WORK_ENV_STATUS'},
|
||||
@@ -103,6 +114,14 @@ var columns = [
|
||||
}
|
||||
];
|
||||
|
||||
// 수정 팝업
|
||||
function fn_openFormPopUp(objId){
|
||||
var popup_width = 1500;
|
||||
var popup_height = 700;
|
||||
var url = "/quality/processInspectionFormPopUp.do?OBJID=" + objId;
|
||||
window.open(url, "processInspectionPopUp", "width=" + popup_width + ",height=" + popup_height + ",scrollbars=yes,resizable=yes");
|
||||
}
|
||||
|
||||
// 조회
|
||||
function fn_search(){
|
||||
_tabulGrid = fnc_tabul_search(_tabul_layout_fitColumns, _tabulGrid, "/quality/processInspectionGridList.do", columns, true);
|
||||
@@ -110,41 +129,22 @@ function fn_search(){
|
||||
|
||||
// 검색조건 초기화
|
||||
function fn_reset(){
|
||||
$("#search_inspection_date_from").val("");
|
||||
$("#search_inspection_date_to").val("");
|
||||
$("#search_inspector").val("");
|
||||
$("#search_project_no").val("");
|
||||
$("#search_part_no").val("");
|
||||
$("#search_part_name").val("");
|
||||
$("#search_work_env_status").val("");
|
||||
$("#search_measuring_device").val("");
|
||||
$("#search_inspector").val("");
|
||||
$("#search_inspection_date_from").val("");
|
||||
$("#search_inspection_date_to").val("");
|
||||
$("#search_inspection_result").val("");
|
||||
}
|
||||
|
||||
// 공정검사 등록 팝업
|
||||
function fn_registPopUp(){
|
||||
var selected = _tabulGrid.getSelectedData();
|
||||
if(selected.length == 0){
|
||||
Swal.fire("선택된 데이터가 없습니다.");
|
||||
return;
|
||||
}
|
||||
if(selected.length > 1){
|
||||
Swal.fire("한건씩 등록 가능합니다.");
|
||||
return;
|
||||
}
|
||||
|
||||
var popup_width = 1200;
|
||||
var popup_height = 800;
|
||||
var hiddenForm = document.hiddenForm;
|
||||
var target = "processInspectionPopUp";
|
||||
var popup_width = 1500;
|
||||
var popup_height = 700;
|
||||
var url = "/quality/processInspectionFormPopUp.do";
|
||||
|
||||
fn_centerPopup(popup_width, popup_height, "", target);
|
||||
|
||||
hiddenForm.action = url;
|
||||
hiddenForm.OBJID.value = selected[0].OBJID;
|
||||
hiddenForm.target = target;
|
||||
hiddenForm.submit();
|
||||
window.open(url, "processInspectionPopUp", "width=" + popup_width + ",height=" + popup_height + ",scrollbars=yes,resizable=yes");
|
||||
}
|
||||
|
||||
// 엑셀 다운로드
|
||||
@@ -178,6 +178,16 @@ function fn_excelDownload(){
|
||||
|
||||
<div id="plmSearchZon">
|
||||
<div style="display:flex; flex-wrap:wrap; gap:10px; align-items:center;">
|
||||
<div class="search-item">
|
||||
<label>검사일</label>
|
||||
<input type="text" name="search_inspection_date_from" id="search_inspection_date_from" class="date_icon" style="width:110px;" autocomplete="off">
|
||||
<span>~</span>
|
||||
<input type="text" name="search_inspection_date_to" id="search_inspection_date_to" class="date_icon" style="width:110px;" autocomplete="off">
|
||||
</div>
|
||||
<div class="search-item">
|
||||
<label>검사자</label>
|
||||
<input type="text" name="search_inspector" id="search_inspector" style="width:120px;" autocomplete="off">
|
||||
</div>
|
||||
<div class="search-item">
|
||||
<label>프로젝트번호</label>
|
||||
<input type="text" name="search_project_no" id="search_project_no" style="width:120px;" autocomplete="off">
|
||||
@@ -190,24 +200,6 @@ function fn_excelDownload(){
|
||||
<label>품명</label>
|
||||
<input type="text" name="search_part_name" id="search_part_name" style="width:120px;" autocomplete="off">
|
||||
</div>
|
||||
<div class="search-item">
|
||||
<label>작업환경상태</label>
|
||||
<input type="text" name="search_work_env_status" id="search_work_env_status" style="width:120px;" autocomplete="off">
|
||||
</div>
|
||||
<div class="search-item">
|
||||
<label>측정기</label>
|
||||
<input type="text" name="search_measuring_device" id="search_measuring_device" style="width:120px;" autocomplete="off">
|
||||
</div>
|
||||
<div class="search-item">
|
||||
<label>검사자</label>
|
||||
<input type="text" name="search_inspector" id="search_inspector" style="width:120px;" autocomplete="off">
|
||||
</div>
|
||||
<div class="search-item">
|
||||
<label>검사일</label>
|
||||
<input type="text" name="search_inspection_date_from" id="search_inspection_date_from" class="date_icon" style="width:110px;" autocomplete="off">
|
||||
<span>~</span>
|
||||
<input type="text" name="search_inspection_date_to" id="search_inspection_date_to" class="date_icon" style="width:110px;" autocomplete="off">
|
||||
</div>
|
||||
<div class="search-item">
|
||||
<label>검사결과</label>
|
||||
<select name="search_inspection_result" id="search_inspection_result" style="width:100px;">
|
||||
|
||||
68
WebContent/WEB-INF/view/viewImageByObjId.jsp
Normal file
68
WebContent/WEB-INF/view/viewImageByObjId.jsp
Normal file
@@ -0,0 +1,68 @@
|
||||
<%@ page import="java.io.*, java.util.*" %>
|
||||
<%@ page import="java.net.URLEncoder"%>
|
||||
<%!
|
||||
public void viewImage(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
|
||||
// request attribute에서 파일 정보 가져오기 (컨트롤러에서 설정)
|
||||
String attDir = (String) req.getAttribute("attDir");
|
||||
String savedFileName = (String) req.getAttribute("savedFileName");
|
||||
String realFileName = (String) req.getAttribute("realFileName");
|
||||
|
||||
if(attDir == null || savedFileName == null) {
|
||||
System.out.println("viewImageByObjId: 파일 정보 없음");
|
||||
return;
|
||||
}
|
||||
|
||||
FileInputStream fis = null;
|
||||
|
||||
// 헤더 컨텐츠 타입 설정
|
||||
res.reset();
|
||||
|
||||
// 파일 확장자로 컨텐츠 타입 결정
|
||||
String ext = "";
|
||||
if(savedFileName.lastIndexOf(".") > -1) {
|
||||
ext = savedFileName.substring(savedFileName.lastIndexOf(".") + 1).toLowerCase();
|
||||
}
|
||||
|
||||
if("png".equals(ext)) {
|
||||
res.setContentType("image/png");
|
||||
} else if("gif".equals(ext)) {
|
||||
res.setContentType("image/gif");
|
||||
} else if("bmp".equals(ext)) {
|
||||
res.setContentType("image/bmp");
|
||||
} else if("webp".equals(ext)) {
|
||||
res.setContentType("image/webp");
|
||||
} else {
|
||||
res.setContentType("image/jpeg");
|
||||
}
|
||||
|
||||
ServletOutputStream out = res.getOutputStream();
|
||||
|
||||
try {
|
||||
File file = new File(attDir, savedFileName);
|
||||
System.out.println("viewImageByObjId: " + file.getAbsolutePath());
|
||||
|
||||
fis = new FileInputStream(file);
|
||||
byte[] buf = new byte[4 * 1024];
|
||||
int bytesRead;
|
||||
|
||||
while((bytesRead = fis.read(buf)) != -1) {
|
||||
out.write(buf, 0, bytesRead);
|
||||
}
|
||||
} catch(FileNotFoundException e) {
|
||||
out.println("File Not Found");
|
||||
System.out.println("viewImageByObjId File Not Found: attDir[" + attDir + "] savedFileName[" + savedFileName + "]");
|
||||
} catch(IOException e) {
|
||||
out.println("Problem sending file: " + e.getMessage());
|
||||
System.out.println("viewImageByObjId Problem sending file: " + e.getMessage());
|
||||
} finally {
|
||||
if(fis != null) {
|
||||
fis.close();
|
||||
}
|
||||
}
|
||||
}
|
||||
%>
|
||||
<%
|
||||
out.clear();
|
||||
out = pageContext.pushBody();
|
||||
viewImage(request, response);
|
||||
%>
|
||||
@@ -388,6 +388,23 @@ public class CommonController {
|
||||
return "/viewImage";
|
||||
}
|
||||
|
||||
/**
|
||||
* objId 기반 이미지 뷰어 (한글 파일명 지원)
|
||||
* @param request
|
||||
* @param paramMap
|
||||
* @return
|
||||
*/
|
||||
@RequestMapping("/common/viewImageByObjId.do")
|
||||
public String viewImageByObjId(HttpServletRequest request, @RequestParam Map<String, Object> paramMap){
|
||||
Map fileInfo = commonService.getFileInfo(paramMap);
|
||||
if(fileInfo != null){
|
||||
request.setAttribute("attDir", CommonUtils.checkNull(fileInfo.get("FILE_PATH")));
|
||||
request.setAttribute("savedFileName", CommonUtils.checkNull(fileInfo.get("SAVED_FILE_NAME")));
|
||||
request.setAttribute("realFileName", CommonUtils.checkNull(fileInfo.get("REAL_FILE_NAME")));
|
||||
}
|
||||
return "/viewImageByObjId";
|
||||
}
|
||||
|
||||
/**
|
||||
* 사용자 조회(공통)
|
||||
* @param request
|
||||
@@ -621,6 +638,16 @@ public class CommonController {
|
||||
return "/common/FileRegistPopup";
|
||||
}
|
||||
|
||||
/**
|
||||
* 이미지 파일 등록 팝업 (이미지만 업로드 가능)
|
||||
*/
|
||||
@RequestMapping("/common/ImageRegistPopup.do")
|
||||
public String ImageRegistPopup(HttpServletRequest request, @RequestParam Map<String, Object> paramMap){
|
||||
request.setAttribute("docType", CommonUtils.checkNull(paramMap.get("docType")));
|
||||
request.setAttribute("docTypeName", CommonUtils.checkNull(paramMap.get("docTypeName")));
|
||||
return "/common/ImageRegistPopup";
|
||||
}
|
||||
|
||||
@RequestMapping("/common/FileDetailPopup.do")
|
||||
public String FileDetailPopup(HttpServletRequest request, @RequestParam Map<String, Object> paramMap){
|
||||
request.setAttribute("docType", CommonUtils.checkNull(paramMap.get("docType")));
|
||||
|
||||
@@ -391,10 +391,11 @@ public class QualityController {
|
||||
/**
|
||||
* 공정검사 관리 그리드 목록 조회
|
||||
*/
|
||||
@ResponseBody
|
||||
@RequestMapping("/quality/processInspectionGridList.do")
|
||||
public String processInspectionGridList(HttpServletRequest request, @RequestParam Map<String, Object> paramMap){
|
||||
request.setAttribute("RESULT", CommonUtils.getJsonArray(service.getProcessInspectionList(request, paramMap)));
|
||||
return "/ajax/ajaxResult";
|
||||
public Map processInspectionGridList(HttpServletRequest request, @RequestParam Map<String, Object> paramMap){
|
||||
commonService.selectListPagingNew("quality.getProcessInspectionList", request, paramMap);
|
||||
return paramMap;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -402,11 +403,53 @@ public class QualityController {
|
||||
*/
|
||||
@RequestMapping("/quality/processInspectionFormPopUp.do")
|
||||
public String processInspectionFormPopUp(HttpServletRequest request, @RequestParam Map<String, Object> paramMap){
|
||||
Map info = service.getProcessInspectionInfo(paramMap);
|
||||
request.setAttribute("info", info);
|
||||
Map code_map = new HashMap();
|
||||
|
||||
try {
|
||||
// 로그인 사용자 정보
|
||||
PersonBean person = (PersonBean) request.getSession().getAttribute(Constants.PERSON_BEAN);
|
||||
String loginUserId = person != null ? person.getUserId() : "";
|
||||
|
||||
// 기존 검사 정보 조회
|
||||
Map info = service.getProcessInspectionInfo(paramMap);
|
||||
String savedInspectorId = "";
|
||||
if(info != null && info.get("inspector_id") != null) {
|
||||
savedInspectorId = (String) info.get("inspector_id");
|
||||
request.setAttribute("info", info);
|
||||
} else {
|
||||
savedInspectorId = loginUserId;
|
||||
}
|
||||
|
||||
// 검사자 목록
|
||||
code_map.put("inspector_id", commonService.bizMakeOptionList("", savedInspectorId, "common.getUserselect"));
|
||||
} catch(Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
request.setAttribute("code_map", code_map);
|
||||
return "/quality/processInspectionFormPopUp";
|
||||
}
|
||||
|
||||
/**
|
||||
* 공정검사 상세 그리드 목록 조회
|
||||
*/
|
||||
@ResponseBody
|
||||
@RequestMapping("/quality/processInspectionDetailGridList.do")
|
||||
public Map processInspectionDetailGridList(HttpServletRequest request, @RequestParam Map<String, Object> paramMap){
|
||||
commonService.selectListPagingNew("quality.getProcessInspectionDetailList", request, paramMap);
|
||||
return paramMap;
|
||||
}
|
||||
|
||||
/**
|
||||
* 공정검사 저장
|
||||
*/
|
||||
@RequestMapping("/quality/saveProcessInspection.do")
|
||||
public String saveProcessInspection(HttpServletRequest request, @RequestParam Map paramMap){
|
||||
Map map = service.saveProcessInspection(request, paramMap);
|
||||
request.setAttribute("RESULT", CommonUtils.getJsonMap(map));
|
||||
return "/ajax/ajaxResult";
|
||||
}
|
||||
|
||||
/**
|
||||
* 공정검사 엑셀 다운로드
|
||||
*/
|
||||
@@ -467,16 +510,25 @@ public class QualityController {
|
||||
*/
|
||||
@RequestMapping("/quality/customerCsList.do")
|
||||
public String customerCsList(HttpServletRequest request, @RequestParam Map<String, Object> paramMap){
|
||||
Map code_map = new HashMap();
|
||||
try {
|
||||
// 고객사
|
||||
code_map.put("customer_cd", commonService.bizMakeOptionList("", "", "common.getClientMngSupplySelect"));
|
||||
request.setAttribute("code_map", code_map);
|
||||
} catch(Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return "/quality/customerCsList";
|
||||
}
|
||||
|
||||
/**
|
||||
* 고객 CS 관리 그리드 목록 조회
|
||||
*/
|
||||
@ResponseBody
|
||||
@RequestMapping("/quality/customerCsGridList.do")
|
||||
public String customerCsGridList(HttpServletRequest request, @RequestParam Map<String, Object> paramMap){
|
||||
request.setAttribute("RESULT", CommonUtils.getJsonArray(service.getCustomerCsList(request, paramMap)));
|
||||
return "/ajax/ajaxResult";
|
||||
public Map customerCsGridList(HttpServletRequest request, @RequestParam Map<String, Object> paramMap){
|
||||
commonService.selectListPagingNew("quality.getCustomerCsList", request, paramMap);
|
||||
return paramMap;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -484,9 +536,34 @@ public class QualityController {
|
||||
*/
|
||||
@RequestMapping("/quality/customerCsDefectFormPopUp.do")
|
||||
public String customerCsDefectFormPopUp(HttpServletRequest request, @RequestParam Map<String, Object> paramMap){
|
||||
Map code_map = new HashMap();
|
||||
Map info = new HashMap();
|
||||
|
||||
try {
|
||||
String objId = CommonUtils.checkNull(paramMap.get("OBJID"));
|
||||
if(!objId.isEmpty()) {
|
||||
info = service.getCustomerCsInfo(paramMap);
|
||||
request.setAttribute("info", info);
|
||||
}
|
||||
// 고객사
|
||||
code_map.put("customer_cd", commonService.bizMakeOptionList("", CommonUtils.nullToEmpty((String)info.get("customer_objid")), "common.getClientMngSupplySelect"));
|
||||
} catch(Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
request.setAttribute("code_map", code_map);
|
||||
return "/quality/customerCsDefectFormPopUp";
|
||||
}
|
||||
|
||||
/**
|
||||
* 고객 불량 저장
|
||||
*/
|
||||
@ResponseBody
|
||||
@RequestMapping("/quality/saveCustomerCsDefect.do")
|
||||
public Map saveCustomerCsDefect(HttpServletRequest request, @RequestParam Map<String, Object> paramMap){
|
||||
return service.saveCustomerCsDefect(request, paramMap);
|
||||
}
|
||||
|
||||
/**
|
||||
* 조치결과 등록 팝업
|
||||
*/
|
||||
@@ -497,6 +574,15 @@ public class QualityController {
|
||||
return "/quality/customerCsActionFormPopUp";
|
||||
}
|
||||
|
||||
/**
|
||||
* 조치결과 저장
|
||||
*/
|
||||
@ResponseBody
|
||||
@RequestMapping("/quality/saveCustomerCsAction.do")
|
||||
public Map saveCustomerCsAction(HttpServletRequest request, @RequestParam Map<String, Object> paramMap){
|
||||
return service.saveCustomerCsAction(request, paramMap);
|
||||
}
|
||||
|
||||
// =====================================================
|
||||
// ECR 관리
|
||||
// =====================================================
|
||||
|
||||
@@ -3317,4 +3317,20 @@ ORDER BY COALESCE(T.REVISION, '1.0')
|
||||
</otherwise>
|
||||
</choose>
|
||||
</select>
|
||||
|
||||
<!-- 프로젝트 OBJID로 MBOM 파트 목록 조회 -->
|
||||
<select id="getMbomPartListByProjectNo" parameterType="map" resultType="map">
|
||||
SELECT PM.OBJID AS CODE
|
||||
, PM.PART_NO || ' - ' || PM.PART_NAME AS NAME
|
||||
, PM.OBJID AS CODE_ID
|
||||
, PM.PART_NO || ' - ' || PM.PART_NAME AS CODE_NAME
|
||||
, PM.PART_NO
|
||||
, PM.PART_NAME
|
||||
FROM MBOM_DETAIL MD
|
||||
INNER JOIN MBOM_HEADER MH ON MH.OBJID = MD.MBOM_HEADER_OBJID
|
||||
INNER JOIN PROJECT_MGMT PJ ON PJ.OBJID = MH.PROJECT_OBJID
|
||||
INNER JOIN PART_MNG PM ON PM.OBJID::VARCHAR = MD.PART_OBJID
|
||||
WHERE PJ.OBJID = #{PROJECT_NO}
|
||||
ORDER BY PM.PART_NO
|
||||
</select>
|
||||
</mapper>
|
||||
@@ -881,74 +881,221 @@
|
||||
공정검사 관리
|
||||
===================================================== -->
|
||||
|
||||
<!-- 공정검사 목록 조회 -->
|
||||
<!-- 공정검사 마스터 목록 조회 -->
|
||||
<select id="getProcessInspectionList" parameterType="map" resultType="map">
|
||||
SELECT PPI.OBJID
|
||||
, TO_CHAR(PPI.INSPECTION_DATE, 'YYYY-MM-DD') AS INSPECTION_DATE
|
||||
, PPI.PROJECT_NO
|
||||
, PPI.PART_NO
|
||||
, PPI.PART_NAME
|
||||
, PPI.DEFECT_QTY
|
||||
, PPI.WORK_ENV_STATUS
|
||||
, PPI.MEASURING_DEVICE
|
||||
, PPI.INSPECTOR_ID
|
||||
, (SELECT USER_NAME FROM USER_INFO WHERE USER_ID = PPI.INSPECTOR_ID) AS INSPECTOR_NAME
|
||||
, PPI.INSPECTION_RESULT
|
||||
FROM PMS_QUALITY_PROCESS_INSPECTION PPI
|
||||
SELECT PIM.OBJID
|
||||
, PIM.INSPECTION_DATE
|
||||
, PIM.INSPECTOR_ID
|
||||
, (SELECT USER_NAME FROM USER_INFO WHERE USER_ID = PIM.INSPECTOR_ID) AS INSPECTOR_NAME
|
||||
<!-- 프로젝트명 (외 N건) -->
|
||||
, (SELECT
|
||||
CASE WHEN COUNT(DISTINCT PID.PROJECT_OBJID) > 1
|
||||
THEN (SELECT PROJECT_NO FROM PROJECT_MGMT WHERE OBJID = MIN(PID.PROJECT_OBJID)) || ' 외 ' || (COUNT(DISTINCT PID.PROJECT_OBJID) - 1) || '건'
|
||||
ELSE (SELECT PROJECT_NO FROM PROJECT_MGMT WHERE OBJID = MIN(PID.PROJECT_OBJID))
|
||||
END
|
||||
FROM PROCESS_INSPECTION_DETAIL PID WHERE PID.MASTER_OBJID = PIM.OBJID
|
||||
) AS PROJECT_NO
|
||||
<!-- 품번 (외 N건) -->
|
||||
, (SELECT
|
||||
CASE WHEN COUNT(*) > 1
|
||||
THEN MIN(PID.PART_NO) || ' 외 ' || (COUNT(*) - 1) || '건'
|
||||
ELSE MIN(PID.PART_NO)
|
||||
END
|
||||
FROM PROCESS_INSPECTION_DETAIL PID WHERE PID.MASTER_OBJID = PIM.OBJID
|
||||
) AS PART_NO
|
||||
<!-- 품명 (외 N건) -->
|
||||
, (SELECT
|
||||
CASE WHEN COUNT(*) > 1
|
||||
THEN MIN(PID.PART_NAME) || ' 외 ' || (COUNT(*) - 1) || '건'
|
||||
ELSE MIN(PID.PART_NAME)
|
||||
END
|
||||
FROM PROCESS_INSPECTION_DETAIL PID WHERE PID.MASTER_OBJID = PIM.OBJID
|
||||
) AS PART_NAME
|
||||
<!-- 불량수량 합계 -->
|
||||
, (SELECT COALESCE(SUM(PID.DEFECT_QTY), 0) FROM PROCESS_INSPECTION_DETAIL PID WHERE PID.MASTER_OBJID = PIM.OBJID) AS DEFECT_QTY
|
||||
<!-- 작업환경상태 (하나라도 불량이면 불량) -->
|
||||
, (SELECT CASE WHEN COUNT(CASE WHEN PID.WORK_ENV_STATUS = '불량' THEN 1 END) > 0 THEN '불량' ELSE '양호' END
|
||||
FROM PROCESS_INSPECTION_DETAIL PID WHERE PID.MASTER_OBJID = PIM.OBJID
|
||||
) AS WORK_ENV_STATUS
|
||||
<!-- 측정기 (하나라도 불량이면 불량) -->
|
||||
, (SELECT CASE WHEN COUNT(CASE WHEN PID.MEASURING_DEVICE = '불량' THEN 1 END) > 0 THEN '불량' ELSE '양호' END
|
||||
FROM PROCESS_INSPECTION_DETAIL PID WHERE PID.MASTER_OBJID = PIM.OBJID
|
||||
) AS MEASURING_DEVICE
|
||||
<!-- 검사결과 (하나라도 NG면 NG) -->
|
||||
, (SELECT CASE WHEN COUNT(CASE WHEN PID.INSPECTION_RESULT = 'NG' THEN 1 END) > 0 THEN 'NG' ELSE 'OK' END
|
||||
FROM PROCESS_INSPECTION_DETAIL PID WHERE PID.MASTER_OBJID = PIM.OBJID
|
||||
) AS INSPECTION_RESULT
|
||||
, PIM.REMARK
|
||||
FROM PROCESS_INSPECTION_MASTER PIM
|
||||
WHERE 1=1
|
||||
<if test="search_project_no != null and search_project_no != ''">
|
||||
AND UPPER(PPI.PROJECT_NO) LIKE UPPER('%' || #{search_project_no} || '%')
|
||||
AND EXISTS (SELECT 1 FROM PROCESS_INSPECTION_DETAIL PID
|
||||
JOIN PROJECT_MGMT PM ON PM.OBJID = PID.PROJECT_OBJID
|
||||
WHERE PID.MASTER_OBJID = PIM.OBJID
|
||||
AND UPPER(PM.PROJECT_NO) LIKE UPPER('%' || #{search_project_no} || '%'))
|
||||
</if>
|
||||
<if test="search_part_no != null and search_part_no != ''">
|
||||
AND UPPER(PPI.PART_NO) LIKE UPPER('%' || #{search_part_no} || '%')
|
||||
AND EXISTS (SELECT 1 FROM PROCESS_INSPECTION_DETAIL PID
|
||||
WHERE PID.MASTER_OBJID = PIM.OBJID
|
||||
AND UPPER(PID.PART_NO) LIKE UPPER('%' || #{search_part_no} || '%'))
|
||||
</if>
|
||||
<if test="search_part_name != null and search_part_name != ''">
|
||||
AND UPPER(PPI.PART_NAME) LIKE UPPER('%' || #{search_part_name} || '%')
|
||||
</if>
|
||||
<if test="search_work_env_status != null and search_work_env_status != ''">
|
||||
AND UPPER(PPI.WORK_ENV_STATUS) LIKE UPPER('%' || #{search_work_env_status} || '%')
|
||||
</if>
|
||||
<if test="search_measuring_device != null and search_measuring_device != ''">
|
||||
AND UPPER(PPI.MEASURING_DEVICE) LIKE UPPER('%' || #{search_measuring_device} || '%')
|
||||
AND EXISTS (SELECT 1 FROM PROCESS_INSPECTION_DETAIL PID
|
||||
WHERE PID.MASTER_OBJID = PIM.OBJID
|
||||
AND UPPER(PID.PART_NAME) LIKE UPPER('%' || #{search_part_name} || '%'))
|
||||
</if>
|
||||
<if test="search_inspector != null and search_inspector != ''">
|
||||
AND (
|
||||
UPPER(PPI.INSPECTOR_ID) LIKE UPPER('%' || #{search_inspector} || '%')
|
||||
OR UPPER((SELECT USER_NAME FROM USER_INFO WHERE USER_ID = PPI.INSPECTOR_ID)) LIKE UPPER('%' || #{search_inspector} || '%')
|
||||
UPPER(PIM.INSPECTOR_ID) LIKE UPPER('%' || #{search_inspector} || '%')
|
||||
OR UPPER((SELECT USER_NAME FROM USER_INFO WHERE USER_ID = PIM.INSPECTOR_ID)) LIKE UPPER('%' || #{search_inspector} || '%')
|
||||
)
|
||||
</if>
|
||||
<if test="search_inspection_date_from != null and search_inspection_date_from != ''">
|
||||
AND PPI.INSPECTION_DATE >= TO_DATE(#{search_inspection_date_from}, 'YYYY-MM-DD')
|
||||
AND PIM.INSPECTION_DATE <![CDATA[>=]]> #{search_inspection_date_from}
|
||||
</if>
|
||||
<if test="search_inspection_date_to != null and search_inspection_date_to != ''">
|
||||
AND PPI.INSPECTION_DATE <![CDATA[<=]]> TO_DATE(#{search_inspection_date_to}, 'YYYY-MM-DD')
|
||||
AND PIM.INSPECTION_DATE <![CDATA[<=]]> #{search_inspection_date_to}
|
||||
</if>
|
||||
<if test="search_inspection_result != null and search_inspection_result != ''">
|
||||
AND PPI.INSPECTION_RESULT = #{search_inspection_result}
|
||||
AND (SELECT CASE WHEN COUNT(CASE WHEN PID.INSPECTION_RESULT = 'NG' THEN 1 END) > 0 THEN 'NG' ELSE 'OK' END
|
||||
FROM PROCESS_INSPECTION_DETAIL PID WHERE PID.MASTER_OBJID = PIM.OBJID) = #{search_inspection_result}
|
||||
</if>
|
||||
ORDER BY PPI.INSPECTION_DATE DESC, PPI.REG_DATE DESC
|
||||
ORDER BY PIM.INSPECTION_DATE DESC, PIM.REG_DATE DESC
|
||||
</select>
|
||||
|
||||
<!-- 공정검사 상세 조회 -->
|
||||
<!-- 공정검사 마스터 상세 조회 -->
|
||||
<select id="getProcessInspectionInfo" parameterType="map" resultType="map">
|
||||
SELECT PPI.OBJID
|
||||
, TO_CHAR(PPI.INSPECTION_DATE, 'YYYY-MM-DD') AS INSPECTION_DATE
|
||||
, PPI.PROJECT_NO
|
||||
, PPI.PART_NO
|
||||
, PPI.PART_NAME
|
||||
, PPI.DEFECT_QTY
|
||||
, PPI.WORK_ENV_STATUS
|
||||
, PPI.MEASURING_DEVICE
|
||||
, PPI.INSPECTOR_ID
|
||||
, (SELECT USER_NAME FROM USER_INFO WHERE USER_ID = PPI.INSPECTOR_ID) AS INSPECTOR_NAME
|
||||
, PPI.INSPECTION_RESULT
|
||||
, PPI.REMARK
|
||||
, PPI.WRITER
|
||||
, TO_CHAR(PPI.REG_DATE, 'YYYY-MM-DD') AS REG_DATE
|
||||
FROM PMS_QUALITY_PROCESS_INSPECTION PPI
|
||||
WHERE PPI.OBJID = #{OBJID}
|
||||
SELECT PIM.OBJID
|
||||
, PIM.INSPECTION_DATE
|
||||
, PIM.INSPECTOR_ID
|
||||
, (SELECT USER_NAME FROM USER_INFO WHERE USER_ID = PIM.INSPECTOR_ID) AS INSPECTOR_NAME
|
||||
, PIM.REMARK
|
||||
, PIM.WRITER
|
||||
, TO_CHAR(PIM.REG_DATE, 'YYYY-MM-DD') AS REG_DATE
|
||||
FROM PROCESS_INSPECTION_MASTER PIM
|
||||
WHERE PIM.OBJID = #{OBJID}
|
||||
</select>
|
||||
|
||||
<!-- 공정검사 디테일 그리드 목록 조회 -->
|
||||
<select id="getProcessInspectionDetailList" parameterType="map" resultType="map">
|
||||
SELECT PID.OBJID
|
||||
, PID.MASTER_OBJID
|
||||
, PID.PROCESS_CD
|
||||
, (SELECT CODE_NAME FROM COMM_CODE WHERE CODE_ID = PID.PROCESS_CD) AS PROCESS_NAME
|
||||
, PID.PROJECT_OBJID
|
||||
, (SELECT PROJECT_NO FROM PROJECT_MGMT WHERE OBJID = PID.PROJECT_OBJID) AS PROJECT_NO
|
||||
, PID.PART_OBJID
|
||||
, PID.PART_NO
|
||||
, PID.PART_NAME
|
||||
, PID.INSPECTION_QTY
|
||||
, PID.DEFECT_QTY
|
||||
, PID.WORK_ENV_STATUS
|
||||
, PID.MEASURING_DEVICE
|
||||
, PID.DEPT_CD
|
||||
, (SELECT DEPT_NAME FROM DEPT_INFO WHERE OBJID::VARCHAR = PID.DEPT_CD) AS DEPT_NAME
|
||||
, PID.USER_ID
|
||||
, (SELECT USER_NAME FROM USER_INFO WHERE USER_ID = PID.USER_ID) AS USER_NAME
|
||||
, PID.REMARK
|
||||
, PID.ACTION_STATUS
|
||||
, PID.INSPECTION_RESULT
|
||||
FROM PROCESS_INSPECTION_DETAIL PID
|
||||
WHERE PID.MASTER_OBJID = #{MASTER_OBJID}
|
||||
ORDER BY PID.REG_DATE
|
||||
</select>
|
||||
|
||||
<!-- 공정검사 마스터 저장 -->
|
||||
<insert id="insertProcessInspectionMaster" parameterType="map">
|
||||
INSERT INTO PROCESS_INSPECTION_MASTER (
|
||||
OBJID
|
||||
, INSPECTION_DATE
|
||||
, INSPECTOR_ID
|
||||
, REMARK
|
||||
, WRITER
|
||||
, REG_DATE
|
||||
) VALUES (
|
||||
#{OBJID}
|
||||
, #{INSPECTION_DATE}
|
||||
, #{INSPECTOR_ID}
|
||||
, #{REMARK}
|
||||
, #{WRITER}
|
||||
, NOW()
|
||||
)
|
||||
</insert>
|
||||
|
||||
<!-- 공정검사 마스터 수정 -->
|
||||
<update id="updateProcessInspectionMaster" parameterType="map">
|
||||
UPDATE PROCESS_INSPECTION_MASTER SET
|
||||
INSPECTION_DATE = #{INSPECTION_DATE}
|
||||
, INSPECTOR_ID = #{INSPECTOR_ID}
|
||||
, REMARK = #{REMARK}
|
||||
, MOD_DATE = NOW()
|
||||
WHERE OBJID = #{OBJID}
|
||||
</update>
|
||||
|
||||
<!-- 공정검사 디테일 저장 (UPSERT) -->
|
||||
<update id="saveProcessInspectionDetail" parameterType="map">
|
||||
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()
|
||||
</update>
|
||||
|
||||
<!-- 공정검사 디테일 삭제 (마스터 기준) -->
|
||||
<delete id="deleteProcessInspectionDetailByMaster" parameterType="map">
|
||||
DELETE FROM PROCESS_INSPECTION_DETAIL WHERE MASTER_OBJID = #{MASTER_OBJID}
|
||||
</delete>
|
||||
|
||||
<!-- =====================================================
|
||||
반제품검사 관리
|
||||
===================================================== -->
|
||||
@@ -991,14 +1138,17 @@
|
||||
<select id="getCustomerCsList" parameterType="map" resultType="map">
|
||||
SELECT CCS.OBJID
|
||||
, CCS.RECEIPT_NO
|
||||
, TO_CHAR(CCS.RECEIPT_DATE, 'YYYY-MM-DD') AS RECEIPT_DATE
|
||||
, CCS.RECEIPT_DATE
|
||||
, CCS.QTY
|
||||
, CCS.CUSTOMER_NAME
|
||||
, CCS.CUSTOMER_OBJID
|
||||
, (SELECT CLIENT_NM FROM CLIENT_MNG WHERE OBJID::VARCHAR = CCS.CUSTOMER_OBJID) AS CUSTOMER_NAME
|
||||
, CCS.MODEL_NAME
|
||||
, CCS.PRODUCT_NAME
|
||||
, CCS.PART_NO
|
||||
, TO_CHAR(CCS.PRODUCTION_DATE, 'YYYY-MM-DD') AS PRODUCTION_DATE
|
||||
, TO_CHAR(CCS.SALES_DATE, 'YYYY-MM-DD') AS SALES_DATE
|
||||
, CCS.PRODUCT_NO
|
||||
, CCS.PART_NAME
|
||||
, CCS.PRODUCTION_DATE
|
||||
, CCS.SALES_DATE
|
||||
, CCS.SERIAL_NO
|
||||
, CCS.MANUFACTURER
|
||||
, CCS.COMPLAINT_CONTENT
|
||||
@@ -1006,30 +1156,37 @@
|
||||
, CCS.BLAME_DECISION
|
||||
, CCS.STATUS
|
||||
, CCS.REMARK
|
||||
, TO_CHAR(CCS.ACTION_DATE, 'YYYY-MM-DD') AS ACTION_DATE
|
||||
, CCS.ACTION_DATE
|
||||
, CCS.ACTION_USER_ID
|
||||
, (SELECT USER_NAME FROM USER_INFO WHERE USER_ID = CCS.ACTION_USER_ID) AS ACTION_USER_NAME
|
||||
, CASE WHEN CCS.ATTACH_FILE_OBJID IS NOT NULL THEN 'Y' ELSE 'N' END AS ATTACH_FILE
|
||||
FROM PMS_QUALITY_CUSTOMER_CS CCS
|
||||
, (SELECT COUNT(*) FROM ATTACH_FILE_INFO AFI WHERE AFI.TARGET_OBJID = CCS.OBJID AND AFI.DOC_TYPE = 'CUSTOMER_CS_IMAGE' AND STATUS = 'Active') AS IMAGE_FILE
|
||||
, (SELECT COUNT(*) FROM ATTACH_FILE_INFO AFI WHERE AFI.TARGET_OBJID = CCS.OBJID AND AFI.DOC_TYPE = 'CUSTOMER_CS_ACTION' AND STATUS = 'Active') AS ATTACH_FILE
|
||||
FROM CUSTOMER_CS CCS
|
||||
WHERE 1=1
|
||||
<if test="search_receipt_date_from != null and search_receipt_date_from != ''">
|
||||
AND CCS.RECEIPT_DATE >= TO_DATE(#{search_receipt_date_from}, 'YYYY-MM-DD')
|
||||
AND CCS.RECEIPT_DATE <![CDATA[>=]]> #{search_receipt_date_from}
|
||||
</if>
|
||||
<if test="search_receipt_date_to != null and search_receipt_date_to != ''">
|
||||
AND CCS.RECEIPT_DATE <![CDATA[<=]]> TO_DATE(#{search_receipt_date_to}, 'YYYY-MM-DD')
|
||||
AND CCS.RECEIPT_DATE <![CDATA[<=]]> #{search_receipt_date_to}
|
||||
</if>
|
||||
<if test="search_customer_name != null and search_customer_name != ''">
|
||||
AND UPPER(CCS.CUSTOMER_NAME) LIKE UPPER('%' || #{search_customer_name} || '%')
|
||||
<if test="search_customer_objid != null and search_customer_objid != ''">
|
||||
AND CCS.CUSTOMER_OBJID = #{search_customer_objid}
|
||||
</if>
|
||||
<if test="search_model_name != null and search_model_name != ''">
|
||||
AND UPPER(CCS.MODEL_NAME) LIKE UPPER('%' || #{search_model_name} || '%')
|
||||
</if>
|
||||
<if test="search_product_no != null and search_product_no != ''">
|
||||
AND UPPER(CCS.PRODUCT_NO) LIKE UPPER('%' || #{search_product_no} || '%')
|
||||
</if>
|
||||
<if test="search_product_name != null and search_product_name != ''">
|
||||
AND UPPER(CCS.PRODUCT_NAME) LIKE UPPER('%' || #{search_product_name} || '%')
|
||||
</if>
|
||||
<if test="search_part_no != null and search_part_no != ''">
|
||||
AND UPPER(CCS.PART_NO) LIKE UPPER('%' || #{search_part_no} || '%')
|
||||
</if>
|
||||
<if test="search_part_name != null and search_part_name != ''">
|
||||
AND UPPER(CCS.PART_NAME) LIKE UPPER('%' || #{search_part_name} || '%')
|
||||
</if>
|
||||
<if test="search_serial_no != null and search_serial_no != ''">
|
||||
AND UPPER(CCS.SERIAL_NO) LIKE UPPER('%' || #{search_serial_no} || '%')
|
||||
</if>
|
||||
@@ -1043,10 +1200,10 @@
|
||||
AND CCS.STATUS = #{search_status}
|
||||
</if>
|
||||
<if test="search_action_date_from != null and search_action_date_from != ''">
|
||||
AND CCS.ACTION_DATE >= TO_DATE(#{search_action_date_from}, 'YYYY-MM-DD')
|
||||
AND CCS.ACTION_DATE <![CDATA[>=]]> #{search_action_date_from}
|
||||
</if>
|
||||
<if test="search_action_date_to != null and search_action_date_to != ''">
|
||||
AND CCS.ACTION_DATE <![CDATA[<=]]> TO_DATE(#{search_action_date_to}, 'YYYY-MM-DD')
|
||||
AND CCS.ACTION_DATE <![CDATA[<=]]> #{search_action_date_to}
|
||||
</if>
|
||||
<if test="search_action_user != null and search_action_user != ''">
|
||||
AND (
|
||||
@@ -1061,14 +1218,17 @@
|
||||
<select id="getCustomerCsInfo" parameterType="map" resultType="map">
|
||||
SELECT CCS.OBJID
|
||||
, CCS.RECEIPT_NO
|
||||
, TO_CHAR(CCS.RECEIPT_DATE, 'YYYY-MM-DD') AS RECEIPT_DATE
|
||||
, CCS.RECEIPT_DATE
|
||||
, CCS.QTY
|
||||
, CCS.CUSTOMER_NAME
|
||||
, CCS.CUSTOMER_OBJID
|
||||
, (SELECT CLIENT_NM FROM CLIENT_MNG WHERE OBJID::VARCHAR = CCS.CUSTOMER_OBJID) AS CUSTOMER_NAME
|
||||
, CCS.MODEL_NAME
|
||||
, CCS.PRODUCT_NAME
|
||||
, CCS.PART_NO
|
||||
, TO_CHAR(CCS.PRODUCTION_DATE, 'YYYY-MM-DD') AS PRODUCTION_DATE
|
||||
, TO_CHAR(CCS.SALES_DATE, 'YYYY-MM-DD') AS SALES_DATE
|
||||
, CCS.PRODUCT_NO
|
||||
, CCS.PART_NAME
|
||||
, CCS.PRODUCTION_DATE
|
||||
, CCS.SALES_DATE
|
||||
, CCS.SERIAL_NO
|
||||
, CCS.MANUFACTURER
|
||||
, CCS.COMPLAINT_CONTENT
|
||||
@@ -1076,16 +1236,101 @@
|
||||
, CCS.BLAME_DECISION
|
||||
, CCS.STATUS
|
||||
, CCS.REMARK
|
||||
, TO_CHAR(CCS.ACTION_DATE, 'YYYY-MM-DD') AS ACTION_DATE
|
||||
, CCS.ACTION_DATE
|
||||
, CCS.ACTION_USER_ID
|
||||
, (SELECT USER_NAME FROM USER_INFO WHERE USER_ID = CCS.ACTION_USER_ID) AS ACTION_USER_NAME
|
||||
, CCS.ATTACH_FILE_OBJID
|
||||
, CCS.WRITER
|
||||
, TO_CHAR(CCS.REG_DATE, 'YYYY-MM-DD') AS REG_DATE
|
||||
FROM PMS_QUALITY_CUSTOMER_CS CCS
|
||||
FROM CUSTOMER_CS CCS
|
||||
WHERE CCS.OBJID = #{OBJID}
|
||||
</select>
|
||||
|
||||
<!-- 고객 CS 시퀀스 조회 -->
|
||||
<select id="getCustomerCsSeq" resultType="int">
|
||||
SELECT NEXTVAL('SEQ_CUSTOMER_CS_RECEIPT_NO')
|
||||
</select>
|
||||
|
||||
<!-- 고객 CS 등록 -->
|
||||
<insert id="insertCustomerCs" parameterType="map">
|
||||
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()
|
||||
)
|
||||
</insert>
|
||||
|
||||
<!-- 고객 CS 수정 -->
|
||||
<update id="updateCustomerCs" parameterType="map">
|
||||
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>
|
||||
|
||||
<!-- 고객 CS 조치결과 수정 -->
|
||||
<update id="updateCustomerCsAction" parameterType="map">
|
||||
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}
|
||||
</update>
|
||||
|
||||
<!-- =====================================================
|
||||
ECR 관리
|
||||
===================================================== -->
|
||||
|
||||
@@ -792,6 +792,94 @@ public class QualityService extends BaseService{
|
||||
return resultList;
|
||||
}
|
||||
|
||||
/**
|
||||
* 공정검사 저장 (마스터 + 디테일)
|
||||
*/
|
||||
public Map saveProcessInspection(HttpServletRequest request, Map paramMap){
|
||||
Map resultMap = new HashMap();
|
||||
SqlSession sqlSession = null;
|
||||
|
||||
try{
|
||||
sqlSession = SqlMapConfig.getInstance().getSqlSession();
|
||||
|
||||
PersonBean person = (PersonBean) request.getSession().getAttribute(Constants.PERSON_BEAN);
|
||||
String writer = person != null ? person.getUserId() : "";
|
||||
|
||||
String masterObjId = CommonUtils.checkNull(paramMap.get("MASTER_OBJID"));
|
||||
String inspectionDate = CommonUtils.checkNull(paramMap.get("INSPECTION_DATE"));
|
||||
String inspectorId = CommonUtils.checkNull(paramMap.get("INSPECTOR_ID"));
|
||||
String masterRemark = CommonUtils.checkNull(paramMap.get("MASTER_REMARK"));
|
||||
String dataListJson = CommonUtils.checkNull(paramMap.get("dataList"));
|
||||
|
||||
// 마스터 저장
|
||||
Map<String, Object> masterParamMap = new HashMap<String, Object>();
|
||||
masterParamMap.put("INSPECTION_DATE", inspectionDate);
|
||||
masterParamMap.put("INSPECTOR_ID", inspectorId);
|
||||
masterParamMap.put("REMARK", masterRemark);
|
||||
masterParamMap.put("WRITER", writer);
|
||||
|
||||
if(masterObjId.isEmpty()){
|
||||
// 신규 등록
|
||||
masterObjId = CommonUtils.checkNull(CommonUtils.createObjId());
|
||||
masterParamMap.put("OBJID", masterObjId);
|
||||
sqlSession.insert("quality.insertProcessInspectionMaster", masterParamMap);
|
||||
} else {
|
||||
// 수정
|
||||
masterParamMap.put("OBJID", masterObjId);
|
||||
sqlSession.update("quality.updateProcessInspectionMaster", masterParamMap);
|
||||
// 기존 디테일 삭제 후 재등록
|
||||
Map<String, Object> deleteParamMap = new HashMap<String, Object>();
|
||||
deleteParamMap.put("MASTER_OBJID", masterObjId);
|
||||
sqlSession.delete("quality.deleteProcessInspectionDetailByMaster", deleteParamMap);
|
||||
}
|
||||
|
||||
// 디테일 저장
|
||||
if(dataListJson != null && !dataListJson.isEmpty()){
|
||||
com.google.gson.Gson gson = new com.google.gson.Gson();
|
||||
java.lang.reflect.Type listType = new com.google.gson.reflect.TypeToken<List<Map<String, Object>>>(){}.getType();
|
||||
List<Map<String, Object>> dataList = gson.fromJson(dataListJson, listType);
|
||||
|
||||
for(Map<String, Object> rowData : dataList){
|
||||
Map<String, Object> sqlParamMap = new HashMap<String, Object>();
|
||||
|
||||
String detailObjId = CommonUtils.checkNull(CommonUtils.createObjId());
|
||||
|
||||
sqlParamMap.put("OBJID", detailObjId);
|
||||
sqlParamMap.put("MASTER_OBJID", masterObjId);
|
||||
sqlParamMap.put("PROCESS_CD", CommonUtils.checkNull(rowData.get("PROCESS_CD")));
|
||||
sqlParamMap.put("PROJECT_OBJID", CommonUtils.checkNull(rowData.get("PROJECT_OBJID")));
|
||||
sqlParamMap.put("PART_OBJID", CommonUtils.checkNull(rowData.get("PART_OBJID")));
|
||||
sqlParamMap.put("PART_NO", CommonUtils.checkNull(rowData.get("PART_NO")));
|
||||
sqlParamMap.put("PART_NAME", CommonUtils.checkNull(rowData.get("PART_NAME")));
|
||||
sqlParamMap.put("INSPECTION_QTY", CommonUtils.checkNull(rowData.get("INSPECTION_QTY")));
|
||||
sqlParamMap.put("DEFECT_QTY", CommonUtils.checkNull(rowData.get("DEFECT_QTY")));
|
||||
sqlParamMap.put("WORK_ENV_STATUS", CommonUtils.checkNull(rowData.get("WORK_ENV_STATUS")));
|
||||
sqlParamMap.put("MEASURING_DEVICE", CommonUtils.checkNull(rowData.get("MEASURING_DEVICE")));
|
||||
sqlParamMap.put("DEPT_CD", CommonUtils.checkNull(rowData.get("DEPT_CD")));
|
||||
sqlParamMap.put("USER_ID", CommonUtils.checkNull(rowData.get("USER_ID")));
|
||||
sqlParamMap.put("REMARK", CommonUtils.checkNull(rowData.get("REMARK")));
|
||||
sqlParamMap.put("ACTION_STATUS", CommonUtils.checkNull(rowData.get("ACTION_STATUS")));
|
||||
sqlParamMap.put("INSPECTION_RESULT", CommonUtils.checkNull(rowData.get("INSPECTION_RESULT")));
|
||||
sqlParamMap.put("WRITER", writer);
|
||||
|
||||
sqlSession.insert("quality.saveProcessInspectionDetail", sqlParamMap);
|
||||
}
|
||||
}
|
||||
|
||||
resultMap.put("RESULT", "SUCCESS");
|
||||
resultMap.put("MASTER_OBJID", masterObjId);
|
||||
|
||||
}catch(Exception e){
|
||||
e.printStackTrace();
|
||||
resultMap.put("RESULT", "FAIL");
|
||||
resultMap.put("MESSAGE", e.getMessage());
|
||||
}finally{
|
||||
if(sqlSession != null) sqlSession.close();
|
||||
}
|
||||
|
||||
return resultMap;
|
||||
}
|
||||
|
||||
// =====================================================
|
||||
// 반제품검사 관리
|
||||
// =====================================================
|
||||
@@ -868,6 +956,86 @@ public class QualityService extends BaseService{
|
||||
return resultMap;
|
||||
}
|
||||
|
||||
/**
|
||||
* 고객 불량 저장
|
||||
*/
|
||||
public Map saveCustomerCsDefect(HttpServletRequest request, Map paramMap){
|
||||
Map resultMap = new HashMap();
|
||||
SqlSession sqlSession = null;
|
||||
|
||||
try{
|
||||
sqlSession = SqlMapConfig.getInstance().getSqlSession();
|
||||
|
||||
PersonBean person = (PersonBean) request.getSession().getAttribute(Constants.PERSON_BEAN);
|
||||
String writer = person != null ? person.getUserId() : "";
|
||||
|
||||
String objId = CommonUtils.checkNull(paramMap.get("OBJID"));
|
||||
String isNew = CommonUtils.checkNull(paramMap.get("IS_NEW"));
|
||||
paramMap.put("WRITER", writer);
|
||||
|
||||
// IS_NEW 플래그로 신규/수정 구분 (JSP에서 전달)
|
||||
if("true".equals(isNew)){
|
||||
// 신규 등록
|
||||
if(objId.isEmpty()){
|
||||
objId = CommonUtils.checkNull(CommonUtils.createObjId());
|
||||
paramMap.put("OBJID", objId);
|
||||
}
|
||||
|
||||
// 접수번호 생성 (CS-YYYYMMDD-SEQ)
|
||||
String today = new java.text.SimpleDateFormat("yyyyMMdd").format(new java.util.Date());
|
||||
String receiptNo = "CS-" + today + "-" + String.format("%03d", sqlSession.selectOne("quality.getCustomerCsSeq"));
|
||||
paramMap.put("RECEIPT_NO", receiptNo);
|
||||
|
||||
sqlSession.insert("quality.insertCustomerCs", paramMap);
|
||||
} else {
|
||||
// 수정
|
||||
sqlSession.update("quality.updateCustomerCs", paramMap);
|
||||
}
|
||||
|
||||
resultMap.put("RESULT", "SUCCESS");
|
||||
resultMap.put("OBJID", objId);
|
||||
|
||||
}catch(Exception e){
|
||||
e.printStackTrace();
|
||||
resultMap.put("RESULT", "FAIL");
|
||||
resultMap.put("MESSAGE", e.getMessage());
|
||||
}finally{
|
||||
if(sqlSession != null) sqlSession.close();
|
||||
}
|
||||
|
||||
return resultMap;
|
||||
}
|
||||
|
||||
/**
|
||||
* 조치결과 저장
|
||||
*/
|
||||
public Map saveCustomerCsAction(HttpServletRequest request, Map paramMap){
|
||||
Map resultMap = new HashMap();
|
||||
SqlSession sqlSession = null;
|
||||
|
||||
try{
|
||||
sqlSession = SqlMapConfig.getInstance().getSqlSession();
|
||||
|
||||
PersonBean person = (PersonBean) request.getSession().getAttribute(Constants.PERSON_BEAN);
|
||||
String actionUserId = person != null ? person.getUserId() : "";
|
||||
|
||||
paramMap.put("ACTION_USER_ID", actionUserId);
|
||||
|
||||
sqlSession.update("quality.updateCustomerCsAction", paramMap);
|
||||
|
||||
resultMap.put("RESULT", "SUCCESS");
|
||||
|
||||
}catch(Exception e){
|
||||
e.printStackTrace();
|
||||
resultMap.put("RESULT", "FAIL");
|
||||
resultMap.put("MESSAGE", e.getMessage());
|
||||
}finally{
|
||||
if(sqlSession != null) sqlSession.close();
|
||||
}
|
||||
|
||||
return resultMap;
|
||||
}
|
||||
|
||||
// =====================================================
|
||||
// ECR 관리
|
||||
// =====================================================
|
||||
|
||||
Reference in New Issue
Block a user