123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301 |
- <script setup lang="ts">
- import {
- ref,
- reactive,
- toRefs,
- onMounted,
- watch,
- computed,
- onBeforeUnmount,
- } from "vue";
- import NavBarPage from "../components/NavBarPage.vue";
- import randarPage from "./result/randarPage.vue";
- import { useRoute } from "vue-router";
- import { fetchTaskScore } from "./utils/api";
- import { Toast } from "vant";
- const route = useRoute();
- const score = ref(0);
- const data = ref(null);
- const scoresList = ref(null);
- const defectsList = ref(null);
- const taskId = computed(() => route.query.conversationId); // 会话ID "2c64eb8b69be432ca0bb9ae55bc78def"
- const randarlist = ref([0, 0, 0, 0]);
- const loading = ref(false);
- const nameMapping = {
- introduction_profession: "自我介绍专业性",
- basic_information: "客户画像采集",
- purchase_intent: "需求挖掘能力",
- invitation_results: "沟通转化效果",
- penalty_points: "扣分项",
- defects: "评分详解"
- };
- const handleResult = async () => {
- let res;
- let shouldContinue = true; // 控制是否继续调用接口的标志
- loading.value = true;
- while (shouldContinue) {
- res = await fetchTaskScore(taskId.value);
- if (res.code !== 200) {
- // 当返回错误时,停止调用接口
- loading.value = false
- shouldContinue = false;
- } else if (res.body && Object.keys(res.body).length !== 0) {
- // 当res.body有值时,停止调用接口
- data.value = res.body;
- shouldContinue = false;
- } else {
- await new Promise((resolve) => setTimeout(resolve, 3000));
- }
- }
- if (res && res.code === 200 && res.body) {
- loading.value = false;
- const scores = extractScores(res.body);
- score.value = scores.reduce((sum, score) => sum + score, 0);
- scoresList.value = Object.keys(res.body).reduce((acc, key) => {
- if (key !== "defects") {
- acc[key] = {
- ...res.body[key],
- name: nameMapping[key], // 添加 name 字段
- };
- }
- return acc;
- }, {});
- defectsList.value = res.body.defects;
- console.log(defectsList.value, '000000000');
- const obj = extractScores(scoresList.value);
- randarlist.value = Object.values(obj);
- }
- };
- // 处理“分”字
- const extractScores = (data) => {
- return Object.values(data).map((item) => {
- // 确保 score 是一个字符串,并且去除可能的 "分" 字
- let scoreStr = String(item.score).replace("分", "");
- // 将 score 转换为整数,如果转换失败则返回 0
- const score = parseInt(scoreStr, 10);
- return isNaN(score) ? 0 : score;
- });
- };
- onMounted(() => {
- handleResult();
- window.addEventListener("popstate", function (event) {
- // 执行一些操作,例如关闭当前页面或跳转到其他页面
- window.location.href = "/#/home";
- });
- });
- onBeforeUnmount(() => {
- window.removeEventListener("popstate", function (event) {
- // 执行一些操作,例如关闭当前页面或跳转到其他页面
- window.location.href = "/#/home";
- });
- });
- </script>
- <template>
- <div class="result" style="overflow: hidden">
- <NavBarPage title="考试" type="home" />
- <div style="height: 46px"></div>
- <div class="score">
- <span>最终得分</span>
- <p class="score-num">
- <span style="margin-right: 0.2rem;">{{ score }}</span>分
- </p>
- </div>
- <div style="height: 9.06rem; visibility: hidden"></div>
- <div class="content">
- <div style="width: 100vw; height: 19.06rem">
- <randarPage :randarList="randarlist" />
- </div>
- <div class="loading" v-show="loading">
- <van-loading color="#0094ff" size="26px" vertical>加载中...</van-loading>
- </div>
- <div class="standard">
- <div class="standard-title">
- <img src="../assets/robot.jpg" alt="" />
- <span>评分标准</span>
- </div>
- <div class="standard-content" v-for="(item, key) in scoresList" :key="key">
- <div class="standard-subtitle">
- <span class="pro">{{ item.name == "扣分项" ? item.name : `${item.name}(25分)` }}:</span>
- <span>{{ item.score }}</span>
- </div>
- <p>
- <span>得分原因:</span>
- <span>{{ item.reason }}</span>
- </p>
- </div>
- <div class="standard-content" style="margin-top: 1.5rem;">
- <div class="standard-title">
- <img src="../assets/robot.jpg" alt="" />
- <span>评分详解</span>
- </div>
- <div class="standard-content" v-for="(item, index) in defectsList" :key="index">
- <div class="standard-subtitle">
- <span class="pro">轮次{{item.rounds}}:</span>
- </div>
- <p>
- <span>原句:</span>
- <span>{{ item.original_sentence }}</span>
- </p>
- <p>
- <span>不足:</span>
- <span>{{ item.defect }}</span>
- </p>
- <p>
- <span>建议:</span>
- <span>{{ item.example }}</span>
- </p>
- </div>
- </div>
- </div>
- </div>
- </div>
- </template>
- <style scoped lang="less">
- html,
- body {
- margin: 0;
- padding: 0;
- height: 100vh;
- overflow: hidden;
- /* 禁止页面整体滚动 */
- }
- .result {
- width: 100%;
- height: 100%;
- /* height: 100vh; */
- overflow: hidden;
- }
- .score {
- position: fixed;
- z-index: 999;
- width: 100%;
- height: 9.06rem;
- background-color: rgba(243, 249, 255, 1);
- display: flex;
- flex-direction: column;
- align-items: center;
- justify-content: center;
- span {
- display: flex;
- width: 5.06rem;
- height: 2.88rem;
- font-weight: bold;
- line-height: 2.88rem;
- color: rgba(64, 149, 229, 1);
- font-size: 1rem;
- text-align: center;
- font-family: Times New Roman-regular;
- }
- .score-num {
- display: flex;
- align-items: last baseline;
- color: rgba(64, 149, 229, 1);
- font-size: 1rem;
- span {
- display: block;
- width: 5.06rem;
- height: 3.31rem;
- line-height: 4.25rem;
- font-size: 3rem;
- text-align: center;
- font-family: Times New Roman-regular;
- }
- }
- }
- .content {
- width: 100%;
- height: 100%;
- overflow: scroll;
- }
- .standard-title {
- display: flex;
- align-items: center;
- padding: 0 0.94rem;
- margin-bottom: 0.63rem;
- img {
- width: 1.5rem;
- height: 1.5rem;
- }
- span {
- display: inline-block;
- width: 4rem;
- height: 1.44rem;
- line-height: 1.44rem;
- margin-left: 0.33rem;
- color: rgba(64, 149, 229, 1);
- font-size: 1rem;
- text-align: center;
- font-family: Times New Roman-regular;
- }
- }
- .standard-subtitle {
- padding: 0.56rem 1rem;
- height: 1.06rem;
- font-size: 0.88rem;
- font-family: Times New Roman-regular;
- span {
- color: rgba(64, 149, 229, 1);
- font-weight: 600;
- }
- .pro {
- display: inline-block;
- height: 1.06rem;
- line-height: 1.06rem;
- padding: 0 0.3rem;
- font-weight: normal;
- color: rgba(102, 102, 102, 1);
- border-left: 0.3rem solid rgba(64, 149, 229, 1);
- }
- }
- .standard-content p {
- padding: 0 1.63rem;
- margin-bottom: 0.31rem;
- line-height: 1.25rem;
- color: rgba(102, 102, 102, 1);
- font-size: 0.88rem;
- text-align: left;
- font-family: SourceHanSansSC-bold;
- }
- .standard-content p span:nth-child(1) {
- font-weight: 600;
- }
- .loading {
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background-color: rgba(0, 0, 0, 0.5);
- display: flex;
- justify-content: center;
- align-items: center;
- z-index: 9999;
- }
- </style>
|