초기 커밋: 5130 레거시 시스템

- URL 하드코딩 → .env APP_URL 기반 동적 URL로 변경
- DB 연결 하드코딩 → .env 기반으로 변경
- MySQL strict mode DATE 오류 수정
This commit is contained in:
2025-12-10 20:14:31 +09:00
commit aca1767eb9
6728 changed files with 1863265 additions and 0 deletions

21
instock/_request.php Normal file
View File

@@ -0,0 +1,21 @@
<?php
$num = isset($_REQUEST['num']) ? $_REQUEST['num'] : '';
$is_deleted = isset($_REQUEST['is_deleted']) ? $_REQUEST['is_deleted'] : null;
$lot_no = isset($_REQUEST['lot_no']) ? $_REQUEST['lot_no'] : '';
$inspection_date = isset($_REQUEST['inspection_date']) ? $_REQUEST['inspection_date'] : '';
$supplier = isset($_REQUEST['supplier']) ? $_REQUEST['supplier'] : '';
$item_name = isset($_REQUEST['item_name']) ? $_REQUEST['item_name'] : '';
$specification = isset($_REQUEST['specification']) ? $_REQUEST['specification'] : '';
$unit = isset($_REQUEST['unit']) ? $_REQUEST['unit'] : '';
$received_qty = isset($_REQUEST['received_qty']) ? $_REQUEST['received_qty'] : '';
$material_no = isset($_REQUEST['material_no']) ? $_REQUEST['material_no'] : '';
$manufacturer = isset($_REQUEST['manufacturer']) ? $_REQUEST['manufacturer'] : '';
$remarks = isset($_REQUEST['remarks']) ? $_REQUEST['remarks'] : '';
$purchase_price_excl_vat = isset($_REQUEST['purchase_price_excl_vat']) ? $_REQUEST['purchase_price_excl_vat'] : '';
$weight_kg = isset($_REQUEST['weight_kg']) ? $_REQUEST['weight_kg'] : '';
$searchtag = isset($_REQUEST['searchtag']) ? $_REQUEST['searchtag'] : '';
$update_log = isset($_REQUEST['update_log']) ? $_REQUEST['update_log'] : '';
$lotDone = isset($_REQUEST['lotDone']) ? $_REQUEST['lotDone'] : null;
$iList = isset($_REQUEST['iList']) ? $_REQUEST['iList'] : '{}' ; // 수입검사서 Json
$prodcode = isset($_REQUEST['prodcode']) ? $_REQUEST['prodcode'] : '';
?>

21
instock/_row.php Normal file
View File

@@ -0,0 +1,21 @@
<?php
$num = isset($row['num']) ? $row['num'] : '';
$is_deleted = isset($row['is_deleted']) ? $row['is_deleted'] : null;
$lot_no = isset($row['lot_no']) ? $row['lot_no'] : '';
$inspection_date = isset($row['inspection_date']) ? $row['inspection_date'] : '';
$supplier = isset($row['supplier']) ? $row['supplier'] : '';
$item_name = isset($row['item_name']) ? $row['item_name'] : '';
$specification = isset($row['specification']) ? $row['specification'] : '';
$unit = isset($row['unit']) ? $row['unit'] : '';
$received_qty = isset($row['received_qty']) ? $row['received_qty'] : '';
$material_no = isset($row['material_no']) ? $row['material_no'] : '';
$manufacturer = isset($row['manufacturer']) ? $row['manufacturer'] : '';
$remarks = isset($row['remarks']) ? $row['remarks'] : '';
$purchase_price_excl_vat = isset($row['purchase_price_excl_vat']) ? $row['purchase_price_excl_vat'] : '';
$weight_kg = isset($row['weight_kg']) ? $row['weight_kg'] : '';
$searchtag = isset($row['searchtag']) ? $row['searchtag'] : '';
$update_log = isset($row['update_log']) ? $row['update_log'] : '';
$lotDone = isset($row['lotDone']) ? $row['lotDone'] : null;
$iList = isset($row['iList']) ? $row['iList'] : '{}'; // 수입검사서 Json
$prodcode = isset($row['prodcode']) ? $row['prodcode'] : ''; // 품목코드 모터,샤프트 등 입고물품에 대한 검색기능 코드
?>

View File

@@ -0,0 +1,390 @@
<script>
var ajaxRequest_write = null;
var ajaxRequest = null;
var ajaxRequest5 = null;
var ajaxRequest6 = null;
var ajaxRequest7 = null;
var isDisplaying = false;
$(document).ready(function () {
displayFileLoad(); // 기존 파일 로드
// displayImageLoad(); // 기존 이미지 로드
var tablename = $("#tablename").val();
// 드롭 영역 설정
const dropArea = $("#dropArea");
dropArea.on("dragover", function (e) {
e.preventDefault();
dropArea.css("border-color", "blue"); // 드래그 중 표시
});
dropArea.on("dragleave", function (e) {
e.preventDefault();
dropArea.css("border-color", "#ccc"); // 드래그 해제 시 원래대로
});
dropArea.on("drop", function (e) {
e.preventDefault();
dropArea.css("border-color", "#ccc"); // 드롭 시 원래대로
const files = e.originalEvent.dataTransfer.files;
if (files.length > 0) {
processFiles(files, tablename, "attached", "upfile");
}
});
// 파일 선택 이벤트 처리
$("#upfile").change(function (e) {
processFiles(this.files, tablename, "attached", "upfile");
});
// // 이미지 선택 이벤트 처리
// $("#upfileimage").change(function (e) {
// processFiles(this.files, tablename, "image", "upfileimage");
// });
// 파일 업로드 및 처리 함수
function processFiles(files, tablename, item, upfilename) {
var num = $("#num").val();
if (!files || files.length === 0) {
console.warn("파일이 선택되지 않았습니다.");
return;
}
showMsgModal(3); // 파일처리중
const formData = new FormData();
for (const file of files) {
formData.append(upfilename + "[]", file);
}
// 추가 데이터 설정
formData.append("tablename", tablename);
formData.append("item", item);
formData.append("upfilename", upfilename);
formData.append("folderPath", "uploads");
formData.append("DBtable", "picuploads");
formData.append("num", num);
// AJAX 요청
$.ajax({
url: "/filedrive/fileprocess.php",
type: "POST",
enctype: "multipart/form-data",
processData: false,
contentType: false,
data: formData,
success: function (response) {
console.log("응답 데이터:", response);
let successCount = 0;
let errorCount = 0;
let errorMessages = [];
response.forEach((item) => {
if (item.status === "success") {
successCount++;
} else if (item.status === "error") {
errorCount++;
errorMessages.push(`파일: ${item.file}, 메시지: ${item.message}`);
}
});
if (successCount > 0) {
Toastify({
text: `${successCount}개의 파일이 성공적으로 업로드되었습니다.`,
duration: 2000,
close: true,
gravity: "top",
position: "center",
backgroundColor: "#4fbe87",
}).showToast();
}
if (errorCount > 0) {
Toastify({
text: `오류 발생: ${errorCount}개의 파일 업로드 실패\n상세 오류: ${errorMessages.join("\n")}`,
duration: 5000,
close: true,
gravity: "top",
position: "center",
backgroundColor: "#f44336",
}).showToast();
}
setTimeout(function () {
hideMsgModal();
if (item === "attached") displayFile();
if (item === "image") displayImage();
}, 1000);
},
error: function (jqxhr, status, error) {
console.error("업로드 실패:", jqxhr, status, error);
},
});
}
// 파일 불러오기
function displayFile() {
fetchFiles(tablename, "attached", "#displayFile");
}
// 이미지 불러오기
function displayImage() {
fetchFiles(tablename, "image", "#displayImage");
}
// 파일/이미지 데이터 가져오기
function fetchFiles(tablename, item, targetSelector) {
var tablename = $("#tablename").val();
const params = $("#num").val();
if (!params) {
console.error("ID 값이 없습니다. 데이터를 불러올 수 없습니다.");
return;
}
$.ajax({
url: "/filedrive/fileprocess.php",
type: "GET",
data: { num: params, tablename: tablename, item: item, folderPath: "uploads" },
dataType: "json",
success: function (data) {
console.log("데이터:", data);
$(targetSelector).html(""); // 기존 내용 초기화
if (Array.isArray(data) && data.length > 0) {
data.forEach(function (fileData, index) {
const realName = fileData.realname || "다운로드 파일";
const link = fileData.link || "#";
const fileId = fileData.fileId || null;
if (!fileId) {
console.error("fileId가 누락되었습니다. index: " + index, fileData);
$(targetSelector).append(
"<div class='text-danger'>파일 ID가 누락되었습니다.</div>"
);
return;
}
$(targetSelector).append(
"<div class='row mt-1 mb-2'>" +
"<div class='d-flex align-items-center justify-content-center'>" +
"<span id='file" + index + "'>" +
"<a href='#' onclick=\"popupCenter('" + link + "', 'filePopup', 800, 600); return false;\">" + realName + "</a>" +
"</span> &nbsp;&nbsp;" +
"<button type='button' class='btn btn-danger btn-sm' id='delFile" + index + "' onclick=\"deleteFile('" + index + "', '" + fileId + "', '" + tablename + "', '" + item + "')\">" +
"<i class='bi bi-trash'></i>" +
"</button>" +
"</div>" +
"</div>"
);
});
} else {
$(targetSelector).append(
""
);
}
},
error: function (error) {
console.error("파일 불러오기 오류:", error);
},
});
}
// 파일 삭제
window.deleteFile = function (index, fileId, tablename, item) {
Swal.fire({
title: "삭제 확인",
text: "정말 삭제하시겠습니까?",
icon: "warning",
showCancelButton: true,
confirmButtonText: "삭제",
cancelButtonText: "취소",
reverseButtons: true,
}).then((result) => {
if (result.isConfirmed) {
showMsgModal(3); // 파일처리중
$.ajax({
url: "/filedrive/fileprocess.php",
type: "DELETE",
data: JSON.stringify({
fileId: fileId,
tablename: tablename,
item: item,
folderPath: "uploads",
DBtable: "picuploads",
}),
contentType: "application/json",
dataType: "json",
success: function (response) {
hideMsgModal();
if (response.status === "success") {
console.log("삭제 완료:", response);
$("#file" + index).remove();
$("#delFile" + index).remove();
}
},
error: function (error) {
console.error("삭제 실패:", error);
},
});
}
});
};
});
// 기존 파일 로드 함수
function displayFileLoad() {
const data = <?php echo json_encode($savefilename_arr); ?>; // PHP에서 전달된 파일 배열
var tablename = $("#tablename").val();
$("#displayFile").html(""); // 기존 내용 초기화
if (Array.isArray(data) && data.length > 0) {
data.forEach(function (fileData, index) {
const realName = fileData.realname || "다운로드 파일";
const link = fileData.link || "#";
const fileId = fileData.fileId || null;
if (!fileId) {
console.error("fileId가 누락되었습니다. index: " + index, fileData);
$("#displayFile").append(
"<div class='text-danger'>파일 ID가 누락되었습니다.</div>"
);
return;
}
$("#displayFile").append(
"<div class='row mt-1 mb-2'>" +
"<div class='d-flex align-items-center justify-content-center'>" +
"<span id='file" + index + "'>" +
"<a href='#' onclick=\"popupCenter('" + link + "', 'filePopup', 800, 600); return false;\">" + realName + "</a>" +
"</span> &nbsp;&nbsp;" +
"<button type='button' class='btn btn-danger btn-sm' id='delFile" + index + "' onclick=\"deleteFile('" + index + "', '" + fileId + "', '" + tablename + "', 'attached')\">" +
"<i class='bi bi-trash'></i>" +
"</button>" +
"</div>" +
"</div>"
);
});
} else {
$("#displayFile").append(
""
);
}
}
// 기존 이미지 로드 함수
function displayImageLoad() {
const data = <?php echo json_encode($saveimagename_arr); ?>; // PHP에서 전달된 이미지 배열
var tablename = $("#tablename").val();
$("#displayImage").html(""); // 기존 내용 초기화
if (Array.isArray(data) && data.length > 0) {
data.forEach(function (fileData, index) {
const realName = fileData.realname || "다운로드 파일";
const thumbnail = fileData.thumbnail || "/assets/default-thumbnail.png";
const link = fileData.link || "#";
const fileId = fileData.fileId || null;
if (!fileId) {
console.error("fileId가 누락되었습니다. index: " + index, fileData);
$("#displayImage").append(
"<div class='text-danger'>파일 ID가 누락되었습니다.</div>"
);
return;
}
$("#displayImage").append(
"<div class='row mb-3'>" +
"<div class='d-flex align-items-center justify-content-center'>" +
"<a href='#' onclick=\"popupCenter('" + link + "', 'imagePopup', 800, 600); return false;\">" +
"<img id='image" + index + "' src='" + thumbnail + "' style='width:150px; height:auto;'>" +
"</a> &nbsp;&nbsp;" +
"<button type='button' class='btn btn-danger btn-sm' id='delImage" + index + "' onclick=\"deleteFile('" + index + "', '" + fileId + "', '" + tablename + "', 'image')\">" +
"<i class='bi bi-trash'></i>" +
"</button>" +
"</div>" +
"</div>"
);
});
} else {
$("#displayImage").append(
""
);
}
}
// 초기화 버튼 클릭 이벤트
$(document).ready(function() {
$('.initialBtn').on('click', function() {
// 초기화 확인 알림
Swal.fire({
title: '초기화',
text: "모든 데이터를 초기화하시겠습니까?",
icon: 'warning',
showCancelButton: true,
confirmButtonColor: '#3085d6',
cancelButtonColor: '#d33',
confirmButtonText: '예, 초기화합니다',
cancelButtonText: '취소'
}).then((result) => {
if (result.isConfirmed) {
// iList 값을 빈 배열로 초기화
const initialData = JSON.stringify([]); // 빈 배열로 초기화
// iList hidden input에 초기화된 데이터 설정
$('#iList').val(initialData);
// 초기화된 데이터 저장 요청
$.ajax({
url: 'insert_iList.php', // 데이터를 저장할 PHP 파일 경로
type: 'POST',
data: {
num: $('#num').val() ,
tablename: $('#tablename').val() ,
update_log: $('#update_log').val() ,
iList: initialData },
success: function(response) {
Swal.fire({
title: '초기화 완료',
text: "모든 데이터가 초기화되었습니다.",
icon: 'success',
confirmButtonText: '확인'
}).then(() => {
// 페이지 새로고침
setTimeout(function () {
hideMsgModal();
location.reload();
}, 1000);
});
},
error: function(jqxhr, status, error) {
Swal.fire({
title: '오류',
text: "초기화 중 오류가 발생했습니다.",
icon: 'error',
confirmButtonText: '확인'
});
console.log("AJAX Error: ", status, error);
}
});
}
});
});
});
// 부트스트랩 툴팁
$(document).ready(function() {
var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]'));
var tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) {
return new bootstrap.Tooltip(tooltipTriggerEl);
});
});
</script>

54
instock/common/head.php Normal file
View File

@@ -0,0 +1,54 @@
<?php require_once $_SERVER['DOCUMENT_ROOT'] . '/instock/commonRequest.php'; // 구글드라이브 세션 파일 포함
$title_message = '수입검사 성적서';
$tablename = 'instock';
$item = $title_message;
include $_SERVER['DOCUMENT_ROOT'] . '/load_header.php';
?>
<title> <?=$title_message?> </title>
<link rel="stylesheet" href="css/style.css">
<link rel="stylesheet" href="css/style_inspection.css">
</head>
<body>
<?php
// JavaScript에서 전달된 변수들 받기
$num = isset($_REQUEST['num']) ? $_REQUEST['num'] : '';
require_once($_SERVER['DOCUMENT_ROOT'] . "/lib/mydb.php");
$pdo = db_connect();
try {
$sql = "select * from {$DB}.{$tablename} where num = ? ";
$stmh = $pdo->prepare($sql);
$stmh->bindValue(1, $num, PDO::PARAM_STR);
$stmh->execute();
$count = $stmh->rowCount();
$row = $stmh->fetch(PDO::FETCH_ASSOC);
include "_row.php";
} catch (PDOException $Exception) {
print "오류: " . $Exception->getMessage();
}
$iList = isset($iList) ? json_decode($iList, true) : [];
$orderman = $user_name;
$todayStr = date("m/d");
$indateStr = date("m/d", strtotime($inspection_date));
// JSON 데이터를 JavaScript 변수로 변환
echo "<script>";
echo "var iListData = " . json_encode($iList) . ";" ;
echo "</script>";
$item_name = isset($row['item_name']) ? $row['item_name'] : '';
$item_name = str_replace(' ', '', $item_name); // 모든 공백 제거
$spec = isset($row['specification']) ? $row['specification'] : '';
$spec = str_replace(' ', '', $spec); // 모든 공백 제거
?>

View File

@@ -0,0 +1,55 @@
<?php
// 품질담당자 및 관리자인 경우 권한 부여
$QCadmin = false ;
if($user_name=='이세희' || $user_name=='개발자' || $user_name=='함신옥' || $user_name=='노완호' )
$QCadmin = true ;
?>
<form id="board_form" name="board_form" method="post" enctype="multipart/form-data" onkeydown="return captureReturnKey(event)" >
<input type="hidden" id="id" name="id" value="<?= isset($num) ? $num : '' ?>" >
<input type="hidden" id="parentid" name="parentid" value="<?= isset($num) ? $num : '' ?>" >
<input type="hidden" id="item" name="item" value="<?= isset($item) ? $item : '' ?>" >
<input type="hidden" id="tablename" name="tablename" value="<?= isset($tablename) ? $tablename : '' ?>" >
<input type="hidden" id="savetitle" name="savetitle" value="<?= isset($savetitle) ? $savetitle : '' ?>" >
<input type="hidden" id="mode" name="mode" value="<?= isset($mode) ? $mode : '' ?>" >
<input type="hidden" id="timekey" name="timekey" value="<?= isset($timekey) ? $timekey : '' ?>" >
<input type="hidden" id="num" name="num" value="<?= isset($num) ? $num : '' ?>">
<input type="hidden" id="user_name" name="user_name" value="<?= isset($user_name) ? $user_name : '' ?>">
<input type="hidden" id="update_log" name="update_log" value="<?= isset($update_log) ? $update_log : NULL ?>">
<input type="hidden" id="item_name" name="item_name" value="<?= isset($item_name) ? $item_name : '' ?>">
<input type="hidden" id="iList" name="iList">
<div class="container mt-2">
<div class="d-flex align-items-center justify-content-end mt-1">
<div class="card" style="width:390px;">
<div class="card-body">
<div class="d-flex justify-content-center">
<!-- 파일 선택 -->
<input type="file" id="upfile" name="upfile[]" multiple style="display:none;">
<button class="btn btn-dark btn-sm me-3" type="button" onclick="document.getElementById('upfile').click();">
<i class="bi bi-image"></i> </button>
<!-- 드롭 영역 -->
<div id="dropArea" style="border: 1px dashed #ccc; padding: 5px; width:290px; text-align: center;">
성적서 PDF drop 영역
</div>
</div>
<div class="d-flex mt-2 justify-content-center">
<!-- 파일 목록 표시 -->
<div id="displayFile"></div>
</div>
</div>
</div>
<?php if($QCadmin) { ?>
<button class="btn btn-primary btn-sm me-1 ms-2 approvalBtn" data-bs-toggle="tooltip" data-bs-placement="bottom" title="품질부서 처리" ><i class="bi bi-award-fill"></i> 승인 </button>
<?php } ?>
<button type="button" class="btn btn-dark btn-sm me-1 ms-1 saveData" > <i class="bi bi-floppy2-fill"></i> 저장 </button>
<button type="button" class="btn btn-danger btn-sm me-1 ms-1 initialBtn" data-bs-toggle="tooltip" data-bs-placement="bottom" title="성적서 초기화"> R </button>
<button type="button" class="btn btn-dark btn-sm me-1 ms-1" data-bs-toggle="tooltip" data-bs-placement="bottom" title="PDF 저장" onclick="generatePDF()"> PDF </button>
<!-- <button class="btn btn-dark btn-sm me-1" onclick="sendmail();"> <i class="bi bi-envelope-arrow-up"></i> 전송 </button> -->
<button type="button" class="btn btn-secondary btn-sm me-1 ms-1" onclick="self.close();"> <i class="bi bi-x-lg"></i> 닫기 </button>&nbsp;
</div>
</div>

99
instock/common/viewJS.php Normal file
View File

@@ -0,0 +1,99 @@
<script>
function viewBoardInstock(num, itemname, spec, remarks) {
var url = '';
switch (itemname) {
case 'SUS1.55T':
case 'SUS1.5T':
case 'SUS1.2T':
url = "i_SUSplate.php?num=" + num + "&itemname=" + itemname;
break;
case '내화충진재':
url = "i_Fireproof_sealings.php?num=" + num + "&itemname=" + itemname + "&spec=" + spec+ "&remarks=" + remarks;
break;
case '방화유리':
url = "i_antifireglass.php?num=" + num + "&itemname=" + itemname + "&spec=" + spec+ "&remarks=" + remarks;
break;
case '베어링부':
url = "i_bracket.php?num=" + num + "&itemname=" + itemname + "&spec=" + spec+ "&remarks=" + remarks;
break;
case '연동제어기':
url = "i_controller.php?num=" + num + "&itemname=" + itemname + "&spec=" + spec+ "&remarks=" + remarks;
break;
case '전동개폐기':
url = "i_motor.php?num=" + num + "&itemname=" + itemname + "&spec=" + spec+ "&remarks=" + remarks;
break;
case '마환봉':
url = "i_pole.php?num=" + num + "&itemname=" + itemname + "&spec=" + spec;
break;
case '평철':
url = "i_platesteel.php?num=" + num + "&itemname=" + itemname + "&spec=" + spec;
break;
case '받침용앵글':
url = "i_anglebottom.php?num=" + num + "&itemname=" + itemname + "&spec=" + spec;
break;
case '앵글':
url = "i_angle.php?num=" + num;
break;
case '각파이프':
url = "i_recpipe.php?num=" + num + "&itemname=" + itemname + "&spec=" + spec;
break;
case '감기샤프트':
url = "i_shaft.php?num=" + num + "&itemname=" + itemname + "&spec=" + spec;
break;
case '실리카원단':
url = "i_sillica.php?num=" + num + "&itemname=" + itemname;
break;
case '내화실':
url = "i_fireproofWire.php?num=" + num + "&itemname=" + itemname;
break;
case '와이어원단':
if (remarks.includes('대한')) {
url = "i_wireDaehan.php?num=" + num + "&itemname=" + itemname + "&spec=" + spec;
} else {
url = "i_wire.php?num=" + num + "&itemname=" + itemname + "&spec=" + spec;
}
break;
case '화이바원단':
url = "i_fiber.php?num=" + num + "&itemname=" + itemname;
break;
case 'GI0.5T':
case 'GI0.45T':
url = "i_GIplate.php?num=" + num + "&itemname=" + itemname;
break;
case 'EGI1.55T':
case 'EGI1.15T':
case 'EGI1.6T':
url = "i_EGI155.php?num=" + num + "&itemname=" + itemname;
break;
case '슬랫코일':
url = "i_slatcoil.php?num=" + num + "&itemname=" + itemname;
break;
case '바이오세라크울96K':
url = "i_cerakwool.php?num=" + num + "&itemname=" + itemname;
break;
case '절곡코일':
// var firstWord = spec.split('1')[0]; // 1 까지 추출해서 T더하기
var firstWord = spec.replace(/\s+/g, '').substring(0, 3); // 공백제거후 앞의 3자리
if (firstWord === 'EGI') {
url = "i_bendingcoil.php?num=" + num + "&itemname=" + itemname + "&spec=" + spec;
} else if (firstWord === 'SUS') {
url = "i_SUScoil.php?num=" + num + "&itemname=" + itemname + "&spec=" + spec;
}
else {
console.log("firstWord :", firstWord); // 디버깅을 위한 로그
return
}
break;
default:
console.error("Unknown itemname: " + itemname);
return; // 알 수 없는 itemname일 경우 함수를 종료
}
url = '/instock/' + url;
console.log("Opening URL:", url); // 디버깅을 위한 로그
customPopup(url, '수입검사서', 800, 900);
}
</script>

181
instock/commonDriveLoad.php Normal file
View File

@@ -0,0 +1,181 @@
<?php
// 첨부파일 있는 것 불러오기
$savefilename_arr=array();
$realname_arr=array();
$item = 'attached';
$sql = "SELECT * FROM {$DB}.picuploads WHERE tablename=? AND item = ? AND parentnum = ?";
try {
$stmh = $pdo->prepare($sql);
$stmh->execute([$tablename, $item, $num]);
while ($row = $stmh->fetch(PDO::FETCH_ASSOC)) {
$picname = $row["picname"];
$realname = $row["realname"];
$realname_arr[] = $realname; // realname 배열에 추가
if (preg_match('/^[a-zA-Z0-9_-]{25,}$/', $picname)) {
// Google Drive 파일 ID로 처리
$fileId = $picname;
try {
// Google Drive 파일 정보 가져오기
$file = $service->files->get($fileId, ['fields' => 'webViewLink, thumbnailLink']);
$thumbnailUrl = $file->thumbnailLink ?? "https://drive.google.com/uc?id=$fileId";
$webViewLink = $file->webViewLink;
$savefilename_arr[] = [
'thumbnail' => $thumbnailUrl,
'link' => $webViewLink,
'fileId' => $fileId,
'realname' => $realname // realname 포함
];
} catch (Exception $e) {
error_log("Google Drive 파일 정보 가져오기 실패: " . $e->getMessage());
$savefilename_arr[] = [
'thumbnail' => "https://drive.google.com/uc?id=$fileId",
'link' => null,
'fileId' => $fileId,
'realname' => $realname // realname 포함
];
}
} else {
// Google Drive에서 파일 이름으로 검색
try {
$query = sprintf("name='%s' and trashed=false", addslashes($picname)); // 파일 이름으로 검색
$response = $service->files->listFiles([
'q' => $query,
'fields' => 'files(id, webViewLink, thumbnailLink)',
'pageSize' => 1
]);
if (count($response->files) > 0) {
$file = $response->files[0];
$fileId = $file->id; // 검색된 파일의 ID
$thumbnailUrl = $file->thumbnailLink ?? "https://drive.google.com/uc?id=$fileId";
$webViewLink = $file->webViewLink;
$savefilename_arr[] = [
'thumbnail' => $thumbnailUrl,
'link' => $webViewLink,
'fileId' => $fileId,
'realname' => $realname // realname 포함
];
// 데이터베이스 업데이트: 검색된 파일 ID 저장
$updateSql = "UPDATE {$DB}.picuploads SET picname = ? WHERE item = ? AND parentnum = ? AND picname = ?";
$updateStmh = $pdo->prepare($updateSql);
$updateStmh->execute([$fileId, $item, $num, $picname]);
} else {
error_log("Google Drive에서 파일을 찾을 수 없습니다: " . $picname);
$savefilename_arr[] = [
'thumbnail' => null,
'link' => null,
'fileId' => null,
'realname' => $realname // realname 포함
];
}
} catch (Exception $e) {
error_log("Google Drive 파일 검색 실패: " . $e->getMessage());
$savefilename_arr[] = [
'thumbnail' => null,
'link' => null,
'fileId' => null,
'realname' => $realname // realname 포함
];
}
}
}
} catch (PDOException $Exception) {
print "오류: " . $Exception->getMessage();
}
// print_r($savefilename_arr);
// 첨부이미지 불러오기
$saveimagename_arr=array();
$realimagename_arr=array();
$item = 'image';
$sql = "SELECT * FROM {$DB}.picuploads WHERE tablename=? AND item = ? AND parentnum = ?";
try {
$stmh = $pdo->prepare($sql);
$stmh->execute([$tablename, $item, $num]);
while ($row = $stmh->fetch(PDO::FETCH_ASSOC)) {
$picname = $row["picname"];
$realname = $row["realname"];
$realimagename_arr[] = $realname; // realname 배열에 추가
if (preg_match('/^[a-zA-Z0-9_-]{25,}$/', $picname)) {
// Google Drive 파일 ID로 처리
$fileId = $picname;
try {
// Google Drive 파일 정보 가져오기
$file = $service->files->get($fileId, ['fields' => 'webViewLink, thumbnailLink']);
$thumbnailUrl = $file->thumbnailLink ?? "https://drive.google.com/uc?id=$fileId";
$webViewLink = $file->webViewLink;
$saveimagename_arr[] = [
'thumbnail' => $thumbnailUrl,
'link' => $webViewLink,
'fileId' => $fileId,
'realname' => $realname // realname 포함
];
} catch (Exception $e) {
error_log("Google Drive 파일 정보 가져오기 실패: " . $e->getMessage());
$saveimagename_arr[] = [
'thumbnail' => "https://drive.google.com/uc?id=$fileId",
'link' => null,
'fileId' => $fileId,
'realname' => $realname // realname 포함
];
}
} else {
// Google Drive에서 파일 이름으로 검색
try {
$query = sprintf("name='%s' and trashed=false", addslashes($picname)); // 파일 이름으로 검색
$response = $service->files->listFiles([
'q' => $query,
'fields' => 'files(id, webViewLink, thumbnailLink)',
'pageSize' => 1
]);
if (count($response->files) > 0) {
$file = $response->files[0];
$fileId = $file->id; // 검색된 파일의 ID
$thumbnailUrl = $file->thumbnailLink ?? "https://drive.google.com/uc?id=$fileId";
$webViewLink = $file->webViewLink;
$saveimagename_arr[] = [
'thumbnail' => $thumbnailUrl,
'link' => $webViewLink,
'fileId' => $fileId,
'realname' => $realname // realname 포함
];
// 데이터베이스 업데이트: 검색된 파일 ID 저장
$updateSql = "UPDATE {$DB}.picuploads SET picname = ? WHERE item = ? AND parentnum = ? AND picname = ?";
$updateStmh = $pdo->prepare($updateSql);
$updateStmh->execute([$fileId, $item, $num, $picname]);
} else {
error_log("Google Drive에서 파일을 찾을 수 없습니다: " . $picname);
$saveimagename_arr[] = [
'thumbnail' => null,
'link' => null,
'fileId' => null,
'realname' => $realname // realname 포함
];
}
} catch (Exception $e) {
error_log("Google Drive 파일 검색 실패: " . $e->getMessage());
$saveimagename_arr[] = [
'thumbnail' => null,
'link' => null,
'fileId' => null,
'realname' => $realname // realname 포함
];
}
}
}
} catch (PDOException $Exception) {
print "오류: " . $Exception->getMessage();
}
// print_r($saveimagename_arr);
?>

32
instock/commonRequest.php Normal file
View File

@@ -0,0 +1,32 @@
<?php
require_once $_SERVER['DOCUMENT_ROOT'] . '/session.php'; // 세션 파일 포함
require_once $_SERVER['DOCUMENT_ROOT'] . '/vendor/autoload.php';
require_once($_SERVER['DOCUMENT_ROOT'] . '/lib/mydb.php');
// 서비스 계정 JSON 파일 경로
$serviceAccountKeyFile = $_SERVER['DOCUMENT_ROOT'] . '/tokens/mytoken.json';
// Google Drive 클라이언트 설정
$client = new Google_Client();
$client->setAuthConfig($serviceAccountKeyFile);
$client->addScope(Google_Service_Drive::DRIVE);
// Google Drive 서비스 초기화
$service = new Google_Service_Drive($client);
// 특정 폴더 확인 함수
function getFolderId($service, $folderName, $parentFolderId = null) {
$query = "name='$folderName' and mimeType='application/vnd.google-apps.folder' and trashed=false";
if ($parentFolderId) {
$query .= " and '$parentFolderId' in parents";
}
$response = $service->files->listFiles([
'q' => $query,
'spaces' => 'drive',
'fields' => 'files(id, name)'
]);
return count($response->files) > 0 ? $response->files[0]->id : null;
}
?>

135
instock/css/style.css Normal file
View File

@@ -0,0 +1,135 @@
#openModalBtn {
padding: 10px 20px;
font-size: 16px;
}
.modal {
display: none;
position: fixed;
z-index: 1;
left: 0;
top: 0;
width: 100%;
height: 100%;
overflow: hidden; /* Changed from 'auto' to 'hidden' to prevent closing on outside click */
background-color: rgba(0, 0, 0, 0.4);
padding-top: 80px;
}
.modal-content {
background-color: #fefefe;
margin: auto;
border-radius: 10px;
width: 80%;
max-width: 1200px;
animation: fadeIn 0.5s;
box-shadow: 0 5px 15px rgba(0,0,0,0.3);
}
@keyframes fadeIn {
from { opacity: 0; }
to { opacity: 1; }
}
.modal-header {
background-color: #1f48d4;
color: white;
padding: 10px;
border-top-left-radius: 10px;
border-top-right-radius: 10px;
display: flex;
justify-content: space-between;
align-items: center;
}
.modal-title {
font-size: 18px;
}
.close {
color: white;
font-size: 18px;
font-weight: bold;
cursor: pointer;
}
.close:hover,
.close:focus {
color: #bbb;
text-decoration: none;
}
.modal-body {
padding: 15px;
}
.custom-card {
background-color: #f9f9f9;
padding: 20px;
border: 1px solid #ddd;
border-radius: 5px;
box-shadow: 0 1px 3px rgba(0,0,0,0.1);
}
.tooltip-inner {
background-color: black !important; /* 배경색 */
color: white !important; /* 글자색 */
}
.tooltip-arrow {
color: black !important; /* 화살표 색상 */
}
/* 입력창에 대한 설계 */
.ui-autocomplete {
max-height: 500px;
overflow-y: auto;
overflow-x: hidden;
}
.specialinputWrap {
position: relative;
display: inline-block;
width:100%;
}
.specialbtnClear {
position: absolute;
right: 10px;
top: 50%;
transform: translateY(-50%);
background: transparent;
border: none;
color: black;
cursor: pointer;
}
.specialbtnClear:before {
content: 'X';
font-size: 12px;
}
.specialbtnClear:hover {
color: black;
}
.btnClear_lot {
position: absolute;
right: 10px;
top: 50%;
transform: translateY(-50%);
background: transparent;
border: none;
color: black;
cursor: pointer;
}
.btnClear_lot:before {
content: 'X';
font-size: 12px;
}
.btnClear_lot:hover {
color: black;
}

View File

@@ -0,0 +1,112 @@
table, th, td {
border: 0.5px solid black !important; /* Bold border */
font-size: 12px !important;
white-space: nowrap;
}
.calculate-row {
background-color: #f0f0f0!important; /* Light gray background */
}
/* 전체 테이블에 대한 설정 */
table {
border-collapse: collapse;
}
/* 모든 td 요소에 적용되는 기본 패딩 및 행간 조정 */
td {
padding: 4px !important; /* 셀의 내부 여백을 줄임 */
line-height: 1.4 !important; /* 행간을 줄여서 상하단 여백을 줄임 */
}
/* 테이블의 상단과 하단 마진을 제거하여 전체 공백 줄이기 */
table, .d-flex {
margin-top: 0 !important;
margin-bottom: 0 !important;
}
@media print {
body {
width: 210mm; /* A4 width */
height: 297mm; /* A4 height */
margin: 0; /* Remove default margin */
font-size: 10pt; /* Font size for printing */
}
.table {
width: 100%; /* Full width tables */
table-layout: fixed; /* Uniform column sizing */
border-collapse: collapse; /* Ensure borders collapse */
}
.table th, .table td {
padding: 1px; /* Reduce padding */
border: 1px solid black!important; /* Ensure borders are visible */
}
.text-center {
text-align: center; /* Maintain center alignment */
}
/* Prevent table row splitting */
.table tr {
page-break-inside: avoid; /* Prevent breaking inside rows */
page-break-after: avoid; /* Allow breaking after rows */
}
.table thead {
display: table-header-group; /* Ensure table headers are repeated */
}
.table tbody {
display: table-row-group; /* Ensure table rows are grouped */
}
.table tfoot {
display: table-footer-group; /* Ensure table footers are repeated */
}
/* Add top and bottom margins to each page */
.table tbody:before,
.table tbody:after {
content: "";
display: table-row;
height: 5mm; /* Adjust as needed for top and bottom margins */
}
/* Remove border from the before and after elements */
.table tbody:before td,
.table tbody:after td {
border: none; /* Remove borders */
}
/* Adjust the border of the last row on the page */
.table tbody tr:last-child td {
border-bottom: none; /* Remove the bottom border */
border-left: none; /* Remove the bottom border */
border-right: none; /* Remove the bottom border */
border-top: none; /* Remove the bottom border */
}
/* Prevent border at the connection of two pages */
.table tbody tr:last-child td:first-child {
border-bottom: none; /* Remove the bottom border */
border-left: none; /* Remove the bottom border */
border-right: none; /* Remove the bottom border */
border-top: none; /* Remove the bottom border */
}
.table tbody tr:last-child td:last-child {
border-bottom: none; /* Remove the bottom border */
border-left: none; /* Remove the bottom border */
border-right: none; /* Remove the bottom border */
border-top: none; /* Remove the bottom border */
}
table, th, td {
border-width: 1px !important; /* 인쇄 시 테두리를 더 얇게 설정 (0.1px) */
}
/* 테두리 얇게 하는 테스트 */
.table {
transform: scale(0.70); /* 약간 축소 */
}
}
input[type="checkbox"] {
width: 10px;
height: 10px;
margin : 0;
cursor: pointer; /* 마우스 커서를 포인터로 변경 */
}

43
instock/fetch_code.php Normal file
View File

@@ -0,0 +1,43 @@
<?php
header('Content-Type: application/json'); // JSON 반환 헤더 추가
require_once($_SERVER['DOCUMENT_ROOT'] . "/session.php");
require_once($_SERVER['DOCUMENT_ROOT'] . "/lib/mydb.php");
$pdo = db_connect();
$mode = $_POST['mode'] ?? '';
$item_name = $_POST['item_name'] ?? '';
if ($mode === 'fetch_specifications' && $item_name) {
$sql = "SELECT specification FROM {$DB}.instock WHERE item_name = ? AND is_deleted IS NULL";
try {
$stmh = $pdo->prepare($sql);
$stmh->execute([$item_name]);
$result = $stmh->fetchAll(PDO::FETCH_COLUMN); // 컬럼 값만 배열로 가져옴
// '전동개폐기'인 경우 '2000KG380V(유선)' 등 추가
if ($item_name === '전동개폐기') {
$result[] = '2000KG380V(유선)';
$result[] = '2000KG380V(무선)';
$result[] = '400KG380V(무선)';
$result[] = '500KG380V(유선)';
$result[] = '1000KG380V(유선)';
$result[] = '1500KG380V(유선)';
}
// 'GI0.5T'인 경우 '1219*1219' 추가
if ($item_name === 'GI0.5T') {
$result[] = '1219*1219';
}
if ($result) {
echo json_encode(['success' => true, 'data' => $result]);
} else {
echo json_encode(['success' => false, 'error' => 'No matching data found']);
}
} catch (PDOException $e) {
echo json_encode(['success' => false, 'error' => $e->getMessage()]);
}
} else {
echo json_encode(['success' => false, 'error' => 'Invalid request parameters']);
}
?>

View File

@@ -0,0 +1,106 @@
<?php
require_once($_SERVER['DOCUMENT_ROOT'] . "/session.php");
$num = isset($_POST['num']) ? $_POST['num'] : '';
$tablename = 'material_reg';
require_once($_SERVER['DOCUMENT_ROOT'] . "/lib/mydb.php");
$pdo = db_connect();
if ($num) {
try {
$sql = "SELECT * FROM ". $DB . "." . $tablename . " WHERE num=?";
$stmh = $pdo->prepare($sql);
$stmh->bindValue(1, $num, PDO::PARAM_INT);
$stmh->execute();
$row = $stmh->fetch(PDO::FETCH_ASSOC);
// Load the form for editing existing stock entry
include '_row.php'; // Existing row data for editing
} catch (PDOException $Exception) {
echo "오류: ".$Exception->getMessage();
exit;
}
} else {
echo "데이터가 없습니다."; // Handle error if no num is passed
}
$title_message = '입고 수정'; // Update only, no insert option
?>
<div class="container-fluid">
<div class="d-flex align-items-center justify-content-center">
<div class="card justify-content-center">
<div class="card-header text-center">
<span class="text-center fs-5 me-3"><?=$title_message?></span> ( <?=$row['num']?> )
<input type="hidden" id="mode" name="mode" value="<?= isset($mode) ? $mode : '' ?>">
<input type="hidden" id="num" name="num" value="<?= isset($num) ? $num : '' ?>">
</div>
<div class="card-body">
<div class="row justify-content-center text-center">
<div class="d-flex align-items-center justify-content-center m-2">
<table class="table table-bordered">
<tbody>
<tr>
<td class="text-center fs-6 fw-bold" style="width:150px;">등록일자</td>
<td class="text-center" style="width:200px;">
<input type="date" class="form-control fs-6" id="registedate" name="registedate" value="<?=$row['registedate']?>" readonly>
</td>
<td class="text-center fs-6 fw-bold" style="width:150px;">입고 일자</td>
<td class="text-center" style="width:500px;">
<input type="date" class="form-control fs-6" id="inoutdate" name="inoutdate" value="<?=$row['inoutdate']?>">
</td>
</tr>
<tr>
<td class="text-center fs-6 fw-bold" style="width:150px;">품목코드</td>
<td class="text-center">
<div class="specialinputWrap">
<input type="text" class="form-control inputcode fs-6" id="inout_item_code" name="inout_item_code" value="<?=$row['inout_item_code']?>" readonly>
</div>
</td>
<td class="text-center fs-6 fw-bold" style="width:150px;">품목명</td>
<td class="text-center" style="width:400px;">
<div class="specialinputWrap">
<input type="text" class="form-control inputitemname fs-6" id="item_name" name="item_name" value="<?=$row['item_name']?>" readonly>
</div>
</td>
</tr>
<tr>
<td class="text-center fs-6 fw-bold" style="width:150px;">매입처</td>
<td class="text-center" style="width:400px;">
<input class="form-control fs-6" id="secondord" name="secondord" value="<?=$row['secondord']?>" autocomplete="off">
</td>
<td class="text-center fs-6 fw-bold" style="width:150px;">입고 단가</td>
<td class="text-center">
<input type="text" class="form-control fs-6" id="unitprice" name="unitprice" value="<?=$row['unitprice']?>" autocomplete="off" onkeyup="inputNumberFormat(this)">
</td>
</tr>
<tr>
<td class="text-center fs-6 fw-bold" style="width:150px;">수량</td>
<td class="text-center">
<input type="text" class="form-control fs-6" id="surang" name="surang" value="<?=$row['surang']?>" autocomplete="off" onkeyup="inputNumberFormat(this)">
</td>
<td class="text-center fs-6 fw-bold" style="width:150px;">로트번호</td>
<td class="text-center">
<div class="specialinputWrap">
<input type="text" class="form-control inputlot fs-6" id="lotnum" name="lotnum" value="<?=$row['lotnum']?>" autocomplete="off">
</div>
</td>
</tr>
<tr>
<td class="text-center fs-6 fw-bold" style="width:150px;">비고</td>
<td class="text-center" colspan="3">
<input type="text" class="form-control fs-6" id="comment" name="comment" value="<?=$row['comment']?>" autocomplete="off">
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,255 @@
<?php
require_once($_SERVER['DOCUMENT_ROOT'] . "/session.php");
$prodcode = isset($_POST['prodcode']) ? $_POST['prodcode'] : '';
$itemname = isset($_POST['itemname']) ? $_POST['itemname'] : '';
$spec = isset($_POST['spec']) ? $_POST['spec'] : '';
$remarks = isset($_POST['remarks']) ? $_POST['remarks'] : '';
$fromdate = isset($_POST['fromdate']) ? $_POST['fromdate'] : '';
$todate = isset($_POST['todate']) ? $_POST['todate'] : '';
require_once($_SERVER['DOCUMENT_ROOT'] . "/lib/mydb.php");
$pdo = db_connect();
$title_message = '수불내역 상세';
// 입고 내역 조회
$in_sql = "SELECT
lot_no,
inspection_date,
supplier,
received_qty,
unit,
material_no,
manufacturer,
remarks,
purchase_price_excl_vat,
weight_kg
FROM {$DB}.instock
WHERE prodcode = ?
AND inspection_date BETWEEN date(?) AND date(?)
AND is_deleted IS NULL
ORDER BY inspection_date DESC";
// 사용 내역 조회 (usage 테이블이 있을 경우 사용, 없으면 빈 배열)
$out_records = array();
try {
// usage 테이블 존재 여부 확인
$check_table_sql = "SHOW TABLES LIKE '{$DB}.usage'";
$check_stmh = $pdo->query($check_table_sql);
if ($check_stmh->rowCount() > 0) {
// usage 테이블이 존재하는 경우
$out_sql = "SELECT
usage_date,
usage_qty,
unit,
usage_reason,
remarks
FROM {$DB}.usage
WHERE prodcode = ?
AND usage_date BETWEEN date(?) AND date(?)
AND is_deleted IS NULL
ORDER BY usage_date DESC";
$out_stmh = $pdo->prepare($out_sql);
$out_stmh->bindValue(1, $prodcode, PDO::PARAM_STR);
$out_stmh->bindValue(2, $fromdate, PDO::PARAM_STR);
$out_stmh->bindValue(3, $todate, PDO::PARAM_STR);
$out_stmh->execute();
$out_records = $out_stmh->fetchAll(PDO::FETCH_ASSOC);
}
// 입고 내역 조회
$in_stmh = $pdo->prepare($in_sql);
$in_stmh->bindValue(1, $prodcode, PDO::PARAM_STR);
$in_stmh->bindValue(2, $fromdate, PDO::PARAM_STR);
$in_stmh->bindValue(3, $todate, PDO::PARAM_STR);
$in_stmh->execute();
$in_records = $in_stmh->fetchAll(PDO::FETCH_ASSOC);
} catch (PDOException $e) {
echo "오류: " . $e->getMessage();
exit;
}
?>
<div class="container-fluid">
<div class="d-flex align-items-center justify-content-center">
<div class="card justify-content-center" style="width: 100%;">
<div class="card-header text-center">
<span class="text-center fs-5 me-3"><?=$title_message?></span>
<button type="button" id="closeBtn" class="btn btn-secondary btn-sm float-end me-2">닫기</button>
<button type="button" class="close float-end" style="background: none; border: none; font-size: 1.5rem; color: #000;">&times;</button>
</div>
<div class="card-body">
<!-- 품목 정보 -->
<div class="row mb-3">
<div class="col-12">
<div class="alert alert-info">
<strong>품목코드:</strong> <?= htmlspecialchars($prodcode) ?> |
<strong>품목명:</strong> <?= htmlspecialchars($itemname) ?> |
<strong>규격:</strong> <?= htmlspecialchars($spec) ?> |
<strong>비고:</strong> <?= htmlspecialchars($remarks) ?>
</div>
</div>
</div>
<div class="row">
<!-- 입고 내역 -->
<div class="col-md-6">
<div class="card">
<div class="card-header bg-success text-white">
<h6 class="mb-0">입고 내역 (<?= count($in_records) ?>건)</h6>
</div>
<div class="card-body" style="max-height: 400px; overflow-y: auto;">
<?php if (count($in_records) > 0): ?>
<table class="table table-sm table-striped">
<thead class="table-light">
<tr>
<th>로트번호</th>
<th>입고일</th>
<th>업체</th>
<th>수량</th>
<th>단위</th>
</tr>
</thead>
<tbody>
<?php foreach ($in_records as $record): ?>
<tr>
<td class="fw-bold text-primary"><?= htmlspecialchars($record['lot_no']) ?></td>
<td><?= htmlspecialchars($record['inspection_date']) ?></td>
<td><?= htmlspecialchars($record['supplier']) ?></td>
<td class="text-end fw-bold text-success">
<?php if (is_numeric($record['received_qty'])) : ?>
<?= number_format($record['received_qty']) ?>
<?php else : ?>
<?= htmlspecialchars($record['received_qty']) ?>
<?php endif; ?>
</td>
<td><?= htmlspecialchars($record['unit']) ?></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<?php else: ?>
<div class="text-center text-muted">
<p>입고 내역이 없습니다.</p>
</div>
<?php endif; ?>
</div>
</div>
</div>
<!-- 사용 내역 -->
<div class="col-md-6">
<div class="card">
<div class="card-header bg-danger text-white">
<h6 class="mb-0">사용 내역 (<?= count($out_records) ?>건)</h6>
</div>
<div class="card-body" style="max-height: 400px; overflow-y: auto;">
<?php if (count($out_records) > 0): ?>
<table class="table table-sm table-striped">
<thead class="table-light">
<tr>
<th>사용일</th>
<th>사용량</th>
<th>단위</th>
<th>사용사유</th>
<th>비고</th>
</tr>
</thead>
<tbody>
<?php foreach ($out_records as $record): ?>
<tr>
<td><?= htmlspecialchars($record['usage_date']) ?></td>
<td class="text-end fw-bold text-danger">
<?php if (is_numeric($record['usage_qty'])) : ?>
<?= number_format($record['usage_qty']) ?>
<?php else : ?>
<?= htmlspecialchars($record['usage_qty']) ?>
<?php endif; ?>
</td>
<td><?= htmlspecialchars($record['unit']) ?></td>
<td><?= htmlspecialchars($record['usage_reason']) ?></td>
<td><?= htmlspecialchars($record['remarks']) ?></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<?php else: ?>
<div class="text-center text-muted">
<p>사용 내역이 없습니다.<br><small>(사용량 테이블이 설정되지 않았거나 해당 기간에 사용 내역이 없습니다.)</small></p>
</div>
<?php endif; ?>
</div>
</div>
</div>
</div>
<!-- 요약 정보 -->
<div class="row mt-3">
<div class="col-12">
<div class="card">
<div class="card-header bg-primary text-white">
<h6 class="mb-0">재고 요약</h6>
</div>
<div class="card-body">
<div class="row">
<div class="col-md-3">
<div class="text-center">
<h5 class="text-success">총 입고량</h5>
<h4 class="text-success">
<?php
$total_in = 0;
foreach ($in_records as $record) {
if (is_numeric($record['received_qty'])) {
$total_in += $record['received_qty'];
}
}
echo number_format($total_in);
?>
</h4>
</div>
</div>
<div class="col-md-3">
<div class="text-center">
<h5 class="text-danger">총 사용량</h5>
<h4 class="text-danger">
<?php
$total_out = 0;
foreach ($out_records as $record) {
if (is_numeric($record['usage_qty'])) {
$total_out += $record['usage_qty'];
}
}
echo number_format($total_out);
?>
</h4>
</div>
</div>
<div class="col-md-3">
<div class="text-center">
<h5 class="text-primary">현재 재고</h5>
<h4 class="text-primary">
<?= number_format($total_in - $total_out) ?>
</h4>
</div>
</div>
<div class="col-md-3">
<div class="text-center">
<h5 class="text-info">조회기간</h5>
<h6 class="text-info">
<?= $fromdate ?> ~ <?= $todate ?>
</h6>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,455 @@
<!-- 모달창 -->
<div class="modal fade" id="supplierModal" tabindex="-1" aria-labelledby="supplierModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="supplierModalLabel"> 납품업체 추가</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<label for="newSupplierInput" class="form-label">납품업체 이름:</label>
<input type="text" id="newSupplierInput" class="form-control">
</div>
<div class="modal-footer">
<button type="button" id="addSupplierBtn" class="btn btn-dark">추가</button>
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">취소</button>
</div>
</div>
</div>
</div>
<!-- 제조사 모달창 -->
<div class="modal fade" id="manufacturerModal" tabindex="-1" aria-labelledby="manufacturerModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="manufacturerModalLabel"> 제조사 추가</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<label for="newManufacturerInput" class="form-label">제조사 이름:</label>
<input type="text" id="newManufacturerInput" class="form-control">
</div>
<div class="modal-footer">
<button type="button" id="addManufacturerBtn" class="btn btn-dark">추가</button>
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">취소</button>
</div>
</div>
</div>
</div>
<!-- 단위 모달창 -->
<div class="modal fade" id="unitModal" tabindex="-1" aria-labelledby="unitModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="unitModalLabel"> 단위 추가</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<label for="newUnitInput" class="form-label">단위 이름:</label>
<input type="text" id="newUnitInput" class="form-control">
</div>
<div class="modal-footer">
<button type="button" id="addUnitBtn" class="btn btn-dark">추가</button>
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">취소</button>
</div>
</div>
</div>
</div>
<?php
require_once($_SERVER['DOCUMENT_ROOT'] . "/session.php");
$mode = isset($_POST['mode']) ? $_POST['mode'] : '';
$num = isset($_POST['num']) ? $_POST['num'] : '';
$tablename = 'instock';
require_once($_SERVER['DOCUMENT_ROOT'] . "/lib/mydb.php");
$pdo = db_connect();
// `instock` 테이블에서 `item_name` 컬럼 값 가져오기
$sql = "SELECT item_name FROM {$DB}.{$tablename} WHERE is_deleted IS NULL";
try {
$stmh = $pdo->query($sql);
$itemNames = $stmh->fetchAll(PDO::FETCH_COLUMN, 0); // item_name 컬럼의 값을 배열로 저장
// 공백 및 엔터, 탭 제거
$cleanedItemNames = array_map(function($name) {
// 모든 공백, 탭, 줄 바꿈 제거
return preg_replace('/\s+/', '', $name);
}, $itemNames);
// 중복 제거
$uniqueItemNames = array_unique($cleanedItemNames);
// 공백으로만 구성된 요소 제거
$uniqueItemNames = array_filter($uniqueItemNames, function($name) {
return trim($name) !== '';
});
$uniqueItemNames = array_filter($uniqueItemNames, function($name) {
return trim($name) !== ' '; // 전각문자 일반 공백: ' ' 전각 공백: ' ' (유니코드 U+3000) 이 차이로 오류가 난것임
});
// 한글, 영문 오름차순 정렬
usort($uniqueItemNames, function($a, $b) {
return strcoll($a, $b); // strcoll을 사용해 로케일에 따른 오름차순 정렬
});
// 결과 출력 (예: 배열 확인용)
// print_r($uniqueItemNames);
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
// `instock` 테이블에서 `supplier` 컬럼 값 가져오기
$sql = "SELECT supplier FROM {$DB}.{$tablename} WHERE is_deleted IS NULL";
try {
$stmh = $pdo->query($sql);
$supplierNames = $stmh->fetchAll(PDO::FETCH_COLUMN, 0); // supplier 컬럼의 값을 배열로 저장
// 공백 및 엔터, 탭 제거
$cleanedSupplierNames = array_map(function($name) {
return preg_replace('/\s+/', '', $name);
}, $supplierNames);
// 중복 제거
$uniqueSupplierNames = array_unique($cleanedSupplierNames);
// 공백으로만 구성된 요소 제거
$uniqueSupplierNames = array_filter($uniqueSupplierNames, function($name) {
return trim($name) !== '' && trim($name) !== ' ';
});
// 한글, 영문 오름차순 정렬
usort($uniqueSupplierNames, function($a, $b) {
return strcoll($a, $b); // 로케일에 따른 오름차순 정렬
});
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
// `instock` 테이블에서 `manufacturer` 컬럼 값 가져오기
$sql = "SELECT manufacturer FROM {$DB}.{$tablename} WHERE is_deleted IS NULL";
try {
$stmh = $pdo->query($sql);
$manufacturerNames = $stmh->fetchAll(PDO::FETCH_COLUMN, 0); // manufacturer 컬럼의 값을 배열로 저장
// 공백 및 엔터, 탭 제거
$cleanedManufacturerNames = array_map(function($name) {
return preg_replace('/\s+/', '', $name); // 공백 제거
}, $manufacturerNames);
// 중복 제거
$uniqueManufacturerNames = array_unique($cleanedManufacturerNames);
// 공백으로만 구성된 요소 제거
$uniqueManufacturerNames = array_filter($uniqueManufacturerNames, function($name) {
return trim($name) !== '' && trim($name) !== ' '; // 전각 공백도 제거
});
// 한글, 영문 오름차순 정렬
usort($uniqueManufacturerNames, function($a, $b) {
return strcoll($a, $b); // 로케일에 따른 정렬
});
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
// `instock` 테이블에서 `unit` 컬럼 값 가져오기
$sql = "SELECT unit FROM {$DB}.{$tablename} WHERE is_deleted IS NULL";
try {
$stmh = $pdo->query($sql);
$unitNames = $stmh->fetchAll(PDO::FETCH_COLUMN, 0); // unit 컬럼의 값을 배열로 저장
// 공백 및 엔터, 탭 제거
$cleanedUnitNames = array_map(function($name) {
return preg_replace('/\s+/', '', $name); // 공백 제거
}, $unitNames);
// 중복 제거
$uniqueUnitNames = array_unique($cleanedUnitNames);
// 공백으로만 구성된 요소 제거
$uniqueUnitNames = array_filter($uniqueUnitNames, function($name) {
return trim($name) !== '' && trim($name) !== ' '; // 전각 공백도 제거
});
// 한글, 영문 오름차순 정렬
usort($uniqueUnitNames, function($a, $b) {
return strcoll($a, $b); // 로케일에 따른 정렬
});
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
if ($mode === 'update' && $num) {
try {
$sql = "SELECT * FROM ". $DB . "." . $tablename . " WHERE num=?";
$stmh = $pdo->prepare($sql);
$stmh->bindValue(1, $num, PDO::PARAM_INT);
$stmh->execute();
$row = $stmh->fetch(PDO::FETCH_ASSOC);
include '_row.php';
} catch (PDOException $Exception) {
echo "오류: ".$Exception->getMessage();
exit;
}
} else if ($mode === 'copy' && $num) {
try {
$sql = "SELECT * FROM ". $DB . "." . $tablename . " WHERE num=?";
$stmh = $pdo->prepare($sql);
$stmh->bindValue(1, $num, PDO::PARAM_INT);
$stmh->execute();
$row = $stmh->fetch(PDO::FETCH_ASSOC);
include '_row.php';
$num = ''; //copy일때는 $num 초기화
} catch (PDOException $Exception) {
echo "오류: ".$Exception->getMessage();
exit;
}
} else {
include '_request.php';
$mode = 'insert';
$inspection_date = date('Y-m-d');
// $lot_no = date('ymd') . '-'; // 현재 날짜를 "년도(2자리)+월+일" 형식으로 생성 후 '-' 추가
$currentDate = date('ymd'); // 예: 240926
$filepath = $_SERVER['DOCUMENT_ROOT'] . '/instock/lotnum.txt';
// 파일이 존재하지 않으면 새로 생성
if (!file_exists($filepath)) {
$lot_no = $currentDate . '-01';
} else {
// 파일에서 이전 로트번호 읽기
$lastLotNumber = file_get_contents($filepath);
list($date, $number) = explode('-', $lastLotNumber);
// 날짜가 같으면 번호를 증가, 다르면 01로 초기화
if ($date === $currentDate) {
$newNumber = str_pad((int)$number + 1, 2, '0', STR_PAD_LEFT);
$lot_no = $currentDate . '-' . $newNumber;
} else {
$lot_no = $currentDate . '-01';
}
}
// 로트번호 갱신 서버저장은 저장버튼 클릭시 시작
// file_put_contents($filepath, $lot_no);
}
// `instock` 테이블에서 `specification` 컬럼 값 가져오기
$sql = "SELECT specification FROM {$DB}.{$tablename} WHERE item_name = ? AND is_deleted IS NULL";
try {
$stmh = $pdo->prepare($sql);
$stmh->execute([$item_name]);
$specificationNames = $stmh->fetchAll(PDO::FETCH_COLUMN, 0); // specification 컬럼의 값을 배열로 저장
// 공백 및 엔터, 탭 제거
$cleanedspecificationNames = array_map(function($name) {
return preg_replace('/\s+/', '', $name); // 공백 제거
}, $specificationNames);
// $cleanedspecificationNames = array_map(function ($spec) {
// return str_replace(["\r\n", "\r", "\n"], '', $spec);
// }, $cleanedspecificationNames);
// 중복 제거
$uniquespecificationNames = array_unique($cleanedspecificationNames);
// 공백으로만 구성된 요소 제거
$uniquespecificationNames = array_filter($uniquespecificationNames, function($name) {
return trim($name) !== '' && trim($name) !== ' '; // 전각 공백도 제거
});
// 한글, 영문 오름차순 정렬
usort($uniquespecificationNames, function($a, $b) {
return strcoll($a, $b); // 로케일에 따른 정렬
});
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
$title_message = ($mode === 'update') ? '수입검사 수정' : '수입검사 신규 등록';
$specification_clean = preg_replace('/(\s+|<br>|<br\/>|<br \/>|\r\n|\r|\n)/', ' ', $specification);
$remarks_clean = preg_replace('/(\s+|<br>|<br\/>|<br \/>|\r\n|\r|\n)/', ' ', $remarks);
$item_name_clean = preg_replace('/(\s+|<br>|<br\/>|<br \/>|\r\n|\r|\n)/', ' ', $item_name);
?>
<input type="hidden" id="update_log" name="update_log" value="<?=$update_log?>">
<div class="container-fluid">
<div class="d-flex align-items-center justify-content-center">
<div class="card justify-content-center">
<div class="card-header text-center">
<span class="text-center fs-5 ms-2 me-4"><?=$title_message?></span>
<?php if ($mode === 'update'): ?>
<button type="button" id="viewinspection" class="btn btn-dark btn-sm me-3"
data-num="<?= htmlspecialchars($num) ?>"
data-specification="<?= htmlspecialchars($specification_clean) ?>"
data-remarks="<?= htmlspecialchars($remarks_clean) ?>"
data-itemname="<?= htmlspecialchars($item_name_clean) ?>" >
<i class="bi bi-list"></i> 수입검사서
</button>
<?php endif; ?>
</div>
<div class="card-body">
<div class="row justify-content-center text-center">
<div class="d-flex align-items-center justify-content-center m-2">
<table class="table table-bordered table-hover">
<tbody>
<tr>
<td class="text-center fs-6 fw-bold" style="width:150px;">로트번호</td>
<td class="text-center" style="width:200px;">
<input type="text" class="form-control fs-6 noborder-input" id="lot_no" name="lot_no" value="<?=$lot_no?>" autocomplete="off" required >
</td>
<td class="text-center fs-6 fw-bold" style="width:150px;">검사일</td>
<td class="text-center" style="width:200px;">
<input type="date" class="form-control fs-6 noborder-input" id="inspection_date" name="inspection_date" value="<?=$inspection_date?>" required >
</td>
</tr>
<tr>
<td class="text-center fs-6 fw-bold" style="width:150px;">납품업체</td>
<!-- 납품업체 선택 -->
<td class="text-center" style="width:200px;">
<select class="form-control fs-6 noborder-input" id="supplier" name="supplier" required >
<option value="">선택</option>
<?php
foreach ($uniqueSupplierNames as $name) {
$selected = (isset($supplier) && $supplier === $name) ? 'selected' : '';
echo "<option value=\"$name\" $selected>$name</option>";
}
?>
<option value="direct" class='text-danger'>직접입력</option> <!-- 직접입력 옵션 -->
</select>
</td>
<td class="text-center fs-6 fw-bold" style="width:150px;">품명</td>
<td class="text-center" style="width:200px;">
<select class="form-control fs-6 noborder-input" id="item_name" name="item_name" required >
<option value="">선택</option> <!-- 기본값: 선택 -->
<?php
foreach ($uniqueItemNames as $name) {
// 기본적으로 선택된 옵션이 있는 경우, `selected` 속성 추가
$selected = (isset($item_name) && $item_name === $name) ? 'selected' : '';
echo "<option value=\"$name\" $selected>$name</option>";
}
?>
</select>
</td>
</tr>
<tr>
<td class="text-center fs-6 fw-bold" style="width:150px;">규격</td>
<td class="text-center" style="width:200px;">
<select class="form-control fs-6 noborder-input" id="specification" name="specification" required >
<option value="">선택</option> <!-- 기본값: 선택 -->
<?php
foreach ($uniquespecificationNames as $name) {
$selected = (isset($specification) && $specification === $name) ? 'selected' : '';
echo "<option value=\"$name\" $selected>$name</option>";
}
?>
</td>
<td class="text-center fs-6 fw-bold" style="width:150px;">단위</td>
<td class="text-center" style="width:200px;">
<select class="form-control fs-6 noborder-input" id="unit" name="unit">
<option value="">선택</option>
<?php
foreach ($uniqueUnitNames as $name) {
// 기존 값이 있으면 선택
$selected = (isset($unit) && $unit === $name) ? 'selected' : '';
echo "<option value=\"$name\" $selected>$name</option>";
}
?>
<option value="direct" class='text-danger'>직접입력</option> <!-- 직접입력 옵션 -->
</select>
</td>
</tr>
<tr>
<td class="text-center fs-6 fw-bold" style="width:150px;">품목코드</td>
<td class="text-center" colspan="3" >
<input type="text" class="form-control fs-6 noborder-input" id="prodcode" name="prodcode" value="<?=$prodcode?>" autocomplete="off" required >
</td>
</tr>
<tr>
<td class="text-center fs-6 fw-bold" style="width:150px;">입고량</td>
<td class="text-center" style="width:200px;">
<input type="text" class="form-control text-center fs-6 noborder-input" id="received_qty" name="received_qty" value="<?=$received_qty?>" autocomplete="off" onkeyup="inputNumberFormat(this)" required >
</td>
<td class="text-center fs-6 fw-bold" style="width:150px;">자재번호</td>
<td class="text-center" style="width:200px;">
<input type="text" class="form-control fs-6 noborder-input" id="material_no" name="material_no" value="<?=$material_no?>" autocomplete="off">
</td>
</tr>
<tr>
<td class="text-center fs-6 fw-bold" style="width:150px;">제조사</td>
<td class="text-center" style="width:200px;">
<select class="form-control fs-6 noborder-input" id="manufacturer" name="manufacturer" required >
<option value="">선택</option>
<?php
foreach ($uniqueManufacturerNames as $name) {
// 기본적으로 선택된 옵션이 있는 경우, `selected` 속성 추가
$selected = (isset($manufacturer) && $manufacturer === $name) ? 'selected' : '';
echo "<option value=\"$name\" $selected>$name</option>";
}
?>
<option value="direct" class='text-danger'>직접입력</option> <!-- 직접입력 옵션 -->
</select>
</td>
<td class="text-center fs-6 fw-bold" style="width:150px;">소진여부</td>
<td class="text-center" style="width:200px;">
<input type="text" class="form-control text-center fs-6 noborder-input" id="lotDone" name="lotDone" value="<?=$lotDone?>" autocomplete="off">
</td>
</tr>
<tr>
<td class="text-center fs-6 fw-bold" style="width:150px;">매입가(VAT 별도)</td>
<td class="text-center" style="width:200px;">
<input type="text" class="form-control text-center fs-6 noborder-input"
id="purchase_price_excl_vat" name="purchase_price_excl_vat"
value="<?= isset($purchase_price_excl_vat) && is_numeric($purchase_price_excl_vat) ? number_format($purchase_price_excl_vat) : '' ?>"
autocomplete="off" onkeyup="inputNumberFormat(this)">
</td>
<td class="text-center fs-6 fw-bold" style="width:150px;">중량(kg)</td>
<td class="text-center" style="width:200px;">
<input type="text" class="form-control text-center fs-6 noborder-input"
id="weight_kg" name="weight_kg"
value="<?= isset($weight_kg) && is_numeric($weight_kg) ? number_format($weight_kg) : '' ?>"
autocomplete="off" onkeyup="inputNumberFormat(this)">
</td>
</tr>
<tr>
</td>
<td class="text-center fs-6 fw-bold" style="width:150px;">비고</td>
<td colspan="3" class="text-center" >
<input type="text" class="form-control fs-6 noborder-input text-start" id="remarks" name="remarks" value="<?=$remarks?>" autocomplete="off">
</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="d-flex justify-content-center">
<button type="button" id="saveBtn" class="btn btn-dark btn-sm me-3">
<i class="bi bi-floppy-fill"></i> 저장
</button>
<?php if($mode != 'insert') { ?>
<button type="button" id="copyBtn" class="btn btn-primary btn-sm me-3">
<i class="bi bi-copy"></i> 복사
</button>
<button type="button" id="deleteBtn" class="btn btn-danger btn-sm me-3">
<i class="bi bi-trash"></i> 삭제
</button>
<?php } ?>
<button type="button" id="closeBtn" class="btn btn-outline-dark btn-sm me-2">
&times; 닫기
</button>
</div>
</div>
</div>
</div>
</div>

24
instock/fetch_lotnum.php Normal file
View File

@@ -0,0 +1,24 @@
<?php
require_once($_SERVER['DOCUMENT_ROOT'] . "/session.php");
header("Content-Type: application/json"); // JSON 형식으로 응답하기 위해 설정
require_once($_SERVER['DOCUMENT_ROOT'] . "/lib/mydb.php");
$pdo = db_connect();
$sql = "SELECT lotnum FROM $DB.material_lot WHERE is_deleted IS NULL ORDER BY registedate DESC";
try {
$stmh = $pdo->query($sql);
$lotnums = [];
while ($row = $stmh->fetch(PDO::FETCH_ASSOC)) {
$lotnums[] = $row['lotnum'];
}
$lotnums[] = '초기로트' ;
echo json_encode(['lotnums' => $lotnums], JSON_UNESCAPED_UNICODE);
} catch (PDOException $Exception) {
echo json_encode(['error' => $Exception->getMessage()], JSON_UNESCAPED_UNICODE);
}
?>

282
instock/fileManager.js Normal file
View File

@@ -0,0 +1,282 @@
// // 이미지 선택 이벤트 처리
// $("#upfileimage").change(function (e) {
// processFiles(this.files, tablename, "image", "upfileimage");
// });
// 파일 업로드 및 처리 함수
function processFiles(files, tablename, item, upfilename) {
var num = $("#num").val();
if (!files || files.length === 0) {
console.warn("파일이 선택되지 않았습니다.");
return;
}
showMsgModal(3); // 파일처리중
const formData = new FormData();
for (const file of files) {
formData.append(upfilename + "[]", file);
}
// 추가 데이터 설정
formData.append("tablename", tablename);
formData.append("item", item);
formData.append("upfilename", upfilename);
formData.append("folderPath", "uploads");
formData.append("DBtable", "picuploads");
formData.append("num", num);
// AJAX 요청
$.ajax({
url: "/filedrive/fileprocess.php",
type: "POST",
enctype: "multipart/form-data",
processData: false,
contentType: false,
data: formData,
success: function (response) {
console.log("응답 데이터:", response);
let successCount = 0;
let errorCount = 0;
let errorMessages = [];
response.forEach((item) => {
if (item.status === "success") {
successCount++;
} else if (item.status === "error") {
errorCount++;
errorMessages.push(`파일: ${item.file}, 메시지: ${item.message}`);
}
});
if (successCount > 0) {
Toastify({
text: `${successCount}개의 파일이 성공적으로 업로드되었습니다.`,
duration: 2000,
close: true,
gravity: "top",
position: "center",
backgroundColor: "#4fbe87",
}).showToast();
}
if (errorCount > 0) {
Toastify({
text: `오류 발생: ${errorCount}개의 파일 업로드 실패\n상세 오류: ${errorMessages.join("\n")}`,
duration: 5000,
close: true,
gravity: "top",
position: "center",
backgroundColor: "#f44336",
}).showToast();
}
setTimeout(function () {
hideMsgModal();
if (item === "attached") displayFile();
if (item === "image") displayImage();
}, 1000);
},
error: function (jqxhr, status, error) {
console.error("업로드 실패:", jqxhr, status, error);
},
});
}
// 파일 불러오기
function displayFile() {
fetchFiles(tablename, "attached", "#displayFile");
}
// 이미지 불러오기
function displayImage() {
fetchFiles(tablename, "image", "#displayImage");
}
// 파일/이미지 데이터 가져오기
function fetchFiles(tablename, item, targetSelector) {
var tablename = $("#tablename").val();
const params = $("#num").val();
if (!params) {
console.error("ID 값이 없습니다. 데이터를 불러올 수 없습니다.");
return;
}
$.ajax({
url: "/filedrive/fileprocess.php",
type: "GET",
data: { num: params, tablename: tablename, item: item, folderPath: "uploads" },
dataType: "json",
success: function (data) {
console.log("데이터:", data);
$(targetSelector).html(""); // 기존 내용 초기화
if (Array.isArray(data) && data.length > 0) {
data.forEach(function (fileData, index) {
const realName = fileData.realname || "다운로드 파일";
const link = fileData.link || "#";
const fileId = fileData.fileId || null;
if (!fileId) {
console.error("fileId가 누락되었습니다. index: " + index, fileData);
$(targetSelector).append(
"<div class='text-danger'>파일 ID가 누락되었습니다.</div>"
);
return;
}
$(targetSelector).append(
"<div class='row mt-1 mb-2'>" +
"<div class='d-flex align-items-center justify-content-center'>" +
"<span id='file" + index + "'>" +
"<a href='#' onclick=\"popupCenter('" + link + "', 'filePopup', 800, 600); return false;\">" + realName + "</a>" +
"</span> &nbsp;&nbsp;" +
"<button type='button' class='btn btn-danger btn-sm' id='delFile" + index + "' onclick=\"deleteFile('" + index + "', '" + fileId + "', '" + tablename + "', '" + item + "')\">" +
"<ion-icon name='trash-outline'></ion-icon>" +
"</button>" +
"</div>" +
"</div>"
);
});
} else {
$(targetSelector).append(
""
);
}
},
error: function (error) {
console.error("파일 불러오기 오류:", error);
},
});
}
function displayFileLoad() {
const data = <?php echo json_encode($savefilename_arr); ?>; // PHP에서 전달된 파일 배열
var tablename = $("#tablename").val();
$("#displayFile").html(""); // 기존 내용 초기화
if (Array.isArray(data) && data.length > 0) {
data.forEach(function (fileData, index) {
const realName = fileData.realname || "다운로드 파일";
const link = fileData.link || "#";
const fileId = fileData.fileId || null;
if (!fileId) {
console.error("fileId가 누락되었습니다. index: " + index, fileData);
$("#displayFile").append(
"<div class='text-danger'>파일 ID가 누락되었습니다.</div>"
);
return;
}
$("#displayFile").append(
"<div class='row mt-1 mb-2'>" +
"<div class='d-flex align-items-center justify-content-center'>" +
"<span id='file" + index + "'>" +
"<a href='#' onclick=\"popupCenter('" + link + "', 'filePopup', 800, 600); return false;\">" + realName + "</a>" +
"</span> &nbsp;&nbsp;" +
"<button type='button' class='btn btn-danger btn-sm' id='delFile" + index + "' onclick=\"deleteFile('" + index + "', '" + fileId + "', '" + tablename + "', 'attached')\">" +
"<ion-icon name='trash-outline'></ion-icon>" +
"</button>" +
"</div>" +
"</div>"
);
});
} else {
$("#displayFile").append(
""
);
}
}
function deleteFile(index, fileId, tablename, item) {
Swal.fire({
title: "삭제 확인",
text: "정말 삭제하시겠습니까?",
icon: "warning",
showCancelButton: true,
confirmButtonText: "삭제",
cancelButtonText: "취소",
reverseButtons: true,
}).then((result) => {
if (result.isConfirmed) {
showMsgModal(3); // 파일 처리 중 모달 표시
$.ajax({
url: "/filedrive/fileprocess.php",
type: "DELETE",
data: JSON.stringify({
fileId: fileId,
tablename: tablename,
item: item,
folderPath: "uploads",
DBtable: "picuploads",
}),
contentType: "application/json",
dataType: "json",
success: function (response) {
hideMsgModal(); // 처리 완료 후 모달 숨기기
if (response.status === "success") {
console.log("삭제 완료:", response);
$("#file" + index).remove(); // 파일 요소 삭제
$("#delFile" + index).remove(); // 삭제 버튼 삭제
Swal.fire("삭제 완료", "파일이 성공적으로 삭제되었습니다.", "success");
} else {
Swal.fire("삭제 실패", response.message || "알 수 없는 오류가 발생했습니다.", "error");
}
},
error: function (error) {
hideMsgModal(); // 오류 발생 시 모달 숨기기
console.error("삭제 실패:", error);
Swal.fire("삭제 실패", "파일 삭제 중 문제가 발생했습니다.", "error");
},
});
}
});
}
// 기존 이미지 로드 함수
function displayImageLoad() {
const data = <?php echo json_encode($saveimagename_arr); ?>; // PHP에서 전달된 이미지 배열
var tablename = $("#tablename").val();
$("#displayImage").html(""); // 기존 내용 초기화
if (Array.isArray(data) && data.length > 0) {
data.forEach(function (fileData, index) {
const realName = fileData.realname || "다운로드 파일";
const thumbnail = fileData.thumbnail || "/assets/default-thumbnail.png";
const link = fileData.link || "#";
const fileId = fileData.fileId || null;
if (!fileId) {
console.error("fileId가 누락되었습니다. index: " + index, fileData);
$("#displayImage").append(
"<div class='text-danger'>파일 ID가 누락되었습니다.</div>"
);
return;
}
$("#displayImage").append(
"<div class='row mb-3'>" +
"<div class='d-flex align-items-center justify-content-center'>" +
"<a href='#' onclick=\"popupCenter('" + link + "', 'imagePopup', 800, 600); return false;\">" +
"<img id='image" + index + "' src='" + thumbnail + "' style='width:150px; height:auto;'>" +
"</a> &nbsp;&nbsp;" +
"<button type='button' class='btn btn-danger btn-sm' id='delImage" + index + "' onclick=\"deleteFile('" + index + "', '" + fileId + "', '" + tablename + "', 'image')\">" +
"<ion-icon name='trash-outline'></ion-icon>" +
"</button>" +
"</div>" +
"</div>"
);
});
} else {
$("#displayImage").append(
""
);
}
}

View File

@@ -0,0 +1,43 @@
<?php
require_once($_SERVER['DOCUMENT_ROOT'] . "/lib/mydb.php");
$pdo = db_connect();
// 날짜 기본값 설정 (최근 1개월)
$currentDate = date("Y-m-t"); // 말일 기준
// $defaultFromDate = date("Y-m-d", strtotime("-1 month"));
$defaultFromDate = date("Y-m-01");
$fromdate = isset($_REQUEST['fromdate']) && $_REQUEST['fromdate'] ? $_REQUEST['fromdate'] : $defaultFromDate;
$todate = isset($_REQUEST['todate']) && $_REQUEST['todate'] ? $_REQUEST['todate'] : $currentDate;
$tablename = 'instock';
try {
// instock 테이블에서 검사일(inspection_date) 기준, 납품업체별로 매입가(VAT별도)의 합계를 구하고,
// 합계가 0인 업체는 제외(HAVING 절 사용)
$sql = "SELECT supplier, SUM(purchase_price_excl_vat) as total_amount
FROM {$DB}.{$tablename}
WHERE inspection_date BETWEEN :fromdate AND :todate
AND is_deleted IS NULL
GROUP BY supplier
HAVING SUM(purchase_price_excl_vat) > 0
ORDER BY total_amount DESC";
$stmh = $pdo->prepare($sql);
$stmh->bindValue(':fromdate', $fromdate);
$stmh->bindValue(':todate', $todate);
$stmh->execute();
$rows = $stmh->fetchAll(PDO::FETCH_ASSOC);
// 차트 데이터 생성 (Highcharts용)
$chartData = [];
foreach ($rows as $row) {
$chartData[] = [
"name" => $row['supplier'],
"y" => (float)$row['total_amount']
];
}
$jsonChartData = json_encode($chartData, JSON_UNESCAPED_UNICODE);
} catch (PDOException $Exception) {
die("오류: " . $Exception->getMessage());
}
?>

1031
instock/i_EGI155.php Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,917 @@
<?php
$tablename = 'instock';
?>
<?php include $_SERVER['DOCUMENT_ROOT'] . '/' . $tablename . '/common/head.php' ; ?> <!-- head 정보 불러오기 -->
<?php
$itemTitle = ' 내화충진재 <br> ' . $spec ;
$spec = "6 * 610";
// 최종 결과 출력
$thickness = 6;
$width = 610;
$today = date("Y-m-d");
require_once $_SERVER['DOCUMENT_ROOT'] . '/instock/commonDriveLoad.php'; // 구글드라이브 파일형태 이미지형태 읽어오기 모듈
$savetitle ='수입검사성적서';
?>
<?php include $_SERVER['DOCUMENT_ROOT'] . '/' . $tablename . '/common/instock_btn.php'; ?> <!-- Btn 정보 불러오기 -->
<div id="content-to-print">
<br>
<div class="container mt-3">
<div class="d-flex align-items-center justify-content-center m-1">
<table class="table " style="border-collapse: collapse;">
<thead>
<tr>
<th rowspan="3" class="text-center" style="width:70%;">
<div class="row">
<div class="col-sm-2">
<img src="../img/kdlogo.png" alt="경동기업" class="me-1" style="width:100%; height:auto;">
</div>
<div class="col-sm-10">
<div class="d-flex align-items-center justify-content-center m-1">
<span class="text-dark ms-1 me-1 fs-2" > &nbsp; 수 </span>
<span class="text-dark me-1 fs-2" > &nbsp; 입 </span>
<span class="text-dark me-1 fs-2" > &nbsp; 검 </span>
<span class="text-dark me-1 fs-2" > &nbsp; 사 </span>
<span class="text-dark me-1 fs-2" > &nbsp; </span>
<span class="text-dark me-1 fs-2" > &nbsp; 성 </span>
<span class="text-dark me-1 fs-2" > &nbsp; 적 </span>
<span class="text-dark me-1 fs-2" > &nbsp; 서 </span>
</div>
</div>
</div>
</th>
<th rowspan="3" class="text-center fw-bold" style="height:100px;">결 재</th>
<th class="text-center p-1" style="width : 100px; height:22px; padding:2px;">담당</th>
<th class="text-center p-1" style="width : 100px; height:22px; padding:2px;">부서장</th>
</tr>
<tr style="height:40px;">
<th class="text-center">
<div id="chargedDiv" style="display: none;">
<span id="orderman"> <?=$orderman?> </span> <br> <?=$indateStr ?>
</div>
</th>
<th class="text-center">
<div id="approvalDiv" style="display: none;">
<?=$user_name?> <br> <?=$todayStr ?>
</div>
</th>
</tr>
<tr>
<th colspan="2"> 입고일자 : <?=$inspection_date?></th>
</tr>
</thead>
</table>
</div>
<div class="d-flex align-items-center justify-content-center m-1">
<table class="table table-bordered" style="border-collapse: collapse;">
<tbody>
<tr>
<td class="text-center align-middle lightgray">품 명</td>
<td colspan="2" class="text-center fw-bold"><?=$itemTitle?></td>
<td class="text-center align-middle lightgray">납품업체<br>제조업체</td>
<td class="text-center text-primary fw-bold"><?=$supplier?> <br> (<?=$manufacturer?>) </td>
</tr>
<tr>
<td class="text-center align-middle lightgray">규 격<br>(두께*너비) </td>
<td colspan="2" class="text-center fw-bold"><?=$spec?></td>
<td class="text-center align-middle lightgray">로트번호</td>
<td colspan="1" class="text-center text-primary fw-bold">
<?=$lot_no?>
</td>
</tr>
<tr>
<td class="text-center align-middle lightgray">자재번호</td>
<td colspan="2" class="text-center fw-bold"><?=$material_no?></td>
<td class="text-center align-middle lightgray">검사일자</td>
<td colspan="1" class="text-center text-primary fw-bold">
<?=$indateStr?>
</td>
</tr>
<tr>
<td class="text-center align-middle lightgray">로트크기</td>
<td class="text-center text-dark fw-bold"><?=$received_qty?> </td>
<td class="text-center text-dark fw-bold"><?=$unit?> </td>
<td class="text-center align-middle lightgray">검사자</td>
<td class="text-center">
<div class="d-flex justify-content-center">
<button type="button" id="editButton" class="btn btn-primary btn-sm">검사자</button>
<div id="inputContainer" class="text-center" style="display: none;">
<input type="text" id="userNameInput" class="form-control d-inline-block noborder-input text-center" style="width:100px;" autocomplete="off" style="widtd: 100px;" value="<?=$user_name?>">
<button type="button" id="cancelButton" class="btn btn-outline-danger btn-sm"> <i class="bi bi-x"> </i> </button>
</div>
</div>
</td>
</tr>
<script>
$(document).ready(function() {
// '담당자 입력' 버튼 클릭 시 input 표시 및 버튼 숨김
$('#editButton').on('click', function() {
$('#editButton').hide();
$('#inputContainer').show();
$('#workdate').text('<?php echo $todayStr; ?>');
$('#chargedDiv').show();
});
// '취소' 버튼 클릭 시 원래 상태로 되돌림
$('#cancelButton').on('click', function() {
$('#inputContainer').hide();
$('#chargedDiv').hide();
$('#workdate').text('');
$('#editButton').show();
});
});
</script>
</tbody>
</table>
</div>
<?php
// 두께 범위에 맞는 체크된 사각형을 표시하는 함수
function renderCheckBox($min, $max, $value) {
if ($value >= $min && $value < $max) {
return '✅'; // 체크된 사각형
} else {
return '□'; // 빈 사각형
}
}
// 길이 범위에 맞는 체크된 사각형을 표시하는 함수
function renderLengthCheckBox($min, $max, $length) {
if ($length >= $min && $length < $max) {
return '✅'; // 체크된 사각형
} else {
return '□'; // 빈 사각형
}
}
// 이하
function renderincludeCheckBox($min, $max, $length) {
if ($length > $min && $length <= $max) {
return '✅'; // 체크된 사각형
} else {
return '□'; // 빈 사각형
}
}
?>
<div class="row justify-content-start m-1 mt-2">
<table id="mainTable" class="table table-hover" style="border-collapse: collapse;">
<thead>
<tr>
<th class="text-center align-middle" rowspan="2">NO</th>
<th class="text-center align-middle" rowspan="2" colspan="2">검사항목</th>
<th class="text-center align-middle" rowspan="2" colspan="2">검사기준</th>
<th class="text-center align-middle" rowspan="2">검사방식</th>
<th class="text-center align-middle" rowspan="2">검사주기</th>
<th class="text-center align-middle" colspan="3">측정치</th>
<th class="text-center align-middle" rowspan="2">판정 <br> (적/부)</th>
</tr>
<tr>
<th class="text-center">n1 <br> 양호/불량 </th>
<th class="text-center">n2 <br> 양호/불량 </th>
<th class="text-center">n3 <br> 양호/불량 </th>
</tr>
</thead>
<tbody>
<!-- 첫 번째 행 (겉모양) -->
<tr>
<td class="text-center align-middle">1</td>
<td class="text-center align-middle" colspan="2">겉모양</td>
<td class="text-center align-middle" colspan="2">사용상 해로울 <br> 결함이 없을 것</td>
<td class="text-center align-middle">육안검사</td>
<td class="text-center align-middle" rowspan="3">n = 3 <br>c = 0</td>
<td class="text-center align-middle">
<label>
<input type="checkbox" class="check-good"> OK
</label>
<label>
<input type="checkbox" class="check-bad"> NG
</label>
</td>
<td class="text-center align-middle">
<label>
<input type="checkbox" class="check-good"> OK
</label>
<label>
<input type="checkbox" class="check-bad"> NG
</label>
</td>
<td class="text-center align-middle">
<label>
<input type="checkbox" class="check-good"> OK
</label>
<label>
<input type="checkbox" class="check-bad"> NG
</label>
</td>
<td class="text-center align-middle judgement"></td>
</tr>
<!-- 두 번째 행 (치수) -->
<tr>
<td class="text-center align-middle" rowspan="2">2</td>
<td class="text-center align-middle" rowspan="2">치수 <br> (mm) </td>
<td class="text-center align-middle" rowspan="1">
두께
<input type="text" class="form-control text-center noborder-input inputItem" id="input_thickness" name="input_thickness" value="<?=$thickness?>" autocomplete="off">
</td>
<td class="text-center align-middle" colspan="2" > (<?=$thickness?>) ± 10% </td>
<td class="text-center align-middle" rowspan="2">체크검사 <br> 줄자</td>
<td class="text-center align-middle" rowspan="1">
<input type="text" class="form-control text-center noborder-input inputItem" id="record_thickness1" name="record_thickness1" value="" autocomplete="off">
</td>
<td class="text-center align-middle" rowspan="1">
<input type="text" class="form-control text-center noborder-input inputItem" id="record_thickness2" name="record_thickness2" value="" autocomplete="off">
</td>
<td class="text-center align-middle" rowspan="1">
<input type="text" class="form-control text-center noborder-input inputItem" id="record_thickness3" name="record_thickness3" value="" autocomplete="off">
</td>
<td class="text-center align-middle judgement" rowspan="1"></td>
</tr>
<!-- 너비 검사 -->
<tr>
<td class="text-center align-middle" rowspan="1">
너비
<input type="text" class="form-control text-center noborder-input inputItem" id="input_width" name="input_width" value="<?=$width?>" autocomplete="off">
</td>
<td class="text-center align-middle" colspan="2" > (<?=$width?>) ± 5.0 </td>
<td class="text-center align-middle" rowspan="1">
<input type="text" class="form-control text-center noborder-input inputItem" id="record_width1" name="record_width1" value="" autocomplete="off">
</td>
<td class="text-center align-middle" rowspan="1">
<input type="text" class="form-control text-center noborder-input inputItem" id="record_width2" name="record_width2" value="" autocomplete="off">
</td>
<td class="text-center align-middle" rowspan="1">
<input type="text" class="form-control text-center noborder-input inputItem" id="record_width3" name="record_width3" value="" autocomplete="off">
</td>
<td class="text-center align-middle judgement" rowspan="1"></td>
</tr>
<!--SiO₂함유량 (%) -->
<tr>
<td class="text-center align-middle" rowspan="1"> 3 </td>
<td class="text-center align-middle" rowspan="1" colspan="2" >AL₂O₃함유량 (%) </td>
<td class="text-center align-middle" colspan="2"> 42 이상 </td>
<td class="text-center align-middle" rowspan="3" colspan="1"> 공급기관 <br> 성적서 </td>
<td class="text-center align-middle" rowspan="3"> 입고시</td>
<td class="text-center align-middle" colspan="3">
<input type="text" class="form-control text-center noborder-input inputItem" id="AL" name="AL" autocomplete="off">
</td>
<td class="text-center align-middle judgement" rowspan="1"> </td>
</tr>
<tr>
<td class="text-center align-middle" rowspan="1"> 4 </td>
<td class="text-center align-middle" colspan="2"> SiO₂함유량 (%)</td>
<td class="text-center align-middle" colspan="2"> 52 이상 </td>
<td class="text-center align-middle" colspan="3">
<input type="text" class="form-control text-center noborder-input inputItem" id="SIO" name="SIO" autocomplete="off">
</td>
<td class="text-center align-middle judgement" rowspan="1"> </td>
</tr>
<tr>
<td class="text-center align-middle" rowspan="1"> 5 </td>
<td class="text-center align-middle" colspan="2"> Fe₂O₃ 함유량 (%)</td>
<td class="text-center align-middle" colspan="2"> 0.06 이상 </td>
<td class="text-center align-middle" colspan="3">
<input type="text" class="form-control text-center noborder-input inputItem" id="FE" name="FE" autocomplete="off">
</td>
<td class="text-center align-middle judgement" rowspan="1"> </td>
</tr>
<!-- 종합판정 -->
<tr>
<td colspan="8" rowspan="4" class="text-center align-top">
<div class="text-start fw-bold mt-1">
<span>[부적합 내용]</span> <br>
<span>
<input type="text" class="form-control text-start inputItem noborder-input" style="height:50px;" id="input_memo" name="input_memo" autocomplete="off">
&nbsp;</span>
</div>
</td>
<td colspan="3" class="text-center align-middle yellowredBold">
<div class="d-flex justify-content-center align-items-center fw-bold">
<span class="text-dark">종합판정</span>
</div>
</td>
</tr>
<tr>
<td colspan="3" rowspan="3" class="text-center align-middle">
<div class="text-center fw-bold mt-3 fs-1 ">
<input type="text" class="form-control fs-2 text-center inputItem noborder-input" style="height:50px;" id="resultJudgement" name="resultJudgement" autocomplete="off">
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div> <!-- end of container -->
<div class="container mb-5 mt-2">
<div class="d-flex align-items-center justify-content-center mb-5">
</div>
</div>
</form>
<!-- 페이지로딩 -->
<script>
var ajaxRequest_write = null;
var ajaxRequest = null;
var ajaxRequest5 = null;
var ajaxRequest6 = null;
var ajaxRequest7 = null;
var isDisplaying = false;
$(document).ready(function(){
var loader = document.getElementById('loadingOverlay');
if(loader)
loader.style.display = 'none';
});
function generatePDF() {
var workplace = '<?php echo $title_message; ?>';
var deadline = '<?php echo $today; ?>';
var deadlineDate = new Date(deadline);
var formattedDate = "(" + String(deadlineDate.getFullYear()).slice(-2) + "." + ("0" + (deadlineDate.getMonth() + 1)).slice(-2) + "." + ("0" + deadlineDate.getDate()).slice(-2) + ")";
var result = 'KD' + workplace +'_' + formattedDate + '.pdf';
var element = document.getElementById('content-to-print');
var opt = {
margin: [10, 3, 12, 3], // Top, right, bottom, left margins
filename: result,
image: { type: 'jpeg', quality: 0.98 },
html2canvas: { scale: 1 },
jsPDF: { unit: 'mm', format: 'a4', orientation: 'portrait' },
pagebreak: { mode: [''] }
};
html2pdf().from(element).set(opt).save();
}
// 모달을 호출할 때 tr 요소를 저장하는 변수
var selectedRow;
$(document).on('click', '.saveData', function() {
saveData();
});
$(document).on('click', '.approvalBtn', function() {
// 승인자의 이름과 오늘 날짜 가져오기
const userName = '<?=$user_name?>'; // PHP로부터 가져온 사용자 이름
const todayStr = '<?=$todayStr?>'; // PHP로부터 가져온 오늘 날짜
// 승인 정보를 approvalDiv에 표시
$('#approvalDiv').html(
userName + '<br>' + todayStr +
' <i class="bi bi-x-circle remove-approval" style="cursor: pointer;"></i>'
);
$('#approvalDiv').show();
// 결재 정보를 업데이트하여 저장 로직에 반영
updateApprovalData(userName, todayStr);
saveData();
});
// 결재 정보 업데이트 함수
function updateApprovalData(userName, date) {
// 저장 로직을 위해 결재 정보 업데이트
let approvalData = {
writer: {
name: $('#orderman').text().trim(),
date: '<?=$indateStr?>'
},
reviewer: {
name: $('#reviewDiv').is(':visible') ? '<?=$user_name?>' : '',
date: '<?=$todayStr?>'
},
approver: {
name: userName,
date: date
}
};
// 저장할 JSON 데이터 업데이트
let formData = JSON.parse($('#iList').val() || '[]');
const approvalIndex = formData.findIndex(item => item.approval);
if (approvalIndex !== -1) {
formData[approvalIndex].approval = approvalData;
} else {
formData.push({ approval: approvalData });
}
// JSON 문자열로 다시 저장
$('#iList').val(JSON.stringify(formData));
}
// 결재 취소 기능
$(document).on('click', '.remove-approval', function() {
// 결재 정보를 지우고 화면에서 숨김
$('#approvalDiv').html('').hide();
// JSON 데이터에서 결재자의 정보 제거
let formData = JSON.parse($('#iList').val() || '[]');
const approvalIndex = formData.findIndex(item => item.approval);
if (approvalIndex !== -1) {
formData[approvalIndex].approval.approver.name = '';
formData[approvalIndex].approval.approver.date = '';
}
// JSON 문자열로 다시 저장
$('#iList').val(JSON.stringify(formData));
Toastify({
text: "결재 정보가 삭제되었습니다.",
duration: 2000,
close: true,
gravity: "top",
position: "center",
style: {
background: "linear-gradient(to right, #ff5f6d, #ffc371)"
},
}).showToast();
saveData();
});
function captureReturnKey(e) {
if(e.keyCode==13 && e.srcElement.type != 'textarea')
return false;
}
function recaptureReturnKey(e) {
if(e.keyCode==13 && e.srcElement.type != 'textarea')
return false;
}
// 삽입/수정하는 모듈
function saveData() {
// json 형태로 form문에 저장하기
let formData = [];
// 결재 부분 정보 저장
let approvalData = {
writer: {
name: $('#chargedDiv').is(':visible') ? '<?=$user_name?>' : '',
date: '<?=$indateStr?>'
},
approver: {
name: $('#approvalDiv').is(':visible') ? '<?=$user_name?>' : '',
date: '<?=$todayStr?>'
}
};
formData.push({ approval: approvalData });
// 검사자 정보 저장
let productionManager = $('#userNameInput').val();
formData.push({ productionManager: productionManager });
// 추가 정보 저장
formData.push({ num: $('#num').val() });
formData.push({ update_log: $('#update_log').val() });
formData.push({ memo: $('#memo').val() });
// Class 'inputItem' 값 저장
let inputItems = {};
$('.inputItem').each(function() {
let inputName = $(this).attr('name');
inputItems[inputName] = $(this).val();
});
formData.push({ inputItems: inputItems });
// 체크박스 상태 저장
let checkboxData = [];
$('#mainTable tbody tr').each(function(index) {
let rowCheckboxes = {
good: [],
bad: [],
judgement: $(this).find('.judgement').text()
};
$(this).find('.check-good').each(function() {
rowCheckboxes.good.push($(this).prop('checked'));
});
$(this).find('.check-bad').each(function() {
rowCheckboxes.bad.push($(this).prop('checked'));
});
checkboxData.push(rowCheckboxes);
});
formData.push({ checkboxData: checkboxData });
// JSON 문자열로 변환
let jsonString = JSON.stringify(formData);
// 숨겨진 필드에 JSON 데이터 설정
$('#iList').val(jsonString);
$("#overlay").show(); // 오버레이 표시
$("button").prop("disabled", true); // 모든 버튼 비활성화
// 폼데이터 전송시 사용함 Get form
var form = $('#board_form')[0];
var datasource = new FormData(form);
showMsgModal(2); // 파일저장중
$.ajax({
enctype: 'multipart/form-data',
processData: false,
contentType: false,
cache: false,
timeout: 600000,
url: "insert_iList.php",
type: "post",
data: datasource,
dataType: "json",
success: function(data) {
console.log(data);
setTimeout(function() {
Toastify({
text: "저장완료",
duration: 3000,
close: true,
gravity: "top",
position: "center",
style: {
background: "linear-gradient(to right, #00b09b, #96c93d)"
},
}).showToast();
saveAndClose(); //부모창 변경
hideMsgModal();
$("button").prop("disabled", false); // 모든 버튼 활성화
}, 1000);
$("#overlay").hide(); // 오버레이 숨김
},
error: function(jqxhr, status, error) {
console.log(jqxhr, status, error);
alert("An error occurred: " + error);
}
});
}
// 팝업 창에서 데이터 저장 및 닫기 함수
function saveAndClose() {
const updatedData = {
resultJudgement: $("#resultJudgement").val(),
// 필요한 다른 필드도 여기에 추가할 수 있습니다.
};
// 부모 창의 함수 호출
if (window.opener && typeof window.opener.closePopupAndUpdateRow === 'function') {
window.opener.closePopupAndUpdateRow(updatedData);
} else {
console.error("Parent window function not found");
}
// 팝업 창 닫기
// window.close();
}
// 초기값 불러오기
$(document).ready(function() {
console.log(iListData);
if (iListData.length > 0) {
// 결재 부분 정보
const approval = iListData.find(item => item.approval);
if (approval) {
if (approval.approval.writer.name && approval.approval.writer.date) {
$('#chargedDiv').show();
$('#chargedDiv').html(
approval.approval.writer.name + '<br>' + approval.approval.writer.date
);
} else {
$('#chargedDiv').hide().html('');
}
if (approval.approval.approver.name && approval.approval.approver.date) {
$('#approvalDiv').show();
$('#approvalDiv').html(
approval.approval.approver.name + '<br>' + approval.approval.approver.date +
' <i class="bi bi-x-circle remove-approval" style="cursor: pointer;"></i>'
);
} else {
$('#approvalDiv').hide().html('');
}
$('#workdate').text(approval.approval.writer.date);
}
// 검사자 정보
const productionManager = iListData.find(item => item.productionManager);
if (productionManager && productionManager.productionManager) {
$('#userNameInput').val(productionManager.productionManager).show();
$('#inputContainer').show();
$('#editButton').hide();
} else {
$('#userNameInput').val('');
$('#inputContainer').hide();
$('#editButton').show();
}
// inputItem 데이터 로드
const inputItems = iListData.find(item => item.inputItems);
if (inputItems && inputItems.inputItems) {
for (const [name, value] of Object.entries(inputItems.inputItems)) {
$(`.inputItem[name="${name}"]`).val(value);
}
}
// 체크박스 상태 로드
const checkboxData = iListData.find(item => item.checkboxData);
if (checkboxData && checkboxData.checkboxData) {
$('#mainTable tbody tr').each(function(index) {
const rowData = checkboxData.checkboxData[index];
if (rowData) {
$(this).find('.check-good').each(function(goodIndex) {
$(this).prop('checked', rowData.good[goodIndex]);
});
$(this).find('.check-bad').each(function(badIndex) {
$(this).prop('checked', rowData.bad[badIndex]);
});
$(this).find('.judgement').text(rowData.judgement);
}
});
}
}
});
// 첫번째 요소를 클릭하면 전체 로트번호 적용하기
$(document).ready(function() {
// id가 mainTable인 테이블의 첫 번째 td를 클릭했을 때 이벤트를 등록합니다.
$('#mainTable').on('click', 'td:first-child', function() {
// 클릭한 첫 번째 td의 형제인 두 번째 td 요소의 값을 가져옵니다.
var secondTdValue = $(this).siblings().find('input').val();
// id가 mainTable인 테이블에서 두 번째 td 요소에 해당 값을 적용합니다.
$('#mainTable tbody tr').each(function() {
$(this).find('td:nth-child(2) input').val(secondTdValue);
});
});
});
// 부트스트랩 툴팁
$(document).ready(function() {
var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]'));
var tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) {
return new bootstrap.Tooltip(tooltipTriggerEl);
});
});
</script>
<script>
$(document).ready(function() {
var thickness = <?= isset($thickness) ? $thickness : 'null' ?>;
var width = <?= isset($width) ? $width : 'null' ?>;
$('#mainTable tbody tr').each(function() {
var $row = $(this);
var $judgementCell = $row.find('.judgement');
function updateJudgement() {
var isValidThickness = true;
var isValidWidth = true;
var isValidLength = true;
var isValidAL = true;
var isValidSIO = true;
var isValidFE = true;
var allFieldsFilled = true; // 모든 필드가 채워졌는지 확인하는 플래그
// 두께 허용 범위 설정
var thicknessTolerance;
thicknessTolerance = thickness * 0.1;
// 두께 범위 비교
$row.find('input[name^="record_thickness"]').each(function() {
var value = parseFloat($(this).val());
if (isNaN(value)) {
allFieldsFilled = false;
return false;
}
var lowerLimit = thickness - thicknessTolerance;
var upperLimit = thickness + thicknessTolerance;
if (value < lowerLimit || value > upperLimit) {
isValidThickness = false;
}
});
// 너비 허용 범위 설정
$row.find('input[name^="record_width"]').each(function() {
var value = parseFloat($(this).val());
if (isNaN(value)) {
allFieldsFilled = false;
return false;
}
var lowerLimit = width - 5;
var upperLimit = width + 5;
if (value < lowerLimit || value > upperLimit) {
isValidWidth = false;
}
});
// AL 허용 범위 설정
$row.find('input[name^="AL"]').each(function() {
var value = parseFloat($(this).val());
if (isNaN(value)) {
allFieldsFilled = false;
return false;
}
if (value < 42 ) {
isValidAL = false;
}
});
// SIO 허용 범위 설정
$row.find('input[name^="SIO"]').each(function() {
var value = parseFloat($(this).val());
if (isNaN(value)) {
allFieldsFilled = false;
return false;
}
if (value < 52 ) {
isValidSIO = false;
}
});
// FE 허용 범위 설정
$row.find('input[name^="FE"]').each(function() {
var value = parseFloat($(this).val());
if (isNaN(value)) {
allFieldsFilled = false;
return false;
}
if (value < 0.06 ) {
isValidFE = false;
}
});
// OK/NG 체크박스 상태 검사
var allGood = true;
var anyBad = false;
// 해당 행에 OK 체크박스가 있는지 확인
if ($row.find('.check-good').length > 0) {
$row.find('.check-good').each(function() {
// 체크박스가 undefined이거나 제대로 체크되지 않으면 필드가 채워지지 않은 것으로 판단
if (isNaN($(this).is(':checked'))) {
allFieldsFilled = false;
return false;
}
if (!$(this).is(':checked')) {
allGood = false;
}
});
}
// 해당 행에 NG 체크박스가 있는지 확인
if ($row.find('.check-bad').length > 0) {
$row.find('.check-bad').each(function() {
if (isNaN($(this).is(':checked'))) {
allFieldsFilled = false;
return false;
}
if ($(this).is(':checked')) {
anyBad = true;
}
});
}
// OK/NG 체크박스 상태 검사
var checkedGood = 0; // 체크된 OK 체크박스 수
var checkedBad = 0; // 체크된 NG 체크박스 수
// 각 열의 OK/NG 체크박스를 한 번만 확인하도록 변경
var goodChecks = $row.find('.check-good');
var badChecks = $row.find('.check-bad');
// 해당 행에 OK 체크박스가 있는지 확인
if (goodChecks.length > 0) {
goodChecks.each(function() {
if ($(this).is(':checked')) {
checkedGood++; // OK 체크박스가 체크되면 증가
}
});
}
// 해당 행에 NG 체크박스가 있는지 확인
if (badChecks.length > 0) {
badChecks.each(function() {
if ($(this).is(':checked')) {
checkedBad++; // NG 체크박스가 체크되면 증가
}
});
}
// 모든 체크박스가 다 체크되지 않았다면 공백으로 처리
if (checkedGood + checkedBad !== 3 && (goodChecks.length > 0 || badChecks.length > 0)) {
allFieldsFilled = false; // 모두 체크되지 않았다면 공백 표시
}
// 모든 필드가 채워지지 않았으면 공백으로 설정
if (!allFieldsFilled) {
$judgementCell.text('');
} else {
// 판정 업데이트
if (isValidThickness && isValidWidth && isValidAL && isValidSIO && isValidFE && allGood && !anyBad) {
$judgementCell.text('적');
} else {
$judgementCell.text('부');
}
}
}
// 페이지 로드 시 초기 판단
updateJudgement();
// 체크박스 토글
$row.find('td').each(function() {
var $goodCheck = $(this).find('.check-good');
var $badCheck = $(this).find('.check-bad');
$goodCheck.on('change', function() {
if ($(this).is(':checked')) {
$badCheck.prop('checked', false);
}
updateJudgement();
updateFinalJudgement();
});
$badCheck.on('change', function() {
if ($(this).is(':checked')) {
$goodCheck.prop('checked', false);
}
updateJudgement();
updateFinalJudgement();
});
});
// input 값 변경 시 판정 업데이트
$row.find('input').on('input', updateJudgement);
$row.find('input').on('input', updateFinalJudgement);
});
// 최종 종합 판정 업데이트 함수
function updateFinalJudgement() {
var allPass = true;
var allJudged = true;
$('#mainTable tbody tr .judgement').each(function() {
var judgementText = $(this).text();
if (judgementText === '') {
allJudged = false;
}
if (judgementText === '부') {
allPass = false;
$(this).css('background-color', '#f8d7da');
} else {
$(this).css('background-color', '');
}
});
if (allJudged) {
if (allPass) {
$('#resultJudgement').val('합격');
} else {
$('#resultJudgement').val('불합격');
}
} else {
$('#resultJudgement').val('');
}
}
// 페이지 로드 시 최종 판정 업데이트
updateFinalJudgement();
});
</script>
<?php require_once $_SERVER['DOCUMENT_ROOT'] . '/' . $tablename . '/common/JS_instock.php'; ?> <!-- instock 후반부 공통 JS -->
</body>
</html>

982
instock/i_GIplate.php Normal file
View File

@@ -0,0 +1,982 @@
<?php
$tablename = 'instock';
?>
<?php include $_SERVER['DOCUMENT_ROOT'] . '/' . $tablename . '/common/head.php' ; ?> <!-- head 정보 불러오기 -->
<?php
if ($item_name === 'GI0.5T') {
$thickness = 0.5;
} elseif ($item_name === 'GI0.45T') {
$thickness = 0.45;
} elseif ($item_name === 'GI1.2T') {
$thickness = 1.2; // GI 1.2T 두께 설정
} else {
$thickness = ''; // 다른 경우 두께 값 설정 (필요한 경우)
}
$itemTitle = ($item_name === 'GI0.45T' || $item_name === 'GI0.5T' || $item_name === 'GI1.2T')
? '용융 아연도금 강판 <br> (KS D 3506, SGCC) "GI 절곡판""'
: ''; // 해당 품목명이 아닐 경우 빈 값 처리
// 사양(specification)에서 너비와 길이 추출
if (preg_match('/(\d+)\s*\*\s*(\d+)/', $specification, $matches)) {
$width = (int)$matches[1]; // 너비 추출 (숫자로 변환)
$length = (int)$matches[2]; // 길이 추출 (숫자로 변환)
// 추출한 너비와 길이로 $spec 값 설정
$spec = $thickness . ' * ' . $width . ' * ' . $length;
} else {
$spec = '사양 정보 없음';
}
$today = date("Y-m-d");
require_once $_SERVER['DOCUMENT_ROOT'] . '/instock/commonDriveLoad.php'; // 구글드라이브 파일형태 이미지형태 읽어오기 모듈
$savetitle ='수입검사성적서';
?>
<?php include $_SERVER['DOCUMENT_ROOT'] . '/' . $tablename . '/common/instock_btn.php'; ?> <!-- Btn 정보 불러오기 -->
<div id="content-to-print">
<br>
<div class="container mt-3">
<div class="d-flex align-items-center justify-content-center m-1">
<table class="table " style="border-collapse: collapse;">
<thead>
<tr>
<th rowspan="3" class="text-center" style="width:70%;">
<div class="row">
<div class="col-sm-2">
<img src="../img/kdlogo.png" alt="경동기업" class="me-1" style="width:100%; height:auto;">
</div>
<div class="col-sm-10">
<div class="d-flex align-items-center justify-content-center m-1">
<span class="text-dark ms-1 me-1 fs-2" > &nbsp; 수 </span>
<span class="text-dark me-1 fs-2" > &nbsp; 입 </span>
<span class="text-dark me-1 fs-2" > &nbsp; 검 </span>
<span class="text-dark me-1 fs-2" > &nbsp; 사 </span>
<span class="text-dark me-1 fs-2" > &nbsp; </span>
<span class="text-dark me-1 fs-2" > &nbsp; 성 </span>
<span class="text-dark me-1 fs-2" > &nbsp; 적 </span>
<span class="text-dark me-1 fs-2" > &nbsp; 서 </span>
</div>
</div>
</div>
</th>
<th rowspan="3" class="text-center fw-bold" style="height:100px;">결 재</th>
<th class="text-center p-1" style="width : 100px; height:22px; padding:2px;">담당</th>
<th class="text-center p-1" style="width : 100px; height:22px; padding:2px;">부서장</th>
</tr>
<tr style="height:40px;">
<th class="text-center">
<div id="chargedDiv" style="display: none;">
<span id="orderman"> <?=$orderman?> </span> <br> <?=$indateStr ?>
</div>
</th>
<th class="text-center">
<div id="approvalDiv" style="display: none;">
<?=$user_name?> <br> <?=$todayStr ?>
</div>
</th>
</tr>
<tr>
<th colspan="2"> 입고일자 : <?=$inspection_date?></th>
</tr>
</thead>
</table>
</div>
<div class="d-flex align-items-center justify-content-center m-1">
<table class="table table-bordered" style="border-collapse: collapse;">
<tbody>
<tr>
<td class="text-center align-middle lightgray">품 명</td>
<td colspan="2" class="text-center fw-bold"><?=$itemTitle?></td>
<td class="text-center align-middle lightgray">납품업체<br>제조업체</td>
<td class="text-center text-primary fw-bold"><?=$supplier?> <br> (<?=$manufacturer?>) </td>
</tr>
<tr>
<td class="text-center align-middle lightgray">규 격<br>(두께*너비*길이) </td>
<td colspan="2" class="text-center fw-bold"><?=$spec?></td>
<td class="text-center align-middle lightgray">로트번호</td>
<td colspan="1" class="text-center text-primary fw-bold">
<?=$lot_no?>
</td>
</tr>
<tr>
<td class="text-center align-middle lightgray">자재번호</td>
<td colspan="2" class="text-center fw-bold"><?=$material_no?></td>
<td class="text-center align-middle lightgray">검사일자</td>
<td colspan="1" class="text-center text-primary fw-bold">
<?=$indateStr?>
</td>
</tr>
<tr>
<td class="text-center align-middle lightgray">로트크기</td>
<td class="text-center text-dark fw-bold"><?=$received_qty?> </td>
<td class="text-center text-dark fw-bold"><?=$unit?> </td>
<td class="text-center align-middle lightgray">검사자</td>
<td class="text-center">
<div class="d-flex justify-content-center">
<button type="button" id="editButton" class="btn btn-primary btn-sm">검사자</button>
<div id="inputContainer" style="display: none;">
<input type="text" id="userNameInput" class="form-control d-inline-block noborder-input text-center" style="width:100px;" autocomplete="off" style="widtd: 100px;" value="<?=$user_name?>">
<button type="button" id="cancelButton" class="btn btn-outline-danger btn-sm"> <i class="bi bi-x"> </i> </button>
</div>
</div>
</td>
</tr>
<script>
$(document).ready(function() {
// '담당자 입력' 버튼 클릭 시 input 표시 및 버튼 숨김
$('#editButton').on('click', function() {
$('#editButton').hide();
$('#inputContainer').show();
$('#workdate').text('<?php echo $todayStr; ?>');
$('#chargedDiv').show();
});
// '취소' 버튼 클릭 시 원래 상태로 되돌림
$('#cancelButton').on('click', function() {
$('#inputContainer').hide();
$('#chargedDiv').hide();
$('#workdate').text('');
$('#editButton').show();
});
});
</script>
</tbody>
</table>
</div>
<div class="row justify-content-start m-1 mt-2">
<table id="mainTable" class="table table-hover" style="border-collapse: collapse;">
<thead>
<tr>
<th class="text-center align-middle" rowspan="2">NO</th>
<th class="text-center align-middle" rowspan="2" colspan="2">검사항목</th>
<th class="text-center align-middle" rowspan="2" colspan="2">검사기준</th>
<th class="text-center align-middle" rowspan="2">검사방식</th>
<th class="text-center align-middle" rowspan="2">검사주기</th>
<th class="text-center align-middle" colspan="3">측정치</th>
<th class="text-center align-middle" rowspan="2">판정 <br> (적/부)</th>
</tr>
<tr>
<th class="text-center">n1 <br> 양호/불량 </th>
<th class="text-center">n2 <br> 양호/불량 </th>
<th class="text-center">n3 <br> 양호/불량 </th>
</tr>
</thead>
<tbody>
<!-- 첫 번째 행 (겉모양) -->
<tr>
<td class="text-center align-middle">1</td>
<td class="text-center align-middle" colspan="2">겉모양</td>
<td class="text-center align-middle" colspan="2">사용상 해로울 <br> 결함이 없을 것</td>
<td class="text-center align-middle">육안검사</td>
<td class="text-center align-middle" rowspan="4">n = 3 <br>c = 0</td>
<td class="text-center align-middle">
<label>
<input type="checkbox" class="check-good"> OK
</label>
<label>
<input type="checkbox" class="check-bad"> NG
</label>
</td>
<td class="text-center align-middle">
<label>
<input type="checkbox" class="check-good"> OK
</label>
<label>
<input type="checkbox" class="check-bad"> NG
</label>
</td>
<td class="text-center align-middle">
<label>
<input type="checkbox" class="check-good"> OK
</label>
<label>
<input type="checkbox" class="check-bad"> NG
</label>
</td>
<td class="text-center align-middle judgement"></td>
</tr>
<?php
// 두께 범위에 맞는 체크된 사각형을 표시하는 함수
function renderCheckBox($min, $max, $value) {
if ($value >= $min && $value < $max) {
return '✅'; // 체크된 사각형
} else {
return '□'; // 빈 사각형
}
}
// 길이 범위에 맞는 체크된 사각형을 표시하는 함수
function renderLengthCheckBox($min, $max, $length) {
if ($length >= $min && $length < $max) {
return '✅'; // 체크된 사각형
} else {
return '□'; // 빈 사각형
}
}
?>
<!-- 두 번째 행 (치수) -->
<tr>
<td class="text-center align-middle" rowspan="3">2</td>
<td class="text-center align-middle" rowspan="3">치수</td>
<td class="text-center align-middle" rowspan="1">
두께
<input type="text" class="form-control text-center noborder-input inputItem" id="input_thickness" name="input_thickness" value="<?=$thickness?>" autocomplete="off">
</td>
<!-- 0.8 이상 ~ 1.0 미만 범위 체크 -->
<td class="text-center align-middle"> <?= renderCheckBox(0.4, 0.6, $thickness) ?> 0.4 이상 <br> ~ 0.6 미만</td>
<td class="text-center align-middle"> ± 0.06 </td>
<td class="text-center align-middle" rowspan="3">체크검사</td>
<td class="text-center align-middle" rowspan="1">
<input type="text" class="form-control text-center noborder-input inputItem" id="record_thickness1" name="record_thickness1" value="" autocomplete="off">
</td>
<td class="text-center align-middle" rowspan="1">
<input type="text" class="form-control text-center noborder-input inputItem" id="record_thickness2" name="record_thickness2" value="" autocomplete="off">
</td>
<td class="text-center align-middle" rowspan="1">
<input type="text" class="form-control text-center noborder-input inputItem" id="record_thickness3" name="record_thickness3" value="" autocomplete="off">
</td>
<td class="text-center align-middle judgement" rowspan="1"></td>
</tr>
<!-- 너비 검사 -->
<tr>
<td class="text-center align-middle" rowspan="1">
너비
<input type="text" class="form-control text-center noborder-input inputItem" id="input_width" name="input_width" value="<?=$width?>" autocomplete="off">
</td>
<td class="text-center align-middle">✅ 1500 미만</td>
<td class="text-center align-middle"> + 7 <br> - 0 </td>
<td class="text-center align-middle" rowspan="1">
<input type="text" class="form-control text-center noborder-input inputItem" id="record_widh1" name="record_widh1" value="" autocomplete="off">
</td>
<td class="text-center align-middle" rowspan="1">
<input type="text" class="form-control text-center noborder-input inputItem" id="record_widh2" name="record_widh2" value="" autocomplete="off">
</td>
<td class="text-center align-middle" rowspan="1">
<input type="text" class="form-control text-center noborder-input inputItem" id="record_widh3" name="record_widh3" value="" autocomplete="off">
</td>
<td class="text-center align-middle judgement"></td>
</tr>
<!-- 길이 검사 -->
<tr>
<td class="text-center align-middle" rowspan="1">
길이
<input type="text" class="form-control text-center noborder-input inputItem" id="input_length" name="input_length" value="<?=$length?>" autocomplete="off">
</td>
<!-- 1250 미만 범위 체크 -->
<td class="text-center align-middle"> - </td>
<td class="text-center align-middle">+ 15 <br> - 0</td>
<td class="text-center align-middle" rowspan="1">
<input type="text" class="form-control text-center noborder-input inputItem" id="record_length1" name="record_length1" value="" autocomplete="off">
</td>
<td class="text-center align-middle" rowspan="1">
<input type="text" class="form-control text-center noborder-input inputItem" id="record_length2" name="record_length2" value="" autocomplete="off">
</td>
<td class="text-center align-middle" rowspan="1">
<input type="text" class="form-control text-center noborder-input inputItem" id="record_length3" name="record_length3" value="" autocomplete="off">
</td>
<td class="text-center align-middle judgement" rowspan="1"></td>
</tr>
<!-- 인장강도 -->
<tr>
<td class="text-center align-middle">3</td>
<td class="text-center align-middle" colspan="2">항복강도 (N/㎟)</td>
<td class="text-center align-middle" colspan="2">205 이상</td>
<td class="text-center align-middle" rowspan="3">공급업체 <br> 밀시트</td>
<td class="text-center align-middle" rowspan="3">입고시</td>
<td class="text-center align-middle" colspan="3">
<input type="text" class="form-control text-center noborder-input inputItem" id="yield_strength" name="yield_strength" autocomplete="off">
</td>
<td class="text-center align-middle judgement"></td>
</tr>
<!-- 인장 강도 -->
<tr>
<td class="text-center align-middle" rowspan="1">4</td>
<td class="text-center align-middle" colspan="2" rowspan="1">인장 강도 (N/㎟)</td>
<td class="text-center align-middle" colspan="2"> 270 이상 </td>
<td class="text-center align-middle" rowspan="1" colspan="3">
<input type="text" class="form-control text-center noborder-input inputItem" id="tensile_strength" name="tensile_strength" autocomplete="off">
</td>
<td class="text-center align-middle judgement" rowspan="1"></td>
</tr>
<!-- 도금의 최소 부착량 -->
<tr>
<td class="text-center align-middle" rowspan="1">5</td>
<td class="text-center align-middle" colspan="2" rowspan="1">도금의 최소 부착량 <br> (g/㎟) </td>
<td class="text-center align-middle" colspan="2">102 이상 </td>
<td class="text-center align-middle" rowspan="1" colspan="3">
<input type="text" class="form-control text-center noborder-input inputItem" id="minZincCoating" name="minZincCoating" autocomplete="off">
</td>
<td class="text-center align-middle judgement" rowspan="1"></td>
</tr>
<!-- 종합판정 -->
<tr>
<td colspan="8" rowspan="4" class="text-center align-top">
<div class="text-start fw-bold mt-1">
<span># 1.55mm의 경우 KS F 4510에 따른 MIN 15의 기준에 따름</span><br>
<span># 두께의 경우 너비 1000 이상 ~ 1250 미만 기준에 따름</span>
<br><br>
<span>[부적합 내용]</span> <br>
<span>
<input type="text" class="form-control text-start inputItem noborder-input" id="input_memo" name="input_memo" autocomplete="off">
&nbsp;</span>
</div>
</td>
<td colspan="3" class="text-center align-middle yellowredBold">
<div class="d-flex justify-content-center align-items-center fw-bold">
<span class="text-dark">종합판정</span>
</div>
</td>
</tr>
<tr>
<td colspan="3" rowspan="3" class="text-center align-middle">
<div class="text-center fw-bold mt-3 fs-1 ">
<input type="text" class="form-control fs-2 text-center inputItem noborder-input" style="height:50px;" id="resultJudgement" name="resultJudgement" autocomplete="off">
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</form>
</div> <!-- end of container -->
<div class="container mb-5 mt-2">
<div class="d-flex align-items-center justify-content-center mb-5">
</div>
</div>
<!-- 페이지로딩 -->
<script>
$(document).ready(function(){
var loader = document.getElementById('loadingOverlay');
if(loader)
loader.style.display = 'none';
});
function generatePDF() {
var workplace = '<?php echo $title_message; ?>';
var deadline = '<?php echo $today; ?>';
var deadlineDate = new Date(deadline);
var formattedDate = "(" + String(deadlineDate.getFullYear()).slice(-2) + "." + ("0" + (deadlineDate.getMonth() + 1)).slice(-2) + "." + ("0" + deadlineDate.getDate()).slice(-2) + ")";
var result = 'KD' + workplace +'_' + formattedDate + '.pdf';
var element = document.getElementById('content-to-print');
var opt = {
margin: [10, 3, 12, 3], // Top, right, bottom, left margins
filename: result,
image: { type: 'jpeg', quality: 0.98 },
html2canvas: { scale: 1 },
jsPDF: { unit: 'mm', format: 'a4', orientation: 'portrait' },
pagebreak: { mode: [''] }
};
html2pdf().from(element).set(opt).save();
}
// 모달을 호출할 때 tr 요소를 저장하는 변수
var selectedRow;
$(document).on('click', '.saveData', function() {
saveData();
});
$(document).on('click', '.approvalBtn', function() {
// 승인자의 이름과 오늘 날짜 가져오기
const userName = '<?=$user_name?>'; // PHP로부터 가져온 사용자 이름
const todayStr = '<?=$todayStr?>'; // PHP로부터 가져온 오늘 날짜
// 승인 정보를 approvalDiv에 표시
$('#approvalDiv').html(
userName + '<br>' + todayStr +
' <i class="bi bi-x-circle remove-approval" style="cursor: pointer;"></i>'
);
$('#approvalDiv').show();
// 결재 정보를 업데이트하여 저장 로직에 반영
updateApprovalData(userName, todayStr);
saveData();
});
// 결재 정보 업데이트 함수
function updateApprovalData(userName, date) {
// 저장 로직을 위해 결재 정보 업데이트
let approvalData = {
writer: {
name: $('#orderman').text().trim(),
date: '<?=$indateStr?>'
},
reviewer: {
name: $('#reviewDiv').is(':visible') ? '<?=$user_name?>' : '',
date: '<?=$todayStr?>'
},
approver: {
name: userName,
date: date
}
};
// 저장할 JSON 데이터 업데이트
let formData = JSON.parse($('#iList').val() || '[]');
const approvalIndex = formData.findIndex(item => item.approval);
if (approvalIndex !== -1) {
formData[approvalIndex].approval = approvalData;
} else {
formData.push({ approval: approvalData });
}
// JSON 문자열로 다시 저장
$('#iList').val(JSON.stringify(formData));
}
// 결재 취소 기능
$(document).on('click', '.remove-approval', function() {
// 결재 정보를 지우고 화면에서 숨김
$('#approvalDiv').html('').hide();
// JSON 데이터에서 결재자의 정보 제거
let formData = JSON.parse($('#iList').val() || '[]');
const approvalIndex = formData.findIndex(item => item.approval);
if (approvalIndex !== -1) {
formData[approvalIndex].approval.approver.name = '';
formData[approvalIndex].approval.approver.date = '';
}
// JSON 문자열로 다시 저장
$('#iList').val(JSON.stringify(formData));
Toastify({
text: "결재 정보가 삭제되었습니다.",
duration: 2000,
close: true,
gravity: "top",
position: "center",
style: {
background: "linear-gradient(to right, #ff5f6d, #ffc371)"
},
}).showToast();
saveData();
});
function captureReturnKey(e) {
if(e.keyCode==13 && e.srcElement.type != 'textarea')
return false;
}
function recaptureReturnKey(e) {
if(e.keyCode==13 && e.srcElement.type != 'textarea')
return false;
}
// 삽입/수정하는 모듈
function saveData() {
// json 형태로 form문에 저장하기
let formData = [];
// 결재 부분 정보 저장
let approvalData = {
writer: {
name: $('#chargedDiv').is(':visible') ? '<?=$user_name?>' : '',
date: '<?=$indateStr?>'
},
approver: {
name: $('#approvalDiv').is(':visible') ? '<?=$user_name?>' : '',
date: '<?=$todayStr?>'
}
};
formData.push({ approval: approvalData });
// 검사자 정보 저장
let productionManager = $('#userNameInput').val();
formData.push({ productionManager: productionManager });
// 추가 정보 저장
formData.push({ num: $('#num').val() });
formData.push({ update_log: $('#update_log').val() });
formData.push({ memo: $('#memo').val() });
// Class 'inputItem' 값 저장
let inputItems = {};
$('.inputItem').each(function() {
let inputName = $(this).attr('name');
inputItems[inputName] = $(this).val();
});
formData.push({ inputItems: inputItems });
// 체크박스 상태 저장
let checkboxData = [];
$('#mainTable tbody tr').each(function(index) {
let rowCheckboxes = {
good: [],
bad: [],
judgement: $(this).find('.judgement').text()
};
$(this).find('.check-good').each(function() {
rowCheckboxes.good.push($(this).prop('checked'));
});
$(this).find('.check-bad').each(function() {
rowCheckboxes.bad.push($(this).prop('checked'));
});
checkboxData.push(rowCheckboxes);
});
formData.push({ checkboxData: checkboxData });
// JSON 문자열로 변환
let jsonString = JSON.stringify(formData);
// 숨겨진 필드에 JSON 데이터 설정
$('#iList').val(jsonString);
$("#overlay").show(); // 오버레이 표시
$("button").prop("disabled", true); // 모든 버튼 비활성화
// 폼데이터 전송시 사용함 Get form
var form = $('#board_form')[0];
var datasource = new FormData(form);
showMsgModal(2); // 파일저장중
$.ajax({
enctype: 'multipart/form-data',
processData: false,
contentType: false,
cache: false,
timeout: 600000,
url: "insert_iList.php",
type: "post",
data: datasource,
dataType: "json",
success: function(data) {
// console.log(data);
setTimeout(function() {
Toastify({
text: "저장완료",
duration: 3000,
close: true,
gravity: "top",
position: "center",
style: {
background: "linear-gradient(to right, #00b09b, #96c93d)"
},
}).showToast();
saveAndClose(); //부모창 변경
hideMsgModal();
$("button").prop("disabled", false); // 모든 버튼 활성화
}, 1000);
$("#overlay").hide(); // 오버레이 숨김
},
error: function(jqxhr, status, error) {
console.log(jqxhr, status, error);
alert("An error occurred: " + error);
}
});
}
// 팝업 창에서 데이터 저장 및 닫기 함수
function saveAndClose() {
const updatedData = {
resultJudgement: $("#resultJudgement").val(),
// 필요한 다른 필드도 여기에 추가할 수 있습니다.
};
// 부모 창의 함수 호출
if (window.opener && typeof window.opener.closePopupAndUpdateRow === 'function') {
window.opener.closePopupAndUpdateRow(updatedData);
} else {
console.error("Parent window function not found");
}
// 팝업 창 닫기
// window.close();
}
// 초기값 불러오기
$(document).ready(function() {
// console.log(iListData);
if (iListData.length > 0) {
// 결재 부분 정보
const approval = iListData.find(item => item.approval);
if (approval) {
if (approval.approval.writer.name && approval.approval.writer.date) {
$('#chargedDiv').show();
$('#chargedDiv').html(
approval.approval.writer.name + '<br>' + approval.approval.writer.date
);
} else {
$('#chargedDiv').hide().html('');
}
if (approval.approval.approver.name && approval.approval.approver.date) {
$('#approvalDiv').show();
$('#approvalDiv').html(
approval.approval.approver.name + '<br>' + approval.approval.approver.date +
' <i class="bi bi-x-circle remove-approval" style="cursor: pointer;"></i>'
);
} else {
$('#approvalDiv').hide().html('');
}
$('#workdate').text(approval.approval.writer.date);
}
// 검사자 정보
const productionManager = iListData.find(item => item.productionManager);
if (productionManager && productionManager.productionManager) {
$('#userNameInput').val(productionManager.productionManager).show();
$('#inputContainer').show();
$('#editButton').hide();
} else {
$('#userNameInput').val('');
$('#inputContainer').hide();
$('#editButton').show();
}
// inputItem 데이터 로드
const inputItems = iListData.find(item => item.inputItems);
if (inputItems && inputItems.inputItems) {
for (const [name, value] of Object.entries(inputItems.inputItems)) {
$(`.inputItem[name="${name}"]`).val(value);
}
}
// 체크박스 상태 로드
const checkboxData = iListData.find(item => item.checkboxData);
if (checkboxData && checkboxData.checkboxData) {
$('#mainTable tbody tr').each(function(index) {
const rowData = checkboxData.checkboxData[index];
if (rowData) {
$(this).find('.check-good').each(function(goodIndex) {
$(this).prop('checked', rowData.good[goodIndex]);
});
$(this).find('.check-bad').each(function(badIndex) {
$(this).prop('checked', rowData.bad[badIndex]);
});
$(this).find('.judgement').text(rowData.judgement);
}
});
}
}
});
// 첫번째 요소를 클릭하면 전체 로트번호 적용하기
$(document).ready(function() {
// id가 mainTable인 테이블의 첫 번째 td를 클릭했을 때 이벤트를 등록합니다.
$('#mainTable').on('click', 'td:first-child', function() {
// 클릭한 첫 번째 td의 형제인 두 번째 td 요소의 값을 가져옵니다.
var secondTdValue = $(this).siblings().find('input').val();
// id가 mainTable인 테이블에서 두 번째 td 요소에 해당 값을 적용합니다.
$('#mainTable tbody tr').each(function() {
$(this).find('td:nth-child(2) input').val(secondTdValue);
});
});
});
// 부트스트랩 툴팁
$(document).ready(function() {
var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]'));
var tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) {
return new bootstrap.Tooltip(tooltipTriggerEl);
});
});
</script>
<script>
$(document).ready(function() {
var thickness = <?= isset($thickness) ? $thickness : 'null' ?>;
var width = <?= isset($width) ? $width : 'null' ?>;
var length = <?= isset($length) ? $length : 'null' ?>;
var yield_strength = <?= isset($yield_strength) ? $yield_strength : 'null' ?>;
var tensile_strength = <?= isset($tensile_strength) ? $tensile_strength : 'null' ?>;
var minZincCoating = <?= isset($minZincCoating) ? $minZincCoating : 'null' ?>;
$('#mainTable tbody tr').each(function() {
var $row = $(this);
var $judgementCell = $row.find('.judgement');
function updateJudgement() {
var isValidThickness = true;
var isValidWidth = true;
var isValidLength = true;
var isValidYieldStrength = true;
var isValidTensileStrength = true;
var isValidminZincCoating = true; // 도금의 최소 부착량
var allFieldsFilled = true;
// 두께 허용 범위 설정
var thicknessTolerance;
if (thickness >= 0.4 && thickness < 0.6) {
thicknessTolerance = 0.06;
}
// 두께 비교
$row.find('input[name^="record_thickness"]').each(function() {
var value = parseFloat($(this).val());
if (isNaN(value)) {
allFieldsFilled = false;
return false;
}
var lowerLimit = thickness - thicknessTolerance;
var upperLimit = thickness + thicknessTolerance;
if (value < lowerLimit || value > upperLimit) {
isValidThickness = false;
}
});
// 너비 허용 범위는 +7 ~ 0
$row.find('input[name^="record_widh"]').each(function() {
var value = parseFloat($(this).val());
if (isNaN(value)) {
allFieldsFilled = false;
return false;
}
var lowerLimit = width;
var upperLimit = width + 7;
if (value < lowerLimit || value >= upperLimit) {
isValidWidth = false;
}
});
// 길이 허용 범위 설정
$row.find('input[name^="record_length"]').each(function() {
var value = parseFloat($(this).val());
if (isNaN(value)) {
allFieldsFilled = false;
return false;
}
var lowerLimit, upperLimit;
var lowerLimit = length;
var upperLimit = length + 15;
if (value < lowerLimit || value > upperLimit) {
isValidLength = false;
}
});
// 항복강도 비교
$row.find('input[name="yield_strength"]').each(function() {
var value = parseFloat($(this).val());
if (isNaN(value)) {
allFieldsFilled = false;
return false;
}
if (value < 205) {
isValidYieldStrength = false;
}
});
// 인장강도 비교
$row.find('input[name="tensile_strength"]').each(function() {
var value = parseFloat($(this).val());
if (isNaN(value)) {
allFieldsFilled = false;
return false;
}
if (value < 270) {
isValidTensileStrength = false;
}
});
// 도금의 최소 부착량
$row.find('input[name="minZincCoating"]').each(function() {
var value = parseFloat($(this).val());
if (isNaN(value)) {
allFieldsFilled = false;
return false;
}
if (value < 102) {
isValidminZincCoating = false;
}
});
// OK/NG 체크박스 상태 검사
var allGood = true;
var anyBad = false;
// 해당 행에 OK 체크박스가 있는지 확인
if ($row.find('.check-good').length > 0) {
$row.find('.check-good').each(function() {
// 체크박스가 undefined이거나 제대로 체크되지 않으면 필드가 채워지지 않은 것으로 판단
if (isNaN($(this).is(':checked'))) {
allFieldsFilled = false;
return false;
}
if (!$(this).is(':checked')) {
allGood = false;
}
});
}
// 해당 행에 NG 체크박스가 있는지 확인
if ($row.find('.check-bad').length > 0) {
$row.find('.check-bad').each(function() {
if (isNaN($(this).is(':checked'))) {
allFieldsFilled = false;
return false;
}
if ($(this).is(':checked')) {
anyBad = true;
}
});
}
// OK/NG 체크박스 상태 검사
var checkedGood = 0; // 체크된 OK 체크박스 수
var checkedBad = 0; // 체크된 NG 체크박스 수
// 각 열의 OK/NG 체크박스를 한 번만 확인하도록 변경
var goodChecks = $row.find('.check-good');
var badChecks = $row.find('.check-bad');
// 해당 행에 OK 체크박스가 있는지 확인
if (goodChecks.length > 0) {
goodChecks.each(function() {
if ($(this).is(':checked')) {
checkedGood++; // OK 체크박스가 체크되면 증가
}
});
}
// 해당 행에 NG 체크박스가 있는지 확인
if (badChecks.length > 0) {
badChecks.each(function() {
if ($(this).is(':checked')) {
checkedBad++; // NG 체크박스가 체크되면 증가
}
});
}
// 모든 체크박스가 다 체크되지 않았다면 공백으로 처리
if (checkedGood + checkedBad !== 3 && (goodChecks.length > 0 || badChecks.length > 0)) {
allFieldsFilled = false; // 모두 체크되지 않았다면 공백 표시
}
// 결과 출력
// console.log('isValidThickness:', isValidThickness);
// console.log('isValidWidth:', isValidWidth);
// console.log('allGood:', allGood);
// console.log('anyBad:', anyBad);
// 모든 필드가 채워지지 않았으면 공백으로 설정
if (!allFieldsFilled) {
$judgementCell.text('');
} else {
// 판정 업데이트
if (isValidThickness && isValidWidth && isValidLength && isValidYieldStrength && isValidTensileStrength && isValidminZincCoating && allGood && !anyBad ) {
$judgementCell.text('적');
} else {
$judgementCell.text('부');
}
}
}
// 페이지 로드 시 초기 판단
updateJudgement();
// 체크박스 토글
$row.find('td').each(function() {
var $goodCheck = $(this).find('.check-good');
var $badCheck = $(this).find('.check-bad');
$goodCheck.on('change', function() {
if ($(this).is(':checked')) {
$badCheck.prop('checked', false);
}
updateJudgement();
updateFinalJudgement();
});
$badCheck.on('change', function() {
if ($(this).is(':checked')) {
$goodCheck.prop('checked', false);
}
updateJudgement();
updateFinalJudgement();
});
});
// input 값 변경 시 판정 업데이트
$row.find('input').on('input', updateJudgement);
$row.find('input').on('input', updateFinalJudgement);
});
// 최종 종합 판정 업데이트 함수
function updateFinalJudgement() {
var allPass = true;
var allJudged = true;
$('#mainTable tbody tr .judgement').each(function() {
var judgementText = $(this).text();
if (judgementText === '') {
allJudged = false;
}
if (judgementText === '부') {
allPass = false;
// '부'인 경우 해당 td의 배경색을 옅은 붉은 색으로 변경
$(this).css('background-color', '#f8d7da'); // 옅은 붉은 색
} else {
// '적'인 경우 배경색을 기본으로 설정
$(this).css('background-color', ''); // 기본 배경색 (없음)
}
});
if (allJudged) {
if (allPass) {
$('#resultJudgement').val('합격');
} else {
$('#resultJudgement').val('불합격');
}
} else {
$('#resultJudgement').val('');
}
}
// 페이지 로드 시 최종 판정 업데이트
updateFinalJudgement();
});
</script>
<?php require_once $_SERVER['DOCUMENT_ROOT'] . '/' . $tablename . '/common/JS_instock.php'; ?> <!-- instock 후반부 공통 JS -->
</body>
</html>

975
instock/i_SUScoil.php Normal file
View File

@@ -0,0 +1,975 @@
<?php
$tablename = 'instock';
?>
<?php include $_SERVER['DOCUMENT_ROOT'] . '/' . $tablename . '/common/head.php' ; ?> <!-- head 정보 불러오기 -->
<?php
$itemTitle = '냉간 압연 스테인리스 강대 <br>
(KS D 3698, STS304) "SUS 절곡코일"';
// 두께(thickness) 추출
if (preg_match('/(\d+\.\d+)T/', $spec, $matches_thickness)) {
$thickness = $matches_thickness[1]; // 두께 값 추출
}
// 너비(width) 추출 (소수점 포함)
if (preg_match('/W(\d+(\.\d+)?)/', $spec, $matches_width)) {
$width = $matches_width[1]; // 너비 값 추출
}
// 추출한 너비와 길이로 $spec 값 설정
$spec = $thickness . ' * ' . $width ;
// JSON 데이터를 JavaScript 변수로 변환
echo "<script>";
echo "var iListData = " . json_encode($iList) . ";";
echo "</script>";
$today = date("Y-m-d");
require_once $_SERVER['DOCUMENT_ROOT'] . '/instock/commonDriveLoad.php'; // 구글드라이브 파일형태 이미지형태 읽어오기 모듈
$savetitle ='수입검사성적서';
?>
<?php include $_SERVER['DOCUMENT_ROOT'] . '/' . $tablename . '/common/instock_btn.php'; ?> <!-- Btn 정보 불러오기 -->
<div id="content-to-print">
<br>
<div class="container mt-3">
<div class="d-flex align-items-center justify-content-center m-1">
<table class="table " style="border-collapse: collapse;">
<thead>
<tr>
<th rowspan="3" class="text-center" style="width:70%;">
<div class="row">
<div class="col-sm-2">
<img src="../img/kdlogo.png" alt="경동기업" class="me-1" style="width:100%; height:auto;">
</div>
<div class="col-sm-10">
<div class="d-flex align-items-center justify-content-center m-1">
<span class="text-dark ms-1 me-1 fs-2" > &nbsp; 수 </span>
<span class="text-dark me-1 fs-2" > &nbsp; 입 </span>
<span class="text-dark me-1 fs-2" > &nbsp; 검 </span>
<span class="text-dark me-1 fs-2" > &nbsp; 사 </span>
<span class="text-dark me-1 fs-2" > &nbsp; </span>
<span class="text-dark me-1 fs-2" > &nbsp; 성 </span>
<span class="text-dark me-1 fs-2" > &nbsp; 적 </span>
<span class="text-dark me-1 fs-2" > &nbsp; 서 </span>
</div>
</div>
</div>
</th>
<th rowspan="3" class="text-center fw-bold" style="height:100px;">결 재</th>
<th class="text-center p-1" style="width : 100px; height:22px; padding:2px;">담당</th>
<th class="text-center p-1" style="width : 100px; height:22px; padding:2px;">부서장</th>
</tr>
<tr style="height:40px;">
<th class="text-center">
<div id="chargedDiv" style="display: none;">
<span id="orderman"> <?=$orderman?> </span> <br> <?=$indateStr ?>
</div>
</th>
<th class="text-center">
<div id="approvalDiv" style="display: none;">
<?=$user_name?> <br> <?=$todayStr ?>
</div>
</th>
</tr>
<tr>
<th colspan="2"> 입고일자 : <?=$inspection_date?></th>
</tr>
</thead>
</table>
</div>
<div class="d-flex align-items-center justify-content-center m-1">
<table class="table table-bordered" style="border-collapse: collapse;">
<tbody>
<tr>
<td class="text-center align-middle lightgray">품 명</td>
<td colspan="2" class="text-center fw-bold"><?=$itemTitle?></td>
<td class="text-center align-middle lightgray">납품업체<br>제조업체</td>
<td class="text-center text-primary fw-bold"><?=$supplier?> <br> (<?=$manufacturer?>) </td>
</tr>
<tr>
<td class="text-center align-middle lightgray">규 격<br>(두께*너비) </td>
<td colspan="2" class="text-center fw-bold"><?=$spec?></td>
<td class="text-center align-middle lightgray">로트번호</td>
<td colspan="1" class="text-center text-primary fw-bold">
<?=$lot_no?>
</td>
</tr>
<tr>
<td class="text-center align-middle lightgray">자재번호</td>
<td colspan="2" class="text-center fw-bold"><?=$material_no?></td>
<td class="text-center align-middle lightgray">검사일자</td>
<td colspan="1" class="text-center text-primary fw-bold">
<?=$indateStr?>
</td>
</tr>
<tr>
<td class="text-center align-middle lightgray">로트크기</td>
<td class="text-center text-dark fw-bold"><?=$received_qty?> </td>
<td class="text-center text-dark fw-bold"><?=$unit?> </td>
<td class="text-center align-middle lightgray">검사자</td>
<td class="text-center">
<div class="d-flex justify-content-center">
<button type="button" id="editButton" class="btn btn-primary btn-sm">검사자</button>
<div id="inputContainer" style="display: none;">
<input type="text" id="userNameInput" class="form-control d-inline-block noborder-input text-center" style="width:150px;" autocomplete="off" style="widtd: 100px;" value="<?=$user_name?>">
<button type="button" id="cancelButton" class="btn btn-outline-danger btn-sm"> <i class="bi bi-x"> </i> </button>
</div>
</div>
</td>
</tr>
<script>
$(document).ready(function() {
// '담당자 입력' 버튼 클릭 시 input 표시 및 버튼 숨김
$('#editButton').on('click', function() {
$('#editButton').hide();
$('#inputContainer').show();
$('#workdate').text('<?php echo $todayStr; ?>');
$('#chargedDiv').show();
});
// '취소' 버튼 클릭 시 원래 상태로 되돌림
$('#cancelButton').on('click', function() {
$('#inputContainer').hide();
$('#chargedDiv').hide();
$('#workdate').text('');
$('#editButton').show();
});
});
</script>
</tbody>
</table>
</div>
<div class="row justify-content-start m-1 mt-2">
<table id="mainTable" class="table table-hover" style="border-collapse: collapse;">
<thead>
<tr>
<th class="text-center align-middle" rowspan="2">NO</th>
<th class="text-center align-middle" rowspan="2" colspan="2">검사항목</th>
<th class="text-center align-middle" rowspan="2" colspan="2">검사기준</th>
<th class="text-center align-middle" rowspan="2">검사방식</th>
<th class="text-center align-middle" rowspan="2">검사주기</th>
<th class="text-center align-middle" colspan="3">측정치</th>
<th class="text-center align-middle" rowspan="2">판정 <br> (적/부)</th>
</tr>
<tr>
<th class="text-center">n1 <br> 양호/불량 </th>
<th class="text-center">n2 <br> 양호/불량 </th>
<th class="text-center">n3 <br> 양호/불량 </th>
</tr>
</thead>
<tbody>
<!-- 첫 번째 행 (겉모양) -->
<tr>
<td class="text-center align-middle">1</td>
<td class="text-center align-middle" colspan="2">겉모양</td>
<td class="text-center align-middle" colspan="2">사용상 해로울 <br> 결함이 없을 것</td>
<td class="text-center align-middle">육안검사</td>
<td class="text-center align-middle" rowspan="4">n = 3 <br>c = 0</td>
<td class="text-center align-middle">
<label>
<input type="checkbox" class="check-good"> OK
</label>
<label>
<input type="checkbox" class="check-bad"> NG
</label>
</td>
<td class="text-center align-middle">
<label>
<input type="checkbox" class="check-good"> OK
</label>
<label>
<input type="checkbox" class="check-bad"> NG
</label>
</td>
<td class="text-center align-middle">
<label>
<input type="checkbox" class="check-good"> OK
</label>
<label>
<input type="checkbox" class="check-bad"> NG
</label>
</td>
<td class="text-center align-middle judgement"></td>
</tr>
<?php
// 두께 범위에 맞는 체크된 사각형을 표시하는 함수
function renderCheckBox($min, $max, $value) {
if ($value >= $min && $value < $max) {
return '✅'; // 체크된 사각형
} else {
return '□'; // 빈 사각형
}
}
// 길이 범위에 맞는 체크된 사각형을 표시하는 함수
function renderLengthCheckBox($min, $max, $length) {
if ($length >= $min && $length < $max) {
return '✅'; // 체크된 사각형
} else {
return '□'; // 빈 사각형
}
}
?>
<!-- 두 번째 행 (치수) -->
<tr>
<td class="text-center align-middle" rowspan="3">2</td>
<td class="text-center align-middle" rowspan="3">치수</td>
<td class="text-center align-middle" rowspan="2">
두께
<input type="text" class="form-control text-center noborder-input inputItem" id="input_thickness" name="input_thickness" value="<?=$thickness?>" autocomplete="off">
</td>
<!-- 0.8 이상 ~ 1.0 미만 범위 체크 -->
<td class="text-center align-middle"> <?= renderCheckBox(1.0, 1.25, $thickness) ?> 1.0 이상 <br> ~ 1.25 미만</td>
<td class="text-center align-middle"> ± 0.10 </td>
<td class="text-center align-middle" rowspan="3">체크검사</td>
<td class="text-center align-middle" rowspan="2">
<input type="text" class="form-control text-center noborder-input inputItem" id="record_thickness1" name="record_thickness1" value="" autocomplete="off">
</td>
<td class="text-center align-middle" rowspan="2">
<input type="text" class="form-control text-center noborder-input inputItem" id="record_thickness2" name="record_thickness2" value="" autocomplete="off">
</td>
<td class="text-center align-middle" rowspan="2">
<input type="text" class="form-control text-center noborder-input inputItem" id="record_thickness3" name="record_thickness3" value="" autocomplete="off">
</td>
<td class="text-center align-middle judgement" rowspan="2"></td>
</tr>
<tr>
<td class="text-center align-middle"> <?= renderCheckBox(1.25, 1.6, $thickness) ?> 1.25 이상 <br> ~ 1.6 미만</td>
<td class="text-center align-middle"> ± 0.12 </td>
</tr>
<!-- 너비 검사 -->
<tr>
<td class="text-center align-middle" rowspan="1">
너비
<input type="text" class="form-control text-center noborder-input inputItem" id="input_width" name="input_width" value="<?=$width?>" autocomplete="off">
</td>
<td class="text-center align-middle">✅ 1250 미만</td>
<td class="text-center align-middle"> + 7 <br> - 0 </td>
<td class="text-center align-middle" rowspan="1">
<input type="text" class="form-control text-center noborder-input inputItem" id="record_widh1" name="record_widh1" value="" autocomplete="off">
</td>
<td class="text-center align-middle" rowspan="1">
<input type="text" class="form-control text-center noborder-input inputItem" id="record_widh2" name="record_widh2" value="" autocomplete="off">
</td>
<td class="text-center align-middle" rowspan="1">
<input type="text" class="form-control text-center noborder-input inputItem" id="record_widh3" name="record_widh3" value="" autocomplete="off">
</td>
<td class="text-center align-middle judgement"></td>
</tr>
<!-- 인장강도 -->
<tr>
<td class="text-center align-middle">3</td>
<td class="text-center align-middle" colspan="2">항복강도 (N/㎟)</td>
<td class="text-center align-middle" colspan="2">205 이상</td>
<td class="text-center align-middle" rowspan="4">공급업체 <br> 밀시트</td>
<td class="text-center align-middle" rowspan="4">입고시</td>
<td class="text-center align-middle" colspan="3">
<input type="text" class="form-control text-center noborder-input inputItem" id="yield_strength" name="yield_strength" autocomplete="off">
</td>
<td class="text-center align-middle judgement"></td>
</tr>
<!-- 인장 강도 -->
<tr>
<td class="text-center align-middle" rowspan="1">4</td>
<td class="text-center align-middle" colspan="2" rowspan="1">인장 강도 (N/㎟)</td>
<td class="text-center align-middle" colspan="2">520 이상 </td>
<td class="text-center align-middle" rowspan="1" colspan="3">
<input type="text" class="form-control text-center noborder-input inputItem" id="tensile_strength" name="tensile_strength" autocomplete="off">
</td>
<td class="text-center align-middle judgement" rowspan="1"></td>
</tr>
<!-- 연신율 -->
<tr>
<td class="text-center align-middle" rowspan="1">5</td>
<td class="text-center align-middle" colspan="2" rowspan="1">연신율 <br> %</td>
<td class="text-center align-middle" colspan="2">40 이상</td>
<td class="text-center align-middle" rowspan="1" colspan="3">
<input type="text" class="form-control text-center noborder-input inputItem" id="elongation" name="elongation" autocomplete="off">
</td>
<td class="text-center align-middle judgement" rowspan="1"></td>
</tr>
<!-- 경도 -->
<tr>
<td class="text-center align-middle">6</td>
<td class="text-center align-middle" colspan="2"> 경도 (HV)</td>
<td class="text-center align-middle" colspan="2"> 200 이하</td>
<td class="text-center align-middle" colspan="3" >
<input type="text" class="form-control text-center noborder-input inputItem" id="hardness" name="hardness" autocomplete="off">
</td>
<td class="text-center align-middle judgement" ></td>
</tr>
<!-- 종합판정 -->
<tr>
<td colspan="8" rowspan="4" class="text-center align-top">
<div class="text-start fw-bold mt-1">
<span># 1.55mm의 경우 KS F 4510에 따른 MIN 15의 기준에 따름</span><br>
<span># 두께의 경우 너비 1000 이상 ~ 1250 미만 기준에 따름</span>
<br><br>
<span>[부적합 내용]</span> <br>
<span>
<input type="text" class="form-control text-start inputItem noborder-input" id="input_memo" name="input_memo" autocomplete="off">
&nbsp;</span>
</div>
</td>
<td colspan="3" class="text-center align-middle yellowredBold">
<div class="d-flex justify-content-center align-items-center fw-bold">
<span class="text-dark">종합판정</span>
</div>
</td>
</tr>
<tr>
<td colspan="3" rowspan="3" class="text-center align-middle">
<div class="text-center fw-bold mt-3 fs-1 ">
<input type="text" class="form-control fs-2 text-center inputItem noborder-input" style="height:50px;" id="resultJudgement" name="resultJudgement" autocomplete="off">
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</form>
</div> <!-- end of container -->
<div class="container mb-5 mt-2">
<div class="d-flex align-items-center justify-content-center mb-5">
</div>
</div>
<!-- 페이지로딩 -->
<script>
$(document).ready(function(){
var loader = document.getElementById('loadingOverlay');
if(loader)
loader.style.display = 'none';
});
function generatePDF() {
var workplace = '<?php echo $title_message; ?>';
var deadline = '<?php echo $today; ?>';
var deadlineDate = new Date(deadline);
var formattedDate = "(" + String(deadlineDate.getFullYear()).slice(-2) + "." + ("0" + (deadlineDate.getMonth() + 1)).slice(-2) + "." + ("0" + deadlineDate.getDate()).slice(-2) + ")";
var result = 'KD' + workplace +'_' + formattedDate + '.pdf';
var element = document.getElementById('content-to-print');
var opt = {
margin: [10, 3, 12, 3], // Top, right, bottom, left margins
filename: result,
image: { type: 'jpeg', quality: 0.98 },
html2canvas: { scale: 1 },
jsPDF: { unit: 'mm', format: 'a4', orientation: 'portrait' },
pagebreak: { mode: [''] }
};
html2pdf().from(element).set(opt).save();
}
// 모달을 호출할 때 tr 요소를 저장하는 변수
var selectedRow;
$(document).on('click', '.saveData', function() {
saveData();
});
$(document).on('click', '.approvalBtn', function() {
// 승인자의 이름과 오늘 날짜 가져오기
const userName = '<?=$user_name?>'; // PHP로부터 가져온 사용자 이름
const todayStr = '<?=$todayStr?>'; // PHP로부터 가져온 오늘 날짜
// 승인 정보를 approvalDiv에 표시
$('#approvalDiv').html(
userName + '<br>' + todayStr +
' <i class="bi bi-x-circle remove-approval" style="cursor: pointer;"></i>'
);
$('#approvalDiv').show();
// 결재 정보를 업데이트하여 저장 로직에 반영
updateApprovalData(userName, todayStr);
saveData();
});
// 결재 정보 업데이트 함수
function updateApprovalData(userName, date) {
// 저장 로직을 위해 결재 정보 업데이트
let approvalData = {
writer: {
name: $('#orderman').text().trim(),
date: '<?=$indateStr?>'
},
reviewer: {
name: $('#reviewDiv').is(':visible') ? '<?=$user_name?>' : '',
date: '<?=$todayStr?>'
},
approver: {
name: userName,
date: date
}
};
// 저장할 JSON 데이터 업데이트
let formData = JSON.parse($('#iList').val() || '[]');
const approvalIndex = formData.findIndex(item => item.approval);
if (approvalIndex !== -1) {
formData[approvalIndex].approval = approvalData;
} else {
formData.push({ approval: approvalData });
}
// JSON 문자열로 다시 저장
$('#iList').val(JSON.stringify(formData));
}
// 결재 취소 기능
$(document).on('click', '.remove-approval', function() {
// 결재 정보를 지우고 화면에서 숨김
$('#approvalDiv').html('').hide();
// JSON 데이터에서 결재자의 정보 제거
let formData = JSON.parse($('#iList').val() || '[]');
const approvalIndex = formData.findIndex(item => item.approval);
if (approvalIndex !== -1) {
formData[approvalIndex].approval.approver.name = '';
formData[approvalIndex].approval.approver.date = '';
}
// JSON 문자열로 다시 저장
$('#iList').val(JSON.stringify(formData));
Toastify({
text: "결재 정보가 삭제되었습니다.",
duration: 2000,
close: true,
gravity: "top",
position: "center",
style: {
background: "linear-gradient(to right, #ff5f6d, #ffc371)"
},
}).showToast();
saveData();
});
function captureReturnKey(e) {
if(e.keyCode==13 && e.srcElement.type != 'textarea')
return false;
}
function recaptureReturnKey(e) {
if(e.keyCode==13 && e.srcElement.type != 'textarea')
return false;
}
// 삽입/수정하는 모듈
function saveData() {
// json 형태로 form문에 저장하기
let formData = [];
// 결재 부분 정보 저장
let approvalData = {
writer: {
name: $('#chargedDiv').is(':visible') ? '<?=$user_name?>' : '',
date: '<?=$indateStr?>'
},
approver: {
name: $('#approvalDiv').is(':visible') ? '<?=$user_name?>' : '',
date: '<?=$todayStr?>'
}
};
formData.push({ approval: approvalData });
// 검사자 정보 저장
let productionManager = $('#userNameInput').val();
formData.push({ productionManager: productionManager });
// 추가 정보 저장
formData.push({ num: $('#num').val() });
formData.push({ update_log: $('#update_log').val() });
formData.push({ memo: $('#memo').val() });
// Class 'inputItem' 값 저장
let inputItems = {};
$('.inputItem').each(function() {
let inputName = $(this).attr('name');
inputItems[inputName] = $(this).val();
});
formData.push({ inputItems: inputItems });
// 체크박스 상태 저장
let checkboxData = [];
$('#mainTable tbody tr').each(function(index) {
let rowCheckboxes = {
good: [],
bad: [],
judgement: $(this).find('.judgement').text()
};
$(this).find('.check-good').each(function() {
rowCheckboxes.good.push($(this).prop('checked'));
});
$(this).find('.check-bad').each(function() {
rowCheckboxes.bad.push($(this).prop('checked'));
});
checkboxData.push(rowCheckboxes);
});
formData.push({ checkboxData: checkboxData });
// JSON 문자열로 변환
let jsonString = JSON.stringify(formData);
// 숨겨진 필드에 JSON 데이터 설정
$('#iList').val(jsonString);
$("#overlay").show(); // 오버레이 표시
$("button").prop("disabled", true); // 모든 버튼 비활성화
// 폼데이터 전송시 사용함 Get form
var form = $('#board_form')[0];
var datasource = new FormData(form);
showMsgModal(2); // 파일저장중
$.ajax({
enctype: 'multipart/form-data',
processData: false,
contentType: false,
cache: false,
timeout: 600000,
url: "insert_iList.php",
type: "post",
data: datasource,
dataType: "json",
success: function(data) {
console.log(data);
setTimeout(function() {
Toastify({
text: "저장완료",
duration: 3000,
close: true,
gravity: "top",
position: "center",
style: {
background: "linear-gradient(to right, #00b09b, #96c93d)"
},
}).showToast();
saveAndClose(); //부모창 변경
hideMsgModal();
$("button").prop("disabled", false); // 모든 버튼 활성화
}, 1000);
$("#overlay").hide(); // 오버레이 숨김
},
error: function(jqxhr, status, error) {
console.log(jqxhr, status, error);
alert("An error occurred: " + error);
}
});
}
// 팝업 창에서 데이터 저장 및 닫기 함수
function saveAndClose() {
const updatedData = {
resultJudgement: $("#resultJudgement").val(),
// 필요한 다른 필드도 여기에 추가할 수 있습니다.
};
// 부모 창의 함수 호출
if (window.opener && typeof window.opener.closePopupAndUpdateRow === 'function') {
window.opener.closePopupAndUpdateRow(updatedData);
} else {
console.error("Parent window function not found");
}
// 팝업 창 닫기
// window.close();
}
// 초기값 불러오기
$(document).ready(function() {
console.log(iListData);
if (iListData.length > 0) {
// 결재 부분 정보
const approval = iListData.find(item => item.approval);
if (approval) {
if (approval.approval.writer.name && approval.approval.writer.date) {
$('#chargedDiv').show();
$('#chargedDiv').html(
approval.approval.writer.name + '<br>' + approval.approval.writer.date
);
} else {
$('#chargedDiv').hide().html('');
}
if (approval.approval.approver.name && approval.approval.approver.date) {
$('#approvalDiv').show();
$('#approvalDiv').html(
approval.approval.approver.name + '<br>' + approval.approval.approver.date +
' <i class="bi bi-x-circle remove-approval" style="cursor: pointer;"></i>'
);
} else {
$('#approvalDiv').hide().html('');
}
$('#workdate').text(approval.approval.writer.date);
}
// 검사자 정보
const productionManager = iListData.find(item => item.productionManager);
if (productionManager && productionManager.productionManager) {
$('#userNameInput').val(productionManager.productionManager).show();
$('#inputContainer').show();
$('#editButton').hide();
} else {
$('#userNameInput').val('');
$('#inputContainer').hide();
$('#editButton').show();
}
// inputItem 데이터 로드
const inputItems = iListData.find(item => item.inputItems);
if (inputItems && inputItems.inputItems) {
for (const [name, value] of Object.entries(inputItems.inputItems)) {
$(`.inputItem[name="${name}"]`).val(value);
}
}
// 체크박스 상태 로드
const checkboxData = iListData.find(item => item.checkboxData);
if (checkboxData && checkboxData.checkboxData) {
$('#mainTable tbody tr').each(function(index) {
const rowData = checkboxData.checkboxData[index];
if (rowData) {
$(this).find('.check-good').each(function(goodIndex) {
$(this).prop('checked', rowData.good[goodIndex]);
});
$(this).find('.check-bad').each(function(badIndex) {
$(this).prop('checked', rowData.bad[badIndex]);
});
$(this).find('.judgement').text(rowData.judgement);
}
});
}
}
});
// 첫번째 요소를 클릭하면 전체 로트번호 적용하기
$(document).ready(function() {
// id가 mainTable인 테이블의 첫 번째 td를 클릭했을 때 이벤트를 등록합니다.
$('#mainTable').on('click', 'td:first-child', function() {
// 클릭한 첫 번째 td의 형제인 두 번째 td 요소의 값을 가져옵니다.
var secondTdValue = $(this).siblings().find('input').val();
// id가 mainTable인 테이블에서 두 번째 td 요소에 해당 값을 적용합니다.
$('#mainTable tbody tr').each(function() {
$(this).find('td:nth-child(2) input').val(secondTdValue);
});
});
});
// 부트스트랩 툴팁
$(document).ready(function() {
var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]'));
var tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) {
return new bootstrap.Tooltip(tooltipTriggerEl);
});
});
</script>
<script>
$(document).ready(function() {
var thickness = <?= isset($thickness) ? $thickness : 'null' ?>;
var width = <?= isset($width) ? $width : 'null' ?>;
var yield_strength = <?= isset($yield_strength) ? $yield_strength : 'null' ?>;
var tensile_strength = <?= isset($tensile_strength) ? $tensile_strength : 'null' ?>;
var elongation = <?= isset($elongation) ? $elongation : 'null' ?>;
var hardness = <?= isset($hardness) ? $hardness : 'null' ?>;
console.log('thickness',thickness);
console.log('width',width);
$('#mainTable tbody tr').each(function() {
var $row = $(this);
var $judgementCell = $row.find('.judgement');
function updateJudgement() {
var isValidThickness = true;
var isValidWidth = true;
var isValidYieldStrength = true;
var isValidTensileStrength = true;
var isValidElongation = true;
var isValidHardness = true;
var allFieldsFilled = true;
// 두께 허용 범위 설정
var thicknessTolerance;
if (thickness >= 1.0 && thickness < 1.25) {
thicknessTolerance = 0.10;
} else if (thickness >= 1.25 && thickness < 1.6) {
thicknessTolerance = 0.12;
}
// 두께 비교
$row.find('input[name^="record_thickness"]').each(function() {
var value = parseFloat($(this).val());
if (isNaN(value)) {
allFieldsFilled = false;
return false;
}
var lowerLimit = thickness - thicknessTolerance;
var upperLimit = thickness + thicknessTolerance;
if (value < lowerLimit || value > upperLimit) {
isValidThickness = false;
}
});
// 너비 허용 범위는 +7 ~ 0
$row.find('input[name^="record_widh"]').each(function() {
var value = parseFloat($(this).val());
if (isNaN(value)) {
allFieldsFilled = false;
return false;
}
var lowerLimit = width;
var upperLimit = width + 7;
if (value < lowerLimit || value > upperLimit) {
isValidWidth = false;
}
});
// 항복강도 비교
$row.find('input[name="yield_strength"]').each(function() {
var value = parseFloat($(this).val());
if (isNaN(value)) {
allFieldsFilled = false;
return false;
}
if (value < 205) {
isValidYieldStrength = false;
}
});
// 인장강도 비교
$row.find('input[name="tensile_strength"]').each(function() {
var value = parseFloat($(this).val());
if (isNaN(value)) {
allFieldsFilled = false;
return false;
}
if (value < 520) {
isValidTensileStrength = false;
}
});
// 연신율 비교
$row.find('input[name="elongation"]').each(function() {
var value = parseFloat($(this).val());
if (isNaN(value)) {
allFieldsFilled = false;
return false;
}
if (value < 40) {
isValidElongation = false;
}
});
// 경도 비교
$row.find('input[name="hardness"]').each(function() {
var value = parseFloat($(this).val());
if (isNaN(value)) {
allFieldsFilled = false;
return false;
}
if (value > 200) {
isValidHardness = false;
}
});
// OK/NG 체크박스 상태 검사
var allGood = true;
var anyBad = false;
// 해당 행에 OK 체크박스가 있는지 확인
if ($row.find('.check-good').length > 0) {
$row.find('.check-good').each(function() {
// 체크박스가 undefined이거나 제대로 체크되지 않으면 필드가 채워지지 않은 것으로 판단
if (isNaN($(this).is(':checked'))) {
allFieldsFilled = false;
return false;
}
if (!$(this).is(':checked')) {
allGood = false;
}
});
}
// 해당 행에 NG 체크박스가 있는지 확인
if ($row.find('.check-bad').length > 0) {
$row.find('.check-bad').each(function() {
if (isNaN($(this).is(':checked'))) {
allFieldsFilled = false;
return false;
}
if ($(this).is(':checked')) {
anyBad = true;
}
});
}
// OK/NG 체크박스 상태 검사
var checkedGood = 0; // 체크된 OK 체크박스 수
var checkedBad = 0; // 체크된 NG 체크박스 수
// 각 열의 OK/NG 체크박스를 한 번만 확인하도록 변경
var goodChecks = $row.find('.check-good');
var badChecks = $row.find('.check-bad');
// 해당 행에 OK 체크박스가 있는지 확인
if (goodChecks.length > 0) {
goodChecks.each(function() {
if ($(this).is(':checked')) {
checkedGood++; // OK 체크박스가 체크되면 증가
}
});
}
// 해당 행에 NG 체크박스가 있는지 확인
if (badChecks.length > 0) {
badChecks.each(function() {
if ($(this).is(':checked')) {
checkedBad++; // NG 체크박스가 체크되면 증가
}
});
}
// 모든 체크박스가 다 체크되지 않았다면 공백으로 처리
if (checkedGood + checkedBad !== 3 && (goodChecks.length > 0 || badChecks.length > 0)) {
allFieldsFilled = false; // 모두 체크되지 않았다면 공백 표시
}
// 결과 출력
console.log('isValidThickness:', isValidThickness);
console.log('isValidWidth:', isValidWidth);
console.log('allGood:', allGood);
console.log('anyBad:', anyBad);
// 모든 필드가 채워지지 않았으면 공백으로 설정
if (!allFieldsFilled) {
$judgementCell.text('');
} else {
// 판정 업데이트
if (isValidThickness && isValidWidth && isValidYieldStrength && isValidTensileStrength && isValidElongation && isValidHardness && allGood && !anyBad ) {
$judgementCell.text('적');
} else {
$judgementCell.text('부');
}
}
}
// 페이지 로드 시 초기 판단
updateJudgement();
// 체크박스 토글
$row.find('td').each(function() {
var $goodCheck = $(this).find('.check-good');
var $badCheck = $(this).find('.check-bad');
$goodCheck.on('change', function() {
if ($(this).is(':checked')) {
$badCheck.prop('checked', false);
}
updateJudgement();
updateFinalJudgement();
});
$badCheck.on('change', function() {
if ($(this).is(':checked')) {
$goodCheck.prop('checked', false);
}
updateJudgement();
updateFinalJudgement();
});
});
// input 값 변경 시 판정 업데이트
$row.find('input').on('input', updateJudgement);
$row.find('input').on('input', updateFinalJudgement);
});
// 최종 종합 판정 업데이트 함수
function updateFinalJudgement() {
var allPass = true;
var allJudged = true;
$('#mainTable tbody tr .judgement').each(function() {
var judgementText = $(this).text();
if (judgementText === '') {
allJudged = false;
}
if (judgementText === '부') {
allPass = false;
// '부'인 경우 해당 td의 배경색을 옅은 붉은 색으로 변경
$(this).css('background-color', '#f8d7da'); // 옅은 붉은 색
} else {
// '적'인 경우 배경색을 기본으로 설정
$(this).css('background-color', ''); // 기본 배경색 (없음)
}
});
if (allJudged) {
if (allPass) {
$('#resultJudgement').val('합격');
} else {
$('#resultJudgement').val('불합격');
}
} else {
$('#resultJudgement').val('');
}
console.log('allJudged', allJudged);
console.log('allPass', allPass);
}
// 페이지 로드 시 최종 판정 업데이트
updateFinalJudgement();
});
</script>
<?php require_once $_SERVER['DOCUMENT_ROOT'] . '/' . $tablename . '/common/JS_instock.php'; ?> <!-- instock 후반부 공통 JS -->
</body>
</html>

1021
instock/i_SUSplate.php Normal file

File diff suppressed because it is too large Load Diff

1030
instock/i_angle.php Normal file

File diff suppressed because it is too large Load Diff

1036
instock/i_anglebottom.php Normal file

File diff suppressed because it is too large Load Diff

1352
instock/i_antifireglass.php Normal file

File diff suppressed because it is too large Load Diff

978
instock/i_bendingcoil.php Normal file
View File

@@ -0,0 +1,978 @@
<?php
$tablename = 'instock';
?>
<?php include $_SERVER['DOCUMENT_ROOT'] . '/' . $tablename . '/common/head.php' ; ?> <!-- head 정보 불러오기 -->
<?php
$item_name = isset($row['item_name']) ? $row['item_name'] : '';
$itemTitle = '전기 아연도금 강대 <br>
(KS D 3528, SECC) "EGI 절곡코일"';
// 두께(thickness) 추출
if (preg_match('/(\d+\.\d+)T/', $spec, $matches_thickness)) {
$thickness = $matches_thickness[1]; // 두께 값 추출
}
// 너비(width) 추출 (소수점 포함)
if (preg_match('/W(\d+(\.\d+)?)/', $spec, $matches_width)) {
$width = $matches_width[1]; // 너비 값 추출
}
// 추출한 너비와 길이로 $spec 값 설정
$spec = $thickness . ' * ' . $width ;
$today = date("Y-m-d");
require_once $_SERVER['DOCUMENT_ROOT'] . '/instock/commonDriveLoad.php'; // 구글드라이브 파일형태 이미지형태 읽어오기 모듈
$savetitle ='수입검사성적서';
?>
<?php include $_SERVER['DOCUMENT_ROOT'] . '/' . $tablename . '/common/instock_btn.php'; ?> <!-- Btn 정보 불러오기 -->
<div id="content-to-print">
<br>
<div class="container mt-3">
<div class="d-flex align-items-center justify-content-center m-1">
<table class="table " style="border-collapse: collapse;">
<thead>
<tr>
<th rowspan="3" class="text-center" style="width:70%;">
<div class="row">
<div class="col-sm-2">
<img src="../img/kdlogo.png" alt="경동기업" class="me-1" style="width:100%; height:auto;">
</div>
<div class="col-sm-10">
<div class="d-flex align-items-center justify-content-center m-1">
<span class="text-dark ms-1 me-1 fs-2" > &nbsp; 수 </span>
<span class="text-dark me-1 fs-2" > &nbsp; 입 </span>
<span class="text-dark me-1 fs-2" > &nbsp; 검 </span>
<span class="text-dark me-1 fs-2" > &nbsp; 사 </span>
<span class="text-dark me-1 fs-2" > &nbsp; </span>
<span class="text-dark me-1 fs-2" > &nbsp; 성 </span>
<span class="text-dark me-1 fs-2" > &nbsp; 적 </span>
<span class="text-dark me-1 fs-2" > &nbsp; 서 </span>
</div>
</div>
</div>
</th>
<th rowspan="3" class="text-center fw-bold" style="height:100px;">결 재</th>
<th class="text-center p-1" style="width : 100px; height:22px; padding:2px;">담당</th>
<th class="text-center p-1" style="width : 100px; height:22px; padding:2px;">부서장</th>
</tr>
<tr style="height:40px;">
<th class="text-center">
<div id="chargedDiv" style="display: none;">
<span id="orderman"> <?=$orderman?> </span> <br> <?=$indateStr ?>
</div>
</th>
<th class="text-center">
<div id="approvalDiv" style="display: none;">
<?=$user_name?> <br> <?=$todayStr ?>
</div>
</th>
</tr>
<tr>
<th colspan="2"> 입고일자 : <?=$inspection_date?></th>
</tr>
</thead>
</table>
</div>
<div class="d-flex align-items-center justify-content-center m-1">
<table class="table table-bordered" style="border-collapse: collapse;">
<tbody>
<tr>
<td class="text-center align-middle lightgray">품 명</td>
<td colspan="2" class="text-center fw-bold"><?=$itemTitle?></td>
<td class="text-center align-middle lightgray">납품업체<br>제조업체</td>
<td class="text-center text-primary fw-bold"><?=$supplier?> <br> (<?=$manufacturer?>) </td>
</tr>
<tr>
<td class="text-center align-middle lightgray">규 격<br>(두께*너비) </td>
<td colspan="2" class="text-center fw-bold"><?=$spec?></td>
<td class="text-center align-middle lightgray">로트번호</td>
<td colspan="1" class="text-center text-primary fw-bold">
<?=$lot_no?>
</td>
</tr>
<tr>
<td class="text-center align-middle lightgray">자재번호</td>
<td colspan="2" class="text-center fw-bold"><?=$material_no?></td>
<td class="text-center align-middle lightgray">검사일자</td>
<td colspan="1" class="text-center text-primary fw-bold">
<?=$indateStr?>
</td>
</tr>
<tr>
<td class="text-center align-middle lightgray">로트크기</td>
<td class="text-center text-dark fw-bold"><?=$received_qty?> </td>
<td class="text-center text-dark fw-bold"><?=$unit?> </td>
<td class="text-center align-middle lightgray">검사자</td>
<td class="text-center">
<div class="d-flex justify-content-center">
<button type="button" id="editButton" class="btn btn-primary btn-sm">검사자</button>
<div id="inputContainer" style="display: none;">
<input type="text" id="userNameInput" class="form-control d-inline-block noborder-input text-center" style="width:100px;" autocomplete="off" style="widtd: 100px;" value="<?=$user_name?>">
<button type="button" id="cancelButton" class="btn btn-outline-danger btn-sm"> <i class="bi bi-x"> </i> </button>
</div>
</div>
</td>
</tr>
<script>
$(document).ready(function() {
// '담당자 입력' 버튼 클릭 시 input 표시 및 버튼 숨김
$('#editButton').on('click', function() {
$('#editButton').hide();
$('#inputContainer').show();
$('#workdate').text('<?php echo $todayStr; ?>');
$('#chargedDiv').show();
});
// '취소' 버튼 클릭 시 원래 상태로 되돌림
$('#cancelButton').on('click', function() {
$('#inputContainer').hide();
$('#chargedDiv').hide();
$('#workdate').text('');
$('#editButton').show();
});
});
</script>
</tbody>
</table>
</div>
<div class="row justify-content-start m-1 mt-2">
<table id="mainTable" class="table table-hover" style="border-collapse: collapse;">
<thead>
<tr>
<th class="text-center align-middle" rowspan="2">NO</th>
<th class="text-center align-middle" rowspan="2" colspan="2">검사항목</th>
<th class="text-center align-middle" rowspan="2" colspan="2">검사기준</th>
<th class="text-center align-middle" rowspan="2">검사방식</th>
<th class="text-center align-middle" rowspan="2">검사주기</th>
<th class="text-center align-middle" colspan="3">측정치</th>
<th class="text-center align-middle" rowspan="2">판정 <br> (적/부)</th>
</tr>
<tr>
<th class="text-center">n1 <br> 양호/불량 </th>
<th class="text-center">n2 <br> 양호/불량 </th>
<th class="text-center">n3 <br> 양호/불량 </th>
</tr>
</thead>
<tbody>
<!-- 첫 번째 행 (겉모양) -->
<tr>
<td class="text-center align-middle">1</td>
<td class="text-center align-middle" colspan="2">겉모양</td>
<td class="text-center align-middle" colspan="2">사용상 해로울 <br> 결함이 없을 것</td>
<td class="text-center align-middle">육안검사</td>
<td class="text-center align-middle" rowspan="5">n = 3 <br>c = 0</td>
<td class="text-center align-middle">
<label>
<input type="checkbox" class="check-good"> OK
</label>
<label>
<input type="checkbox" class="check-bad"> NG
</label>
</td>
<td class="text-center align-middle">
<label>
<input type="checkbox" class="check-good"> OK
</label>
<label>
<input type="checkbox" class="check-bad"> NG
</label>
</td>
<td class="text-center align-middle">
<label>
<input type="checkbox" class="check-good"> OK
</label>
<label>
<input type="checkbox" class="check-bad"> NG
</label>
</td>
<td class="text-center align-middle judgement"></td>
</tr>
<?php
// 두께 범위에 맞는 체크된 사각형을 표시하는 함수
function renderCheckBox($min, $max, $value) {
if ($value >= $min && $value < $max) {
return '✅'; // 체크된 사각형
} else {
return '□'; // 빈 사각형
}
}
// 길이 범위에 맞는 체크된 사각형을 표시하는 함수
function renderLengthCheckBox($min, $max, $length) {
if ($length >= $min && $length < $max) {
return '✅'; // 체크된 사각형
} else {
return '□'; // 빈 사각형
}
}
?>
<!-- 두 번째 행 (치수) -->
<tr>
<td class="text-center align-middle" rowspan="4">2</td>
<td class="text-center align-middle" rowspan="4">치수</td>
<td class="text-center align-middle" rowspan="3">
두께
<input type="text" class="form-control text-center noborder-input inputItem" id="input_thickness" name="input_thickness" value="<?=$thickness?>" autocomplete="off">
</td>
<!-- 0.8 이상 ~ 1.0 미만 범위 체크 -->
<td class="text-center align-middle"> <?= renderCheckBox(0.8, 1.0, $thickness) ?> 0.8 이상 <br> ~ 1.0 미만</td>
<td class="text-center align-middle"> ± 0.07 </td>
<td class="text-center align-middle" rowspan="4">체크검사</td>
<td class="text-center align-middle" rowspan="3">
<input type="text" class="form-control text-center noborder-input inputItem" id="record_thickness1" name="record_thickness1" value="" autocomplete="off">
</td>
<td class="text-center align-middle" rowspan="3">
<input type="text" class="form-control text-center noborder-input inputItem" id="record_thickness2" name="record_thickness2" value="" autocomplete="off">
</td>
<td class="text-center align-middle" rowspan="3">
<input type="text" class="form-control text-center noborder-input inputItem" id="record_thickness3" name="record_thickness3" value="" autocomplete="off">
</td>
<td class="text-center align-middle judgement" rowspan="3"></td>
</tr>
<tr>
<!-- 1.0 이상 ~ 1.25 미만 범위 체크 -->
<td class="text-center align-middle"> <?= renderCheckBox(1.0, 1.25, $thickness) ?> 1.0 이상 <br> ~ 1.25 미만</td>
<td class="text-center align-middle"> ± 0.08 </td>
</tr>
<tr>
<!-- 1.25 이상 ~ 1.6 미만 범위 체크 -->
<td class="text-center align-middle"> <?= renderCheckBox(1.25, 1.6, $thickness) ?> 1.25 이상 <br> ~ 1.6 미만</td>
<td class="text-center align-middle"> ± 0.10 </td>
</tr>
<!-- 너비 검사 -->
<tr>
<td class="text-center align-middle" rowspan="1">
너비
<input type="text" class="form-control text-center noborder-input inputItem" id="input_width" name="input_width" value="<?=$width?>" autocomplete="off">
</td>
<td class="text-center align-middle">✅ 1250 미만</td>
<td class="text-center align-middle"> + 7 <br> - 0 </td>
<td class="text-center align-middle" rowspan="1">
<input type="text" class="form-control text-center noborder-input inputItem" id="record_widh1" name="record_widh1" value="" autocomplete="off">
</td>
<td class="text-center align-middle" rowspan="1">
<input type="text" class="form-control text-center noborder-input inputItem" id="record_widh2" name="record_widh2" value="" autocomplete="off">
</td>
<td class="text-center align-middle" rowspan="1">
<input type="text" class="form-control text-center noborder-input inputItem" id="record_widh3" name="record_widh3" value="" autocomplete="off">
</td>
<td class="text-center align-middle judgement"></td>
</tr>
<!-- 인장강도 -->
<tr>
<td class="text-center align-middle">3</td>
<td class="text-center align-middle" colspan="2">인장강도 (N/㎟)</td>
<td class="text-center align-middle" colspan="2">270 이상</td>
<td class="text-center align-middle" rowspan="4">공급업체 <br> 밀시트</td>
<td class="text-center align-middle" rowspan="4">입고시</td>
<td class="text-center align-middle" colspan="3">
<input type="text" class="form-control text-center noborder-input inputItem" id="tensile_strength" name="tensile_strength" autocomplete="off">
</td>
<td class="text-center align-middle judgement"></td>
</tr>
<!-- 연신율 -->
<tr>
<td class="text-center align-middle" rowspan="2">4</td>
<td class="text-center align-middle" colspan="2" rowspan="2">연신율 <br> %</td>
<!-- 두께 0.6 이상 ~ 1.0 미만 범위 체크 -->
<td class="text-center align-middle"><?= renderCheckBox(0.6, 1.0, $thickness) ?> 두께 0.6 이상 <br> ~ 1.0 미만</td>
<td class="text-center align-middle">36 이상</td>
<td class="text-center align-middle" rowspan="2" colspan="3">
<input type="text" class="form-control text-center noborder-input inputItem" id="elongation" name="elongation" autocomplete="off">
</td>
<td class="text-center align-middle judgement" rowspan="2"></td>
</tr>
<tr>
<!-- 두께 1.0 이상 ~ 1.6 미만 범위 체크 -->
<td class="text-center align-middle"><?= renderCheckBox(1.0, 1.6, $thickness) ?> 두께 1.0 이상 <br> ~ 1.6 미만</td>
<td class="text-center align-middle">37 이상</td>
</tr>
<!-- 아연의 최소 부착량 -->
<tr>
<td class="text-center align-middle">5</td>
<td class="text-center align-middle" colspan="2">아연의 최소<br> 부착량 (g/㎡)</td>
<td class="text-center align-middle" colspan="2">한면 17 이상</td>
<td class="text-center align-middle" colspan="3" >
<input type="text" class="form-control text-center noborder-input inputItem" id="Zinc" name="Zinc" autocomplete="off">
</td>
<td class="text-center align-middle judgement" ></td>
</tr>
<!-- 종합판정 -->
<tr>
<td colspan="8" rowspan="4" class="text-center align-top">
<div class="text-start fw-bold mt-1">
<span># 1.55mm의 경우 KS F 4510에 따른 MIN 15의 기준에 따름</span><br>
<span># 두께의 경우 너비 1000 이상 ~ 1250 미만 기준에 따름</span>
<br><br>
<span>[부적합 내용]</span> <br>
<span>
<input type="text" class="form-control text-start inputItem noborder-input" id="input_memo" name="input_memo" autocomplete="off">
&nbsp;</span>
</div>
</td>
<td colspan="3" class="text-center align-middle yellowredBold">
<div class="d-flex justify-content-center align-items-center fw-bold">
<span class="text-dark">종합판정</span>
</div>
</td>
</tr>
<tr>
<td colspan="3" rowspan="3" class="text-center align-middle">
<div class="text-center fw-bold mt-3 fs-1 ">
<input type="text" class="form-control fs-2 text-center inputItem noborder-input" style="height:50px;" id="resultJudgement" name="resultJudgement" autocomplete="off">
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</form>
</div> <!-- end of container -->
<div class="container mb-5 mt-2">
<div class="d-flex align-items-center justify-content-center mb-5">
</div>
</div>
<!-- 페이지로딩 -->
<script>
$(document).ready(function(){
var loader = document.getElementById('loadingOverlay');
if(loader)
loader.style.display = 'none';
});
function generatePDF() {
var workplace = '<?php echo $title_message; ?>';
var deadline = '<?php echo $today; ?>';
var deadlineDate = new Date(deadline);
var formattedDate = "(" + String(deadlineDate.getFullYear()).slice(-2) + "." + ("0" + (deadlineDate.getMonth() + 1)).slice(-2) + "." + ("0" + deadlineDate.getDate()).slice(-2) + ")";
var result = 'KD' + workplace +'_' + formattedDate + '.pdf';
var element = document.getElementById('content-to-print');
var opt = {
margin: [10, 3, 12, 3], // Top, right, bottom, left margins
filename: result,
image: { type: 'jpeg', quality: 0.98 },
html2canvas: { scale: 1 },
jsPDF: { unit: 'mm', format: 'a4', orientation: 'portrait' },
pagebreak: { mode: [''] }
};
html2pdf().from(element).set(opt).save();
}
// 모달을 호출할 때 tr 요소를 저장하는 변수
var selectedRow;
$(document).on('click', '.saveData', function() {
saveData();
});
$(document).on('click', '.approvalBtn', function() {
// 승인자의 이름과 오늘 날짜 가져오기
const userName = '<?=$user_name?>'; // PHP로부터 가져온 사용자 이름
const todayStr = '<?=$todayStr?>'; // PHP로부터 가져온 오늘 날짜
// 승인 정보를 approvalDiv에 표시
$('#approvalDiv').html(
userName + '<br>' + todayStr +
' <i class="bi bi-x-circle remove-approval" style="cursor: pointer;"></i>'
);
$('#approvalDiv').show();
// 결재 정보를 업데이트하여 저장 로직에 반영
updateApprovalData(userName, todayStr);
saveData();
});
// 결재 정보 업데이트 함수
function updateApprovalData(userName, date) {
// 저장 로직을 위해 결재 정보 업데이트
let approvalData = {
writer: {
name: $('#orderman').text().trim(),
date: '<?=$indateStr?>'
},
reviewer: {
name: $('#reviewDiv').is(':visible') ? '<?=$user_name?>' : '',
date: '<?=$todayStr?>'
},
approver: {
name: userName,
date: date
}
};
// 저장할 JSON 데이터 업데이트
let formData = JSON.parse($('#iList').val() || '[]');
const approvalIndex = formData.findIndex(item => item.approval);
if (approvalIndex !== -1) {
formData[approvalIndex].approval = approvalData;
} else {
formData.push({ approval: approvalData });
}
// JSON 문자열로 다시 저장
$('#iList').val(JSON.stringify(formData));
}
// 결재 취소 기능
$(document).on('click', '.remove-approval', function() {
// 결재 정보를 지우고 화면에서 숨김
$('#approvalDiv').html('').hide();
// JSON 데이터에서 결재자의 정보 제거
let formData = JSON.parse($('#iList').val() || '[]');
const approvalIndex = formData.findIndex(item => item.approval);
if (approvalIndex !== -1) {
formData[approvalIndex].approval.approver.name = '';
formData[approvalIndex].approval.approver.date = '';
}
// JSON 문자열로 다시 저장
$('#iList').val(JSON.stringify(formData));
Toastify({
text: "결재 정보가 삭제되었습니다.",
duration: 2000,
close: true,
gravity: "top",
position: "center",
style: {
background: "linear-gradient(to right, #ff5f6d, #ffc371)"
},
}).showToast();
saveData();
});
function captureReturnKey(e) {
if(e.keyCode==13 && e.srcElement.type != 'textarea')
return false;
}
function recaptureReturnKey(e) {
if(e.keyCode==13 && e.srcElement.type != 'textarea')
return false;
}
// 삽입/수정하는 모듈
function saveData() {
// json 형태로 form문에 저장하기
let formData = [];
// 결재 부분 정보 저장
let approvalData = {
writer: {
name: $('#chargedDiv').is(':visible') ? '<?=$user_name?>' : '',
date: '<?=$indateStr?>'
},
approver: {
name: $('#approvalDiv').is(':visible') ? '<?=$user_name?>' : '',
date: '<?=$todayStr?>'
}
};
formData.push({ approval: approvalData });
// 검사자 정보 저장
let productionManager = $('#userNameInput').val();
formData.push({ productionManager: productionManager });
// 추가 정보 저장
formData.push({ num: $('#num').val() });
formData.push({ update_log: $('#update_log').val() });
formData.push({ memo: $('#memo').val() });
// Class 'inputItem' 값 저장
let inputItems = {};
$('.inputItem').each(function() {
let inputName = $(this).attr('name');
inputItems[inputName] = $(this).val();
});
formData.push({ inputItems: inputItems });
// 체크박스 상태 저장
let checkboxData = [];
$('#mainTable tbody tr').each(function(index) {
let rowCheckboxes = {
good: [],
bad: [],
judgement: $(this).find('.judgement').text()
};
$(this).find('.check-good').each(function() {
rowCheckboxes.good.push($(this).prop('checked'));
});
$(this).find('.check-bad').each(function() {
rowCheckboxes.bad.push($(this).prop('checked'));
});
checkboxData.push(rowCheckboxes);
});
formData.push({ checkboxData: checkboxData });
// JSON 문자열로 변환
let jsonString = JSON.stringify(formData);
// 숨겨진 필드에 JSON 데이터 설정
$('#iList').val(jsonString);
$("#overlay").show(); // 오버레이 표시
$("button").prop("disabled", true); // 모든 버튼 비활성화
// 폼데이터 전송시 사용함 Get form
var form = $('#board_form')[0];
var datasource = new FormData(form);
showMsgModal(2); // 파일저장중
$.ajax({
enctype: 'multipart/form-data',
processData: false,
contentType: false,
cache: false,
timeout: 600000,
url: "insert_iList.php",
type: "post",
data: datasource,
dataType: "json",
success: function(data) {
console.log(data);
setTimeout(function() {
Toastify({
text: "저장완료",
duration: 3000,
close: true,
gravity: "top",
position: "center",
style: {
background: "linear-gradient(to right, #00b09b, #96c93d)"
},
}).showToast();
saveAndClose(); //부모창 변경
hideMsgModal();
$("button").prop("disabled", false); // 모든 버튼 활성화
}, 1000);
$("#overlay").hide(); // 오버레이 숨김
},
error: function(jqxhr, status, error) {
console.log(jqxhr, status, error);
alert("An error occurred: " + error);
}
});
}
// 팝업 창에서 데이터 저장 및 닫기 함수
function saveAndClose() {
const updatedData = {
resultJudgement: $("#resultJudgement").val(),
// 필요한 다른 필드도 여기에 추가할 수 있습니다.
};
// 부모 창의 함수 호출
if (window.opener && typeof window.opener.closePopupAndUpdateRow === 'function') {
window.opener.closePopupAndUpdateRow(updatedData);
} else {
console.error("Parent window function not found");
}
// 팝업 창 닫기
// window.close();
}
// 초기값 불러오기
$(document).ready(function() {
console.log(iListData);
if (iListData.length > 0) {
// 결재 부분 정보
const approval = iListData.find(item => item.approval);
if (approval) {
if (approval.approval.writer.name && approval.approval.writer.date) {
$('#chargedDiv').show();
$('#chargedDiv').html(
approval.approval.writer.name + '<br>' + approval.approval.writer.date
);
} else {
$('#chargedDiv').hide().html('');
}
if (approval.approval.approver.name && approval.approval.approver.date) {
$('#approvalDiv').show();
$('#approvalDiv').html(
approval.approval.approver.name + '<br>' + approval.approval.approver.date +
' <i class="bi bi-x-circle remove-approval" style="cursor: pointer;"></i>'
);
} else {
$('#approvalDiv').hide().html('');
}
$('#workdate').text(approval.approval.writer.date);
}
// 검사자 정보
const productionManager = iListData.find(item => item.productionManager);
if (productionManager && productionManager.productionManager) {
$('#userNameInput').val(productionManager.productionManager).show();
$('#inputContainer').show();
$('#editButton').hide();
} else {
$('#userNameInput').val('');
$('#inputContainer').hide();
$('#editButton').show();
}
// inputItem 데이터 로드
const inputItems = iListData.find(item => item.inputItems);
if (inputItems && inputItems.inputItems) {
for (const [name, value] of Object.entries(inputItems.inputItems)) {
$(`.inputItem[name="${name}"]`).val(value);
}
}
// 체크박스 상태 로드
const checkboxData = iListData.find(item => item.checkboxData);
if (checkboxData && checkboxData.checkboxData) {
$('#mainTable tbody tr').each(function(index) {
const rowData = checkboxData.checkboxData[index];
if (rowData) {
$(this).find('.check-good').each(function(goodIndex) {
$(this).prop('checked', rowData.good[goodIndex]);
});
$(this).find('.check-bad').each(function(badIndex) {
$(this).prop('checked', rowData.bad[badIndex]);
});
$(this).find('.judgement').text(rowData.judgement);
}
});
}
}
});
// 첫번째 요소를 클릭하면 전체 로트번호 적용하기
$(document).ready(function() {
// id가 mainTable인 테이블의 첫 번째 td를 클릭했을 때 이벤트를 등록합니다.
$('#mainTable').on('click', 'td:first-child', function() {
// 클릭한 첫 번째 td의 형제인 두 번째 td 요소의 값을 가져옵니다.
var secondTdValue = $(this).siblings().find('input').val();
// id가 mainTable인 테이블에서 두 번째 td 요소에 해당 값을 적용합니다.
$('#mainTable tbody tr').each(function() {
$(this).find('td:nth-child(2) input').val(secondTdValue);
});
});
});
// 부트스트랩 툴팁
$(document).ready(function() {
var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]'));
var tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) {
return new bootstrap.Tooltip(tooltipTriggerEl);
});
});
</script>
<script>
$(document).ready(function() {
var thickness = <?= isset($thickness) ? $thickness : 'null' ?>;
var width = <?= isset($width) ? $width : 'null' ?>;
var tensile_strength = <?= isset($tensile_strength) ? $tensile_strength : 'null' ?>;
var elongation = <?= isset($elongation) ? $elongation : 'null' ?>;
var Zinc = <?= isset($Zinc) ? $Zinc : 'null' ?>;
// 두께 값 확인을 위한 콘솔 출력
// console.log('thickness:', thickness);
$('#mainTable tbody tr').each(function() {
var $row = $(this);
var $judgementCell = $row.find('.judgement');
function updateJudgement() {
var isValidThickness = true;
var isValidWidth = true;
var isValidTensileStrength = true;
var isValidElongation = true;
var isValidZinc = true;
var allFieldsFilled = true; // 모든 필드가 채워졌는지 확인하는 플래그
// 두께 허용 범위 설정
var thicknessTolerance = null;
if (thickness >= 0.8 && thickness < 1.0) {
thicknessTolerance = 0.07;
} else if (thickness >= 1.0 && thickness < 1.25) {
thicknessTolerance = 0.08;
} else if (thickness >= 1.25 && thickness < 1.6) {
thicknessTolerance = 0.10;
}
// 두께 값과 tolerance 출력 (디버깅용)
// console.log('thicknessTolerance:', thicknessTolerance);
if (thicknessTolerance === null) {
console.warn('thickness 범위가 유효하지 않습니다.');
return;
}
// 두께 범위 비교
$row.find('input[name^="record_thickness"]').each(function() {
var value = parseFloat($(this).val());
if (isNaN(value)) {
allFieldsFilled = false; // 필드가 비어있다면 allFieldsFilled를 false로 설정
return false; // 채워지지 않은 필드가 있으면 판단 중단
}
var lowerLimit = thickness - thicknessTolerance;
var upperLimit = thickness + thicknessTolerance;
// console.log('thickness 비교:', value, '(', lowerLimit, '-', upperLimit, ')');
if (value < lowerLimit || value > upperLimit) {
isValidThickness = false;
}
});
// 너비 허용 범위는 +7 ~ 0
$row.find('input[name^="record_widh"]').each(function() {
var value = parseFloat($(this).val());
if (isNaN(value)) {
allFieldsFilled = false;
return false;
}
var lowerLimit = width;
var upperLimit = width + 7;
if (value < lowerLimit || value > upperLimit) {
isValidWidth = false;
}
});
// 인장강도 비교
$row.find('input[name="tensile_strength"]').each(function() {
var value = parseFloat($(this).val());
if (isNaN(value)) {
allFieldsFilled = false;
return false;
}
if (value < 270) {
isValidTensileStrength = false;
}
});
// 연신율 비교
$row.find('input[name="elongation"]').each(function() {
var value = parseFloat($(this).val());
if (isNaN(value)) {
allFieldsFilled = false;
return false;
}
if (thickness >= 1.0 && thickness < 1.6 && value < 37) {
isValidElongation = false;
}
});
// 아연 부착량 비교
$row.find('input[name="Zinc"]').each(function() {
var value = parseFloat($(this).val());
if (isNaN(value)) {
allFieldsFilled = false;
return false;
}
if (value < 17) {
isValidZinc = false;
}
});
// OK/NG 체크박스 상태 검사
var allGood = true;
var anyBad = false;
// 해당 행에 OK 체크박스가 있는지 확인
if ($row.find('.check-good').length > 0) {
$row.find('.check-good').each(function() {
// 체크박스가 undefined이거나 제대로 체크되지 않으면 필드가 채워지지 않은 것으로 판단
if (isNaN($(this).is(':checked'))) {
allFieldsFilled = false;
return false;
}
if (!$(this).is(':checked')) {
allGood = false;
}
});
}
// 해당 행에 NG 체크박스가 있는지 확인
if ($row.find('.check-bad').length > 0) {
$row.find('.check-bad').each(function() {
if (isNaN($(this).is(':checked'))) {
allFieldsFilled = false;
return false;
}
if ($(this).is(':checked')) {
anyBad = true;
}
});
}
// OK/NG 체크박스 상태 검사
var checkedGood = 0; // 체크된 OK 체크박스 수
var checkedBad = 0; // 체크된 NG 체크박스 수
// 각 열의 OK/NG 체크박스를 한 번만 확인하도록 변경
var goodChecks = $row.find('.check-good');
var badChecks = $row.find('.check-bad');
// 해당 행에 OK 체크박스가 있는지 확인
if (goodChecks.length > 0) {
goodChecks.each(function() {
if ($(this).is(':checked')) {
checkedGood++; // OK 체크박스가 체크되면 증가
}
});
}
// 해당 행에 NG 체크박스가 있는지 확인
if (badChecks.length > 0) {
badChecks.each(function() {
if ($(this).is(':checked')) {
checkedBad++; // NG 체크박스가 체크되면 증가
}
});
}
// 모든 체크박스가 다 체크되지 않았다면 공백으로 처리
if (checkedGood + checkedBad !== 3 && (goodChecks.length > 0 || badChecks.length > 0)) {
allFieldsFilled = false; // 모두 체크되지 않았다면 공백 표시
}
// 결과 출력
// console.log('isValidThickness:', isValidThickness);
// console.log('isValidWidth:', isValidWidth);
// console.log('isValidTensileStrength:', isValidTensileStrength);
// console.log('isValidElongation:', isValidElongation);
// console.log('isValidZinc:', isValidZinc);
// console.log('allGood:', allGood);
// console.log('anyBad:', anyBad);
// 모든 필드가 채워지지 않았으면 공백으로 설정
if (!allFieldsFilled) {
$judgementCell.text('');
} else {
// 판정 업데이트
if (isValidThickness && isValidWidth && isValidTensileStrength && isValidElongation && isValidZinc && allGood && !anyBad) {
$judgementCell.text('적');
} else {
$judgementCell.text('부');
}
}
}
updateJudgement();
// 체크박스 토글
$row.find('td').each(function() {
var $goodCheck = $(this).find('.check-good');
var $badCheck = $(this).find('.check-bad');
$goodCheck.on('change', function() {
if ($(this).is(':checked')) {
$badCheck.prop('checked', false);
}
updateJudgement();
updateFinalJudgement();
});
$badCheck.on('change', function() {
if ($(this).is(':checked')) {
$goodCheck.prop('checked', false);
}
updateJudgement();
updateFinalJudgement();
});
});
// input 값 변경 시 판정 업데이트
$row.find('input').on('input', updateJudgement);
$row.find('input').on('input', updateFinalJudgement);
});
// 최종 종합 판정 업데이트 함수
function updateFinalJudgement() {
var allPass = true;
var allJudged = true;
$('#mainTable tbody tr .judgement').each(function() {
var judgementText = $(this).text();
if (judgementText === '') {
allJudged = false;
}
if (judgementText === '부') {
allPass = false;
// '부'인 경우 해당 td의 배경색을 옅은 붉은 색으로 변경
$(this).css('background-color', '#f8d7da'); // 옅은 붉은 색
} else {
// '적'인 경우 배경색을 기본으로 설정
$(this).css('background-color', ''); // 기본 배경색 (없음)
}
});
if (allJudged) {
if (allPass) {
$('#resultJudgement').val('합격');
} else {
$('#resultJudgement').val('불합격');
}
} else {
$('#resultJudgement').val('');
}
console.log('allJudged', allJudged);
console.log('allPass', allPass);
}
// 페이지 로드 시 최종 판정 업데이트
updateFinalJudgement();
});
</script>
<?php require_once $_SERVER['DOCUMENT_ROOT'] . '/' . $tablename . '/common/JS_instock.php'; ?> <!-- instock 후반부 공통 JS -->
</body>
</html>

925
instock/i_bracket.php Normal file
View File

@@ -0,0 +1,925 @@
<?php
$tablename = 'instock';
?>
<?php include $_SERVER['DOCUMENT_ROOT'] . '/' . $tablename . '/common/head.php' ; ?> <!-- head 정보 불러오기 -->
<?php
$itemTitle = '베어링부';
switch ($spec) {
case 'KD-910B':
case '910B':
$motor_width = 910;
$motor_height = 600;
$motor_thickness = 12;
$motor_Anti_width = 600;
$motor_Anti_height = 600;
break;
case 'KD-380B':
case '380B':
$motor_width = 380;
$motor_height = 180;
$motor_thickness = 2.5;
$motor_Anti_width = 180;
$motor_Anti_height = 180;
break;
case 'KD-530B':
case '530B':
$motor_width = 530;
$motor_height = 320;
$motor_thickness = 3.5;
$motor_Anti_width = 320;
$motor_Anti_height = 320;
break;
case 'KD-690B':
case '690B':
$motor_width = 690;
$motor_height = 390;
$motor_thickness = 6.0;
$motor_Anti_width = 390;
$motor_Anti_height = 390;
break;
case 'KD-600B':
case '600B':
$motor_width = 600;
$motor_height = 350;
$motor_thickness = 4.0;
$motor_Anti_width = 350;
$motor_Anti_height = 350;
break;
// 다른 case들을 추가할 수 있습니다
default:
// 기본적으로 처리할 경우
break;
}
$today = date("Y-m-d");
require_once $_SERVER['DOCUMENT_ROOT'] . '/instock/commonDriveLoad.php'; // 구글드라이브 파일형태 이미지형태 읽어오기 모듈
$savetitle ='수입검사성적서';
?>
<?php include $_SERVER['DOCUMENT_ROOT'] . '/' . $tablename . '/common/instock_btn.php'; ?> <!-- Btn 정보 불러오기 -->
<div id="content-to-print">
<br>
<div class="container mt-3">
<div class="d-flex align-items-center justify-content-center m-1">
<table class="table " style="border-collapse: collapse;">
<thead>
<tr>
<th rowspan="3" class="text-center" style="width:70%;">
<div class="row">
<div class="col-sm-2">
<img src="../img/kdlogo.png" alt="경동기업" class="me-1" style="width:100%; height:auto;">
</div>
<div class="col-sm-10">
<div class="d-flex align-items-center justify-content-center m-1">
<span class="text-dark ms-1 me-1 fs-2" > &nbsp; 수 </span>
<span class="text-dark me-1 fs-2" > &nbsp; 입 </span>
<span class="text-dark me-1 fs-2" > &nbsp; 검 </span>
<span class="text-dark me-1 fs-2" > &nbsp; 사 </span>
<span class="text-dark me-1 fs-2" > &nbsp; </span>
<span class="text-dark me-1 fs-2" > &nbsp; 성 </span>
<span class="text-dark me-1 fs-2" > &nbsp; 적 </span>
<span class="text-dark me-1 fs-2" > &nbsp; 서 </span>
</div>
</div>
</div>
</th>
<th rowspan="3" class="text-center fw-bold" style="height:100px;">결 재</th>
<th class="text-center p-1" style="width : 100px; height:22px; padding:2px;">담당</th>
<th class="text-center p-1" style="width : 100px; height:22px; padding:2px;">부서장</th>
</tr>
<tr style="height:40px;">
<th class="text-center">
<div id="chargedDiv" style="display: none;">
<span id="orderman"> <?=$orderman?> </span> <br> <?=$indateStr ?>
</div>
</th>
<th class="text-center">
<div id="approvalDiv" style="display: none;">
<?=$user_name?> <br> <?=$todayStr ?>
</div>
</th>
</tr>
<tr>
<th colspan="2"> 입고일자 : <?=$inspection_date?></th>
</tr>
</thead>
</table>
</div>
<div class="d-flex align-items-center justify-content-center m-1">
<table class="table table-bordered" style="border-collapse: collapse;">
<tbody>
<tr>
<td class="text-center align-middle lightgray">품 명</td>
<td colspan="2" class="text-center fw-bold"><?=$itemTitle?></td>
<td class="text-center align-middle lightgray">납품업체<br>제조업체</td>
<td class="text-center text-primary fw-bold"><?=$supplier?> <br> (<?=$manufacturer?>) </td>
</tr>
<tr>
<td class="text-center align-middle lightgray">규 격 </td>
<td colspan="2" class="text-center fw-bold"><?=$spec?></td>
<td class="text-center align-middle lightgray">로트번호</td>
<td colspan="1" class="text-center text-primary fw-bold">
<?=$lot_no?>
</td>
</tr>
<tr>
<td class="text-center align-middle lightgray">자재번호</td>
<td colspan="2" class="text-center fw-bold"><?=$material_no?> <br> <?=$remarks?> </td>
<td class="text-center align-middle lightgray">검사일자</td>
<td colspan="1" class="text-center text-primary fw-bold">
<?=$indateStr?>
</td>
</tr>
<tr>
<td class="text-center align-middle lightgray">로트크기</td>
<td class="text-center text-dark fw-bold"><?=$received_qty?> </td>
<td class="text-center text-dark fw-bold"><?=$unit?> </td>
<td class="text-center align-middle lightgray">검사자</td>
<td class="text-center">
<div class="d-flex justify-content-center">
<button type="button" id="editButton" class="btn btn-primary btn-sm">검사자</button>
<div id="inputContainer" style="display: none;">
<input type="text" id="userNameInput" class="form-control d-inline-block noborder-input text-center" style="width:100px;" autocomplete="off" style="widtd: 100px;" value="<?=$user_name?>">
<button type="button" id="cancelButton" class="btn btn-outline-danger btn-sm"> <i class="bi bi-x"> </i> </button>
</div>
</div>
</td>
</tr>
<script>
$(document).ready(function() {
// '담당자 입력' 버튼 클릭 시 input 표시 및 버튼 숨김
$('#editButton').on('click', function() {
$('#editButton').hide();
$('#inputContainer').show();
$('#workdate').text('<?php echo $todayStr; ?>');
$('#chargedDiv').show();
});
// '취소' 버튼 클릭 시 원래 상태로 되돌림
$('#cancelButton').on('click', function() {
$('#inputContainer').hide();
$('#chargedDiv').hide();
$('#workdate').text('');
$('#editButton').show();
});
});
</script>
</tbody>
</table>
</div>
<div class="row justify-content-start m-1 mt-2">
<table id="mainTable" class="table table-hover" style="border-collapse: collapse;">
<thead>
<tr>
<th class="text-center align-middle" rowspan="2">NO</th>
<th class="text-center align-middle" rowspan="2" colspan="3">검사항목</th>
<th class="text-center align-middle" rowspan="2" colspan="2">검사기준</th>
<th class="text-center align-middle" rowspan="2">검사방식</th>
<th class="text-center align-middle" rowspan="2">검사주기</th>
<th class="text-center align-middle" colspan="3">측정치</th>
<th class="text-center align-middle" rowspan="2">판정 <br> (적/부)</th>
</tr>
<tr>
<th class="text-center">n1 <br> 양호/불량 </th>
<th class="text-center">n2 <br> 양호/불량 </th>
<th class="text-center">n3 <br> 양호/불량 </th>
</tr>
</thead>
<tbody>
<!-- 첫 번째 행 (겉모양) -->
<tr>
<td class="text-center align-middle" rowspan="1">1</td>
<td class="text-center align-middle" colspan="3">겉모양</td>
<td class="text-center align-middle" colspan="2">사용상 해로울 <br> 결함이 없을 것</td>
<td class="text-center align-middle" rowspan="3">육안검사</td>
<td class="text-center align-middle" rowspan="9">n = 3 <br>c = 0</td>
<td class="text-center align-middle">
<label>
<input type="checkbox" class="check-good"> OK
</label>
<label>
<input type="checkbox" class="check-bad"> NG
</label>
</td>
<td class="text-center align-middle">
<label>
<input type="checkbox" class="check-good"> OK
</label>
<label>
<input type="checkbox" class="check-bad"> NG
</label>
</td>
<td class="text-center align-middle">
<label>
<input type="checkbox" class="check-good"> OK
</label>
<label>
<input type="checkbox" class="check-bad"> NG
</label>
</td>
<td class="text-center align-middle judgement"></td>
</tr>
<!-- 구성품 -->
<tr>
<td class="text-center align-middle" rowspan="1">2</td>
<td class="text-center align-middle" colspan="3">구성품</td>
<td class="text-center align-middle" colspan="2">구성품 누락이 없어야함 <br> (제품사진 구성품)</td>
<td class="text-center align-middle">
<label>
<input type="checkbox" class="check-good"> OK
</label>
<label>
<input type="checkbox" class="check-bad"> NG
</label>
</td>
<td class="text-center align-middle">
<label>
<input type="checkbox" class="check-good"> OK
</label>
<label>
<input type="checkbox" class="check-bad"> NG
</label>
</td>
<td class="text-center align-middle">
<label>
<input type="checkbox" class="check-good"> OK
</label>
<label>
<input type="checkbox" class="check-bad"> NG
</label>
</td>
<td class="text-center align-middle judgement"></td>
</tr>
<!-- 체결상태 -->
<tr>
<td class="text-center align-middle" rowspan="1">3</td>
<td class="text-center align-middle" colspan="3">체결상태</td>
<td class="text-center align-middle" colspan="2">환봉과 플랜지의 <br> 체결성이 양호해야 함</td>
<td class="text-center align-middle" rowspan="7" colspan="3"> 공급업체 성적서로 <br> 대체 </td>
<td class="text-center align-middle judgement" rowspan="7"></td>
</tr>
<?php
// 두께 범위에 맞는 체크된 사각형을 표시하는 함수
function renderCheckBox($min, $max, $value) {
if ($value >= $min && $value < $max) {
return '✅'; // 체크된 사각형
} else {
return '□'; // 빈 사각형
}
}
// 길이 범위에 맞는 체크된 사각형을 표시하는 함수
function renderLengthCheckBox($min, $max, $length) {
if ($length >= $min && $length < $max) {
return '✅'; // 체크된 사각형
} else {
return '□'; // 빈 사각형
}
}
// 이하
function renderincludeCheckBox($min, $max, $length) {
if ($length > $min && $length <= $max) {
return '✅'; // 체크된 사각형
} else {
return '□'; // 빈 사각형
}
}
?>
<!-- 셋팅설정 및 set램프 표시상태 -->
<tr>
<td class="text-center align-middle" rowspan="6">4</td>
<td class="text-center align-middle" colspan="1" rowspan="6"> 치수 <br> (mm) </td>
<td class="text-center align-middle" rowspan="3" colspan="1"> 모터측 </td>
<td class="text-center align-middle" colspan="1"> 가로 </td>
<td class="text-center align-middle" colspan="1"> <?=$motor_width?> </td>
<td class="text-center align-middle" rowspan="2" colspan="1"> ± 4.0 </td>
<td class="text-center align-middle" rowspan="6"> 체크검사 </td>
</tr>
<tr>
<td class="text-center align-middle" colspan="1"> 세로 </td>
<td class="text-center align-middle" colspan="1"> <?=$motor_height?> </td>
</tr>
<tr>
<td class="text-center align-middle" colspan="1"> 두께 </td>
<td class="text-center align-middle" colspan="1"> <?=$motor_thickness?> </td>
<td class="text-center align-middle" rowspan="1" colspan="1"> ± 0.5 </td>
</tr>
<tr>
<td class="text-center align-middle" rowspan="3" colspan="1"> 모터측 <br> 반대측 </td>
<td class="text-center align-middle" colspan="1"> 가로 </td>
<td class="text-center align-middle" colspan="1"> <?=$motor_Anti_width?> </td>
<td class="text-center align-middle" rowspan="2" colspan="1"> ± 4.0 </td>
</tr>
<tr>
<td class="text-center align-middle" colspan="1"> 세로 </td>
<td class="text-center align-middle" colspan="1"> <?=$motor_Anti_height?> </td>
</tr>
<tr>
<td class="text-center align-middle" colspan="1"> 두께 </td>
<td class="text-center align-middle" colspan="1"> <?=$motor_thickness?> </td>
<td class="text-center align-middle" rowspan="1" colspan="1"> ± 0.5 </td>
</tr>
<tr>
<td class="text-center align-middle" rowspan="1">5</td>
<td class="text-center align-middle" colspan="3" rowspan="1"> 품질인정 </td>
<td class="text-center align-middle" colspan="2"> 내화시험(비차열 70분) <br> 적합할것 </td>
<td class="text-center align-middle" rowspan="1"> 공인기관<br>시험 </td>
<td class="text-center align-middle" rowspan="1" colspan="1"> 1회/5년 </td>
<td class="text-center align-middle" rowspan="1" colspan="3"> 공인기관 성적서로 <br> 대체 </td>
<td class="text-center align-middle judgement" rowspan="1"></td>
</tr>
<!-- 종합판정 -->
<tr>
<td colspan="9" rowspan="4" class="text-center align-top">
<div class="text-start fw-bold mt-1">
<span>[부적합 내용]</span> <br>
<span>
<input type="text" class="form-control text-start inputItem noborder-input" style="height:50px;" id="input_memo" name="input_memo" autocomplete="off">
&nbsp;</span>
</div>
</td>
<td colspan="3" class="text-center align-middle yellowredBold">
<div class="d-flex justify-content-center align-items-center fw-bold">
<span class="text-dark">종합판정</span>
</div>
</td>
</tr>
<tr>
<td colspan="3" rowspan="3" class="text-center align-middle">
<div class="text-center fw-bold mt-3 fs-1 ">
<input type="text" class="form-control fs-2 text-center inputItem noborder-input" style="height:50px;" id="resultJudgement" name="resultJudgement" autocomplete="off">
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</form>
</div> <!-- end of container -->
<div class="container mb-5 mt-2">
<div class="d-flex align-items-center justify-content-center mb-5">
</div>
</div>
<!-- 페이지로딩 -->
<script>
$(document).ready(function(){
var loader = document.getElementById('loadingOverlay');
if(loader)
loader.style.display = 'none';
});
function generatePDF() {
var workplace = '<?php echo $title_message; ?>';
var deadline = '<?php echo $today; ?>';
var deadlineDate = new Date(deadline);
var formattedDate = "(" + String(deadlineDate.getFullYear()).slice(-2) + "." + ("0" + (deadlineDate.getMonth() + 1)).slice(-2) + "." + ("0" + deadlineDate.getDate()).slice(-2) + ")";
var result = 'KD' + workplace +'_' + formattedDate + '.pdf';
var element = document.getElementById('content-to-print');
var opt = {
margin: [10, 3, 12, 3], // Top, right, bottom, left margins
filename: result,
image: { type: 'jpeg', quality: 0.98 },
html2canvas: { scale: 1 },
jsPDF: { unit: 'mm', format: 'a4', orientation: 'portrait' },
pagebreak: { mode: [''] }
};
html2pdf().from(element).set(opt).save();
}
// 모달을 호출할 때 tr 요소를 저장하는 변수
var selectedRow;
$(document).on('click', '.saveData', function() {
saveData();
});
$(document).on('click', '.approvalBtn', function() {
// 승인자의 이름과 오늘 날짜 가져오기
const userName = '<?=$user_name?>'; // PHP로부터 가져온 사용자 이름
const todayStr = '<?=$todayStr?>'; // PHP로부터 가져온 오늘 날짜
// 승인 정보를 approvalDiv에 표시
$('#approvalDiv').html(
userName + '<br>' + todayStr +
' <i class="bi bi-x-circle remove-approval" style="cursor: pointer;"></i>'
);
$('#approvalDiv').show();
// 결재 정보를 업데이트하여 저장 로직에 반영
updateApprovalData(userName, todayStr);
saveData();
});
// 결재 정보 업데이트 함수
function updateApprovalData(userName, date) {
// 저장 로직을 위해 결재 정보 업데이트
let approvalData = {
writer: {
name: $('#orderman').text().trim(),
date: '<?=$indateStr?>'
},
reviewer: {
name: $('#reviewDiv').is(':visible') ? '<?=$user_name?>' : '',
date: '<?=$todayStr?>'
},
approver: {
name: userName,
date: date
}
};
// 저장할 JSON 데이터 업데이트
let formData = JSON.parse($('#iList').val() || '[]');
const approvalIndex = formData.findIndex(item => item.approval);
if (approvalIndex !== -1) {
formData[approvalIndex].approval = approvalData;
} else {
formData.push({ approval: approvalData });
}
// JSON 문자열로 다시 저장
$('#iList').val(JSON.stringify(formData));
}
// 결재 취소 기능
$(document).on('click', '.remove-approval', function() {
// 결재 정보를 지우고 화면에서 숨김
$('#approvalDiv').html('').hide();
// JSON 데이터에서 결재자의 정보 제거
let formData = JSON.parse($('#iList').val() || '[]');
const approvalIndex = formData.findIndex(item => item.approval);
if (approvalIndex !== -1) {
formData[approvalIndex].approval.approver.name = '';
formData[approvalIndex].approval.approver.date = '';
}
// JSON 문자열로 다시 저장
$('#iList').val(JSON.stringify(formData));
Toastify({
text: "결재 정보가 삭제되었습니다.",
duration: 2000,
close: true,
gravity: "top",
position: "center",
style: {
background: "linear-gradient(to right, #ff5f6d, #ffc371)"
},
}).showToast();
saveData();
});
function captureReturnKey(e) {
if(e.keyCode==13 && e.srcElement.type != 'textarea')
return false;
}
function recaptureReturnKey(e) {
if(e.keyCode==13 && e.srcElement.type != 'textarea')
return false;
}
// 삽입/수정하는 모듈
function saveData() {
// json 형태로 form문에 저장하기
let formData = [];
// 결재 부분 정보 저장
let approvalData = {
writer: {
name: $('#chargedDiv').is(':visible') ? '<?=$user_name?>' : '',
date: '<?=$indateStr?>'
},
approver: {
name: $('#approvalDiv').is(':visible') ? '<?=$user_name?>' : '',
date: '<?=$todayStr?>'
}
};
formData.push({ approval: approvalData });
// 검사자 정보 저장
let productionManager = $('#userNameInput').val();
formData.push({ productionManager: productionManager });
// 추가 정보 저장
formData.push({ num: $('#num').val() });
formData.push({ update_log: $('#update_log').val() });
formData.push({ memo: $('#memo').val() });
// Class 'inputItem' 값 저장
let inputItems = {};
$('.inputItem').each(function() {
let inputName = $(this).attr('name');
inputItems[inputName] = $(this).val();
});
formData.push({ inputItems: inputItems });
// 체크박스 상태 저장
let checkboxData = [];
$('#mainTable tbody tr').each(function(index) {
let rowCheckboxes = {
good: [],
bad: [],
judgement: $(this).find('.judgement').text()
};
$(this).find('.check-good').each(function() {
rowCheckboxes.good.push($(this).prop('checked'));
});
$(this).find('.check-bad').each(function() {
rowCheckboxes.bad.push($(this).prop('checked'));
});
checkboxData.push(rowCheckboxes);
});
formData.push({ checkboxData: checkboxData });
// JSON 문자열로 변환
let jsonString = JSON.stringify(formData);
// 숨겨진 필드에 JSON 데이터 설정
$('#iList').val(jsonString);
$("#overlay").show(); // 오버레이 표시
$("button").prop("disabled", true); // 모든 버튼 비활성화
// 폼데이터 전송시 사용함 Get form
var form = $('#board_form')[0];
var datasource = new FormData(form);
showMsgModal(2); // 파일저장중
$.ajax({
enctype: 'multipart/form-data',
processData: false,
contentType: false,
cache: false,
timeout: 600000,
url: "insert_iList.php",
type: "post",
data: datasource,
dataType: "json",
success: function(data) {
console.log(data);
setTimeout(function() {
Toastify({
text: "저장완료",
duration: 3000,
close: true,
gravity: "top",
position: "center",
style: {
background: "linear-gradient(to right, #00b09b, #96c93d)"
},
}).showToast();
saveAndClose(); //부모창 변경
hideMsgModal();
$("button").prop("disabled", false); // 모든 버튼 활성화
}, 1000);
$("#overlay").hide(); // 오버레이 숨김
},
error: function(jqxhr, status, error) {
console.log(jqxhr, status, error);
alert("An error occurred: " + error);
}
});
}
// 팝업 창에서 데이터 저장 및 닫기 함수
function saveAndClose() {
const updatedData = {
resultJudgement: $("#resultJudgement").val(),
// 필요한 다른 필드도 여기에 추가할 수 있습니다.
};
// 부모 창의 함수 호출
if (window.opener && typeof window.opener.closePopupAndUpdateRow === 'function') {
window.opener.closePopupAndUpdateRow(updatedData);
} else {
console.error("Parent window function not found");
}
// 팝업 창 닫기
// window.close();
}
// 초기값 불러오기
$(document).ready(function() {
console.log(iListData);
if (iListData.length > 0) {
// 결재 부분 정보
const approval = iListData.find(item => item.approval);
if (approval) {
if (approval.approval.writer.name && approval.approval.writer.date) {
$('#chargedDiv').show();
$('#chargedDiv').html(
approval.approval.writer.name + '<br>' + approval.approval.writer.date
);
} else {
$('#chargedDiv').hide().html('');
}
if (approval.approval.approver.name && approval.approval.approver.date) {
$('#approvalDiv').show();
$('#approvalDiv').html(
approval.approval.approver.name + '<br>' + approval.approval.approver.date +
' <i class="bi bi-x-circle remove-approval" style="cursor: pointer;"></i>'
);
} else {
$('#approvalDiv').hide().html('');
}
$('#workdate').text(approval.approval.writer.date);
}
// 검사자 정보
const productionManager = iListData.find(item => item.productionManager);
if (productionManager && productionManager.productionManager) {
$('#userNameInput').val(productionManager.productionManager).show();
$('#inputContainer').show();
$('#editButton').hide();
} else {
$('#userNameInput').val('');
$('#inputContainer').hide();
$('#editButton').show();
}
// inputItem 데이터 로드
const inputItems = iListData.find(item => item.inputItems);
if (inputItems && inputItems.inputItems) {
for (const [name, value] of Object.entries(inputItems.inputItems)) {
$(`.inputItem[name="${name}"]`).val(value);
}
}
// 체크박스 상태 로드
const checkboxData = iListData.find(item => item.checkboxData);
if (checkboxData && checkboxData.checkboxData) {
$('#mainTable tbody tr').each(function(index) {
const rowData = checkboxData.checkboxData[index];
if (rowData) {
$(this).find('.check-good').each(function(goodIndex) {
$(this).prop('checked', rowData.good[goodIndex]);
});
$(this).find('.check-bad').each(function(badIndex) {
$(this).prop('checked', rowData.bad[badIndex]);
});
$(this).find('.judgement').text(rowData.judgement);
}
});
}
}
});
// 첫번째 요소를 클릭하면 전체 로트번호 적용하기
$(document).ready(function() {
// id가 mainTable인 테이블의 첫 번째 td를 클릭했을 때 이벤트를 등록합니다.
$('#mainTable').on('click', 'td:first-child', function() {
// 클릭한 첫 번째 td의 형제인 두 번째 td 요소의 값을 가져옵니다.
var secondTdValue = $(this).siblings().find('input').val();
// id가 mainTable인 테이블에서 두 번째 td 요소에 해당 값을 적용합니다.
$('#mainTable tbody tr').each(function() {
$(this).find('td:nth-child(2) input').val(secondTdValue);
});
});
});
// 부트스트랩 툴팁
$(document).ready(function() {
var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]'));
var tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) {
return new bootstrap.Tooltip(tooltipTriggerEl);
});
});
</script>
<script>
$(document).ready(function() {
var thickness = <?= isset($thickness) ? $thickness : 'null' ?>;
var width = <?= isset($width) ? $width : 'null' ?>;
var height = <?= isset($height) ? $height : 'null' ?>;
var length = <?= isset($length) ? $length : 'null' ?>;
console.log('width', width);
console.log('height', height);
$('#mainTable tbody tr').each(function() {
var $row = $(this);
var $judgementCell = $row.find('.judgement');
function updateJudgement() {
var isValidThickness = true;
var isValidWidth = true;
var isValidHeight = true;
var isValidLength = true;
var isValidTensile = true;
var isValidYieldStrength = true;
var isValidElongation = true;
var allFieldsFilled = true; // 모든 필드가 채워졌는지 확인하는 플래그
// 두께 허용 범위 설정
var Up_thicknessTolerance;
var Down_thicknessTolerance;
if (thickness < 6.3 ) {
Up_thicknessTolerance = 0.6;
Down_thicknessTolerance = 0.6;
}
// 두께 범위 비교
$row.find('input[name^="record_thickness"]').each(function() {
var value = parseFloat($(this).val());
if (isNaN(value)) {
allFieldsFilled = false;
return false;
}
var lowerLimit = thickness - Down_thicknessTolerance;
var upperLimit = thickness + Up_thicknessTolerance;
if (value < lowerLimit || value > upperLimit) {
isValidThickness = false;
}
});
// OK/NG 체크박스 상태 검사
var allGood = true;
var anyBad = false;
// 해당 행에 OK 체크박스가 있는지 확인
if ($row.find('.check-good').length > 0) {
$row.find('.check-good').each(function() {
// 체크박스가 undefined이거나 제대로 체크되지 않으면 필드가 채워지지 않은 것으로 판단
if (isNaN($(this).is(':checked'))) {
allFieldsFilled = false;
return false;
}
if (!$(this).is(':checked')) {
allGood = false;
}
});
}
// 해당 행에 NG 체크박스가 있는지 확인
if ($row.find('.check-bad').length > 0) {
$row.find('.check-bad').each(function() {
if (isNaN($(this).is(':checked'))) {
allFieldsFilled = false;
return false;
}
if ($(this).is(':checked')) {
anyBad = true;
}
});
}
// OK/NG 체크박스 상태 검사
var checkedGood = 0; // 체크된 OK 체크박스 수
var checkedBad = 0; // 체크된 NG 체크박스 수
// 각 열의 OK/NG 체크박스를 한 번만 확인하도록 변경
var goodChecks = $row.find('.check-good');
var badChecks = $row.find('.check-bad');
// 해당 행에 OK 체크박스가 있는지 확인
if (goodChecks.length > 0) {
goodChecks.each(function() {
if ($(this).is(':checked')) {
checkedGood++; // OK 체크박스가 체크되면 증가
}
});
}
// 해당 행에 NG 체크박스가 있는지 확인
if (badChecks.length > 0) {
badChecks.each(function() {
if ($(this).is(':checked')) {
checkedBad++; // NG 체크박스가 체크되면 증가
}
});
}
// 모든 체크박스가 다 체크되지 않았다면 공백으로 처리
if (checkedGood + checkedBad !== 3 && (goodChecks.length > 0 || badChecks.length > 0)) {
allFieldsFilled = false; // 모두 체크되지 않았다면 공백 표시
}
// 모든 필드가 채워지지 않았으면 공백으로 설정
if (!allFieldsFilled) {
$judgementCell.text('');
} else {
// 판정 업데이트
if (isValidThickness && isValidWidth && isValidHeight && isValidLength && isValidTensile && isValidElongation && isValidYieldStrength && allGood && !anyBad) {
$judgementCell.text('적');
} else {
$judgementCell.text('부');
}
}
}
// 페이지 로드 시 초기 판단
updateJudgement();
// 체크박스 토글
$row.find('td').each(function() {
var $goodCheck = $(this).find('.check-good');
var $badCheck = $(this).find('.check-bad');
$goodCheck.on('change', function() {
if ($(this).is(':checked')) {
$badCheck.prop('checked', false);
}
updateJudgement();
updateFinalJudgement();
});
$badCheck.on('change', function() {
if ($(this).is(':checked')) {
$goodCheck.prop('checked', false);
}
updateJudgement();
updateFinalJudgement();
});
});
// input 값 변경 시 판정 업데이트
$row.find('input').on('input', updateJudgement);
$row.find('input').on('input', updateFinalJudgement);
});
// 최종 종합 판정 업데이트 함수
function updateFinalJudgement() {
var allPass = true;
var allJudged = true;
$('#mainTable tbody tr .judgement').each(function() {
var judgementText = $(this).text();
if (judgementText === '') {
allJudged = false;
}
if (judgementText === '부') {
allPass = false;
$(this).css('background-color', '#f8d7da');
} else {
$(this).css('background-color', '');
}
});
if (allJudged) {
if (allPass) {
$('#resultJudgement').val('합격');
} else {
$('#resultJudgement').val('불합격');
}
} else {
$('#resultJudgement').val('');
}
}
// 페이지 로드 시 최종 판정 업데이트
updateFinalJudgement();
});
</script>
<?php require_once $_SERVER['DOCUMENT_ROOT'] . '/' . $tablename . '/common/JS_instock.php'; ?> <!-- instock 후반부 공통 JS -->
</body>
</html>

951
instock/i_cerakwool.php Normal file
View File

@@ -0,0 +1,951 @@
<?php
$tablename = 'instock';
?>
<?php include $_SERVER['DOCUMENT_ROOT'] . '/' . $tablename . '/common/head.php' ; ?> <!-- head 정보 불러오기 -->
<?php
$itemAlias = $item_name . ' <br> (C/F L-BIO 1200 B/T)' ;
$itemTitle = $item_name . ' <br> (C/F L-BIO 1200 B/T)' . $spec ;
$spec = $specification;
// 문자열을 '*' 기준으로 분리
list($thickness, $width) = array_map('trim', explode('*', $specification));
// 숫자로 변환
$thickness = (float)$thickness;
$width = (int)$width;
$today = date("Y-m-d");
require_once $_SERVER['DOCUMENT_ROOT'] . '/instock/commonDriveLoad.php'; // 구글드라이브 파일형태 이미지형태 읽어오기 모듈
$savetitle ='수입검사성적서';
?>
<?php include $_SERVER['DOCUMENT_ROOT'] . '/' . $tablename . '/common/instock_btn.php'; ?> <!-- Btn 정보 불러오기 -->
<div id="content-to-print">
<br>
<div class="container mt-3">
<div class="d-flex align-items-center justify-content-center m-1">
<table class="table " style="border-collapse: collapse;">
<thead>
<tr>
<th rowspan="3" class="text-center" style="width:70%;">
<div class="row">
<div class="col-sm-2">
<img src="../img/kdlogo.png" alt="경동기업" class="me-1" style="width:100%; height:auto;">
</div>
<div class="col-sm-10">
<div class="d-flex align-items-center justify-content-center m-1">
<span class="text-dark ms-1 me-1 fs-2" > &nbsp; 수 </span>
<span class="text-dark me-1 fs-2" > &nbsp; 입 </span>
<span class="text-dark me-1 fs-2" > &nbsp; 검 </span>
<span class="text-dark me-1 fs-2" > &nbsp; 사 </span>
<span class="text-dark me-1 fs-2" > &nbsp; </span>
<span class="text-dark me-1 fs-2" > &nbsp; 성 </span>
<span class="text-dark me-1 fs-2" > &nbsp; 적 </span>
<span class="text-dark me-1 fs-2" > &nbsp; 서 </span>
</div>
</div>
</div>
</th>
<th rowspan="3" class="text-center fw-bold" style="height:100px;">결 재</th>
<th class="text-center p-1" style="width : 100px; height:22px; padding:2px;">담당</th>
<th class="text-center p-1" style="width : 100px; height:22px; padding:2px;">부서장</th>
</tr>
<tr style="height:40px;">
<th class="text-center">
<div id="chargedDiv" style="display: none;">
<span id="orderman"> <?=$orderman?> </span> <br> <?=$indateStr ?>
</div>
</th>
<th class="text-center">
<div id="approvalDiv" style="display: none;">
<?=$user_name?> <br> <?=$todayStr ?>
</div>
</th>
</tr>
<tr>
<th colspan="2"> 입고일자 : <?=$inspection_date?></th>
</tr>
</thead>
</table>
</div>
<div class="d-flex align-items-center justify-content-center m-1">
<table class="table table-bordered" style="border-collapse: collapse;">
<tbody>
<tr>
<td class="text-center align-middle lightgray">품 명</td>
<td colspan="2" class="text-center fw-bold"><?=$itemAlias?></td>
<td class="text-center align-middle lightgray">납품업체<br>제조업체</td>
<td class="text-center text-primary fw-bold"><?=$supplier?> <br> (<?=$manufacturer?>) </td>
</tr>
<tr>
<td class="text-center align-middle lightgray">규 격<br>(두께*너비) </td>
<td colspan="2" class="text-center fw-bold"><?=$spec?></td>
<td class="text-center align-middle lightgray">로트번호</td>
<td colspan="1" class="text-center text-primary fw-bold">
<?=$lot_no?>
</td>
</tr>
<tr>
<td class="text-center align-middle lightgray">자재번호</td>
<td colspan="2" class="text-center fw-bold"><?=$material_no?></td>
<td class="text-center align-middle lightgray">검사일자</td>
<td colspan="1" class="text-center text-primary fw-bold">
<?=$indateStr?>
</td>
</tr>
<tr>
<td class="text-center align-middle lightgray">로트크기</td>
<td class="text-center text-dark fw-bold"><?=$received_qty?> </td>
<td class="text-center text-dark fw-bold"><?=$unit?> </td>
<td class="text-center align-middle lightgray">검사자</td>
<td class="text-center">
<div class="d-flex justify-content-center">
<button type="button" id="editButton" class="btn btn-primary btn-sm">검사자</button>
<div id="inputContainer" class="text-center" style="display: none;">
<input type="text" id="userNameInput" class="form-control d-inline-block noborder-input text-center" style="width:100px;" autocomplete="off" style="widtd: 100px;" value="<?=$user_name?>">
<button type="button" id="cancelButton" class="btn btn-outline-danger btn-sm"> <i class="bi bi-x"> </i> </button>
</div>
</div>
</td>
</tr>
<script>
$(document).ready(function() {
// '담당자 입력' 버튼 클릭 시 input 표시 및 버튼 숨김
$('#editButton').on('click', function() {
$('#editButton').hide();
$('#inputContainer').show();
$('#workdate').text('<?php echo $todayStr; ?>');
$('#chargedDiv').show();
});
// '취소' 버튼 클릭 시 원래 상태로 되돌림
$('#cancelButton').on('click', function() {
$('#inputContainer').hide();
$('#chargedDiv').hide();
$('#workdate').text('');
$('#editButton').show();
});
});
</script>
</tbody>
</table>
</div>
<?php
// 두께 범위에 맞는 체크된 사각형을 표시하는 함수
function renderCheckBox($min, $max, $value) {
if ($value >= $min && $value < $max) {
return '✅'; // 체크된 사각형
} else {
return '□'; // 빈 사각형
}
}
// 길이 범위에 맞는 체크된 사각형을 표시하는 함수
function renderLengthCheckBox($min, $max, $length) {
if ($length >= $min && $length < $max) {
return '✅'; // 체크된 사각형
} else {
return '□'; // 빈 사각형
}
}
// 이하
function renderincludeCheckBox($min, $max, $length) {
if ($length > $min && $length <= $max) {
return '✅'; // 체크된 사각형
} else {
return '□'; // 빈 사각형
}
}
?>
<div class="row justify-content-start m-1 mt-2">
<table id="mainTable" class="table table-hover" style="border-collapse: collapse;">
<thead>
<tr>
<th class="text-center align-middle" rowspan="2"> <span id="allclick"> NO </span> </th>
<th class="text-center align-middle" rowspan="2" colspan="2">검사항목</th>
<th class="text-center align-middle" rowspan="2" colspan="2">검사기준</th>
<th class="text-center align-middle" rowspan="2">검사방식</th>
<th class="text-center align-middle" rowspan="2">검사주기</th>
<th class="text-center align-middle" colspan="3">측정치</th>
<th class="text-center align-middle" rowspan="2">판정 <br> (적/부)</th>
</tr>
<tr>
<th class="text-center">n1 <br> 양호/불량 </th>
<th class="text-center">n2 <br> 양호/불량 </th>
<th class="text-center">n3 <br> 양호/불량 </th>
</tr>
</thead>
<tbody>
<!-- 첫 번째 행 (겉모양) -->
<tr>
<td class="text-center align-middle">1</td>
<td class="text-center align-middle" colspan="2">겉모양</td>
<td class="text-center align-middle" colspan="2">사용상 해로울 <br> 결함이 없을 것</td>
<td class="text-center align-middle">육안검사</td>
<td class="text-center align-middle" rowspan="3">n = 3 <br>c = 0</td>
<td class="text-center align-middle">
<label>
<input type="checkbox" class="check-good"> OK
</label>
<label>
<input type="checkbox" class="check-bad"> NG
</label>
</td>
<td class="text-center align-middle">
<label>
<input type="checkbox" class="check-good"> OK
</label>
<label>
<input type="checkbox" class="check-bad"> NG
</label>
</td>
<td class="text-center align-middle">
<label>
<input type="checkbox" class="check-good"> OK
</label>
<label>
<input type="checkbox" class="check-bad"> NG
</label>
</td>
<td class="text-center align-middle judgement"></td>
</tr>
<!-- 두 번째 행 (치수) -->
<tr>
<td class="text-center align-middle" rowspan="2">2</td>
<td class="text-center align-middle" rowspan="2">치수 <br> (mm) </td>
<td class="text-center align-middle" rowspan="1">
두께
</td>
<td class="text-center align-middle" colspan="2" > (<span id="input_thickness"> <?=$thickness?> </span>) (+4, -2mm) </td>
<td class="text-center align-middle" rowspan="2">체크검사 <br> 줄자</td>
<td class="text-center align-middle" rowspan="1">
<input type="text" class="form-control text-center noborder-input inputItem" id="record_thickness1" name="record_thickness1" value="" autocomplete="off">
</td>
<td class="text-center align-middle" rowspan="1">
<input type="text" class="form-control text-center noborder-input inputItem" id="record_thickness2" name="record_thickness2" value="" autocomplete="off">
</td>
<td class="text-center align-middle" rowspan="1">
<input type="text" class="form-control text-center noborder-input inputItem" id="record_thickness3" name="record_thickness3" value="" autocomplete="off">
</td>
<td class="text-center align-middle judgement" rowspan="1"></td>
</tr>
<!-- 너비 검사 -->
<tr>
<td class="text-center align-middle" rowspan="1">
너비
</td>
<td class="text-center align-middle" colspan="2" > (<span id="input_width"> <?=$width?> </span>) (+4, -2%) </td>
<td class="text-center align-middle" rowspan="1">
<input type="text" class="form-control text-center noborder-input inputItem" id="record_width1" name="record_width1" value="" autocomplete="off">
</td>
<td class="text-center align-middle" rowspan="1">
<input type="text" class="form-control text-center noborder-input inputItem" id="record_width2" name="record_width2" value="" autocomplete="off">
</td>
<td class="text-center align-middle" rowspan="1">
<input type="text" class="form-control text-center noborder-input inputItem" id="record_width3" name="record_width3" value="" autocomplete="off">
</td>
<td class="text-center align-middle judgement" rowspan="1"></td>
</tr>
<!--SiO₂함유량 (%) -->
<tr>
<td class="text-center align-middle" rowspan="1"> 3 </td>
<td class="text-center align-middle" rowspan="1" colspan="2" > 밀도 <br> (㎏/㎥) </td>
<td class="text-center align-middle" colspan="2"> 85 ~ 115 </td>
<td class="text-center align-middle" rowspan="3" colspan="1"> 공급기관 <br> 성적서 </td>
<td class="text-center align-middle" rowspan="3"> 입고시</td>
<td class="text-center align-middle" colspan="3">
<input type="text" class="form-control text-center noborder-input inputItem" id="No3" name="No3" autocomplete="off">
</td>
<td class="text-center align-middle judgement" rowspan="1"> </td>
</tr>
<tr>
<td class="text-center align-middle" rowspan="1"> 4 </td>
<td class="text-center align-middle" colspan="2"> 숏함수율 </td>
<td class="text-center align-middle" colspan="2"> MAX. 25% </td>
<td class="text-center align-middle" colspan="3">
<input type="text" class="form-control text-center noborder-input inputItem" id="No4" name="No4" autocomplete="off">
</td>
<td class="text-center align-middle judgement" rowspan="1"> </td>
</tr>
<tr>
<td class="text-center align-middle" rowspan="1"> 5 </td>
<td class="text-center align-middle" colspan="2"> 가열선 수축률 </td>
<td class="text-center align-middle" colspan="2"> MAX. 3% </td>
<td class="text-center align-middle" colspan="3">
<input type="text" class="form-control text-center noborder-input inputItem" id="No5" name="No5" autocomplete="off">
</td>
<td class="text-center align-middle judgement" rowspan="1"> </td>
</tr>
<!-- 종합판정 -->
<tr>
<td colspan="8" rowspan="4" class="text-center align-top">
<div class="text-start fw-bold mt-1">
<span>[부적합 내용]</span> <br>
<span>
<input type="text" class="form-control text-start inputItem noborder-input" style="height:50px;" id="input_memo" name="input_memo" autocomplete="off">
&nbsp;</span>
</div>
</td>
<td colspan="3" class="text-center align-middle yellowredBold">
<div class="d-flex justify-content-center align-items-center fw-bold">
<span class="text-dark">종합판정</span>
</div>
</td>
</tr>
<tr>
<td colspan="3" rowspan="3" class="text-center align-middle">
<div class="text-center fw-bold mt-3 fs-1 ">
<input type="text" class="form-control fs-2 text-center inputItem noborder-input" style="height:50px;" id="resultJudgement" name="resultJudgement" autocomplete="off">
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div> <!-- end of container -->
<div class="container mb-5 mt-2">
<div class="d-flex align-items-center justify-content-center mb-5">
</div>
</div>
</form>
<!-- 페이지로딩 -->
<script>
var ajaxRequest_write = null;
var ajaxRequest = null;
var ajaxRequest5 = null;
var ajaxRequest6 = null;
var ajaxRequest7 = null;
var isDisplaying = false;
$(document).ready(function(){
var loader = document.getElementById('loadingOverlay');
if(loader)
loader.style.display = 'none';
});
function generatePDF() {
var workplace = '<?php echo $title_message; ?>'; // 여기는 그대로 유지
var today = new Date(); // 현재 날짜를 자바스크립트에서 생성
var formattedDate = "(" + String(today.getFullYear()).slice(-2) + "." + ("0" + (today.getMonth() + 1)).slice(-2) + "." + ("0" + today.getDate()).slice(-2) + ")";
var result = 'KD' + workplace + '_' + formattedDate + '.pdf';
var element = document.getElementById('content-to-print');
var opt = {
margin: [10, 3, 12, 3], // Top, right, bottom, left margins
filename: result,
image: { type: 'jpeg', quality: 0.98 },
html2canvas: { scale: 1 },
jsPDF: { unit: 'mm', format: 'a4', orientation: 'portrait' },
pagebreak: { mode: [''] }
};
html2pdf().from(element).set(opt).save();
}
// 모달을 호출할 때 tr 요소를 저장하는 변수
var selectedRow;
$(document).on('click', '.saveData', function() {
saveData();
});
$(document).on('click', '.approvalBtn', function() {
// 승인자의 이름과 오늘 날짜 가져오기
const userName = '<?=$user_name?>'; // PHP로부터 가져온 사용자 이름
const todayStr = '<?=$todayStr?>'; // PHP로부터 가져온 오늘 날짜
// 승인 정보를 approvalDiv에 표시
$('#approvalDiv').html(
userName + '<br>' + todayStr +
' <i class="bi bi-x-circle remove-approval" style="cursor: pointer;"></i>'
);
$('#approvalDiv').show();
// 결재 정보를 업데이트하여 저장 로직에 반영
updateApprovalData(userName, todayStr);
saveData();
});
// 결재 정보 업데이트 함수
function updateApprovalData(userName, date) {
// 저장 로직을 위해 결재 정보 업데이트
let approvalData = {
writer: {
name: $('#orderman').text().trim(),
date: '<?=$indateStr?>'
},
reviewer: {
name: $('#reviewDiv').is(':visible') ? '<?=$user_name?>' : '',
date: '<?=$todayStr?>'
},
approver: {
name: userName,
date: date
}
};
// 저장할 JSON 데이터 업데이트
let formData = JSON.parse($('#iList').val() || '[]');
const approvalIndex = formData.findIndex(item => item.approval);
if (approvalIndex !== -1) {
formData[approvalIndex].approval = approvalData;
} else {
formData.push({ approval: approvalData });
}
// JSON 문자열로 다시 저장
$('#iList').val(JSON.stringify(formData));
}
// 결재 취소 기능
$(document).on('click', '.remove-approval', function() {
// 결재 정보를 지우고 화면에서 숨김
$('#approvalDiv').html('').hide();
// JSON 데이터에서 결재자의 정보 제거
let formData = JSON.parse($('#iList').val() || '[]');
const approvalIndex = formData.findIndex(item => item.approval);
if (approvalIndex !== -1) {
formData[approvalIndex].approval.approver.name = '';
formData[approvalIndex].approval.approver.date = '';
}
// JSON 문자열로 다시 저장
$('#iList').val(JSON.stringify(formData));
Toastify({
text: "결재 정보가 삭제되었습니다.",
duration: 2000,
close: true,
gravity: "top",
position: "center",
style: {
background: "linear-gradient(to right, #ff5f6d, #ffc371)"
},
}).showToast();
saveData();
});
function captureReturnKey(e) {
if(e.keyCode==13 && e.srcElement.type != 'textarea')
return false;
}
function recaptureReturnKey(e) {
if(e.keyCode==13 && e.srcElement.type != 'textarea')
return false;
}
// 삽입/수정하는 모듈
function saveData() {
// json 형태로 form문에 저장하기
let formData = [];
// 결재 부분 정보 저장
let approvalData = {
writer: {
name: $('#chargedDiv').is(':visible') ? '<?=$user_name?>' : '',
date: '<?=$indateStr?>'
},
approver: {
name: $('#approvalDiv').is(':visible') ? '<?=$user_name?>' : '',
date: '<?=$todayStr?>'
}
};
formData.push({ approval: approvalData });
// 검사자 정보 저장
let productionManager = $('#userNameInput').val();
formData.push({ productionManager: productionManager });
// 추가 정보 저장
formData.push({ num: $('#num').val() });
formData.push({ update_log: $('#update_log').val() });
formData.push({ memo: $('#memo').val() });
// Class 'inputItem' 값 저장
let inputItems = {};
$('.inputItem').each(function() {
let inputName = $(this).attr('name');
inputItems[inputName] = $(this).val();
});
formData.push({ inputItems: inputItems });
// 체크박스 상태 저장
let checkboxData = [];
$('#mainTable tbody tr').each(function(index) {
let rowCheckboxes = {
good: [],
bad: [],
judgement: $(this).find('.judgement').text()
};
$(this).find('.check-good').each(function() {
rowCheckboxes.good.push($(this).prop('checked'));
});
$(this).find('.check-bad').each(function() {
rowCheckboxes.bad.push($(this).prop('checked'));
});
checkboxData.push(rowCheckboxes);
});
formData.push({ checkboxData: checkboxData });
// JSON 문자열로 변환
let jsonString = JSON.stringify(formData);
// 숨겨진 필드에 JSON 데이터 설정
$('#iList').val(jsonString);
$("#overlay").show(); // 오버레이 표시
$("button").prop("disabled", true); // 모든 버튼 비활성화
// 폼데이터 전송시 사용함 Get form
var form = $('#board_form')[0];
var datasource = new FormData(form);
showMsgModal(2); // 파일저장중
$.ajax({
enctype: 'multipart/form-data',
processData: false,
contentType: false,
cache: false,
timeout: 600000,
url: "insert_iList.php",
type: "post",
data: datasource,
dataType: "json",
success: function(data) {
console.log(data);
setTimeout(function() {
Toastify({
text: "저장완료",
duration: 3000,
close: true,
gravity: "top",
position: "center",
style: {
background: "linear-gradient(to right, #00b09b, #96c93d)"
},
}).showToast();
saveAndClose(); //부모창 변경
hideMsgModal();
$("button").prop("disabled", false); // 모든 버튼 활성화
}, 1000);
$("#overlay").hide(); // 오버레이 숨김
},
error: function(jqxhr, status, error) {
console.log(jqxhr, status, error);
alert("An error occurred: " + error);
}
});
}
// 팝업 창에서 데이터 저장 및 닫기 함수
function saveAndClose() {
const updatedData = {
resultJudgement: $("#resultJudgement").val(),
// 필요한 다른 필드도 여기에 추가할 수 있습니다.
};
// 부모 창의 함수 호출
if (window.opener && typeof window.opener.closePopupAndUpdateRow === 'function') {
window.opener.closePopupAndUpdateRow(updatedData);
} else {
console.error("Parent window function not found");
}
// 팝업 창 닫기
// window.close();
}
// 초기값 불러오기
$(document).ready(function() {
console.log(iListData);
if (iListData.length > 0) {
// 결재 부분 정보
const approval = iListData.find(item => item.approval);
if (approval) {
if (approval.approval.writer.name && approval.approval.writer.date) {
$('#chargedDiv').show();
$('#chargedDiv').html(
approval.approval.writer.name + '<br>' + approval.approval.writer.date
);
} else {
$('#chargedDiv').hide().html('');
}
if (approval.approval.approver.name && approval.approval.approver.date) {
$('#approvalDiv').show();
$('#approvalDiv').html(
approval.approval.approver.name + '<br>' + approval.approval.approver.date +
' <i class="bi bi-x-circle remove-approval" style="cursor: pointer;"></i>'
);
} else {
$('#approvalDiv').hide().html('');
}
$('#workdate').text(approval.approval.writer.date);
}
// 검사자 정보
const productionManager = iListData.find(item => item.productionManager);
if (productionManager && productionManager.productionManager) {
$('#userNameInput').val(productionManager.productionManager).show();
$('#inputContainer').show();
$('#editButton').hide();
} else {
$('#userNameInput').val('');
$('#inputContainer').hide();
$('#editButton').show();
}
// inputItem 데이터 로드
const inputItems = iListData.find(item => item.inputItems);
if (inputItems && inputItems.inputItems) {
for (const [name, value] of Object.entries(inputItems.inputItems)) {
$(`.inputItem[name="${name}"]`).val(value);
}
}
// 체크박스 상태 로드
const checkboxData = iListData.find(item => item.checkboxData);
if (checkboxData && checkboxData.checkboxData) {
$('#mainTable tbody tr').each(function(index) {
const rowData = checkboxData.checkboxData[index];
if (rowData) {
$(this).find('.check-good').each(function(goodIndex) {
$(this).prop('checked', rowData.good[goodIndex]);
});
$(this).find('.check-bad').each(function(badIndex) {
$(this).prop('checked', rowData.bad[badIndex]);
});
$(this).find('.judgement').text(rowData.judgement);
}
});
}
}
});
// 첫번째 요소를 클릭하면 전체 로트번호 적용하기
$(document).ready(function() {
// id가 mainTable인 테이블의 첫 번째 td를 클릭했을 때 이벤트를 등록합니다.
$('#mainTable').on('click', 'td:first-child', function() {
// 클릭한 첫 번째 td의 형제인 두 번째 td 요소의 값을 가져옵니다.
var secondTdValue = $(this).siblings().find('input').val();
// id가 mainTable인 테이블에서 두 번째 td 요소에 해당 값을 적용합니다.
$('#mainTable tbody tr').each(function() {
$(this).find('td:nth-child(2) input').val(secondTdValue);
});
});
});
</script>
<script>
$(document).ready(function() {
var thickness = <?= isset($thickness) ? $thickness : 'null' ?>;
var width = <?= isset($width) ? $width : 'null' ?>;
$('#mainTable tbody tr').each(function() {
var $row = $(this);
var $judgementCell = $row.find('.judgement');
function updateJudgement() {
var isValidThickness = true;
var isValidWidth = true;
var isValidLength = true;
var isValidNo3 = true; // 3행의 밀도
var isValidNo4 = true;
var isValidNo5 = true;
var allFieldsFilled = true; // 모든 필드가 채워졌는지 확인하는 플래그
// 두께 허용 범위 설정
var thicknessTolerance;
thicknessTolerance = 4;
// 두께 범위 비교
$row.find('input[name^="record_thickness"]').each(function() {
var value = parseFloat($(this).val());
if (isNaN(value)) {
allFieldsFilled = false;
return false;
}
// var lowerLimit = thickness - thickness * 0.02 ;
var lowerLimit = thickness - 2 ;
console.log('두께 lowerLimit : ', lowerLimit);
var upperLimit = thickness + thicknessTolerance ;
if (value < lowerLimit || value > upperLimit) {
isValidThickness = false;
}
});
// 너비 허용 범위 설정
var widthTolerance;
widthTolerance = 0.04;
$row.find('input[name^="record_width"]').each(function() {
var value = parseFloat($(this).val());
if (isNaN(value)) {
allFieldsFilled = false;
return false;
}
var lowerLimit = width - width * 0.02 ;
var upperLimit = width + width * widthTolerance ;
if (value < lowerLimit || value > upperLimit) {
isValidWidth = false;
}
});
// No3 허용 범위 설정
$row.find('input[name^="No3"]').each(function() {
var value = parseFloat($(this).val());
if (isNaN(value)) {
allFieldsFilled = false;
return false;
}
var lowerLimit = 85;
var upperLimit = 115;
if (value < lowerLimit || value > upperLimit) {
isValidNo3 = false;
}
});
// No4 허용 범위 설정 (숏함수)
$row.find('input[name^="No4"]').each(function() {
var value = parseFloat($(this).val());
if (isNaN(value)) {
allFieldsFilled = false;
return false;
}
if (value > 25 ) {
isValidNo4 = false;
}
});
// No5 허용 범위 설정
$row.find('input[name^="No5"]').each(function() {
var value = parseFloat($(this).val());
if (isNaN(value)) {
allFieldsFilled = false;
return false;
}
if (value > 3 ) {
isValidNo5 = false;
}
});
// OK/NG 체크박스 상태 검사
var allGood = true;
var anyBad = false;
// 해당 행에 OK 체크박스가 있는지 확인
if ($row.find('.check-good').length > 0) {
$row.find('.check-good').each(function() {
// 체크박스가 undefined이거나 제대로 체크되지 않으면 필드가 채워지지 않은 것으로 판단
if (isNaN($(this).is(':checked'))) {
allFieldsFilled = false;
return false;
}
if (!$(this).is(':checked')) {
allGood = false;
}
});
}
// 해당 행에 NG 체크박스가 있는지 확인
if ($row.find('.check-bad').length > 0) {
$row.find('.check-bad').each(function() {
if (isNaN($(this).is(':checked'))) {
allFieldsFilled = false;
return false;
}
if ($(this).is(':checked')) {
anyBad = true;
}
});
}
// OK/NG 체크박스 상태 검사
var checkedGood = 0; // 체크된 OK 체크박스 수
var checkedBad = 0; // 체크된 NG 체크박스 수
// 각 열의 OK/NG 체크박스를 한 번만 확인하도록 변경
var goodChecks = $row.find('.check-good');
var badChecks = $row.find('.check-bad');
// 해당 행에 OK 체크박스가 있는지 확인
if (goodChecks.length > 0) {
goodChecks.each(function() {
if ($(this).is(':checked')) {
checkedGood++; // OK 체크박스가 체크되면 증가
}
});
}
// 해당 행에 NG 체크박스가 있는지 확인
if (badChecks.length > 0) {
badChecks.each(function() {
if ($(this).is(':checked')) {
checkedBad++; // NG 체크박스가 체크되면 증가
}
});
}
// 모든 체크박스가 다 체크되지 않았다면 공백으로 처리
if (checkedGood + checkedBad !== 3 && (goodChecks.length > 0 || badChecks.length > 0)) {
allFieldsFilled = false; // 모두 체크되지 않았다면 공백 표시
}
// 모든 필드가 채워지지 않았으면 공백으로 설정
if (!allFieldsFilled) {
$judgementCell.text('');
} else {
// 판정 업데이트
if (isValidThickness && isValidWidth && isValidNo3 && isValidNo4 && isValidNo5 && allGood && !anyBad) {
$judgementCell.text('적');
} else {
$judgementCell.text('부');
}
}
}
// 페이지 로드 시 초기 판단
updateJudgement();
// 체크박스 토글
$row.find('td').each(function() {
var $goodCheck = $(this).find('.check-good');
var $badCheck = $(this).find('.check-bad');
$goodCheck.on('change', function() {
if ($(this).is(':checked')) {
$badCheck.prop('checked', false);
}
updateJudgement();
updateFinalJudgement();
});
$badCheck.on('change', function() {
if ($(this).is(':checked')) {
$goodCheck.prop('checked', false);
}
updateJudgement();
updateFinalJudgement();
});
});
// input 값 변경 시 판정 업데이트
$row.find('input').on('input', updateJudgement);
$row.find('input').on('input', updateFinalJudgement);
});
// 최종 종합 판정 업데이트 함수
function updateFinalJudgement() {
var allPass = true;
var allJudged = true;
$('#mainTable tbody tr .judgement').each(function() {
var judgementText = $(this).text();
if (judgementText === '') {
allJudged = false;
}
if (judgementText === '부') {
allPass = false;
$(this).css('background-color', '#f8d7da');
} else {
$(this).css('background-color', '');
}
});
if (allJudged) {
if (allPass) {
$('#resultJudgement').val('합격');
} else {
$('#resultJudgement').val('불합격');
}
} else {
$('#resultJudgement').val('');
}
}
// 페이지 로드 시 최종 판정 업데이트
updateFinalJudgement();
});
// 'allclick' ID를 가진 요소를 클릭했을 때 실행
$(document).ready(function() {
$('#allclick').on('click', function() {
// 1. 모든 체크박스를 체크 상태로 설정
// $('.check-G').prop('checked', true);
showMsgModal(3); // 파일처리중
// 두께 설정
$('#record_thickness1').val($('#input_thickness').text());
$('#record_thickness2').val($('#input_thickness').text());
$('#record_thickness3').val($('#input_thickness').text());
// 너비 설정
$('#record_width1').val($('#input_width').text());
$('#record_width2').val($('#input_width').text());
$('#record_width3').val($('#input_width').text());
// 밀도, 숏함수율, 가열선 수축률 설정
$('#No3').val('85');
$('#No4').val('25');
$('#No5').val('3');
// 강제로 input 요소의 input/change 이벤트 발생
$('.inputItem').each(function() {
$(this).trigger('input'); // 또는 'change' 이벤트
});
setTimeout(function () {
$('.check-good').trigger('click');
console.log('.check-G 요소가 클릭되었습니다.');
hideMsgModal();
}, 1000); // 1초 후 실행
// 저장 (주석 처리된 부분)
// saveData();
});
});
</script>
<?php require_once $_SERVER['DOCUMENT_ROOT'] . '/' . $tablename . '/common/JS_instock.php'; ?> <!-- instock 후반부 공통 JS -->
</body>
</html>

849
instock/i_controller.php Normal file
View File

@@ -0,0 +1,849 @@
<?php
$tablename = 'instock';
?>
<?php include $_SERVER['DOCUMENT_ROOT'] . '/' . $tablename . '/common/head.php' ; ?> <!-- head 정보 불러오기 -->
<?php
// print $spec;
$itemTitle = '연동 폐쇄기구';
$today = date("Y-m-d");
require_once $_SERVER['DOCUMENT_ROOT'] . '/instock/commonDriveLoad.php'; // 구글드라이브 파일형태 이미지형태 읽어오기 모듈
$savetitle ='수입검사성적서';
?>
<?php include $_SERVER['DOCUMENT_ROOT'] . '/' . $tablename . '/common/instock_btn.php'; ?> <!-- Btn 정보 불러오기 -->
<div id="content-to-print">
<br>
<div class="container mt-3">
<div class="d-flex align-items-center justify-content-center m-1">
<table class="table " style="border-collapse: collapse;">
<thead>
<tr>
<th rowspan="3" class="text-center" style="width:70%;">
<div class="row">
<div class="col-sm-2">
<img src="../img/kdlogo.png" alt="경동기업" class="me-1" style="width:100%; height:auto;">
</div>
<div class="col-sm-10">
<div class="d-flex align-items-center justify-content-center m-1">
<span class="text-dark ms-1 me-1 fs-2" > &nbsp; 수 </span>
<span class="text-dark me-1 fs-2" > &nbsp; 입 </span>
<span class="text-dark me-1 fs-2" > &nbsp; 검 </span>
<span class="text-dark me-1 fs-2" > &nbsp; 사 </span>
<span class="text-dark me-1 fs-2" > &nbsp; </span>
<span class="text-dark me-1 fs-2" > &nbsp; 성 </span>
<span class="text-dark me-1 fs-2" > &nbsp; 적 </span>
<span class="text-dark me-1 fs-2" > &nbsp; 서 </span>
</div>
</div>
</div>
</th>
<th rowspan="3" class="text-center fw-bold" style="height:100px;">결 재</th>
<th class="text-center p-1" style="width : 100px; height:22px; padding:2px;">담당</th>
<th class="text-center p-1" style="width : 100px; height:22px; padding:2px;">부서장</th>
</tr>
<tr style="height:40px;">
<th class="text-center">
<div id="chargedDiv" style="display: none;">
<span id="orderman"> <?=$orderman?> </span> <br> <?=$indateStr ?>
</div>
</th>
<th class="text-center">
<div id="approvalDiv" style="display: none;">
<?=$user_name?> <br> <?=$todayStr ?>
</div>
</th>
</tr>
<tr>
<th colspan="2"> 입고일자 : <?=$inspection_date?></th>
</tr>
</thead>
</table>
</div>
<div class="d-flex align-items-center justify-content-center m-1">
<table class="table table-bordered" style="border-collapse: collapse;">
<tbody>
<tr>
<td class="text-center align-middle lightgray">품 명</td>
<td colspan="2" class="text-center fw-bold"><?=$itemTitle?></td>
<td class="text-center align-middle lightgray">납품업체<br>제조업체</td>
<td class="text-center text-primary fw-bold"><?=$supplier?> <br> (<?=$manufacturer?>) </td>
</tr>
<tr>
<td class="text-center align-middle lightgray">규 격 </td>
<td colspan="2" class="text-center fw-bold"><?=$spec?></td>
<td class="text-center align-middle lightgray">로트번호</td>
<td colspan="1" class="text-center text-primary fw-bold">
<?=$lot_no?>
</td>
</tr>
<tr>
<td class="text-center align-middle lightgray">자재번호</td>
<td colspan="2" class="text-center fw-bold"><?=$material_no?> <br> <?=$remarks?> </td>
<td class="text-center align-middle lightgray">검사일자</td>
<td colspan="1" class="text-center text-primary fw-bold">
<?=$indateStr?>
</td>
</tr>
<tr>
<td class="text-center align-middle lightgray">로트크기</td>
<td class="text-center text-dark fw-bold"><?=$received_qty?> </td>
<td class="text-center text-dark fw-bold"><?=$unit?> </td>
<td class="text-center align-middle lightgray">검사자</td>
<td class="text-center">
<div class="d-flex justify-content-center">
<button type="button" id="editButton" class="btn btn-primary btn-sm">검사자</button>
<div id="inputContainer" style="display: none;">
<input type="text" id="userNameInput" class="form-control d-inline-block noborder-input text-center" style="width:100px;" autocomplete="off" style="widtd: 100px;" value="<?=$user_name?>">
<button type="button" id="cancelButton" class="btn btn-outline-danger btn-sm"> <i class="bi bi-x"> </i> </button>
</div>
</div>
</td>
</tr>
<script>
$(document).ready(function() {
// '담당자 입력' 버튼 클릭 시 input 표시 및 버튼 숨김
$('#editButton').on('click', function() {
$('#editButton').hide();
$('#inputContainer').show();
$('#workdate').text('<?php echo $todayStr; ?>');
$('#chargedDiv').show();
});
// '취소' 버튼 클릭 시 원래 상태로 되돌림
$('#cancelButton').on('click', function() {
$('#inputContainer').hide();
$('#chargedDiv').hide();
$('#workdate').text('');
$('#editButton').show();
});
});
</script>
</tbody>
</table>
</div>
<div class="row justify-content-start m-1 mt-2">
<table id="mainTable" class="table table-hover" style="border-collapse: collapse;">
<thead>
<tr>
<th class="text-center align-middle" rowspan="2">NO</th>
<th class="text-center align-middle" rowspan="2" colspan="2">검사항목</th>
<th class="text-center align-middle" rowspan="2" colspan="2">검사기준</th>
<th class="text-center align-middle" rowspan="2">검사방식</th>
<th class="text-center align-middle" rowspan="2">검사주기</th>
<th class="text-center align-middle" colspan="3">측정치</th>
<th class="text-center align-middle" rowspan="2">판정 <br> (적/부)</th>
</tr>
<tr>
<th class="text-center">n1 <br> 양호/불량 </th>
<th class="text-center">n2 <br> 양호/불량 </th>
<th class="text-center">n3 <br> 양호/불량 </th>
</tr>
</thead>
<tbody>
<!-- 첫 번째 행 (겉모양) -->
<tr>
<td class="text-center align-middle" rowspan="1">1</td>
<td class="text-center align-middle" colspan="2">겉모양</td>
<td class="text-center align-middle" colspan="2">사용상 해로울 <br> 결함이 없을 것</td>
<td class="text-center align-middle" rowspan="2">육안검사</td>
<td class="text-center align-middle" rowspan="6">n = 3 <br>c = 0</td>
<td class="text-center align-middle">
<label>
<input type="checkbox" class="check-good"> OK
</label>
<label>
<input type="checkbox" class="check-bad"> NG
</label>
</td>
<td class="text-center align-middle">
<label>
<input type="checkbox" class="check-good"> OK
</label>
<label>
<input type="checkbox" class="check-bad"> NG
</label>
</td>
<td class="text-center align-middle">
<label>
<input type="checkbox" class="check-good"> OK
</label>
<label>
<input type="checkbox" class="check-bad"> NG
</label>
</td>
<td class="text-center align-middle judgement"></td>
</tr>
<!-- 구성품 -->
<tr>
<td class="text-center align-middle" rowspan="1">2</td>
<td class="text-center align-middle" colspan="2">구성품</td>
<td class="text-center align-middle" colspan="2">구성품 누락이 없어야함 <br> (제품사진 구성품)</td>
<td class="text-center align-middle">
<label>
<input type="checkbox" class="check-good"> OK
</label>
<label>
<input type="checkbox" class="check-bad"> NG
</label>
</td>
<td class="text-center align-middle">
<label>
<input type="checkbox" class="check-good"> OK
</label>
<label>
<input type="checkbox" class="check-bad"> NG
</label>
</td>
<td class="text-center align-middle">
<label>
<input type="checkbox" class="check-good"> OK
</label>
<label>
<input type="checkbox" class="check-bad"> NG
</label>
</td>
<td class="text-center align-middle judgement"></td>
</tr>
<?php
// 두께 범위에 맞는 체크된 사각형을 표시하는 함수
function renderCheckBox($min, $max, $value) {
if ($value >= $min && $value < $max) {
return '✅'; // 체크된 사각형
} else {
return '□'; // 빈 사각형
}
}
// 길이 범위에 맞는 체크된 사각형을 표시하는 함수
function renderLengthCheckBox($min, $max, $length) {
if ($length >= $min && $length < $max) {
return '✅'; // 체크된 사각형
} else {
return '□'; // 빈 사각형
}
}
// 이하
function renderincludeCheckBox($min, $max, $length) {
if ($length > $min && $length <= $max) {
return '✅'; // 체크된 사각형
} else {
return '□'; // 빈 사각형
}
}
?>
<tr>
<td class="text-center align-middle" rowspan="1">3</td>
<td class="text-center align-middle" colspan="2" rowspan="1"> 셋팅설정 및 <br> set램프 표시상태 </td>
<td class="text-center align-middle" colspan="2"> 셋팅 전 점등상태,<br> 셋팅 후 소등상태로<br> 되어야함 (상 or 하 <br> 셋팅이 한개만 설정되었을 <br> 경우 점멸 상태임)</td>
<td class="text-center align-middle" rowspan="4"> 체크검사 </td>
<td class="text-center align-middle" rowspan="4" colspan="3"> 공급업체 성적서로 <br> 대체 </td>
<td class="text-center align-middle judgement" rowspan="4"></td>
</tr>
<tr>
<td class="text-center align-middle" rowspan="1">4</td>
<td class="text-center align-middle" colspan="2" rowspan="1">소방 테스트 모드</td>
<td class="text-center align-middle" colspan="2"> 연기 및 열감지 시 동작될 것</td>
</tr>
<tr>
<td class="text-center align-middle" rowspan="1">5</td>
<td class="text-center align-middle" colspan="2" rowspan="1">기타 기능설정</td>
<td class="text-center align-middle" colspan="2"> 셋팅해제, 방향변경, <br> 모터번호 변경 기능이 <br> 원활히 이루어져야함 </td>
</tr>
<tr>
<td class="text-center align-middle" rowspan="1">6</td>
<td class="text-center align-middle" colspan="2" rowspan="1">음성멘트</td>
<td class="text-center align-middle" colspan="2"> 기능 작동 시 <br> 해당 음성멘트가 <br> 정확히 안내되어야함</td>
</tr>
<!-- 종합판정 -->
<tr>
<td colspan="8" rowspan="4" class="text-center align-top">
<div class="text-start fw-bold mt-1">
<span>[부적합 내용]</span> <br>
<span>
<input type="text" class="form-control text-start inputItem noborder-input" style="height:50px;" id="input_memo" name="input_memo" autocomplete="off">
&nbsp;</span>
</div>
</td>
<td colspan="3" class="text-center align-middle yellowredBold">
<div class="d-flex justify-content-center align-items-center fw-bold">
<span class="text-dark">종합판정</span>
</div>
</td>
</tr>
<tr>
<td colspan="3" rowspan="3" class="text-center align-middle">
<div class="text-center fw-bold mt-3 fs-1 ">
<input type="text" class="form-control fs-2 text-center inputItem noborder-input" style="height:50px;" id="resultJudgement" name="resultJudgement" autocomplete="off">
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</form>
</div> <!-- end of container -->
<div class="container mb-5 mt-2">
<div class="d-flex align-items-center justify-content-center mb-5">
</div>
</div>
<!-- 페이지로딩 -->
<script>
$(document).ready(function(){
var loader = document.getElementById('loadingOverlay');
if(loader)
loader.style.display = 'none';
});
function generatePDF() {
var workplace = '<?php echo $title_message; ?>';
var deadline = '<?php echo $today; ?>';
var deadlineDate = new Date(deadline);
var formattedDate = "(" + String(deadlineDate.getFullYear()).slice(-2) + "." + ("0" + (deadlineDate.getMonth() + 1)).slice(-2) + "." + ("0" + deadlineDate.getDate()).slice(-2) + ")";
var result = 'KD' + workplace +'_' + formattedDate + '.pdf';
var element = document.getElementById('content-to-print');
var opt = {
margin: [10, 3, 12, 3], // Top, right, bottom, left margins
filename: result,
image: { type: 'jpeg', quality: 0.98 },
html2canvas: { scale: 1 },
jsPDF: { unit: 'mm', format: 'a4', orientation: 'portrait' },
pagebreak: { mode: [''] }
};
html2pdf().from(element).set(opt).save();
}
// 모달을 호출할 때 tr 요소를 저장하는 변수
var selectedRow;
$(document).on('click', '.saveData', function() {
saveData();
});
$(document).on('click', '.approvalBtn', function() {
// 승인자의 이름과 오늘 날짜 가져오기
const userName = '<?=$user_name?>'; // PHP로부터 가져온 사용자 이름
const todayStr = '<?=$todayStr?>'; // PHP로부터 가져온 오늘 날짜
// 승인 정보를 approvalDiv에 표시
$('#approvalDiv').html(
userName + '<br>' + todayStr +
' <i class="bi bi-x-circle remove-approval" style="cursor: pointer;"></i>'
);
$('#approvalDiv').show();
// 결재 정보를 업데이트하여 저장 로직에 반영
updateApprovalData(userName, todayStr);
saveData();
});
// 결재 정보 업데이트 함수
function updateApprovalData(userName, date) {
// 저장 로직을 위해 결재 정보 업데이트
let approvalData = {
writer: {
name: $('#orderman').text().trim(),
date: '<?=$indateStr?>'
},
reviewer: {
name: $('#reviewDiv').is(':visible') ? '<?=$user_name?>' : '',
date: '<?=$todayStr?>'
},
approver: {
name: userName,
date: date
}
};
// 저장할 JSON 데이터 업데이트
let formData = JSON.parse($('#iList').val() || '[]');
const approvalIndex = formData.findIndex(item => item.approval);
if (approvalIndex !== -1) {
formData[approvalIndex].approval = approvalData;
} else {
formData.push({ approval: approvalData });
}
// JSON 문자열로 다시 저장
$('#iList').val(JSON.stringify(formData));
}
// 결재 취소 기능
$(document).on('click', '.remove-approval', function() {
// 결재 정보를 지우고 화면에서 숨김
$('#approvalDiv').html('').hide();
// JSON 데이터에서 결재자의 정보 제거
let formData = JSON.parse($('#iList').val() || '[]');
const approvalIndex = formData.findIndex(item => item.approval);
if (approvalIndex !== -1) {
formData[approvalIndex].approval.approver.name = '';
formData[approvalIndex].approval.approver.date = '';
}
// JSON 문자열로 다시 저장
$('#iList').val(JSON.stringify(formData));
Toastify({
text: "결재 정보가 삭제되었습니다.",
duration: 2000,
close: true,
gravity: "top",
position: "center",
style: {
background: "linear-gradient(to right, #ff5f6d, #ffc371)"
},
}).showToast();
saveData();
});
function captureReturnKey(e) {
if(e.keyCode==13 && e.srcElement.type != 'textarea')
return false;
}
function recaptureReturnKey(e) {
if(e.keyCode==13 && e.srcElement.type != 'textarea')
return false;
}
// 삽입/수정하는 모듈
function saveData() {
// json 형태로 form문에 저장하기
let formData = [];
// 결재 부분 정보 저장
let approvalData = {
writer: {
name: $('#chargedDiv').is(':visible') ? '<?=$user_name?>' : '',
date: '<?=$indateStr?>'
},
approver: {
name: $('#approvalDiv').is(':visible') ? '<?=$user_name?>' : '',
date: '<?=$todayStr?>'
}
};
formData.push({ approval: approvalData });
// 검사자 정보 저장
let productionManager = $('#userNameInput').val();
formData.push({ productionManager: productionManager });
// 추가 정보 저장
formData.push({ num: $('#num').val() });
formData.push({ update_log: $('#update_log').val() });
formData.push({ memo: $('#memo').val() });
// Class 'inputItem' 값 저장
let inputItems = {};
$('.inputItem').each(function() {
let inputName = $(this).attr('name');
inputItems[inputName] = $(this).val();
});
formData.push({ inputItems: inputItems });
// 체크박스 상태 저장
let checkboxData = [];
$('#mainTable tbody tr').each(function(index) {
let rowCheckboxes = {
good: [],
bad: [],
judgement: $(this).find('.judgement').text()
};
$(this).find('.check-good').each(function() {
rowCheckboxes.good.push($(this).prop('checked'));
});
$(this).find('.check-bad').each(function() {
rowCheckboxes.bad.push($(this).prop('checked'));
});
checkboxData.push(rowCheckboxes);
});
formData.push({ checkboxData: checkboxData });
// JSON 문자열로 변환
let jsonString = JSON.stringify(formData);
// 숨겨진 필드에 JSON 데이터 설정
$('#iList').val(jsonString);
$("#overlay").show(); // 오버레이 표시
$("button").prop("disabled", true); // 모든 버튼 비활성화
// 폼데이터 전송시 사용함 Get form
var form = $('#board_form')[0];
var datasource = new FormData(form);
showMsgModal(2); // 파일저장중
$.ajax({
enctype: 'multipart/form-data',
processData: false,
contentType: false,
cache: false,
timeout: 600000,
url: "insert_iList.php",
type: "post",
data: datasource,
dataType: "json",
success: function(data) {
console.log(data);
setTimeout(function() {
Toastify({
text: "저장완료",
duration: 3000,
close: true,
gravity: "top",
position: "center",
style: {
background: "linear-gradient(to right, #00b09b, #96c93d)"
},
}).showToast();
saveAndClose(); //부모창 변경
hideMsgModal();
$("button").prop("disabled", false); // 모든 버튼 활성화
}, 1000);
$("#overlay").hide(); // 오버레이 숨김
},
error: function(jqxhr, status, error) {
console.log(jqxhr, status, error);
alert("An error occurred: " + error);
}
});
}
// 팝업 창에서 데이터 저장 및 닫기 함수
function saveAndClose() {
const updatedData = {
resultJudgement: $("#resultJudgement").val(),
// 필요한 다른 필드도 여기에 추가할 수 있습니다.
};
// 부모 창의 함수 호출
if (window.opener && typeof window.opener.closePopupAndUpdateRow === 'function') {
window.opener.closePopupAndUpdateRow(updatedData);
} else {
console.error("Parent window function not found");
}
// 팝업 창 닫기
// window.close();
}
// 초기값 불러오기
$(document).ready(function() {
console.log(iListData);
if (iListData.length > 0) {
// 결재 부분 정보
const approval = iListData.find(item => item.approval);
if (approval) {
if (approval.approval.writer.name && approval.approval.writer.date) {
$('#chargedDiv').show();
$('#chargedDiv').html(
approval.approval.writer.name + '<br>' + approval.approval.writer.date
);
} else {
$('#chargedDiv').hide().html('');
}
if (approval.approval.approver.name && approval.approval.approver.date) {
$('#approvalDiv').show();
$('#approvalDiv').html(
approval.approval.approver.name + '<br>' + approval.approval.approver.date +
' <i class="bi bi-x-circle remove-approval" style="cursor: pointer;"></i>'
);
} else {
$('#approvalDiv').hide().html('');
}
$('#workdate').text(approval.approval.writer.date);
}
// 검사자 정보
const productionManager = iListData.find(item => item.productionManager);
if (productionManager && productionManager.productionManager) {
$('#userNameInput').val(productionManager.productionManager).show();
$('#inputContainer').show();
$('#editButton').hide();
} else {
$('#userNameInput').val('');
$('#inputContainer').hide();
$('#editButton').show();
}
// inputItem 데이터 로드
const inputItems = iListData.find(item => item.inputItems);
if (inputItems && inputItems.inputItems) {
for (const [name, value] of Object.entries(inputItems.inputItems)) {
$(`.inputItem[name="${name}"]`).val(value);
}
}
// 체크박스 상태 로드
const checkboxData = iListData.find(item => item.checkboxData);
if (checkboxData && checkboxData.checkboxData) {
$('#mainTable tbody tr').each(function(index) {
const rowData = checkboxData.checkboxData[index];
if (rowData) {
$(this).find('.check-good').each(function(goodIndex) {
$(this).prop('checked', rowData.good[goodIndex]);
});
$(this).find('.check-bad').each(function(badIndex) {
$(this).prop('checked', rowData.bad[badIndex]);
});
$(this).find('.judgement').text(rowData.judgement);
}
});
}
}
});
// 첫번째 요소를 클릭하면 전체 로트번호 적용하기
$(document).ready(function() {
// id가 mainTable인 테이블의 첫 번째 td를 클릭했을 때 이벤트를 등록합니다.
$('#mainTable').on('click', 'td:first-child', function() {
// 클릭한 첫 번째 td의 형제인 두 번째 td 요소의 값을 가져옵니다.
var secondTdValue = $(this).siblings().find('input').val();
// id가 mainTable인 테이블에서 두 번째 td 요소에 해당 값을 적용합니다.
$('#mainTable tbody tr').each(function() {
$(this).find('td:nth-child(2) input').val(secondTdValue);
});
});
});
// 부트스트랩 툴팁
$(document).ready(function() {
var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]'));
var tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) {
return new bootstrap.Tooltip(tooltipTriggerEl);
});
});
</script>
<script>
$(document).ready(function() {
var thickness = <?= isset($thickness) ? $thickness : 'null' ?>;
var width = <?= isset($width) ? $width : 'null' ?>;
var height = <?= isset($height) ? $height : 'null' ?>;
var length = <?= isset($length) ? $length : 'null' ?>;
console.log('width', width);
console.log('height', height);
$('#mainTable tbody tr').each(function() {
var $row = $(this);
var $judgementCell = $row.find('.judgement');
function updateJudgement() {
var isValidThickness = true;
var isValidWidth = true;
var isValidHeight = true;
var isValidLength = true;
var isValidTensile = true;
var isValidYieldStrength = true;
var isValidElongation = true;
var allFieldsFilled = true; // 모든 필드가 채워졌는지 확인하는 플래그
// 두께 허용 범위 설정
var Up_thicknessTolerance;
var Down_thicknessTolerance;
if (thickness < 6.3 ) {
Up_thicknessTolerance = 0.6;
Down_thicknessTolerance = 0.6;
}
// 두께 범위 비교
$row.find('input[name^="record_thickness"]').each(function() {
var value = parseFloat($(this).val());
if (isNaN(value)) {
allFieldsFilled = false;
return false;
}
var lowerLimit = thickness - Down_thicknessTolerance;
var upperLimit = thickness + Up_thicknessTolerance;
if (value < lowerLimit || value > upperLimit) {
isValidThickness = false;
}
});
// OK/NG 체크박스 상태 검사
var allGood = true;
var anyBad = false;
// 해당 행에 OK 체크박스가 있는지 확인
if ($row.find('.check-good').length > 0) {
$row.find('.check-good').each(function() {
// 체크박스가 undefined이거나 제대로 체크되지 않으면 필드가 채워지지 않은 것으로 판단
if (isNaN($(this).is(':checked'))) {
allFieldsFilled = false;
return false;
}
if (!$(this).is(':checked')) {
allGood = false;
}
});
}
// 해당 행에 NG 체크박스가 있는지 확인
if ($row.find('.check-bad').length > 0) {
$row.find('.check-bad').each(function() {
if (isNaN($(this).is(':checked'))) {
allFieldsFilled = false;
return false;
}
if ($(this).is(':checked')) {
anyBad = true;
}
});
}
// OK/NG 체크박스 상태 검사
var checkedGood = 0; // 체크된 OK 체크박스 수
var checkedBad = 0; // 체크된 NG 체크박스 수
// 각 열의 OK/NG 체크박스를 한 번만 확인하도록 변경
var goodChecks = $row.find('.check-good');
var badChecks = $row.find('.check-bad');
// 해당 행에 OK 체크박스가 있는지 확인
if (goodChecks.length > 0) {
goodChecks.each(function() {
if ($(this).is(':checked')) {
checkedGood++; // OK 체크박스가 체크되면 증가
}
});
}
// 해당 행에 NG 체크박스가 있는지 확인
if (badChecks.length > 0) {
badChecks.each(function() {
if ($(this).is(':checked')) {
checkedBad++; // NG 체크박스가 체크되면 증가
}
});
}
// 모든 체크박스가 다 체크되지 않았다면 공백으로 처리
if (checkedGood + checkedBad !== 3 && (goodChecks.length > 0 || badChecks.length > 0)) {
allFieldsFilled = false; // 모두 체크되지 않았다면 공백 표시
}
// 모든 필드가 채워지지 않았으면 공백으로 설정
if (!allFieldsFilled) {
$judgementCell.text('');
} else {
// 판정 업데이트
if (isValidThickness && isValidWidth && isValidHeight && isValidLength && isValidTensile && isValidElongation && isValidYieldStrength && allGood && !anyBad) {
$judgementCell.text('적');
} else {
$judgementCell.text('부');
}
}
}
// 페이지 로드 시 초기 판단
updateJudgement();
// 체크박스 토글
$row.find('td').each(function() {
var $goodCheck = $(this).find('.check-good');
var $badCheck = $(this).find('.check-bad');
$goodCheck.on('change', function() {
if ($(this).is(':checked')) {
$badCheck.prop('checked', false);
}
updateJudgement();
updateFinalJudgement();
});
$badCheck.on('change', function() {
if ($(this).is(':checked')) {
$goodCheck.prop('checked', false);
}
updateJudgement();
updateFinalJudgement();
});
});
// input 값 변경 시 판정 업데이트
$row.find('input').on('input', updateJudgement);
$row.find('input').on('input', updateFinalJudgement);
});
// 최종 종합 판정 업데이트 함수
function updateFinalJudgement() {
var allPass = true;
var allJudged = true;
$('#mainTable tbody tr .judgement').each(function() {
var judgementText = $(this).text();
if (judgementText === '') {
allJudged = false;
}
if (judgementText === '부') {
allPass = false;
$(this).css('background-color', '#f8d7da');
} else {
$(this).css('background-color', '');
}
});
if (allJudged) {
if (allPass) {
$('#resultJudgement').val('합격');
} else {
$('#resultJudgement').val('불합격');
}
} else {
$('#resultJudgement').val('');
}
}
// 페이지 로드 시 최종 판정 업데이트
updateFinalJudgement();
});
</script>
<?php require_once $_SERVER['DOCUMENT_ROOT'] . '/' . $tablename . '/common/JS_instock.php'; ?> <!-- instock 후반부 공통 JS -->
</body>
</html>

1125
instock/i_fiber.php Normal file

File diff suppressed because it is too large Load Diff

833
instock/i_fireproofWire.php Normal file
View File

@@ -0,0 +1,833 @@
<?php
$tablename = 'instock';
?>
<?php include $_SERVER['DOCUMENT_ROOT'] . '/' . $tablename . '/common/head.php' ; ?> <!-- head 정보 불러오기 -->
<?php
$thickness = 0.6;
$weight = 313;
$tex = 190;
$kgf = 7.5;
$itemTitle = '메탈/아라미드 재봉사 "내화실" ' ;
$spec = 'SUS316L + Para aramid';
$today = date("Y-m-d");
require_once $_SERVER['DOCUMENT_ROOT'] . '/instock/commonDriveLoad.php'; // 구글드라이브 파일형태 이미지형태 읽어오기 모듈
$savetitle ='수입검사성적서';
?>
<?php include $_SERVER['DOCUMENT_ROOT'] . '/' . $tablename . '/common/instock_btn.php'; ?> <!-- Btn 정보 불러오기 -->
<div id="content-to-print">
<br>
<div class="container mt-3">
<div class="d-flex align-items-center justify-content-center m-1">
<table class="table " style="border-collapse: collapse;">
<thead>
<tr>
<th rowspan="3" class="text-center" style="width:70%;">
<div class="row">
<div class="col-sm-2">
<img src="../img/kdlogo.png" alt="경동기업" class="me-1" style="width:100%; height:auto;">
</div>
<div class="col-sm-10">
<div class="d-flex align-items-center justify-content-center m-1">
<span class="text-dark ms-1 me-1 fs-2" > &nbsp; 수 </span>
<span class="text-dark me-1 fs-2" > &nbsp; 입 </span>
<span class="text-dark me-1 fs-2" > &nbsp; 검 </span>
<span class="text-dark me-1 fs-2" > &nbsp; 사 </span>
<span class="text-dark me-1 fs-2" > &nbsp; </span>
<span class="text-dark me-1 fs-2" > &nbsp; 성 </span>
<span class="text-dark me-1 fs-2" > &nbsp; 적 </span>
<span class="text-dark me-1 fs-2" > &nbsp; 서 </span>
</div>
</div>
</div>
</th>
<th rowspan="3" class="text-center fw-bold" style="height:100px;">결 재</th>
<th class="text-center p-1" style="width : 100px; height:22px; padding:2px;">담당</th>
<th class="text-center p-1" style="width : 100px; height:22px; padding:2px;">부서장</th>
</tr>
<tr style="height:40px;">
<th class="text-center">
<div id="chargedDiv" style="display: none;">
<span id="orderman"> <?=$orderman?> </span> <br> <?=$indateStr ?>
</div>
</th>
<th class="text-center">
<div id="approvalDiv" style="display: none;">
<?=$user_name?> <br> <?=$todayStr ?>
</div>
</th>
</tr>
<tr>
<th colspan="2"> 입고일자 : <?=$inspection_date?></th>
</tr>
</thead>
</table>
</div>
<div class="d-flex align-items-center justify-content-center m-1">
<table class="table table-bordered" style="border-collapse: collapse;">
<tbody>
<tr>
<td class="text-center align-middle lightgray">품 명</td>
<td colspan="2" class="text-center fw-bold"><?=$itemTitle?></td>
<td class="text-center align-middle lightgray">납품업체<br>제조업체</td>
<td class="text-center text-primary fw-bold"><?=$supplier?> <br> (<?=$manufacturer?>) </td>
</tr>
<tr>
<td class="text-center align-middle lightgray">규 격 </td>
<td colspan="2" class="text-center fw-bold"><?=$spec?></td>
<td class="text-center align-middle lightgray">로트번호</td>
<td colspan="1" class="text-center text-primary fw-bold">
<?=$lot_no?>
</td>
</tr>
<tr>
<td class="text-center align-middle lightgray">자재번호</td>
<td colspan="2" class="text-center fw-bold"><?=$material_no?></td>
<td class="text-center align-middle lightgray">검사일자</td>
<td colspan="1" class="text-center text-primary fw-bold">
<?=$indateStr?>
</td>
</tr>
<tr>
<td class="text-center align-middle lightgray">로트크기</td>
<td class="text-center text-dark fw-bold"><?=$received_qty?> </td>
<td class="text-center text-dark fw-bold"><?=$unit?> </td>
<td class="text-center align-middle lightgray">검사자</td>
<td class="text-center">
<div class="d-flex justify-content-center">
<button type="button" id="editButton" class="btn btn-primary btn-sm">검사자</button>
<div id="inputContainer" style="display: none;">
<input type="text" id="userNameInput" class="form-control d-inline-block noborder-input text-center" style="width:100px;" autocomplete="off" style="widtd: 100px;" value="<?=$user_name?>">
<button type="button" id="cancelButton" class="btn btn-outline-danger btn-sm"> <i class="bi bi-x"> </i> </button>
</div>
</div>
</td>
</tr>
<script>
$(document).ready(function() {
// '담당자 입력' 버튼 클릭 시 input 표시 및 버튼 숨김
$('#editButton').on('click', function() {
$('#editButton').hide();
$('#inputContainer').show();
$('#workdate').text('<?php echo $todayStr; ?>');
$('#chargedDiv').show();
});
// '취소' 버튼 클릭 시 원래 상태로 되돌림
$('#cancelButton').on('click', function() {
$('#inputContainer').hide();
$('#chargedDiv').hide();
$('#workdate').text('');
$('#editButton').show();
});
});
</script>
</tbody>
</table>
</div>
<div class="row justify-content-start m-1 mt-2">
<table id="mainTable" class="table table-hover" style="border-collapse: collapse;">
<thead>
<tr>
<th class="text-center align-middle" rowspan="2">NO</th>
<th class="text-center align-middle" rowspan="2" colspan="2">검사항목</th>
<th class="text-center align-middle" rowspan="2" colspan="2">검사기준</th>
<th class="text-center align-middle" rowspan="2">검사방식</th>
<th class="text-center align-middle" rowspan="2">검사주기</th>
<th class="text-center align-middle" colspan="3">측정치</th>
<th class="text-center align-middle" rowspan="2">판정 <br> (적/부)</th>
</tr>
<tr>
<th class="text-center">n1 <br> 양호/불량 </th>
<th class="text-center">n2 <br> 양호/불량 </th>
<th class="text-center">n3 <br> 양호/불량 </th>
</tr>
</thead>
<tbody>
<!-- 첫 번째 행 (겉모양) -->
<tr>
<td class="text-center align-middle">1</td>
<td class="text-center align-middle" colspan="2">겉모양</td>
<td class="text-center align-middle" colspan="2">사용상 해로울 결함이 없을 것</td>
<td class="text-center align-middle">육안검사</td>
<td class="text-center align-middle" rowspan="2">n = 3 <br>c = 0</td>
<td class="text-center align-middle">
<label>
<input type="checkbox" class="check-good"> OK
</label>
<label>
<input type="checkbox" class="check-bad"> NG
</label>
</td>
<td class="text-center align-middle">
<label>
<input type="checkbox" class="check-good"> OK
</label>
<label>
<input type="checkbox" class="check-bad"> NG
</label>
</td>
<td class="text-center align-middle">
<label>
<input type="checkbox" class="check-good"> OK
</label>
<label>
<input type="checkbox" class="check-bad"> NG
</label>
</td>
<td class="text-center align-middle judgement"></td>
</tr>
<!-- 무게 -->
<tr>
<td class="text-center align-middle">2</td>
<td class="text-center align-middle" colspan="2">무게 (g/㎡)</td>
<td class="text-center align-middle" colspan="2"><?=$weight?> ± 10%</td>
<td class="text-center align-middle" rowspan="1">체크검사</td>
<td class="text-center align-middle" colspan="1">
<input type="text" class="form-control text-center noborder-input inputItem" id="weight1" name="weight1" autocomplete="off">
</td>
<td class="text-center align-middle" colspan="1">
<input type="text" class="form-control text-center noborder-input inputItem" id="weight2" name="weight2" autocomplete="off">
</td>
<td class="text-center align-middle" colspan="1">
<input type="text" class="form-control text-center noborder-input inputItem" id="weight3" name="weight3" autocomplete="off">
</td>
<td class="text-center align-middle judgement"></td>
</tr>
<!-- 변수(tex) -->
<tr>
<td class="text-center align-middle" rowspan="1" >3</td>
<td class="text-center align-middle" colspan="2" rowspan="1" > 번수 (tex) </td>
<td class="text-center align-middle" colspan="2" > 190 ± 28.5 </td>
<td class="text-center align-middle" rowspan="2">공급업체 <br> 공인기관 <br> 성적서</td>
<td class="text-center align-middle" rowspan="2">입고시</td>
<td class="text-center align-middle" colspan="3">
<input type="text" class="form-control text-center noborder-input inputItem" id="tex" name="tex" autocomplete="off">
</td>
<td class="text-center align-middle judgement"></td>
</tr>
<tr>
<td class="text-center align-middle" rowspan="1" >4</td>
<td class="text-center align-middle" colspan="2" > 사인장강도 <br> (kgf) </td>
<td class="text-center align-middle" colspan="2"> 7.5 이상 </td>
<td class="text-center align-middle" colspan="3">
<input type="text" class="form-control text-center noborder-input inputItem" id="Sign_strength" name="Sign_strength" autocomplete="off">
</td>
<td class="text-center align-middle judgement"></td>
</tr>
<!-- 종합판정 -->
<tr>
<td colspan="8" rowspan="4" class="text-center align-top">
<div class="text-start fw-bold mt-1">
<span>[부적합 내용]</span> <br>
<span>
<input type="text" class="form-control text-start inputItem noborder-input" id="input_memo" name="input_memo" style="height:50px;" autocomplete="off">
&nbsp;</span>
</div>
</td>
<td colspan="3" class="text-center align-middle yellowredBold">
<div class="d-flex justify-content-center align-items-center fw-bold">
<span class="text-dark">종합판정</span>
</div>
</td>
</tr>
<tr>
<td colspan="3" rowspan="3" class="text-center align-middle">
<div class="text-center fw-bold mt-3 fs-1 ">
<input type="text" class="form-control fs-2 text-center inputItem noborder-input" style="height:50px;" id="resultJudgement" name="resultJudgement" autocomplete="off">
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</form>
</div> <!-- end of container -->
<div class="container mb-5 mt-2">
<div class="d-flex align-items-center justify-content-center mb-5">
</div>
</div>
<!-- 페이지로딩 -->
<script>
$(document).ready(function(){
var loader = document.getElementById('loadingOverlay');
if(loader)
loader.style.display = 'none';
});
function generatePDF() {
var workplace = '<?php echo $title_message; ?>';
var deadline = '<?php echo $today; ?>';
var deadlineDate = new Date(deadline);
var formattedDate = "(" + String(deadlineDate.getFullYear()).slice(-2) + "." + ("0" + (deadlineDate.getMonth() + 1)).slice(-2) + "." + ("0" + deadlineDate.getDate()).slice(-2) + ")";
var result = 'KD' + workplace +'_' + formattedDate + '.pdf';
var element = document.getElementById('content-to-print');
var opt = {
margin: [10, 3, 12, 3], // Top, right, bottom, left margins
filename: result,
image: { type: 'jpeg', quality: 0.98 },
html2canvas: { scale: 1 },
jsPDF: { unit: 'mm', format: 'a4', orientation: 'portrait' },
pagebreak: { mode: [''] }
};
html2pdf().from(element).set(opt).save();
}
// 모달을 호출할 때 tr 요소를 저장하는 변수
var selectedRow;
$(document).on('click', '.saveData', function() {
saveData();
});
$(document).on('click', '.approvalBtn', function() {
// 승인자의 이름과 오늘 날짜 가져오기
const userName = '<?=$user_name?>'; // PHP로부터 가져온 사용자 이름
const todayStr = '<?=$todayStr?>'; // PHP로부터 가져온 오늘 날짜
// 승인 정보를 approvalDiv에 표시
$('#approvalDiv').html(
userName + '<br>' + todayStr +
' <i class="bi bi-x-circle remove-approval" style="cursor: pointer;"></i>'
);
$('#approvalDiv').show();
// 결재 정보를 업데이트하여 저장 로직에 반영
updateApprovalData(userName, todayStr);
saveData();
});
// 결재 정보 업데이트 함수
function updateApprovalData(userName, date) {
// 저장 로직을 위해 결재 정보 업데이트
let approvalData = {
writer: {
name: $('#orderman').text().trim(),
date: '<?=$indateStr?>'
},
reviewer: {
name: $('#reviewDiv').is(':visible') ? '<?=$user_name?>' : '',
date: '<?=$todayStr?>'
},
approver: {
name: userName,
date: date
}
};
// 저장할 JSON 데이터 업데이트
let formData = JSON.parse($('#iList').val() || '[]');
const approvalIndex = formData.findIndex(item => item.approval);
if (approvalIndex !== -1) {
formData[approvalIndex].approval = approvalData;
} else {
formData.push({ approval: approvalData });
}
// JSON 문자열로 다시 저장
$('#iList').val(JSON.stringify(formData));
}
// 결재 취소 기능
$(document).on('click', '.remove-approval', function() {
// 결재 정보를 지우고 화면에서 숨김
$('#approvalDiv').html('').hide();
// JSON 데이터에서 결재자의 정보 제거
let formData = JSON.parse($('#iList').val() || '[]');
const approvalIndex = formData.findIndex(item => item.approval);
if (approvalIndex !== -1) {
formData[approvalIndex].approval.approver.name = '';
formData[approvalIndex].approval.approver.date = '';
}
// JSON 문자열로 다시 저장
$('#iList').val(JSON.stringify(formData));
Toastify({
text: "결재 정보가 삭제되었습니다.",
duration: 2000,
close: true,
gravity: "top",
position: "center",
style: {
background: "linear-gradient(to right, #ff5f6d, #ffc371)"
},
}).showToast();
saveData();
});
function captureReturnKey(e) {
if(e.keyCode==13 && e.srcElement.type != 'textarea')
return false;
}
function recaptureReturnKey(e) {
if(e.keyCode==13 && e.srcElement.type != 'textarea')
return false;
}
// 삽입/수정하는 모듈
function saveData() {
// json 형태로 form문에 저장하기
let formData = [];
// 결재 부분 정보 저장
let approvalData = {
writer: {
name: $('#chargedDiv').is(':visible') ? '<?=$user_name?>' : '',
date: '<?=$indateStr?>'
},
approver: {
name: $('#approvalDiv').is(':visible') ? '<?=$user_name?>' : '',
date: '<?=$todayStr?>'
}
};
formData.push({ approval: approvalData });
// 검사자 정보 저장
let productionManager = $('#userNameInput').val();
formData.push({ productionManager: productionManager });
// 추가 정보 저장
formData.push({ num: $('#num').val() });
formData.push({ update_log: $('#update_log').val() });
formData.push({ memo: $('#memo').val() });
// Class 'inputItem' 값 저장
let inputItems = {};
$('.inputItem').each(function() {
let inputName = $(this).attr('name');
inputItems[inputName] = $(this).val();
});
formData.push({ inputItems: inputItems });
// 체크박스 상태 저장
let checkboxData = [];
$('#mainTable tbody tr').each(function(index) {
let rowCheckboxes = {
good: [],
bad: [],
judgement: $(this).find('.judgement').text()
};
$(this).find('.check-good').each(function() {
rowCheckboxes.good.push($(this).prop('checked'));
});
$(this).find('.check-bad').each(function() {
rowCheckboxes.bad.push($(this).prop('checked'));
});
checkboxData.push(rowCheckboxes);
});
formData.push({ checkboxData: checkboxData });
// JSON 문자열로 변환
let jsonString = JSON.stringify(formData);
// 숨겨진 필드에 JSON 데이터 설정
$('#iList').val(jsonString);
$("#overlay").show(); // 오버레이 표시
$("button").prop("disabled", true); // 모든 버튼 비활성화
// 폼데이터 전송시 사용함 Get form
var form = $('#board_form')[0];
var datasource = new FormData(form);
showMsgModal(2); // 파일저장중
$.ajax({
enctype: 'multipart/form-data',
processData: false,
contentType: false,
cache: false,
timeout: 600000,
url: "insert_iList.php",
type: "post",
data: datasource,
dataType: "json",
success: function(data) {
// console.log(data);
setTimeout(function() {
Toastify({
text: "저장완료",
duration: 3000,
close: true,
gravity: "top",
position: "center",
style: {
background: "linear-gradient(to right, #00b09b, #96c93d)"
},
}).showToast();
saveAndClose(); //부모창 변경
hideMsgModal();
$("button").prop("disabled", false); // 모든 버튼 활성화
}, 1000);
$("#overlay").hide(); // 오버레이 숨김
},
error: function(jqxhr, status, error) {
console.log(jqxhr, status, error);
alert("An error occurred: " + error);
}
});
}
// 팝업 창에서 데이터 저장 및 닫기 함수
function saveAndClose() {
const updatedData = {
resultJudgement: $("#resultJudgement").val(),
// 필요한 다른 필드도 여기에 추가할 수 있습니다.
};
// 부모 창의 함수 호출
if (window.opener && typeof window.opener.closePopupAndUpdateRow === 'function') {
window.opener.closePopupAndUpdateRow(updatedData);
} else {
console.error("Parent window function not found");
}
// 팝업 창 닫기
// window.close();
}
// 초기값 불러오기
$(document).ready(function() {
// console.log(iListData);
if (iListData.length > 0) {
// 결재 부분 정보
const approval = iListData.find(item => item.approval);
if (approval) {
if (approval.approval.writer.name && approval.approval.writer.date) {
$('#chargedDiv').show();
$('#chargedDiv').html(
approval.approval.writer.name + '<br>' + approval.approval.writer.date
);
} else {
$('#chargedDiv').hide().html('');
}
if (approval.approval.approver.name && approval.approval.approver.date) {
$('#approvalDiv').show();
$('#approvalDiv').html(
approval.approval.approver.name + '<br>' + approval.approval.approver.date +
' <i class="bi bi-x-circle remove-approval" style="cursor: pointer;"></i>'
);
} else {
$('#approvalDiv').hide().html('');
}
$('#workdate').text(approval.approval.writer.date);
}
// 검사자 정보
const productionManager = iListData.find(item => item.productionManager);
if (productionManager && productionManager.productionManager) {
$('#userNameInput').val(productionManager.productionManager).show();
$('#inputContainer').show();
$('#editButton').hide();
} else {
$('#userNameInput').val('');
$('#inputContainer').hide();
$('#editButton').show();
}
// inputItem 데이터 로드
const inputItems = iListData.find(item => item.inputItems);
if (inputItems && inputItems.inputItems) {
for (const [name, value] of Object.entries(inputItems.inputItems)) {
$(`.inputItem[name="${name}"]`).val(value);
}
}
// 체크박스 상태 로드
const checkboxData = iListData.find(item => item.checkboxData);
if (checkboxData && checkboxData.checkboxData) {
$('#mainTable tbody tr').each(function(index) {
const rowData = checkboxData.checkboxData[index];
if (rowData) {
$(this).find('.check-good').each(function(goodIndex) {
$(this).prop('checked', rowData.good[goodIndex]);
});
$(this).find('.check-bad').each(function(badIndex) {
$(this).prop('checked', rowData.bad[badIndex]);
});
$(this).find('.judgement').text(rowData.judgement);
}
});
}
}
});
// 첫번째 요소를 클릭하면 전체 로트번호 적용하기
$(document).ready(function() {
// id가 mainTable인 테이블의 첫 번째 td를 클릭했을 때 이벤트를 등록합니다.
$('#mainTable').on('click', 'td:first-child', function() {
// 클릭한 첫 번째 td의 형제인 두 번째 td 요소의 값을 가져옵니다.
var secondTdValue = $(this).siblings().find('input').val();
// id가 mainTable인 테이블에서 두 번째 td 요소에 해당 값을 적용합니다.
$('#mainTable tbody tr').each(function() {
$(this).find('td:nth-child(2) input').val(secondTdValue);
});
});
});
// 부트스트랩 툴팁
$(document).ready(function() {
var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]'));
var tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) {
return new bootstrap.Tooltip(tooltipTriggerEl);
});
});
</script>
<script>
$(document).ready(function() {
var weight = <?= isset($weight) ? $weight : 'null' ?>;
$('#mainTable tbody tr').each(function() {
var $row = $(this);
var $judgementCell = $row.find('.judgement');
function updateJudgement() {
var allFieldsFilled = true;
var isValidThickness = true;
var isValidWidth = true;
var isValidSiO2 = true;
var isValidSiO2Coating = true;
var isValidWeight = true;
var isValidDensity = true;
var isValidTensileStrength = true;
var isValidTearingStrength = true;
var isValidFlameRetardant = true;
var isValidRemainingTime = true;
var isValidCharArea = true;
var isValidCL = true; // 탄화길이
var isValidKSDReport = true;
var isValidSEMReport = true;
var isValidTex = true;
var isValidSignStrength = true;
// 무게 범위 비교 (±10%)
$row.find('input[name^="weight"]').each(function() {
var value = parseFloat($(this).val());
if (isNaN(value)) {
allFieldsFilled = false;
return false;
}
var lowerLimit = 313;
var upperLimit = 355.75;
if (value < lowerLimit || value > upperLimit) {
isValidWeight = false;
}
});
// 번수(tex) 비교 (190 ± 28.5)
$row.find('input[name="tex"]').each(function() {
var value = parseFloat($(this).val());
if (isNaN(value)) {
allFieldsFilled = false;
return false;
}
var lowerLimit = 190 - 28.5;
var upperLimit = 190 + 28.5;
if (value < lowerLimit || value > upperLimit) {
isValidTex = false;
}
});
// 사인장강도 (kgf) 비교 (7.5 이상)
$row.find('input[name="Sign_strength"]').each(function() {
var value = parseFloat($(this).val());
if (isNaN(value)) {
allFieldsFilled = false;
return false;
}
if (value < 7.5) {
isValidSignStrength = false;
}
});
// OK/NG 체크박스 상태 검사
var allGood = true;
var anyBad = false;
// 해당 행에 OK 체크박스가 있는지 확인
if ($row.find('.check-good').length > 0) {
$row.find('.check-good').each(function() {
// 체크박스가 undefined이거나 제대로 체크되지 않으면 필드가 채워지지 않은 것으로 판단
if (isNaN($(this).is(':checked'))) {
allFieldsFilled = false;
return false;
}
if (!$(this).is(':checked')) {
allGood = false;
}
});
}
// 해당 행에 NG 체크박스가 있는지 확인
if ($row.find('.check-bad').length > 0) {
$row.find('.check-bad').each(function() {
if (isNaN($(this).is(':checked'))) {
allFieldsFilled = false;
return false;
}
if ($(this).is(':checked')) {
anyBad = true;
}
});
}
// OK/NG 체크박스 상태 검사
var checkedGood = 0; // 체크된 OK 체크박스 수
var checkedBad = 0; // 체크된 NG 체크박스 수
// 각 열의 OK/NG 체크박스를 한 번만 확인하도록 변경
var goodChecks = $row.find('.check-good');
var badChecks = $row.find('.check-bad');
// 해당 행에 OK 체크박스가 있는지 확인
if (goodChecks.length > 0) {
goodChecks.each(function() {
if ($(this).is(':checked')) {
checkedGood++; // OK 체크박스가 체크되면 증가
}
});
}
// 해당 행에 NG 체크박스가 있는지 확인
if (badChecks.length > 0) {
badChecks.each(function() {
if ($(this).is(':checked')) {
checkedBad++; // NG 체크박스가 체크되면 증가
}
});
}
// 모든 체크박스가 다 체크되지 않았다면 공백으로 처리
if (checkedGood + checkedBad !== 3 && (goodChecks.length > 0 || badChecks.length > 0)) {
allFieldsFilled = false; // 모두 체크되지 않았다면 공백 표시
}
// 종합 판정 (모든 기준 만족 여부 확인)
if (!allFieldsFilled) {
$judgementCell.text(''); // 모든 필드가 채워지지 않았을 경우 공백 처리
} else {
if (isValidThickness && isValidWidth && isValidTex && isValidSignStrength && isValidDensity && isValidTensileStrength && isValidTearingStrength
&& isValidFlameRetardant && isValidRemainingTime && allGood && !anyBad) {
$judgementCell.text('적');
} else {
$judgementCell.text('부');
}
}
}
updateJudgement();
// 체크박스 토글
$row.find('td').each(function() {
var $goodCheck = $(this).find('.check-good');
var $badCheck = $(this).find('.check-bad');
$goodCheck.on('change', function() {
if ($(this).is(':checked')) {
$badCheck.prop('checked', false);
}
updateJudgement();
updateFinalJudgement();
});
$badCheck.on('change', function() {
if ($(this).is(':checked')) {
$goodCheck.prop('checked', false);
}
updateJudgement();
updateFinalJudgement();
});
});
// input 값 변경 시 판정 업데이트
$row.find('input').on('input', updateJudgement);
$row.find('input').on('input', updateFinalJudgement);
});
// 최종 종합 판정 업데이트 함수
function updateFinalJudgement() {
var allPass = true;
var allJudged = true;
$('#mainTable tbody tr .judgement').each(function() {
var judgementText = $(this).text();
if (judgementText === '') {
allJudged = false;
}
if (judgementText === '부') {
allPass = false;
// '부'인 경우 해당 td의 배경색을 옅은 붉은 색으로 변경
$(this).css('background-color', '#f8d7da'); // 옅은 붉은 색
} else {
// '적'인 경우 배경색을 기본으로 설정
$(this).css('background-color', ''); // 기본 배경색 (없음)
}
});
if (allJudged) {
if (allPass) {
$('#resultJudgement').val('합격');
} else {
$('#resultJudgement').val('불합격');
}
} else {
$('#resultJudgement').val('');
}
}
// 페이지 로드 시 최종 판정 업데이트
updateFinalJudgement();
});
</script>
<?php require_once $_SERVER['DOCUMENT_ROOT'] . '/' . $tablename . '/common/JS_instock.php'; ?> <!-- instock 후반부 공통 JS -->
</body>
</html>

888
instock/i_motor.php Normal file
View File

@@ -0,0 +1,888 @@
<?php
$tablename = 'instock';
?>
<?php include $_SERVER['DOCUMENT_ROOT'] . '/' . $tablename . '/common/head.php' ; ?> <!-- head 정보 불러오기 -->
<?php
// print $spec;
$itemTitle = '전동개폐기';
// 정규식 패턴
$pattern = '/(\d+)KG(\d{3})V\(([^)]+)\)/';
// 디버그 시작
// echo "입력 데이터: '$spec'\n";
// echo "정규식: '$pattern'\n";
// preg_match 실행 및 디버깅
if (preg_match($pattern, $spec, $matches)) {
// echo "정규식이 일치했습니다!\n";
// print_r($matches); // 정규식으로 매칭된 값 출력
// 추출된 값 할당
$kg = $matches[1] . 'KG'; // KG 앞의 숫자
$voltage = $matches[2] . 'V'; // 3자리 숫자와 V
$wire = $matches[3]; // 괄호 안의 문자
// // 결과 출력
// echo "KG: $kg\n";
// echo "Voltage: $voltage\n";
// echo "Wire: $wire\n";
$spec = "$kg * $voltage * 방화용 ($wire)";
} else {
echo "정규식이 일치하지 않습니다.\n";
// 정규식 디버그용 메시지 출력
if (preg_last_error() !== PREG_NO_ERROR) {
echo "정규식 오류 코드: " . preg_last_error() . "\n";
}
}
$today = date("Y-m-d");
require_once $_SERVER['DOCUMENT_ROOT'] . '/instock/commonDriveLoad.php'; // 구글드라이브 파일형태 이미지형태 읽어오기 모듈
$savetitle ='수입검사성적서';
?>
<?php include $_SERVER['DOCUMENT_ROOT'] . '/' . $tablename . '/common/instock_btn.php'; ?> <!-- Btn 정보 불러오기 -->
<div id="content-to-print">
<br>
<div class="container mt-3">
<div class="d-flex align-items-center justify-content-center m-1">
<table class="table " style="border-collapse: collapse;">
<thead>
<tr>
<th rowspan="3" class="text-center" style="width:70%;">
<div class="row">
<div class="col-sm-2">
<img src="../img/kdlogo.png" alt="경동기업" class="me-1" style="width:100%; height:auto;">
</div>
<div class="col-sm-10">
<div class="d-flex align-items-center justify-content-center m-1">
<span class="text-dark ms-1 me-1 fs-2" > &nbsp; 수 </span>
<span class="text-dark me-1 fs-2" > &nbsp; 입 </span>
<span class="text-dark me-1 fs-2" > &nbsp; 검 </span>
<span class="text-dark me-1 fs-2" > &nbsp; 사 </span>
<span class="text-dark me-1 fs-2" > &nbsp; </span>
<span class="text-dark me-1 fs-2" > &nbsp; 성 </span>
<span class="text-dark me-1 fs-2" > &nbsp; 적 </span>
<span class="text-dark me-1 fs-2" > &nbsp; 서 </span>
</div>
</div>
</div>
</th>
<th rowspan="3" class="text-center fw-bold" style="height:100px;">결 재</th>
<th class="text-center p-1" style="width : 100px; height:22px; padding:2px;">담당</th>
<th class="text-center p-1" style="width : 100px; height:22px; padding:2px;">부서장</th>
</tr>
<tr style="height:40px;">
<th class="text-center">
<div id="chargedDiv" style="display: none;">
<span id="orderman"> <?=$orderman?> </span> <br> <?=$indateStr ?>
</div>
</th>
<th class="text-center">
<div id="approvalDiv" style="display: none;">
<?=$user_name?> <br> <?=$todayStr ?>
</div>
</th>
</tr>
<tr>
<th colspan="2"> 입고일자 : <?=$inspection_date?></th>
</tr>
</thead>
</table>
</div>
<div class="d-flex align-items-center justify-content-center m-1">
<table class="table table-bordered" style="border-collapse: collapse;">
<tbody>
<tr>
<td class="text-center align-middle lightgray">품 명</td>
<td colspan="2" class="text-center fw-bold"><?=$itemTitle?></td>
<td class="text-center align-middle lightgray">납품업체<br>제조업체</td>
<td class="text-center text-primary fw-bold"><?=$supplier?> <br> (<?=$manufacturer?>) </td>
</tr>
<tr>
<td class="text-center align-middle lightgray">규 격<br>(용량*전압*타입) </td>
<td colspan="2" class="text-center fw-bold"><?=$spec?></td>
<td class="text-center align-middle lightgray">로트번호</td>
<td colspan="1" class="text-center text-primary fw-bold">
<?=$lot_no?>
</td>
</tr>
<tr>
<td class="text-center align-middle lightgray">자재번호</td>
<td colspan="2" class="text-center fw-bold"><?=$material_no?> <br> <?=$remarks?> </td>
<td class="text-center align-middle lightgray">검사일자</td>
<td colspan="1" class="text-center text-primary fw-bold">
<?=$indateStr?>
</td>
</tr>
<tr>
<td class="text-center align-middle lightgray">로트크기</td>
<td class="text-center text-dark fw-bold"><?=$received_qty?> </td>
<td class="text-center text-dark fw-bold"><?=$unit?> </td>
<td class="text-center align-middle lightgray">검사자</td>
<td class="text-center">
<div class="d-flex justify-content-center">
<button type="button" id="editButton" class="btn btn-primary btn-sm">검사자</button>
<div id="inputContainer" style="display: none;">
<input type="text" id="userNameInput" class="form-control d-inline-block noborder-input text-center" style="width:100px;" autocomplete="off" style="widtd: 100px;" value="<?=$user_name?>">
<button type="button" id="cancelButton" class="btn btn-outline-danger btn-sm"> <i class="bi bi-x"> </i> </button>
</div>
</div>
</td>
</tr>
<script>
$(document).ready(function() {
// '담당자 입력' 버튼 클릭 시 input 표시 및 버튼 숨김
$('#editButton').on('click', function() {
$('#editButton').hide();
$('#inputContainer').show();
$('#workdate').text('<?php echo $todayStr; ?>');
$('#chargedDiv').show();
});
// '취소' 버튼 클릭 시 원래 상태로 되돌림
$('#cancelButton').on('click', function() {
$('#inputContainer').hide();
$('#chargedDiv').hide();
$('#workdate').text('');
$('#editButton').show();
});
});
</script>
</tbody>
</table>
</div>
<div class="row justify-content-start m-1 mt-2">
<table id="mainTable" class="table table-hover" style="border-collapse: collapse;">
<thead>
<tr>
<th class="text-center align-middle" rowspan="2">NO</th>
<th class="text-center align-middle" rowspan="2" colspan="2">검사항목</th>
<th class="text-center align-middle" rowspan="2" colspan="2">검사기준</th>
<th class="text-center align-middle" rowspan="2">검사방식</th>
<th class="text-center align-middle" rowspan="2">검사주기</th>
<th class="text-center align-middle" colspan="3">측정치</th>
<th class="text-center align-middle" rowspan="2">판정 <br> (적/부)</th>
</tr>
<tr>
<th class="text-center">n1 <br> 양호/불량 </th>
<th class="text-center">n2 <br> 양호/불량 </th>
<th class="text-center">n3 <br> 양호/불량 </th>
</tr>
</thead>
<tbody>
<!-- 첫 번째 행 (겉모양) -->
<tr>
<td class="text-center align-middle" rowspan="1">1</td>
<td class="text-center align-middle" colspan="2">겉모양</td>
<td class="text-center align-middle" colspan="2">사용상 해로울 <br> 결함이 없을 것</td>
<td class="text-center align-middle" rowspan="2">육안검사</td>
<td class="text-center align-middle" rowspan="6">n = 3 <br>c = 0</td>
<td class="text-center align-middle">
<label>
<input type="checkbox" class="check-good"> OK
</label>
<label>
<input type="checkbox" class="check-bad"> NG
</label>
</td>
<td class="text-center align-middle">
<label>
<input type="checkbox" class="check-good"> OK
</label>
<label>
<input type="checkbox" class="check-bad"> NG
</label>
</td>
<td class="text-center align-middle">
<label>
<input type="checkbox" class="check-good"> OK
</label>
<label>
<input type="checkbox" class="check-bad"> NG
</label>
</td>
<td class="text-center align-middle judgement"></td>
</tr>
<!-- 구성품 -->
<tr>
<td class="text-center align-middle" rowspan="1">2</td>
<td class="text-center align-middle" colspan="2">구성품</td>
<td class="text-center align-middle" colspan="2">구성품 누락이 없어야함 <br> (제품사진 구성품)</td>
<td class="text-center align-middle">
<label>
<input type="checkbox" class="check-good"> OK
</label>
<label>
<input type="checkbox" class="check-bad"> NG
</label>
</td>
<td class="text-center align-middle">
<label>
<input type="checkbox" class="check-good"> OK
</label>
<label>
<input type="checkbox" class="check-bad"> NG
</label>
</td>
<td class="text-center align-middle">
<label>
<input type="checkbox" class="check-good"> OK
</label>
<label>
<input type="checkbox" class="check-bad"> NG
</label>
</td>
<td class="text-center align-middle judgement"></td>
</tr>
<?php
// 두께 범위에 맞는 체크된 사각형을 표시하는 함수
function renderCheckBox($min, $max, $value) {
if ($value >= $min && $value < $max) {
return '✅'; // 체크된 사각형
} else {
return '□'; // 빈 사각형
}
}
// 길이 범위에 맞는 체크된 사각형을 표시하는 함수
function renderLengthCheckBox($min, $max, $length) {
if ($length >= $min && $length < $max) {
return '✅'; // 체크된 사각형
} else {
return '□'; // 빈 사각형
}
}
// 이하
function renderincludeCheckBox($min, $max, $length) {
if ($length > $min && $length <= $max) {
return '✅'; // 체크된 사각형
} else {
return '□'; // 빈 사각형
}
}
?>
<!-- 셋팅설정 및 set램프 표시상태 -->
<tr>
<td class="text-center align-middle" rowspan="1">3</td>
<td class="text-center align-middle" colspan="2" rowspan="1"> 셋팅설정 및 <br> set램프 표시상태 </td>
<td class="text-center align-middle" colspan="2"> 셋팅 전 점등상태,<br> 셋팅 후 소등상태로<br> 되어야함 (상 or 하 <br> 셋팅이 한개만 설정되었을 <br> 경우 점멸 상태임)</td>
<td class="text-center align-middle" rowspan="4"> 체크검사 </td>
<td class="text-center align-middle" rowspan="4" colspan="3"> 공급업체 성적서로 <br> 대체 </td>
<td class="text-center align-middle judgement" rowspan="4"></td>
</tr>
<tr>
<td class="text-center align-middle" rowspan="1">4</td>
<td class="text-center align-middle" colspan="2" rowspan="1">브레이크 개폐 상태</td>
<td class="text-center align-middle" colspan="2"> 브레이크 개방 상태에서 <br> 모터 출력 기어가 원활히 <br> 작동되어야 함</td>
</tr>
<tr>
<td class="text-center align-middle" rowspan="1">5</td>
<td class="text-center align-middle" colspan="2" rowspan="1">기타 기능설정</td>
<td class="text-center align-middle" colspan="2"> 셋팅해제, 방향변경, <br> 모터번호 변경 기능이 <br> 원활히 이루어져야함 </td>
</tr>
<tr>
<td class="text-center align-middle" rowspan="1">6</td>
<td class="text-center align-middle" colspan="2" rowspan="1">모터권상능력(㎏)</td>
<td class="text-center align-middle" colspan="2"> 시험권상하중(정격<br> 권상하중의 120% <br> 이상)을 시험용 권상기를 <br> 사용하여 바닥으로 부터 <br> 들어 올림 </td>
</tr>
<tr>
<td class="text-center align-middle" rowspan="1">7</td>
<td class="text-center align-middle" colspan="2" rowspan="1"> 품질인정 </td>
<td class="text-center align-middle" colspan="2"> 내화시험(비차열 70분) <br> 적합할것 </td>
<td class="text-center align-middle" rowspan="1"> 공인기관<br>시험 </td>
<td class="text-center align-middle" rowspan="1" colspan="1"> 1회/5년 </td>
<td class="text-center align-middle" rowspan="1" colspan="3"> 공인기관 성적서로 <br> 대체 </td>
<td class="text-center align-middle judgement" rowspan="1"></td>
</tr>
<!-- 종합판정 -->
<tr>
<td colspan="8" rowspan="4" class="text-center align-top">
<div class="text-start fw-bold mt-1">
<span>[부적합 내용]</span> <br>
<span>
<input type="text" class="form-control text-start inputItem noborder-input" style="height:50px;" id="input_memo" name="input_memo" autocomplete="off">
&nbsp;</span>
</div>
</td>
<td colspan="3" class="text-center align-middle yellowredBold">
<div class="d-flex justify-content-center align-items-center fw-bold">
<span class="text-dark">종합판정</span>
</div>
</td>
</tr>
<tr>
<td colspan="3" rowspan="3" class="text-center align-middle">
<div class="text-center fw-bold mt-3 fs-1 ">
<input type="text" class="form-control fs-2 text-center inputItem noborder-input" style="height:50px;" id="resultJudgement" name="resultJudgement" autocomplete="off">
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</form>
</div> <!-- end of container -->
<div class="container mb-5 mt-2">
<div class="d-flex align-items-center justify-content-center mb-5">
</div>
</div>
<!-- 페이지로딩 -->
<script>
$(document).ready(function(){
var loader = document.getElementById('loadingOverlay');
if(loader)
loader.style.display = 'none';
});
function generatePDF() {
var workplace = '<?php echo $title_message; ?>';
var deadline = '<?php echo $today; ?>';
var deadlineDate = new Date(deadline);
var formattedDate = "(" + String(deadlineDate.getFullYear()).slice(-2) + "." + ("0" + (deadlineDate.getMonth() + 1)).slice(-2) + "." + ("0" + deadlineDate.getDate()).slice(-2) + ")";
var result = 'KD' + workplace +'_' + formattedDate + '.pdf';
var element = document.getElementById('content-to-print');
var opt = {
margin: [10, 3, 12, 3], // Top, right, bottom, left margins
filename: result,
image: { type: 'jpeg', quality: 0.98 },
html2canvas: { scale: 1 },
jsPDF: { unit: 'mm', format: 'a4', orientation: 'portrait' },
pagebreak: { mode: [''] }
};
html2pdf().from(element).set(opt).save();
}
// 모달을 호출할 때 tr 요소를 저장하는 변수
var selectedRow;
$(document).on('click', '.saveData', function() {
saveData();
});
$(document).on('click', '.approvalBtn', function() {
// 승인자의 이름과 오늘 날짜 가져오기
const userName = '<?=$user_name?>'; // PHP로부터 가져온 사용자 이름
const todayStr = '<?=$todayStr?>'; // PHP로부터 가져온 오늘 날짜
// 승인 정보를 approvalDiv에 표시
$('#approvalDiv').html(
userName + '<br>' + todayStr +
' <i class="bi bi-x-circle remove-approval" style="cursor: pointer;"></i>'
);
$('#approvalDiv').show();
// 결재 정보를 업데이트하여 저장 로직에 반영
updateApprovalData(userName, todayStr);
saveData();
});
// 결재 정보 업데이트 함수
function updateApprovalData(userName, date) {
// 저장 로직을 위해 결재 정보 업데이트
let approvalData = {
writer: {
name: $('#orderman').text().trim(),
date: '<?=$indateStr?>'
},
reviewer: {
name: $('#reviewDiv').is(':visible') ? '<?=$user_name?>' : '',
date: '<?=$todayStr?>'
},
approver: {
name: userName,
date: date
}
};
// 저장할 JSON 데이터 업데이트
let formData = JSON.parse($('#iList').val() || '[]');
const approvalIndex = formData.findIndex(item => item.approval);
if (approvalIndex !== -1) {
formData[approvalIndex].approval = approvalData;
} else {
formData.push({ approval: approvalData });
}
// JSON 문자열로 다시 저장
$('#iList').val(JSON.stringify(formData));
}
// 결재 취소 기능
$(document).on('click', '.remove-approval', function() {
// 결재 정보를 지우고 화면에서 숨김
$('#approvalDiv').html('').hide();
// JSON 데이터에서 결재자의 정보 제거
let formData = JSON.parse($('#iList').val() || '[]');
const approvalIndex = formData.findIndex(item => item.approval);
if (approvalIndex !== -1) {
formData[approvalIndex].approval.approver.name = '';
formData[approvalIndex].approval.approver.date = '';
}
// JSON 문자열로 다시 저장
$('#iList').val(JSON.stringify(formData));
Toastify({
text: "결재 정보가 삭제되었습니다.",
duration: 2000,
close: true,
gravity: "top",
position: "center",
style: {
background: "linear-gradient(to right, #ff5f6d, #ffc371)"
},
}).showToast();
saveData();
});
function captureReturnKey(e) {
if(e.keyCode==13 && e.srcElement.type != 'textarea')
return false;
}
function recaptureReturnKey(e) {
if(e.keyCode==13 && e.srcElement.type != 'textarea')
return false;
}
// 삽입/수정하는 모듈
function saveData() {
// json 형태로 form문에 저장하기
let formData = [];
// 결재 부분 정보 저장
let approvalData = {
writer: {
name: $('#chargedDiv').is(':visible') ? '<?=$user_name?>' : '',
date: '<?=$indateStr?>'
},
approver: {
name: $('#approvalDiv').is(':visible') ? '<?=$user_name?>' : '',
date: '<?=$todayStr?>'
}
};
formData.push({ approval: approvalData });
// 검사자 정보 저장
let productionManager = $('#userNameInput').val();
formData.push({ productionManager: productionManager });
// 추가 정보 저장
formData.push({ num: $('#num').val() });
formData.push({ update_log: $('#update_log').val() });
formData.push({ memo: $('#memo').val() });
// Class 'inputItem' 값 저장
let inputItems = {};
$('.inputItem').each(function() {
let inputName = $(this).attr('name');
inputItems[inputName] = $(this).val();
});
formData.push({ inputItems: inputItems });
// 체크박스 상태 저장
let checkboxData = [];
$('#mainTable tbody tr').each(function(index) {
let rowCheckboxes = {
good: [],
bad: [],
judgement: $(this).find('.judgement').text()
};
$(this).find('.check-good').each(function() {
rowCheckboxes.good.push($(this).prop('checked'));
});
$(this).find('.check-bad').each(function() {
rowCheckboxes.bad.push($(this).prop('checked'));
});
checkboxData.push(rowCheckboxes);
});
formData.push({ checkboxData: checkboxData });
// JSON 문자열로 변환
let jsonString = JSON.stringify(formData);
// 숨겨진 필드에 JSON 데이터 설정
$('#iList').val(jsonString);
$("#overlay").show(); // 오버레이 표시
$("button").prop("disabled", true); // 모든 버튼 비활성화
// 폼데이터 전송시 사용함 Get form
var form = $('#board_form')[0];
var datasource = new FormData(form);
showMsgModal(2); // 파일저장중
$.ajax({
enctype: 'multipart/form-data',
processData: false,
contentType: false,
cache: false,
timeout: 600000,
url: "insert_iList.php",
type: "post",
data: datasource,
dataType: "json",
success: function(data) {
console.log(data);
setTimeout(function() {
Toastify({
text: "저장완료",
duration: 3000,
close: true,
gravity: "top",
position: "center",
style: {
background: "linear-gradient(to right, #00b09b, #96c93d)"
},
}).showToast();
saveAndClose(); //부모창 변경
hideMsgModal();
$("button").prop("disabled", false); // 모든 버튼 활성화
}, 1000);
$("#overlay").hide(); // 오버레이 숨김
},
error: function(jqxhr, status, error) {
console.log(jqxhr, status, error);
alert("An error occurred: " + error);
}
});
}
// 팝업 창에서 데이터 저장 및 닫기 함수
function saveAndClose() {
const updatedData = {
resultJudgement: $("#resultJudgement").val(),
// 필요한 다른 필드도 여기에 추가할 수 있습니다.
};
// 부모 창의 함수 호출
if (window.opener && typeof window.opener.closePopupAndUpdateRow === 'function') {
window.opener.closePopupAndUpdateRow(updatedData);
} else {
console.error("Parent window function not found");
}
// 팝업 창 닫기
// window.close();
}
// 초기값 불러오기
$(document).ready(function() {
console.log(iListData);
if (iListData.length > 0) {
// 결재 부분 정보
const approval = iListData.find(item => item.approval);
if (approval) {
if (approval.approval.writer.name && approval.approval.writer.date) {
$('#chargedDiv').show();
$('#chargedDiv').html(
approval.approval.writer.name + '<br>' + approval.approval.writer.date
);
} else {
$('#chargedDiv').hide().html('');
}
if (approval.approval.approver.name && approval.approval.approver.date) {
$('#approvalDiv').show();
$('#approvalDiv').html(
approval.approval.approver.name + '<br>' + approval.approval.approver.date +
' <i class="bi bi-x-circle remove-approval" style="cursor: pointer;"></i>'
);
} else {
$('#approvalDiv').hide().html('');
}
$('#workdate').text(approval.approval.writer.date);
}
// 검사자 정보
const productionManager = iListData.find(item => item.productionManager);
if (productionManager && productionManager.productionManager) {
$('#userNameInput').val(productionManager.productionManager).show();
$('#inputContainer').show();
$('#editButton').hide();
} else {
$('#userNameInput').val('');
$('#inputContainer').hide();
$('#editButton').show();
}
// inputItem 데이터 로드
const inputItems = iListData.find(item => item.inputItems);
if (inputItems && inputItems.inputItems) {
for (const [name, value] of Object.entries(inputItems.inputItems)) {
$(`.inputItem[name="${name}"]`).val(value);
}
}
// 체크박스 상태 로드
const checkboxData = iListData.find(item => item.checkboxData);
if (checkboxData && checkboxData.checkboxData) {
$('#mainTable tbody tr').each(function(index) {
const rowData = checkboxData.checkboxData[index];
if (rowData) {
$(this).find('.check-good').each(function(goodIndex) {
$(this).prop('checked', rowData.good[goodIndex]);
});
$(this).find('.check-bad').each(function(badIndex) {
$(this).prop('checked', rowData.bad[badIndex]);
});
$(this).find('.judgement').text(rowData.judgement);
}
});
}
}
});
// 첫번째 요소를 클릭하면 전체 로트번호 적용하기
$(document).ready(function() {
// id가 mainTable인 테이블의 첫 번째 td를 클릭했을 때 이벤트를 등록합니다.
$('#mainTable').on('click', 'td:first-child', function() {
// 클릭한 첫 번째 td의 형제인 두 번째 td 요소의 값을 가져옵니다.
var secondTdValue = $(this).siblings().find('input').val();
// id가 mainTable인 테이블에서 두 번째 td 요소에 해당 값을 적용합니다.
$('#mainTable tbody tr').each(function() {
$(this).find('td:nth-child(2) input').val(secondTdValue);
});
});
});
// 부트스트랩 툴팁
$(document).ready(function() {
var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]'));
var tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) {
return new bootstrap.Tooltip(tooltipTriggerEl);
});
});
</script>
<script>
$(document).ready(function() {
var thickness = <?= isset($thickness) ? $thickness : 'null' ?>;
var width = <?= isset($width) ? $width : 'null' ?>;
var height = <?= isset($height) ? $height : 'null' ?>;
var length = <?= isset($length) ? $length : 'null' ?>;
console.log('width', width);
console.log('height', height);
$('#mainTable tbody tr').each(function() {
var $row = $(this);
var $judgementCell = $row.find('.judgement');
function updateJudgement() {
var isValidThickness = true;
var isValidWidth = true;
var isValidHeight = true;
var isValidLength = true;
var isValidTensile = true;
var isValidYieldStrength = true;
var isValidElongation = true;
var allFieldsFilled = true; // 모든 필드가 채워졌는지 확인하는 플래그
// 두께 허용 범위 설정
var Up_thicknessTolerance;
var Down_thicknessTolerance;
if (thickness < 6.3 ) {
Up_thicknessTolerance = 0.6;
Down_thicknessTolerance = 0.6;
}
// 두께 범위 비교
$row.find('input[name^="record_thickness"]').each(function() {
var value = parseFloat($(this).val());
if (isNaN(value)) {
allFieldsFilled = false;
return false;
}
var lowerLimit = thickness - Down_thicknessTolerance;
var upperLimit = thickness + Up_thicknessTolerance;
if (value < lowerLimit || value > upperLimit) {
isValidThickness = false;
}
});
// OK/NG 체크박스 상태 검사
var allGood = true;
var anyBad = false;
// 해당 행에 OK 체크박스가 있는지 확인
if ($row.find('.check-good').length > 0) {
$row.find('.check-good').each(function() {
// 체크박스가 undefined이거나 제대로 체크되지 않으면 필드가 채워지지 않은 것으로 판단
if (isNaN($(this).is(':checked'))) {
allFieldsFilled = false;
return false;
}
if (!$(this).is(':checked')) {
allGood = false;
}
});
}
// 해당 행에 NG 체크박스가 있는지 확인
if ($row.find('.check-bad').length > 0) {
$row.find('.check-bad').each(function() {
if (isNaN($(this).is(':checked'))) {
allFieldsFilled = false;
return false;
}
if ($(this).is(':checked')) {
anyBad = true;
}
});
}
// OK/NG 체크박스 상태 검사
var checkedGood = 0; // 체크된 OK 체크박스 수
var checkedBad = 0; // 체크된 NG 체크박스 수
// 각 열의 OK/NG 체크박스를 한 번만 확인하도록 변경
var goodChecks = $row.find('.check-good');
var badChecks = $row.find('.check-bad');
// 해당 행에 OK 체크박스가 있는지 확인
if (goodChecks.length > 0) {
goodChecks.each(function() {
if ($(this).is(':checked')) {
checkedGood++; // OK 체크박스가 체크되면 증가
}
});
}
// 해당 행에 NG 체크박스가 있는지 확인
if (badChecks.length > 0) {
badChecks.each(function() {
if ($(this).is(':checked')) {
checkedBad++; // NG 체크박스가 체크되면 증가
}
});
}
// 모든 체크박스가 다 체크되지 않았다면 공백으로 처리
if (checkedGood + checkedBad !== 3 && (goodChecks.length > 0 || badChecks.length > 0)) {
allFieldsFilled = false; // 모두 체크되지 않았다면 공백 표시
}
// 모든 필드가 채워지지 않았으면 공백으로 설정
if (!allFieldsFilled) {
$judgementCell.text('');
} else {
// 판정 업데이트
if (isValidThickness && isValidWidth && isValidHeight && isValidLength && isValidTensile && isValidElongation && isValidYieldStrength && allGood && !anyBad) {
$judgementCell.text('적');
} else {
$judgementCell.text('부');
}
}
}
// 페이지 로드 시 초기 판단
updateJudgement();
// 체크박스 토글
$row.find('td').each(function() {
var $goodCheck = $(this).find('.check-good');
var $badCheck = $(this).find('.check-bad');
$goodCheck.on('change', function() {
if ($(this).is(':checked')) {
$badCheck.prop('checked', false);
}
updateJudgement();
updateFinalJudgement();
});
$badCheck.on('change', function() {
if ($(this).is(':checked')) {
$goodCheck.prop('checked', false);
}
updateJudgement();
updateFinalJudgement();
});
});
// input 값 변경 시 판정 업데이트
$row.find('input').on('input', updateJudgement);
$row.find('input').on('input', updateFinalJudgement);
});
// 최종 종합 판정 업데이트 함수
function updateFinalJudgement() {
var allPass = true;
var allJudged = true;
$('#mainTable tbody tr .judgement').each(function() {
var judgementText = $(this).text();
if (judgementText === '') {
allJudged = false;
}
if (judgementText === '부') {
allPass = false;
$(this).css('background-color', '#f8d7da');
} else {
$(this).css('background-color', '');
}
});
if (allJudged) {
if (allPass) {
$('#resultJudgement').val('합격');
} else {
$('#resultJudgement').val('불합격');
}
} else {
$('#resultJudgement').val('');
}
}
// 페이지 로드 시 최종 판정 업데이트
updateFinalJudgement();
});
</script>
<?php require_once $_SERVER['DOCUMENT_ROOT'] . '/' . $tablename . '/common/JS_instock.php'; ?> <!-- instock 후반부 공통 JS -->
</body>
</html>

984
instock/i_platesteel.php Normal file
View File

@@ -0,0 +1,984 @@
<?php
$tablename = 'instock';
?>
<?php include $_SERVER['DOCUMENT_ROOT'] . '/' . $tablename . '/common/head.php' ; ?> <!-- head 정보 불러오기 -->
<?php
// print $spec;
$itemTitle = '일반구조용 압연강재 <br>
(KS D 3503, SS275) "하단 무게평철"';
// 정규식을 사용하여 숫자와 T, L 값을 추출합니다.
preg_match('/(\d+)\*(\d+\.?\d*)T,L:(\d+,\d+)/', $spec, $matches);
// 쉼표 제거
$length = str_replace(',', '', $matches[3]);
// 원하는 형식으로 출력
$spec = "{$matches[2]} * {$matches[1]} * {$length}";
$thickness = $matches[2];
$width = $matches[1];
$today = date("Y-m-d");
require_once $_SERVER['DOCUMENT_ROOT'] . '/instock/commonDriveLoad.php'; // 구글드라이브 파일형태 이미지형태 읽어오기 모듈
$savetitle ='수입검사성적서';
?>
<?php include $_SERVER['DOCUMENT_ROOT'] . '/' . $tablename . '/common/instock_btn.php'; ?> <!-- Btn 정보 불러오기 -->
<div id="content-to-print">
<br>
<div class="container mt-3">
<div class="d-flex align-items-center justify-content-center m-1">
<table class="table " style="border-collapse: collapse;">
<thead>
<tr>
<th rowspan="3" class="text-center" style="width:70%;">
<div class="row">
<div class="col-sm-2">
<img src="../img/kdlogo.png" alt="경동기업" class="me-1" style="width:100%; height:auto;">
</div>
<div class="col-sm-10">
<div class="d-flex align-items-center justify-content-center m-1">
<span class="text-dark ms-1 me-1 fs-2" > &nbsp; 수 </span>
<span class="text-dark me-1 fs-2" > &nbsp; 입 </span>
<span class="text-dark me-1 fs-2" > &nbsp; 검 </span>
<span class="text-dark me-1 fs-2" > &nbsp; 사 </span>
<span class="text-dark me-1 fs-2" > &nbsp; </span>
<span class="text-dark me-1 fs-2" > &nbsp; 성 </span>
<span class="text-dark me-1 fs-2" > &nbsp; 적 </span>
<span class="text-dark me-1 fs-2" > &nbsp; 서 </span>
</div>
</div>
</div>
</th>
<th rowspan="3" class="text-center fw-bold" style="height:100px;">결 재</th>
<th class="text-center p-1" style="width : 100px; height:22px; padding:2px;">담당</th>
<th class="text-center p-1" style="width : 100px; height:22px; padding:2px;">부서장</th>
</tr>
<tr style="height:40px;">
<th class="text-center">
<div id="chargedDiv" style="display: none;">
<span id="orderman"> <?=$orderman?> </span> <br> <?=$indateStr ?>
</div>
</th>
<th class="text-center">
<div id="approvalDiv" style="display: none;">
<?=$user_name?> <br> <?=$todayStr ?>
</div>
</th>
</tr>
<tr>
<th colspan="2"> 입고일자 : <?=$inspection_date?></th>
</tr>
</thead>
</table>
</div>
<div class="d-flex align-items-center justify-content-center m-1">
<table class="table table-bordered" style="border-collapse: collapse;">
<tbody>
<tr>
<td class="text-center align-middle lightgray">품 명</td>
<td colspan="2" class="text-center fw-bold"><?=$itemTitle?></td>
<td class="text-center align-middle lightgray">납품업체<br>제조업체</td>
<td class="text-center text-primary fw-bold"><?=$supplier?> <br> (<?=$manufacturer?>) </td>
</tr>
<tr>
<td class="text-center align-middle lightgray">규 격<br>(두께*너비*길이) </td>
<td colspan="2" class="text-center fw-bold"><?=$spec?></td>
<td class="text-center align-middle lightgray">로트번호</td>
<td colspan="1" class="text-center text-primary fw-bold">
<?=$lot_no?>
</td>
</tr>
<tr>
<td class="text-center align-middle lightgray">자재번호</td>
<td colspan="2" class="text-center fw-bold"><?=$material_no?></td>
<td class="text-center align-middle lightgray">검사일자</td>
<td colspan="1" class="text-center text-primary fw-bold">
<?=$indateStr?>
</td>
</tr>
<tr>
<td class="text-center align-middle lightgray">로트크기</td>
<td class="text-center text-dark fw-bold"><?=$received_qty?> </td>
<td class="text-center text-dark fw-bold"><?=$unit?> </td>
<td class="text-center align-middle lightgray">검사자</td>
<td class="text-center">
<div class="d-flex justify-content-center">
<button type="button" id="editButton" class="btn btn-primary btn-sm">검사자</button>
<div id="inputContainer" style="display: none;">
<input type="text" id="userNameInput" class="form-control d-inline-block noborder-input text-center" style="width:100px;" autocomplete="off" style="widtd: 100px;" value="<?=$user_name?>">
<button type="button" id="cancelButton" class="btn btn-outline-danger btn-sm"> <i class="bi bi-x"> </i> </button>
</div>
</div>
</td>
</tr>
<script>
$(document).ready(function() {
// '담당자 입력' 버튼 클릭 시 input 표시 및 버튼 숨김
$('#editButton').on('click', function() {
$('#editButton').hide();
$('#inputContainer').show();
$('#workdate').text('<?php echo $todayStr; ?>');
$('#chargedDiv').show();
});
// '취소' 버튼 클릭 시 원래 상태로 되돌림
$('#cancelButton').on('click', function() {
$('#inputContainer').hide();
$('#chargedDiv').hide();
$('#workdate').text('');
$('#editButton').show();
});
});
</script>
</tbody>
</table>
</div>
<div class="row justify-content-start m-1 mt-2">
<table id="mainTable" class="table table-hover" style="border-collapse: collapse;">
<thead>
<tr>
<th class="text-center align-middle" rowspan="2">NO</th>
<th class="text-center align-middle" rowspan="2" colspan="2">검사항목</th>
<th class="text-center align-middle" rowspan="2" colspan="2">검사기준</th>
<th class="text-center align-middle" rowspan="2">검사방식</th>
<th class="text-center align-middle" rowspan="2">검사주기</th>
<th class="text-center align-middle" colspan="3">측정치</th>
<th class="text-center align-middle" rowspan="2">판정 <br> (적/부)</th>
</tr>
<tr>
<th class="text-center">n1 <br> 양호/불량 </th>
<th class="text-center">n2 <br> 양호/불량 </th>
<th class="text-center">n3 <br> 양호/불량 </th>
</tr>
</thead>
<tbody>
<!-- 첫 번째 행 (겉모양) -->
<tr>
<td class="text-center align-middle">1</td>
<td class="text-center align-middle" colspan="2">겉모양</td>
<td class="text-center align-middle" colspan="2">사용상 해로울 <br> 결함이 없을 것</td>
<td class="text-center align-middle">육안검사</td>
<td class="text-center align-middle" rowspan="4">n = 3 <br>c = 0</td>
<td class="text-center align-middle">
<label>
<input type="checkbox" class="check-good"> OK
</label>
<label>
<input type="checkbox" class="check-bad"> NG
</label>
</td>
<td class="text-center align-middle">
<label>
<input type="checkbox" class="check-good"> OK
</label>
<label>
<input type="checkbox" class="check-bad"> NG
</label>
</td>
<td class="text-center align-middle">
<label>
<input type="checkbox" class="check-good"> OK
</label>
<label>
<input type="checkbox" class="check-bad"> NG
</label>
</td>
<td class="text-center align-middle judgement"></td>
</tr>
<?php
// 두께 범위에 맞는 체크된 사각형을 표시하는 함수
function renderCheckBox($min, $max, $value) {
if ($value >= $min && $value < $max) {
return '✅'; // 체크된 사각형
} else {
return '□'; // 빈 사각형
}
}
// 길이 범위에 맞는 체크된 사각형을 표시하는 함수
function renderLengthCheckBox($min, $max, $length) {
if ($length >= $min && $length < $max) {
return '✅'; // 체크된 사각형
} else {
return '□'; // 빈 사각형
}
}
// 이하
function renderincludeCheckBox($min, $max, $length) {
if ($length > $min && $length <= $max) {
return '✅'; // 체크된 사각형
} else {
return '□'; // 빈 사각형
}
}
?>
<!-- 두 번째 행 (치수) -->
<tr>
<td class="text-center align-middle" rowspan="3">2</td>
<td class="text-center align-middle" rowspan="3">치수 <br> (mm) </td>
<td class="text-center align-middle" rowspan="1">
두께
<input type="text" class="form-control text-center noborder-input inputItem" id="input_thickness" name="input_thickness" value="<?=$thickness?>" autocomplete="off">
</td>
<td class="text-center align-middle"> <?= renderCheckBox(0, 15, $thickness) ?> 15 미만</td>
<td class="text-center align-middle"> ± 0.5 </td>
<td class="text-center align-middle" rowspan="3">체크검사</td>
<td class="text-center align-middle" rowspan="1">
<input type="text" class="form-control text-center noborder-input inputItem" id="record_thickness1" name="record_thickness1" value="" autocomplete="off">
</td>
<td class="text-center align-middle" rowspan="1">
<input type="text" class="form-control text-center noborder-input inputItem" id="record_thickness2" name="record_thickness2" value="" autocomplete="off">
</td>
<td class="text-center align-middle" rowspan="1">
<input type="text" class="form-control text-center noborder-input inputItem" id="record_thickness3" name="record_thickness3" value="" autocomplete="off">
</td>
<td class="text-center align-middle judgement" rowspan="1"></td>
</tr>
<!-- 너비A -->
<tr>
<td class="text-center align-middle" rowspan="1">
너비A
<input type="text" class="form-control text-center noborder-input inputItem" id="width" name="width" value="<?=$width?>" autocomplete="off">
</td>
<td class="text-center align-middle"><?= renderincludeCheckBox( 49, 200, $width) ?> 50 이상 </td>
<td class="text-center align-middle"> ± 2% </td>
<td class="text-center align-middle" rowspan="1">
<input type="text" class="form-control text-center noborder-input inputItem" id="record_width1" name="record_width1" value="" autocomplete="off">
</td>
<td class="text-center align-middle" rowspan="1">
<input type="text" class="form-control text-center noborder-input inputItem" id="record_width2" name="record_width2" value="" autocomplete="off">
</td>
<td class="text-center align-middle" rowspan="1">
<input type="text" class="form-control text-center noborder-input inputItem" id="record_width3" name="record_width3" value="" autocomplete="off">
</td>
<td class="text-center align-middle judgement" rowspan="1"></td>
</tr>
<!-- 길이 검사 -->
<tr>
<td class="text-center align-middle" rowspan="1">
길이
<input type="text" class="form-control text-center noborder-input inputItem" id="input_length" name="input_length" value="<?=$length?>" autocomplete="off">
</td>
<td class="text-center align-middle"> - </td>
<td class="text-center align-middle"> + 200 <br> - 0</td>
<td class="text-center align-middle" rowspan="1">
<input type="text" class="form-control text-center noborder-input inputItem" id="record_length1" name="record_length1" value="" autocomplete="off">
</td>
<td class="text-center align-middle" rowspan="1">
<input type="text" class="form-control text-center noborder-input inputItem" id="record_length2" name="record_length2" value="" autocomplete="off">
</td>
<td class="text-center align-middle" rowspan="1">
<input type="text" class="form-control text-center noborder-input inputItem" id="record_length3" name="record_length3" value="" autocomplete="off">
</td>
<td class="text-center align-middle judgement" rowspan="1"></td>
</tr>
<!-- 항복강도 -->
<tr>
<td class="text-center align-middle">3</td>
<td class="text-center align-middle" colspan="2">항복강도 (N/㎟)</td>
<td class="text-center align-middle" colspan="1"><?= renderincludeCheckBox( 0, 16, $thickness) ?> 두께 16 이하 </td>
<td class="text-center align-middle" colspan="1">275 이상</td>
<td class="text-center align-middle" rowspan="4">공급업체 <br> 밀시트</td>
<td class="text-center align-middle" rowspan="4">입고시</td>
<td class="text-center align-middle" colspan="3">
<input type="text" class="form-control text-center noborder-input inputItem" id="yield_strength" name="yield_strength" autocomplete="off">
</td>
<td class="text-center align-middle judgement"></td>
</tr>
<!-- 인장 강도 -->
<tr>
<td class="text-center align-middle" rowspan="1">4</td>
<td class="text-center align-middle" colspan="2" rowspan="1">인장 강도 (N/㎟)</td>
<td class="text-center align-middle" colspan="2">410 ~ 550 </td>
<td class="text-center align-middle" rowspan="1" colspan="3">
<input type="text" class="form-control text-center noborder-input inputItem" id="tensile_strength" name="tensile_strength" autocomplete="off">
</td>
<td class="text-center align-middle judgement" rowspan="1"></td>
</tr>
<!-- 연신율 -->
<tr>
<td class="text-center align-middle" rowspan="2">5</td>
<td class="text-center align-middle" rowspan="2" colspan="2" rowspan="1">연신율 %</td>
<td class="text-center align-middle" colspan="1"><?= renderincludeCheckBox( 0, 5, $thickness) ?> 두께 5 이하 </td>
<td class="text-center align-middle" colspan="1"> 21 이상</td>
<td class="text-center align-middle" rowspan="2" colspan="3">
<input type="text" class="form-control text-center noborder-input inputItem" id="elongation" name="elongation" autocomplete="off">
</td>
<td class="text-center align-middle judgement" rowspan="2"></td>
</tr>
<tr>
<td class="text-center align-middle" colspan="1"><?= renderincludeCheckBox( 5, 16, $thickness) ?> 두께 5 초과 <br> ~16 이하 </td>
<td class="text-center align-middle" colspan="1"> 18 이상</td>
</tr>
<!-- 종합판정 -->
<tr>
<td colspan="8" rowspan="4" class="text-center align-top">
<div class="text-start fw-bold mt-1">
<span>[부적합 내용]</span> <br>
<span>
<input type="text" class="form-control text-start inputItem noborder-input" style="height:50px;" id="input_memo" name="input_memo" autocomplete="off">
&nbsp;</span>
</div>
</td>
<td colspan="3" class="text-center align-middle yellowredBold">
<div class="d-flex justify-content-center align-items-center fw-bold">
<span class="text-dark">종합판정</span>
</div>
</td>
</tr>
<tr>
<td colspan="3" rowspan="3" class="text-center align-middle">
<div class="text-center fw-bold mt-3 fs-1 ">
<input type="text" class="form-control fs-2 text-center inputItem noborder-input" style="height:50px;" id="resultJudgement" name="resultJudgement" autocomplete="off">
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</form>
</div> <!-- end of container -->
<div class="container mb-5 mt-2">
<div class="d-flex align-items-center justify-content-center mb-5">
</div>
</div>
<!-- 페이지로딩 -->
<script>
$(document).ready(function(){
var loader = document.getElementById('loadingOverlay');
if(loader)
loader.style.display = 'none';
});
function generatePDF() {
var workplace = '<?php echo $title_message; ?>';
var deadline = '<?php echo $today; ?>';
var deadlineDate = new Date(deadline);
var formattedDate = "(" + String(deadlineDate.getFullYear()).slice(-2) + "." + ("0" + (deadlineDate.getMonth() + 1)).slice(-2) + "." + ("0" + deadlineDate.getDate()).slice(-2) + ")";
var result = 'KD' + workplace +'_' + formattedDate + '.pdf';
var element = document.getElementById('content-to-print');
var opt = {
margin: [10, 3, 12, 3], // Top, right, bottom, left margins
filename: result,
image: { type: 'jpeg', quality: 0.98 },
html2canvas: { scale: 1 },
jsPDF: { unit: 'mm', format: 'a4', orientation: 'portrait' },
pagebreak: { mode: [''] }
};
html2pdf().from(element).set(opt).save();
}
// 모달을 호출할 때 tr 요소를 저장하는 변수
var selectedRow;
$(document).on('click', '.saveData', function() {
saveData();
});
$(document).on('click', '.approvalBtn', function() {
// 승인자의 이름과 오늘 날짜 가져오기
const userName = '<?=$user_name?>'; // PHP로부터 가져온 사용자 이름
const todayStr = '<?=$todayStr?>'; // PHP로부터 가져온 오늘 날짜
// 승인 정보를 approvalDiv에 표시
$('#approvalDiv').html(
userName + '<br>' + todayStr +
' <i class="bi bi-x-circle remove-approval" style="cursor: pointer;"></i>'
);
$('#approvalDiv').show();
// 결재 정보를 업데이트하여 저장 로직에 반영
updateApprovalData(userName, todayStr);
saveData();
});
// 결재 정보 업데이트 함수
function updateApprovalData(userName, date) {
// 저장 로직을 위해 결재 정보 업데이트
let approvalData = {
writer: {
name: $('#orderman').text().trim(),
date: '<?=$indateStr?>'
},
reviewer: {
name: $('#reviewDiv').is(':visible') ? '<?=$user_name?>' : '',
date: '<?=$todayStr?>'
},
approver: {
name: userName,
date: date
}
};
// 저장할 JSON 데이터 업데이트
let formData = JSON.parse($('#iList').val() || '[]');
const approvalIndex = formData.findIndex(item => item.approval);
if (approvalIndex !== -1) {
formData[approvalIndex].approval = approvalData;
} else {
formData.push({ approval: approvalData });
}
// JSON 문자열로 다시 저장
$('#iList').val(JSON.stringify(formData));
}
// 결재 취소 기능
$(document).on('click', '.remove-approval', function() {
// 결재 정보를 지우고 화면에서 숨김
$('#approvalDiv').html('').hide();
// JSON 데이터에서 결재자의 정보 제거
let formData = JSON.parse($('#iList').val() || '[]');
const approvalIndex = formData.findIndex(item => item.approval);
if (approvalIndex !== -1) {
formData[approvalIndex].approval.approver.name = '';
formData[approvalIndex].approval.approver.date = '';
}
// JSON 문자열로 다시 저장
$('#iList').val(JSON.stringify(formData));
Toastify({
text: "결재 정보가 삭제되었습니다.",
duration: 2000,
close: true,
gravity: "top",
position: "center",
style: {
background: "linear-gradient(to right, #ff5f6d, #ffc371)"
},
}).showToast();
saveData();
});
function captureReturnKey(e) {
if(e.keyCode==13 && e.srcElement.type != 'textarea')
return false;
}
function recaptureReturnKey(e) {
if(e.keyCode==13 && e.srcElement.type != 'textarea')
return false;
}
// 삽입/수정하는 모듈
function saveData() {
// json 형태로 form문에 저장하기
let formData = [];
// 결재 부분 정보 저장
let approvalData = {
writer: {
name: $('#chargedDiv').is(':visible') ? '<?=$user_name?>' : '',
date: '<?=$indateStr?>'
},
approver: {
name: $('#approvalDiv').is(':visible') ? '<?=$user_name?>' : '',
date: '<?=$todayStr?>'
}
};
formData.push({ approval: approvalData });
// 검사자 정보 저장
let productionManager = $('#userNameInput').val();
formData.push({ productionManager: productionManager });
// 추가 정보 저장
formData.push({ num: $('#num').val() });
formData.push({ update_log: $('#update_log').val() });
formData.push({ memo: $('#memo').val() });
// Class 'inputItem' 값 저장
let inputItems = {};
$('.inputItem').each(function() {
let inputName = $(this).attr('name');
inputItems[inputName] = $(this).val();
});
formData.push({ inputItems: inputItems });
// 체크박스 상태 저장
let checkboxData = [];
$('#mainTable tbody tr').each(function(index) {
let rowCheckboxes = {
good: [],
bad: [],
judgement: $(this).find('.judgement').text()
};
$(this).find('.check-good').each(function() {
rowCheckboxes.good.push($(this).prop('checked'));
});
$(this).find('.check-bad').each(function() {
rowCheckboxes.bad.push($(this).prop('checked'));
});
checkboxData.push(rowCheckboxes);
});
formData.push({ checkboxData: checkboxData });
// JSON 문자열로 변환
let jsonString = JSON.stringify(formData);
// 숨겨진 필드에 JSON 데이터 설정
$('#iList').val(jsonString);
$("#overlay").show(); // 오버레이 표시
$("button").prop("disabled", true); // 모든 버튼 비활성화
// 폼데이터 전송시 사용함 Get form
var form = $('#board_form')[0];
var datasource = new FormData(form);
showMsgModal(2); // 파일저장중
$.ajax({
enctype: 'multipart/form-data',
processData: false,
contentType: false,
cache: false,
timeout: 600000,
url: "insert_iList.php",
type: "post",
data: datasource,
dataType: "json",
success: function(data) {
console.log(data);
setTimeout(function() {
Toastify({
text: "저장완료",
duration: 3000,
close: true,
gravity: "top",
position: "center",
style: {
background: "linear-gradient(to right, #00b09b, #96c93d)"
},
}).showToast();
saveAndClose(); //부모창 변경
hideMsgModal();
$("button").prop("disabled", false); // 모든 버튼 활성화
}, 1000);
$("#overlay").hide(); // 오버레이 숨김
},
error: function(jqxhr, status, error) {
console.log(jqxhr, status, error);
alert("An error occurred: " + error);
}
});
}
// 팝업 창에서 데이터 저장 및 닫기 함수
function saveAndClose() {
const updatedData = {
resultJudgement: $("#resultJudgement").val(),
// 필요한 다른 필드도 여기에 추가할 수 있습니다.
};
// 부모 창의 함수 호출
if (window.opener && typeof window.opener.closePopupAndUpdateRow === 'function') {
window.opener.closePopupAndUpdateRow(updatedData);
} else {
console.error("Parent window function not found");
}
// 팝업 창 닫기
// window.close();
}
// 초기값 불러오기
$(document).ready(function() {
// console.log(iListData);
if (iListData.length > 0) {
// 결재 부분 정보
const approval = iListData.find(item => item.approval);
if (approval) {
if (approval.approval.writer.name && approval.approval.writer.date) {
$('#chargedDiv').show();
$('#chargedDiv').html(
approval.approval.writer.name + '<br>' + approval.approval.writer.date
);
} else {
$('#chargedDiv').hide().html('');
}
if (approval.approval.approver.name && approval.approval.approver.date) {
$('#approvalDiv').show();
$('#approvalDiv').html(
approval.approval.approver.name + '<br>' + approval.approval.approver.date +
' <i class="bi bi-x-circle remove-approval" style="cursor: pointer;"></i>'
);
} else {
$('#approvalDiv').hide().html('');
}
$('#workdate').text(approval.approval.writer.date);
}
// 검사자 정보
const productionManager = iListData.find(item => item.productionManager);
if (productionManager && productionManager.productionManager) {
$('#userNameInput').val(productionManager.productionManager).show();
$('#inputContainer').show();
$('#editButton').hide();
} else {
$('#userNameInput').val('');
$('#inputContainer').hide();
$('#editButton').show();
}
// inputItem 데이터 로드
const inputItems = iListData.find(item => item.inputItems);
if (inputItems && inputItems.inputItems) {
for (const [name, value] of Object.entries(inputItems.inputItems)) {
$(`.inputItem[name="${name}"]`).val(value);
}
}
// 체크박스 상태 로드
const checkboxData = iListData.find(item => item.checkboxData);
if (checkboxData && checkboxData.checkboxData) {
$('#mainTable tbody tr').each(function(index) {
const rowData = checkboxData.checkboxData[index];
if (rowData) {
$(this).find('.check-good').each(function(goodIndex) {
$(this).prop('checked', rowData.good[goodIndex]);
});
$(this).find('.check-bad').each(function(badIndex) {
$(this).prop('checked', rowData.bad[badIndex]);
});
$(this).find('.judgement').text(rowData.judgement);
}
});
}
}
});
// 첫번째 요소를 클릭하면 전체 로트번호 적용하기
$(document).ready(function() {
// id가 mainTable인 테이블의 첫 번째 td를 클릭했을 때 이벤트를 등록합니다.
$('#mainTable').on('click', 'td:first-child', function() {
// 클릭한 첫 번째 td의 형제인 두 번째 td 요소의 값을 가져옵니다.
var secondTdValue = $(this).siblings().find('input').val();
// id가 mainTable인 테이블에서 두 번째 td 요소에 해당 값을 적용합니다.
$('#mainTable tbody tr').each(function() {
$(this).find('td:nth-child(2) input').val(secondTdValue);
});
});
});
// 부트스트랩 툴팁
$(document).ready(function() {
var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]'));
var tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) {
return new bootstrap.Tooltip(tooltipTriggerEl);
});
});
</script>
<script>
$(document).ready(function() {
var thickness = <?= isset($thickness) ? $thickness : 'null' ?>;
var width = <?= isset($width) ? $width : 'null' ?>;
var height = <?= isset($height) ? $height : 'null' ?>;
var length = <?= isset($length) ? $length : 'null' ?>;
// console.log('width', width);
// console.log('height', height);
$('#mainTable tbody tr').each(function() {
var $row = $(this);
var $judgementCell = $row.find('.judgement');
function updateJudgement() {
var isValidThickness = true;
var isValidWidth = true;
var isValidHeight = true;
var isValidLength = true;
var isValidTensile = true;
var isValidYieldStrength = true;
var isValidElongation = true;
var allFieldsFilled = true; // 모든 필드가 채워졌는지 확인하는 플래그
// 두께 허용 범위 설정
var Up_thicknessTolerance;
var Down_thicknessTolerance;
if (thickness < 15 ) {
Up_thicknessTolerance = 0.5;
Down_thicknessTolerance = 0.5;
}
// 두께 범위 비교
$row.find('input[name^="record_thickness"]').each(function() {
var value = parseFloat($(this).val());
if (isNaN(value)) {
allFieldsFilled = false;
return false;
}
var lowerLimit = thickness - Down_thicknessTolerance;
var upperLimit = thickness + Up_thicknessTolerance;
if (value < lowerLimit || value > upperLimit) {
isValidThickness = false;
}
});
// 너비A 범위 비교
$row.find('input[name^="record_width"]').each(function() {
if (width >= 50 ) {
var lowerLimit = width - width * 0.02 ;
var upperLimit = width + width * 0.02 ;
}
var value = parseFloat($(this).val());
if (isNaN(value)) {
allFieldsFilled = false;
return false;
}
if (value < lowerLimit || value > upperLimit) {
isValidWidth = false;
}
});
// 길이 허용 범위 설정
$row.find('input[name^="record_length"]').each(function() {
var value = parseFloat($(this).val());
if (isNaN(value)) {
allFieldsFilled = false;
return false;
}
var lowerLimit = length ;
var upperLimit = length + 200;
if (value < lowerLimit || value > upperLimit) {
isValidLength = false;
}
});
// 항복강도 검사
$row.find('input[name="yield_strength"]').each(function() {
var value = parseFloat($(this).val());
if (isNaN(value)) {
allFieldsFilled = false;
return false;
}
if (value < 275) {
isValidYieldStrength = false;
}
});
// 인장강도 비교
$row.find('input[name="tensile_strength"]').each(function() {
var value = parseFloat($(this).val());
if (isNaN(value)) {
allFieldsFilled = false;
return false;
}
if (value < 410 || value > 550) {
isValidTensile = false;
}
});
// 연신율 비교
$row.find('input[name="elongation"]').each(function() {
if (thickness <= 5 ) {
var tolerance = 21;
} else if (thickness > 5 && thickness <= 16 ) {
var tolerance = 18;
}
var value = parseFloat($(this).val());
if (isNaN(value)) {
allFieldsFilled = false;
return false;
}
if (value < tolerance) {
isValidElongation = false;
}
});
// OK/NG 체크박스 상태 검사
var allGood = true;
var anyBad = false;
// 해당 행에 OK 체크박스가 있는지 확인
if ($row.find('.check-good').length > 0) {
$row.find('.check-good').each(function() {
// 체크박스가 undefined이거나 제대로 체크되지 않으면 필드가 채워지지 않은 것으로 판단
if (isNaN($(this).is(':checked'))) {
allFieldsFilled = false;
return false;
}
if (!$(this).is(':checked')) {
allGood = false;
}
});
}
// 해당 행에 NG 체크박스가 있는지 확인
if ($row.find('.check-bad').length > 0) {
$row.find('.check-bad').each(function() {
if (isNaN($(this).is(':checked'))) {
allFieldsFilled = false;
return false;
}
if ($(this).is(':checked')) {
anyBad = true;
}
});
}
// OK/NG 체크박스 상태 검사
var checkedGood = 0; // 체크된 OK 체크박스 수
var checkedBad = 0; // 체크된 NG 체크박스 수
// 각 열의 OK/NG 체크박스를 한 번만 확인하도록 변경
var goodChecks = $row.find('.check-good');
var badChecks = $row.find('.check-bad');
// 해당 행에 OK 체크박스가 있는지 확인
if (goodChecks.length > 0) {
goodChecks.each(function() {
if ($(this).is(':checked')) {
checkedGood++; // OK 체크박스가 체크되면 증가
}
});
}
// 해당 행에 NG 체크박스가 있는지 확인
if (badChecks.length > 0) {
badChecks.each(function() {
if ($(this).is(':checked')) {
checkedBad++; // NG 체크박스가 체크되면 증가
}
});
}
// 모든 체크박스가 다 체크되지 않았다면 공백으로 처리
if (checkedGood + checkedBad !== 3 && (goodChecks.length > 0 || badChecks.length > 0)) {
allFieldsFilled = false; // 모두 체크되지 않았다면 공백 표시
}
// 모든 필드가 채워지지 않았으면 공백으로 설정
if (!allFieldsFilled) {
$judgementCell.text('');
} else {
// 판정 업데이트
if (isValidThickness && isValidWidth && isValidHeight && isValidLength && isValidTensile && isValidElongation && isValidYieldStrength && allGood && !anyBad) {
$judgementCell.text('적');
} else {
$judgementCell.text('부');
}
}
}
// 페이지 로드 시 초기 판단
updateJudgement();
// 체크박스 토글
$row.find('td').each(function() {
var $goodCheck = $(this).find('.check-good');
var $badCheck = $(this).find('.check-bad');
$goodCheck.on('change', function() {
if ($(this).is(':checked')) {
$badCheck.prop('checked', false);
}
updateJudgement();
updateFinalJudgement();
});
$badCheck.on('change', function() {
if ($(this).is(':checked')) {
$goodCheck.prop('checked', false);
}
updateJudgement();
updateFinalJudgement();
});
});
// input 값 변경 시 판정 업데이트
$row.find('input').on('input', updateJudgement);
$row.find('input').on('input', updateFinalJudgement);
});
// 최종 종합 판정 업데이트 함수
function updateFinalJudgement() {
var allPass = true;
var allJudged = true;
$('#mainTable tbody tr .judgement').each(function() {
var judgementText = $(this).text();
if (judgementText === '') {
allJudged = false;
}
if (judgementText === '부') {
allPass = false;
$(this).css('background-color', '#f8d7da');
} else {
$(this).css('background-color', '');
}
});
if (allJudged) {
if (allPass) {
$('#resultJudgement').val('합격');
} else {
$('#resultJudgement').val('불합격');
}
} else {
$('#resultJudgement').val('');
}
}
// 페이지 로드 시 최종 판정 업데이트
updateFinalJudgement();
});
</script>
<?php require_once $_SERVER['DOCUMENT_ROOT'] . '/' . $tablename . '/common/JS_instock.php'; ?> <!-- instock 후반부 공통 JS -->
</body>
</html>

974
instock/i_pole.php Normal file
View File

@@ -0,0 +1,974 @@
<?php
$tablename = 'instock';
?>
<?php include $_SERVER['DOCUMENT_ROOT'] . '/' . $tablename . '/common/head.php' ; ?> <!-- head 정보 불러오기 -->
<?php
// print $spec;
$itemTitle = '일반구조용 압연강재 "마환봉" <br> (JIS G 3101, SS400) ';
// '파이'를 제거하고 숫자 추출
preg_match('/(\d+)파이/', $spec, $matches);
$thickness = $matches[1];
// 'L:' 뒤에 있는 길이 추출하고 ',' 제거
preg_match('/L:(\d{1,3}(?:,\d{3})*)/', $spec, $matches);
$length = str_replace(',', '', $matches[1]);
// 최종 결과 출력
$spec = $thickness . ' * ' . $length;
$today = date("Y-m-d");
require_once $_SERVER['DOCUMENT_ROOT'] . '/instock/commonDriveLoad.php'; // 구글드라이브 파일형태 이미지형태 읽어오기 모듈
$savetitle ='수입검사성적서';
?>
<?php include $_SERVER['DOCUMENT_ROOT'] . '/' . $tablename . '/common/instock_btn.php'; ?> <!-- Btn 정보 불러오기 -->
<div id="content-to-print">
<br>
<div class="container mt-3">
<div class="d-flex align-items-center justify-content-center m-1">
<table class="table " style="border-collapse: collapse;">
<thead>
<tr>
<th rowspan="3" class="text-center" style="width:70%;">
<div class="row">
<div class="col-sm-2">
<img src="../img/kdlogo.png" alt="경동기업" class="me-1" style="width:100%; height:auto;">
</div>
<div class="col-sm-10">
<div class="d-flex align-items-center justify-content-center m-1">
<span class="text-dark ms-1 me-1 fs-2" > &nbsp; 수 </span>
<span class="text-dark me-1 fs-2" > &nbsp; 입 </span>
<span class="text-dark me-1 fs-2" > &nbsp; 검 </span>
<span class="text-dark me-1 fs-2" > &nbsp; 사 </span>
<span class="text-dark me-1 fs-2" > &nbsp; </span>
<span class="text-dark me-1 fs-2" > &nbsp; 성 </span>
<span class="text-dark me-1 fs-2" > &nbsp; 적 </span>
<span class="text-dark me-1 fs-2" > &nbsp; 서 </span>
</div>
</div>
</div>
</th>
<th rowspan="3" class="text-center fw-bold" style="height:100px;">결 재</th>
<th class="text-center p-1" style="width : 100px; height:22px; padding:2px;">담당</th>
<th class="text-center p-1" style="width : 100px; height:22px; padding:2px;">부서장</th>
</tr>
<tr style="height:40px;">
<th class="text-center">
<div id="chargedDiv" style="display: none;">
<span id="orderman"> <?=$orderman?> </span> <br> <?=$indateStr ?>
</div>
</th>
<th class="text-center">
<div id="approvalDiv" style="display: none;">
<?=$user_name?> <br> <?=$todayStr ?>
</div>
</th>
</tr>
<tr>
<th colspan="2"> 입고일자 : <?=$inspection_date?></th>
</tr>
</thead>
</table>
</div>
<div class="d-flex align-items-center justify-content-center m-1">
<table class="table table-bordered" style="border-collapse: collapse;">
<tbody>
<tr>
<td class="text-center align-middle lightgray">품 명</td>
<td colspan="2" class="text-center fw-bold"><?=$itemTitle?></td>
<td class="text-center align-middle lightgray">납품업체<br>제조업체</td>
<td class="text-center text-primary fw-bold"><?=$supplier?> <br> (<?=$manufacturer?>) </td>
</tr>
<tr>
<td class="text-center align-middle lightgray">규 격<br>(두께*길이) </td>
<td colspan="2" class="text-center fw-bold"><?=$spec?></td>
<td class="text-center align-middle lightgray">로트번호</td>
<td colspan="1" class="text-center text-primary fw-bold">
<?=$lot_no?>
</td>
</tr>
<tr>
<td class="text-center align-middle lightgray">자재번호</td>
<td colspan="2" class="text-center fw-bold"><?=$material_no?></td>
<td class="text-center align-middle lightgray">검사일자</td>
<td colspan="1" class="text-center text-primary fw-bold">
<?=$indateStr?>
</td>
</tr>
<tr>
<td class="text-center align-middle lightgray">로트크기</td>
<td class="text-center text-dark fw-bold"><?=$received_qty?> </td>
<td class="text-center text-dark fw-bold"><?=$unit?> </td>
<td class="text-center align-middle lightgray">검사자</td>
<td class="text-center">
<div class="d-flex justify-content-center">
<button type="button" id="editButton" class="btn btn-primary btn-sm">검사자</button>
<div id="inputContainer" style="display: none;">
<input type="text" id="userNameInput" class="form-control d-inline-block noborder-input text-center" style="width:100px;" autocomplete="off" style="widtd: 100px;" value="<?=$user_name?>">
<button type="button" id="cancelButton" class="btn btn-outline-danger btn-sm"> <i class="bi bi-x"> </i> </button>
</div>
</div>
</td>
</tr>
<script>
$(document).ready(function() {
// '담당자 입력' 버튼 클릭 시 input 표시 및 버튼 숨김
$('#editButton').on('click', function() {
$('#editButton').hide();
$('#inputContainer').show();
$('#workdate').text('<?php echo $todayStr; ?>');
$('#chargedDiv').show();
});
// '취소' 버튼 클릭 시 원래 상태로 되돌림
$('#cancelButton').on('click', function() {
$('#inputContainer').hide();
$('#chargedDiv').hide();
$('#workdate').text('');
$('#editButton').show();
});
});
</script>
</tbody>
</table>
</div>
<div class="row justify-content-start m-1 mt-2">
<table id="mainTable" class="table table-hover" style="border-collapse: collapse;">
<thead>
<tr>
<th class="text-center align-middle" rowspan="2">NO</th>
<th class="text-center align-middle" rowspan="2" colspan="2">검사항목</th>
<th class="text-center align-middle" rowspan="2" colspan="2">검사기준</th>
<th class="text-center align-middle" rowspan="2">검사방식</th>
<th class="text-center align-middle" rowspan="2">검사주기</th>
<th class="text-center align-middle" colspan="3">측정치</th>
<th class="text-center align-middle" rowspan="2">판정 <br> (적/부)</th>
</tr>
<tr>
<th class="text-center">n1 <br> 양호/불량 </th>
<th class="text-center">n2 <br> 양호/불량 </th>
<th class="text-center">n3 <br> 양호/불량 </th>
</tr>
</thead>
<tbody>
<!-- 첫 번째 행 (겉모양) -->
<tr>
<td class="text-center align-middle">1</td>
<td class="text-center align-middle" colspan="2">겉모양</td>
<td class="text-center align-middle" colspan="2">사용상 해로울 <br> 결함이 없을 것</td>
<td class="text-center align-middle">육안검사</td>
<td class="text-center align-middle" rowspan="3">n = 3 <br>c = 0</td>
<td class="text-center align-middle">
<label>
<input type="checkbox" class="check-good"> OK
</label>
<label>
<input type="checkbox" class="check-bad"> NG
</label>
</td>
<td class="text-center align-middle">
<label>
<input type="checkbox" class="check-good"> OK
</label>
<label>
<input type="checkbox" class="check-bad"> NG
</label>
</td>
<td class="text-center align-middle">
<label>
<input type="checkbox" class="check-good"> OK
</label>
<label>
<input type="checkbox" class="check-bad"> NG
</label>
</td>
<td class="text-center align-middle judgement"></td>
</tr>
<?php
// 두께 범위에 맞는 체크된 사각형을 표시하는 함수
function renderCheckBox($min, $max, $value) {
if ($value >= $min && $value < $max) {
return '✅'; // 체크된 사각형
} else {
return '□'; // 빈 사각형
}
}
// 길이 범위에 맞는 체크된 사각형을 표시하는 함수
function renderLengthCheckBox($min, $max, $length) {
if ($length >= $min && $length < $max) {
return '✅'; // 체크된 사각형
} else {
return '□'; // 빈 사각형
}
}
// 이하
function renderincludeCheckBox($min, $max, $length) {
if ($length > $min && $length <= $max) {
return '✅'; // 체크된 사각형
} else {
return '□'; // 빈 사각형
}
}
?>
<!-- 두 번째 행 (치수) -->
<tr>
<td class="text-center align-middle" rowspan="2">2</td>
<td class="text-center align-middle" rowspan="2">치수 <br> (mm) </td>
<td class="text-center align-middle" rowspan="1">
두께
<input type="text" class="form-control text-center noborder-input inputItem" id="input_thickness" name="input_thickness" value="<?=$thickness?>" autocomplete="off">
</td>
<td class="text-center align-middle"> <?= renderCheckBox(0, 15, $thickness) ?> 6 mm </td>
<td class="text-center align-middle"> ± 0.4 </td>
<td class="text-center align-middle" rowspan="2">체크검사</td>
<td class="text-center align-middle" rowspan="1">
<input type="text" class="form-control text-center noborder-input inputItem" id="record_thickness1" name="record_thickness1" value="" autocomplete="off">
</td>
<td class="text-center align-middle" rowspan="1">
<input type="text" class="form-control text-center noborder-input inputItem" id="record_thickness2" name="record_thickness2" value="" autocomplete="off">
</td>
<td class="text-center align-middle" rowspan="1">
<input type="text" class="form-control text-center noborder-input inputItem" id="record_thickness3" name="record_thickness3" value="" autocomplete="off">
</td>
<td class="text-center align-middle judgement" rowspan="1"></td>
</tr>
<!-- 길이 검사 -->
<tr>
<td class="text-center align-middle" rowspan="1">
길이
<input type="text" class="form-control text-center noborder-input inputItem" id="input_length" name="input_length" value="<?=$length?>" autocomplete="off">
</td>
<td class="text-center align-middle"> <?= renderincludeCheckBox( 0, 7000, $length) ?> 7000 이하 </td>
<td class="text-center align-middle">+ 40 <br> - 0</td>
<td class="text-center align-middle" rowspan="1">
<input type="text" class="form-control text-center noborder-input inputItem" id="record_length1" name="record_length1" value="" autocomplete="off">
</td>
<td class="text-center align-middle" rowspan="1">
<input type="text" class="form-control text-center noborder-input inputItem" id="record_length2" name="record_length2" value="" autocomplete="off">
</td>
<td class="text-center align-middle" rowspan="1">
<input type="text" class="form-control text-center noborder-input inputItem" id="record_length3" name="record_length3" value="" autocomplete="off">
</td>
<td class="text-center align-middle judgement" rowspan="1"></td>
</tr>
<!-- 화학성분 -->
<tr>
<td class="text-center align-middle" rowspan="5">3</td>
<td class="text-center align-middle" rowspan="5">화학<br> 성분</td>
<td class="text-center align-middle" colspan="1">C</td>
<td class="text-center align-middle" colspan="2"> 0.25 이하 </td>
<td class="text-center align-middle" rowspan="5">공급업체 <br> 밀시트</td>
<td class="text-center align-middle" rowspan="5">입고시</td>
<td class="text-center align-middle" colspan="3">
<input type="text" class="form-control text-center noborder-input inputItem" id="input_C" name="input_C" autocomplete="off">
</td>
<td class="text-center align-middle judgement"></td>
</tr>
<tr>
<td class="text-center align-middle" colspan="1">Si</td>
<td class="text-center align-middle" colspan="2"> 0.45 이하 </td>
<td class="text-center align-middle" colspan="3">
<input type="text" class="form-control text-center noborder-input inputItem" id="input_Si" name="input_Si" autocomplete="off">
</td>
<td class="text-center align-middle judgement"></td>
</tr>
<tr>
<td class="text-center align-middle" colspan="1">Mn</td>
<td class="text-center align-middle" colspan="2"> 1.40 이하 </td>
<td class="text-center align-middle" colspan="3">
<input type="text" class="form-control text-center noborder-input inputItem" id="input_Mn" name="input_Mn" autocomplete="off">
</td>
<td class="text-center align-middle judgement"></td>
</tr>
<tr>
<td class="text-center align-middle" colspan="1">P</td>
<td class="text-center align-middle" colspan="2"> 0.05 이하 </td>
<td class="text-center align-middle" colspan="3">
<input type="text" class="form-control text-center noborder-input inputItem" id="input_P" name="input_P" autocomplete="off">
</td>
<td class="text-center align-middle judgement"></td>
</tr>
<tr>
<td class="text-center align-middle" colspan="1">S</td>
<td class="text-center align-middle" colspan="2"> 0.05 이하 </td>
<td class="text-center align-middle" colspan="3">
<input type="text" class="form-control text-center noborder-input inputItem" id="input_S" name="input_S" autocomplete="off">
</td>
<td class="text-center align-middle judgement"></td>
</tr>
<!-- 종합판정 -->
<tr>
<td colspan="8" rowspan="4" class="text-center align-top">
<div class="text-start fw-bold mt-1">
<span>[부적합 내용]</span> <br>
<span>
<input type="text" class="form-control text-start inputItem noborder-input" style="height:50px;" id="input_memo" name="input_memo" autocomplete="off">
&nbsp;</span>
</div>
</td>
<td colspan="3" class="text-center align-middle yellowredBold">
<div class="d-flex justify-content-center align-items-center fw-bold">
<span class="text-dark">종합판정</span>
</div>
</td>
</tr>
<tr>
<td colspan="3" rowspan="3" class="text-center align-middle">
<div class="text-center fw-bold mt-3 fs-1 ">
<input type="text" class="form-control fs-2 text-center inputItem noborder-input" style="height:50px;" id="resultJudgement" name="resultJudgement" autocomplete="off">
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</form>
</div> <!-- end of container -->
<div class="container mb-5 mt-2">
<div class="d-flex align-items-center justify-content-center mb-5">
</div>
</div>
<!-- 페이지로딩 -->
<script>
$(document).ready(function(){
var loader = document.getElementById('loadingOverlay');
if(loader)
loader.style.display = 'none';
});
function generatePDF() {
var workplace = '<?php echo $title_message; ?>';
var deadline = '<?php echo $today; ?>';
var deadlineDate = new Date(deadline);
var formattedDate = "(" + String(deadlineDate.getFullYear()).slice(-2) + "." + ("0" + (deadlineDate.getMonth() + 1)).slice(-2) + "." + ("0" + deadlineDate.getDate()).slice(-2) + ")";
var result = 'KD' + workplace +'_' + formattedDate + '.pdf';
var element = document.getElementById('content-to-print');
var opt = {
margin: [10, 3, 12, 3], // Top, right, bottom, left margins
filename: result,
image: { type: 'jpeg', quality: 0.98 },
html2canvas: { scale: 1 },
jsPDF: { unit: 'mm', format: 'a4', orientation: 'portrait' },
pagebreak: { mode: [''] }
};
html2pdf().from(element).set(opt).save();
}
// 모달을 호출할 때 tr 요소를 저장하는 변수
var selectedRow;
$(document).on('click', '.saveData', function() {
saveData();
});
$(document).on('click', '.approvalBtn', function() {
// 승인자의 이름과 오늘 날짜 가져오기
const userName = '<?=$user_name?>'; // PHP로부터 가져온 사용자 이름
const todayStr = '<?=$todayStr?>'; // PHP로부터 가져온 오늘 날짜
// 승인 정보를 approvalDiv에 표시
$('#approvalDiv').html(
userName + '<br>' + todayStr +
' <i class="bi bi-x-circle remove-approval" style="cursor: pointer;"></i>'
);
$('#approvalDiv').show();
// 결재 정보를 업데이트하여 저장 로직에 반영
updateApprovalData(userName, todayStr);
saveData();
});
// 결재 정보 업데이트 함수
function updateApprovalData(userName, date) {
// 저장 로직을 위해 결재 정보 업데이트
let approvalData = {
writer: {
name: $('#orderman').text().trim(),
date: '<?=$indateStr?>'
},
reviewer: {
name: $('#reviewDiv').is(':visible') ? '<?=$user_name?>' : '',
date: '<?=$todayStr?>'
},
approver: {
name: userName,
date: date
}
};
// 저장할 JSON 데이터 업데이트
let formData = JSON.parse($('#iList').val() || '[]');
const approvalIndex = formData.findIndex(item => item.approval);
if (approvalIndex !== -1) {
formData[approvalIndex].approval = approvalData;
} else {
formData.push({ approval: approvalData });
}
// JSON 문자열로 다시 저장
$('#iList').val(JSON.stringify(formData));
}
// 결재 취소 기능
$(document).on('click', '.remove-approval', function() {
// 결재 정보를 지우고 화면에서 숨김
$('#approvalDiv').html('').hide();
// JSON 데이터에서 결재자의 정보 제거
let formData = JSON.parse($('#iList').val() || '[]');
const approvalIndex = formData.findIndex(item => item.approval);
if (approvalIndex !== -1) {
formData[approvalIndex].approval.approver.name = '';
formData[approvalIndex].approval.approver.date = '';
}
// JSON 문자열로 다시 저장
$('#iList').val(JSON.stringify(formData));
Toastify({
text: "결재 정보가 삭제되었습니다.",
duration: 2000,
close: true,
gravity: "top",
position: "center",
style: {
background: "linear-gradient(to right, #ff5f6d, #ffc371)"
},
}).showToast();
saveData();
});
function captureReturnKey(e) {
if(e.keyCode==13 && e.srcElement.type != 'textarea')
return false;
}
function recaptureReturnKey(e) {
if(e.keyCode==13 && e.srcElement.type != 'textarea')
return false;
}
// 삽입/수정하는 모듈
function saveData() {
// json 형태로 form문에 저장하기
let formData = [];
// 결재 부분 정보 저장
let approvalData = {
writer: {
name: $('#chargedDiv').is(':visible') ? '<?=$user_name?>' : '',
date: '<?=$indateStr?>'
},
approver: {
name: $('#approvalDiv').is(':visible') ? '<?=$user_name?>' : '',
date: '<?=$todayStr?>'
}
};
formData.push({ approval: approvalData });
// 검사자 정보 저장
let productionManager = $('#userNameInput').val();
formData.push({ productionManager: productionManager });
// 추가 정보 저장
formData.push({ num: $('#num').val() });
formData.push({ update_log: $('#update_log').val() });
formData.push({ memo: $('#memo').val() });
// Class 'inputItem' 값 저장
let inputItems = {};
$('.inputItem').each(function() {
let inputName = $(this).attr('name');
inputItems[inputName] = $(this).val();
});
formData.push({ inputItems: inputItems });
// 체크박스 상태 저장
let checkboxData = [];
$('#mainTable tbody tr').each(function(index) {
let rowCheckboxes = {
good: [],
bad: [],
judgement: $(this).find('.judgement').text()
};
$(this).find('.check-good').each(function() {
rowCheckboxes.good.push($(this).prop('checked'));
});
$(this).find('.check-bad').each(function() {
rowCheckboxes.bad.push($(this).prop('checked'));
});
checkboxData.push(rowCheckboxes);
});
formData.push({ checkboxData: checkboxData });
// JSON 문자열로 변환
let jsonString = JSON.stringify(formData);
// 숨겨진 필드에 JSON 데이터 설정
$('#iList').val(jsonString);
$("#overlay").show(); // 오버레이 표시
$("button").prop("disabled", true); // 모든 버튼 비활성화
// 폼데이터 전송시 사용함 Get form
var form = $('#board_form')[0];
var datasource = new FormData(form);
showMsgModal(2); // 파일저장중
$.ajax({
enctype: 'multipart/form-data',
processData: false,
contentType: false,
cache: false,
timeout: 600000,
url: "insert_iList.php",
type: "post",
data: datasource,
dataType: "json",
success: function(data) {
// console.log(data);
setTimeout(function() {
Toastify({
text: "저장완료",
duration: 3000,
close: true,
gravity: "top",
position: "center",
style: {
background: "linear-gradient(to right, #00b09b, #96c93d)"
},
}).showToast();
saveAndClose(); //부모창 변경
hideMsgModal();
$("button").prop("disabled", false); // 모든 버튼 활성화
}, 1000);
$("#overlay").hide(); // 오버레이 숨김
},
error: function(jqxhr, status, error) {
console.log(jqxhr, status, error);
alert("An error occurred: " + error);
}
});
}
// 팝업 창에서 데이터 저장 및 닫기 함수
function saveAndClose() {
const updatedData = {
resultJudgement: $("#resultJudgement").val(),
// 필요한 다른 필드도 여기에 추가할 수 있습니다.
};
// 부모 창의 함수 호출
if (window.opener && typeof window.opener.closePopupAndUpdateRow === 'function') {
window.opener.closePopupAndUpdateRow(updatedData);
} else {
console.error("Parent window function not found");
}
// 팝업 창 닫기
// window.close();
}
// 초기값 불러오기
$(document).ready(function() {
// console.log(iListData);
if (iListData.length > 0) {
// 결재 부분 정보
const approval = iListData.find(item => item.approval);
if (approval) {
if (approval.approval.writer.name && approval.approval.writer.date) {
$('#chargedDiv').show();
$('#chargedDiv').html(
approval.approval.writer.name + '<br>' + approval.approval.writer.date
);
} else {
$('#chargedDiv').hide().html('');
}
if (approval.approval.approver.name && approval.approval.approver.date) {
$('#approvalDiv').show();
$('#approvalDiv').html(
approval.approval.approver.name + '<br>' + approval.approval.approver.date +
' <i class="bi bi-x-circle remove-approval" style="cursor: pointer;"></i>'
);
} else {
$('#approvalDiv').hide().html('');
}
$('#workdate').text(approval.approval.writer.date);
}
// 검사자 정보
const productionManager = iListData.find(item => item.productionManager);
if (productionManager && productionManager.productionManager) {
$('#userNameInput').val(productionManager.productionManager).show();
$('#inputContainer').show();
$('#editButton').hide();
} else {
$('#userNameInput').val('');
$('#inputContainer').hide();
$('#editButton').show();
}
// inputItem 데이터 로드
const inputItems = iListData.find(item => item.inputItems);
if (inputItems && inputItems.inputItems) {
for (const [name, value] of Object.entries(inputItems.inputItems)) {
$(`.inputItem[name="${name}"]`).val(value);
}
}
// 체크박스 상태 로드
const checkboxData = iListData.find(item => item.checkboxData);
if (checkboxData && checkboxData.checkboxData) {
$('#mainTable tbody tr').each(function(index) {
const rowData = checkboxData.checkboxData[index];
if (rowData) {
$(this).find('.check-good').each(function(goodIndex) {
$(this).prop('checked', rowData.good[goodIndex]);
});
$(this).find('.check-bad').each(function(badIndex) {
$(this).prop('checked', rowData.bad[badIndex]);
});
$(this).find('.judgement').text(rowData.judgement);
}
});
}
}
});
// 첫번째 요소를 클릭하면 전체 로트번호 적용하기
$(document).ready(function() {
// id가 mainTable인 테이블의 첫 번째 td를 클릭했을 때 이벤트를 등록합니다.
$('#mainTable').on('click', 'td:first-child', function() {
// 클릭한 첫 번째 td의 형제인 두 번째 td 요소의 값을 가져옵니다.
var secondTdValue = $(this).siblings().find('input').val();
// id가 mainTable인 테이블에서 두 번째 td 요소에 해당 값을 적용합니다.
$('#mainTable tbody tr').each(function() {
$(this).find('td:nth-child(2) input').val(secondTdValue);
});
});
});
// 부트스트랩 툴팁
$(document).ready(function() {
var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]'));
var tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) {
return new bootstrap.Tooltip(tooltipTriggerEl);
});
});
</script>
<script>
$(document).ready(function() {
var thickness = <?= isset($thickness) ? $thickness : 'null' ?>;
var width = <?= isset($width) ? $width : 'null' ?>;
var height = <?= isset($height) ? $height : 'null' ?>;
var length = <?= isset($length) ? $length : 'null' ?>;
// console.log('width', width);
// console.log('height', height);
console.log('thickness', thickness);
$('#mainTable tbody tr').each(function() {
var $row = $(this);
var $judgementCell = $row.find('.judgement');
function updateJudgement() {
var isValidThickness = true;
var isValidWidth = true;
var isValidHeight = true;
var isValidLength = true;
var isValidC = true;
var isValidSi = true;
var isValidMn = true;
var isValidP = true;
var isValidS = true;
var allFieldsFilled = true; // 모든 필드가 채워졌는지 확인하는 플래그
// 두께 허용 범위 설정
var Up_thicknessTolerance;
var Down_thicknessTolerance;
if (thickness < 7 ) {
Up_thicknessTolerance = 0.4;
Down_thicknessTolerance = 0.4;
}
console.log('Up_thicknessTolerance', Up_thicknessTolerance);
console.log('Down_thicknessTolerance', Down_thicknessTolerance);
// 두께 범위 비교
$row.find('input[name^="record_thickness"]').each(function() {
var value = parseFloat($(this).val());
if (isNaN(value)) {
allFieldsFilled = false;
return false;
}
var lowerLimit = thickness - Down_thicknessTolerance;
var upperLimit = thickness + Up_thicknessTolerance;
if (value < lowerLimit || value > upperLimit) {
isValidThickness = false;
}
});
// 길이 허용 범위 설정
$row.find('input[name^="record_length"]').each(function() {
var value = parseFloat($(this).val());
if (isNaN(value)) {
allFieldsFilled = false;
return false;
}
var lowerLimit = length ;
var upperLimit = length + 40;
if (value < lowerLimit || value > upperLimit) {
isValidLength = false;
}
});
// input_C 화학성분
$row.find('input[name="input_C"]').each(function() {
var value = parseFloat($(this).val());
if (isNaN(value)) {
allFieldsFilled = false;
return false;
}
if (value > 0.25) {
isValidC = false;
}
});
// input_Si 화학성분
$row.find('input[name="input_Si"]').each(function() {
var value = parseFloat($(this).val());
if (isNaN(value)) {
allFieldsFilled = false;
return false;
}
if (value > 0.45) {
isValidSi = false;
}
});
// input_Mn 화학성분
$row.find('input[name="input_Mn"]').each(function() {
var value = parseFloat($(this).val());
if (isNaN(value)) {
allFieldsFilled = false;
return false;
}
if (value > 1.40) {
isValidMn = false;
}
});
// input_P 화학성분
$row.find('input[name="input_P"]').each(function() {
var value = parseFloat($(this).val());
if (isNaN(value)) {
allFieldsFilled = false;
return false;
}
if (value > 0.05) {
isValidP = false;
}
});
// input_S 화학성분
$row.find('input[name="input_S"]').each(function() {
var value = parseFloat($(this).val());
if (isNaN(value)) {
allFieldsFilled = false;
return false;
}
if (value > 0.05) {
isValidS = false;
}
});
// OK/NG 체크박스 상태 검사
var allGood = true;
var anyBad = false;
// 해당 행에 OK 체크박스가 있는지 확인
if ($row.find('.check-good').length > 0) {
$row.find('.check-good').each(function() {
// 체크박스가 undefined이거나 제대로 체크되지 않으면 필드가 채워지지 않은 것으로 판단
if (isNaN($(this).is(':checked'))) {
allFieldsFilled = false;
return false;
}
if (!$(this).is(':checked')) {
allGood = false;
}
});
}
// 해당 행에 NG 체크박스가 있는지 확인
if ($row.find('.check-bad').length > 0) {
$row.find('.check-bad').each(function() {
if (isNaN($(this).is(':checked'))) {
allFieldsFilled = false;
return false;
}
if ($(this).is(':checked')) {
anyBad = true;
}
});
}
// OK/NG 체크박스 상태 검사
var checkedGood = 0; // 체크된 OK 체크박스 수
var checkedBad = 0; // 체크된 NG 체크박스 수
// 각 열의 OK/NG 체크박스를 한 번만 확인하도록 변경
var goodChecks = $row.find('.check-good');
var badChecks = $row.find('.check-bad');
// 해당 행에 OK 체크박스가 있는지 확인
if (goodChecks.length > 0) {
goodChecks.each(function() {
if ($(this).is(':checked')) {
checkedGood++; // OK 체크박스가 체크되면 증가
}
});
}
// 해당 행에 NG 체크박스가 있는지 확인
if (badChecks.length > 0) {
badChecks.each(function() {
if ($(this).is(':checked')) {
checkedBad++; // NG 체크박스가 체크되면 증가
}
});
}
// 모든 체크박스가 다 체크되지 않았다면 공백으로 처리
if (checkedGood + checkedBad !== 3 && (goodChecks.length > 0 || badChecks.length > 0)) {
allFieldsFilled = false; // 모두 체크되지 않았다면 공백 표시
}
// 모든 필드가 채워지지 않았으면 공백으로 설정
if (!allFieldsFilled) {
$judgementCell.text('');
} else {
// 판정 업데이트
if (isValidThickness && isValidWidth && isValidHeight && isValidLength && isValidC && isValidSi && isValidMn && isValidP && isValidS && allGood && !anyBad) {
$judgementCell.text('적');
} else {
$judgementCell.text('부');
}
}
}
// 페이지 로드 시 초기 판단
updateJudgement();
// 체크박스 토글
$row.find('td').each(function() {
var $goodCheck = $(this).find('.check-good');
var $badCheck = $(this).find('.check-bad');
$goodCheck.on('change', function() {
if ($(this).is(':checked')) {
$badCheck.prop('checked', false);
}
updateJudgement();
updateFinalJudgement();
});
$badCheck.on('change', function() {
if ($(this).is(':checked')) {
$goodCheck.prop('checked', false);
}
updateJudgement();
updateFinalJudgement();
});
});
// input 값 변경 시 판정 업데이트
$row.find('input').on('input', updateJudgement);
$row.find('input').on('input', updateFinalJudgement);
});
// 최종 종합 판정 업데이트 함수
function updateFinalJudgement() {
var allPass = true;
var allJudged = true;
$('#mainTable tbody tr .judgement').each(function() {
var judgementText = $(this).text();
if (judgementText === '') {
allJudged = false;
}
if (judgementText === '부') {
allPass = false;
$(this).css('background-color', '#f8d7da');
} else {
$(this).css('background-color', '');
}
});
if (allJudged) {
if (allPass) {
$('#resultJudgement').val('합격');
} else {
$('#resultJudgement').val('불합격');
}
} else {
$('#resultJudgement').val('');
}
}
// 페이지 로드 시 최종 판정 업데이트
updateFinalJudgement();
});
</script>
<?php require_once $_SERVER['DOCUMENT_ROOT'] . '/' . $tablename . '/common/JS_instock.php'; ?> <!-- instock 후반부 공통 JS -->
</body>
</html>

1324
instock/i_recpipe.php Normal file

File diff suppressed because it is too large Load Diff

1019
instock/i_shaft.php Normal file

File diff suppressed because it is too large Load Diff

1174
instock/i_sillica.php Normal file

File diff suppressed because it is too large Load Diff

926
instock/i_slatcoil.php Normal file
View File

@@ -0,0 +1,926 @@
<?php
$tablename = 'instock';
?>
<?php include $_SERVER['DOCUMENT_ROOT'] . '/' . $tablename . '/common/head.php' ; ?> <!-- head 정보 불러오기 -->
<?php
$thickness = 1.55; // 두께 저장
$itemTitle = '전기 아연도금 강대 <br>
(KS D 3528, SECC) "EGI 슬랫코일"';
$width = 130; // 고정치수
// 추출한 너비와 길이로 $spec 값 설정
$spec = $thickness . ' * ' . $width ;
$today = date("Y-m-d");
require_once $_SERVER['DOCUMENT_ROOT'] . '/instock/commonDriveLoad.php'; // 구글드라이브 파일형태 이미지형태 읽어오기 모듈
$savetitle ='수입검사성적서';
?>
<?php include $_SERVER['DOCUMENT_ROOT'] . '/' . $tablename . '/common/instock_btn.php'; ?> <!-- Btn 정보 불러오기 -->
<div id="content-to-print">
<br>
<div class="container mt-3">
<div class="d-flex align-items-center justify-content-center m-1">
<table class="table " style="border-collapse: collapse;">
<thead>
<tr>
<th rowspan="3" class="text-center" style="width:70%;">
<div class="row">
<div class="col-sm-2">
<img src="../img/kdlogo.png" alt="경동기업" class="me-1" style="width:100%; height:auto;">
</div>
<div class="col-sm-10">
<div class="d-flex align-items-center justify-content-center m-1">
<span class="text-dark ms-1 me-1 fs-2" > &nbsp; 수 </span>
<span class="text-dark me-1 fs-2" > &nbsp; 입 </span>
<span class="text-dark me-1 fs-2" > &nbsp; 검 </span>
<span class="text-dark me-1 fs-2" > &nbsp; 사 </span>
<span class="text-dark me-1 fs-2" > &nbsp; </span>
<span class="text-dark me-1 fs-2" > &nbsp; 성 </span>
<span class="text-dark me-1 fs-2" > &nbsp; 적 </span>
<span class="text-dark me-1 fs-2" > &nbsp; 서 </span>
</div>
</div>
</div>
</th>
<th rowspan="3" class="text-center fw-bold" style="height:100px;">결 재</th>
<th class="text-center p-1" style="width : 100px; height:22px; padding:2px;">담당</th>
<th class="text-center p-1" style="width : 100px; height:22px; padding:2px;">부서장</th>
</tr>
<tr style="height:40px;">
<th class="text-center">
<div id="chargedDiv" style="display: none;">
<span id="orderman"> <?=$orderman?> </span> <br> <?=$indateStr ?>
</div>
</th>
<th class="text-center">
<div id="approvalDiv" style="display: none;">
<?=$user_name?> <br> <?=$todayStr ?>
</div>
</th>
</tr>
<tr>
<th colspan="2"> 입고일자 : <?=$inspection_date?></th>
</tr>
</thead>
</table>
</div>
<div class="d-flex align-items-center justify-content-center m-1">
<table class="table table-bordered" style="border-collapse: collapse;">
<tbody>
<tr>
<td class="text-center align-middle lightgray">품 명</td>
<td colspan="2" class="text-center fw-bold"><?=$itemTitle?></td>
<td class="text-center align-middle lightgray">납품업체<br>제조업체</td>
<td class="text-center text-primary fw-bold"><?=$supplier?> <br> (<?=$manufacturer?>) </td>
</tr>
<tr>
<td class="text-center align-middle lightgray">규 격<br>(두께*너비) </td>
<td colspan="2" class="text-center fw-bold"><?=$spec?></td>
<td class="text-center align-middle lightgray">로트번호</td>
<td colspan="1" class="text-center text-primary fw-bold">
<?=$lot_no?>
</td>
</tr>
<tr>
<td class="text-center align-middle lightgray">자재번호</td>
<td colspan="2" class="text-center fw-bold"><?=$material_no?></td>
<td class="text-center align-middle lightgray">검사일자</td>
<td colspan="1" class="text-center text-primary fw-bold">
<?=$indateStr?>
</td>
</tr>
<tr>
<td class="text-center align-middle lightgray">로트크기</td>
<td class="text-center text-dark fw-bold"><?=$received_qty?> </td>
<td class="text-center text-dark fw-bold"><?=$unit?> </td>
<td class="text-center align-middle lightgray">검사자</td>
<td class="text-center">
<div class="d-flex justify-content-center">
<button type="button" id="editButton" class="btn btn-primary btn-sm">검사자</button>
<div id="inputContainer" style="display: none;">
<input type="text" id="userNameInput" class="form-control d-inline-block noborder-input text-center" style="width:100px;" autocomplete="off" style="widtd: 100px;" value="<?=$user_name?>">
<button type="button" id="cancelButton" class="btn btn-outline-danger btn-sm"> <i class="bi bi-x"> </i> </button>
</div>
</div>
</td>
</tr>
<script>
$(document).ready(function() {
// '담당자 입력' 버튼 클릭 시 input 표시 및 버튼 숨김
$('#editButton').on('click', function() {
$('#editButton').hide();
$('#inputContainer').show();
$('#workdate').text('<?php echo $todayStr; ?>');
$('#chargedDiv').show();
});
// '취소' 버튼 클릭 시 원래 상태로 되돌림
$('#cancelButton').on('click', function() {
$('#inputContainer').hide();
$('#chargedDiv').hide();
$('#workdate').text('');
$('#editButton').show();
});
});
</script>
</tbody>
</table>
</div>
<div class="row justify-content-start m-1 mt-2">
<table id="mainTable" class="table table-hover" style="border-collapse: collapse;">
<thead>
<tr>
<th class="text-center align-middle" rowspan="2">NO</th>
<th class="text-center align-middle" rowspan="2" colspan="2">검사항목</th>
<th class="text-center align-middle" rowspan="2" colspan="2">검사기준</th>
<th class="text-center align-middle" rowspan="2">검사방식</th>
<th class="text-center align-middle" rowspan="2">검사주기</th>
<th class="text-center align-middle" colspan="3">측정치</th>
<th class="text-center align-middle" rowspan="2">판정 <br> (적/부)</th>
</tr>
<tr>
<th class="text-center">n1 <br> 양호/불량 </th>
<th class="text-center">n2 <br> 양호/불량 </th>
<th class="text-center">n3 <br> 양호/불량 </th>
</tr>
</thead>
<tbody>
<!-- 첫 번째 행 (겉모양) -->
<tr>
<td class="text-center align-middle">1</td>
<td class="text-center align-middle" colspan="2">겉모양</td>
<td class="text-center align-middle" colspan="2">사용상 해로울 <br> 결함이 없을 것</td>
<td class="text-center align-middle">육안검사</td>
<td class="text-center align-middle" rowspan="3">n = 3 <br>c = 0</td>
<td class="text-center align-middle">
<label>
<input type="checkbox" class="check-good"> OK
</label>
<label>
<input type="checkbox" class="check-bad"> NG
</label>
</td>
<td class="text-center align-middle">
<label>
<input type="checkbox" class="check-good"> OK
</label>
<label>
<input type="checkbox" class="check-bad"> NG
</label>
</td>
<td class="text-center align-middle">
<label>
<input type="checkbox" class="check-good"> OK
</label>
<label>
<input type="checkbox" class="check-bad"> NG
</label>
</td>
<td class="text-center align-middle judgement"></td>
</tr>
<?php
// 두께 범위에 맞는 체크된 사각형을 표시하는 함수
function renderCheckBox($min, $max, $value) {
if ($value >= $min && $value < $max) {
return '✅'; // 체크된 사각형
} else {
return '□'; // 빈 사각형
}
}
// 길이 범위에 맞는 체크된 사각형을 표시하는 함수
function renderLengthCheckBox($min, $max, $length) {
if ($length >= $min && $length < $max) {
return '✅'; // 체크된 사각형
} else {
return '□'; // 빈 사각형
}
}
?>
<!-- 두 번째 행 (치수) -->
<tr>
<td class="text-center align-middle" rowspan="2">2</td>
<td class="text-center align-middle" rowspan="2">치수</td>
<td class="text-center align-middle" rowspan="1">
두께
<input type="text" class="form-control text-center noborder-input inputItem" id="input_thickness" name="input_thickness" value="<?=$thickness?>" autocomplete="off">
</td>
<td class="text-center align-middle"> <?= renderCheckBox(1.25, 1.6, $thickness) ?> 1.25 이상 <br> ~ 1.6 미만</td>
<td class="text-center align-middle"> ± 0.10 </td>
<td class="text-center align-middle" rowspan="2">체크검사</td>
<td class="text-center align-middle" rowspan="1">
<input type="text" class="form-control text-center noborder-input inputItem" id="record_thickness1" name="record_thickness1" value="" autocomplete="off">
</td>
<td class="text-center align-middle" rowspan="1">
<input type="text" class="form-control text-center noborder-input inputItem" id="record_thickness2" name="record_thickness2" value="" autocomplete="off">
</td>
<td class="text-center align-middle" rowspan="1">
<input type="text" class="form-control text-center noborder-input inputItem" id="record_thickness3" name="record_thickness3" value="" autocomplete="off">
</td>
<td class="text-center align-middle judgement" rowspan="1"></td>
</tr>
<!-- 너비 검사 -->
<tr>
<td class="text-center align-middle" rowspan="1">
너비
<input type="text" class="form-control text-center noborder-input inputItem" id="input_width" name="input_width" value="<?=$width?>" autocomplete="off">
</td>
<td class="text-center align-middle"> ✅ 1250 미만</td>
<td class="text-center align-middle"> + 7 <br> - 0 </td>
<td class="text-center align-middle" rowspan="1">
<input type="text" class="form-control text-center noborder-input inputItem" id="record_widh1" name="record_widh1" value="" autocomplete="off">
</td>
<td class="text-center align-middle" rowspan="1">
<input type="text" class="form-control text-center noborder-input inputItem" id="record_widh2" name="record_widh2" value="" autocomplete="off">
</td>
<td class="text-center align-middle" rowspan="1">
<input type="text" class="form-control text-center noborder-input inputItem" id="record_widh3" name="record_widh3" value="" autocomplete="off">
</td>
<td class="text-center align-middle judgement"></td>
</tr>
<!-- 인장강도 -->
<tr>
<td class="text-center align-middle">3</td>
<td class="text-center align-middle" colspan="2">인장강도 (N/㎟)</td>
<td class="text-center align-middle" colspan="2">270 이상</td>
<td class="text-center align-middle" rowspan="3">공급업체 <br> 밀시트</td>
<td class="text-center align-middle" rowspan="3">입고시</td>
<td class="text-center align-middle" colspan="3">
<input type="text" class="form-control text-center noborder-input inputItem" id="tensile_strength" name="tensile_strength" autocomplete="off">
</td>
<td class="text-center align-middle judgement"></td>
</tr>
<!-- 연신율 -->
<tr>
<td class="text-center align-middle" rowspan="1">4</td>
<td class="text-center align-middle" colspan="2" rowspan="1">연신율 <br> %</td>
<!-- 두께 0.6 이상 ~ 1.0 미만 범위 체크 -->
<td class="text-center align-middle"><?= renderCheckBox(1.0, 1.6, $thickness) ?> 두께 1.0 이상 <br> ~ 1.6 미만</td>
<td class="text-center align-middle">37 이상</td>
<td class="text-center align-middle" rowspan="1" colspan="3">
<input type="text" class="form-control text-center noborder-input inputItem" id="elongation" name="elongation" autocomplete="off">
</td>
<td class="text-center align-middle judgement" rowspan="1"></td>
</tr>
<!-- 아연의 최소 부착량 -->
<tr>
<td class="text-center align-middle">5</td>
<td class="text-center align-middle" colspan="2">아연의 최소<br> 부착량 (g/㎡)</td>
<td class="text-center align-middle" colspan="2">한면 17 이상</td>
<td class="text-center align-middle" colspan="3" >
<input type="text" class="form-control text-center noborder-input inputItem" id="Zinc" name="Zinc" autocomplete="off">
</td>
<td class="text-center align-middle judgement" ></td>
</tr>
<!-- 종합판정 -->
<tr>
<td colspan="8" rowspan="4" class="text-center align-top">
<div class="text-start fw-bold mt-1">
<span># 1.55mm의 경우 KS F 4510에 따른 MIN 15의 기준에 따름</span><br>
<span># 두께의 경우 너비 1000 이상 ~ 1250 미만 기준에 따름</span>
<br><br>
<span>[부적합 내용]</span> <br>
<span>
<input type="text" class="form-control text-start inputItem noborder-input" id="input_memo" name="input_memo" autocomplete="off">
&nbsp;</span>
</div>
</td>
<td colspan="3" class="text-center align-middle yellowredBold">
<div class="d-flex justify-content-center align-items-center fw-bold">
<span class="text-dark">종합판정</span>
</div>
</td>
</tr>
<tr>
<td colspan="3" rowspan="3" class="text-center align-middle">
<div class="text-center fw-bold mt-3 fs-1 ">
<input type="text" class="form-control fs-2 text-center inputItem noborder-input" style="height:50px;" id="resultJudgement" name="resultJudgement" autocomplete="off">
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</form>
</div> <!-- end of container -->
<div class="container mb-5 mt-2">
<div class="d-flex align-items-center justify-content-center mb-5">
</div>
</div>
<!-- 페이지로딩 -->
<script>
$(document).ready(function(){
var loader = document.getElementById('loadingOverlay');
if(loader)
loader.style.display = 'none';
});
function generatePDF() {
var workplace = '<?php echo $title_message; ?>';
var deadline = '<?php echo $today; ?>';
var deadlineDate = new Date(deadline);
var formattedDate = "(" + String(deadlineDate.getFullYear()).slice(-2) + "." + ("0" + (deadlineDate.getMonth() + 1)).slice(-2) + "." + ("0" + deadlineDate.getDate()).slice(-2) + ")";
var result = 'KD' + workplace +'_' + formattedDate + '.pdf';
var element = document.getElementById('content-to-print');
var opt = {
margin: [10, 3, 12, 3], // Top, right, bottom, left margins
filename: result,
image: { type: 'jpeg', quality: 0.98 },
html2canvas: { scale: 1 },
jsPDF: { unit: 'mm', format: 'a4', orientation: 'portrait' },
pagebreak: { mode: [''] }
};
html2pdf().from(element).set(opt).save();
}
// 모달을 호출할 때 tr 요소를 저장하는 변수
var selectedRow;
$(document).on('click', '.saveData', function() {
saveData();
});
$(document).on('click', '.approvalBtn', function() {
// 승인자의 이름과 오늘 날짜 가져오기
const userName = '<?=$user_name?>'; // PHP로부터 가져온 사용자 이름
const todayStr = '<?=$todayStr?>'; // PHP로부터 가져온 오늘 날짜
// 승인 정보를 approvalDiv에 표시
$('#approvalDiv').html(
userName + '<br>' + todayStr +
' <i class="bi bi-x-circle remove-approval" style="cursor: pointer;"></i>'
);
$('#approvalDiv').show();
// 결재 정보를 업데이트하여 저장 로직에 반영
updateApprovalData(userName, todayStr);
saveData();
});
// 결재 정보 업데이트 함수
function updateApprovalData(userName, date) {
// 저장 로직을 위해 결재 정보 업데이트
let approvalData = {
writer: {
name: $('#orderman').text().trim(),
date: '<?=$indateStr?>'
},
reviewer: {
name: $('#reviewDiv').is(':visible') ? '<?=$user_name?>' : '',
date: '<?=$todayStr?>'
},
approver: {
name: userName,
date: date
}
};
// 저장할 JSON 데이터 업데이트
let formData = JSON.parse($('#iList').val() || '[]');
const approvalIndex = formData.findIndex(item => item.approval);
if (approvalIndex !== -1) {
formData[approvalIndex].approval = approvalData;
} else {
formData.push({ approval: approvalData });
}
// JSON 문자열로 다시 저장
$('#iList').val(JSON.stringify(formData));
}
// 결재 취소 기능
$(document).on('click', '.remove-approval', function() {
// 결재 정보를 지우고 화면에서 숨김
$('#approvalDiv').html('').hide();
// JSON 데이터에서 결재자의 정보 제거
let formData = JSON.parse($('#iList').val() || '[]');
const approvalIndex = formData.findIndex(item => item.approval);
if (approvalIndex !== -1) {
formData[approvalIndex].approval.approver.name = '';
formData[approvalIndex].approval.approver.date = '';
}
// JSON 문자열로 다시 저장
$('#iList').val(JSON.stringify(formData));
Toastify({
text: "결재 정보가 삭제되었습니다.",
duration: 2000,
close: true,
gravity: "top",
position: "center",
style: {
background: "linear-gradient(to right, #ff5f6d, #ffc371)"
},
}).showToast();
saveData();
});
function captureReturnKey(e) {
if(e.keyCode==13 && e.srcElement.type != 'textarea')
return false;
}
function recaptureReturnKey(e) {
if(e.keyCode==13 && e.srcElement.type != 'textarea')
return false;
}
// 삽입/수정하는 모듈
function saveData() {
// json 형태로 form문에 저장하기
let formData = [];
// 결재 부분 정보 저장
let approvalData = {
writer: {
name: $('#chargedDiv').is(':visible') ? '<?=$user_name?>' : '',
date: '<?=$indateStr?>'
},
approver: {
name: $('#approvalDiv').is(':visible') ? '<?=$user_name?>' : '',
date: '<?=$todayStr?>'
}
};
formData.push({ approval: approvalData });
// 검사자 정보 저장
let productionManager = $('#userNameInput').val();
formData.push({ productionManager: productionManager });
// 추가 정보 저장
formData.push({ num: $('#num').val() });
formData.push({ update_log: $('#update_log').val() });
formData.push({ memo: $('#memo').val() });
// Class 'inputItem' 값 저장
let inputItems = {};
$('.inputItem').each(function() {
let inputName = $(this).attr('name');
inputItems[inputName] = $(this).val();
});
formData.push({ inputItems: inputItems });
// 체크박스 상태 저장
let checkboxData = [];
$('#mainTable tbody tr').each(function(index) {
let rowCheckboxes = {
good: [],
bad: [],
judgement: $(this).find('.judgement').text()
};
$(this).find('.check-good').each(function() {
rowCheckboxes.good.push($(this).prop('checked'));
});
$(this).find('.check-bad').each(function() {
rowCheckboxes.bad.push($(this).prop('checked'));
});
checkboxData.push(rowCheckboxes);
});
formData.push({ checkboxData: checkboxData });
// JSON 문자열로 변환
let jsonString = JSON.stringify(formData);
// 숨겨진 필드에 JSON 데이터 설정
$('#iList').val(jsonString);
$("#overlay").show(); // 오버레이 표시
$("button").prop("disabled", true); // 모든 버튼 비활성화
// 폼데이터 전송시 사용함 Get form
var form = $('#board_form')[0];
var datasource = new FormData(form);
showMsgModal(2); // 파일저장중
$.ajax({
enctype: 'multipart/form-data',
processData: false,
contentType: false,
cache: false,
timeout: 600000,
url: "insert_iList.php",
type: "post",
data: datasource,
dataType: "json",
success: function(data) {
console.log(data);
setTimeout(function() {
Toastify({
text: "저장완료",
duration: 3000,
close: true,
gravity: "top",
position: "center",
style: {
background: "linear-gradient(to right, #00b09b, #96c93d)"
},
}).showToast();
saveAndClose(); //부모창 변경
hideMsgModal();
$("button").prop("disabled", false); // 모든 버튼 활성화
}, 1000);
$("#overlay").hide(); // 오버레이 숨김
},
error: function(jqxhr, status, error) {
console.log(jqxhr, status, error);
alert("An error occurred: " + error);
}
});
}
// 팝업 창에서 데이터 저장 및 닫기 함수
function saveAndClose() {
const updatedData = {
resultJudgement: $("#resultJudgement").val(),
// 필요한 다른 필드도 여기에 추가할 수 있습니다.
};
// 부모 창의 함수 호출
if (window.opener && typeof window.opener.closePopupAndUpdateRow === 'function') {
window.opener.closePopupAndUpdateRow(updatedData);
} else {
console.error("Parent window function not found");
}
// 팝업 창 닫기
// window.close();
}
// 초기값 불러오기
$(document).ready(function() {
console.log(iListData);
if (iListData.length > 0) {
// 결재 부분 정보
const approval = iListData.find(item => item.approval);
if (approval) {
if (approval.approval.writer.name && approval.approval.writer.date) {
$('#chargedDiv').show();
$('#chargedDiv').html(
approval.approval.writer.name + '<br>' + approval.approval.writer.date
);
} else {
$('#chargedDiv').hide().html('');
}
if (approval.approval.approver.name && approval.approval.approver.date) {
$('#approvalDiv').show();
$('#approvalDiv').html(
approval.approval.approver.name + '<br>' + approval.approval.approver.date +
' <i class="bi bi-x-circle remove-approval" style="cursor: pointer;"></i>'
);
} else {
$('#approvalDiv').hide().html('');
}
$('#workdate').text(approval.approval.writer.date);
}
// 검사자 정보
const productionManager = iListData.find(item => item.productionManager);
if (productionManager && productionManager.productionManager) {
$('#userNameInput').val(productionManager.productionManager).show();
$('#inputContainer').show();
$('#editButton').hide();
} else {
$('#userNameInput').val('');
$('#inputContainer').hide();
$('#editButton').show();
}
// inputItem 데이터 로드
const inputItems = iListData.find(item => item.inputItems);
if (inputItems && inputItems.inputItems) {
for (const [name, value] of Object.entries(inputItems.inputItems)) {
$(`.inputItem[name="${name}"]`).val(value);
}
}
// 체크박스 상태 로드
const checkboxData = iListData.find(item => item.checkboxData);
if (checkboxData && checkboxData.checkboxData) {
$('#mainTable tbody tr').each(function(index) {
const rowData = checkboxData.checkboxData[index];
if (rowData) {
$(this).find('.check-good').each(function(goodIndex) {
$(this).prop('checked', rowData.good[goodIndex]);
});
$(this).find('.check-bad').each(function(badIndex) {
$(this).prop('checked', rowData.bad[badIndex]);
});
$(this).find('.judgement').text(rowData.judgement);
}
});
}
}
});
// 첫번째 요소를 클릭하면 전체 로트번호 적용하기
$(document).ready(function() {
// id가 mainTable인 테이블의 첫 번째 td를 클릭했을 때 이벤트를 등록합니다.
$('#mainTable').on('click', 'td:first-child', function() {
// 클릭한 첫 번째 td의 형제인 두 번째 td 요소의 값을 가져옵니다.
var secondTdValue = $(this).siblings().find('input').val();
// id가 mainTable인 테이블에서 두 번째 td 요소에 해당 값을 적용합니다.
$('#mainTable tbody tr').each(function() {
$(this).find('td:nth-child(2) input').val(secondTdValue);
});
});
});
// 부트스트랩 툴팁
$(document).ready(function() {
var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]'));
var tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) {
return new bootstrap.Tooltip(tooltipTriggerEl);
});
});
</script>
<script>
$(document).ready(function() {
var thickness = <?= isset($thickness) ? $thickness : 'null' ?>;
var width = <?= isset($width) ? $width : 'null' ?>;
var tensile_strength = <?= isset($tensile_strength) ? $tensile_strength : 'null' ?>;
var elongation = <?= isset($elongation) ? $elongation : 'null' ?>;
var Zinc = <?= isset($Zinc) ? $Zinc : 'null' ?>;
$('#mainTable tbody tr').each(function() {
var $row = $(this);
var $judgementCell = $row.find('.judgement');
function updateJudgement() {
var isValidThickness = true;
var isValidWidth = true;
var isValidTensileStrength = true;
var isValidElongation = true;
var isValidZinc = true;
var allFieldsFilled = true; // 모든 필드가 채워졌는지 확인하는 플래그
// 두께 허용 범위 설정
var thicknessTolerance = 0.10;
// 두께 범위 비교
$row.find('input[name^="record_thickness"]').each(function() {
var value = parseFloat($(this).val());
if (isNaN(value)) {
allFieldsFilled = false; // 필드가 비어있다면 allFieldsFilled를 false로 설정
return false; // 채워지지 않은 필드가 있으면 판단 중단
}
var lowerLimit = thickness - thicknessTolerance;
var upperLimit = thickness + thicknessTolerance;
if (value < lowerLimit || value > upperLimit) {
isValidThickness = false;
}
});
// 너비 허용 범위는 +7 ~ 0
$row.find('input[name^="record_widh"]').each(function() {
var value = parseFloat($(this).val());
if (isNaN(value)) {
allFieldsFilled = false;
return false;
}
var lowerLimit = width;
var upperLimit = width + 7;
if (value < lowerLimit || value > upperLimit) {
isValidWidth = false;
}
});
// 인장강도 비교
$row.find('input[name="tensile_strength"]').each(function() {
var value = parseFloat($(this).val());
if (isNaN(value)) {
allFieldsFilled = false;
return false;
}
if (value < 270) {
isValidTensileStrength = false;
}
});
// 연신율 비교
$row.find('input[name="elongation"]').each(function() {
var value = parseFloat($(this).val());
if (isNaN(value)) {
allFieldsFilled = false;
return false;
}
if (thickness >= 1.0 && thickness < 1.6 && value < 37) {
isValidElongation = false;
}
});
// 아연 부착량 비교
$row.find('input[name="Zinc"]').each(function() {
var value = parseFloat($(this).val());
if (isNaN(value)) {
allFieldsFilled = false;
return false;
}
if (value < 17) {
isValidZinc = false;
}
});
// OK/NG 체크박스 상태 검사
var allGood = true;
var anyBad = false;
// 해당 행에 OK 체크박스가 있는지 확인
if ($row.find('.check-good').length > 0) {
$row.find('.check-good').each(function() {
// 체크박스가 undefined이거나 제대로 체크되지 않으면 필드가 채워지지 않은 것으로 판단
if (isNaN($(this).is(':checked'))) {
allFieldsFilled = false;
return false;
}
if (!$(this).is(':checked')) {
allGood = false;
}
});
}
// 해당 행에 NG 체크박스가 있는지 확인
if ($row.find('.check-bad').length > 0) {
$row.find('.check-bad').each(function() {
if (isNaN($(this).is(':checked'))) {
allFieldsFilled = false;
return false;
}
if ($(this).is(':checked')) {
anyBad = true;
}
});
}
// OK/NG 체크박스 상태 검사
var checkedGood = 0; // 체크된 OK 체크박스 수
var checkedBad = 0; // 체크된 NG 체크박스 수
// 각 열의 OK/NG 체크박스를 한 번만 확인하도록 변경
var goodChecks = $row.find('.check-good');
var badChecks = $row.find('.check-bad');
// 해당 행에 OK 체크박스가 있는지 확인
if (goodChecks.length > 0) {
goodChecks.each(function() {
if ($(this).is(':checked')) {
checkedGood++; // OK 체크박스가 체크되면 증가
}
});
}
// 해당 행에 NG 체크박스가 있는지 확인
if (badChecks.length > 0) {
badChecks.each(function() {
if ($(this).is(':checked')) {
checkedBad++; // NG 체크박스가 체크되면 증가
}
});
}
// 모든 체크박스가 다 체크되지 않았다면 공백으로 처리
if (checkedGood + checkedBad !== 3 && (goodChecks.length > 0 || badChecks.length > 0)) {
allFieldsFilled = false; // 모두 체크되지 않았다면 공백 표시
}
// 결과 출력
console.log('isValidThickness:', isValidThickness);
console.log('isValidWidth:', isValidWidth);
console.log('allGood:', allGood);
console.log('anyBad:', anyBad);
// 모든 필드가 채워지지 않았으면 공백으로 설정
if (!allFieldsFilled) {
$judgementCell.text('');
} else {
// 판정 업데이트
if (isValidThickness && isValidWidth && isValidTensileStrength && isValidElongation && isValidZinc && allGood && !anyBad) {
$judgementCell.text('적');
} else {
$judgementCell.text('부');
}
}
}
// 페이지 로드 시 초기 판단
updateJudgement();
// 체크박스 토글
$row.find('td').each(function() {
var $goodCheck = $(this).find('.check-good');
var $badCheck = $(this).find('.check-bad');
$goodCheck.on('change', function() {
if ($(this).is(':checked')) {
$badCheck.prop('checked', false);
}
updateJudgement();
updateFinalJudgement();
});
$badCheck.on('change', function() {
if ($(this).is(':checked')) {
$goodCheck.prop('checked', false);
}
updateJudgement();
updateFinalJudgement();
});
});
// input 값 변경 시 판정 업데이트
$row.find('input').on('input', updateJudgement);
$row.find('input').on('input', updateFinalJudgement);
});
// 최종 종합 판정 업데이트 함수
function updateFinalJudgement() {
var allPass = true;
var allJudged = true;
$('#mainTable tbody tr .judgement').each(function() {
var judgementText = $(this).text();
if (judgementText === '') {
allJudged = false;
}
if (judgementText === '부') {
allPass = false;
// '부'인 경우 해당 td의 배경색을 옅은 붉은 색으로 변경
$(this).css('background-color', '#f8d7da'); // 옅은 붉은 색
} else {
// '적'인 경우 배경색을 기본으로 설정
$(this).css('background-color', ''); // 기본 배경색 (없음)
}
});
if (allJudged) {
if (allPass) {
$('#resultJudgement').val('합격');
} else {
$('#resultJudgement').val('불합격');
}
} else {
$('#resultJudgement').val('');
}
console.log('allJudged', allJudged);
console.log('allPass', allPass);
}
// 페이지 로드 시 최종 판정 업데이트
updateFinalJudgement();
});
</script>
<?php require_once $_SERVER['DOCUMENT_ROOT'] . '/' . $tablename . '/common/JS_instock.php'; ?> <!-- instock 후반부 공통 JS -->
</body>
</html>

1176
instock/i_wire.php Normal file

File diff suppressed because it is too large Load Diff

1030
instock/i_wireDaehan.php Normal file

File diff suppressed because it is too large Load Diff

133
instock/insert.php Normal file
View File

@@ -0,0 +1,133 @@
<?php
require_once($_SERVER['DOCUMENT_ROOT'] . "/session.php");
$tablename = isset($_REQUEST['tablename']) ? $_REQUEST['tablename'] : '';
$mode = isset($_REQUEST['mode']) ? $_REQUEST['mode'] : '';
header("Content-Type: application/json"); // JSON 콘텐츠 유형 설정
require_once($_SERVER['DOCUMENT_ROOT'] . "/lib/mydb.php");
$pdo = db_connect();
include "_request.php";
// searchtag 생성
$searchtag = $lot_no . ' ' .
$inspection_date . ' ' .
$supplier . ' ' .
$item_name . ' ' .
$specification . ' ' .
$unit . ' ' .
$received_qty . ' ' .
$material_no . ' ' .
$manufacturer . ' ' .
$purchase_price_excl_vat . ' ' .
$weight_kg . ' ' .
$lotDone . ' ' .
$prodcode . ' ' .
$remarks;
if($lotDone == '')
$lotDone = NULL;
if ($mode == "update") {
$update_log = date("Y-m-d H:i:s") . " - " . $_SESSION["name"] . " " . $update_log . "&#10";
try {
$pdo->beginTransaction();
// SQL 쿼리 생성 (업데이트)
$sql = "UPDATE " . $DB . "." . $tablename . " SET ";
$sql .= "lot_no = ?, inspection_date = ?, supplier = ?, item_name = ?, specification = ?, unit = ?, received_qty = ?, material_no = ?, manufacturer = ?, remarks = ?, purchase_price_excl_vat = ?, weight_kg = ?, searchtag = ?, update_log = ?, lotDone = ?, prodcode = ? ";
$sql .= "WHERE num = ? LIMIT 1"; // num이 일치하는 하나의 레코드만 업데이트
$stmh = $pdo->prepare($sql);
// 변수 바인딩
$stmh->bindValue(1, $lot_no, PDO::PARAM_STR);
$stmh->bindValue(2, $inspection_date, PDO::PARAM_STR);
$stmh->bindValue(3, $supplier, PDO::PARAM_STR);
$stmh->bindValue(4, $item_name, PDO::PARAM_STR);
$stmh->bindValue(5, $specification, PDO::PARAM_STR);
$stmh->bindValue(6, $unit, PDO::PARAM_STR);
$stmh->bindValue(7, str_replace(',', '', $received_qty), PDO::PARAM_STR);
$stmh->bindValue(8, $material_no, PDO::PARAM_STR);
$stmh->bindValue(9, $manufacturer, PDO::PARAM_STR);
$stmh->bindValue(10, $remarks, PDO::PARAM_STR);
$stmh->bindValue(11, str_replace(',', '', $purchase_price_excl_vat), PDO::PARAM_STR);
$stmh->bindValue(12, str_replace(',', '', $weight_kg), PDO::PARAM_STR);
$stmh->bindValue(13, $searchtag, PDO::PARAM_STR);
$stmh->bindValue(14, $update_log, PDO::PARAM_STR);
$stmh->bindValue(15, $lotDone, PDO::PARAM_STR);
$stmh->bindValue(16, $prodcode, PDO::PARAM_STR);
$stmh->bindValue(17, $num, PDO::PARAM_INT);
// 실행
$stmh->execute();
$pdo->commit();
} catch (PDOException $Exception) {
$pdo->rollBack();
print "오류: " . $Exception->getMessage();
}
}
if ($mode == "insert" || $mode == "copy" || $mode == '' || $mode == null) { // 복사할때 추가
$update_log = date("Y-m-d H:i:s") . " - " . $_SESSION["name"] . " " . $update_log . "&#10";
// 데이터 삽입
try {
$pdo->beginTransaction();
// SQL 쿼리 생성 (삽입)
$sql = "INSERT INTO " . $DB . "." . $tablename . " (";
$sql .= "lot_no, inspection_date, supplier, item_name, specification, unit, received_qty, material_no, manufacturer, remarks, purchase_price_excl_vat, weight_kg, searchtag, update_log, lotDone, prodcode ";
$sql .= ") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
$stmh = $pdo->prepare($sql);
// 변수 바인딩
$stmh->bindValue(1, $lot_no, PDO::PARAM_STR);
$stmh->bindValue(2, $inspection_date, PDO::PARAM_STR);
$stmh->bindValue(3, $supplier, PDO::PARAM_STR);
$stmh->bindValue(4, $item_name, PDO::PARAM_STR);
$stmh->bindValue(5, $specification, PDO::PARAM_STR);
$stmh->bindValue(6, $unit, PDO::PARAM_STR);
$stmh->bindValue(7, str_replace(',', '', $received_qty), PDO::PARAM_STR);
$stmh->bindValue(8, $material_no, PDO::PARAM_STR);
$stmh->bindValue(9, $manufacturer, PDO::PARAM_STR);
$stmh->bindValue(10, $remarks, PDO::PARAM_STR);
$stmh->bindValue(11, str_replace(',', '', $purchase_price_excl_vat), PDO::PARAM_STR);
$stmh->bindValue(12, str_replace(',', '', $weight_kg), PDO::PARAM_STR);
$stmh->bindValue(13, $searchtag, PDO::PARAM_STR);
$stmh->bindValue(14, $update_log, PDO::PARAM_STR);
$stmh->bindValue(15, $lotDone, PDO::PARAM_STR);
$stmh->bindValue(16, $prodcode, PDO::PARAM_STR);
// 실행
$stmh->execute();
$pdo->commit();
} catch (PDOException $Exception) {
$pdo->rollBack();
print "오류: " . $Exception->getMessage();
}
}
if ($mode == "delete") { // 데이터 삭제
try {
$pdo->beginTransaction();
$sql = "UPDATE " . $DB . "." . $tablename . " SET is_deleted=1 WHERE num = ?";
$stmh = $pdo->prepare($sql);
$stmh->bindValue(1, $num, PDO::PARAM_INT);
$stmh->execute();
$pdo->commit();
} catch (PDOException $ex) {
$pdo->rollBack();
print "오류: ".$ex->getMessage();
}
}
$data = [
'num' => $num,
'mode' => $mode
];
echo json_encode($data, JSON_UNESCAPED_UNICODE);
?>

51
instock/insert_iList.php Normal file
View File

@@ -0,0 +1,51 @@
<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
require_once($_SERVER['DOCUMENT_ROOT'] . "/session.php");
header("Content-Type: application/json");
$mode = isset($_REQUEST['mode']) ? $_REQUEST['mode'] : '';
$num = isset($_REQUEST['num']) ? $_REQUEST['num'] : '';
$tablename = isset($_REQUEST['tablename']) ? $_REQUEST['tablename'] : '';
include '_request.php';
// json 형태는 저장할때 주의해야 한다.
if (isset($_POST['iList'])) {
$iList_jsondata = json_decode($_POST['iList'], true);
} else {
// Error handling or fallback
$iList_jsondata = null;
}
require_once($_SERVER['DOCUMENT_ROOT'] . "/lib/mydb.php");
$pdo = db_connect();
try {
// 자료수정
$update_log = date("Y-m-d H:i:s") . " - " . $_SESSION["name"] . " " . $update_log . "&#10";
$pdo->beginTransaction();
$sql = "UPDATE $DB.$tablename SET iList=?, update_log=? WHERE num=? LIMIT 1";
$stmh = $pdo->prepare($sql);
$stmh->bindValue(1, json_encode($iList_jsondata), PDO::PARAM_STR);
$stmh->bindValue(2, $update_log, PDO::PARAM_STR);
$stmh->bindValue(3, $num, PDO::PARAM_STR);
$stmh->execute();
$pdo->commit();
} catch (PDOException $Exception) {
error_log("오류: " . $Exception->getMessage());
}
$data = [
'num' => $num,
'is_deleted' => $is_deleted
];
echo json_encode($data, JSON_UNESCAPED_UNICODE);
?>

24
instock/instock_table.php Normal file
View File

@@ -0,0 +1,24 @@
<?php $grandTotal = 0; // 합계 초기화 ?>
<table class="table table-bordered table-sm">
<thead class="table-secondary">
<tr>
<th style="width:70%;" >납품업체</th>
<th style="width:30%;" class="text-end" >매입가 합계</th>
</tr>
</thead>
<tbody>
<?php foreach ($rows as $row): ?>
<tr>
<td><?= htmlspecialchars($row['supplier']) ?></td>
<td class="text-end"><?= number_format($row['total_amount']) ?></td>
</tr>
<?php $grandTotal += $row['total_amount']; ?>
<?php endforeach; ?>
</tbody>
<tfoot>
<tr>
<td class="text-center"><strong>합계</strong></td>
<td class="text-end"><strong><?= number_format($grandTotal) ?></strong></td>
</tr>
</tfoot>
</table>

753
instock/list.php Normal file
View File

@@ -0,0 +1,753 @@
<?php
require_once($_SERVER['DOCUMENT_ROOT'] . "/session.php");
if (!isset($_SESSION["level"]) || $_SESSION["level"] > 5) {
sleep(1);
header("Location:" . $WebSite . "login/login_form.php");
exit;
}
include $_SERVER['DOCUMENT_ROOT'] . '/load_header.php';
$title_message = '수입검사 관리대장';
// 품질담당자 및 관리자인 경우 권한 부여
$QCadmin = 0 ;
if($user_name=='이세희' || $user_name=='개발자' || $user_name=='함신옥' || $user_name=='노완호' )
$QCadmin = 1 ;
?>
<link href="css/style.css" rel="stylesheet">
<title> <?=$title_message?> </title>
</head>
<body>
<?php
$header = isset($_REQUEST['header']) ? $_REQUEST['header'] : '';
if($header ==='header')
require_once($_SERVER['DOCUMENT_ROOT'] . '/myheader.php');
require_once($_SERVER['DOCUMENT_ROOT'] . "/lib/mydb.php");
$pdo = db_connect();
function checkNull($strtmp) {
return ($strtmp !== null && trim($strtmp) !== '');
}
$search = isset($_REQUEST['search']) ? $_REQUEST['search'] : '';
$mode = isset($_REQUEST["mode"]) ? $_REQUEST["mode"] : '';
$fromdate = isset($_REQUEST['fromdate']) ? $_REQUEST['fromdate'] : '';
$todate = isset($_REQUEST['todate']) ? $_REQUEST['todate'] : '';
$tablename = 'instock';
// `instock` 테이블에서 `item_name` 컬럼 값 가져오기
$sql = "SELECT item_name FROM {$DB}.{$tablename} WHERE is_deleted IS NULL";
try {
$stmh = $pdo->query($sql);
$itemNames = $stmh->fetchAll(PDO::FETCH_COLUMN, 0); // item_name 컬럼의 값을 배열로 저장
// 중복 제거
$uniqueItemNames = array_unique($itemNames);
// 결과 출력 (예: 배열 확인용)
// print_r($uniqueItemNames);
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
// 현재 날짜
$currentDate = date("Y-m-d");
// fromdate 또는 todate가 빈 문자열이거나 null인 경우 기본 날짜 설정
if ($fromdate === "" || $fromdate === null || $todate === "" || $todate === null) {
$fromdate = date("Y-m-d", strtotime("-32 weeks", strtotime($currentDate))); // 16주 전
$todate = date("Y-m-d", strtotime("+3 months", strtotime($currentDate))); // 3개월 후
$Transtodate = $todate;
} else {
$Transtodate = $todate; // 설정된 기간
}
$SettingDate = "inspection_date"; // 정렬 기준 날짜
$order = " ORDER BY inspection_date DESC, lot_no asc ";
if(checkNull($search)) {
$sql = "SELECT * FROM {$DB}.{$tablename}
WHERE inspection_date BETWEEN date('$fromdate') AND date('$Transtodate') AND searchtag LIKE '%$search%' AND is_deleted IS NULL " . $order;
} else {
$sql = "SELECT * FROM ".$DB.".".$tablename . " WHERE inspection_date BETWEEN date('$fromdate') AND date('$Transtodate') AND is_deleted IS NULL " . $order;
}
try {
$stmh = $pdo->query($sql);
$total_row = $stmh->rowCount();
?>
<form id="board_form" name="board_form" method="post" enctype="multipart/form-data">
<input type="hidden" id="mode" name="mode" value="<?=$mode?>">
<input type="hidden" id="num" name="num">
<input type="hidden" id="tablename" name="tablename" value="<?=$tablename?>">
<input type="hidden" id="header" name="header" value="<?=$header?>">
<input type="hidden" id="QCadmin" name="QCadmin" value="<?=$QCadmin?>">
<div class="container-fluid">
<!-- Modal -->
<div id="myModal" class="modal">
<div class="modal-content" style="width:850px;">
<div class="modal-header">
<span class="modal-title">수입검사</span>
<span class="close">&times;</span>
</div>
<div class="modal-body">
<div class="custom-card"></div>
</div>
</div>
</div>
</div>
<?php
if ($header == 'header') {
print '<div class="container-fluid">';
print '<div class="card justify-content-center text-center mt-1">';
} else {
print '<div class="container">';
print '<div class="card justify-content-center text-center mt-5">';
}
?>
<div class="card-header">
<div class="d-flex p-1 m-1 mt-1 justify-content-center align-items-center ">
<h5> <?=$title_message?> </h5> &nbsp;&nbsp;&nbsp;&nbsp;
<button type="button" class="btn btn-dark btn-sm " onclick='location.reload();' > <i class="bi bi-arrow-clockwise"></i> </button>
</div>
<?php
// 서버에 저장된 로트번호 불러오기
$filepath = $_SERVER['DOCUMENT_ROOT'] . '/instock/lotnum.txt';
if (file_exists($filepath)) {
// 파일에서 로트번호 읽기
$receivedlotNum = file_get_contents($filepath);
} else {
$receivedlotNum = '로트번호가 없습니다.'; // 파일이 없을 경우 기본 메시지
}
?>
<div class="d-flex p-1 m-1 mt-2 mb-1 justify-content-center align-items-center ">
<span class="text-secondary"> 신규 작성시 로트번호는 년도(2자리) + 월(2자리) + 일(2자리) - 일련번호 형태로 초기 생성, 예시) 241128-01 </span>
<span class="badge bg-primary ms-3"> 서버 생성완료 : <?=$receivedlotNum?> </span>
</div>
</div>
<div class="card-body">
<div class="container mt-2 mb-2">
<div class="row">
<div class="d-flex p-1 m-1 mt-1 mb-1 justify-content-center align-items-center">
▷ <?= $total_row ?> &nbsp;
<button type="button" id="premonth" class="btn btn-dark btn-sm me-1 " onclick='yesterday()' > 전일 </button>
<button type="button" class="btn btn-outline-dark btn-sm me-1 " onclick='this_today()' > 금일 </button>
<button type="button" class="btn btn-dark btn-sm me-1 " onclick='this_tomorrow()' > 익일 </button>
<input type="date" id="fromdate" name="fromdate" class="form-control" style="width:100px;" value="<?=$fromdate?>" > &nbsp; ~ &nbsp;
<input type="date" id="todate" name="todate" class="form-control me-1" style="width:100px;" value="<?=$todate?>" > &nbsp;
<div class="inputWrap">
<input type="text" id="search" name="search" value="<?=$search?>" onkeydown="JavaScript:SearchEnter();" autocomplete="off" class="form-control" style="width:150px;" > &nbsp;
<button class="btnClear"></button>
</div>
<div id="autocomplete-list">
</div>
&nbsp;
<button id="searchBtn" type="button" class="btn btn-dark btn-sm" > <i class="bi bi-search"></i> 검색 </button>
<button id="newBtn" type="button" class="btn btn-dark btn-sm ms-2 me-2"> <i class="bi bi-pencil-square"></i> 신규 </button>
<?php if($user_name=='개발자') { ?>
<button id="uploadBtn" type="button" class="btn btn-dark btn-sm me-2"> <i class="bi bi-box-arrow-up"></i> 업로드 </button>
<?php } ?>
</div>
</div>
</div>
<div class="table-responsive">
<table class="table table-hover" id="myTable">
<thead class="table-primary">
<th class="text-center" style="width:50px;" >번호</th>
<th class="text-center" style="width:90px;" >로트번호</th>
<th class="text-center" style="width:60px;" >판정</th>
<th class="text-center" style="width:60px;" >성적서</th>
<th class="text-center" style="width:60px;" >소진</th>
<th class="text-center" style="width:100px;">품목코드</th>
<th class="text-center" style="width:80px;" >검사일</th>
<th class="text-center" style="width:80px;" >납품업체</th>
<th class="text-center" style="width:200px;" >품목명</th>
<th class="text-center" style="width:200px;" >규격</th>
<th class="text-center" style="width:40px;" > 단위</th>
<th class="text-center" style="width:50px;" >입고량</th>
<th class="text-center" style="width:120px;" >자재번호</th>
<th class="text-center" style="width:120px;" >제조사</th>
<th class="text-center" style="width:100px;" >비고</th>
<th class="text-center" style="width:90px;" >매입가 <br>(VAT별도)</th>
<th class="text-center" style="width:80px;" >중량(KG)</th>
</thead>
<tbody>
<?php
$start_num = $total_row;
while($row = $stmh->fetch(PDO::FETCH_ASSOC)) {
include '_row.php';
$specification_clean = preg_replace('/\s+/', ' ', $specification); // 연속된 공백을 하나의 공백으로 변경
$remarks_clean = preg_replace('/\s+/', ' ', $remarks); // 연속된 공백을 하나의 공백으로 변경
// JSON을 배열로 디코딩
$iListArray = json_decode($iList, true);
// resultJudgement 값을 찾기 위한 루프
$resultJudgement = null;
foreach ($iListArray as $item) {
// 배열에서 inputItems를 가진 항목이 있는지 확
if (isset($item['inputItems']['resultJudgement'])) {
$resultJudgement = $item['inputItems']['resultJudgement'];
break; // 값을 찾으면 루프 종료
}
}
?>
<tr data-num="<?= $row['num'] ?>"
data-itemname="<?= htmlspecialchars($row['item_name']) ?>"
data-specification="<?= htmlspecialchars($row['specification']) ?>"
data-remarks="<?= htmlspecialchars($row['remarks']) ?>">
<td class="text-center" onclick="loadForm('update', '<?=$row['num']?>');"><?= $start_num ?></td>
<td class="text-center fw-bold text-success" onclick="loadForm('update', '<?=$row['num']?>');"><?= $row['lot_no'] ?></td>
<?php
$class = ($resultJudgement === '합격') ? 'text-dark' : 'text-danger';
?>
<td class="text-center fw-bold <?= $class ?>" onclick="loadForm('update', '<?=$row['num']?>');"><?= $resultJudgement ?></td>
<td class="text-center view-import-inspection">
<span class="badge bg-secondary">성적서</span>
</td>
<td class="text-center" onclick="loadForm('update', '<?=$row['num']?>');"><?= $row['lotDone'] ?></td>
<td class="text-center" style="word-nowrap: break-word;" onclick="loadForm('update', '<?=$row['num']?>');"><?= $row['prodcode'] ?></td>
<td class="text-center" onclick="loadForm('update', '<?=$row['num']?>');"><?= $row['inspection_date'] ?></td>
<td class="text-center" onclick="loadForm('update', '<?=$row['num']?>');"><?= $row['supplier'] ?></td>
<td class="text-start fw-bold text-primary" onclick="loadForm('update', '<?=$row['num']?>');"><?= $row['item_name'] ?></td>
<td class="text-start text-secondary" onclick="loadForm('update', '<?=$row['num']?>');"><?= $row['specification'] ?></td>
<td class="text-center fw-bold text-secondary" onclick="loadForm('update', '<?=$row['num']?>');"><?= $row['unit'] ?></td>
<td class="text-end fw-bold text-primary" onclick="loadForm('update', '<?=$row['num']?>');">
<?php if (is_numeric($row['received_qty'])) : ?>
<?= number_format($row['received_qty']) ?>
<?php else : ?>
<?= htmlspecialchars($row['received_qty']) ?>
<?php endif; ?>
</td>
<td class="text-start fw-bold text-secondary" onclick="loadForm('update', '<?=$row['num']?>');"><?= $row['material_no'] ?></td>
<td class="text-center" onclick="loadForm('update', '<?=$row['num']?>');"><?= $row['manufacturer'] ?></td>
<td class="text-start" onclick="loadForm('update', '<?=$row['num']?>');"><?= $row['remarks'] ?></td>
<td class="text-end" onclick="loadForm('update', '<?=$row['num']?>');">
<?= is_numeric($row['purchase_price_excl_vat']) ? number_format($row['purchase_price_excl_vat']) : '' ?>
</td>
<?php
$weight_kg = $row['weight_kg'];
$weight_kg = str_replace(',', '', $weight_kg);
if (is_numeric($weight_kg) && $weight_kg != '' && $weight_kg != '0') {
$weight_kg = number_format((float)$weight_kg);
}
?>
<td class="text-end" onclick="loadForm('update', '<?=$row['num']?>');"><?= $weight_kg ?></td>
</tr>
<?php
$start_num--;
}
} catch (PDOException $Exception) {
print "오류: ".$Exception->getMessage();
}
?>
</tbody>
</table>
</div>
</div>
</div>
</form>
<script>
var ajaxRequest = null;
var itemData = [];
var lotnumData = [];
function loadForm(mode, num = null) {
if (num == null) {
$("#mode").val('insert');
} else {
$("#mode").val('update');
$("#num").val(num);
}
if(mode =='copy')
$("#mode").val(mode);
$.ajax({
type: "POST",
url: "fetch_inspection.php",
data: { mode: mode, num: num },
dataType: "html",
success: function(response) {
document.querySelector(".modal-body .custom-card").innerHTML = response;
$("#myModal").show();
// '직접입력' 선택 시 모달 띄우기
$('#supplier').on('change', function () {
if ($(this).val() === 'direct') {
$('#supplierModal').modal('show'); // 모달 띄우기
}
});
// 모달에서 입력된 값 추가
$('#addSupplierBtn').on('click', function () {
const newSupplier = $('#newSupplierInput').val().trim(); // 입력 값
if (newSupplier) {
// '선택' 옵션 이전에 새 옵션 추가
$('#supplier option[value=""]').after(`<option value="${newSupplier}" selected>${newSupplier}</option>`);
$('#supplier').val(newSupplier); // 새로 추가된 값 선택
$('#supplierModal').modal('hide'); // 모달 닫기
} else {
alert('값을 입력해주세요.');
}
});
// 제조사 - '직접입력' 선택 시 모달 띄우기
$('#manufacturer').on('change', function () {
if ($(this).val() === 'direct') {
$('#manufacturerModal').modal('show'); // 모달 띄우기
}
});
// 모달에서 입력된 값 추가 (제조사)
$('#addManufacturerBtn').on('click', function () {
const newManufacturer = $('#newManufacturerInput').val().trim(); // 입력 값
if (newManufacturer) {
$('#manufacturer option[value=""]').after(`<option value="${newManufacturer}" selected>${newManufacturer}</option>`);
$('#manufacturer').val(newManufacturer); // 새로 추가된 값 선택
$('#manufacturerModal').modal('hide'); // 모달 닫기
} else {
alert('값을 입력해주세요.');
}
});
// 단위 - '직접입력' 선택 시 모달 띄우기
$('#unit').on('change', function () {
if ($(this).val() === 'direct') {
$('#unitModal').modal('show'); // 모달 띄우기
}
});
// 모달에서 입력된 값 추가 (단위)
$('#addUnitBtn').on('click', function () {
const newUnit = $('#newUnitInput').val().trim(); // 입력 값
if (newUnit) {
$('#unit option[value=""]').after(`<option value="${newUnit}" selected>${newUnit}</option>`);
$('#unit').val(newUnit); // 새로 추가된 값 선택
$('#unitModal').modal('hide'); // 모달 닫기
} else {
alert('값을 입력해주세요.');
}
});
$(document).on('change', '#item_name', function () {
const selectedItem = $(this).val();
const specification = $("#specification").val();
console.log('selectedItem :', selectedItem);
console.log('specification :', specification);
if (!selectedItem) {
$('#specification').html('<option value="">선택</option>').prop('disabled', true);
$('#prodcode').val('');
return;
}
// 규격 목록 가져오기
$.ajax({
type: 'POST',
url: 'fetch_code.php',
data: { mode: 'fetch_specifications', item_name: selectedItem },
dataType: 'json',
success: function (response) {
console.log(response);
if (!response.success) {
console.error(response.error);
return;
}
let options = '<option value="">선택</option>';
// 중복 제거 및 오름차순 정렬
const uniqueSortedData = [...new Set(response.data)].sort();
uniqueSortedData.forEach(spec => {
options += `<option value="${spec}">${spec}</option>`;
});
$('#specification').html(options).prop('disabled', false); // 규격 Select 업데이트
},
error: function (jqxhr, status, error) {
console.error('AJAX Error:', status, error);
}
});
});
$(document).on('change', '#specification', function () {
const selectedItem = $('#item_name').val();
const selectedSpec = $(this).val();
if (!selectedItem || !selectedSpec) {
$('#prodcode').val('');
return;
}
// 품목코드 업데이트
const prodcode = `${selectedItem}-${selectedSpec}`;
$('#prodcode').val(prodcode); // 품목코드 필드에 값 설정
});
$("#closeBtn").on("click", function() {
$("#myModal").hide();
});
$(document).on('click', '.specialbtnClear', function(e) {
e.preventDefault();
$(this).siblings('input').val('').focus();
$('#item_name').val('');
$('#material_no').val('');
});
$(document).on('click', '.btnClear_lot', function(e) {
e.preventDefault();
$(this).siblings('input').val('').focus();
$('#lot_no').val('');
});
$(document).on('input', '.inputcode ', function() {
initializeAutocomplete(this);
});
$(document).on('input', '.inputitemname ', function() {
initializeAutocomplete(this);
});
$(document).on('input', '.inputlot ', function() {
initializeAutocomplete(this);
});
$(document).off("click", "#viewinspection").on("click", "#viewinspection", function(event) {
// 버튼의 data 속성에서 값을 직접 가져옵니다.
var num = $(this).data('num');
var itemname = $(this).data('itemname');
var spec = $(this).data('specification');
var remarks = $(this).data('remarks');
// 클릭 이벤트 전파 방지
event.stopPropagation();
// viewBoardInstock 함수 호출
viewBoardInstock(num, itemname, spec, remarks);
});
let isSaving = false;
$("#saveBtn").on("click", function() {
const myform = document.getElementById('board_form');
const inputs = myform.querySelectorAll('input[required], select[required]'); // input, select 요소 중 required 속성 있는 것 선택
let allValid = true;
// console.log(inputs);
inputs.forEach(input => {
if (!input.value) {
allValid = false;
Toastify({
text: "필수입력 부분을 확인해 주세요.",
duration: 2000,
close:true,
gravity:"top",
position: "center",
style: {
background: "linear-gradient(to right, #00b09b, #96c93d)"
},
}).showToast();
return
}
});
if(!allValid )
return
if (isSaving) return;
isSaving = true;
let header = $("#header").val();
let formData = $("#board_form").serialize();
let continuousRegistration = $("#continuous_registration").is(':checked');
// 로트 번호 생성
let lot_no = $("#lot_no").val();
// 서버에 데이터 저장
$.ajax({
url: "save_lotnum.php", // 파일 저장 PHP
type: "post",
data: { lot_no: lot_no },
success: function(response) {
if (response.status === 'success') {
console.log("Data saved successfully:", response.message);
} else {
console.error("Error saving data:", response.message);
}
// 기존 저장 로직 실행
$.ajax({
url: "insert.php",
type: "post",
data: formData,
success: function(response) {
Toastify({
text: "저장완료",
duration: 3000,
close: true,
gravity: "top",
position: "center",
backgroundColor: "#4fbe87",
}).showToast();
if (!continuousRegistration) {
$("#myModal").hide();
location.reload();
} else {
$("#mode").val('insert');
$("#num").val('');
isSaving = false;
}
},
error: function(jqxhr, status, error) {
console.log(jqxhr, status, error);
isSaving = false;
}
});
},
error: function(jqxhr, status, error) {
console.log("File save error:", jqxhr, status, error);
isSaving = false;
}
});
});
$("#copyBtn").on("click", function() {
const num = $("#num").val();
$("#myModal").modal('hide');
loadForm('copy', num);
});
$("#deleteBtn").on("click", function() {
var QCadmin = $("#QCadmin").val() ;
if (QCadmin !== '1') {
Swal.fire({
title: '삭제불가',
text: "관리자만 삭제 가능합니다.",
icon: 'error',
confirmButtonText: '확인'
});
return;
}
Swal.fire({
title: '자료 삭제',
text: "삭제는 신중! 정말 삭제하시겠습니까?",
icon: 'warning',
showCancelButton: true,
confirmButtonColor: '#3085d6',
cancelButtonColor: '#d33',
confirmButtonText: '삭제',
cancelButtonText: '취소'
}).then((result) => {
if (result.isConfirmed) {
$("#mode").val('delete');
var formData = $("#board_form").serialize();
$.ajax({
url: "insert.php",
type: "post",
data: formData,
success: function(response) {
Toastify({
text: "파일 삭제완료",
duration: 2000,
close: true,
gravity: "top",
position: "center",
style: {
background: "linear-gradient(to right, #00b09b, #96c93d)"
},
}).showToast();
$("#myModal").hide();
location.reload();
},
error: function(jqxhr, status, error) {
console.log(jqxhr, status, error);
}
});
}
});
});
},
error: function(jqxhr, status, error) {
console.log("AJAX Error: ", status, error);
}
});
}
</script>
<script>
var ajaxRequest_write = null;
var dataTable;
var material_regpageNumber;
$(document).ready(function() {
dataTable = $('#myTable').DataTable({
"paging": true,
"ordering": true,
"searching": true,
"pageLength": 30,
"lengthMenu": [ 30,50, 100, 200, 500, 1000],
"language": {
"lengthMenu": "Show _MENU_ entries",
"search": "Live Search:"
},
"order": [[1, 'desc']],
"dom": 't<"bottom"ip>'
});
var savedPageNumber = getCookie('material_regpageNumber');
if (savedPageNumber) {
dataTable.page(parseInt(savedPageNumber) - 1).draw(false);
}
dataTable.on('page.dt', function() {
var material_regpageNumber = dataTable.page.info().page + 1;
setCookie('material_regpageNumber', material_regpageNumber, 10);
});
$('#myTable_length select').on('change', function() {
var selectedValue = $(this).val();
dataTable.page.len(selectedValue).draw();
savedPageNumber = getCookie('material_regpageNumber');
if (savedPageNumber) {
dataTable.page(parseInt(savedPageNumber) - 1).draw(false);
}
});
$(document).on('click', '.specialbtnClear', function(e) {
e.preventDefault();
$(this).siblings('input').val('').focus();
});
$(document).on('click', '.btnClear_lot', function(e) {
e.preventDefault();
$(this).siblings('input').val('').focus();
});
});
function restorePageNumber() {
var savedPageNumber = getCookie('material_regpageNumber');
location.reload(true);
}
</script>
<script>
$(document).ready(function(){
var loader = document.getElementById('loadingOverlay');
if(loader)
loader.style.display = 'none';
var modal = document.getElementById("myModal");
var span = document.getElementsByClassName("close")[0];
span.onclick = function() {
modal.style.display = "none";
}
$(".close").on("click", function() {
$("#myModal").hide();
});
$("#newBtn").on("click", function() {
loadForm('insert');
});
$("#searchBtn").on("click", function() {
$("#board_form").submit();
});
$("#closeBtn").on("click", function() {
var modal = document.getElementById("myModal");
modal.style.display = "none";
});
// upload
$("#uploadBtn").on("click", function() {
popupCenter('uploadgrid.php' , '업로드', 1800, 800);
});
$(document).off("click", ".view-import-inspection").on("click", ".view-import-inspection", function(event) {
// 부모 <tr> 요소의 data 속성에서 값을 가져옵니다.
var row = $(this).closest('tr');
var num = row.data('num');
var itemname = row.data('itemname');
var spec = row.data('specification');
var remarks = row.data('remarks');
// 클릭 이벤트 전파 방지
event.stopPropagation();
// viewBoardInstock 함수 호출
viewBoardInstock(num, itemname, spec, remarks);
});
});
function enter() {
$("#board_form").submit();
}
function inputNumberFormat(obj) {
obj.value = obj.value.replace(/[^0-9]/g, '');
let value = obj.value.replace(/,/g, '');
obj.value = value.replace(/\B(?=(\d{3})+(?!\d))/g, ',');
}
$(document).on("keypress", "input", function(event) {
return event.keyCode != 13;
});
$(document).ready(function(){
// 방문기록 남김
saveMenuLog('수입검사 관리대장');
});
</script>
<?php require_once $_SERVER['DOCUMENT_ROOT'] . '/instock/common/viewJS.php'; ?> <!--공통 JS -->
</body>
</html>

366
instock/list_sheet.php Normal file
View File

@@ -0,0 +1,366 @@
<?php
require_once($_SERVER['DOCUMENT_ROOT'] . "/session.php");
if (!isset($_SESSION["level"]) || $_SESSION["level"] > 5) {
sleep(1);
header("Location:" . $WebSite . "login/login_form.php");
exit;
}
include $_SERVER['DOCUMENT_ROOT'] . '/load_header.php';
$title_message = '수입검사 성적서';
?>
<link href="css/style.css" rel="stylesheet">
<title> <?=$title_message?> </title>
</head>
<body>
<?php
$header = isset($_REQUEST['header']) ? $_REQUEST['header'] : '';
if($header ==='header')
require_once($_SERVER['DOCUMENT_ROOT'] . '/myheader.php');
function checkNull($strtmp) {
return ($strtmp !== null && trim($strtmp) !== '');
}
$search = isset($_REQUEST['search']) ? $_REQUEST['search'] : '';
$mode = isset($_REQUEST["mode"]) ? $_REQUEST["mode"] : '';
$fromdate = isset($_REQUEST['fromdate']) ? $_REQUEST['fromdate'] : '';
$todate = isset($_REQUEST['todate']) ? $_REQUEST['todate'] : '';
$tablename = 'instock';
// 현재 날짜
$currentDate = date("Y-m-d");
// fromdate 또는 todate가 빈 문자열이거나 null인 경우 기본 날짜 설정
if ($fromdate === "" || $fromdate === null || $todate === "" || $todate === null) {
$fromdate = date("Y-m-d", strtotime("-32 weeks", strtotime($currentDate))); // 16주 전
$todate = date("Y-m-d", strtotime("+3 months", strtotime($currentDate))); // 3개월 후
$Transtodate = $todate;
} else {
$Transtodate = $todate; // 설정된 기간
}
$SettingDate = "inspection_date"; // 정렬 기준 날짜
require_once($_SERVER['DOCUMENT_ROOT'] . "/lib/mydb.php");
$pdo = db_connect();
$order = " ORDER BY inspection_date DESC, lot_no asc ";
if (checkNull($search)) {
$sql = "SELECT * FROM ".$DB.".".$tablename."
WHERE inspection_date BETWEEN date('$fromdate') AND date('$Transtodate') AND searchtag LIKE '%$search%' AND is_deleted IS NULL " . $order;
} else {
$sql = "SELECT * FROM ".$DB.".".$tablename . " WHERE inspection_date BETWEEN date('$fromdate') AND date('$Transtodate') AND is_deleted IS NULL " . $order;
}
try {
$stmh = $pdo->query($sql);
$total_row = $stmh->rowCount();
?>
<form id="board_form" name="board_form" method="post" enctype="multipart/form-data">
<input type="hidden" id="mode" name="mode" value="<?=$mode?>">
<input type="hidden" id="num" name="num">
<input type="hidden" id="tablename" name="tablename" value="<?=$tablename?>">
<input type="hidden" id="header" name="header" value="<?=$header?>">
<div class="container-fluid">
<!-- Modal -->
<div id="myModal" class="modal">
<div class="modal-content" style="width:850px;">
<div class="modal-header">
<span class="modal-title">수입검사</span>
<span class="close">&times;</span>
</div>
<div class="modal-body">
<div class="custom-card"></div>
</div>
</div>
</div>
</div>
<?php
if ($header == 'header') {
print '<div class="container-fluid">';
print '<div class="card justify-content-center text-center mt-1">';
} else {
print '<div class="container">';
print '<div class="card justify-content-center text-center mt-5">';
}
?>
<div class="card-header">
<div class="d-flex p-1 m-1 mt-1 justify-content-center align-items-center ">
<h5> <?=$title_message?> </h5> &nbsp;&nbsp;&nbsp;&nbsp;
<button type="button" class="btn btn-dark btn-sm " onclick='location.reload();' > <i class="bi bi-arrow-clockwise"></i> </button>
</div>
</div>
<div class="card-body">
<div class="container mt-2 mb-2">
<div class="row">
<div class="d-flex p-1 m-1 mt-1 mb-1 justify-content-center align-items-center">
▷ <?= $total_row ?> &nbsp;
<button type="button" id="premonth" class="btn btn-dark btn-sm me-1 " onclick='yesterday()' > 전일 </button>
<button type="button" class="btn btn-outline-dark btn-sm me-1 " onclick='this_today()' > 금일 </button>
<button type="button" class="btn btn-dark btn-sm me-1 " onclick='this_tomorrow()' > 익일 </button>
<input type="date" id="fromdate" name="fromdate" class="form-control" style="width:100px;" value="<?=$fromdate?>" > &nbsp; ~ &nbsp;
<input type="date" id="todate" name="todate" class="form-control me-1" style="width:100px;" value="<?=$todate?>" > &nbsp;
<div class="inputWrap">
<input type="text" id="search" name="search" value="<?=$search?>" onkeydown="JavaScript:SearchEnter();" autocomplete="off" class="form-control" style="width:150px;" > &nbsp;
<button class="btnClear"></button>
</div>
<div id="autocomplete-list">
</div>
&nbsp;
<button id="searchBtn" type="button" class="btn btn-dark btn-sm" > <i class="bi bi-search"></i> 검색 </button>
</div>
</div>
</div>
<div class="table-responsive">
<table class="table table-hover" id="myTable">
<thead class="table-primary">
<th class="text-center" style="width:60px;" >번호</th>
<th class="text-center" style="width:120px;" >로트번호</th>
<th class="text-center" style="width:80px;" >판정</th>
<th class="text-center" style="width:80px;" >소진여부</th>
<th class="text-center" style="width:80px;" >검사일</th>
<th class="text-center" style="width:80px;" >납품업체</th>
<th class="text-center" style="width:200px;" >품목명</th>
<th class="text-center" style="width:200px;" >규격</th>
<th class="text-center" style="width:50px;" > 단위</th>
<th class="text-center" style="width:60px;" >입고량</th>
<th class="text-center" style="width:150px;" >자재번호</th>
<th class="text-center" style="width:150px;" >제조사</th>
<th class="text-center" style="width:100px;" >비고</th>
<th class="text-center" style="width:100px;" >매입가 <br>(VAT별도)</th>
<th class="text-center" style="width:100px;" >중량(KG)</th>
</thead>
<tbody>
<?php
$start_num = $total_row;
while($row = $stmh->fetch(PDO::FETCH_ASSOC)) {
include '_row.php';
$specification_clean = preg_replace('/\s+/', ' ', $specification); // 연속된 공백을 하나의 공백으로 변경
$remarks_clean = preg_replace('/\s+/', ' ', $remarks); // 연속된 공백을 하나의 공백으로 변경
// JSON을 배열로 디코딩
$iListArray = json_decode($iList, true);
// resultJudgement 값을 찾기 위한 루프
$resultJudgement = null;
foreach ($iListArray as $item) {
// 배열에서 inputItems를 가진 항목이 있는지 확인
if (isset($item['inputItems']['resultJudgement'])) {
$resultJudgement = $item['inputItems']['resultJudgement'];
break; // 값을 찾으면 루프 종료
}
}
?>
<tr onclick="viewBoardInstock( '<?= addslashes($num) ?>', '<?= addslashes($item_name) ?>', '<?= addslashes($specification_clean) ?>', '<?= addslashes($remarks_clean) ?>');" data-num="<?=$num?>">
<td class="text-center"><?= $start_num ?></td>
<td class="text-center fw-bold text-success "><?= $row['lot_no'] ?></td>
<?php
// resultJudgement 값이 "합격"이면 text-dark, 아니면 text-danger로 설정
$class = ($resultJudgement === '합격') ? 'text-dark' : 'text-danger';
?>
<td class="text-center fw-bold resultJudgement <?= $class ?>"><?= $resultJudgement ?></td>
<td class="text-center "><?= $row['lotDone'] ?></td>
<td class="text-center"><?= $row['inspection_date'] ?></td>
<td class="text-center"><?= $row['supplier'] ?></td>
<td class="text-start fw-bold text-primary"><?= $row['item_name'] ?></td>
<td class="text-start text-secondary"><?= $specification_clean ?></td>
<td class="text-center fw-bold text-secondary"><?= $row['unit'] ?></td>
<td class="text-end fw-bold text-primary">
<?php if (is_numeric($row['received_qty'])) : ?>
<?= number_format($row['received_qty']) ?>
<?php else : ?>
<?= htmlspecialchars($row['received_qty']) ?>
<?php endif; ?>
</td>
<td class="text-start fw-bold text-secondary"><?= $row['material_no'] ?></td>
<td class="text-center"><?= $row['manufacturer'] ?></td>
<td class="text-start"><?= $row['remarks'] ?></td>
<td class="text-end">
<?= is_numeric($row['purchase_price_excl_vat']) ? number_format($row['purchase_price_excl_vat']) : '' ?>
</td>
<?php
$weight_kg = $row['weight_kg'];
$weight_kg = str_replace(',', '', $weight_kg);
// 결과값이 숫자 형태인지 확인하고, 숫자일 경우 number_format 적용
if (is_numeric($weight_kg) && $weight_kg != '' && $weight_kg != '0') {
$weight_kg = number_format((float)$weight_kg);
}
?>
<td class="text-end"><?= $weight_kg ?></td>
</tr>
<?php
$start_num--;
}
} catch (PDOException $Exception) {
print "오류: ".$Exception->getMessage();
}
?>
</tbody>
</table>
</div>
</div>
</div>
</form>
<script>
var ajaxRequest = null;
var itemData = [];
var lotnumData = [];
var selectedRow;
var ajaxRequest_write = null;
var dataTable;
var material_regpageNumber;
$(document).ready(function() {
dataTable = $('#myTable').DataTable({
"paging": true,
"ordering": true,
"searching": true,
"pageLength": 200,
"lengthMenu": [ 100, 200, 500, 1000],
"language": {
"lengthMenu": "Show _MENU_ entries",
"search": "Live Search:"
},
"order": [[1, 'desc']],
"dom": 't<"bottom"ip>'
});
var savedPageNumber = getCookie('material_regpageNumber');
if (savedPageNumber) {
dataTable.page(parseInt(savedPageNumber) - 1).draw(false);
}
dataTable.on('page.dt', function() {
var material_regpageNumber = dataTable.page.info().page + 1;
setCookie('material_regpageNumber', material_regpageNumber, 10);
});
$('#myTable_length select').on('change', function() {
var selectedValue = $(this).val();
dataTable.page.len(selectedValue).draw();
savedPageNumber = getCookie('material_regpageNumber');
if (savedPageNumber) {
dataTable.page(parseInt(savedPageNumber) - 1).draw(false);
}
});
$(document).on('click', '.specialbtnClear', function(e) {
e.preventDefault();
$(this).siblings('input').val('').focus();
});
$(document).on('click', '.btnClear_lot', function(e) {
e.preventDefault();
$(this).siblings('input').val('').focus();
});
});
function restorePageNumber() {
var savedPageNumber = getCookie('material_regpageNumber');
location.reload(true);
}
</script>
<script>
$(document).ready(function(){
var loader = document.getElementById('loadingOverlay');
loader.style.display = 'none';
var modal = document.getElementById("myModal");
var span = document.getElementsByClassName("close")[0];
span.onclick = function() {
modal.style.display = "none";
}
$(".close").on("click", function() {
$("#myModal").hide();
});
$("#newBtn").on("click", function() {
viewBoardInstock('insert');
});
$("#searchBtn").on("click", function() {
$("#board_form").submit();
});
$("#closeBtn").on("click", function() {
var modal = document.getElementById("myModal");
modal.style.display = "none";
});
// upload
$("#uploadBtn").on("click", function() {
popupCenter('uploadgrid.php' , '업로드', 1800, 800);
});
});
function enter() {
$("#board_form").submit();
}
function inputNumberFormat(obj) {
obj.value = obj.value.replace(/[^0-9]/g, '');
let value = obj.value.replace(/,/g, '');
obj.value = value.replace(/\B(?=(\d{3})+(?!\d))/g, ',');
}
$(document).on("keypress", "input", function(event) {
return event.keyCode != 13;
});
$(document).ready(function(){
// 방문기록 남김
var title_message = '<?php echo $title_message ; ?>';
saveMenuLog(title_message);
});
// 팝업 창 닫기 시 데이터를 전달하고 열 갱신
function closePopupAndUpdateRow(updatedData) {
if (selectedRow) {
// selectedRow.find('.text-center.text-primary').eq(0).text(updatedData.rawLot);
// selectedRow.find('.text-center.text-primary').eq(1).text(updatedData.fabric_lot);
// selectedRow.find('.fw-bold.text-success').text(updatedData.lot_number);
selectedRow.find('.resultJudgement').text(updatedData.resultJudgement);
// // 추가적으로 다른 필드도 업데이트 필요 시 설정
// selectedRow.find('.text-center').eq(1).text(updatedData.reg_date);
// selectedRow.find('.text-center').eq(6).text(updatedData.prodDisplay);
// selectedRow.find('.text-center').eq(7).text(updatedData.specDisplay);
// selectedRow.find('.text-center').eq(8).text(updatedData.slengthDisplay);
// selectedRow.find('.text-center').eq(9).text(updatedData.surang);
// selectedRow.find('.text-center').eq(10).text(updatedData.author);
// selectedRow.find('.text-start').eq(0).text(updatedData.remark);
}
}
</script>
<?php require_once $_SERVER['DOCUMENT_ROOT'] . '/instock/common/viewJS.php'; ?> <!--공통 JS -->
</body>
</html>

416
instock/list_stock.php Normal file
View File

@@ -0,0 +1,416 @@
<?php
require_once($_SERVER['DOCUMENT_ROOT'] . "/session.php");
if (!isset($_SESSION["level"]) || $_SESSION["level"] > 5) {
sleep(1);
header("Location:" . $WebSite . "login/login_form.php");
exit;
}
include $_SERVER['DOCUMENT_ROOT'] . '/load_header.php';
$title_message = '재고 관리대장';
// 품질담당자 및 관리자인 경우 권한 부여
$QCadmin = 0 ;
if($user_name=='이세희' || $user_name=='개발자' || $user_name=='함신옥' || $user_name=='노완호' )
$QCadmin = 1 ;
?>
<link href="css/style.css" rel="stylesheet">
<title> <?=$title_message?> </title>
</head>
<body>
<?php
$header = isset($_REQUEST['header']) ? $_REQUEST['header'] : '';
if($header ==='header')
require_once($_SERVER['DOCUMENT_ROOT'] . '/myheader.php');
require_once($_SERVER['DOCUMENT_ROOT'] . "/lib/mydb.php");
$pdo = db_connect();
function checkNull($strtmp) {
return ($strtmp !== null && trim($strtmp) !== '');
}
$search = isset($_REQUEST['search']) ? $_REQUEST['search'] : '';
$mode = isset($_REQUEST["mode"]) ? $_REQUEST["mode"] : '';
$fromdate = isset($_REQUEST['fromdate']) ? $_REQUEST['fromdate'] : '';
$todate = isset($_REQUEST['todate']) ? $_REQUEST['todate'] : '';
$tablename = 'instock';
// 현재 날짜
$currentDate = date("Y-m-d");
// fromdate 또는 todate가 빈 문자열이거나 null인 경우 기본 날짜 설정
if ($fromdate === "" || $fromdate === null || $todate === "" || $todate === null) {
$fromdate = "2024-01-01"; // 2024년 1월 1일부터
$todate = $currentDate; // 현재날짜까지
$Transtodate = $todate;
} else {
$Transtodate = $todate; // 설정된 기간
}
$SettingDate = "inspection_date"; // 정렬 기준 날짜
$order = " ORDER BY prodcode ASC, inspection_date DESC ";
// 재고 계산을 위한 SQL 쿼리
// 입고량과 사용량을 계산하여 재고를 구함
// 사용량 테이블이 없을 경우를 대비하여 입고량만으로 계산
// 품목코드별로 그룹핑하여 합계 계산
if(checkNull($search)) {
$sql = "SELECT
i.prodcode,
MAX(i.item_name) as item_name,
MAX(i.specification) as specification,
MAX(i.unit) as unit,
MAX(i.material_no) as material_no,
MAX(i.manufacturer) as manufacturer,
MAX(i.remarks) as remarks,
MAX(i.purchase_price_excl_vat) as purchase_price_excl_vat,
MAX(i.weight_kg) as weight_kg,
SUM(CASE WHEN i.is_deleted IS NULL THEN CAST(REPLACE(i.received_qty, ',', '') AS DECIMAL(10,2)) ELSE 0 END) as total_in,
0 as total_out,
SUM(CASE WHEN i.is_deleted IS NULL THEN CAST(REPLACE(i.received_qty, ',', '') AS DECIMAL(10,2)) ELSE 0 END) as current_stock
FROM {$DB}.{$tablename} i
WHERE i.inspection_date BETWEEN date('$fromdate') AND date('$Transtodate')
AND (i.searchtag LIKE '%$search%' OR i.prodcode LIKE '%$search%' OR i.item_name LIKE '%$search%')
AND i.is_deleted IS NULL
GROUP BY i.prodcode
HAVING current_stock > 0
" . $order;
} else {
$sql = "SELECT
i.prodcode,
MAX(i.item_name) as item_name,
MAX(i.specification) as specification,
MAX(i.unit) as unit,
MAX(i.material_no) as material_no,
MAX(i.manufacturer) as manufacturer,
MAX(i.remarks) as remarks,
MAX(i.purchase_price_excl_vat) as purchase_price_excl_vat,
MAX(i.weight_kg) as weight_kg,
SUM(CASE WHEN i.is_deleted IS NULL THEN CAST(REPLACE(i.received_qty, ',', '') AS DECIMAL(10,2)) ELSE 0 END) as total_in,
0 as total_out,
SUM(CASE WHEN i.is_deleted IS NULL THEN CAST(REPLACE(i.received_qty, ',', '') AS DECIMAL(10,2)) ELSE 0 END) as current_stock
FROM {$DB}.{$tablename} i
WHERE i.inspection_date BETWEEN date('$fromdate') AND date('$Transtodate')
AND i.is_deleted IS NULL
GROUP BY i.prodcode
HAVING current_stock > 0
" . $order;
}
try {
$stmh = $pdo->query($sql);
$total_row = $stmh->rowCount();
?>
<form id="board_form" name="board_form" method="post" enctype="multipart/form-data">
<input type="hidden" id="mode" name="mode" value="<?=$mode?>">
<input type="hidden" id="num" name="num">
<input type="hidden" id="tablename" name="tablename" value="<?=$tablename?>">
<input type="hidden" id="header" name="header" value="<?=$header?>">
<input type="hidden" id="QCadmin" name="QCadmin" value="<?=$QCadmin?>">
<div class="container-fluid">
<!-- Modal -->
<div id="myModal" class="modal">
<div class="modal-content" style="width:1200px;">
<div class="modal-header">
<span class="modal-title">수불내역</span>
<span class="close">&times;</span>
</div>
<div class="modal-body">
<div class="custom-card"></div>
</div>
</div>
</div>
</div>
<?php
if ($header == 'header') {
print '<div class="container-fluid">';
print '<div class="card justify-content-center text-center mt-1">';
} else {
print '<div class="container">';
print '<div class="card justify-content-center text-center mt-5">';
}
?>
<div class="card-header">
<div class="d-flex p-1 m-1 mt-1 justify-content-center align-items-center ">
<h5> <?=$title_message?> </h5> &nbsp;&nbsp;&nbsp;&nbsp;
<button type="button" class="btn btn-dark btn-sm " onclick='location.reload();' > <i class="bi bi-arrow-clockwise"></i> </button>
</div>
<div class="d-flex p-1 m-1 mt-2 mb-1 justify-content-center align-items-center ">
<span class="text-secondary"> 품목코드별 재고 현황 (현재는 입고량 기준, 사용량 테이블 연동 시 자동 계산) </span>
</div>
</div>
<div class="card-body">
<div class="container mt-2 mb-2">
<div class="row">
<div class="d-flex p-1 m-1 mt-1 mb-1 justify-content-center align-items-center">
▷ <?= $total_row ?> &nbsp;
<input type="date" id="fromdate" name="fromdate" class="form-control" style="width:100px;" value="<?=$fromdate?>" > &nbsp; ~ &nbsp;
<input type="date" id="todate" name="todate" class="form-control me-1" style="width:100px;" value="<?=$todate?>" > &nbsp;
<div class="inputWrap">
<input type="text" id="search" name="search" value="<?=$search?>" onkeydown="JavaScript:SearchEnter();" autocomplete="off" class="form-control text-start" style="width:200px;" placeholder="품목코드/품목명 검색" > &nbsp;
<button class="btnClear"></button>
</div>
<div id="autocomplete-list">
</div>
&nbsp;
<button id="searchBtn" type="button" class="btn btn-dark btn-sm" > <i class="bi bi-search"></i> 검색 </button>
</div>
</div>
</div>
<div class="table-responsive">
<table class="table table-hover" id="myTable">
<thead class="table-primary">
<th class="text-center" style="width:50px;" >번호</th>
<th class="text-center" style="width:100px;" >품목코드</th>
<th class="text-center" style="width:200px;" >품목명</th>
<th class="text-center" style="width:200px;" >규격</th>
<th class="text-center" style="width:40px;" > 단위</th>
<th class="text-center" style="width:80px;" >입고량</th>
<th class="text-center" style="width:80px;" >사용량</th>
<th class="text-center" style="width:80px;" >재고</th>
<th class="text-center" style="width:120px;" >자재번호</th>
<th class="text-center" style="width:120px;" >제조사</th>
<th class="text-center" style="width:100px;" >비고</th>
<th class="text-center" style="width:90px;" >매입가 <br>(VAT별도)</th>
<th class="text-center" style="width:80px;" >중량(KG)</th>
</thead>
<tbody>
<?php
$start_num = $total_row;
while($row = $stmh->fetch(PDO::FETCH_ASSOC)) {
$specification_clean = preg_replace('/\s+/', ' ', $row['specification']); // 연속된 공백을 하나의 공백으로 변경
$remarks_clean = preg_replace('/\s+/', ' ', $row['remarks']); // 연속된 공백을 하나의 공백으로 변경
?>
<tr data-prodcode="<?= htmlspecialchars($row['prodcode']) ?>"
data-itemname="<?= htmlspecialchars($row['item_name']) ?>"
data-specification="<?= htmlspecialchars($row['specification']) ?>"
data-remarks="<?= htmlspecialchars($row['remarks']) ?>"
onclick="loadInOutHistory('<?= htmlspecialchars($row['prodcode']) ?>', '<?= htmlspecialchars($row['item_name']) ?>', '<?= htmlspecialchars($row['specification']) ?>', '<?= htmlspecialchars($row['remarks']) ?>');">
<td class="text-center"><?= $start_num ?></td>
<td class="text-start fw-bold text-primary"><?= $row['prodcode'] ?></td>
<td class="text-start fw-bold "><?= $row['item_name'] ?></td>
<td class="text-start text-secondary"><?= $row['specification'] ?></td>
<td class="text-center fw-bold text-secondary"><?= $row['unit'] ?></td>
<td class="text-end fw-bold text-success">
<?php if (is_numeric($row['total_in'])) : ?>
<?= number_format($row['total_in']) ?>
<?php else : ?>
<?= htmlspecialchars($row['total_in']) ?>
<?php endif; ?>
</td>
<td class="text-end fw-bold text-danger">
<?php if (is_numeric($row['total_out'])) : ?>
<?= number_format($row['total_out']) ?>
<?php else : ?>
<?= htmlspecialchars($row['total_out']) ?>
<?php endif; ?>
</td>
<td class="text-end fw-bold text-primary">
<?php if (is_numeric($row['current_stock'])) : ?>
<?= number_format($row['current_stock']) ?>
<?php else : ?>
<?= htmlspecialchars($row['current_stock']) ?>
<?php endif; ?>
</td>
<td class="text-start text-secondary"><?= $row['material_no'] ?></td>
<td class="text-center"><?= $row['manufacturer'] ?></td>
<td class="text-start"><?= $row['remarks'] ?></td>
<td class="text-end">
<?= is_numeric($row['purchase_price_excl_vat']) ? number_format($row['purchase_price_excl_vat']) : '' ?>
</td>
<?php
$weight_kg = $row['weight_kg'];
$weight_kg = str_replace(',', '', $weight_kg);
if (is_numeric($weight_kg) && $weight_kg != '' && $weight_kg != '0') {
$weight_kg = number_format((float)$weight_kg);
}
?>
<td class="text-end"><?= $weight_kg ?></td>
</tr>
<?php
$start_num--;
}
} catch (PDOException $Exception) {
print "오류: ".$Exception->getMessage();
}
?>
</tbody>
</table>
</div>
</div>
</div>
</form>
<script>
var ajaxRequest = null;
var itemData = [];
var lotnumData = [];
function loadInOutHistory(prodcode, itemname, spec, remarks) {
$.ajax({
type: "POST",
url: "fetch_inout_history.php",
data: {
prodcode: prodcode,
itemname: itemname,
spec: spec,
remarks: remarks,
fromdate: $("#fromdate").val(),
todate: $("#todate").val()
},
dataType: "html",
success: function(response) {
document.querySelector(".modal-body .custom-card").innerHTML = response;
$("#myModal").show();
$("#closeBtn").off("click").on("click", function() {
$("#myModal").hide();
});
// 모달 외부 클릭 시 닫기
$(document).off('click', '.close').on('click', '.close', function() {
$("#myModal").hide();
});
// ESC 키로 닫기
$(document).on('keydown', function(e) {
if (e.keyCode === 27) { // ESC key
$("#myModal").hide();
}
});
},
error: function(jqxhr, status, error) {
console.log("AJAX Error: ", status, error);
}
});
}
</script>
<script>
var ajaxRequest_write = null;
var dataTable;
var material_regpageNumber;
$(document).ready(function() {
dataTable = $('#myTable').DataTable({
"paging": true,
"ordering": true,
"searching": true,
"pageLength": 200,
"lengthMenu": [ 50, 100, 200, 500, 1000],
"language": {
"lengthMenu": "Show _MENU_ entries",
"search": "Live Search:"
},
"order": [[1, 'asc']],
"dom": 't<"bottom"ip>'
});
var savedPageNumber = getCookie('material_regpageNumber');
if (savedPageNumber) {
dataTable.page(parseInt(savedPageNumber) - 1).draw(false);
}
dataTable.on('page.dt', function() {
var material_regpageNumber = dataTable.page.info().page + 1;
setCookie('material_regpageNumber', material_regpageNumber, 10);
});
$('#myTable_length select').on('change', function() {
var selectedValue = $(this).val();
dataTable.page.len(selectedValue).draw();
savedPageNumber = getCookie('material_regpageNumber');
if (savedPageNumber) {
dataTable.page(parseInt(savedPageNumber) - 1).draw(false);
}
});
$(document).on('click', '.specialbtnClear', function(e) {
e.preventDefault();
$(this).siblings('input').val('').focus();
});
$(document).on('click', '.btnClear_lot', function(e) {
e.preventDefault();
$(this).siblings('input').val('').focus();
});
});
function restorePageNumber() {
var savedPageNumber = getCookie('material_regpageNumber');
location.reload(true);
}
</script>
<script>
$(document).ready(function(){
var loader = document.getElementById('loadingOverlay');
if(loader)
loader.style.display = 'none';
var modal = document.getElementById("myModal");
var span = document.getElementsByClassName("close")[0];
span.onclick = function() {
modal.style.display = "none";
}
$(".close").on("click", function() {
$("#myModal").hide();
});
$("#searchBtn").on("click", function() {
$("#board_form").submit();
});
$("#closeBtn").on("click", function() {
var modal = document.getElementById("myModal");
modal.style.display = "none";
});
});
function enter() {
$("#board_form").submit();
}
function inputNumberFormat(obj) {
obj.value = obj.value.replace(/[^0-9]/g, '');
let value = obj.value.replace(/,/g, '');
obj.value = value.replace(/\B(?=(\d{3})+(?!\d))/g, ',');
}
$(document).on("keypress", "input", function(event) {
return event.keyCode != 13;
});
$(document).ready(function(){
// 방문기록 남김
saveMenuLog('재고 관리대장');
});
</script>
<?php require_once $_SERVER['DOCUMENT_ROOT'] . '/instock/common/viewJS.php'; ?> <!--공통 JS -->
</body>
</html>

1
instock/lotnum.txt Normal file
View File

@@ -0,0 +1 @@
250723-05

View File

@@ -0,0 +1,44 @@
<?php
ob_start(); // 출력 버퍼링 시작
require_once($_SERVER['DOCUMENT_ROOT'] . "/session.php");
require_once($_SERVER['DOCUMENT_ROOT'] . "/lib/mydb.php");
$pdo = db_connect();
ini_set('display_errors', 0);
ini_set('log_errors', 1);
error_reporting(E_ALL);
header('Content-Type: application/json'); // JSON 응답 헤더 설정
$lot_number = '';
$currentDate = date('ymd'); // 예: 240926
$filepath = $_SERVER['DOCUMENT_ROOT'] . '/instock/lotnum.txt';
// 파일이 존재하지 않으면 새로 생성
if (!file_exists($filepath)) {
$lot_number = $currentDate . '-01';
} else {
// 파일에서 이전 로트번호 읽기
$lastLotNumber = file_get_contents($filepath);
list($date, $number) = explode('-', $lastLotNumber);
// 날짜가 같으면 번호를 증가, 다르면 01로 초기화
if ($date === $currentDate) {
$newNumber = str_pad((int)$number + 1, 2, '0', STR_PAD_LEFT);
$lot_number = $currentDate . '-' . $newNumber;
} else {
$lot_number = $currentDate . '-01';
}
}
// 로트번호 갱신
file_put_contents($filepath, $lot_number);
// JSON 데이터 반환
echo json_encode(['lot_number' => $lot_number]);
ob_end_clean(); // 출력 버퍼 비우기 (추가 보안)
exit; // 스크립트 종료

20
instock/save_lotnum.php Normal file
View File

@@ -0,0 +1,20 @@
<?php
// JSON 응답 형식 설정
header('Content-Type: application/json');
// 입력 데이터 검증
if (!isset($_POST['lot_no'])) {
echo json_encode(['status' => 'error', 'message' => 'No data provided']);
exit;
}
$lot_no = $_POST['lot_no']; // 클라이언트에서 받은 로트번호
$filepath = $_SERVER['DOCUMENT_ROOT'] . '/instock/lotnum.txt';
// 파일에 데이터 저장
if (file_put_contents($filepath, $lot_no) !== false) {
echo json_encode(['status' => 'success', 'message' => 'Data saved successfully']);
} else {
echo json_encode(['status' => 'error', 'message' => 'Failed to save data']);
}
?>

198
instock/statistics.php Normal file
View File

@@ -0,0 +1,198 @@
<?php
require_once($_SERVER['DOCUMENT_ROOT'] . "/session.php");
// 접근 권한 체크
if (!isset($_SESSION["level"]) || $_SESSION["level"] > 5) {
sleep(1);
header("Location:" . $WebSite . "login/login_form.php");
exit;
}
include $_SERVER['DOCUMENT_ROOT'] . '/load_header.php';
$title_message = '수입검사 매입 통계';
$title_prefix = '수입검사 매입 통계자료';
?>
<title><?= $title_prefix ?> <?= $title_message ?></title>
</head>
<body>
<?php
require_once($_SERVER['DOCUMENT_ROOT'] . '/myheader.php');
require_once($_SERVER['DOCUMENT_ROOT'] . '/mymodal.php');
require_once($_SERVER['DOCUMENT_ROOT'] . '/instock/func_statistics.php'); // 함수로 가져오는 이유는 다른곳에서도 코드를 재활용하기 위함이다.
?>
<!-- 기간 설정 폼 -->
<form id="board_form" name="board_form" method="post" enctype="multipart/form-data">
<div class="container">
<div class="d-flex mt-4 mb-4 align-items-center justify-content-center">
<span class="text-center fs-5"> <?=$title_message?> </span>
<button type="button" class="btn btn-dark btn-sm mx-2" onclick='location.reload();' > <i class="bi bi-arrow-clockwise"></i> </button>
</div>
<div class="d-flex mt-2 mb-3 align-items-center justify-content-center">
▷ <?= $total_row ?> 건
<!-- 기간부터 검색까지 연결 묶음 start -->
<span id="showdate" class="btn btn-dark btn-sm mx-1" > 기간 </span> &nbsp;
<div id="showframe" class="card" style="width:500px;">
<div class="card-header " style="padding:2px;">
<div class="d-flex justify-content-center align-items-center">
기간 설정
</div>
</div>
<div class="card-body">
<div class="d-flex justify-content-center align-items-center">
<button type="button" class="btn btn-outline-success btn-sm me-1 change_dateRange" onclick='alldatesearch()' > 전체 </button>
<button type="button" id="preyear" class="btn btn-outline-primary btn-sm me-1 change_dateRange" onclick='pre_year()' > 전년도 </button>
<button type="button" id="three_month" class="btn btn-dark btn-sm me-1 change_dateRange" onclick='three_month_ago()' > M-3월 </button>
<button type="button" id="prepremonth" class="btn btn-dark btn-sm me-1 change_dateRange" onclick='prepre_month()' > 전전월 </button>
<button type="button" id="premonth" class="btn btn-dark btn-sm me-1 change_dateRange" onclick='pre_month()' > 전월 </button>
<button type="button" class="btn btn-outline-danger btn-sm me-1 change_dateRange" onclick='this_today()' > 오늘 </button>
<button type="button" id="thismonth" class="btn btn-dark btn-sm me-1 change_dateRange" onclick='this_month()' > 당월 </button>
<button type="button" id="thisyear" class="btn btn-dark btn-sm me-1 change_dateRange" onclick='this_year()' > 당해년도 </button>
</div>
</div>
</div>
<input type="date" id="fromdate" name="fromdate" size="12" class="form-control" style="width:100px;" value="<?=$fromdate?>" > &nbsp; ~ &nbsp;
<input type="date" id="todate" name="todate" size="12" class="form-control" style="width:100px;" value="<?=$todate?>" > &nbsp; </span>
&nbsp;&nbsp;
<button class="btn btn-dark btn-sm mx-1" type="button" id="searchBtn"> <i class="bi bi-search"></i> </button>
</div>
</div>
</form>
<div class="container mt-4">
<div class="d-flex p-1 m-1 mt-1 mb-1 justify-content-center align-items-center">
<div class="card w-50">
<div class="card-header text-center">
<h5>납품업체별 매입가 합계 (VAT별도)</h5>
</div>
<div class="card-body">
<?php include $_SERVER['DOCUMENT_ROOT'] . '/instock/instock_table.php'; ?>
</div>
</div>
</div>
</div>
<!-- 금액 통계 차트 (Highcharts) -->
<div class="container mt-4">
<div class="card">
<div class="card-header text-center">
<h5>납품업체별 매입합 그래프</h5>
</div>
<div class="card-body">
<div id="amountChart" style="height: 500px;"></div>
</div>
</div>
</div>
<script>
document.addEventListener('DOMContentLoaded', function() {
const chartData = <?= $jsonChartData ?>;
Highcharts.chart('amountChart', {
chart: {
type: 'column'
},
title: {
text: ''
},
xAxis: {
type: 'category',
title: {
text: '납품업체'
}
},
yAxis: {
min: 0,
title: {
text: '매입가 합계'
}
},
tooltip: {
pointFormat: '<span style="color:{point.color}">{point.name}</span>: <b>{point.y}</b><br/>'
},
series: [{
name: '매입가 합계',
data: chartData
}]
});
});
</script>
<!-- 로딩 오버레이 제거 및 방문기록 남김 -->
<script>
document.addEventListener('DOMContentLoaded', function() {
var loader = document.getElementById('loadingOverlay');
if(loader)
loader.style.display = 'none';
});
$(document).ready(function(){
var title_message = '<?php echo $title_message ; ?>';
saveMenuLog(title_message);
});
</script>
<!-- 업체별 구매 내역 상세 테이블 (반응형 적용) -->
<div class="container mt-4">
<div class="row">
<?php foreach ($rows as $row): ?>
<?php
$supplierName = $row['supplier'];
// 해당 업체의 구매 내역 조회 (품목명, 수량, 매입가)
$sqlDetail = "SELECT item_name, received_qty, purchase_price_excl_vat
FROM {$DB}.{$tablename}
WHERE supplier = :supplier
AND inspection_date BETWEEN :fromdate AND :todate
AND is_deleted IS NULL
ORDER BY inspection_date DESC";
$stmtDetail = $pdo->prepare($sqlDetail);
$stmtDetail->bindValue(':supplier', $supplierName);
$stmtDetail->bindValue(':fromdate', $fromdate);
$stmtDetail->bindValue(':todate', $todate);
$stmtDetail->execute();
$details = $stmtDetail->fetchAll(PDO::FETCH_ASSOC);
?>
<div class="col-12 col-sm-4 mb-3">
<div class="card h-100">
<div class="card-header">
<h6><?= htmlspecialchars($supplierName) ?> (총 매입가: <?= number_format($row['total_amount']) ?>)</h6>
</div>
<div class="card-body p-0">
<table class="table table-bordered mb-0">
<thead class="table-secondary">
<tr>
<th style="width:55%;">품목명</th>
<th style="width:15%;">수량</th>
<th style="width:30%;" class="text-end">매입가 (VAT별도)</th>
</tr>
</thead>
<tbody>
<?php if(count($details) > 0): ?>
<?php foreach ($details as $detail): ?>
<tr>
<td><?= htmlspecialchars($detail['item_name']) ?></td>
<td><?= is_numeric($detail['received_qty']) ? number_format($detail['received_qty']) : htmlspecialchars($detail['received_qty']) ?></td>
<td class="text-end">
<?= is_numeric($detail['purchase_price_excl_vat']) ? number_format($detail['purchase_price_excl_vat']) : htmlspecialchars($detail['purchase_price_excl_vat']) ?>
</td>
</tr>
<?php endforeach; ?>
<?php else: ?>
<tr>
<td colspan="3" class="text-center">구매 내역이 없습니다.</td>
</tr>
<?php endif; ?>
</tbody>
</table>
</div>
</div>
</div>
<?php endforeach; ?>
</div>
</div>
</body>
</html>

134
instock/upload.php Normal file
View File

@@ -0,0 +1,134 @@
<?php
require_once($_SERVER['DOCUMENT_ROOT'] . "/session.php");
header("Content-Type: application/json"); //json을 사용하기 위해 필요한 구문
$tablename ='instock';
function conv_num($num) {
$number = (int)str_replace(',', '', $num);
return $number;
}
function pipetocomma($str) {
$strtmp = str_replace('|', ',', $str);
return $strtmp;
}
isset($_REQUEST["col1"]) ? $col1=$_REQUEST["col1"] : $col1='';
isset($_REQUEST["col2"]) ? $col2=$_REQUEST["col2"] : $col2='';
isset($_REQUEST["col3"]) ? $col3=$_REQUEST["col3"] : $col3='';
isset($_REQUEST["col4"]) ? $col4=$_REQUEST["col4"] : $col4='';
isset($_REQUEST["col5"]) ? $col5=$_REQUEST["col5"] : $col5='';
isset($_REQUEST["col6"]) ? $col6=$_REQUEST["col6"] : $col6='';
isset($_REQUEST["col7"]) ? $col7=$_REQUEST["col7"] : $col7='';
isset($_REQUEST["col8"]) ? $col8=$_REQUEST["col8"] : $col8='';
isset($_REQUEST["col9"]) ? $col9=$_REQUEST["col9"] : $col9='';
isset($_REQUEST["col10"]) ? $col10=$_REQUEST["col10"] : $col10='';
isset($_REQUEST["col11"]) ? $col11=$_REQUEST["col11"] : $col11='';
isset($_REQUEST["col12"]) ? $col12=$_REQUEST["col12"] : $col12='';
isset($_REQUEST["col13"]) ? $col13=$_REQUEST["col13"] : $col13='';
$colarr1 = explode(",",$col1[0]);
$colarr2 = explode(",",$col2[0]);
$colarr3 = explode(",",$col3[0]);
$colarr4 = explode(",",$col4[0]);
$colarr5 = explode(",",$col5[0]);
$colarr6 = explode(",",$col6[0]);
$colarr7 = explode(",",$col7[0]);
$colarr8 = explode(",",$col8[0]);
$colarr9 = explode(",",$col9[0]);
$colarr10 = explode(",",$col10[0]);
$colarr11 = explode(",",$col11[0]);
$colarr12 = explode(",",$col12[0]);
$colarr13 = explode(",",$col13[0]);
$orderday = date("Y-m-d"); // 현재날짜 2022-01-20 형태로 지정
require_once($_SERVER['DOCUMENT_ROOT'] . "/lib/mydb.php");
$pdo = db_connect();
for($i=0;$i<count($colarr1);$i++) {
if($colarr1[$i]!='')
{
// | -> , 로 변환함
$colarr1[$i] = pipetocomma($colarr1[$i]);
$colarr2[$i] = pipetocomma($colarr2[$i]);
$colarr3[$i] = pipetocomma($colarr3[$i]);
$colarr4[$i] = pipetocomma($colarr4[$i]);
$colarr5[$i] = pipetocomma($colarr5[$i]);
$colarr6[$i] = pipetocomma($colarr6[$i]);
$colarr7[$i] = pipetocomma($colarr7[$i]);
$colarr8[$i] = pipetocomma($colarr8[$i]);
$colarr9[$i] = pipetocomma($colarr9[$i]);
$colarr10[$i] = pipetocomma($colarr10[$i]);
$colarr11[$i] = pipetocomma($colarr11[$i]);
$colarr12[$i] = pipetocomma($colarr12[$i]);
$colarr13[$i] = pipetocomma($colarr13[$i]);
try {
$pdo->beginTransaction();
// 입력 데이터 수집
$lot_no = $colarr1[$i];
$inspection_date = $colarr2[$i];
$supplier = $colarr3[$i];
$item_name = $colarr4[$i];
$specification = $colarr5[$i];
$unit = $colarr6[$i];
$received_qty = $colarr7[$i];
$material_no = $colarr8[$i];
$manufacturer = $colarr9[$i];
$remarks = $colarr10[$i];
$purchase_price_excl_vat = $colarr11[$i];
$weight_kg = $colarr12[$i];
// searchtag 생성
$searchtag = $lot_no . ' ' . $inspection_date . ' ' . $supplier . ' ' . $item_name . ' ' .
$specification . ' ' . $unit . ' ' . $received_qty . ' ' . $material_no . ' ' .
$manufacturer . ' ' . $remarks . ' ' . $purchase_price_excl_vat . ' ' . $weight_kg;
// SQL 쿼리 생성 (삽입)
$sql = "INSERT INTO " . $DB . "." . $tablename . " (";
$sql .= "lot_no, inspection_date, supplier, item_name, specification, unit, received_qty, material_no, manufacturer, remarks, purchase_price_excl_vat, weight_kg, searchtag";
$sql .= ") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
$stmh = $pdo->prepare($sql);
// 변수 바인딩
$stmh->bindValue(1, $lot_no, PDO::PARAM_STR);
$stmh->bindValue(2, $inspection_date, PDO::PARAM_STR);
$stmh->bindValue(3, $supplier, PDO::PARAM_STR);
$stmh->bindValue(4, $item_name, PDO::PARAM_STR);
$stmh->bindValue(5, $specification, PDO::PARAM_STR);
$stmh->bindValue(6, $unit, PDO::PARAM_STR);
$stmh->bindValue(7, str_replace(',', '', $received_qty), PDO::PARAM_STR);
$stmh->bindValue(8, $material_no, PDO::PARAM_STR);
$stmh->bindValue(9, $manufacturer, PDO::PARAM_STR);
$stmh->bindValue(10, $remarks, PDO::PARAM_STR);
$stmh->bindValue(11, str_replace(',', '', $purchase_price_excl_vat), PDO::PARAM_STR);
$stmh->bindValue(12, str_replace(',', '', $weight_kg), PDO::PARAM_STR);
$stmh->bindValue(13, $searchtag, PDO::PARAM_STR);
// Execute the statement
$stmh->execute();
$pdo->commit();
} catch (PDOException $Exception) {
$pdo->rollBack();
print "오류: " . $Exception->getMessage();
}
}
}
//각각의 정보를 하나의 배열 변수에 넣어준다.
$data = array(
"colarr1" => $colarr1
);
//json 출력
echo(json_encode($data, JSON_UNESCAPED_UNICODE));
?>

455
instock/uploadgrid.php Normal file
View File

@@ -0,0 +1,455 @@
<?php
require_once($_SERVER['DOCUMENT_ROOT'] . "/session.php");
if(!isset($_SESSION["level"]) || $_SESSION["level"]>5) {
sleep(1);
header("Location:" . $WebSite . "login/login_form.php");
exit;
}
include $_SERVER['DOCUMENT_ROOT'] . '/load_header.php';
$title_message = '수입검사 업로드'
?>
<title> <?=$title_message?> </title>
</head>
<body>
<?php
$sql=" select * from " . $DB . ".instock " ;
$tablename = 'instock';
?>
<div class="container-fluid">
<div class="card-header">
<h6> <?=$title_message?> &nbsp; &nbsp;
<button type="button" class="btn btn-dark btn-sm" id="savegridBtn"> <i class="bi bi-check-square-fill"></i> 일괄등록 실행 </button> &nbsp; &nbsp; &nbsp;
<button type="button" class="btn btn-dark btn-sm" onclick="self.close();" > <i class="bi bi-x-lg"></i> 창닫기 </button> &nbsp;
</h6>
</div>
<form name="regform" id="regform" method="post" >
<input id="tablename" name="tablename" value='<?=$tablename?>'type=hidden >
<input id="col1" name="col1[]" type=hidden >
<input id="col2" name="col2[]" type=hidden >
<input id="col3" name="col3[]" type=hidden >
<input id="col4" name="col4[]" type=hidden >
<input id="col5" name="col5[]" type=hidden >
<input id="col6" name="col6[]" type=hidden >
<input id="col7" name="col7[]" type=hidden >
<input id="col8" name="col8[]" type=hidden >
<input id="col9" name="col9[]" type=hidden >
<input id="col10" name="col10[]" type=hidden >
<input id="col11" name="col11[]" type=hidden >
<input id="col12" name="col12[]" type=hidden >
<input id="col13" name="col13[]" type=hidden >
<div class="container-fluid">
<div class="card mb-2 mt-2">
<div class="card-body">
<div class="input-group p-2 mb-2">
<span style="margin-left:20px;font-size:20px;color:blue;"> ※ 해당셀 엑셀 내용을 복사 후 붙여넣기 </span>
</div>
<div class="d-flex mt-2 mb-2">
<div id="grid" style="width:1870px;">
</div>
</div>
</form>
</div>
</div>
</div>
</div> <!-- end of wrap -->
<!-- 페이지로딩 -->
<script>
// 페이지 로딩
$(document).ready(function(){
var loader = document.getElementById('loadingOverlay');
loader.style.display = 'none';
});
</script>
<script>
$(document).ready(function(){
$("#searchBtn").click(function(){ document.getElementById('board_form').submit(); });
var total_sum=0;
var count=0; // 전체줄수 카운트
var rowNum = 1700;
const data = [];
const columns = [];
const COL_COUNT = 13;
for(i=0;i<rowNum + 1;i++) {
row = { name: i };
for (let k = 0; k < COL_COUNT; k++ ) {
row[`col1`] = '' ;
row[`col2`] = '' ;
row[`col3`] = '' ;
row[`col4`] = '' ;
row[`col5`] = '' ;
row[`col6`] = '' ;
row[`col7`] = '' ;
row[`col8`] = '' ;
row[`col9`] = '' ;
row[`col10`] = '' ;
row[`col11`] = '' ;
row[`col12`] = '' ;
row[`col13`] = '' ;
}
data.push(row);
}
class CustomTextEditor {
constructor(props) {
const el = document.createElement('input');
const { maxLength } = props.columnInfo.editor.options;
el.type = 'text';
el.maxLength = maxLength;
el.value = String(props.value);
this.el = el;
}
getElement() {
return this.el;
}
getValue() {
return this.el.value;
}
mounted() {
this.el.select();
}
}
const grid = new tui.Grid({
el: document.getElementById('grid'),
data: data,
bodyHeight: 700,
columns: [
{
header: 'col1',
name: 'col1',
sortingType: 'desc',
sortable: true,
width:100,
editor: {
type: CustomTextEditor,
options: {
maxLength: 80
}
},
align: 'center'
},
{
header: 'col2',
name: 'col2',
width:200,
editor: {
type: CustomTextEditor,
options: {
maxLength: 80
}
},
align: 'center'
},
{
header: 'col3',
name: 'col3',
width:200,
editor: {
type: CustomTextEditor,
options: {
maxLength: 40
}
},
align: 'center'
},
{
header: 'col4',
name: 'col4',
width: 100,
editor: {
type: CustomTextEditor,
},
align: 'center'
},
{
header: 'col5',
name: 'col5',
width:100,
editor: {
type: CustomTextEditor,
options: {
maxLength: 40
}
},
align: 'center'
},
{
header: 'col6',
name: 'col6',
width:100,
editor: {
type: CustomTextEditor,
options: {
maxLength: 40
}
},
align: 'center'
},
{
header: 'col7',
name: 'col7',
width:100,
editor: {
type: CustomTextEditor,
options: {
maxLength: 40
}
},
align: 'center'
},
{
header: 'col8',
name: 'col8',
width:100,
editor: {
type: CustomTextEditor,
options: {
maxLength: 40
}
},
align: 'center'
},
{
header: 'col9',
name: 'col9',
width:200,
editor: {
type: CustomTextEditor,
options: {
maxLength: 40
}
},
align: 'center'
},
{
header: 'col10',
name: 'col10',
width:100,
editor: {
type: CustomTextEditor,
options: {
maxLength: 40
}
},
align: 'center'
},
{
header: 'col11',
name: 'col11',
width:100,
editor: {
type: CustomTextEditor,
options: {
maxLength: 40
}
},
align: 'center'
},
{
header: 'col12',
name: 'col12',
width:100,
editor: {
type: CustomTextEditor,
options: {
maxLength: 40
}
},
align: 'center'
},
{
header: 'col13',
name: 'col13',
width:100,
editor: {
type: CustomTextEditor,
options: {
maxLength: 40
}
},
align: 'center'
}
],
columnOptions: {
resizable: true
},
// rowHeaders: ['rowNum','checkbox'], // checkbox 형성
});
var Grid = tui.Grid; // or require('tui-grid')
Grid.applyTheme('default', {
cell: {
normal: {
background: '#fbfbfb',
border: '#e0e0e0',
showVerticalBorder: true
},
header: {
background: '#eee',
border: '#ccc',
showVerticalBorder: true
},
rowHeader: {
border: '#ccc',
showVerticalBorder: true
},
editable: {
background: '#fbfbfb'
},
selectedHeader: {
background: '#d8d8d8'
},
focused: {
border: '#418ed4'
},
disabled: {
text: '#b0b0b0'
}
}
});
function savegrid() {
let col1 = new Array();
let col2 = new Array();
let col3 = new Array();
let col4 = new Array();
let col5 = new Array();
let col6 = new Array();
let col7 = new Array();
let col8 = new Array();
let col9 = new Array();
let col10 = new Array();
let col11 = new Array();
let col12 = new Array();
let col13 = new Array();
// console.log(grid.getRowCount()); //삭제시 숫자가 정상적으로 줄어든다.
const MAXcount=grid.getRowCount() ;
let pushcount=0;
for(i=0;i<MAXcount;i++) { // grid.value는 중간중간 데이터가 빠진다. rowkey가 삭제/ 추가된 것을 반영못함.
if( grid.getValue(i, 'col1')!= null ) {
col1.push(swapcommatopipe(grid.getValue(i, 'col1')));
col2.push(swapcommatopipe(grid.getValue(i, 'col2')));
col3.push(swapcommatopipe(grid.getValue(i, 'col3')));
col4.push(swapcommatopipe(grid.getValue(i, 'col4')));
col5.push(swapcommatopipe(grid.getValue(i, 'col5')));
col6.push(swapcommatopipe(grid.getValue(i, 'col6')));
col7.push(swapcommatopipe(grid.getValue(i, 'col7')));
col8.push(swapcommatopipe(grid.getValue(i, 'col8')));
col9.push(swapcommatopipe(grid.getValue(i, 'col9')));
col10.push(swapcommatopipe(grid.getValue(i, 'col10')));
col11.push(swapcommatopipe(grid.getValue(i, 'col11')));
col12.push(swapcommatopipe(grid.getValue(i, 'col12')));
col13.push(swapcommatopipe(grid.getValue(i, 'col13')));
}
}
$('#col1').val(col1);
$('#col2').val(col2);
$('#col3').val(col3);
$('#col4').val(col4);
$('#col5').val(col5);
$('#col6').val(col6);
$('#col7').val(col7);
$('#col8').val(col8);
$('#col9').val(col9);
$('#col10').val(col10);
$('#col11').val(col11);
$('#col12').val(col12);
$('#col13').val(col13);
$.ajax({
url: "upload.php",
type: "post",
data: $("#regform").serialize(),
dataType:"json",
success : function( data ){
console.log( data);
Swal.fire(
'처리되었습니다.',
'데이터가 성공적으로 등록되었습니다.',
'success'
)
// setTimeout(function() {
// self.close();
// window.opener.location.reload(); // 부모창 새로고침
// }, 2000);
},
error : function( jqxhr , status , error ){
console.log( jqxhr , status , error );
}
});
}
$("#savegridBtn").click(function(){ savegrid(); });
});
function SearchEnter(){
if(event.keyCode == 13){
document.getElementById('board_form').submit();
}
}
function swapcommatopipe(strtmp)
{
let replaced_str = strtmp.replace(/,/g, '|');
return replaced_str;
}
</script>
</body>
</html>