Assistant.vue 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. <script setup lang="ts">
  2. import { vUnwrap } from '../lib/unwrap'
  3. /**
  4. * 三类查询助手(assistant)——逐字对应重构前 `app.js` 的 `assistant()`(app.js:287-303)。
  5. *
  6. * 三个面板:故障码纠正措施(输入码 + 常用码)· 预防性维护(系统下拉)· 故障树(系统下拉),
  7. * 各自一个"查询"按钮与输出区;输出区初始为空(旧 `ASST.out.*`)。
  8. * 查询走 `GET /api/asst?kind=…&code|system=…`(交互行为,本版先迁**首屏呈现**)。
  9. */
  10. import { computed, reactive } from 'vue'
  11. import { t } from '../i18n/zh'
  12. import { sysFromSlug, sysName, sysSlug } from '../lib/render2'
  13. import { esc } from '../lib/vib'
  14. /** 旧 `SYSOPT`(app.js:283) */
  15. const SYSOPT = ['变桨', '偏航', '主轴承', '齿轮箱', '发电机', '变流器', '塔架与基础', '主控与传感网', '叶片与叶根']
  16. /** 旧 `HOT`(app.js:284) */
  17. const HOT = ['3225', '3130', '13902', '10105', '3224']
  18. /** 旧 `ASST`(app.js:285) */
  19. const ASST = reactive({ fault: '', prev: 'pitch', tree: 'pitch', out: { fault: '', prev: '', tree: '' } })
  20. const row = 'display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-top:8px'
  21. const selOptions = (id: 'prev' | 'tree') => SYSOPT.map((s) =>
  22. `<option value="${sysSlug(s)}" ${ASST[id] === sysSlug(s) ? 'selected' : ''}>${sysName(s)}</option>`).join('')
  23. /** 常用码链接:旧 `<a href="#" data-code="…">码</a>`,用 ` · ` 连接 */
  24. const hotHtml = computed(() => HOT.map((c) => `<a href="#" data-code="${c}">${c}</a>`).join(' · '))
  25. </script>
  26. <template>
  27. <section>
  28. <div class="eyebrow">{{ t('asst.head') }} — {{ t('asst.head_note') }}</div>
  29. <div class="panel mb">
  30. <h3>{{ t('asst.corrective') }} <span class="small muted" style="font-weight:400">{{ t('asst.corrective_flow') }}</span></h3>
  31. <div :style="row">
  32. <input id="asstIn_fault" :placeholder="esc(t('asst.code_placeholder'))" :value="ASST.fault" style="flex:1 1 220px">
  33. <button class="btn" data-asst="fault">{{ t('ui.query') }}</button>
  34. <span class="small muted">{{ t('asst.common') }} <span class="unwrap-host" v-html="hotHtml"></span></span>
  35. </div>
  36. <div id="asstOut_fault" style="margin-top:10px">{{ ASST.out.fault }}</div>
  37. </div>
  38. <div class="panel mb">
  39. <h3>{{ t('asst.preventive') }} <span class="small muted" style="font-weight:400">{{ t('asst.preventive_flow') }}</span></h3>
  40. <div :style="row">
  41. <select id="asstIn_prev" style="flex:1 1 200px" v-html="selOptions('prev')"></select>
  42. <button class="btn" data-asst="prev">{{ t('ui.query') }}</button>
  43. </div>
  44. <div id="asstOut_prev" style="margin-top:10px">{{ ASST.out.prev }}</div>
  45. </div>
  46. <div class="panel mb">
  47. <h3>{{ t('asst.faulttree') }} <span class="small muted" style="font-weight:400">{{ t('asst.faulttree_flow') }}</span></h3>
  48. <div :style="row">
  49. <select id="asstIn_tree" style="flex:1 1 200px" v-html="selOptions('tree')"></select>
  50. <button class="btn" data-asst="tree">{{ t('ui.query') }}</button>
  51. </div>
  52. <div id="asstOut_tree" style="margin-top:10px">{{ ASST.out.tree }}</div>
  53. </div>
  54. </section>
  55. </template>