瀏覽代碼

对比项目多选

zhangjie 1 年之前
父節點
當前提交
01fde610d5

+ 2 - 2
package.json

@@ -1,6 +1,6 @@
 {
   "name": "exam-score-statistic-web-admin",
-  "version": "0.0.0",
+  "version": "1.2.1",
   "private": "true",
   "scripts": {
     "start": "vite --host 0.0.0.0 --port 3030",
@@ -59,4 +59,4 @@
     "vue-eslint-parser": "^8.2.0",
     "vue-tsc": "^0.31.2"
   }
-}
+}

+ 1 - 1
src/api/allAnalysisPage.ts

@@ -56,7 +56,7 @@ export function batchExportProjectReport(params: {
 // 报告导出流程api ----->
 // 获取报告导出任务信息
 export function getProjectReportTask(params: {
-  compareProjectId?: number;
+  compareProjectId?: number[];
   projectId: number;
 }) {
   return httpApp.post<

+ 16 - 2
src/components/ProjectsSelect.vue

@@ -12,6 +12,7 @@
       v-for="(item, index) in optionList"
       :key="index"
       :value="item.id"
+      :disabled="getDisabledState(item.id)"
     >
       {{ item.name }}
     </a-select-option>
@@ -28,11 +29,13 @@ const {
   rootOrgId = -1,
   disabled = false,
   disableIds = [],
+  maxCount = 4,
 } = defineProps<{
   value?: number | number[];
   rootOrgId: number;
   disabled?: boolean;
   disableIds?: number[];
+  maxCount?: number;
 }>();
 const emit = defineEmits(["update:value"]);
 
@@ -51,6 +54,17 @@ async function fetchData() {
     optionList = optionList.filter((item) => !disableIds.includes(item.id));
   }
 }
+
+function getDisabledState(id: number): boolean {
+  if (!isMultiple) return false;
+
+  const vals = value as number[];
+
+  if (vals.length >= maxCount) {
+    return !vals.includes(id);
+  }
+  return false;
+}
 onMounted(fetchData);
 onUpdated(fetchData);
 
@@ -62,9 +76,9 @@ const isMultiple = $computed(() => Array.isArray(value));
 //   return res as undefined | string;
 // });
 
-function handleChange(v: string) {
+function handleChange(v: any) {
   // console.log(v, v.length, value);
   // 最多只有2项
-  emit("update:value", isMultiple ? v.slice(0, 2) : v);
+  emit("update:value", v);
 }
 </script>

+ 2 - 2
src/features/paperAnalysis/PaperAnalysis.vue

@@ -138,7 +138,7 @@ let pageNo = $ref(1);
 let paperQuestions = $ref<SASQuestion[]>([]);
 let paperQuestionGroups = $ref<SASQuestionGroup[]>([]);
 let curProject = $ref<Project>({} as Project);
-let compareProjectId = $ref<number>();
+let compareProjectId = $ref<number[]>([]);
 // let sasPaper = $ref<SASPaper>({} as SASPaper);
 
 async function search() {
@@ -223,7 +223,7 @@ function toViewReport() {
   // eslint-disable-next-line @typescript-eslint/no-unsafe-call
   selectProjectRef.showModal();
 }
-function projectSelected(projectId: number) {
+function projectSelected(projectId: number[]) {
   compareProjectId = projectId;
   activeTab = "7";
 }

+ 2 - 1
src/features/paperAnalysis/SelectProject.vue

@@ -12,6 +12,7 @@
           v-model:value="projectId"
           :rootOrgId="rootOrgId"
           :disableIds="props.disableIds"
+          :max-count="4"
           placeholder="请选择对比项目"
           style="width: 400px"
         />
@@ -34,7 +35,7 @@ let rootOrgId = $ref(undefined as unknown as number);
 const store = useMainStore();
 
 let visible = $ref<boolean>(false);
-let projectId = $ref<number>();
+let projectId = $ref<number[]>([]);
 
 const showModal = () => {
   visible = true;

+ 13 - 0
src/features/projectManagement/ProjectManagement.vue

@@ -158,6 +158,13 @@
             :disabled="!!projectObj.id"
           ></a-input>
         </a-form-item>
+        <a-form-item label="年份">
+          <a-input
+            v-model:value="projectObj.year"
+            :maxlength="4"
+            type="number"
+          ></a-input>
+        </a-form-item>
         <a-form-item label="项目名称">
           <a-input v-model:value="projectObj.name" :maxlength="50"></a-input>
         </a-form-item>
@@ -248,6 +255,11 @@ const columns = [
     dataIndex: "id",
     width: 80,
   },
+  {
+    title: "年份",
+    dataIndex: "year",
+    width: 100,
+  },
   {
     title: "项目名称",
     dataIndex: "name",
@@ -319,6 +331,7 @@ const initProject = <Project>(<unknown>{
   id: undefined,
   code: "",
   name: "",
+  year: "",
   enable: true,
   type: undefined,
   rootOrgId: store.userInfo.rootOrgId,

+ 2 - 2
src/features/report/ReportBatchDownload.vue

@@ -68,7 +68,7 @@ const props = defineProps<{
 
 let selectProjectRef = $ref(null);
 let taskId = $ref(undefined as unknown as number);
-let compareProjectId = $ref(undefined as unknown as number);
+let compareProjectId = $ref(undefined as unknown as number[]);
 let curPaperId = $ref<number>();
 let paperIds = $shallowRef<number[]>([]);
 let finishPaperIds = $shallowRef<number[]>([]);
@@ -113,7 +113,7 @@ function exportReport() {
   // eslint-disable-next-line @typescript-eslint/no-unsafe-call
   selectProjectRef.showModal();
 }
-async function projectSelected(projectId: number) {
+async function projectSelected(projectId: number[]) {
   loadModalVisible = true;
   compareProjectId = projectId;
   addProgress({

+ 10 - 8
src/features/report/ReportMain.vue

@@ -86,7 +86,7 @@ const store = useMainStore();
 const props = defineProps<{
   paperId?: number;
   projectId?: number;
-  compareProjectId?: number;
+  compareProjectId?: number[];
   viewType?: string;
 }>();
 
@@ -96,7 +96,7 @@ let reportRef = $ref<Node>();
 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 compareProjectId = $ref(undefined as unknown as number[]);
 let viewType = $ref("view");
 
 let sasPaper = $ref<SASPaper>({} as SASPaper);
@@ -129,12 +129,14 @@ onMounted(async () => {
     if (props.paperId) {
       projectId = props.projectId as number;
       paperId = props.paperId;
-      compareProjectId = props.compareProjectId as number;
+      compareProjectId = props.compareProjectId as number[];
       viewType = props.viewType as string;
     } else {
       projectId = +route.params.projectId;
       paperId = +route.params.paperId;
-      compareProjectId = +route.params.compareProjectId;
+      compareProjectId = props.compareProjectId as number[];
+      console.log(compareProjectId);
+
       viewType = route.params.viewType as string;
 
       if (viewType !== "frame") {
@@ -219,13 +221,13 @@ async function fetchData() {
   await fetchPaperQuestions();
   await fetchSasCourse();
 
-  if (compareProjectId) {
+  if (compareProjectId.length) {
     await fetchComparePaperData();
     await fetchCompareCourseData();
   }
 
   if (
-    !compareProjectId ||
+    !compareProjectId.length ||
     comparePapers.length !== 2 ||
     compareCourses.length !== 2
   ) {
@@ -303,7 +305,7 @@ function scoreTitle(rangeConfig: RangeConfig) {
 
 async function fetchComparePaperData() {
   const res = await getPaperCompareList({
-    projectIds: [compareProjectId],
+    projectIds: compareProjectId,
     contrastProjectId: projectId,
     courseCode: sasPaper.courseCode,
   });
@@ -319,7 +321,7 @@ async function fetchComparePaperData() {
 
 async function fetchCompareCourseData() {
   const res = await getPaperCompareScoreList({
-    projectIds: [compareProjectId],
+    projectIds: compareProjectId,
     contrastProjectId: projectId,
     courseCode: sasPaper.courseCode,
   });

+ 1 - 0
src/types/index.ts

@@ -171,6 +171,7 @@ export interface Project {
   creator: string;
   id: number;
   name: string;
+  year: string;
   needCompute: boolean;
   rootOrgCode: string;
   rootOrgName: string;