PymolView.vue 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. <script setup lang="jsx">
  2. import { ref } from 'vue';
  3. import { useRouter } from 'vue-router';
  4. import { NTabs, NTab } from 'naive-ui';
  5. import { useChatStore } from '@/stores/modules/chatStore';
  6. import { BaseTable, ChatWelcome, RecodeSquareCardItem, TheSubMenu, TheChatView } from "@/components";
  7. import { ChatBaseCard, ChatAnswer } from '@/components/Chat';
  8. import { format, truncateDecimals } from "@/utils/format";
  9. import { waterApi } from '@/api/water';
  10. import {useInfinite, useRecommend, useScroll} from '@/composables'
  11. const { recommendList } = useRecommend({ type: 2 });
  12. const { scrollRef, scrollToTop } = useScroll();
  13. const { recordList, isFetching, onScrolltolower, onRestore } = useInfinite('/front/bigModel/warning/pageList', { type: 1, warningStatus: 0 });
  14. const router = useRouter();
  15. const chatStore = useChatStore();
  16. const answerResult = ref("");
  17. const textDataSources = ref(null);
  18. // 进出水数据
  19. const jsTableData = ref([]);
  20. const csTableData = ref([]);
  21. const renderRowDom = ({ row, key }) => {
  22. const { exceed, value } = row[key] || {};
  23. const cls = exceed ? 'text-[#F44C49] font-bold' : 'text-[1A2029]'
  24. return (<span class={cls}>{truncateDecimals(value)} {exceed && <i>↑</i>}</span>)
  25. }
  26. const columns = [
  27. {
  28. title: '流量(m³/h)',
  29. key: 'name',
  30. titleAlign: 'center',
  31. align: 'center',
  32. className: 'small',
  33. width: '80px',
  34. render: (row) => renderRowDom({ row, key: '流量' })
  35. },
  36. {
  37. title: 'COD(mg/L)',
  38. key: 'small',
  39. titleAlign: 'center',
  40. align: 'center',
  41. className: 'small',
  42. width: '80px',
  43. render: (row) => renderRowDom({ row, key: 'COD' })
  44. },
  45. {
  46. title: 'TN(mg/L)',
  47. key: 'address',
  48. titleAlign: 'center',
  49. align: 'center',
  50. className: 'small',
  51. width: '80px',
  52. render: (row) => renderRowDom({ row, key: 'TN' })
  53. },
  54. {
  55. title: 'NH3-N(mg/L)',
  56. key: 'tags',
  57. titleAlign: 'center',
  58. align: 'center',
  59. className: 'small',
  60. width: '80px',
  61. render: (row) => renderRowDom({ row, key: 'NH3-N' })
  62. },
  63. {
  64. title: 'TP(mg/L)',
  65. key: 'COD',
  66. titleAlign: 'center',
  67. align: 'center',
  68. className: 'small',
  69. width: '80px',
  70. render: (row) => renderRowDom({ row, key: 'TP' })
  71. },
  72. {
  73. title: 'SS(mg/L)',
  74. key: '流量',
  75. titleAlign: 'center',
  76. align: 'center',
  77. className: 'age',
  78. width: '78px',
  79. render: (row) => renderRowDom({ row, key: 'SS' })
  80. }
  81. ]
  82. // 切换Tabs
  83. const onChangeTabs = warningStatus => {
  84. answerResult.value = '';
  85. textDataSources.value = '';
  86. onRestore({ warningStatus })
  87. }
  88. // 打开详情
  89. const handleOpenContent = async ({ id, category }) => {
  90. const { data } = await waterApi.getWaringDetails(id);
  91. const showVal = JSON.parse(data.showVal);
  92. const { basic, jsData, csData } = showVal;
  93. console.log( jsData );
  94. const textWhiteList = [
  95. { label: '报警时间', realKey: '报警时间', value: '', isWarning: false },
  96. { label: '报警值', realKey: '报警值', value: 'mg/L', isWarning: true },
  97. { label: '管控值', realKey: '管控值', value: 'mg/L', isWarning: false },
  98. { label: '标准值', realKey: '标准值', value: 'mg/L', isWarning: false },
  99. // { label: '报警级别', realKey: '告警级别', value: '', isWarning: false },
  100. { label: '报警次数', realKey: '报警次数', value: '', isWarning: false },
  101. { label: '状态', realKey: '状态', value: '', isWarning: false }
  102. ]
  103. answerResult.value = data.answer;
  104. textDataSources.value = format.textSorting(basic, textWhiteList);
  105. jsTableData.value = [jsData];
  106. csTableData.value = [csData];
  107. scrollToTop();
  108. }
  109. // 欢迎 - 问答
  110. const handleWelcomeRecommend = question => {
  111. chatStore.setChatQuestion(question);
  112. router.push('/answer');
  113. }
  114. </script>
  115. <template>
  116. <section class="flex items-start h-full" id="warning">
  117. <TheSubMenu title="生化报警" @scrollToLower="onScrolltolower" :loading="isFetching">
  118. <template #top>
  119. <div class="border-[#DAE5ED]">
  120. <n-tabs type="line" justify-content="space-evenly">
  121. <n-tab name="oasis" tab="正在报警" @click="onChangeTabs(0)"></n-tab>
  122. <n-tab name="thebeatles" tab="历史报警" @click="onChangeTabs(1)"></n-tab>
  123. </n-tabs>
  124. </div>
  125. </template>
  126. <div class="px-[12px] py-[14px] text-[#5e5e5e]">
  127. <div class="grid grid-cols-1 gap-[12px]">
  128. <RecodeSquareCardItem v-for="item in recordList" :key="item.id" :item="item" @on-click="handleOpenContent" />
  129. </div>
  130. </div>
  131. </TheSubMenu>
  132. <TheChatView ref="scrollRef" :is-footer="false">
  133. <ChatWelcome title="您好,我是LibraAI工艺管控助手" card-title="常见处理方案:" :sub-title="[
  134. '水质报警功能对工艺过程指标实时监测,发现异常后将推送给相关人员决策方案',
  135. '报警时间为每小时警报,请大家及时处理'
  136. ]"
  137. v-if="!textDataSources"
  138. :card-content="recommendList"
  139. @on-click="handleWelcomeRecommend"
  140. />
  141. <ChatBaseCard v-if="textDataSources">
  142. <div class="waring-answer-wrapper">
  143. <dl class="message-inner warning-info_medium ">
  144. <dt class="mb-[2px] font-bold text-[#1A2029]">{{ textDataSources?.title }}</dt>
  145. <dd v-for="item, index in textDataSources?.list" :key="index"><span :class="{'text-[#F44C49]': item.isWarning}">{{ item.label }}: {{ item.value }}</span></dd>
  146. </dl>
  147. <div class="table-inner">
  148. <div class="warning-table mb-[8px]">
  149. <div class="title">
  150. <span>当前进水数据:</span>
  151. </div>
  152. <div class="main">
  153. <BaseTable :columns="columns" :data="jsTableData"></BaseTable>
  154. </div>
  155. </div>
  156. <div class="warning-table">
  157. <div class="title">
  158. <span>当前出水数据:</span>
  159. </div>
  160. <div class="main">
  161. <BaseTable :columns="columns" :data="csTableData"></BaseTable>
  162. </div>
  163. </div>
  164. </div>
  165. </div>
  166. </ChatBaseCard>
  167. <ChatAnswer
  168. :loading="false"
  169. :delay-loading="false"
  170. :toggleVisibleIcons="false"
  171. :content="answerResult"
  172. v-if="answerResult"
  173. />
  174. </TheChatView>
  175. </section>
  176. </template>
  177. <style scoped lang="scss"></style>