zhangjie 2 éve
szülő
commit
6e09f49660

+ 4 - 2
src/components/ProjectSelect.vue

@@ -26,7 +26,7 @@ const props = defineProps<{
   projectId: number;
   disabled?: boolean;
 }>();
-const emit = defineEmits(["update:value"]);
+const emit = defineEmits(["update:value", "change"]);
 
 let optionList = $ref<{ id: number; name: string }[]>([]);
 
@@ -46,7 +46,9 @@ const valueStr = computed(() => {
   return res as undefined | string;
 });
 
-function handleChange(v: string) {
+function handleChange(v: number) {
   emit("update:value", v);
+  const option = optionList.find((item) => item.id === v);
+  emit("change", option);
 }
 </script>

+ 10 - 11
src/features/allAnalysis/AllAnalysis2.vue

@@ -44,7 +44,6 @@
             <span>
               <!-- <a-button @click="openModal">说明</a-button> -->
               <a-button @click="goPaperAnalysis(record)">详情</a-button>
-              <a-button @click="toReport(record)">报告</a-button>
             </span>
           </template>
         </a-table>
@@ -283,14 +282,14 @@ async function tableChange(
 //   EventBus.emit("SHOW_SETTING", "DESCRIBE010");
 // }
 
-async function toReport(record: SASPaper) {
-  await router.push({
-    name: "PaperReport",
-    params: {
-      viewType: "view",
-      projectId: projectId,
-      paperId: record.paperId,
-    },
-  });
-}
+// async function toReport(record: SASPaper) {
+//   await router.push({
+//     name: "PaperReport",
+//     params: {
+//       viewType: "view",
+//       projectId: projectId,
+//       paperId: record.paperId,
+//     },
+//   });
+// }
 </script>

+ 54 - 9
src/features/paperAnalysis/PaperAnalysis.vue

@@ -5,6 +5,7 @@
         v-model:value="projectId"
         disabled
         :projectId="projectId"
+        @change="projectChange"
       />
       <span class="tw-mr-4"></span>
       <ProjectCourseSelect
@@ -25,14 +26,24 @@
     </div>
 
     <div class="tw-bg-white tw-p-5 tw-rounded-xl">
-      <a-radio-group v-model:value="activeTab">
-        <a-radio-button value="6">科目频数分布</a-radio-button>
-        <a-radio-button value="1">试卷题目编排</a-radio-button>
-        <a-radio-button value="2">试题特征量数</a-radio-button>
-        <a-radio-button value="5">试题难度分组分布</a-radio-button>
-        <a-radio-button value="3">题型难度分布</a-radio-button>
-        <a-radio-button value="4">题型区分度分布</a-radio-button>
-      </a-radio-group>
+      <div class="tw-flex tw-items-center tw-justify-between">
+        <a-radio-group v-model:value="activeTab">
+          <a-radio-button value="6">科目频数分布</a-radio-button>
+          <a-radio-button value="1">试卷题目编排</a-radio-button>
+          <a-radio-button value="2">试题特征量数</a-radio-button>
+          <a-radio-button value="5">试题难度分组分布</a-radio-button>
+          <a-radio-button value="3">题型难度分布</a-radio-button>
+          <a-radio-button value="4">题型区分度分布</a-radio-button>
+        </a-radio-group>
+
+        <a-button
+          :type="activeTab === '7' ? 'primary' : 'default'"
+          class="tw-mr"
+          @click="toViewReport"
+          >报告预览</a-button
+        >
+      </div>
+
       <div class="tw-my-4"></div>
 
       <div v-if="activeTab === '1'">
@@ -67,7 +78,17 @@
       <div v-if="activeTab === '6'">
         <ScoreRate v-if="courseId" :courseId="courseId" />
       </div>
+      <div v-if="activeTab === '7'">
+        <PaperReport
+          :projectId="projectId"
+          viewType="view"
+          :paperId="paperId"
+          :compareProjectId="compareProjectId"
+        />
+      </div>
     </div>
+
+    <SelectProject ref="selectProjectRef" @confirm="projectSelected" />
   </div>
 </template>
 
@@ -89,7 +110,10 @@ import QuestionDifficultyGroup from "./QuestionDifficultyGroup.vue";
 import QuestionTypeDifficulty from "./QuestionTypeDifficulty.vue";
 import QuestionTypeDiscrimination from "./QuestionTypeDiscrimination.vue";
 import ScoreRate from "../allAnalysis/ScoreRate.vue";
-import { Paper, SASQuestion, SASQuestionGroup } from "@/types";
+import SelectProject from "./SelectProject.vue";
+import PaperReport from "../report/ReportMain.vue";
+import { Paper, SASQuestion, SASQuestionGroup, Project } from "@/types";
+import { message } from "ant-design-vue";
 
 const store = useMainStore();
 store.currentLocation = "项目管理 / 项目列表 / 详情";
@@ -113,6 +137,8 @@ let pageNo = $ref(1);
 
 let paperQuestions = $ref<SASQuestion[]>([]);
 let paperQuestionGroups = $ref<SASQuestionGroup[]>([]);
+let curProject = $ref<Project>({} as Project);
+let compareProjectId = $ref<number>();
 // let sasPaper = $ref<SASPaper>({} as SASPaper);
 
 async function search() {
@@ -175,4 +201,23 @@ async function fetchData() {
 onMounted(async () => {
   await search();
 });
+
+let selectProjectRef = $ref(null);
+
+function projectChange(val: Project) {
+  curProject = val;
+}
+function toViewReport() {
+  if (curProject && curProject.needCompute) {
+    void message.info("有数据更新请重新计算");
+    return;
+  }
+  // @ts-ignore
+  // eslint-disable-next-line @typescript-eslint/no-unsafe-call
+  selectProjectRef.showModal();
+}
+function projectSelected(projectId: number) {
+  compareProjectId = projectId;
+  activeTab = "7";
+}
 </script>

+ 47 - 0
src/features/paperAnalysis/SelectProject.vue

@@ -0,0 +1,47 @@
+<template>
+  <a-modal
+    v-model:visible="visible"
+    title="选择对比项目"
+    okText="确定"
+    cancelText="取消"
+    @ok="handleOk"
+  >
+    <a-form :labelCol="{ span: 4 }">
+      <a-form-item>
+        <ProjectsSelect
+          v-model:value="projectId"
+          :rootOrgId="rootOrgId"
+          placeholder="请选择对比项目"
+          style="width: 400px"
+        />
+      </a-form-item>
+    </a-form>
+  </a-modal>
+</template>
+
+<script setup lang="ts">
+import { useMainStore } from "@/store";
+import { onMounted } from "vue";
+
+const emit = defineEmits(["confirm"]);
+
+let rootOrgId = $ref(undefined as unknown as number);
+const store = useMainStore();
+
+let visible = $ref<boolean>(false);
+let projectId = $ref<number>();
+
+const showModal = () => {
+  visible = true;
+};
+defineExpose({ showModal });
+
+onMounted(() => {
+  rootOrgId = store.userInfo.rootOrgId;
+});
+
+function handleOk() {
+  emit("confirm", projectId);
+  visible = false;
+}
+</script>

+ 39 - 7
src/features/report/ReportMain.vue

@@ -73,18 +73,28 @@ import { RANGE_POINT_TYPE } from "@/constants/constants";
 import { SASPaper, SASQuestion, SasCourse, RangeConfig } from "@/types";
 import { useRoute } from "vue-router";
 import { computed, onMounted, nextTick, reactive } from "vue";
+import { useMainStore } from "@/store";
+const store = useMainStore();
+
+const props = defineProps<{
+  paperId: number;
+  projectId: number;
+  compareProjectId?: number;
+  viewType: string;
+}>();
+
+const route = useRoute();
 
 let courseId = $ref(undefined as unknown as number);
+let projectId = $ref(undefined as unknown as number);
+let paperId = $ref(undefined as unknown as number);
+let compareProjectId = $ref(undefined as unknown as number);
+let viewType = $ref("view");
+
 let sasPaper = $ref<SASPaper>({} as SASPaper);
 let sasCourse = $ref<SasCourse>({} as SasCourse);
 let scoreGap = $ref(0);
 
-const route = useRoute();
-const projectId = +route.params.projectId;
-const paperId = +route.params.paperId;
-const compareProjectId = +route.params.compareProjectId;
-const viewType = route.params.viewType;
-
 let comparePapers = $ref<SASPaper[]>([]);
 let compareCourses = $ref<SasCourse[]>([]);
 
@@ -102,12 +112,34 @@ let partNos = reactive({
 const hasCompareProject = computed(() => !!compareProjectId);
 
 onMounted(async () => {
+  if (props.paperId) {
+    projectId = props.projectId;
+    paperId = props.paperId;
+    compareProjectId = props.compareProjectId as number;
+    viewType = props.viewType;
+  } else {
+    projectId = +route.params.projectId;
+    paperId = +route.params.paperId;
+    compareProjectId = +route.params.compareProjectId;
+    viewType = route.params.viewType as string;
+
+    const key = window.location.href.split("?")[1];
+    if (!key) return;
+    let keyVal = window.atob(key);
+    let user = JSON.parse(keyVal);
+    console.log(user);
+
+    store.setUserInfo(user);
+  }
+  // http://192.168.10.128:3030/web/report/print/4/101/1?eyJpZGVudGl0eSI6IiRVU0VSX1NFU1NJT05fLTEiLCJ0b2tlbiI6IkM4Y2pWTERnNWFGSVFDV29SR3czMHBSQ0d1d1UxWnM1In0=
+
   await fetchData();
 
   await nextTick();
 
   commonInfoUpdate();
-  publishReady();
+
+  if (viewType === "print") publishReady();
 });
 
 function commonInfoUpdate() {

+ 1 - 0
src/features/report/assets/report.css

@@ -187,6 +187,7 @@
 .intro-table th {
   background-color: #0091ff;
   color: #fff;
+  border-color: rgba(255, 255, 255, 0.1);
 }
 .intro-table td:first-child,
 .intro-table th:first-child {

+ 1 - 1
src/router/index.ts

@@ -141,7 +141,7 @@ export async function routeLogout(params: {
 
 router.beforeEach((to, from, next) => {
   const token = getToken();
-  if (isNil(token) && to.path.includes("/login") === false) {
+  if (isNil(token) && !to.path.includes("/login") && !to.path.includes('/report')) {
     routeLogout({ cause: "missingToken", redirectTo: to.fullPath })
       .then(() => next(false))
       .catch((e) => console.log(e));

+ 2 - 2
vite.config.ts

@@ -3,9 +3,9 @@ import vue from "@vitejs/plugin-vue";
 import ViteComponents from "unplugin-vue-components/vite";
 import { AntDesignVueResolver } from "unplugin-vue-components/resolvers";
 
-// const SERVER_URL = "http://192.168.10.108:7180";
+const SERVER_URL = "http://192.168.10.108:7180";
 // const SERVER_URL = "http://192.168.10.138:13800";
-const SERVER_URL = "http://192.168.10.39:7180";
+// const SERVER_URL = "http://192.168.10.39:7180";
 // const SERVER_URL = "http://192.168.10.54:8001";
 const path = require("path");