초기 커밋: 5130 레거시 시스템
- URL 하드코딩 → .env APP_URL 기반 동적 URL로 변경 - DB 연결 하드코딩 → .env 기반으로 변경 - MySQL strict mode DATE 오류 수정
This commit is contained in:
21
instock/_request.php
Normal file
21
instock/_request.php
Normal 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
21
instock/_row.php
Normal 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'] : ''; // 품목코드 모터,샤프트 등 입고물품에 대한 검색기능 코드
|
||||
?>
|
||||
390
instock/common/JS_instock.php
Normal file
390
instock/common/JS_instock.php
Normal 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> " +
|
||||
"<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> " +
|
||||
"<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> " +
|
||||
"<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
54
instock/common/head.php
Normal 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); // 모든 공백 제거
|
||||
|
||||
|
||||
?>
|
||||
55
instock/common/instock_btn.php
Normal file
55
instock/common/instock_btn.php
Normal 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>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
99
instock/common/viewJS.php
Normal file
99
instock/common/viewJS.php
Normal 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
181
instock/commonDriveLoad.php
Normal 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
32
instock/commonRequest.php
Normal 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
135
instock/css/style.css
Normal 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;
|
||||
}
|
||||
112
instock/css/style_inspection.css
Normal file
112
instock/css/style_inspection.css
Normal 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
43
instock/fetch_code.php
Normal 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']);
|
||||
}
|
||||
?>
|
||||
106
instock/fetch_inout_data.php
Normal file
106
instock/fetch_inout_data.php
Normal 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>
|
||||
|
||||
255
instock/fetch_inout_history.php
Normal file
255
instock/fetch_inout_history.php
Normal 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;">×</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>
|
||||
455
instock/fetch_inspection.php
Normal file
455
instock/fetch_inspection.php
Normal 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">
|
||||
× 닫기
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
24
instock/fetch_lotnum.php
Normal file
24
instock/fetch_lotnum.php
Normal 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
282
instock/fileManager.js
Normal 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> " +
|
||||
"<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> " +
|
||||
"<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> " +
|
||||
"<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(
|
||||
""
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
43
instock/func_statistics.php
Normal file
43
instock/func_statistics.php
Normal 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
1031
instock/i_EGI155.php
Normal file
File diff suppressed because it is too large
Load Diff
917
instock/i_Fireproof_sealings.php
Normal file
917
instock/i_Fireproof_sealings.php
Normal 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" > 수 </span>
|
||||
<span class="text-dark me-1 fs-2" > 입 </span>
|
||||
<span class="text-dark me-1 fs-2" > 검 </span>
|
||||
<span class="text-dark me-1 fs-2" > 사 </span>
|
||||
<span class="text-dark me-1 fs-2" > </span>
|
||||
<span class="text-dark me-1 fs-2" > 성 </span>
|
||||
<span class="text-dark me-1 fs-2" > 적 </span>
|
||||
<span class="text-dark me-1 fs-2" > 서 </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">
|
||||
</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
982
instock/i_GIplate.php
Normal 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" > 수 </span>
|
||||
<span class="text-dark me-1 fs-2" > 입 </span>
|
||||
<span class="text-dark me-1 fs-2" > 검 </span>
|
||||
<span class="text-dark me-1 fs-2" > 사 </span>
|
||||
<span class="text-dark me-1 fs-2" > </span>
|
||||
<span class="text-dark me-1 fs-2" > 성 </span>
|
||||
<span class="text-dark me-1 fs-2" > 적 </span>
|
||||
<span class="text-dark me-1 fs-2" > 서 </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">
|
||||
</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
975
instock/i_SUScoil.php
Normal 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" > 수 </span>
|
||||
<span class="text-dark me-1 fs-2" > 입 </span>
|
||||
<span class="text-dark me-1 fs-2" > 검 </span>
|
||||
<span class="text-dark me-1 fs-2" > 사 </span>
|
||||
<span class="text-dark me-1 fs-2" > </span>
|
||||
<span class="text-dark me-1 fs-2" > 성 </span>
|
||||
<span class="text-dark me-1 fs-2" > 적 </span>
|
||||
<span class="text-dark me-1 fs-2" > 서 </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">
|
||||
</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
1021
instock/i_SUSplate.php
Normal file
File diff suppressed because it is too large
Load Diff
1030
instock/i_angle.php
Normal file
1030
instock/i_angle.php
Normal file
File diff suppressed because it is too large
Load Diff
1036
instock/i_anglebottom.php
Normal file
1036
instock/i_anglebottom.php
Normal file
File diff suppressed because it is too large
Load Diff
1352
instock/i_antifireglass.php
Normal file
1352
instock/i_antifireglass.php
Normal file
File diff suppressed because it is too large
Load Diff
978
instock/i_bendingcoil.php
Normal file
978
instock/i_bendingcoil.php
Normal 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" > 수 </span>
|
||||
<span class="text-dark me-1 fs-2" > 입 </span>
|
||||
<span class="text-dark me-1 fs-2" > 검 </span>
|
||||
<span class="text-dark me-1 fs-2" > 사 </span>
|
||||
<span class="text-dark me-1 fs-2" > </span>
|
||||
<span class="text-dark me-1 fs-2" > 성 </span>
|
||||
<span class="text-dark me-1 fs-2" > 적 </span>
|
||||
<span class="text-dark me-1 fs-2" > 서 </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">
|
||||
</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
925
instock/i_bracket.php
Normal 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" > 수 </span>
|
||||
<span class="text-dark me-1 fs-2" > 입 </span>
|
||||
<span class="text-dark me-1 fs-2" > 검 </span>
|
||||
<span class="text-dark me-1 fs-2" > 사 </span>
|
||||
<span class="text-dark me-1 fs-2" > </span>
|
||||
<span class="text-dark me-1 fs-2" > 성 </span>
|
||||
<span class="text-dark me-1 fs-2" > 적 </span>
|
||||
<span class="text-dark me-1 fs-2" > 서 </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">
|
||||
</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
951
instock/i_cerakwool.php
Normal 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" > 수 </span>
|
||||
<span class="text-dark me-1 fs-2" > 입 </span>
|
||||
<span class="text-dark me-1 fs-2" > 검 </span>
|
||||
<span class="text-dark me-1 fs-2" > 사 </span>
|
||||
<span class="text-dark me-1 fs-2" > </span>
|
||||
<span class="text-dark me-1 fs-2" > 성 </span>
|
||||
<span class="text-dark me-1 fs-2" > 적 </span>
|
||||
<span class="text-dark me-1 fs-2" > 서 </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">
|
||||
</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
849
instock/i_controller.php
Normal 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" > 수 </span>
|
||||
<span class="text-dark me-1 fs-2" > 입 </span>
|
||||
<span class="text-dark me-1 fs-2" > 검 </span>
|
||||
<span class="text-dark me-1 fs-2" > 사 </span>
|
||||
<span class="text-dark me-1 fs-2" > </span>
|
||||
<span class="text-dark me-1 fs-2" > 성 </span>
|
||||
<span class="text-dark me-1 fs-2" > 적 </span>
|
||||
<span class="text-dark me-1 fs-2" > 서 </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">
|
||||
</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
1125
instock/i_fiber.php
Normal file
File diff suppressed because it is too large
Load Diff
833
instock/i_fireproofWire.php
Normal file
833
instock/i_fireproofWire.php
Normal 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" > 수 </span>
|
||||
<span class="text-dark me-1 fs-2" > 입 </span>
|
||||
<span class="text-dark me-1 fs-2" > 검 </span>
|
||||
<span class="text-dark me-1 fs-2" > 사 </span>
|
||||
<span class="text-dark me-1 fs-2" > </span>
|
||||
<span class="text-dark me-1 fs-2" > 성 </span>
|
||||
<span class="text-dark me-1 fs-2" > 적 </span>
|
||||
<span class="text-dark me-1 fs-2" > 서 </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">
|
||||
</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
888
instock/i_motor.php
Normal 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" > 수 </span>
|
||||
<span class="text-dark me-1 fs-2" > 입 </span>
|
||||
<span class="text-dark me-1 fs-2" > 검 </span>
|
||||
<span class="text-dark me-1 fs-2" > 사 </span>
|
||||
<span class="text-dark me-1 fs-2" > </span>
|
||||
<span class="text-dark me-1 fs-2" > 성 </span>
|
||||
<span class="text-dark me-1 fs-2" > 적 </span>
|
||||
<span class="text-dark me-1 fs-2" > 서 </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">
|
||||
</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
984
instock/i_platesteel.php
Normal 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" > 수 </span>
|
||||
<span class="text-dark me-1 fs-2" > 입 </span>
|
||||
<span class="text-dark me-1 fs-2" > 검 </span>
|
||||
<span class="text-dark me-1 fs-2" > 사 </span>
|
||||
<span class="text-dark me-1 fs-2" > </span>
|
||||
<span class="text-dark me-1 fs-2" > 성 </span>
|
||||
<span class="text-dark me-1 fs-2" > 적 </span>
|
||||
<span class="text-dark me-1 fs-2" > 서 </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">
|
||||
</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
974
instock/i_pole.php
Normal 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" > 수 </span>
|
||||
<span class="text-dark me-1 fs-2" > 입 </span>
|
||||
<span class="text-dark me-1 fs-2" > 검 </span>
|
||||
<span class="text-dark me-1 fs-2" > 사 </span>
|
||||
<span class="text-dark me-1 fs-2" > </span>
|
||||
<span class="text-dark me-1 fs-2" > 성 </span>
|
||||
<span class="text-dark me-1 fs-2" > 적 </span>
|
||||
<span class="text-dark me-1 fs-2" > 서 </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">
|
||||
</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
1324
instock/i_recpipe.php
Normal file
File diff suppressed because it is too large
Load Diff
1019
instock/i_shaft.php
Normal file
1019
instock/i_shaft.php
Normal file
File diff suppressed because it is too large
Load Diff
1174
instock/i_sillica.php
Normal file
1174
instock/i_sillica.php
Normal file
File diff suppressed because it is too large
Load Diff
926
instock/i_slatcoil.php
Normal file
926
instock/i_slatcoil.php
Normal 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" > 수 </span>
|
||||
<span class="text-dark me-1 fs-2" > 입 </span>
|
||||
<span class="text-dark me-1 fs-2" > 검 </span>
|
||||
<span class="text-dark me-1 fs-2" > 사 </span>
|
||||
<span class="text-dark me-1 fs-2" > </span>
|
||||
<span class="text-dark me-1 fs-2" > 성 </span>
|
||||
<span class="text-dark me-1 fs-2" > 적 </span>
|
||||
<span class="text-dark me-1 fs-2" > 서 </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">
|
||||
</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
1176
instock/i_wire.php
Normal file
File diff suppressed because it is too large
Load Diff
1030
instock/i_wireDaehan.php
Normal file
1030
instock/i_wireDaehan.php
Normal file
File diff suppressed because it is too large
Load Diff
133
instock/insert.php
Normal file
133
instock/insert.php
Normal 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 . "
";
|
||||
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 . "
";
|
||||
// 데이터 삽입
|
||||
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
51
instock/insert_iList.php
Normal 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 . "
";
|
||||
$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
24
instock/instock_table.php
Normal 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
753
instock/list.php
Normal 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">×</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>
|
||||
<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 ?>
|
||||
<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?>" > ~
|
||||
<input type="date" id="todate" name="todate" class="form-control me-1" style="width:100px;" value="<?=$todate?>" >
|
||||
<div class="inputWrap">
|
||||
<input type="text" id="search" name="search" value="<?=$search?>" onkeydown="JavaScript:SearchEnter();" autocomplete="off" class="form-control" style="width:150px;" >
|
||||
<button class="btnClear"></button>
|
||||
</div>
|
||||
|
||||
<div id="autocomplete-list">
|
||||
</div>
|
||||
|
||||
<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
366
instock/list_sheet.php
Normal 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">×</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>
|
||||
<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 ?>
|
||||
<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?>" > ~
|
||||
<input type="date" id="todate" name="todate" class="form-control me-1" style="width:100px;" value="<?=$todate?>" >
|
||||
<div class="inputWrap">
|
||||
<input type="text" id="search" name="search" value="<?=$search?>" onkeydown="JavaScript:SearchEnter();" autocomplete="off" class="form-control" style="width:150px;" >
|
||||
<button class="btnClear"></button>
|
||||
</div>
|
||||
|
||||
<div id="autocomplete-list">
|
||||
</div>
|
||||
|
||||
<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
416
instock/list_stock.php
Normal 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">×</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>
|
||||
<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 ?>
|
||||
<input type="date" id="fromdate" name="fromdate" class="form-control" style="width:100px;" value="<?=$fromdate?>" > ~
|
||||
<input type="date" id="todate" name="todate" class="form-control me-1" style="width:100px;" value="<?=$todate?>" >
|
||||
<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="품목코드/품목명 검색" >
|
||||
<button class="btnClear"></button>
|
||||
</div>
|
||||
|
||||
<div id="autocomplete-list">
|
||||
</div>
|
||||
|
||||
<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
1
instock/lotnum.txt
Normal file
@@ -0,0 +1 @@
|
||||
250723-05
|
||||
44
instock/lotnum_generator.php
Normal file
44
instock/lotnum_generator.php
Normal 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
20
instock/save_lotnum.php
Normal 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
198
instock/statistics.php
Normal 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>
|
||||
|
||||
<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?>" > ~
|
||||
<input type="date" id="todate" name="todate" size="12" class="form-control" style="width:100px;" value="<?=$todate?>" > </span>
|
||||
|
||||
|
||||
<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
134
instock/upload.php
Normal 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
455
instock/uploadgrid.php
Normal 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?>
|
||||
<button type="button" class="btn btn-dark btn-sm" id="savegridBtn"> <i class="bi bi-check-square-fill"></i> 일괄등록 실행 </button>
|
||||
<button type="button" class="btn btn-dark btn-sm" onclick="self.close();" > <i class="bi bi-x-lg"></i> 창닫기 </button>
|
||||
|
||||
</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>
|
||||
Reference in New Issue
Block a user