- 新增 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>
313 lines
13 KiB
SQL
313 lines
13 KiB
SQL
-- ============================================================
|
||
-- 資料調查 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;
|