세금계산서 하기 전에 저장
This commit is contained in:
parent
7f44855bc1
commit
660e889e23
|
|
@ -67,7 +67,7 @@ export class TableHistoryController {
|
||||||
|
|
||||||
const whereClause = whereConditions.join(" AND ");
|
const whereClause = whereConditions.join(" AND ");
|
||||||
|
|
||||||
// 이력 조회 쿼리
|
// 이력 조회 쿼리 (log_id로 정렬 - 시간 데이터 불일치 문제 해결)
|
||||||
const historyQuery = `
|
const historyQuery = `
|
||||||
SELECT
|
SELECT
|
||||||
log_id,
|
log_id,
|
||||||
|
|
@ -84,7 +84,7 @@ export class TableHistoryController {
|
||||||
full_row_after
|
full_row_after
|
||||||
FROM ${logTableName}
|
FROM ${logTableName}
|
||||||
WHERE ${whereClause}
|
WHERE ${whereClause}
|
||||||
ORDER BY changed_at DESC
|
ORDER BY log_id DESC
|
||||||
LIMIT ${limitParam} OFFSET ${offsetParam}
|
LIMIT ${limitParam} OFFSET ${offsetParam}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
|
@ -196,7 +196,7 @@ export class TableHistoryController {
|
||||||
|
|
||||||
const whereClause = whereConditions.length > 0 ? `WHERE ${whereConditions.join(" AND ")}` : "";
|
const whereClause = whereConditions.length > 0 ? `WHERE ${whereConditions.join(" AND ")}` : "";
|
||||||
|
|
||||||
// 이력 조회 쿼리
|
// 이력 조회 쿼리 (log_id로 정렬 - 시간 데이터 불일치 문제 해결)
|
||||||
const historyQuery = `
|
const historyQuery = `
|
||||||
SELECT
|
SELECT
|
||||||
log_id,
|
log_id,
|
||||||
|
|
@ -213,7 +213,7 @@ export class TableHistoryController {
|
||||||
full_row_after
|
full_row_after
|
||||||
FROM ${logTableName}
|
FROM ${logTableName}
|
||||||
${whereClause}
|
${whereClause}
|
||||||
ORDER BY changed_at DESC
|
ORDER BY log_id DESC
|
||||||
LIMIT ${limitParam} OFFSET ${offsetParam}
|
LIMIT ${limitParam} OFFSET ${offsetParam}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1178,7 +1178,15 @@ export class DynamicFormService {
|
||||||
console.log("📝 실행할 DELETE SQL:", deleteQuery);
|
console.log("📝 실행할 DELETE SQL:", deleteQuery);
|
||||||
console.log("📊 SQL 파라미터:", [id]);
|
console.log("📊 SQL 파라미터:", [id]);
|
||||||
|
|
||||||
const result = await query<any>(deleteQuery, [id]);
|
// 🔥 트랜잭션 내에서 app.user_id 설정 후 DELETE 실행 (이력 트리거용)
|
||||||
|
const result = await transaction(async (client) => {
|
||||||
|
// 이력 트리거에서 사용할 사용자 정보 설정
|
||||||
|
if (userId) {
|
||||||
|
await client.query(`SET LOCAL app.user_id = '${userId}'`);
|
||||||
|
}
|
||||||
|
const res = await client.query(deleteQuery, [id]);
|
||||||
|
return res.rows;
|
||||||
|
});
|
||||||
|
|
||||||
console.log("✅ 서비스: 실제 테이블 삭제 성공:", result);
|
console.log("✅ 서비스: 실제 테이블 삭제 성공:", result);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,13 @@ import {
|
||||||
DialogTitle,
|
DialogTitle,
|
||||||
DialogDescription,
|
DialogDescription,
|
||||||
} from "@/components/ui/dialog";
|
} from "@/components/ui/dialog";
|
||||||
|
import {
|
||||||
|
ResizableDialog,
|
||||||
|
ResizableDialogContent,
|
||||||
|
ResizableDialogHeader,
|
||||||
|
ResizableDialogTitle,
|
||||||
|
ResizableDialogDescription,
|
||||||
|
} from "@/components/ui/resizable-dialog";
|
||||||
import { Button } from "@/components/ui/button";
|
import { Button } from "@/components/ui/button";
|
||||||
import { Input } from "@/components/ui/input";
|
import { Input } from "@/components/ui/input";
|
||||||
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
|
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
|
||||||
|
|
@ -137,7 +144,9 @@ export function TableHistoryModal({
|
||||||
|
|
||||||
const formatDate = (dateString: string) => {
|
const formatDate = (dateString: string) => {
|
||||||
try {
|
try {
|
||||||
return format(new Date(dateString), "yyyy년 MM월 dd일 HH:mm:ss", { locale: ko });
|
// DB는 UTC로 저장, 브라우저가 자동으로 로컬 시간(KST)으로 변환
|
||||||
|
const date = new Date(dateString);
|
||||||
|
return format(date, "yyyy년 MM월 dd일 HH:mm:ss", { locale: ko });
|
||||||
} catch {
|
} catch {
|
||||||
return dateString;
|
return dateString;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue