Ver Fonte

组件作业考试

shmily1213 há 1 mês atrás
pai
commit
779f6b5614

+ 3 - 2
src/api/modules/study.ts

@@ -1,6 +1,7 @@
 import { ApiResponse, ApiResponseList } from "@/types";
 import flyio from "../flyio";
 import { DirectedSchool, Examinee, ExamPaper, ExamPaperSubmit, GetExamPaperRequestDTO, Knowledge, KnowledgeListRequestDTO, KnowledgeRecord, OpenExamineeRequestDTO, PaperWork, PracticeHistory, PracticeRecord, SimulatedRecord, SimulationExamSubject, SimulationTestInfo, StudyPlan, Subject, SubjectListRequestDTO, VideoStudyRecord } from "@/types/study";
+import { EnumPaperWorkState } from "@/common/enum";
 
 /**
  * 获取学习计划
@@ -228,8 +229,8 @@ export function getTextbooksPracticeHistory() {
   return flyio.get('/front/student/record/coursePractice', {}) as Promise<ApiResponseList<PracticeHistory>>;
 }
 
-export function getPaperWorkList() {
-  return flyio.get('/front/student/record/test', {}) as Promise<ApiResponseList<PaperWork>>;
+export function getPaperWorkList(parmas: {state?: EnumPaperWorkState}) {
+  return flyio.get('/front/student/record/test', parmas) as Promise<ApiResponseList<PaperWork>>;
 }
 
 export function getPaperWorkStatistic() {

+ 11 - 0
src/common/enum.ts

@@ -308,4 +308,15 @@ export enum CardType {
    * 体验卡
    */
   EXPERIENCE = 9
+}
+
+export enum EnumPaperWorkState {
+  /**
+   * 未完成
+   */
+  NOT_COMPLETED = 2,
+  /**
+   * 已完成
+   */
+  COMPLETED = 4
 }

+ 12 - 3
src/pagesStudy/pages/exam-start/components/exam-navbar.vue

@@ -29,7 +29,16 @@ const { transferTo, transferBack } = useTransferPage();
 const examPageOptions = inject(EXAM_PAGE_OPTIONS) || {} as Transfer.ExamAnalysisPageOptions;
 const examData = inject(EXAM_DATA) || {} as ReturnType<typeof useExam>;
 const { formatPracticeDuration, practiceDuration } = examData;
-
+const titleMap = {
+  [EnumPaperType.PRACTICE]: '知识点练习',
+  [EnumPaperType.SIMULATED]: '模拟考试',
+  [EnumPaperType.TEST]: '组卷作业',
+}
+const readonlyTitleMap = {
+  [EnumPaperType.PRACTICE]: '练习解析',
+  [EnumPaperType.SIMULATED]: '考试解析',
+  [EnumPaperType.TEST]: '作业解析',
+}
 const isPractice = computed(() => {
   return examPageOptions?.paperType === EnumPaperType.PRACTICE;
 });
@@ -37,9 +46,9 @@ const pageTitle = computed(() => {
   if (examPageOptions) {
     const { name, readonly, paperType } = examPageOptions;
     if (readonly) {
-      return paperType === EnumPaperType.SIMULATED ? '考试解析' : '练习解析';
+      return readonlyTitleMap[paperType as keyof typeof readonlyTitleMap];
     }
-    return paperType === EnumPaperType.SIMULATED ? '模拟考试' : '知识点练习';
+    return titleMap[paperType as keyof typeof titleMap];
   }
   return '练习';
 });

+ 1 - 1
src/pagesStudy/pages/exam-start/exam-start.vue

@@ -92,7 +92,7 @@ provide(EXAM_AUTO_SUBMIT, autoSubmit);
 
 const isExam = computed(() => {
   // prevData.value
-  return prevData.value.paperType === EnumPaperType.SIMULATED;
+  return prevData.value.paperType === EnumPaperType.SIMULATED || prevData.value.paperType === EnumPaperType.TEST;
 });
 
 const isReadOnly = computed(() => {

+ 25 - 17
src/pagesStudy/pages/homework/components/paper-work.vue

@@ -3,43 +3,45 @@
     <view class="border-bottom flex items-center justify-between py-32 px-25 leading-27">
       <view class="text-28 text-fore-light flex items-center">
         <view class="w-12 h-12 rounded-full bg-[#E5E5E5]"></view>
-        <view class="ml-10">2025年09月20日</view>
-        <view class="ml-20">发布人: 李老师</view>
+        <view class="ml-10">{{ publishTime }}</view>
+        <view class="ml-20">发布人: {{ data.publishUser }}</view>
       </view>
-      <view>
-        未完成
+      <view :class="['text-28', data.state === EnumPaperWorkState.NOT_COMPLETED ? 'text-warning' : 'text-success']">
+        {{ data.state === EnumPaperWorkState.NOT_COMPLETED ? '未完成' : '已完成' }}
       </view>
     </view>
     <view class="px-46 py-30 relative">
       <view>
-        <text class="text-28 text-fore-title font-bold">长沙民政职业技术学院-大数据与会计</text>
-        <text
+        <text class="text-28 text-fore-title font-bold">{{ data.universityName }}-{{ data.majorName }}</text>
+        <text v-if="data.directed"
           class="ml-10 bg-[#F0FDF4] text-[#22C55E] border border-solid border-[#22C55E] text-20 rounded-4 px-10 py-2">定向</text>
       </view>
       <view class="mt-40 ml-20 text-24 ">
         <view>
           <text class="text-fore-light">得分/总分:</text>
-          <text class="text-fore-title">-/300</text>
+          <text class="text-fore-title">{{ data.score || '-' }}/{{ data.total }}</text>
         </view>
         <view class="mt-14">
-          <text class="text-fore-light">科目/批次:</text>
+          <text class="text-fore-light">批次/科目:</text>
           <text class="text-fore-title">{{ batchName }}</text>
         </view>
         <view class="mt-14">
           <text class="text-fore-light">所属校区:</text>
-          <text class="text-fore-title">培训校区</text>
+          <text class="text-fore-title">{{ data.campusName }}</text>
         </view>
       </view>
       <view class="absolute right-50 top-100">
-        <!-- <view class="px-28 py-10 border border-solid border-primary rounded-full text-24 text-primary bg-[#EEF8FD]">详情
-        </view> -->
-        <view class="text-24 text-white bg-primary px-28 py-10 rounded-full" @click="handleStart">去完成</view>
+        <view v-if="data.state === EnumPaperWorkState.COMPLETED"
+          class="px-28 py-10 border border-solid border-primary rounded-full text-24 text-primary bg-[#EEF8FD]"
+          @click="handleDetail">详情
+        </view>
+        <view v-else class="text-24 text-white bg-primary px-28 py-10 rounded-full" @click="handleStart">去完成</view>
       </view>
     </view>
   </view>
 </template>
 <script lang="ts" setup>
-import { EnumPaperType } from '@/common/enum';
+import { EnumPaperType, EnumPaperWorkState } from '@/common/enum';
 import { useTransferPage } from '@/hooks/useTransferPage';
 import { Study } from '@/types';
 const { transferTo } = useTransferPage();
@@ -50,18 +52,24 @@ const props = defineProps<{
 const batchName = computed(() => {
   const names = props.data.name.split('_');
   return `${names[0]}(${names[1]})`
-})
+});
+const publishTime = computed(() => {
+  return uni.$ie.formatTime(props.data.publishTime, 'yyyy年mm月dd日 hh:MM:ss');
+});
+
+const handleDetail = () => {
+  console.log(props.data);
+}
 
 const handleStart = () => {
   console.log(props.data);
   transferTo('/pagesStudy/pages/exam-start/exam-start', {
     data: {
-      name: '知识点练习-' + props.data.name,
+      name: '组卷作业-' + batchName.value,
       paperType: EnumPaperType.TEST,
       practiceInfo: {
         // name: node.name,
-        // relateId: 24,
-        relateId: 767,
+        relateId: props.data.id,
         directed: true
       },
     }

+ 18 - 8
src/pagesStudy/pages/homework/homework.vue

@@ -2,7 +2,7 @@
   <ie-page bg-color="#F6F8FA" :fix-height="true">
     <ie-navbar title="组卷作业" />
     <view class="bg-white">
-      <uv-tabs :list="list" :activeStyle="activeStyle" :inactiveStyle="inactiveStyle" :scrollable="false"
+      <uv-tabs :current="currentTab" :list="tabList" :activeStyle="activeStyle" :inactiveStyle="inactiveStyle" :scrollable="false"
         @change="handleTabChange"></uv-tabs>
     </view>
     <view class="flex-1 min-h-1 relative">
@@ -27,6 +27,7 @@ import { useImage } from '@/hooks/useImage';
 import PaperWorkItem from './components/paper-work.vue';
 import { getPaperWorkList, getPaperWorkStatistic } from '@/api/modules/study';
 import { Study } from '@/types';
+import { EnumPaperWorkState } from '@/common/enum';
 
 const { resolvePath } = useImage();
 const activeStyle = {
@@ -47,29 +48,38 @@ const emptyViewTextStyle = {
   fontSize: '30rpx',
   marginTop: '40rpx'
 }
-const list = ref([
+const tabList = ref([
   {
     name: '全部(0)',
-    value: '全部'
+    value: '全部',
+    state: undefined
   },
   {
     name: '未完成(0)',
-    value: '未完成'
+    value: '未完成',
+    state: EnumPaperWorkState.NOT_COMPLETED
   },
   {
     name: '已完成(0)',
-    value: '已完成'
+    value: '已完成',
+    state: EnumPaperWorkState.COMPLETED
   }
 ])
 const dataList = ref<Study.PaperWork[]>([]);
 const paging = ref<any>(null);
+const currentTab = ref(0);
 const handleTabChange = (item: any) => {
-  console.log(item);
+  currentTab.value = item.index;
   paging.value.reload();
 }
 const handleQuery = (page: number, pageSize: number) => {
   uni.$ie.showLoading();
-  getPaperWorkList().then(res => {
+  const params = {} as {state?: EnumPaperWorkState};
+  const state = tabList.value[currentTab.value].state;
+  if (state) {
+    params.state = state;
+  }
+  getPaperWorkList(params).then(res => {
     paging.value.complete(res.rows);
   }).catch(err => {
     paging.value.complete(false);
@@ -80,7 +90,7 @@ const handleQuery = (page: number, pageSize: number) => {
 }
 const loadStatistic = () => {
   getPaperWorkStatistic().then(res => {
-    list.value.forEach(item => {
+    tabList.value.forEach(item => {
       const cate = res.data.find(c => c.hasOwnProperty(item.value))
       if (cate) {
         item.name = `${item.value}(${cate[item.value]})`;

+ 16 - 8
src/types/study.ts

@@ -1,4 +1,4 @@
-import { EnumReviewMode, EnumSimulatedRecordStatus } from "@/common/enum";
+import { EnumPaperWorkState, EnumReviewMode, EnumSimulatedRecordStatus } from "@/common/enum";
 
 export interface TeachClass {
   classId: number;
@@ -370,11 +370,19 @@ export interface PracticeHistory {
  * 组卷作业
  */
 export interface PaperWork {
-  id: number,
-  name: string,
-  subjectId: number,
-  total: number,
-  state: number,
-  subjectName: string,
-  date: string
+  id: number;
+  name: string;
+  subjectId: number;
+  total: number;
+  state: EnumPaperWorkState;
+  subjectName: string;
+  date: string;
+  campusName: string;
+  directed: boolean;
+  majorName: string;
+  publishUser: string;
+  publishTime: string;
+  schoolName: string;
+  score: number;
+  universityName: string;
 }

+ 3 - 3
src/utils/uni-tool.ts

@@ -85,7 +85,7 @@ export interface IeTool {
    * @param time - 时间
    * @returns 格式化后的时间
    */
-  formatTime(time: number): string;
+  formatTime(time: number | string, format: string): string;
 }
 
 const defaultModalOptions: IModalOptions = {
@@ -173,12 +173,12 @@ const tool: IeTool = {
   formatPrice(price: number) {
     return price / 100;
   },
-  formatTime(time: number) {
+  formatTime(time: number | string, format: string = 'yyyy-mm-dd hh:MM:ss') {
     if (!time) {
       return '';
     }
     // @ts-ignore
-    return uni.$uv.timeFormat(time, 'yyyy-mm-dd hh:MM:ss')
+    return uni.$uv.timeFormat(time, format)
   }
 };