- URL 하드코딩 → .env APP_URL 기반 동적 URL로 변경 - DB 연결 하드코딩 → .env 기반으로 변경 - MySQL strict mode DATE 오류 수정
309 lines
14 KiB
PHP
309 lines
14 KiB
PHP
<?php
|
|
require_once($_SERVER['DOCUMENT_ROOT'] . "/session.php");
|
|
|
|
$debug = false ; // 디버그 모드 활성화 (운영 시 false로 변경)
|
|
|
|
$mode = isset($_REQUEST['mode']) ? $_REQUEST['mode'] : '';
|
|
$tablename = isset($_REQUEST['tablename']) ? $_REQUEST['tablename'] : '';
|
|
|
|
header("Content-Type: application/json");
|
|
|
|
require_once($_SERVER['DOCUMENT_ROOT'] . "/lib/mydb.php");
|
|
$pdo = db_connect();
|
|
|
|
include "_request.php";
|
|
|
|
// 디버그 정보를 응답 배열에 추가하는 함수
|
|
function sendDebugResponse($errorMessage, $debugInfo = []) {
|
|
global $debug;
|
|
$response = ["error" => $errorMessage];
|
|
if ($debug && !empty($debugInfo)) {
|
|
$response["debug"] = $debugInfo;
|
|
}
|
|
echo json_encode($response, JSON_UNESCAPED_UNICODE);
|
|
exit;
|
|
}
|
|
|
|
// ================= Model 처리 =================
|
|
if ($mode == "modify") {
|
|
$update_log = date("Y-m-d H:i:s") . " - " . $_SESSION["name"] . " 수정" . "
";
|
|
try {
|
|
$pdo->beginTransaction();
|
|
$sql = "UPDATE " . $DB . ".models SET
|
|
model_name = ?, major_category = ?, finishing_type = ?, description = ?, update_log = ?, guiderail_type = ?
|
|
WHERE model_id = ? LIMIT 1";
|
|
$stmh = $pdo->prepare($sql);
|
|
$params = [$model_name, $major_category, $finishing_type, $description, $update_log, $guiderail_type, $model_id]; // 마지막에 model_id 적용
|
|
$stmh->execute($params);
|
|
$pdo->commit();
|
|
} catch (PDOException $Exception) {
|
|
$pdo->rollBack();
|
|
sendDebugResponse($Exception->getMessage(), ["sql" => $sql, "params" => $params, "phase" => "model modify"]);
|
|
}
|
|
} elseif ($mode == "copy") {
|
|
// 복사 모드: 기존 모델 정보를 그대로 복사하여 새 모델로 INSERT
|
|
// (모델 수정 화면에서 읽어온 $row 값이 있다고 가정합니다)
|
|
$update_log = date("Y-m-d H:i:s") . " - " . $_SESSION["name"] . " 복사" . "
";
|
|
try {
|
|
$pdo->beginTransaction();
|
|
$sql = "INSERT INTO " . $DB . ".models
|
|
(model_name, major_category, finishing_type, description, update_log, guiderail_type )
|
|
VALUES (?, ?, ?, ?, ?, ? )";
|
|
$stmh = $pdo->prepare($sql);
|
|
$params = [$model_name, $major_category, $finishing_type, $description, $update_log, $guiderail_type];
|
|
$stmh->execute($params);
|
|
$pdo->commit();
|
|
} catch (PDOException $Exception) {
|
|
$pdo->rollBack();
|
|
sendDebugResponse($Exception->getMessage(), ["sql" => $sql, "params" => $params, "phase" => "model copy"]);
|
|
}
|
|
// 마지막 INSERT된 모델 ID 가져오기 (신규 모델 ID)
|
|
$sql = "SELECT model_id FROM " . $DB . ".models ORDER BY model_id DESC LIMIT 1";
|
|
try {
|
|
$stmh = $pdo->query($sql);
|
|
$rowNew = $stmh->fetch(PDO::FETCH_ASSOC);
|
|
$model_id = $rowNew["model_id"];
|
|
} catch (PDOException $Exception) {
|
|
sendDebugResponse($Exception->getMessage(), ["sql" => $sql, "phase" => "model id select"]);
|
|
}
|
|
} elseif ($mode == "insert") {
|
|
$update_log = date("Y-m-d H:i:s") . " - " . $_SESSION["name"] . " 등록" . "
";
|
|
try {
|
|
$pdo->beginTransaction();
|
|
$sql = "INSERT INTO " . $DB . ".models
|
|
(model_name, major_category, finishing_type, description, update_log, guiderail_type )
|
|
VALUES (?, ?, ?, ?, ?, ?)";
|
|
$stmh = $pdo->prepare($sql);
|
|
$params = [$model_name, $major_category, $finishing_type, $description, $update_log, $guiderail_type];
|
|
$stmh->execute($params);
|
|
$pdo->commit();
|
|
} catch (PDOException $Exception) {
|
|
$pdo->rollBack();
|
|
sendDebugResponse($Exception->getMessage(), ["sql" => $sql, "params" => $params, "phase" => "model insert"]);
|
|
}
|
|
// 마지막 INSERT된 모델 ID 가져오기
|
|
$sql = "SELECT model_id FROM " . $DB . ".models ORDER BY model_id DESC LIMIT 1";
|
|
try {
|
|
$stmh = $pdo->query($sql);
|
|
$rowNew = $stmh->fetch(PDO::FETCH_ASSOC);
|
|
$model_id = $rowNew["model_id"];
|
|
} catch (PDOException $Exception) {
|
|
sendDebugResponse($Exception->getMessage(), ["sql" => $sql, "phase" => "model id select"]);
|
|
}
|
|
} elseif ($mode == "delete") {
|
|
try {
|
|
$pdo->beginTransaction();
|
|
$sql = "UPDATE " . $DB . ".models SET is_deleted = 1 WHERE model_id = ?";
|
|
$stmh = $pdo->prepare($sql);
|
|
$params = [$model_id];
|
|
$stmh->execute($params);
|
|
$pdo->commit();
|
|
} catch (Exception $ex) {
|
|
$pdo->rollBack();
|
|
sendDebugResponse($ex->getMessage(), ["sql" => $sql, "params" => $params, "phase" => "model delete"]);
|
|
}
|
|
}
|
|
|
|
// ================= 2단계 부품(parts) 처리 =================
|
|
if(isset($_POST['part_name']) && is_array($_POST['part_name'])) {
|
|
try {
|
|
$pdo->beginTransaction();
|
|
|
|
if($mode == "copy") {
|
|
$partCount = count($_POST['part_name']);
|
|
$partMapping = [];
|
|
for($i = 0; $i < $partCount; $i++) {
|
|
$part_name = $_POST['part_name'][$i];
|
|
$spec = $_POST['spec'][$i];
|
|
$unit = $_POST['unit'][$i];
|
|
$quantity = $_POST['quantity'][$i];
|
|
$unitprice = $_POST['unitprice'][$i]; // 추가된 unitprice
|
|
$memo = $_POST['memo'][$i];
|
|
|
|
$sqlIns = "INSERT INTO " . $DB . ".parts
|
|
(model_id, part_name, spec, unit, quantity, unitprice, memo, is_deleted)
|
|
VALUES (?, ?, ?, ?, ?, ?, ?, 0)";
|
|
$stmtIns = $pdo->prepare($sqlIns);
|
|
$params = [$model_id, $part_name, $spec, $unit, $quantity, $unitprice, $memo];
|
|
$stmtIns->execute($params);
|
|
$newPartId = $pdo->lastInsertId();
|
|
|
|
$oldPartId = (isset($_POST['part_id'][$i]) && trim($_POST['part_id'][$i]) !== '')
|
|
? trim($_POST['part_id'][$i]) : '';
|
|
if($oldPartId !== '') {
|
|
$partMapping[$oldPartId] = $newPartId;
|
|
} else {
|
|
$partMapping[$i] = $newPartId;
|
|
}
|
|
}
|
|
} else {
|
|
$sql = "SELECT part_id FROM " . $DB . ".parts WHERE model_id = ? AND is_deleted = 0";
|
|
$stmt = $pdo->prepare($sql);
|
|
$stmt->execute([$model_id]);
|
|
$existingParts = $stmt->fetchAll(PDO::FETCH_COLUMN);
|
|
|
|
$submittedParts = [];
|
|
if (isset($_POST['part_id']) && is_array($_POST['part_id'])) {
|
|
foreach ($_POST['part_id'] as $pid) {
|
|
if (trim($pid) !== '') {
|
|
$submittedParts[] = $pid;
|
|
}
|
|
}
|
|
}
|
|
|
|
foreach ($existingParts as $existingPartId) {
|
|
if (!in_array($existingPartId, $submittedParts)) {
|
|
$sqlDel = "UPDATE " . $DB . ".parts SET is_deleted = 1 WHERE part_id = ? LIMIT 1";
|
|
$stmtDel = $pdo->prepare($sqlDel);
|
|
$stmtDel->execute([$existingPartId]);
|
|
}
|
|
}
|
|
|
|
$partCount = count($_POST['part_name']);
|
|
for($i = 0; $i < $partCount; $i++) {
|
|
$part_id = isset($_POST['part_id'][$i]) ? trim($_POST['part_id'][$i]) : '';
|
|
$part_name = $_POST['part_name'][$i];
|
|
$spec = $_POST['spec'][$i];
|
|
$unit = $_POST['unit'][$i];
|
|
$quantity = $_POST['quantity'][$i];
|
|
$unitprice = $_POST['unitprice'][$i]; // 추가된 unitprice
|
|
$memo = $_POST['memo'][$i];
|
|
|
|
if($part_id != '') {
|
|
$sqlUpd = "UPDATE " . $DB . ".parts
|
|
SET part_name = ?, spec = ?, unit = ?, quantity = ?, unitprice = ?, memo = ?, is_deleted = 0
|
|
WHERE part_id = ? LIMIT 1";
|
|
$stmtUpd = $pdo->prepare($sqlUpd);
|
|
$params = [$part_name, $spec, $unit, $quantity, $unitprice, $memo, $part_id];
|
|
$stmtUpd->execute($params);
|
|
} else {
|
|
$sqlIns = "INSERT INTO " . $DB . ".parts
|
|
(model_id, part_name, spec, unit, quantity, unitprice, memo, is_deleted)
|
|
VALUES (?, ?, ?, ?, ?, ?, ?, 0)";
|
|
$stmtIns = $pdo->prepare($sqlIns);
|
|
$params = [$model_id, $part_name, $spec, $unit, $quantity, $unitprice, $memo];
|
|
$stmtIns->execute($params);
|
|
}
|
|
}
|
|
}
|
|
$pdo->commit();
|
|
} catch (PDOException $e) {
|
|
$pdo->rollBack();
|
|
sendDebugResponse($e->getMessage(), ["phase" => "parts processing"]);
|
|
}
|
|
}
|
|
|
|
// ================= 3단계 하위 부품(parts_sub) 처리 =================
|
|
// 하위 부품 데이터는 각 부품별로 제출되며, 부모 부품 ID는 parent_part_id[] 배열로 전달됨
|
|
if(isset($_POST['subpart_name']) && is_array($_POST['subpart_name'])) {
|
|
try {
|
|
$pdo->beginTransaction();
|
|
|
|
if($mode == "copy") {
|
|
$subCount = count($_POST['subpart_name']);
|
|
for($i = 0; $i < $subCount; $i++) {
|
|
$subpart_name = $_POST['subpart_name'][$i] ?? '';
|
|
$material = $_POST['material'][$i] ?? '';
|
|
$bendSum = $_POST['bendSum'][$i] ?? '';
|
|
$plateSum = $_POST['plateSum'][$i] ?? '';
|
|
$finalSum = $_POST['finalSum'][$i] ?? '';
|
|
$unitPrice = $_POST['unitPrice'][$i] ?? '';
|
|
$computedPrice = $_POST['computedPrice'][$i] ?? '';
|
|
$quantity = $_POST['quantity'][$i] ?? '';
|
|
$lineTotal = $_POST['lineTotal'][$i] ?? '';
|
|
$image_url = $_POST['image_url'][$i] ?? '';
|
|
$oldParentPartId = isset($_POST['parent_part_id'][$i]) ? $_POST['parent_part_id'][$i] : '';
|
|
|
|
if(empty($oldParentPartId) || !isset($partMapping[$oldParentPartId])) {
|
|
continue;
|
|
}
|
|
$newParentPartId = $partMapping[$oldParentPartId];
|
|
|
|
$sqlIns = "INSERT INTO " . $DB . ".parts_sub
|
|
(part_id, subpart_name, material, bendSum, plateSum, finalSum, unitPrice, computedPrice, quantity, lineTotal, image_url, is_deleted)
|
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 0)";
|
|
$stmtIns = $pdo->prepare($sqlIns);
|
|
$params = [$newParentPartId, $subpart_name, $material, $bendSum, $plateSum, $finalSum, $unitPrice, $computedPrice, $quantity, $lineTotal, $image_url];
|
|
$stmtIns->execute($params);
|
|
}
|
|
} else {
|
|
$sql = "SELECT subpart_id FROM " . $DB . ".parts_sub
|
|
WHERE part_id IN (SELECT part_id FROM " . $DB . ".parts WHERE model_id = ? AND is_deleted = 0)
|
|
AND is_deleted = 0";
|
|
$stmt = $pdo->prepare($sql);
|
|
$stmt->execute([$model_id]);
|
|
$existingSubparts = $stmt->fetchAll(PDO::FETCH_COLUMN);
|
|
|
|
$submittedSubparts = [];
|
|
if(isset($_POST['subpart_id']) && is_array($_POST['subpart_id'])) {
|
|
foreach ($_POST['subpart_id'] as $spid) {
|
|
if(trim($spid) !== '') {
|
|
$submittedSubparts[] = $spid;
|
|
}
|
|
}
|
|
}
|
|
|
|
foreach ($existingSubparts as $existingSubpartId) {
|
|
if (!in_array($existingSubpartId, $submittedSubparts)) {
|
|
$sqlDel = "UPDATE " . $DB . ".parts_sub SET is_deleted = 1 WHERE subpart_id = ? LIMIT 1";
|
|
$stmtDel = $pdo->prepare($sqlDel);
|
|
$stmtDel->execute([$existingSubpartId]);
|
|
}
|
|
}
|
|
|
|
$subCount = count($_POST['subpart_name']);
|
|
for($i = 0; $i < $subCount; $i++) {
|
|
$subpart_id = isset($_POST['subpart_id'][$i]) ? trim($_POST['subpart_id'][$i]) : '';
|
|
$subpart_name = $_POST['subpart_name'][$i] ?? '';
|
|
$material = $_POST['material'][$i] ?? '';
|
|
$bendSum = $_POST['bendSum'][$i] ?? '';
|
|
$plateSum = $_POST['plateSum'][$i] ?? '';
|
|
$finalSum = $_POST['finalSum'][$i] ?? '';
|
|
$unitPrice = $_POST['unitPrice'][$i] ?? '';
|
|
$computedPrice = $_POST['computedPrice'][$i] ?? '';
|
|
$quantity = $_POST['quantity'][$i] ?? '';
|
|
$lineTotal = $_POST['lineTotal'][$i] ?? '';
|
|
$image_url = $_POST['image_url'][$i] ?? '' ;
|
|
$parent_part_id = isset($_POST['parent_part_id'][$i]) ? $_POST['parent_part_id'][$i] : '';
|
|
|
|
if(empty($parent_part_id)) {
|
|
if($debug) {
|
|
error_log("Skipping subpart at index $i: missing parent_part_id");
|
|
}
|
|
continue;
|
|
}
|
|
|
|
if($subpart_id != '') {
|
|
$sqlUpd = "UPDATE " . $DB . ".parts_sub
|
|
SET subpart_name = ?, material = ?, bendSum = ?, plateSum = ?, finalSum = ?, unitPrice = ?, computedPrice = ?, quantity = ?, lineTotal = ?, image_url = ?, is_deleted = 0
|
|
WHERE subpart_id = ? LIMIT 1";
|
|
$stmtUpd = $pdo->prepare($sqlUpd);
|
|
$params = [$subpart_name, $material, $bendSum, $plateSum, $finalSum, $unitPrice, $computedPrice, $quantity, $lineTotal, $image_url, $subpart_id];
|
|
$stmtUpd->execute($params);
|
|
} else {
|
|
$sqlIns = "INSERT INTO " . $DB . ".parts_sub
|
|
(part_id, subpart_name, material, bendSum, plateSum, finalSum, unitPrice, computedPrice, quantity, lineTotal, image_url, is_deleted)
|
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 0)";
|
|
$stmtIns = $pdo->prepare($sqlIns);
|
|
$params = [$parent_part_id, $subpart_name, $material, $bendSum, $plateSum, $finalSum, $unitPrice, $computedPrice, $quantity, $lineTotal, $image_url];
|
|
$stmtIns->execute($params);
|
|
}
|
|
}
|
|
}
|
|
$pdo->commit();
|
|
} catch (PDOException $e) {
|
|
$pdo->rollBack();
|
|
sendDebugResponse($e->getMessage(), ["phase" => "parts_sub processing"]);
|
|
}
|
|
}
|
|
|
|
|
|
$data = [
|
|
'model_id' => $model_id,
|
|
'mode' => $mode,
|
|
'subpart_name' => $_POST['subpart_name']
|
|
];
|
|
|
|
echo json_encode($data, JSON_UNESCAPED_UNICODE);
|
|
?>
|