From 3edc06d8b1e2449be45dbaa552f635eee72d1519 Mon Sep 17 00:00:00 2001
From: zzw <228544128@qq.com>
Date: 星期三, 07 十月 2026 16:17:38 +0800
Subject: [PATCH] feat: load status dictionary from public assets

---
 HANDOFF.md                             |   20 ++++++
 requirement/交接文件_2026.10.3.md          |   24 ++++++++
 emergency-repair-web/src/main.js       |   13 ++-
 emergency-repair-web/src/utils/dict.js |   62 +++++++++++++++++++-
 emergency-repair-web/public/dict.js    |   33 +++++++++++
 5 files changed, 144 insertions(+), 8 deletions(-)

diff --git a/HANDOFF.md b/HANDOFF.md
index 3ccb1d8..a02bb1f 100644
--- a/HANDOFF.md
+++ b/HANDOFF.md
@@ -854,6 +854,26 @@
 - `.codex-run`銆丱ffice 閿佹枃浠跺強 `emergency-repair-web/public/鏂板缓 鏂囨湰鏂囨。.txt` 浠嶄负鏈湴涓存椂鏂囦欢锛屼笉搴旀彁浜ゃ��
 - `emergency-repair-web/public/sensitive-words.json` 鏄敤鎴锋棦鏈夋湭鎻愪氦淇敼锛屾湰杞笉绾冲叆鎻愪氦銆�
 
+## 28. 鏀跺熬蹇収锛�2026-10-07 鍛ㄤ笁锛屼笟鍔″瓧鍏告敼涓哄彂甯冨悗鍙慨鏀癸級
+
+**瀹炵幇鏂瑰紡**
+- 灏嗕换鍔$姸鎬併�佸畬宸ョ姸鎬併�侀獙鏀剁姸鎬佸瓧鍏歌縼绉诲埌 `emergency-repair-web/public/dict.js`锛屼互 `window.__APP_DICT__` 鏆撮湶杩愯鏃堕厤缃��
+- 鍘� `src/utils/dict.js` 淇濈暀涓洪�傞厤灞傦紝鎻愪緵鍐呯疆鍏滃簳瀛楀吀銆佽繍琛屾椂瀛楀吀鍚堝苟鍜屽姞杞藉嚱鏁帮紱`src/main.js` 鍦ㄦ寕杞藉簲鐢ㄥ墠鍔犺浇 `dict.js?ts=鏃堕棿鎴砢锛岄伩鍏嶆祻瑙堝櫒缂撳瓨鏃у瓧鍏搞��
+- 鍓嶇鏋勫缓鍚庢枃浠朵綅浜� `dist/dict.js`銆傚彂甯冨悗鐩存帴淇敼璇ユ枃浠朵腑鐨� `text`銆乣type` 鎴栫姸鎬侀」锛屽埛鏂伴〉闈㈠嵆鍙敓鏁堬紝鏃犻渶閲嶆柊鎵ц `npm run build`銆�
+
+**涓昏鏂囦欢**
+- `emergency-repair-web/public/dict.js`
+- `emergency-repair-web/src/utils/dict.js`
+- `emergency-repair-web/src/main.js`
+
+**楠岃瘉缁撴灉**
+- 鍓嶇 `npm run build` 閫氳繃锛宍dist/dict.js` 姝e父鐢熸垚锛屼粎鏈夋棦鏈夊寘浣撶Н鍛婅銆�
+- 涓存椂灏� `public/dict.js` 涓� `UNREPORTED.text` 鏀逛负 `鏈笂鎶澶栭儴娴嬭瘯]`锛屼笉閲嶆柊鏋勫缓锛屼粎鍒锋柊鏁呴殰涓婃姤椤甸潰鍚庣瓫閫変笅鎷夌珛鍗虫樉绀烘柊鏂囧瓧锛涙仮澶嶅師鍊煎悗鍒锋柊涔熺珛鍗虫仮澶嶃��
+- 娴忚鍣ㄥ疄闄呰姹傚寘鍚� `http://localhost:8082/dict.js?ts=...`锛涘簲鐢ㄥ湪瀛楀吀鍔犺浇瀹屾垚鍚庡啀鎸傝浇锛屾帴鍙d笉鍙敤鏃朵粛浣跨敤鍐呯疆鍏滃簳瀛楀吀銆�
+
+**鍙戝竷鍚庢搷浣�**
+- 缂栬緫閮ㄧ讲鐩綍涓殑 `dist/dict.js`锛屼繚瀛樺悗鍒锋柊娴忚鍣ㄥ嵆鍙�備笉瑕佸啀閲嶆柊鏋勫缓鍓嶇锛屽惁鍒欎細鐢ㄥ綋鍓嶆簮鐮佸瓧鍏歌鐩栨墜宸ヤ慨鏀广��
+
 ## 21. 鏀跺熬蹇収锛�2026-10-06 鍛ㄤ竴锛岄渶姹� 21 鏉冮檺璁剧疆鑼冨洿鍒囨崲锛�
 
 **鏈疆瀹屾垚鍐呭**
diff --git a/emergency-repair-web/public/dict.js b/emergency-repair-web/public/dict.js
new file mode 100644
index 0000000..3ec46dc
--- /dev/null
+++ b/emergency-repair-web/public/dict.js
@@ -0,0 +1,33 @@
+/*
+ * 杩愯鏃朵笟鍔″瓧鍏搞��
+ * 鍙戝竷鍚庡彲鐩存帴淇敼閮ㄧ讲鐩綍涓殑 dist/dict.js锛屽埛鏂伴〉闈㈠嵆鍙敓鏁堬紝鏃犻渶閲嶆柊鏋勫缓鍓嶇銆�
+ */
+window.__APP_DICT__ = {
+  taskStatuses: {
+    UNREPORTED: { text: '鏈笂鎶�', type: 'info' },
+    REPORTED_XCB: { text: '宸蹭笂鎶k_XCB', type: 'warning' },
+    RETURNED: { text: '涓婄骇鎵撳洖', type: 'danger' },
+    XCB_REVIEWED: { text: 'rk_XCB鍔╃悊瀹℃牳瀹屾垚', type: 'primary' },
+    CMB_APPROVED: { text: 'rk_CMB棰嗗瀹℃壒瀹屾垚', type: 'success' },
+    JCC_ASSISTANT_APPROVED: { text: 'rk_JCC鍔╃悊瀹℃壒瀹屾垚', type: 'success' },
+    JCC_DIRECTOR_APPROVED: { text: 'rk_JCC澶勯暱宸查槄', type: 'success' },
+    DISPATCHED: { text: '宸叉淳鍗�', type: 'primary' },
+    CANCELLED: { text: '宸查攢椤�', type: 'info' }
+  },
+  completionStatuses: {
+    UNFINISHED: { text: '鏈畬宸�', type: 'info' },
+    WAIT_PARTS: { text: '寰呭浠�', type: 'warning' },
+    WAIT_TEST: { text: '瀹屽伐寰呰瘯楠�', type: 'primary' },
+    COMPLETED: { text: '瀹屽伐', type: 'success' }
+  },
+  acceptanceStatuses: {
+    APPLICATION_PENDING: { text: '寰呮彁浜ら獙鏀剁敵璇�', type: 'warning' },
+    QUALITY_INSPECTOR_PENDING: { text: '寰呰川妫�鍛橀獙鏀�', type: 'primary' },
+    QUALITY_LEADER_PENDING: { text: '寰呰川妫�璐熻矗浜洪獙鏀�', type: 'primary' },
+    PRINT_PENDING: { text: '寰呮墦鍗拌緭鍑�', type: 'warning' },
+    RATING_PENDING: { text: '寰呬慨鍚庤川閲忚瘎绾�', type: 'warning' },
+    COMPLETED: { text: '楠屾敹瀹屾垚', type: 'success' },
+    RETURNED_APPLICATION: { text: '宸叉墦鍥為獙鏀剁敵璇�', type: 'danger' },
+    RETURNED_INSPECTOR: { text: '宸叉墦鍥炶川妫�鍛橀獙鏀�', type: 'danger' }
+  }
+}
diff --git a/emergency-repair-web/src/main.js b/emergency-repair-web/src/main.js
index 829ed5a..d839a2a 100644
--- a/emergency-repair-web/src/main.js
+++ b/emergency-repair-web/src/main.js
@@ -5,6 +5,7 @@
 import router from './router'
 import './styles/global.css'
 import { installSensitiveWords } from './utils/sensitive'
+import { loadDictionary } from './utils/dict'
 
 Vue.use(ElementUI, { size: 'small' })
 Vue.config.productionTip = false
@@ -31,9 +32,11 @@
   }
 })
 
-new Vue({
-  router,
-  render: h => h(App)
-}).$mount('#app')
+loadDictionary().then(() => {
+  new Vue({
+    router,
+    render: h => h(App)
+  }).$mount('#app')
 
-installSensitiveWords()
+  installSensitiveWords()
+})
diff --git a/emergency-repair-web/src/utils/dict.js b/emergency-repair-web/src/utils/dict.js
index e758711..fa9f561 100644
--- a/emergency-repair-web/src/utils/dict.js
+++ b/emergency-repair-web/src/utils/dict.js
@@ -1,4 +1,4 @@
-export const taskStatuses = {
+const defaultTaskStatuses = {
   UNREPORTED: { text: '鏈笂鎶�', type: 'info' },
   REPORTED_XCB: { text: '宸蹭笂鎶k_XCB', type: 'warning' },
   RETURNED: { text: '涓婄骇鎵撳洖', type: 'danger' },
@@ -10,14 +10,14 @@
   CANCELLED: { text: '宸查攢椤�', type: 'info' }
 }
 
-export const completionStatuses = {
+const defaultCompletionStatuses = {
   UNFINISHED: { text: '鏈畬宸�', type: 'info' },
   WAIT_PARTS: { text: '寰呭浠�', type: 'warning' },
   WAIT_TEST: { text: '瀹屽伐寰呰瘯楠�', type: 'primary' },
   COMPLETED: { text: '瀹屽伐', type: 'success' }
 }
 
-export const acceptanceStatuses = {
+const defaultAcceptanceStatuses = {
   APPLICATION_PENDING: { text: '寰呮彁浜ら獙鏀剁敵璇�', type: 'warning' },
   QUALITY_INSPECTOR_PENDING: { text: '寰呰川妫�鍛橀獙鏀�', type: 'primary' },
   QUALITY_LEADER_PENDING: { text: '寰呰川妫�璐熻矗浜洪獙鏀�', type: 'primary' },
@@ -28,6 +28,62 @@
   RETURNED_INSPECTOR: { text: '宸叉墦鍥炶川妫�鍛橀獙鏀�', type: 'danger' }
 }
 
+export const taskStatuses = { ...defaultTaskStatuses }
+export const completionStatuses = { ...defaultCompletionStatuses }
+export const acceptanceStatuses = { ...defaultAcceptanceStatuses }
+
+function normalizeDictionary(source, fallback) {
+  if (!source || typeof source !== 'object' || Array.isArray(source)) {
+    return fallback
+  }
+  const result = {}
+  Object.keys(source).forEach(key => {
+    const item = source[key]
+    if (item && typeof item === 'object' && item.text) {
+      result[key] = {
+        text: String(item.text),
+        type: item.type ? String(item.type) : 'info'
+      }
+    }
+  })
+  return Object.keys(result).length ? result : fallback
+}
+
+function replaceDictionary(target, source) {
+  Object.keys(target).forEach(key => { delete target[key] })
+  Object.keys(source).forEach(key => { target[key] = source[key] })
+}
+
+function applyRuntimeDictionary() {
+  const runtime = window.__APP_DICT__ || {}
+  replaceDictionary(taskStatuses, normalizeDictionary(runtime.taskStatuses, defaultTaskStatuses))
+  replaceDictionary(completionStatuses, normalizeDictionary(runtime.completionStatuses, defaultCompletionStatuses))
+  replaceDictionary(acceptanceStatuses, normalizeDictionary(runtime.acceptanceStatuses, defaultAcceptanceStatuses))
+}
+
+let loadingPromise = null
+
+export function loadDictionary() {
+  if (loadingPromise) {
+    return loadingPromise
+  }
+
+  loadingPromise = new Promise(resolve => {
+    const script = document.createElement('script')
+    const baseUrl = process.env.BASE_URL || '/'
+    script.async = true
+    script.src = baseUrl + 'dict.js?ts=' + Date.now()
+    script.onload = () => {
+      applyRuntimeDictionary()
+      resolve()
+    }
+    script.onerror = () => resolve()
+    document.head.appendChild(script)
+  })
+
+  return loadingPromise
+}
+
 export function statusMeta(dict, value) {
   return dict[value] || { text: value || '-', type: 'info' }
 }
diff --git "a/requirement/\344\272\244\346\216\245\346\226\207\344\273\266_2026.10.3.md" "b/requirement/\344\272\244\346\216\245\346\226\207\344\273\266_2026.10.3.md"
index 1d8a25e..2763f18 100644
--- "a/requirement/\344\272\244\346\216\245\346\226\207\344\273\266_2026.10.3.md"
+++ "b/requirement/\344\272\244\346\216\245\346\226\207\344\273\266_2026.10.3.md"
@@ -815,3 +815,27 @@
 - 褰撳墠鍓嶇 PID `57312`锛岀洃鍚� `http://localhost:8082`锛涘悗绔� PID `56124`锛岀洃鍚� `http://127.0.0.1:8091`锛汥M8 `127.0.0.1:5236`锛汦dge CDP `9222`锛涚櫥褰� `admin / admin123`銆�
 - `.codex-run`銆丱ffice 閿佹枃浠跺強 `emergency-repair-web/public/鏂板缓 鏂囨湰鏂囨。.txt` 浠嶄负鏈湴涓存椂鏂囦欢锛屼笉搴旀彁浜ゃ��
 - `emergency-repair-web/public/sensitive-words.json` 鏄敤鎴锋棦鏈夋湭鎻愪氦淇敼锛屾湰杞笉绾冲叆鎻愪氦銆�
+
+## 浜屽崄浜屻��2026-10-07 涓氬姟瀛楀吀鏀逛负鍙戝竷鍚庡彲淇敼
+
+| 闇�姹� | 鐘舵�� | 瀹炵幇 |
+| --- | --- | --- |
+| `dict.js` 绉诲埌 `public`锛屽彂甯冨悗浠嶅彲淇敼 | 宸插畬鎴� | 鏂板 `public/dict.js` 淇濆瓨浠诲姟銆佸畬宸ャ�侀獙鏀剁姸鎬佸瓧鍏革紝閫氳繃 `window.__APP_DICT__` 鏆撮湶锛沗src/utils/dict.js` 浣滀负鍔犺浇鍜屽厹搴曢�傞厤灞傦紱搴旂敤鍚姩鍓嶆寜鏃堕棿鎴冲姞杞斤紝鏋勫缓鍚庡搴旀枃浠朵负 `dist/dict.js` |
+
+### 22.1 涓昏鍙樻洿鏂囦欢
+
+- `emergency-repair-web/public/dict.js`
+- `emergency-repair-web/src/utils/dict.js`
+- `emergency-repair-web/src/main.js`
+
+### 22.2 楠岃瘉缁撴灉
+
+- 鍓嶇 `npm run build` 閫氳繃锛宍dist/dict.js` 姝e父鐢熸垚锛屼粎鏈夋棦鏈夊寘浣撶Н鍛婅銆�
+- 涓存椂淇敼 `public/dict.js` 鐨勨�滄湭涓婃姤鈥濇枃瀛楀悗锛屼笉閲嶆柊鏋勫缓锛屼粎鍒锋柊鏁呴殰涓婃姤椤甸潰鍗崇敓鏁堬紱鎭㈠鍚庡埛鏂颁篃绔嬪嵆鎭㈠銆�
+- 椤甸潰璧勬簮璇锋眰鍖呭惈 `/dict.js?ts=...`锛屽彂甯冨悗淇敼鏂囦欢涓嶄細琚棫缂撳瓨闃诲銆�
+
+### 22.3 鍙戝竷鍚庣淮鎶よ鏄�
+
+- 鐢熶骇鐜鐩存帴缂栬緫閮ㄧ讲鐩綍涓殑 `dist/dict.js`锛屽彲淇敼鐘舵�佹樉绀烘枃瀛楀拰 `type`锛屽埛鏂伴〉闈㈢敓鏁堛��
+- 涓嶈閲嶆柊鎵ц鍓嶇鏋勫缓锛屽惁鍒欏綋鍓� `public/dict.js` 浼氬啀娆¤鐩栭儴缃茬洰褰曚腑鐨勪慨鏀广��
+- `dict.js` 涓嶅彲鐢ㄦ垨瀛楁闈炴硶鏃讹紝搴旂敤缁х画浣跨敤婧愮爜鍐呯疆瀛楀吀锛屼笉褰卞搷椤甸潰鍚姩銆�

--
Gitblit v1.9.1