Files
DashBoard/openspec/changes/archive/2026-01-29-realtime-equipment-status/data-investigation.sql
beabigegg f823d8cefd feat: 新增設備即時狀態快取與合併查詢 API
- 新增 realtime_equipment_cache 模組,從 DW_MES_EQUIPMENTSTATUS_WIP_V 同步設備即時狀態
- 新增 resource_service 合併三層快取(resource-cache、realtime-equipment、workcenter-mapping)
- 新增 /api/resource/status/* API 端點提供設備狀態查詢
- 更新 health_routes 顯示 realtime equipment cache 狀態
- 更新 portal.html 顯示設備即時快取資訊
- 重構 resource_status.html 前端頁面
- 新增相關 OpenSpec 規格文件與測試

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 07:51:30 +08:00

313 lines
13 KiB
SQL
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.

-- ============================================================
-- 資料調查 SQL - realtime-equipment-status
-- 執行環境Oracle (DWH)
-- 注意:所有表名需加上 DWH. schema 前綴
-- ============================================================
-- ============================================================
-- 1. 狀態值對應調查
-- 比較 EQUIPMENTSTATUS_WIP_V 與 RESOURCESTATUS 的狀態值域
-- ============================================================
-- 1.1 EQUIPMENTSTATUS_WIP_V 的狀態值分布
SELECT
'EQUIPMENTSTATUS_WIP_V' AS SOURCE,
EQUIPMENTASSETSSTATUS AS STATUS_VALUE,
EQUIPMENTASSETSSTATUSREASON AS STATUS_REASON,
COUNT(*) AS CNT
FROM DWH.DW_MES_EQUIPMENTSTATUS_WIP_V
GROUP BY EQUIPMENTASSETSSTATUS, EQUIPMENTASSETSSTATUSREASON
ORDER BY CNT DESC;
-- 1.2 現有機況表查詢的狀態值分布 (從 RESOURCESTATUS 取最新)
-- 注意:此查詢可能較慢,可選擇性執行
SELECT
'RESOURCESTATUS' AS SOURCE,
NEWSTATUSNAME AS STATUS_VALUE,
NEWREASONNAME AS STATUS_REASON,
COUNT(*) AS CNT
FROM (
SELECT
r.RESOURCEID,
s.NEWSTATUSNAME,
s.NEWREASONNAME,
ROW_NUMBER() OVER (
PARTITION BY r.RESOURCEID
ORDER BY s.LASTSTATUSCHANGEDATE DESC NULLS LAST
) AS rn
FROM DWH.DW_MES_RESOURCE r
JOIN DWH.DW_MES_RESOURCESTATUS s ON r.RESOURCEID = s.HISTORYID
WHERE (r.OBJECTCATEGORY = 'ASSEMBLY' AND r.OBJECTTYPE = 'ASSEMBLY')
OR (r.OBJECTCATEGORY = 'WAFERSORT' AND r.OBJECTTYPE = 'WAFERSORT')
) WHERE rn = 1
GROUP BY NEWSTATUSNAME, NEWREASONNAME
ORDER BY CNT DESC;
-- ============================================================
-- 2. 資料覆蓋範圍調查
-- 確認 resource-cache 設備是否都能在 EQUIPMENTSTATUS_WIP_V 找到
-- ============================================================
-- 2.1 resource-cache 篩選條件的設備數量
SELECT
COUNT(*) AS RESOURCE_CACHE_COUNT
FROM DWH.DW_MES_RESOURCE r
WHERE ((r.OBJECTCATEGORY = 'ASSEMBLY' AND r.OBJECTTYPE = 'ASSEMBLY')
OR (r.OBJECTCATEGORY = 'WAFERSORT' AND r.OBJECTTYPE = 'WAFERSORT'))
AND (r.LOCATIONNAME IS NULL OR r.LOCATIONNAME NOT IN
('ATEC', 'F區', 'F區焊接站', '報廢', '實驗室', '山東', '成型站_F區', '焊接F區', '無錫', '熒茂'))
AND (r.PJ_ASSETSSTATUS IS NULL OR r.PJ_ASSETSSTATUS NOT IN ('Disapproved'));
-- 2.2 EQUIPMENTSTATUS_WIP_V 的設備數量
SELECT
COUNT(*) AS EQUIPMENTSTATUS_COUNT,
COUNT(DISTINCT RESOURCEID) AS DISTINCT_RESOURCEID,
COUNT(DISTINCT EQUIPMENTID) AS DISTINCT_EQUIPMENTID
FROM DWH.DW_MES_EQUIPMENTSTATUS_WIP_V;
-- 2.3 找出在 resource-cache 但不在 EQUIPMENTSTATUS_WIP_V 的設備
SELECT
r.RESOURCEID,
r.RESOURCENAME,
r.WORKCENTERNAME,
r.PJ_ASSETSSTATUS,
r.OBJECTCATEGORY
FROM DWH.DW_MES_RESOURCE r
WHERE ((r.OBJECTCATEGORY = 'ASSEMBLY' AND r.OBJECTTYPE = 'ASSEMBLY')
OR (r.OBJECTCATEGORY = 'WAFERSORT' AND r.OBJECTTYPE = 'WAFERSORT'))
AND (r.LOCATIONNAME IS NULL OR r.LOCATIONNAME NOT IN
('ATEC', 'F區', 'F區焊接站', '報廢', '實驗室', '山東', '成型站_F區', '焊接F區', '無錫', '熒茂'))
AND (r.PJ_ASSETSSTATUS IS NULL OR r.PJ_ASSETSSTATUS NOT IN ('Disapproved'))
AND r.RESOURCEID NOT IN (
SELECT RESOURCEID FROM DWH.DW_MES_EQUIPMENTSTATUS_WIP_V WHERE RESOURCEID IS NOT NULL
);
-- 2.4 統計缺失設備的分布(按工站)
SELECT
r.WORKCENTERNAME,
r.PJ_ASSETSSTATUS,
COUNT(*) AS MISSING_COUNT
FROM DWH.DW_MES_RESOURCE r
WHERE ((r.OBJECTCATEGORY = 'ASSEMBLY' AND r.OBJECTTYPE = 'ASSEMBLY')
OR (r.OBJECTCATEGORY = 'WAFERSORT' AND r.OBJECTTYPE = 'WAFERSORT'))
AND (r.LOCATIONNAME IS NULL OR r.LOCATIONNAME NOT IN
('ATEC', 'F區', 'F區焊接站', '報廢', '實驗室', '山東', '成型站_F區', '焊接F區', '無錫', '熒茂'))
AND (r.PJ_ASSETSSTATUS IS NULL OR r.PJ_ASSETSSTATUS NOT IN ('Disapproved'))
AND r.RESOURCEID NOT IN (
SELECT RESOURCEID FROM DWH.DW_MES_EQUIPMENTSTATUS_WIP_V WHERE RESOURCEID IS NOT NULL
)
GROUP BY r.WORKCENTERNAME, r.PJ_ASSETSSTATUS
ORDER BY MISSING_COUNT DESC;
-- ============================================================
-- 3. 工站對應調查
-- 確認 WORKCENTERNAME 與 WORK_CENTER 的對應關係
-- ============================================================
-- 3.1 DW_MES_SPEC_WORKCENTER_V 的完整資料(僅 230 筆)
SELECT
SPEC,
WORK_CENTER,
WORK_CENTER_GROUP,
WORK_CENTER_SEQUENCE,
WORKCENTERSEQUENCE_GROUP,
WORK_CENTER_SHORT
FROM DWH.DW_MES_SPEC_WORKCENTER_V
ORDER BY WORKCENTERSEQUENCE_GROUP, WORK_CENTER;
-- 3.2 resource-cache 中的 WORKCENTERNAME 清單
SELECT DISTINCT
WORKCENTERNAME,
COUNT(*) AS RESOURCE_COUNT
FROM DWH.DW_MES_RESOURCE r
WHERE ((r.OBJECTCATEGORY = 'ASSEMBLY' AND r.OBJECTTYPE = 'ASSEMBLY')
OR (r.OBJECTCATEGORY = 'WAFERSORT' AND r.OBJECTTYPE = 'WAFERSORT'))
AND (r.LOCATIONNAME IS NULL OR r.LOCATIONNAME NOT IN
('ATEC', 'F區', 'F區焊接站', '報廢', '實驗室', '山東', '成型站_F區', '焊接F區', '無錫', '熒茂'))
AND (r.PJ_ASSETSSTATUS IS NULL OR r.PJ_ASSETSSTATUS NOT IN ('Disapproved'))
GROUP BY WORKCENTERNAME
ORDER BY WORKCENTERNAME;
-- 3.3 SPEC_WORKCENTER_V 中的 WORK_CENTER 清單(去重)
SELECT DISTINCT
WORK_CENTER,
WORK_CENTER_GROUP,
WORKCENTERSEQUENCE_GROUP
FROM DWH.DW_MES_SPEC_WORKCENTER_V
ORDER BY WORKCENTERSEQUENCE_GROUP, WORK_CENTER;
-- 3.4 找出在 resource-cache 但無法對應到 SPEC_WORKCENTER_V 的 WORKCENTERNAME
SELECT
r.WORKCENTERNAME,
COUNT(*) AS RESOURCE_COUNT
FROM DWH.DW_MES_RESOURCE r
WHERE ((r.OBJECTCATEGORY = 'ASSEMBLY' AND r.OBJECTTYPE = 'ASSEMBLY')
OR (r.OBJECTCATEGORY = 'WAFERSORT' AND r.OBJECTTYPE = 'WAFERSORT'))
AND (r.LOCATIONNAME IS NULL OR r.LOCATIONNAME NOT IN
('ATEC', 'F區', 'F區焊接站', '報廢', '實驗室', '山東', '成型站_F區', '焊接F區', '無錫', '熒茂'))
AND (r.PJ_ASSETSSTATUS IS NULL OR r.PJ_ASSETSSTATUS NOT IN ('Disapproved'))
AND r.WORKCENTERNAME NOT IN (
SELECT DISTINCT WORK_CENTER FROM DWH.DW_MES_SPEC_WORKCENTER_V WHERE WORK_CENTER IS NOT NULL
)
GROUP BY r.WORKCENTERNAME
ORDER BY RESOURCE_COUNT DESC;
-- ============================================================
-- 4. 關聯欄位驗證
-- 確認 RESOURCEID / EQUIPMENTID 的對應關係
-- ============================================================
-- 4.1 EQUIPMENTSTATUS_WIP_V 的 RESOURCEID vs EQUIPMENTID 對應
SELECT
RESOURCEID,
EQUIPMENTID,
OBJECTCATEGORY,
EQUIPMENTASSETSSTATUS
FROM DWH.DW_MES_EQUIPMENTSTATUS_WIP_V
WHERE ROWNUM <= 20;
-- 4.2 比較 RESOURCE.RESOURCENAME 與 EQUIPMENTSTATUS_WIP_V.EQUIPMENTID
SELECT
r.RESOURCEID,
r.RESOURCENAME AS RESOURCE_NAME,
e.EQUIPMENTID AS EQUIPMENT_ID,
CASE WHEN r.RESOURCENAME = e.EQUIPMENTID THEN 'MATCH' ELSE 'DIFFER' END AS NAME_MATCH
FROM DWH.DW_MES_RESOURCE r
JOIN DWH.DW_MES_EQUIPMENTSTATUS_WIP_V e ON r.RESOURCEID = e.RESOURCEID
WHERE ROWNUM <= 50;
-- 4.3 統計 RESOURCENAME vs EQUIPMENTID 匹配率
SELECT
CASE WHEN r.RESOURCENAME = e.EQUIPMENTID THEN 'MATCH' ELSE 'DIFFER' END AS NAME_MATCH,
COUNT(*) AS CNT
FROM DWH.DW_MES_RESOURCE r
JOIN DWH.DW_MES_EQUIPMENTSTATUS_WIP_V e ON r.RESOURCEID = e.RESOURCEID
GROUP BY CASE WHEN r.RESOURCENAME = e.EQUIPMENTID THEN 'MATCH' ELSE 'DIFFER' END;
-- ============================================================
-- 5. 快速摘要查詢(建議先執行此區塊)
-- ============================================================
-- 5.1 三表資料量摘要
SELECT 'DW_MES_RESOURCE (filtered)' AS TABLE_NAME, COUNT(*) AS ROW_COUNT
FROM DWH.DW_MES_RESOURCE r
WHERE ((r.OBJECTCATEGORY = 'ASSEMBLY' AND r.OBJECTTYPE = 'ASSEMBLY')
OR (r.OBJECTCATEGORY = 'WAFERSORT' AND r.OBJECTTYPE = 'WAFERSORT'))
AND (r.LOCATIONNAME IS NULL OR r.LOCATIONNAME NOT IN
('ATEC', 'F區', 'F區焊接站', '報廢', '實驗室', '山東', '成型站_F區', '焊接F區', '無錫', '熒茂'))
AND (r.PJ_ASSETSSTATUS IS NULL OR r.PJ_ASSETSSTATUS NOT IN ('Disapproved'))
UNION ALL
SELECT 'DW_MES_EQUIPMENTSTATUS_WIP_V' AS TABLE_NAME, COUNT(*) AS ROW_COUNT
FROM DWH.DW_MES_EQUIPMENTSTATUS_WIP_V
UNION ALL
SELECT 'DW_MES_SPEC_WORKCENTER_V' AS TABLE_NAME, COUNT(*) AS ROW_COUNT
FROM DWH.DW_MES_SPEC_WORKCENTER_V;
-- 5.2 JOIN 成功率摘要
SELECT
(SELECT COUNT(*) FROM DWH.DW_MES_RESOURCE r
WHERE ((r.OBJECTCATEGORY = 'ASSEMBLY' AND r.OBJECTTYPE = 'ASSEMBLY')
OR (r.OBJECTCATEGORY = 'WAFERSORT' AND r.OBJECTTYPE = 'WAFERSORT'))
AND (r.LOCATIONNAME IS NULL OR r.LOCATIONNAME NOT IN
('ATEC', 'F區', 'F區焊接站', '報廢', '實驗室', '山東', '成型站_F區', '焊接F區', '無錫', '熒茂'))
AND (r.PJ_ASSETSSTATUS IS NULL OR r.PJ_ASSETSSTATUS NOT IN ('Disapproved'))
) AS TOTAL_RESOURCES,
(SELECT COUNT(*) FROM DWH.DW_MES_RESOURCE r
JOIN DWH.DW_MES_EQUIPMENTSTATUS_WIP_V e ON r.RESOURCEID = e.RESOURCEID
WHERE ((r.OBJECTCATEGORY = 'ASSEMBLY' AND r.OBJECTTYPE = 'ASSEMBLY')
OR (r.OBJECTCATEGORY = 'WAFERSORT' AND r.OBJECTTYPE = 'WAFERSORT'))
AND (r.LOCATIONNAME IS NULL OR r.LOCATIONNAME NOT IN
('ATEC', 'F區', 'F區焊接站', '報廢', '實驗室', '山東', '成型站_F區', '焊接F區', '無錫', '熒茂'))
AND (r.PJ_ASSETSSTATUS IS NULL OR r.PJ_ASSETSSTATUS NOT IN ('Disapproved'))
) AS MATCHED_WITH_EQUIPSTATUS,
(SELECT COUNT(DISTINCT r.WORKCENTERNAME) FROM DWH.DW_MES_RESOURCE r
WHERE ((r.OBJECTCATEGORY = 'ASSEMBLY' AND r.OBJECTTYPE = 'ASSEMBLY')
OR (r.OBJECTCATEGORY = 'WAFERSORT' AND r.OBJECTTYPE = 'WAFERSORT'))
AND (r.LOCATIONNAME IS NULL OR r.LOCATIONNAME NOT IN
('ATEC', 'F區', 'F區焊接站', '報廢', '實驗室', '山東', '成型站_F區', '焊接F區', '無錫', '熒茂'))
AND (r.PJ_ASSETSSTATUS IS NULL OR r.PJ_ASSETSSTATUS NOT IN ('Disapproved'))
) AS TOTAL_WORKCENTERS,
(SELECT COUNT(DISTINCT r.WORKCENTERNAME) FROM DWH.DW_MES_RESOURCE r
WHERE ((r.OBJECTCATEGORY = 'ASSEMBLY' AND r.OBJECTTYPE = 'ASSEMBLY')
OR (r.OBJECTCATEGORY = 'WAFERSORT' AND r.OBJECTTYPE = 'WAFERSORT'))
AND (r.LOCATIONNAME IS NULL OR r.LOCATIONNAME NOT IN
('ATEC', 'F區', 'F區焊接站', '報廢', '實驗室', '山東', '成型站_F區', '焊接F區', '無錫', '熒茂'))
AND (r.PJ_ASSETSSTATUS IS NULL OR r.PJ_ASSETSSTATUS NOT IN ('Disapproved'))
AND r.WORKCENTERNAME IN (SELECT DISTINCT WORK_CENTER FROM DWH.DW_MES_SPEC_WORKCENTER_V)
) AS MATCHED_WITH_SPECWC
FROM DUAL;
-- ============================================================
-- 6. 追加調查(基於 5.2 結果)
-- ============================================================
-- 6.1 確認 EQUIPMENTSTATUS_WIP_V 是否有重複 RESOURCEID
-- 如果有重複,表示一台設備可能有多個狀態記錄(如多個維修工單)
SELECT
RESOURCEID,
COUNT(*) AS CNT
FROM DWH.DW_MES_EQUIPMENTSTATUS_WIP_V
GROUP BY RESOURCEID
HAVING COUNT(*) > 1
ORDER BY CNT DESC;
-- 6.2 確認 resource-cache 設備對應情況(用 DISTINCT 計算)
SELECT
COUNT(DISTINCT r.RESOURCEID) AS MATCHED_DISTINCT_RESOURCES
FROM DWH.DW_MES_RESOURCE r
JOIN DWH.DW_MES_EQUIPMENTSTATUS_WIP_V e ON r.RESOURCEID = e.RESOURCEID
WHERE ((r.OBJECTCATEGORY = 'ASSEMBLY' AND r.OBJECTTYPE = 'ASSEMBLY')
OR (r.OBJECTCATEGORY = 'WAFERSORT' AND r.OBJECTTYPE = 'WAFERSORT'))
AND (r.LOCATIONNAME IS NULL OR r.LOCATIONNAME NOT IN
('ATEC', 'F區', 'F區焊接站', '報廢', '實驗室', '山東', '成型站_F區', '焊接F區', '無錫', '熒茂'))
AND (r.PJ_ASSETSSTATUS IS NULL OR r.PJ_ASSETSSTATUS NOT IN ('Disapproved'));
-- 6.3 找出在 resource-cache 但完全無法對應 EQUIPMENTSTATUS_WIP_V 的設備
SELECT
r.RESOURCEID,
r.RESOURCENAME,
r.WORKCENTERNAME,
r.PJ_ASSETSSTATUS
FROM DWH.DW_MES_RESOURCE r
WHERE ((r.OBJECTCATEGORY = 'ASSEMBLY' AND r.OBJECTTYPE = 'ASSEMBLY')
OR (r.OBJECTCATEGORY = 'WAFERSORT' AND r.OBJECTTYPE = 'WAFERSORT'))
AND (r.LOCATIONNAME IS NULL OR r.LOCATIONNAME NOT IN
('ATEC', 'F區', 'F區焊接站', '報廢', '實驗室', '山東', '成型站_F區', '焊接F區', '無錫', '熒茂'))
AND (r.PJ_ASSETSSTATUS IS NULL OR r.PJ_ASSETSSTATUS NOT IN ('Disapproved'))
AND r.RESOURCEID NOT IN (
SELECT RESOURCEID FROM DWH.DW_MES_EQUIPMENTSTATUS_WIP_V WHERE RESOURCEID IS NOT NULL
);
-- 6.4 統計缺失設備數量
SELECT
COUNT(*) AS MISSING_COUNT
FROM DWH.DW_MES_RESOURCE r
WHERE ((r.OBJECTCATEGORY = 'ASSEMBLY' AND r.OBJECTTYPE = 'ASSEMBLY')
OR (r.OBJECTCATEGORY = 'WAFERSORT' AND r.OBJECTTYPE = 'WAFERSORT'))
AND (r.LOCATIONNAME IS NULL OR r.LOCATIONNAME NOT IN
('ATEC', 'F區', 'F區焊接站', '報廢', '實驗室', '山東', '成型站_F區', '焊接F區', '無錫', '熒茂'))
AND (r.PJ_ASSETSSTATUS IS NULL OR r.PJ_ASSETSSTATUS NOT IN ('Disapproved'))
AND r.RESOURCEID NOT IN (
SELECT RESOURCEID FROM DWH.DW_MES_EQUIPMENTSTATUS_WIP_V WHERE RESOURCEID IS NOT NULL
);
-- 6.5 查看重複 RESOURCEID 的詳細資料(取前 10 筆)
SELECT *
FROM DWH.DW_MES_EQUIPMENTSTATUS_WIP_V
WHERE RESOURCEID IN (
SELECT RESOURCEID
FROM DWH.DW_MES_EQUIPMENTSTATUS_WIP_V
GROUP BY RESOURCEID
HAVING COUNT(*) > 1
)
ORDER BY RESOURCEID
FETCH FIRST 20 ROWS ONLY;