feat: pop-card-list-v2 설정 패널 MES 간소화 + Core Binding + 내 작업 표시 모드
MES 고정 구조에 맞게 설정 패널을 간소화하고, 작업상세 내장 모달과
작업자 기반 카드 필터링 기능을 추가한다.
[설정 패널 간소화]
- 3탭(데이터/디자인/동작) -> 2탭(정보/동작)으로 축소
- "정보" 탭: 데이터 소스, 카드 구성, 클릭 동작을 읽기 전용 요약으로 표시
- "동작" 탭: cardClickAction 선택(none/modal-open/built-in-work-detail)
+ 내 작업 표시 + 고급 설정(필터 전 숨김, 기본 표시 수) 유지
- PopWorkDetailConfigPanel을 카드 설정에서 분리
(작업상세 컴포넌트 자체 설정 패널에서 관리)
[Core Binding 내장 모달]
- cardClickAction="built-in-work-detail" 시 내부 Dialog로
PopWorkDetail 직접 렌더링, parentRow를 prop으로 전달
- LazyPopWorkDetail dynamic import로 성능 최적화
- in_progress 상태 카드만 상세 모달 열림
[카드 열 수 선택]
- 정보 탭 상단에 1열/2열/3열/4열 버튼 UI 추가
- gridColumns 설정 즉시 반영
[내 작업 표시 3모드]
- 전체 보기: 모든 카드 동등 표시
- 우선 표시: 내 카드 상단 + 다른 카드 비활성화(기존 동작)
- 내 작업만: worker 컬럼 기준 내 카드만 표시, 나머지 숨김
- ownerFilterMode("priority"|"only") 타입 추가, 컬럼 선택 드롭다운
제거하고 worker 고정 토글로 단순화
This commit is contained in:
@@ -872,7 +872,7 @@ export const saveResult = async (
|
||||
[wo_id, prevSeq, companyCode]
|
||||
);
|
||||
if (prevProcess.rowCount > 0) {
|
||||
prevGoodQty = prevProcess.rows[0].total_good;
|
||||
prevGoodQty = parseInt(prevProcess.rows[0].total_good, 10) || 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -887,8 +887,8 @@ export const saveResult = async (
|
||||
[wo_id, seq_no, companyCode]
|
||||
);
|
||||
|
||||
const totalInput = siblingCheck.rows[0].total_input;
|
||||
const incompleteCount = parseInt(siblingCheck.rows[0].incomplete_count, 10);
|
||||
const totalInput = parseInt(siblingCheck.rows[0].total_input, 10) || 0;
|
||||
const incompleteCount = parseInt(siblingCheck.rows[0].incomplete_count, 10) || 0;
|
||||
const remainingAcceptable = prevGoodQty - totalInput;
|
||||
|
||||
// 모든 분할 행 완료 + 잔여 접수가능 0 -> 원본(마스터)도 completed
|
||||
@@ -1111,7 +1111,7 @@ export const confirmResult = async (
|
||||
[wo_id, prevSeq, companyCode]
|
||||
);
|
||||
if (prevProcess.rowCount > 0) {
|
||||
prevGoodQty = prevProcess.rows[0].total_good;
|
||||
prevGoodQty = parseInt(prevProcess.rows[0].total_good, 10) || 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1125,8 +1125,8 @@ export const confirmResult = async (
|
||||
[wo_id, seq_no, companyCode]
|
||||
);
|
||||
|
||||
const totalInput = siblingCheck.rows[0].total_input;
|
||||
const incompleteCount = parseInt(siblingCheck.rows[0].incomplete_count, 10);
|
||||
const totalInput = parseInt(siblingCheck.rows[0].total_input, 10) || 0;
|
||||
const incompleteCount = parseInt(siblingCheck.rows[0].incomplete_count, 10) || 0;
|
||||
const remainingAcceptable = prevGoodQty - totalInput;
|
||||
|
||||
if (incompleteCount === 0 && remainingAcceptable <= 0) {
|
||||
@@ -1183,7 +1183,8 @@ export const getResultHistory = async (
|
||||
|
||||
try {
|
||||
const companyCode = req.user!.companyCode;
|
||||
const { work_order_process_id } = req.query;
|
||||
const rawWopId = req.query.work_order_process_id;
|
||||
const work_order_process_id = Array.isArray(rawWopId) ? rawWopId[0] : rawWopId;
|
||||
|
||||
if (!work_order_process_id) {
|
||||
return res.status(400).json({
|
||||
@@ -1270,7 +1271,8 @@ export const getAvailableQty = async (req: AuthenticatedRequest, res: Response)
|
||||
const pool = getPool();
|
||||
try {
|
||||
const companyCode = req.user!.companyCode;
|
||||
const { work_order_process_id } = req.query;
|
||||
const rawWopId = req.query.work_order_process_id;
|
||||
const work_order_process_id = Array.isArray(rawWopId) ? rawWopId[0] : rawWopId;
|
||||
|
||||
if (!work_order_process_id) {
|
||||
return res.status(400).json({
|
||||
@@ -1304,7 +1306,7 @@ export const getAvailableQty = async (req: AuthenticatedRequest, res: Response)
|
||||
AND parent_process_id IS NOT NULL`,
|
||||
[wo_id, seq_no, companyCode]
|
||||
);
|
||||
const myInputQty = totalAccepted.rows[0].total_input;
|
||||
const myInputQty = parseInt(totalAccepted.rows[0].total_input, 10) || 0;
|
||||
|
||||
// 앞공정 양품+특채 합산
|
||||
let prevGoodQty = instrQty;
|
||||
@@ -1317,7 +1319,7 @@ export const getAvailableQty = async (req: AuthenticatedRequest, res: Response)
|
||||
[wo_id, prevSeq, companyCode]
|
||||
);
|
||||
if (prevProcess.rowCount > 0) {
|
||||
prevGoodQty = prevProcess.rows[0].total_good;
|
||||
prevGoodQty = parseInt(prevProcess.rows[0].total_good, 10) || 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1427,7 +1429,7 @@ export const acceptProcess = async (req: AuthenticatedRequest, res: Response) =>
|
||||
[row.wo_id, prevSeq, companyCode]
|
||||
);
|
||||
if (prevProcess.rowCount > 0) {
|
||||
prevGoodQty = prevProcess.rows[0].total_good;
|
||||
prevGoodQty = parseInt(prevProcess.rows[0].total_good, 10) || 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1517,7 +1519,7 @@ export const cancelAccept = async (
|
||||
|
||||
const current = await pool.query(
|
||||
`SELECT id, status, input_qty, total_production_qty, result_status,
|
||||
parent_process_id, wo_id, seq_no
|
||||
parent_process_id, wo_id, seq_no, process_name
|
||||
FROM work_order_process
|
||||
WHERE id = $1 AND company_code = $2`,
|
||||
[work_order_process_id, companyCode]
|
||||
|
||||
Reference in New Issue
Block a user