Files
cpone_dashboard/cpone-dashboard/scripts/demo_live.sh
2026-04-30 14:27:01 +07:00

294 lines
12 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env bash
# demo_live.sh — Simulate live ongoing MCU activity for demo
#
# Usage:
# ./demo_live.sh # default: 1 action every 8 seconds
# ./demo_live.sh 3 # 1 action every 3 seconds (faster)
# ./demo_live.sh 15 # 1 action every 15 seconds (slower)
#
# What it simulates (cycles through 4 action types):
# A — New patient check-in for today (April 30, patients 811825)
# B — Station progress update for today's in-progress patients
# C — Doctor validates a yesterday resume (April 29)
# D — Publish result PDF (April 29 patient gets a file URL)
#
# Press Ctrl+C to stop.
set -euo pipefail
MCU_ID=9999
TODAY="2026-04-30"
SPEED="${1:-8}"
DB() { mysql -u admin -p'Sasone!102938' cpone_dashboard -sN -e "$1" 2>/dev/null; }
DB_EXEC() { mysql -u admin -p'Sasone!102938' cpone_dashboard -e "$1" 2>/dev/null; }
PDF_BASE_DIR="/home/one/project/one/dashboard-files/2026/04"
PDF_SOURCE="/home/one/project/one/dashboard-files/2024/09/R2409170003_resume_individu.pdf"
PDF_DB_PATH="2026/04"
NOW_TS() { date '+%Y-%m-%d %H:%M:%S'; }
LOG() { printf "[%s] %s\n" "$(date '+%H:%M:%S')" "$1"; }
# ── counters ──────────────────────────────────────────────────────────────────
action_cycle=0
# ── ACTION A: new check-in ────────────────────────────────────────────────────
action_checkin() {
local patient
patient=$(DB "
SELECT mp.Mcu_PatientPreregisterID
FROM mcu_patient mp
WHERE mp.Mcu_PatientMcuID = $MCU_ID
AND mp.Mcu_PatientPreregisterID NOT IN (
SELECT Mcu_CheckinoutPreregisterID
FROM mcu_checkinout
WHERE Mcu_CheckinoutMcuID = $MCU_ID
AND Mcu_CheckinoutDate = '$TODAY'
)
AND mp.Mcu_PatientPreregisterID BETWEEN 900811 AND 900825
ORDER BY mp.Mcu_PatientPreregisterID
LIMIT 1;
")
if [ -z "$patient" ]; then
LOG "⏩ Semua pasien hari ini sudah check-in"
return
fi
local pid=$patient
local oid=$patient
local name
name=$(DB "SELECT Mcu_PatientName FROM mcu_patient WHERE Mcu_PatientPreregisterID = $pid;")
local dept
dept=$(DB "SELECT Mcu_PatientDepartment FROM mcu_patient WHERE Mcu_PatientPreregisterID = $pid;")
local now_time
now_time=$(date '+%H:%M:%S')
DB_EXEC "
INSERT INTO mcu_checkinout
(Mcu_CheckinoutMcuID, Mcu_CheckinoutPreregisterID, Mcu_CheckinoutOrderID,
Mcu_CheckinoutDate, Mcu_CheckinoutInTime, Mcu_CheckinoutOutTime,
Mcu_CheckinoutIsActive, Mcu_CheckinoutSyncedAt)
VALUES
($MCU_ID, $pid, $oid, '$TODAY', '$now_time', NULL, 'Y', NOW());
"
LOG "✅ CHECK-IN │ $name$dept │ masuk pukul $now_time"
}
# ── ACTION B: station progress update ────────────────────────────────────────
action_station() {
# Pick a patient checked in today with at least one required station not yet done
# Station IDs that are part of the MCU package
local ALL_STATIONS="1,31,17,4,5,2,7,33"
local patient
patient=$(DB "
SELECT c.Mcu_CheckinoutPreregisterID
FROM mcu_checkinout c
WHERE c.Mcu_CheckinoutMcuID = $MCU_ID
AND c.Mcu_CheckinoutDate = '$TODAY'
AND (
SELECT COUNT(DISTINCT sp.Mcu_StationProgressStationID)
FROM mcu_station_progress sp
WHERE sp.Mcu_StationProgressPreregisterID = c.Mcu_CheckinoutPreregisterID
AND sp.Mcu_StationProgressMcuID = $MCU_ID
AND sp.Mcu_StationProgressStationID IN ($ALL_STATIONS)
) < 8
ORDER BY c.Mcu_CheckinoutPreregisterID
LIMIT 1;
")
if [ -z "$patient" ]; then
LOG "⏩ Semua station sudah diproses untuk pasien hari ini"
return
fi
local pid=$patient
local oid=$patient
local name
name=$(DB "SELECT Mcu_PatientName FROM mcu_patient WHERE Mcu_PatientPreregisterID = $pid;")
# Get next station not yet done (from the 8-station package)
local station_row
station_row=$(DB "
SELECT s.sid, s.sname, s.src
FROM (
SELECT 1 AS sid, 'Sample Station Phlebotomy' AS sname, 'lab' AS src UNION ALL
SELECT 31,'Sample Station Urine','lab' UNION ALL
SELECT 17,'Sample Station TB/BB','nonlab' UNION ALL
SELECT 4, 'Sample Station Treadmill','nonlab' UNION ALL
SELECT 5, 'Sample Station ECG','nonlab' UNION ALL
SELECT 2, 'Sample Station Rontgen','nonlab' UNION ALL
SELECT 7, 'Sample Station Pemeriksaan Fisik','nonlab' UNION ALL
SELECT 33,'Sample Station Visus dan Buta Warna','nonlab'
) s
WHERE s.sid NOT IN (
SELECT Mcu_StationProgressStationID
FROM mcu_station_progress
WHERE Mcu_StationProgressPreregisterID = $pid
AND Mcu_StationProgressMcuID = $MCU_ID
)
LIMIT 1;
")
if [ -z "$station_row" ]; then
return
fi
local sid sname src
sid=$(echo "$station_row" | cut -f1)
sname=$(echo "$station_row" | cut -f2)
src=$(echo "$station_row" | cut -f3)
local now_ts
now_ts=$(NOW_TS)
if [ "$src" = "lab" ]; then
DB_EXEC "
INSERT INTO mcu_station_progress
(Mcu_StationProgressOrderID, Mcu_StationProgressPreregisterID, Mcu_StationProgressMcuID,
Mcu_StationProgressStationID, Mcu_StationProgressStationName, Mcu_StationProgressSource,
Mcu_StationProgressCheckinDate, Mcu_StationProgressSamplingAt, Mcu_StationProgressReceiveAt,
Mcu_StationProgressProcessAt, Mcu_StationProgressDoneAt, Mcu_StationProgressSyncedAt)
VALUES
($oid, $pid, $MCU_ID, $sid, '$sname', 'lab',
'$TODAY',
DATE_SUB('$now_ts', INTERVAL 45 MINUTE),
DATE_SUB('$now_ts', INTERVAL 30 MINUTE),
DATE_SUB('$now_ts', INTERVAL 10 MINUTE),
'$now_ts', NOW())
ON DUPLICATE KEY UPDATE
Mcu_StationProgressDoneAt = '$now_ts',
Mcu_StationProgressSyncedAt = NOW();
"
else
DB_EXEC "
INSERT INTO mcu_station_progress
(Mcu_StationProgressOrderID, Mcu_StationProgressPreregisterID, Mcu_StationProgressMcuID,
Mcu_StationProgressStationID, Mcu_StationProgressStationName, Mcu_StationProgressSource,
Mcu_StationProgressCheckinDate, Mcu_StationProgressSamplingAt, Mcu_StationProgressReceiveAt,
Mcu_StationProgressProcessAt, Mcu_StationProgressDoneAt, Mcu_StationProgressSyncedAt)
VALUES
($oid, $pid, $MCU_ID, $sid, '$sname', 'nonlab',
'$TODAY', NULL, NULL,
DATE_SUB('$now_ts', INTERVAL 15 MINUTE),
'$now_ts', NOW())
ON DUPLICATE KEY UPDATE
Mcu_StationProgressDoneAt = '$now_ts',
Mcu_StationProgressSyncedAt = NOW();
"
fi
LOG "🏥 STATION │ $name$sname │ selesai"
}
# ── ACTION C: validate resume ─────────────────────────────────────────────────
action_validate() {
local patient
patient=$(DB "
SELECT rs.Mcu_PatientResumeStatusPreregisterID
FROM mcu_patient_resume_status rs
JOIN mcu_patient mp ON mp.Mcu_PatientPreregisterID = rs.Mcu_PatientResumeStatusPreregisterID
WHERE rs.Mcu_PatientResumeStatusMcuID = $MCU_ID
AND rs.Mcu_PatientResumeStatusValidated = 'N'
AND mp.Mcu_PatientPreregisterID BETWEEN 900676 AND 900750
ORDER BY rs.Mcu_PatientResumeStatusPreregisterID
LIMIT 1;
")
if [ -z "$patient" ]; then
LOG "⏩ Semua resume kemarin sudah divalidasi"
return
fi
local name
name=$(DB "SELECT Mcu_PatientName FROM mcu_patient WHERE Mcu_PatientPreregisterID = $patient;")
DB_EXEC "
UPDATE mcu_patient_resume_status
SET Mcu_PatientResumeStatusValidated = 'Y',
Mcu_PatientResumeStatusStatus = 'DONE',
Mcu_PatientResumeSyncedAt = NOW()
WHERE Mcu_PatientResumeStatusPreregisterID = $patient
AND Mcu_PatientResumeStatusMcuID = $MCU_ID;
"
LOG "✔ VALIDASI │ $name │ resume divalidasi dokter"
}
# ── ACTION D: publish PDF ─────────────────────────────────────────────────────
action_publish() {
local order_id
order_id=$(DB "
SELECT rs.Mcu_PatientResumeStatusPreregisterID
FROM mcu_patient_resume_status rs
WHERE rs.Mcu_PatientResumeStatusMcuID = $MCU_ID
AND rs.Mcu_PatientResumeStatusValidated = 'Y'
AND rs.Mcu_PatientResumeStatusPublished = 'N'
AND rs.Mcu_PatientResumeStatusPreregisterID BETWEEN 900676 AND 900825
AND EXISTS (
SELECT 1 FROM published_mcu_dashboard_sync p
WHERE p.Published_McuDasboardT_OrderHeaderID = rs.Mcu_PatientResumeStatusPreregisterID
AND (p.Published_McuDasboardFileUrl IS NULL OR p.Published_McuDasboardFileUrl = '')
)
ORDER BY rs.Mcu_PatientResumeStatusPreregisterID
LIMIT 1;
")
if [ -z "$order_id" ]; then
LOG "⏩ Tidak ada resume validated yang bisa dipublish saat ini"
return
fi
local name
name=$(DB "SELECT Mcu_PatientName FROM mcu_patient WHERE Mcu_PatientPreregisterID = $order_id;")
# seq number for PDF filename: use order_id offset
local seq=$(( order_id - 900000 ))
local fname="R2604D${seq}_resume_individu.pdf"
local fpath="$PDF_BASE_DIR/$fname"
local db_path="$PDF_DB_PATH/$fname"
# Copy PDF file
mkdir -p "$PDF_BASE_DIR"
cp "$PDF_SOURCE" "$fpath" 2>/dev/null || true
# Update database
DB_EXEC "
UPDATE published_mcu_dashboard_sync
SET Published_McuDasboardFileUrl = '$db_path',
Published_McuDasboardStatus = 'Y',
Published_McuDasboardLastUpdated = NOW()
WHERE Published_McuDasboardT_OrderHeaderID = $order_id;
UPDATE mcu_patient_resume_status
SET Mcu_PatientResumeStatusPublished = 'Y',
Mcu_PatientResumeSyncedAt = NOW()
WHERE Mcu_PatientResumeStatusPreregisterID = $order_id
AND Mcu_PatientResumeStatusMcuID = $MCU_ID;
"
LOG "📄 PUBLISH │ $name │ PDF → $db_path"
}
# ── main loop ─────────────────────────────────────────────────────────────────
echo "╔══════════════════════════════════════════════════════════════╗"
echo "║ CpOne — DEMO LIVE SIMULATION ║"
echo "║ MCU PROJECT DEMO 2026 │ ID: $MCU_ID │ Hari ini: $TODAY"
echo "╚══════════════════════════════════════════════════════════════╝"
echo ""
echo " Aksi: A=Check-in B=Station C=Validasi D=Publish PDF"
echo " Interval: ${SPEED}s │ Ctrl+C untuk berhenti"
echo ""
actions=(A B C D)
idx=0
while true; do
act="${actions[$((idx % 4))]}"
case "$act" in
A) action_checkin ;;
B) action_station ;;
C) action_validate ;;
D) action_publish ;;
esac
idx=$(( idx + 1 ))
sleep "$SPEED"
done