Browse Source

Merge branch 'master' into zhuf

bzkf3 2 years ago
parent
commit
707aab57e9
36 changed files with 4396 additions and 1377 deletions
  1. 2 1
      .vscode/settings.json
  2. 4 0
      auto-imports.d.ts
  3. 3 9
      components.d.ts
  4. BIN
      public/images/icon-close.png
  5. BIN
      public/images/loading-new.gif
  6. BIN
      public/images/subject-bg.png
  7. BIN
      src/assets/ksfx/examPreview.png
  8. 7 3
      src/components/leftSider/index.vue
  9. 81 0
      src/components/statisticsSchool/index.vue
  10. 2 2
      src/main.ts
  11. 121 111
      src/pages/ksfx/cjfx_cjd.vue
  12. 58 40
      src/pages/ksfx/cjfx_fsdtj.vue
  13. 53 36
      src/pages/ksfx/cjfx_jstj.vue
  14. 60 43
      src/pages/ksfx/cjfx_pjflcfx.vue
  15. 58 39
      src/pages/ksfx/cjfx_slyf.vue
  16. 0 13
      src/pages/ksfx/index.vue
  17. 186 0
      src/pages/ksfx/ksfx.vue
  18. 25 26
      src/pages/ksfx/sjfx_kgtfx.vue
  19. 73 96
      src/pages/ksfx/sjfx_ztfx.vue
  20. 0 171
      src/pages/ksfx/stu_ksfx.vue
  21. 98 18
      src/pages/ksfx/stu_wdsj.vue
  22. 20 2
      src/pages/process/api.js
  23. 142 108
      src/pages/process/create/index.vue
  24. 39 11
      src/pages/process/detail/[id].vue
  25. 307 0
      src/pages/process/edit/[id].vue
  26. 740 0
      src/pages/process/fjct/[ze_id]/[zs_id].vue
  27. 0 378
      src/pages/process/fjct/index.vue
  28. 289 268
      src/pages/process/index.vue
  29. 418 0
      src/pages/process/kdsmjd/[ykj_id].vue
  30. 178 0
      src/pages/process/kdsmjd/detail/[id].vue
  31. 2 2
      src/pages/process/paper-scan/[id].vue
  32. 430 0
      src/pages/process/pyjd/[ykj_id].vue
  33. 298 0
      src/pages/process/smpyjd/[ykj_id].vue
  34. 199 0
      src/pages/process/smpyjd/detail/[ykj_id]/[ze_id].vue
  35. 245 0
      src/pages/process/xgcj/[id].vue
  36. 258 0
      src/pages/process/xgfs/[ze_id]/[ysk_id].vue

+ 2 - 1
.vscode/settings.json

@@ -8,5 +8,6 @@
     "*.css": "postcss"
   },
   "editor.formatOnSave": false,
-  "vue.features.codeActions.enable": false
+  "vue.features.codeActions.enable": false,
+  "vue.codeActions.enabled": false
 }

+ 4 - 0
auto-imports.d.ts

@@ -12,6 +12,8 @@ declare global {
   const $shallowRef: typeof import('vue/macros')['$shallowRef']
   const $toRef: typeof import('vue/macros')['$toRef']
   const EffectScope: typeof import('vue')['EffectScope']
+  const ElMessage: typeof import('element-plus/es')['ElMessage']
+  const ElMessageBox: typeof import('element-plus/es')['ElMessageBox']
   const asyncComputed: typeof import('@vueuse/core')['asyncComputed']
   const autoResetRef: typeof import('@vueuse/core')['autoResetRef']
   const computed: typeof import('vue')['computed']
@@ -296,6 +298,8 @@ declare module 'vue' {
     readonly $shallowRef: UnwrapRef<typeof import('vue/macros')['$shallowRef']>
     readonly $toRef: UnwrapRef<typeof import('vue/macros')['$toRef']>
     readonly EffectScope: UnwrapRef<typeof import('vue')['EffectScope']>
+    readonly ElMessage: UnwrapRef<typeof import('element-plus/es')['ElMessage']>
+    readonly ElMessageBox: UnwrapRef<typeof import('element-plus/es')['ElMessageBox']>
     readonly asyncComputed: UnwrapRef<typeof import('@vueuse/core')['asyncComputed']>
     readonly autoResetRef: UnwrapRef<typeof import('@vueuse/core')['autoResetRef']>
     readonly computed: UnwrapRef<typeof import('vue')['computed']>

+ 3 - 9
components.d.ts

@@ -11,11 +11,11 @@ declare module '@vue/runtime-core' {
   export interface GlobalComponents {
     BreadCrumb: typeof import('./src/components/BreadCrumb/index.vue')['default']
     CommonFooter: typeof import('./src/components/commonFooter/index.vue')['default']
-    copy: typeof import('./src/components/leftSider copy/index.vue')['default']
-    ElAvatar: typeof import('element-plus/es')['ElAvatar']
     ElBreadcrumb: typeof import('element-plus/es')['ElBreadcrumb']
     ElBreadcrumbItem: typeof import('element-plus/es')['ElBreadcrumbItem']
     ElButton: typeof import('element-plus/es')['ElButton']
+    ElCarousel: typeof import('element-plus/es')['ElCarousel']
+    ElCarouselItem: typeof import('element-plus/es')['ElCarouselItem']
     ElCollapse: typeof import('element-plus/es')['ElCollapse']
     ElCollapseItem: typeof import('element-plus/es')['ElCollapseItem']
     ElConfigProvider: typeof import('element-plus/es')['ElConfigProvider']
@@ -27,13 +27,9 @@ declare module '@vue/runtime-core' {
     ElInput: typeof import('element-plus/es')['ElInput']
     ElMenu: typeof import('element-plus/es')['ElMenu']
     ElMenuItem: typeof import('element-plus/es')['ElMenuItem']
-    ElMenuItemGroup: typeof import('element-plus/es')['ElMenuItemGroup']
     ElOption: typeof import('element-plus/es')['ElOption']
     ElPagination: typeof import('element-plus/es')['ElPagination']
-    ElRadio: typeof import('element-plus/es')['ElRadio']
-    ElRadioGroup: typeof import('element-plus/es')['ElRadioGroup']
     ElSelect: typeof import('element-plus/es')['ElSelect']
-    ElSelectV2: typeof import('element-plus/es')['ElSelectV2']
     ElSubMenu: typeof import('element-plus/es')['ElSubMenu']
     ElTable: typeof import('element-plus/es')['ElTable']
     ElTableColumn: typeof import('element-plus/es')['ElTableColumn']
@@ -42,8 +38,6 @@ declare module '@vue/runtime-core' {
     NavHeader: typeof import('./src/components/NavHeader/index.vue')['default']
     RouterLink: typeof import('vue-router')['RouterLink']
     RouterView: typeof import('vue-router')['RouterView']
-    TheCounter: typeof import('./src/components/TheCounter.vue')['default']
-    TheFooter: typeof import('./src/components/TheFooter.vue')['default']
-    TheInput: typeof import('./src/components/TheInput.vue')['default']
+    StatisticsSchool: typeof import('./src/components/statisticsSchool/index.vue')['default']
   }
 }

BIN
public/images/icon-close.png


BIN
public/images/loading-new.gif


BIN
public/images/subject-bg.png


BIN
src/assets/ksfx/examPreview.png


+ 7 - 3
src/components/leftSider/index.vue

@@ -1,7 +1,12 @@
 <template>
   <div class="leftSideMenu">
     <!-- @open="handleOpen" @close="handleClose" -->
-    <el-menu  class="el-menu-vertical-demo" :default-active="props.activeIndex" :collapse-transition="false" :default-openeds="openeds" @select="selectMenu">
+    <el-menu  class="el-menu-vertical-demo"
+    :default-active="props.activeIndex"
+    :collapse="false"
+    :collapse-transition="false"
+    :default-openeds="openeds"
+    @select="selectMenu">
           <el-sub-menu index="1">
             <template #title>
               <el-icon>
@@ -40,7 +45,6 @@ const props = defineProps(['activeIndex']);
 const emit = defineEmits(['parentClick'])
 
 
-const isCollapse = ref(false)
 const openeds = ref(['1-1', '1-2', '1-3', '1-4', '1-5', '2-1', '2-2']);
 
 const selectMenu = (key: string, keyPath: string[]) => {
@@ -65,7 +69,7 @@ const selectMenu = (key: string, keyPath: string[]) => {
     case '2-1'://总体分析
       router.push('sjfx_ztfx')
       break;
-    case '2-1'://客观题分析
+    case '2-2'://客观题分析
       router.push('sjfx_kgtfx')
       break;
   }

+ 81 - 0
src/components/statisticsSchool/index.vue

@@ -0,0 +1,81 @@
+<template>
+  <div class="mainBase">
+    <el-select class="mr-10px" v-model="props.normal_school" placeholder="请选择学校" size="large" @change="handelSchool">
+      <el-option label="全部" value="0" />
+      <el-option v-for="item in props.school_list" :key="item.value" :label="item.label" :value="item.value"  />
+    </el-select>
+  </div>
+</template>
+
+<script setup lang="ts">
+import {normalSchool_list } from '@/pages/api';
+import { useRouter } from "vue-router";
+const router = useRouter();
+import { defineProps,defineEmits } from 'vue';
+const props = defineProps(['normal_school','school_list']);
+// const emit = defineEmits(['parentClick'])
+
+
+let normal_school = ref("");
+
+let school_list = ref([{
+  value: '1',
+  label: '学校1'
+}, {
+  value: '2',
+  label: '学校2'
+}]);
+
+onMounted(() => {
+  // initSchool();
+})
+
+//初始化学校
+const initSchool = () => {
+  let transObj = {
+    ze_id:1015//考试ID
+  }
+  normalSchool_list(transObj)
+    .then(res => {
+      if (res.code == "1") {
+        // let allData = res.data.list;
+        //接口模拟数据
+        let allData = [
+          {
+            sm_id: "267",
+            sm_name: "博智测试学校",
+            classes: [
+              {
+                cm_id: "8683",
+                cm_name: "高一(25)班"
+              }
+            ]
+          }
+        ]
+        let tempArr = [];
+        allData.forEach(item => {
+          tempArr.push({
+            value: item.sm_name,
+            label: item.sm_id
+          })
+          school_list.value = tempArr;
+        })
+
+        console.log(res, "00");
+      }
+    })
+    .catch(error => { console.log(error) });
+}
+
+
+const handelSchool = (item) => {
+  let tempIn = allData.value.filter(item => item.sm_id == item);
+  // classroom_list.value=
+  console.log(item);
+}
+
+</script>
+
+<style scoped>
+
+</style>

+ 2 - 2
src/main.ts

@@ -1,5 +1,5 @@
 import { createApp } from 'vue'
-import { createRouter, createWebHistory } from 'vue-router'
+import { createRouter, createWebHashHistory } from 'vue-router'
 import routes from 'virtual:generated-pages'
 import App from './App.vue'
 import 'virtual:windi.css'
@@ -9,7 +9,7 @@ import 'element-plus/es/components/message/style/css'
 import 'element-plus/es/components/message-box/style/css'
 const app = createApp(App)
 const router = createRouter({
-  history: createWebHistory(import.meta.env.BASE_URL),
+  history: createWebHashHistory(import.meta.env.BASE_URL),
   routes,
 })
 for (const [key, component] of Object.entries(ElementPlusIconsVue)) {

+ 121 - 111
src/pages/ksfx/cjfx_cjd.vue

@@ -11,9 +11,12 @@
       <div class="w-942 p-4 blueBg">
 
         <div class="flex items-center">
-          <el-select class="mr-10px" v-model="normal_subject" placeholder="请选择学科" size="large">
+
+          <!-- <statisticsSchool :normal_school="normal_school" :school_list="school_list" /> -->
+
+          <el-select class="mr-10px" v-model="normal_school" placeholder="请选择学校" size="large" @change="handelSchool">
             <el-option label="全部" value="0" />
-            <el-option v-for="item in subject_list" :key="item.value" :label="item.label" :value="item.value" />
+            <el-option v-for="item in school_list" :key="item.value" :label="item.label" :value="item.value" />
           </el-select>
 
           <el-select class="mr-10px" v-model="normal_classroom" placeholder="请选择班级" size="large">
@@ -21,9 +24,9 @@
             <el-option v-for="item in classroom_list" :key="item.value" :label="item.label" :value="item.value" />
           </el-select>
 
-          <el-select class="mr-10px" v-model="normal_school" placeholder="请选择学校" size="large">
+          <el-select class="mr-10px" v-model="normal_subject" placeholder="请选择学科" size="large">
             <el-option label="全部" value="0" />
-            <el-option v-for="item in school_list" :key="item.value" :label="item.label" :value="item.value" />
+            <el-option v-for="item in subject_list" :key="item.value" :label="item.label" :value="item.value" />
           </el-select>
 
         </div>
@@ -33,22 +36,22 @@
 
         <div class="h-218px mt-5px  bg-gray-500 py-4 pl-150px pr-100px perfectShow">
           <div class="h-full  flex justify-between">
-            <div class="h-full bg-opacity-20 rounded singlepart" v-for="(item, index) in 5" :key="index">
+            <div class="h-full bg-opacity-20 rounded singlepart" v-for="(item, index) in rangeData" :key="index">
               <div class="h-1/3 text-center py-4  RankLabel">
                 <img :src="'../../src/assets/ksfx/one'+(index+1)+'.png'" alt="">
               </div>
               <div class="text-sm p-5px RankBaseInfo">
-                <p class="h-1/4">考号:033055697</p>
-                <p class="h-1/4">成绩:13.0分</p>
-                <p class="h-1/4">名次:第一名</p>
-                <p class="h-1/4">学校:博智实验学校</p>
+                <p class="h-1/4">考号:{{ item.kh }}</p>
+                <p class="h-1/4">成绩:{{item.cj}}分</p>
+                <p class="h-1/4">名次:{{ item.mc }}</p>
+                <p class="h-1/4">学校:{{ item.xx }}</p>
               </div>
             </div>
           </div>
         </div>
 
-        <div class="h-auto mt-9px listMain">
-          <div class="h-74px flex flex-wrap flex-grow justify-between rounded px-4 listMain_title">
+        <div class="h-auto mt-9px listMain" >
+          <div class="h-74px flex flex-wrap flex-grow justify-between rounded px-4 listMain_title" >
             <div class="singleT" :class="{ 'h-full singleD': !!([1, 2, 3].indexOf(index) + 1) }">{{ listTitleShow.kh }}</div>
             <div class="singleT" :class="{ 'h-full singleD': !!([1, 2, 3].indexOf(index) + 1) }">{{ listTitleShow.xm }}</div>
             <div class="singleT" :class="{ 'h-full singleD': !!([1, 2, 3].indexOf(index) + 1) }">{{ listTitleShow.bj }}</div>
@@ -97,160 +100,167 @@
 }
 </route>
 <script lang="ts" setup>
+import {normalSchool_list,cjfx_cjd_list } from './api';
 import { useRouter } from "vue-router";
 const router = useRouter();
 
+let allData = ref("");
 let normal_subject = $ref("");
+
 let normal_classroom = $ref("");
 let normal_school = $ref("");
 
 
-let subject_list = [{
+let school_list = ref([{
   value: '1',
-  label: '语文'
+  label: '学校1'
 }, {
   value: '2',
-  label: '数学'
-}]
+  label: '学校2'
+}]);
+
 let classroom_list = [{
   value: '1',
-  label: '英语'
+  label: '初一(1)班'
 }, {
   value: '2',
-  label: '体育'
+  label: '初一(2)班'
 }, {
   value: '3',
-  label: '音乐'
+  label: '初一(3)班'
 }
 ];
-let school_list = [{
+
+let subject_list = [{
   value: '1',
-  label: '学校1'
+  label: '语文'
 }, {
   value: '2',
-  label: '学校2'
-}]
-
+  label: '数学'
+}];
 
+// 侧边栏点击
 const activeIndex =ref('1-1');
-
 const parentClick = (val) => {
   activeIndex.value = val;
 }
 
+let rangeData = [
+  {
+    kh: "033055697",
+    cj: "13.0",
+    mc: "第一名",
+    xx: "博智实验学校",
 
-let listTitleShow = {
-  kh: "考号",
-  xm: "姓名",
-  bj: "班级",
-  subInfo: [
-    {
-      subTitle: "语文",
-      fs: "分数",
-      bp: "班排",
-      np: "年排",
-    },
-    {
-      subTitle: "数学",
-      fs: "分数",
-      bp: "班排",
-      np: "年排",
-    }
-  ]
-}
-
-let listShow = [
+  },
   {
-    kh: "2345443211",
-    xm: "迪丽热巴",
-    bj: "初一(2)班",
-    subInfo: [
-      {
-        subTitle: "语文",
-        fs: "87.45",
-        bp: "1",
-        np: "1",
-      },
-      {
-        subTitle: "数学",
-        fs: "87.45",
-        bp: "1",
-        np: "1",
-      },
+    kh: "033055697",
+    cj: "13.0",
+    mc: "第一名",
+    xx: "博智实验学校",
 
-    ]
   },
   {
-    kh: "2345447634",
-    xm: "李爱国",
-    bj: "初一(2)班",
-    subInfo: [
-      {
-        subTitle: "语文",
-        fs: "87.45",
-        bp: "1",
-        np: "1",
-      },
-      {
-        subTitle: "数学",
-        fs: "87.45",
-        bp: "1",
-        np: "1",
-      },
+    kh: "033055697",
+    cj: "13.0",
+    mc: "第一名",
+    xx: "博智实验学校",
 
-    ]
   },
   {
-    kh: "2345443211",
-    xm: "迪丽热巴",
-    bj: "初一(2)班",
-    subInfo: [
-      {
-        subTitle: "语文",
-        fs: "87.45",
-        bp: "1",
-        np: "1",
-      },
-      {
-        subTitle: "数学",
-        fs: "87.45",
-        bp: "1",
-        np: "1",
-      },
+    kh: "033055697",
+    cj: "13.0",
+    mc: "第一名",
+    xx: "博智实验学校",
 
-    ]
   },
   {
-    kh: "2345447634",
-    xm: "李爱国",
-    bj: "初一(2)班",
-    subInfo: [
+    kh: "033055697",
+    cj: "13.0",
+    mc: "第一名",
+    xx: "博智实验学校",
+
+  }
+]
+let listTitleShow = ref({
+  "kh": "考号",
+  "xm": "姓名",
+  "bj": "班级",
+  "subInfo": [
+    {
+      "subTitle": "语文",
+      "fs": "分数",
+      "bp": "班排",
+      "np": "年排",
+    },
+    {
+      "subTitle": "数学",
+      "fs": "分数",
+      "bp": "班排",
+      "np": "年排",
+    }
+  ]
+});
+let listShow = ref([
+  {
+    "kh": "2345443211",
+    "xm": "迪丽热巴",
+    "bj": "初一(2)班",
+    "subInfo": [
       {
-        subTitle: "语文",
-        fs: "87.45",
-        bp: "1",
-        np: "1",
+        "subTitle": "语文",
+        "fs": "87.45",
+        "bp": "1",
+        "np": "1",
       },
       {
-        subTitle: "数学",
-        fs: "87.45",
-        bp: "1",
-        np: "1",
+        "subTitle": "数学",
+        "fs": "87.45",
+        "bp": "1",
+        "np": "1",
       },
 
     ]
   },
+]);
+
+
+onMounted(() => {
+  initData();
+})
+
+
+const initData =() => {
+  let transObj = {
+    xueke_id: '',
+    grade_id: '',
+    school_id: ''
+  }
+  cjfx_cjd_list(transObj)
+    .then(res => {
+      if (res.code == "1") {
+        listTitleShow.value = res.data.data.listTitleShow;
+        listShow.value = res.data.data.listShow;
+        rangeData.value = res.data.data.rangeData;
+      }
+    })
+  .catch(error=>{console.log(error)})
+}
 
-]
 
 const exportBtn = () => {
-  console.log("导出")
+  console.log("导出");
 }
 
+const handelSchool = (item) => {
+  let tempIn = allData.value.filter(item => item.sm_id == item);
+  // classroom_list.value=
+  console.log(item);
+}
 </script>
 
-
 <style lang="scss" scoped>
+
 ::v-deep .el-sub-menu__title {
   background: #003eee;
   color: #fff;

+ 58 - 40
src/pages/ksfx/cjfx_fsdtj.vue

@@ -11,9 +11,9 @@
       <div class="w-1012px p-4 blueBg">
 
         <div class="flex items-center">
-          <el-select class="mr-10px" v-model="normal_subject" placeholder="请选择学科" size="large">
+          <el-select class="mr-10px" v-model="normal_school" placeholder="请选择学校" size="large">
             <el-option label="全部" value="0" />
-            <el-option v-for="item in subject_list" :key="item.value" :label="item.label" :value="item.value" />
+            <el-option v-for="item in school_list" :key="item.value" :label="item.label" :value="item.value" />
           </el-select>
 
           <el-select class="mr-10px" v-model="normal_classroom" placeholder="请选择班级" size="large">
@@ -21,12 +21,11 @@
             <el-option v-for="item in classroom_list" :key="item.value" :label="item.label" :value="item.value" />
           </el-select>
 
-          <el-select class="mr-10px" v-model="normal_school" placeholder="请选择学校" size="large">
+          <el-select class="mr-10px" v-model="normal_subject" placeholder="请选择学科" size="large">
             <el-option label="全部" value="0" />
-            <el-option v-for="item in school_list" :key="item.value" :label="item.label" :value="item.value" />
+            <el-option v-for="item in subject_list" :key="item.value" :label="item.label" :value="item.value" />
           </el-select>
 
-
         </div>
         <div class="flex justify-between mt-4 exportBtn">
           <div>
@@ -68,7 +67,7 @@
 }
 </route>
 <script lang="ts" setup>
-import {normalSchool_list,normalSubject_list,normalClassroom_list,cjfx_pjflcfx_list } from './api';
+import {cjfx_fsdtj_list } from './api';
 import * as echarts from 'echarts';
 import { useRouter } from "vue-router";
 const router = useRouter();
@@ -117,12 +116,61 @@ let echartData = {
   series_data:[120,200,200,150,80,70,110,130]
 }
 
+let classArr = ref([
+  "初一(1)班",
+  "初一(2)班",
+  "初一(3)班",
+  "初一(4)班",
+  "初一(5)班",
+  "初一(6)班",
+  "初一(7)班",
+  "初一(8)班",
+  "初一(9)班",
+
+]);
+
+let classBaseInfoArr =ref( [
+  {
+    period: "[0-10]",
+    detailNum:["13","13","13","13","13","13","13","13","13"]
+  },
+  {
+    period: "[10-20]",
+    detailNum:["13","13","13","13","13","13","13","13","13"]
+  },
+  {
+    period: "[20-30]",
+    detailNum:["13","13","13","13","13","13","13","13","13"]
+  },
+  {
+    period: "[30-40]",
+    detailNum:["13","13","13","13","13","13","13","13","13"]
+  }
+]);
+
 onMounted(() => {
+  initData();
 
-  initChart()
 })
 
-const initChart = () => {
+const initData =() => {
+  let transObj = {
+    xueke_id: '',
+    grade_id: '',
+    school_id: ''
+  }
+  cjfx_fsdtj_list(transObj)
+    .then(res => {
+      if (res.code == "1") {
+        classArr.value = res.data.data.classArr;
+        classBaseInfoArr.value = res.data.data.classBaseInfoArr;
+        initChart(res.data.data.echartData)
+      }
+    })
+  .catch(error=>{console.log(error)})
+}
+
+const initChart = (item) => {
   var myChart = echarts.init(document.getElementById('echartData'));
   myChart.setOption({
     title: {
@@ -135,7 +183,7 @@ const initChart = () => {
       containLabel: true
     },
     xAxis: {
-      data: echartData.xAxis_data
+      data: item.xAxis_data
     },
     yAxis: {
       type: 'value',
@@ -161,44 +209,14 @@ const initChart = () => {
             }
           }
         },
-        data: echartData.series_data,
+        data: item.series_data,
       }
     ]
   });
 }
 
 
-let classArr = [
-  "初一(1)班",
-  "初一(2)班",
-  "初一(3)班",
-  "初一(4)班",
-  "初一(5)班",
-  "初一(6)班",
-  "初一(7)班",
-  "初一(8)班",
-  "初一(9)班",
-
-];
 
-let classBaseInfoArr = [
-  {
-    period: "[0-10]",
-    detailNum:["13","13","13","13","13","13","13","13","13"]
-  },
-  {
-    period: "[10-20]",
-    detailNum:["13","13","13","13","13","13","13","13","13"]
-  },
-  {
-    period: "[20-30]",
-    detailNum:["13","13","13","13","13","13","13","13","13"]
-  },
-  {
-    period: "[30-40]",
-    detailNum:["13","13","13","13","13","13","13","13","13"]
-  }
-];
 
 
 </script>

+ 53 - 36
src/pages/ksfx/cjfx_jstj.vue

@@ -11,17 +11,16 @@
       <div class="w-1012px p-4 blueBg">
 
         <div class="flex items-center">
-          <el-select class="mr-10px" v-model="normal_subject" placeholder="请选择学科" size="large">
-            <el-option label="全部" value="0" />
-            <el-option v-for="item in subject_list" :key="item.value" :label="item.label" :value="item.value" />
-          </el-select>
-
 
           <el-select class="mr-10px" v-model="normal_school" placeholder="请选择学校" size="large">
             <el-option label="全部" value="0" />
             <el-option v-for="item in school_list" :key="item.value" :label="item.label" :value="item.value" />
           </el-select>
 
+          <el-select class="mr-10px" v-model="normal_subject" placeholder="请选择学科" size="large">
+            <el-option label="全部" value="0" />
+            <el-option v-for="item in subject_list" :key="item.value" :label="item.label" :value="item.value" />
+          </el-select>
 
         </div>
         <div class="flex justify-between mt-4 exportBtn">
@@ -75,6 +74,7 @@
 }
 </route>
 <script lang="ts" setup>
+import {normalSchool_list,normalSubject_list,normalClassroom_list,cjfx_jstj_list } from './api';
 import { useRouter } from "vue-router";
 const router = useRouter();
 
@@ -100,11 +100,6 @@ let school_list = [{
   label: '学校2'
 }]
 
-onMounted(() => {
-})
-
-
-
 const activeIndex =ref('1-6');
 
 const parentClick = (val) => {
@@ -112,7 +107,7 @@ const parentClick = (val) => {
 }
 
 
-const tableData = [
+const tableData = ref([
   {
     xx: "临沂市蒙阴县乡镇小学",
     js: "热巴",
@@ -122,13 +117,13 @@ const tableData = [
     bj: "初一(2)班、初一(3)班初一(4)班",
     pjf: "123.23",
     skrs: "1234",
-    zgf:"132.22",
-    yxrs:"2637",
-    yxl:"23.34%",
+    zgf: "132.22",
+    yxrs: "2637",
+    yxl: "23.34%",
     jgrs: "4323",
-    jgl:'23.34%',
-    dfrs:"23.43%",
-    dfl:"23.34%",
+    jgl: '23.34%',
+    dfrs: "23.43%",
+    dfl: "23.34%",
   },
   {
     xx: "临沂市蒙阴县乡镇小学",
@@ -139,13 +134,13 @@ const tableData = [
     bj: "初一(2)班、初一(3)班初一(4)班",
     pjf: "123.23",
     skrs: "1234",
-    zgf:"132.22",
-    yxrs:"2637",
-    yxl:"23.34%",
+    zgf: "132.22",
+    yxrs: "2637",
+    yxl: "23.34%",
     jgrs: "4323",
-    jgl:'23.34%',
-    dfrs:"23.43%",
-    dfl:"23.34%",
+    jgl: '23.34%',
+    dfrs: "23.43%",
+    dfl: "23.34%",
   },
   {
     xx: "临沂市蒙阴县乡镇小学",
@@ -156,13 +151,13 @@ const tableData = [
     bj: "初一(2)班、初一(3)班初一(4)班",
     pjf: "123.23",
     skrs: "1234",
-    zgf:"132.22",
-    yxrs:"2637",
-    yxl:"23.34%",
+    zgf: "132.22",
+    yxrs: "2637",
+    yxl: "23.34%",
     jgrs: "4323",
-    jgl:'23.34%',
-    dfrs:"23.43%",
-    dfl:"23.34%",
+    jgl: '23.34%',
+    dfrs: "23.43%",
+    dfl: "23.34%",
   },
   {
     xx: "临沂市蒙阴县乡镇小学",
@@ -173,15 +168,37 @@ const tableData = [
     bj: "初一(2)班、初一(3)班初一(4)班",
     pjf: "123.23",
     skrs: "1234",
-    zgf:"132.22",
-    yxrs:"2637",
-    yxl:"23.34%",
+    zgf: "132.22",
+    yxrs: "2637",
+    yxl: "23.34%",
     jgrs: "4323",
-    jgl:'23.34%',
-    dfrs:"23.43%",
-    dfl:"23.34%",
+    jgl: '23.34%',
+    dfrs: "23.43%",
+    dfl: "23.34%",
   }
-]
+]);
+
+
+onMounted(() => {
+  initData();
+
+})
+
+const initData =() => {
+  let transObj = {
+    xueke_id: '',
+    grade_id: '',
+    school_id: ''
+  }
+  cjfx_jstj_list(transObj)
+    .then(res => {
+      if (res.code == "1") {
+        tableData.value = res.data.data.tableData;
+      }
+    })
+  .catch(error=>{console.log(error)})
+}
+
 
 </script>
 

+ 60 - 43
src/pages/ksfx/cjfx_pjflcfx.vue

@@ -11,17 +11,16 @@
       <div class="w-1012px p-4 blueBg">
 
         <div class="flex items-center">
-          <el-select class="mr-10px" v-model="normal_subject" placeholder="请选择学科" size="large">
-            <el-option label="全部" value="0" />
-            <el-option v-for="item in subject_list" :key="item.value" :label="item.label" :value="item.value" />
-          </el-select>
-
 
           <el-select class="mr-10px" v-model="normal_school" placeholder="请选择学校" size="large">
             <el-option label="全部" value="0" />
             <el-option v-for="item in school_list" :key="item.value" :label="item.label" :value="item.value" />
           </el-select>
 
+          <el-select class="mr-10px" v-model="normal_subject" placeholder="请选择学科" size="large">
+            <el-option label="全部" value="0" />
+            <el-option v-for="item in subject_list" :key="item.value" :label="item.label" :value="item.value" />
+          </el-select>
 
         </div>
         <div class="flex justify-between mt-4 exportBtn">
@@ -129,11 +128,63 @@ let ecahrtData = {
   ]
 }
 
+let classArr = ref([
+  "学校",
+  "平均分",
+  "总均分",
+  "均分差离",
+]);
+
+let classBaseInfoArr = ref([
+  {
+    xx: "临沂市蒙阴县乡镇小学",
+    pjf:12,
+    zjf:12,
+    jflc:1,
+  },
+  {
+    xx: "临沂市蒙阴县乡镇小学",
+    pjf:12,
+    zjf:12,
+    jflc:1,
+  },
+  {
+    xx: "临沂市蒙阴县乡镇小学",
+    pjf:12,
+    zjf:12,
+    jflc:1,
+  },
+  {
+    xx: "临沂市蒙阴县乡镇小学",
+    pjf:12,
+    zjf:12,
+    jflc:1,
+  },
+]);
+
 onMounted(() => {
-  initChart()
+  initData();
+
 })
 
-const initChart = () => {
+const initData =() => {
+  let transObj = {
+    xueke_id: '',
+    grade_id: '',
+    school_id: ''
+  }
+  cjfx_pjflcfx_list(transObj)
+    .then(res => {
+      if (res.code == "1") {
+        classArr.value = res.data.data.classArr;
+        classBaseInfoArr.value = res.data.data.classBaseInfoArr;
+        initChart(res.data.data.ecahrtData)
+      }
+    })
+  .catch(error=>{console.log(error)})
+}
+
+const initChart = (item) => {
   const colors=['#9CFF68','#FE6868']
   var myChart = echarts.init(document.getElementById('echartData'));
   myChart.setOption({
@@ -158,7 +209,7 @@ const initChart = () => {
       axisTick: {
         show: false
       },
-      data: ecahrtData.xAxis_data
+      data: item.xAxis_data
     }
   ],
   yAxis: [
@@ -167,45 +218,11 @@ const initChart = () => {
     }
 
   ],
-  series: ecahrtData.series
+  series: item.series
 });
 }
 
 
-let classArr = [
-  "学校",
-  "平均分",
-  "总均分",
-  "均分差离",
-];
-
-let classBaseInfoArr = [
-  {
-    xx: "临沂市蒙阴县乡镇小学",
-    pjf:12,
-    zjf:12,
-    jflc:1,
-  },
-  {
-    xx: "临沂市蒙阴县乡镇小学",
-    pjf:12,
-    zjf:12,
-    jflc:1,
-  },
-  {
-    xx: "临沂市蒙阴县乡镇小学",
-    pjf:12,
-    zjf:12,
-    jflc:1,
-  },
-  {
-    xx: "临沂市蒙阴县乡镇小学",
-    pjf:12,
-    zjf:12,
-    jflc:1,
-  },
-];
-
 
 </script>
 

+ 58 - 39
src/pages/ksfx/cjfx_slyf.vue

@@ -11,9 +11,9 @@
       <div class="w-1012px p-4 overflow-visible blueBg">
 
         <div class="flex items-center">
-          <el-select class="mr-10px" v-model="normal_subject" placeholder="请选择学科" size="large">
+          <el-select class="mr-10px" v-model="normal_school" placeholder="请选择学校" size="large">
             <el-option label="全部" value="0" />
-            <el-option v-for="item in subject_list" :key="item.value" :label="item.label" :value="item.value" />
+            <el-option v-for="item in school_list" :key="item.value" :label="item.label" :value="item.value" />
           </el-select>
 
           <el-select class="mr-10px" v-model="normal_classroom" placeholder="请选择班级" size="large">
@@ -21,9 +21,9 @@
             <el-option v-for="item in classroom_list" :key="item.value" :label="item.label" :value="item.value" />
           </el-select>
 
-          <el-select class="mr-10px" v-model="normal_school" placeholder="请选择学校" size="large">
+          <el-select class="mr-10px" v-model="normal_subject" placeholder="请选择学科" size="large">
             <el-option label="全部" value="0" />
-            <el-option v-for="item in school_list" :key="item.value" :label="item.label" :value="item.value" />
+            <el-option v-for="item in subject_list" :key="item.value" :label="item.label" :value="item.value" />
           </el-select>
 
           <el-select class="mr-10px" v-model="normal_teacher" placeholder="请选择任课老师" size="large">
@@ -113,7 +113,7 @@
 }
 </route>
 <script lang="ts" setup>
-import {normalSchool_list,normalSubject_list,normalClassroom_list,normalTeacher_list,cjfx_pjflcfx_list } from './api';
+import {normalSchool_list,normalSubject_list,normalClassroom_list,normalTeacher_list,cjfx_slyf_list } from './api';
 import { useRouter } from "vue-router";
 const router = useRouter();
 
@@ -158,44 +158,63 @@ const parentClick = (val) => {
   activeIndex.value = val;
 }
 
-const tableData = [
+const tableData = ref([
   {
-  xx: "总体",
-  bj: "初一(2)班",
-  pm: "1",
-  pjf: "87.45",
-  ykrs: "123",
-  skrs: "123",
-  zgf: "123",
-  yxrs: "98",
-  yxl: "89%",
-  jgrs:"98",
-  jgl:"89%",
-  dfrs:"23",
-  dfl:"90%",
-  nd:"0.92",
-  qfd:"0.92",
-  bzc:"87.45",
+    xx: "总体",
+    bj: "初一(2)班",
+    pm: "1",
+    pjf: "87.45",
+    ykrs: "123",
+    skrs: "123",
+    zgf: "123",
+    yxrs: "98",
+    yxl: "89%",
+    jgrs: "98",
+    jgl: "89%",
+    dfrs: "23",
+    dfl: "90%",
+    nd: "0.92",
+    qfd: "0.92",
+    bzc: "87.45",
   },
   {
-  xx: "临沂市蒙阴县乡镇小学",
-  bj: "初一(2)班",
-  pm: "1",
-  pjf: "87.45",
-  ykrs: "123",
-  skrs: "123",
-  zgf: "123",
-  yxrs: "98",
-  yxl: "89%",
-  jgrs:"98",
-  jgl:"89%",
-  dfrs:"23",
-  dfl:"90%",
-  nd:"0.92",
-  qfd:"0.92",
-  bzc:"87.45",
+    xx: "临沂市蒙阴县乡镇小学",
+    bj: "初一(2)班",
+    pm: "1",
+    pjf: "87.45",
+    ykrs: "123",
+    skrs: "123",
+    zgf: "123",
+    yxrs: "98",
+    yxl: "89%",
+    jgrs: "98",
+    jgl: "89%",
+    dfrs: "23",
+    dfl: "90%",
+    nd: "0.92",
+    qfd: "0.92",
+    bzc: "87.45",
   },
-]
+]);
+
+onMounted(() => {
+  initData()
+})
+
+const initData =() => {
+  let transObj = {
+    xueke_id: '',
+    grade_id: '',
+    school_id: ''
+  }
+  cjfx_slyf_list(transObj)
+    .then(res => {
+      if (res.code == "1") {
+        tableData.value = res.data.data.tableData;
+      }
+    })
+  .catch(error=>{console.log(error)})
+}
 
 //重置
 const restBtn = () => {

+ 0 - 13
src/pages/ksfx/index.vue

@@ -1,13 +0,0 @@
-<template>
-  <div>
-    成绩分析主页
-  </div>
-</template>
-
-<script setup lang="ts">
-
-</script>
-
-<style scoped>
-
-</style>

+ 186 - 0
src/pages/ksfx/ksfx.vue

@@ -0,0 +1,186 @@
+<template>
+  <div class="">
+    <NavHeader />
+    <bread-crumb />
+    <div class="w-1200px m-auto h-auto mastMain">
+      <div class="my-4 searchInput">
+        <el-input
+        class="w-200px "
+        v-model="input3"
+        placeholder="请输入检索内容"
+      >
+        <template #append>
+          <el-button :icon="Search" />
+        </template>
+      </el-input>
+      </div>
+      <div class="min-h-600px groupExamMian">
+        <div class="demo-collapse">
+          <el-collapse accordion>
+            <el-collapse-item :name="index + 1" v-for="(item, index) in examArrlist" :key="index"
+              :class="{ 'bg-cusblue': (index+1) % 2 == 0 }">
+              <template #title>
+                <div class="w-full h-60px flex flex-row justify-between examSingleT">
+                  <div>{{ item.examN }}</div>
+                  <div>参考人数:??</div>
+                  <div>满分:??</div>
+                  <div>最高分:??</div>
+                  <div class="singleColor">考试分析</div>
+                </div>
+
+              </template>
+
+              <div>
+
+                <div class="px-90px py-10px flex flex-row justify-start flex-wrap  examList" v-if="item.examPaperList">
+                  <div class="h-149px p-5px mt-10px flex flex-row justify-start examListSingle"
+                    v-for="(secItem, secIndex) in item.examPaperList" :key="secIndex" @click="linkTo('cjfx_cjd')">
+                    <div class="w-2/5 relative examListSingle_left">
+                      <img :src="examIcon" class="w-full h-full" alt="">
+                      <div class="w-full absolute top-0 left-0 text-right text-red-500 text-3xl font-bold pr-2 scoreNum"
+                        v-if="secItem.scoreN != 0">{{ secItem.scoreN }}</div>
+                      <div class=" absolute top-7px left-0 text-3xl font-bold  lockExam" v-else>
+                        缺考</div>
+                      <div
+                        class="w-full absolute left-0 bottom-2 text-center text-red-500 text-2xl font-bold subjectName">{{
+                          secItem.subName }}</div>
+                    </div>
+                    <div class="w-3/5 py-5px px-10px examListSingle_right">
+                      <p class="h-1/4">学科:{{ secItem.scoreN }}</p>
+                      <p class="h-1/4">总分:{{ secItem.scoreN }}</p>
+                      <p class="h-1/4">客观题:{{ secItem.ObjectiveQuestion }}</p>
+                      <p class="h-1/4">主观题:{{ secItem.SubjectiveQuestions }}</p>
+                    </div>
+                  </div>
+                </div>
+              </div>
+            </el-collapse-item>
+
+          </el-collapse>
+        </div>
+
+
+
+      </div>
+    </div>
+    <commonFooter />
+  </div>
+</template>
+<route lang="json">
+{
+  "meta": {
+    "title": "考试分析",
+    "breadcrumb": true
+  }
+}
+</route>
+<script setup>
+import { InfoFilled,Search } from '@element-plus/icons-vue';
+import examIcon from '@/assets/ksfx/examIcon.png';
+import { student_ksfx_list, ksjh_list } from "@/pages/ksfx/api";
+
+import { useRouter } from "vue-router";
+import { skeletonProps } from 'element-plus';
+const router = useRouter();
+
+const input3 = ref('');
+
+const scoreMarkSwitch = $ref(true);
+
+let examArrlist = ref();
+
+onMounted(() => {
+  initData();
+});
+//初始化
+const initData = () => {
+  //接口模拟
+  // let transObj1 = {
+  //   sm_id: 267,
+  //   ykj_kslx: 7,
+  // }
+
+  // ksjh_list(transObj1)
+  //   .then(res => {
+  //     if (res.code == "1") {
+  //       console.log(res, "887878");
+  //       examArrlist.value = res.data.page_data;
+
+  //     }
+  //   })
+  //   .catch(error => { console.log(error) })
+
+  let transObj = {
+    xueke_id: '',
+    grade_id: '',
+    school_id: ''
+  }
+  student_ksfx_list(transObj)
+    .then(res => {
+      if (res.code == "1") {
+        console.log(res,"8989")
+        examArrlist.value = res.data.data.examArrlist;
+      }
+    })
+    .catch(error => { console.log(error) })
+}
+//跳转
+const linkTo = (item) => {
+  router.push(item);
+}
+
+</script>
+
+<style lang="scss" scoped>
+@import '@/styles/ksfx.css';
+
+::v-deep .el-collapse-item__header {
+  height: 60px;
+  border: 1px dashed grey;
+  background-color: #F1F7FF;
+}
+.searchInput{
+  padding-left:80%;
+}
+.mastMain {
+  background-color: #ffffff;
+  box-sizing: border-box;
+  padding: 2px;
+}
+
+.bg-cusblue {
+  background-color: #F1F7FF;
+}
+.singleColor{
+  color: #1658E8;
+}
+.examSingleT {
+  line-height: 60px;
+  box-sizing: border-box;
+  padding: 0 30px;
+}
+
+.examListSingle {
+  width: 24%;
+  background: #ffffff;
+  border: 2px solid #0148e5;
+  border-radius: 10px;
+  margin-right: 1%;
+  cursor: pointer;
+}
+
+.examListSingle:last-child {
+  margin-right: 0 !important;
+}
+
+.examListSingle_left {}
+
+.lockExam {
+  width: 70%;
+  transform: translate(25%, 0%);
+  background-color: red;
+  border-radius: 50%;
+  color: #ffffff;
+  font-size: 14px;
+  text-align: center;
+}</style>

+ 25 - 26
src/pages/ksfx/sjfx_kgtfx.vue

@@ -12,22 +12,20 @@
 
         <div class="flex mt-20px items-center">
 
-          <el-select class="mr-10px" v-model="normal_topic" placeholder="请选择题目" size="large">
-            <el-option label="全部" value="0" />
-            <el-option v-for="item in topic_list" :key="item.value" :label="item.label" :value="item.value" />
-          </el-select>
-
           <el-select class="mr-10px" v-model="normal_school" placeholder="请选择学校" size="large">
             <el-option label="全部" value="0" />
             <el-option v-for="item in school_list" :key="item.value" :label="item.label" :value="item.value" />
           </el-select>
 
+          <el-select class="mr-10px" v-model="normal_topic" placeholder="请选择题目" size="large">
+            <el-option label="全部" value="0" />
+            <el-option v-for="item in topic_list" :key="item.value" :label="item.label" :value="item.value" />
+          </el-select>
 
         </div>
 
 
         <div class="h-auto mt-20px">
-
           <div class="normalTit">
             <span>客观题分析</span>
           </div>
@@ -82,7 +80,7 @@
 <script lang="ts" setup>
 import * as echarts from 'echarts';
 import { skeletonProps } from 'element-plus';
-import {normalSchool_list,normalSubject_list,normalClassroom_list,cjfx_pjflcfx_list } from './api';
+import {normalSchool_list,normalSubject_list,normalClassroom_list,cjfx_kgtfx_list } from './api';
 
 import { useRouter } from "vue-router";
 const router = useRouter();
@@ -107,33 +105,34 @@ let school_list = [{
   label: '学校2'
 }]
 
+
 const activeIndex =ref('2-2');
 
 const parentClick = (val) => {
   activeIndex.value = val;
 }
 
+onMounted(() => {
+  initData()
+})
 
-let barChartData = {
-  xAxis_data: ['选项A', '选项B', '选项C', '选项D'],
-  series_data:[120,200,200,150]
-}
-let circleChartData = {
-  series_name: '客观题分析',
-  series_data: [
-      { value: 1048, name: '选项A' },
-      { value: 735, name: '选项B' },
-      { value: 580, name: '选项C' },
-      { value: 484, name: '选项D' },
-    ]
+const initData = () => {
+  let transObj = {
+    xueke_id: '',
+    grade_id: '',
+    school_id: ''
+  }
+  cjfx_kgtfx_list(transObj)
+    .then(res => {
+      if (res.code == "1") {
+        initbarChart(res.data.data.barChartData);
+        initcircleChart(res.data.data.circleChartData);
+      }
+    })
+  .catch(error=>{console.log(error)})
 }
 
-
-onMounted(() => {
-  initbarChart();
-  initcircleChart();
-})
-const initbarChart = () => {
+const initbarChart = (barChartData) => {
   var myChart = echarts.init(document.getElementById('barChart'));
   myChart.setOption({
     title: {
@@ -177,7 +176,7 @@ const initbarChart = () => {
     ]
   });
 }
-const initcircleChart = () => {
+const initcircleChart = (circleChartData) => {
   var myChart = echarts.init(document.getElementById('circleChart'));
   myChart.setOption({
   tooltip: {

+ 73 - 96
src/pages/ksfx/sjfx_ztfx.vue

@@ -33,20 +33,22 @@
         </div>
 
         <div class="flex mt-20px items-center">
+
           <el-select class="mr-10px" v-model="normal_school" placeholder="请选择学校" size="large">
             <el-option label="全部" value="0" />
             <el-option v-for="item in school_list" :key="item.value" :label="item.label" :value="item.value" />
           </el-select>
 
-          <el-select class="mr-10px" v-model="normal_subject" placeholder="请选择学科" size="large">
+          <el-select class="mr-10px" v-model="normal_classroom" placeholder="请选择班级" size="large">
             <el-option label="全部" value="0" />
-            <el-option v-for="item in subject_list" :key="item.value" :label="item.label" :value="item.value" />
+            <el-option v-for="item in classroom_list" :key="item.value" :label="item.label" :value="item.value" />
           </el-select>
 
-          <el-select class="mr-10px" v-model="normal_classroom" placeholder="请选择班级" size="large">
+          <el-select class="mr-10px" v-model="normal_subject" placeholder="请选择学科" size="large">
             <el-option label="全部" value="0" />
-            <el-option v-for="item in classroom_list" :key="item.value" :label="item.label" :value="item.value" />
+            <el-option v-for="item in subject_list" :key="item.value" :label="item.label" :value="item.value" />
           </el-select>
+
         </div>
         <div class="flex justify-between mt-4 exportBtn">
           <div>
@@ -114,7 +116,7 @@
 }
 </route>
 <script lang="ts" setup>
-import {normalSchool_list,normalSubject_list,normalClassroom_list,cjfx_pjflcfx_list } from './api';
+import {normalSchool_list,normalSubject_list,normalClassroom_list,cjfx_ztfx_list } from './api';
 import { useRouter } from "vue-router";
 const router = useRouter();
 
@@ -152,9 +154,7 @@ let classroom_list = [{
 ];
 
 
-onMounted(() => {
 
-})
 
 const activeIndex =ref('2-1');
 
@@ -162,97 +162,74 @@ const parentClick = (val) => {
   activeIndex.value = val;
 }
 
-const tableDataZtcjfx = [{
-  mx:122,
-  pjf:87.45,
-  ykrs:123,
-  skrs:123,
-  nd:0.54,
-  qfd:0.54,
-  bzc:0.54,
-  qkrs:32,
-  zgf:125,
-  zdf:123,
-  gfzjf:125,
-  zfzjf:136,
-  dfzjf:87.45
-   
-}]
-
-
-const tableDataTmfx = [
-  {
-    tm:1,
-    tmlx:"单选",
-    mf:23,
-    pjf:12,
-    nd:0.54,
-    qfd:0.54,
-    bzc:0.54,
-    gfzjf:0.13,
-    zdzjf:0.13,
-    dfzjf:0.13,
-  },
-  {
-    tm:1,
-    tmlx:"多选",
-    mf:23,
-    pjf:12,
-    nd:0.54,
-    qfd:0.54,
-    bzc:0.54,
-    gfzjf:0.13,
-    zdzjf:0.13,
-    dfzjf:0.13,
-  },
-  {
-    tm:1,
-    tmlx:"主观题",
-    mf:23,
-    pjf:12,
-    nd:0.54,
-    qfd:0.54,
-    bzc:0.54,
-    gfzjf:0.13,
-    zdzjf:0.13,
-    dfzjf:0.13,
-  },
-
-];
+const tableDataZtcjfx = ref([]);
+
+
+const tableDataTmfx = ref()
+// [
+//   {
+//     tm:1,
+//     tmlx:"单选",
+//     mf:23,
+//     pjf:12,
+//     nd:0.54,
+//     qfd:0.54,
+//     bzc:0.54,
+//     gfzjf:0.13,
+//     zdzjf:0.13,
+//     dfzjf:0.13,
+//   },
+//   {
+//     tm:1,
+//     tmlx:"多选",
+//     mf:23,
+//     pjf:12,
+//     nd:0.54,
+//     qfd:0.54,
+//     bzc:0.54,
+//     gfzjf:0.13,
+//     zdzjf:0.13,
+//     dfzjf:0.13,
+//   },
+//   {
+//     tm:1,
+//     tmlx:"主观题",
+//     mf:23,
+//     pjf:12,
+//     nd:0.54,
+//     qfd:0.54,
+//     bzc:0.54,
+//     gfzjf:0.13,
+//     zdzjf:0.13,
+//     dfzjf:0.13,
+//   },
+
+// ];
+
+
+const tableData = ref();
 
+onMounted(() => {
+  initData()
+})
 
-const tableData = [
-  {
-    xm: "迪丽热巴",
-    xh: "123456789",
-    bj: "初一(2)班",
-    zf: "123",
-    fir_0: "2.5",
-    fir_1: "2.5",
-    fir_2: "2.5",
-    sec_0: "2.5",
-    sec_1: "2.5",
-    sec_2: "2.5",
-    thr_0: "2.5",
-    thr_1: "2.5",
-    thr_2: "2.5",
-  },
-  {
-    xm: "迪丽热巴",
-    xh: "123456789",
-    bj: "初一(2)班",
-    zf: "123",
-    fir_0: "2.5",
-    fir_1: "2.5",
-    fir_2: "2.5",
-    sec_0: "2.5",
-    sec_1: "2.5",
-    sec_2: "2.5",
-    thr_0: "2.5",
-    thr_1: "2.5",
-    thr_2: "2.5",
-  },
-]
+const initData = () => {
+  let transObj = {
+    xueke_id: '',
+    grade_id: '',
+    school_id:''
+  }
+  cjfx_ztfx_list(transObj)
+    .then(res => {
+      if (res.code == "1") {
+        tableDataZtcjfx.value = res.data.data.tableDataZtcjfx;
+        tableDataTmfx.value = res.data.data.tableDataTmfx;
+        tableData.value = res.data.data.tableData;
+      }
+      console.log(res,"87654321")
+    })
+  .catch(error=>{console.log(error)})
+}
 
 </script>
 

+ 0 - 171
src/pages/ksfx/stu_ksfx.vue

@@ -1,171 +0,0 @@
-<template>
-  <div class="">
-    <NavHeader />
-    <bread-crumb />
-    <div class="w-1200px m-auto h-auto mastMain">
-      <div class="searchInput"></div>
-      <div class="min-h-600px groupExamMian">
-        <div class="demo-collapse">
-          <el-collapse accordion>
-            <el-collapse-item :name="index+1" v-for="(item, index) in examArrlist" :key="index" :class="{ 'bg-cusblue': index % 2 == 0 }">
-              <template #title>
-                <div class="w-full h-60px flex flex-row justify-between examSingleT" >
-                  <div>{{ item.examN }}</div>
-                  <div>参考人数:{{ item.attendExamNum }}</div>
-                  <div>满分:{{ item.fullScore }}</div>
-                  <div>最高分:{{ item.maxScore }}</div>
-                  <div>考试分析</div>
-                </div>
-              </template>
-              <div>
-                <div class="px-90px py-10px flex flex-row justify-start flex-wrap  examList" v-if="item.examPaperList">
-            <div class="h-149px p-5px mt-10px flex flex-row justify-start examListSingle"
-              v-for="(secItem, secIndex) in item.examPaperList" :key="secIndex" @click="linkTo('stu_stfx')">
-              <div class="w-2/5 relative examListSingle_left">
-                <img :src="examIcon" class="w-full h-full" alt="">
-                <div class="w-full absolute top-0 left-0 text-right text-red-500 text-3xl font-bold pr-2 scoreNum"
-                  v-if="secItem.scoreN != 0">{{ secItem.scoreN }}</div>
-                <div class="w-full absolute top-0 left-0 text-right text-red-500 text-3xl font-bold pr-2 lockExam" v-else>
-                  缺考</div>
-                <div class="w-full absolute left-0 bottom-2 text-center text-red-500 text-2xl font-bold subjectName">{{
-                  secItem.subName }}</div>
-              </div>
-              <div class="w-3/5 py-5px px-10px examListSingle_right">
-                <p class="h-1/4">学科:{{ secItem.scoreN }}</p>
-                <p class="h-1/4">总分:{{ secItem.scoreN }}</p>
-                <p class="h-1/4">客观题:{{ secItem.ObjectiveQuestion }}</p>
-                <p class="h-1/4">主观题:{{ secItem.SubjectiveQuestions }}</p>
-              </div>
-            </div>
-          </div>
-              </div>
-            </el-collapse-item>
-
-          </el-collapse>
-        </div>
-
-
-
-
-
-
-
-        <!-- <div class="examSingle" v-for="(item, index) in examArrlist" :key="index">
-          <div class="h-60px flex flex-row justify-between examSingleT" :class="{ 'bg-cusblue': index % 2 == 0 }">
-            <div>{{ item.examN }}</div>
-            <div>参考人数:{{ item.attendExamNum }}</div>
-            <div>满分:{{ item.fullScore }}</div>
-            <div>最高分:{{ item.maxScore }}</div>
-            <div class="text-blue-500">考试分析</div>
-          </div>
-          <div class="px-90px py-10px flex flex-row justify-start flex-wrap  examList" v-if="item.examPaperList">
-            <div class="h-149px p-5px mt-10px flex flex-row justify-start examListSingle"
-              v-for="(secItem, secIndex) in item.examPaperList" :key="secIndex" @click="linkTo('stu_stfx')">
-              <div class="w-2/5 relative examListSingle_left">
-                <img :src="examIcon" class="w-full h-full" alt="">
-                <div class="w-full absolute top-0 left-0 text-right text-red-500 text-3xl font-bold pr-2 scoreNum"
-                  v-if="secItem.scoreN != 0">{{ secItem.scoreN }}</div>
-                <div class="w-full absolute top-0 left-0 text-right text-red-500 text-3xl font-bold pr-2 lockExam" v-else>
-                  缺考</div>
-                <div class="w-full absolute left-0 bottom-2 text-center text-red-500 text-2xl font-bold subjectName">{{
-                  secItem.subName }}</div>
-              </div>
-              <div class="w-3/5 py-5px px-10px examListSingle_right">
-                <p class="h-1/4">学科:{{ secItem.scoreN }}</p>
-                <p class="h-1/4">总分:{{ secItem.scoreN }}</p>
-                <p class="h-1/4">客观题:{{ secItem.ObjectiveQuestion }}</p>
-                <p class="h-1/4">主观题:{{ secItem.SubjectiveQuestions }}</p>
-              </div>
-            </div>
-          </div>
-
-        </div> -->
-
-      </div>
-    </div>
-    <commonFooter />
-  </div>
-</template>
-<route lang="json">
-{
-  "meta": {
-    "title": "考试分析",
-    "breadcrumb": true
-  }
-}
-</route>
-<script setup>
-import { InfoFilled } from '@element-plus/icons-vue';
-import examIcon from '@/assets/ksfx/examIcon.png';
-import {student_ksfx_list} from "@/pages/ksfx/api";
-
-import { useRouter } from "vue-router";
-import { skeletonProps } from 'element-plus';
-const router = useRouter();
-
-
-const scoreMarkSwitch = $ref(true);
-
-let examArrlist = ref()
-onMounted(() => {
-  initData();
-});
-const initData = () => {
-  let transObj = {
-    xueke_id: '',
-    grade_id: '',
-    school_id:''
-  }
-  student_ksfx_list(transObj)
-    .then(res => {
-      if (res.code == "1") {
-        examArrlist.value = res.data.data.examArrlist;
-      }
-    })
-  .catch(error=>{console.log(error)})
-}
-//跳转
-const linkTo = (item) => {
-  router.push(item);
-}
-
-</script>
-
-<style lang="scss" scoped>
-@import '@/styles/ksfx.css';
-
-::v-deep .el-collapse-item__header{
-  height: 60px;
-  border: 1px dashed grey;
-  background-color:#F1F7FF;
-}
-.mastMain {
-  background-color: #ffffff;
-  box-sizing: border-box;
-  padding: 2px;
-}
-
-.bg-cusblue {
-  background-color: #F1F7FF;
-}
-
-.examSingleT {
-  line-height: 60px;
-  box-sizing: border-box;
-  padding: 0 30px;
-}
-
-.examListSingle {
-  width: 24%;
-  background: #ffffff;
-  border: 2px solid #0148e5;
-  border-radius: 10px;
-  margin-right: 1%;
-  cursor: pointer;
-}
-
-.examListSingle:last-child {
-  margin-right: 0 !important;
-}
-
-.examListSingle_left {}</style>

+ 98 - 18
src/pages/ksfx/stu_wdsj.vue

@@ -1,45 +1,125 @@
 <template>
   <div class="stu_stfx">
-    <div class="w-1200px h-600px m-auto flex flex-row justify-between">
+    <div class="w-1200px m-auto flex flex-row justify-between">
       <div class="w-188px h-full" style="background-color: #fff;">
         <leftSiderStu :StuLeftMenuNum="StuLeftMenuNum" />
       </div>
 
       <div class="w-1012px p-12 blueBg">
 
-        <swiper class="h-300px text-center" :modules="modules" :pagination="{ clickable: true }">
-          <swiper-slide v-for="(item,index) in 5" :key="index">
-            <img :src="examIcon" srcset="">
-          </swiper-slide>
-        </swiper>
+        <div class="flex my-20px items-center">
+          <el-select class="mr-10px" v-model="normal_subject" placeholder="请选择学科" size="large">
+            <el-option label="全部" value="0" />
+            <el-option v-for="item in subject_list" :key="item.value" :label="item.label" :value="item.value" />
+          </el-select>
+        </div>
+
+
+        <swiper :slidesPerView="1" :spaceBetween="30" :loop="true" :centeredSlides="true"
+        :pagination="{	clickable: true}"
+        :autoplay="{
+          delay: 2500,
+          disableOnInteraction: false
+        }"
+        :navigation="true"
+        :modules="modules"
+        class="mySwiper"
+      >
+			<swiper-slide class="mainSwiper" v-for="(item,index) in imgArr" :key="index" @click="clickCurrent(item)">
+          <img :src="item" srcset="">
+        </swiper-slide>
+      </swiper>
 
       </div>
 
     </div>
-  </div>
-</template>
 
-<script setup lang="ts">
-import examIcon from '@/assets/ksfx/examIcon.png'
-import { student_wdsj_list } from "~/pages/process/api";
+    <!-- dialog弹出框 -->
+    <el-dialog
+        v-model="dialogVisible"
+        title="试卷预览"
+        width="70%"
+        :before-close="handleClose"
+      >
+        <span class="dialogShow">
+          <img :src="examIcon" alt="">
+        </span>
+      </el-dialog>
+    </div>
+</template>
 
+<script lang="ts" setup>
+import examIcon from '@/assets/ksfx/examPreview.png';
 import { useRouter } from "vue-router";
-import { skeletonProps } from 'element-plus';
 const router = useRouter();
+import { student_wdsj_list } from "~/pages/process/api";
+import { ElMessageBox } from 'element-plus'
 
 let StuLeftMenuNum = 1;
 
-import SwiperClass, { Pagination } from 'Swiper'
-import { Swiper, SwiperSlide } from 'vue-awesome-swiper'
+let normal_subject = $ref("");
+let subject_list = [{
+  value: '1',
+  label: '语文'
+}, {
+  value: '2',
+  label: '数学'
+}]
 
-import 'swiper/css'
-import 'swiper/css/pagination'
-const modules = [Pagination];
+const imgArr = ref(["src/assets/ksfx/examPreview.png", "src/assets/ksfx/examPreview.png"]);
+
+import { Swiper, SwiperSlide } from 'swiper/vue'; // swiper所需组件
+// 这是分页器和对应方法,swiper好像在6的时候就已经分离了分页器和一些其他工具
+import { Autoplay, Navigation, Pagination, A11y } from 'swiper';
+// 引入swiper样式,对应css 如果使用less或者css只需要把scss改为对应的即可
+import 'swiper/css';
+import 'swiper/css/navigation';
+import 'swiper/css/pagination';
+//默认滑动效果(这里面注释掉的可以不要)
+// const onSwiper = swiper => {
+// 	console.log(swiper);
+// };
+// const onSlideChange = e => {
+// 	// swiper切换的时候执行的方法
+// 	console.log('slide change', e.activeIndex);
+// };
+// setup语法糖只需要这样创建一个变量就可以正常使用分页器和对应功能,如果没有这个数组则无法使用对应功能
+const modules = [Autoplay, Pagination, Navigation, A11y];
+
+const clickCurrent = (item) => {
+  console.log(item, "87878");
+  dialogVisible.value = true;
+}
+
+
+
+const dialogVisible = ref(false)
+
+const handleClose = (done: () => void) => {
+  ElMessageBox.confirm('确定要关闭吗?')
+    .then(() => {
+      done()
+    })
+    .catch(() => {
+      // catch error
+    })
+}
 
 
 </script>
 
 <style scoped>
 @import '@/styles/ksfx.css';
-
+.mainSwiper{
+  text-align: center;
+  img{
+    display:inline-block;
+  }
+}
+.dialogShow{
+  img{
+    width:100%;
+    display:inline-block;
+  }
+}
 </style>

+ 20 - 2
src/pages/process/api.js

@@ -1,8 +1,26 @@
 import request from "~/utils/request";
 
-export const process_list = (data = {}) => {
+export const project_list = (data = {}) => {
   return request({
-    url: '/yzy/kmksyjlc/index',
+    url: '/yzy/ksjh/index',
+    data,
+  })
+}
+export const subject = (data = {}) => {
+  return request({
+    url: window.GLOBAL_CONFIG.uc + 'index.php?mod=school&action=main&do=base_grade',
+    data,
+  })
+}
+export const add_subject = (data = {}) => {
+  return request({
+    url: '/yzy/ksjh/liankao_add_subject',
+    data,
+  })
+}
+export const del_subject = (data = {}) => {
+  return request({
+    url: '/yzy/ksjh/liankao_del_subject',
     data,
   })
 }

+ 142 - 108
src/pages/process/create/index.vue

@@ -13,8 +13,8 @@
             <el-input v-model="createForm.ksmc" placeholder="请输入考试名称" />
           </el-form-item>
           <el-form-item label="考试时间" prop="kssj" style="width: 620px">
-            <el-date-picker  v-model="createForm.kssj" type="datetimerange" range-separator="至" start-placeholder="考试开始时间"
-                            end-placeholder="考试结束时间" value-format="YYYY-MM-DD hh:mm:ss" />
+            <el-date-picker  v-model="createForm.kssj" type="daterange" range-separator="至" start-placeholder="考试开始时间"
+                            end-placeholder="考试结束时间" value-format="YYYY-MM-DD" />
           </el-form-item>
           <el-form-item label="考试类型" prop="kslx" style="width: 620px">
             <el-radio-group v-model="createForm.kslx">
@@ -25,17 +25,17 @@
             <el-select v-model="createForm.lkxx" style="width: 500px" multiple placeholder="请选择联考学校">
               <el-option
                 v-for="item in school_list"
-                :label="item.label"
-                :value="item.value"
+                :label="item.schoolname"
+                :value="{value:item.schoolid,label:item.schoolname}"
               />
             </el-select>
           </el-form-item>
           <el-form-item label="考试年级" prop="ksnj">
-            <el-select v-model="createForm.ksnj" style="width: 500px" multiple placeholder="请选择考试年级">
+            <el-select v-model="createForm.ksnj" style="width: 500px" placeholder="请选择考试年级" @change="getSubjectList">
               <el-option
                 v-for="item in grade_list"
-                :label="item.label"
-                :value="item.value"
+                :label="item.gradename"
+                :value="{label:item.gradename,value:item.grade}"
               />
             </el-select>
           </el-form-item>
@@ -43,8 +43,8 @@
             <el-select v-model="createForm.kskm" style="width: 500px" multiple placeholder="请选择考试科目">
               <el-option
                 v-for="item in subject_list"
-                :label="item.label"
-                :value="item.value"
+                :label="item.subject_name"
+                :value="{label:item.subject_name,value:item.subject_id}"
               />
             </el-select>
           </el-form-item>
@@ -77,6 +77,8 @@
 </route>
 <script setup>
 import { useRouter } from "vue-router";
+import request from "~/utils/request";
+import {user} from "~/store";
 const router = useRouter();
 const linkTo = (name) => {
   router.push({ name });
@@ -85,7 +87,7 @@ const rules = $ref({
   ksmc:[{ required: true, message: '请输入考试名称', trigger: 'blur' }],
   kssj:[{ required: true, message: "请选择考试时间", trigger: "blur" }],
   kslx: [{required: true, message: '请选择考试类型', trigger: 'change'}],
-  ksnj: [{required: true, message: '请至少选择一个年级', trigger: 'change'}],
+  ksnj: [{required: true, message: '请选择一个年级', trigger: 'change'}],
   kskm: [{required: true, message: '请至少选择一个科目', trigger: 'change'}],
   yjlc: [{required: true, message: '请选择阅卷流程', trigger: 'change'}],
   lkxx: [{required: true, message: '请至少选择一个学校', trigger: 'change'}],
@@ -96,88 +98,57 @@ let createForm = $ref({
   kssj:'',
   kslx:'1',
   ksnj:'',
-  kskm:'',
+  kskm:[],
   yjlc:'1',
   lkxx:''
 })
-let type_list = [{
-  value: '1',
-  label: '周考'
-}, {
-  value: '2',
-  label: '月考'
-}, {
-  value: '3',
-  label: '期中'
-},{
-  value: '4',
-  label: '期末'
-}, {
-  value: '5',
-  label: '作业'
-}, {
-  value: '6',
-  label: '测试'
-},{
-  value: '7',
-  label: '联考'
-}]
-let grade_list = [{
-  value: '1',
-  label: '一年级'
-}, {
-  value: '2',
-  label: '二年级'
-}, {
-  value: '3',
-  label: '三年级'
-},{
-  value: '4',
-  label: '四年级'
-}, {
-  value: '5',
-  label: '五年级'
-}, {
-  value: '6',
-  label: '六年级'
-},{
-  value: '7',
-  label: '初一'
-},{
-  value: '8',
-  label: '初二'
-},{
-  value: '9',
-  label: '初三'
-},{
-  value: '10',
-  label: '高一'
-},{
-  value: '11',
-  label: '高二'
-},{
-  value: '12',
-  label: '搞三'
-}]
-let subject_list = [{
-  value: '1',
-  label: '语文'
-}, {
-  value: '2',
-  label: '数学'
-}, {
-  value: '3',
-  label: '英语'
-},{
-  value: '4',
-  label: '物理'
-}, {
-  value: '5',
-  label: '生物'
-}, {
-  value: '6',
-  label: '化学'
-}]
+let type_list = $ref([])
+if(user.value.user_role_id < 72) {
+  type_list = [{
+    value: '1',
+    label: '周考'
+  }, {
+    value: '2',
+    label: '月考'
+  }, {
+    value: '3',
+    label: '期中'
+  },{
+    value: '4',
+    label: '期末'
+  }, {
+    value: '5',
+    label: '作业'
+  }, {
+    value: '6',
+    label: '测试'
+  },{
+    value: '7',
+    label: '联考'
+  }];
+} else {
+  type_list = [{
+    value: '1',
+    label: '周考'
+  }, {
+    value: '2',
+    label: '月考'
+  }, {
+    value: '3',
+    label: '期中'
+  },{
+    value: '4',
+    label: '期末'
+  }, {
+    value: '5',
+    label: '作业'
+  }, {
+    value: '6',
+    label: '测试'
+  }];
+}
+let grade_list = $ref([])
+let subject_list = $ref([])
 let process_type = [{
   value: '1',
   label: '先上传后划块'
@@ -185,25 +156,49 @@ let process_type = [{
   value: '2',
   label: '先划块后上传'
 }]
-let school_list = [{
-  value: '1',
-  label: '蒙阴市第一小学'
-},{
-  value: '2',
-  label: '蒙阴市第二小学'
-},{
-  value: '3',
-  label: '蒙阴市第三小学'
-},{
-  value: '4',
-  label: '蒙阴市第一中学'
-},{
-  value: '5',
-  label: '蒙阴市第二中学'
-},{
-  value: '6',
-  label: '蒙阴市第三中学'
-}]
+let school_list = $ref([])
+const getSchool= () => {
+  request({
+    url:window.GLOBAL_CONFIG.uc + "/index.php",
+    data: {
+      mod:'school',
+      action:'main',
+      do:'index',
+      page:'1',
+      limit:'999'
+    },
+  }).then((res) => {
+    if (res.code === "1") {
+      school_list = res.data.page_data;
+    }
+  });
+}
+getSchool();
+function getGrade() {
+  let data = {
+    for_mistake:'1'
+  }
+  if(user.value.user_role_id < 72) {
+    data.sm_id = user.value.sm_info.sm_id
+  }
+  request({
+    url: window.GLOBAL_CONFIG.uc + '/index.php?mod=school&action=main&do=base_grade',
+    data: data,
+  }).then((res) => {
+    if (res.code === "1") {
+      grade_list = res.data;
+    }
+  });
+}
+getGrade();
+const getSubjectList = () => {
+  for(let i in grade_list) {
+    if(grade_list[i].grade === createForm.ksnj.value) {
+      createForm.kskm = [];
+      subject_list = grade_list[i].subjects;
+    }
+  }
+}
 const handleCancel = () => {
   router.back();
 }
@@ -213,7 +208,46 @@ const handleSubmit = async (formEl) => {
 
   formEl.validate(async (valid, fields) => {
     if (valid) {
+      let kskm_label = [];
+      let kskm_value = [];
+      for(let i in createForm.kskm) {
+        kskm_label.push(createForm.kskm[i].label);
+        kskm_value.push(createForm.kskm[i].value);
+      }
 
+      let data = {
+        issubmit:'1',
+        yzy_ksjh:{
+          ykj_ksrwmc:createForm.ksmc,
+          ykj_ksrq:createForm.kssj[0],
+          ykj_jsrq:createForm.kssj[1],
+          ykj_kslx:createForm.kslx,
+          ykj_ksnj:createForm.ksnj.value,
+          ykj_ksnj_name:createForm.ksnj.label,
+          ykj_kskm:kskm_value.join(','),
+          ykj_kskm_name:kskm_label.join(','),
+          ykj_yjlc:createForm.yjlc
+        }
+      }
+      if(createForm.kslx === '7') {
+        let lkxx_value = [];
+        let lkxx_label = [];
+        for(let j in createForm.lkxx) {
+          lkxx_label.push(createForm.lkxx[j].label);
+          lkxx_value.push(createForm.lkxx[j].value);
+        }
+        data.yzy_ksjh.ykj_lkxx = lkxx_value.join(',');
+        data.yzy_ksjh.ykj_lkxx_name  = lkxx_label.join(',');
+      }
+      request({
+        url: '/yzy/ksjh/liankao_add',
+        data: data,
+      }).then((res) => {
+        if (res.code === "1") {
+          ElMessage.success("考试计划创建成功!");
+          linkTo('process');
+        }
+      });
     } else {
       console.log("error submit!", fields);
     }

+ 39 - 11
src/pages/process/detail/[id].vue

@@ -10,35 +10,42 @@
        <div class="mt-70px pl-300px">
          <div class="flex">
            <h3 class="w-80px text-right text-16px leading-20px text-hex-949494 font-bold mr-30px">考试名称</h3>
-           <div class="flex-1 text-16px leading-20px">联考</div>
+           <div class="flex-1 text-16px leading-20px">{{ykj_detail.ykj_ksrwmc}}</div>
          </div>
          <div class="mt-40px flex">
            <h3 class="w-80px text-right text-16px leading-20px text-hex-949494 font-bold mr-30px">考试时间</h3>
-           <div class="flex-1 text-16px leading-20px">2022-11-23  至 2022-12-12</div>
+           <div class="flex-1 text-16px leading-20px">{{ykj_detail.ykj_ksrq}} 至 {{ykj_detail.ykj_jsrq}}</div>
          </div>
          <div class="mt-40px flex">
            <h3 class="w-80px text-right text-16px leading-20px text-hex-949494 font-bold mr-30px">考试类型</h3>
-           <div class="flex-1 text-16px leading-20px">联考</div>
+           <div class="flex-1 text-16px leading-20px">
+             <span v-if="ykj_detail.ykj_kslx === '1'">周考</span>
+             <span v-if="ykj_detail.ykj_kslx === '2'">月考</span>
+             <span v-if="ykj_detail.ykj_kslx === '3'">作业</span>
+             <span v-if="ykj_detail.ykj_kslx === '4'">测验</span>
+             <span v-if="ykj_detail.ykj_kslx === '5'">期中</span>
+             <span v-if="ykj_detail.ykj_kslx === '6'">期末</span>
+             <span v-if="ykj_detail.ykj_kslx === '7'">联考</span>
+           </div>
          </div>
          <div class="mt-40px flex">
            <h3 class="w-80px text-right text-16px leading-20px text-hex-949494 font-bold mr-30px">联考学校</h3>
-           <div class="flex-1 text-16px leading-20px">蒙阴市中小学 蒙阴市中小学 蒙阴市中小学 蒙阴市中小学</div>
+           <div class="flex-1 text-16px leading-20px">{{ykj_detail.ykj_lkxx_name}}</div>
          </div>
          <div class="mt-40px flex">
            <h3 class="w-80px text-right text-16px leading-20px text-hex-949494 font-bold mr-30px">考试年级</h3>
-           <div class="flex-1 text-16px leading-20px">一年级</div>
+           <div class="flex-1 text-16px leading-20px">{{ykj_detail.ykj_ksnj_name}}</div>
          </div>
          <div class="mt-40px flex">
            <h3 class="w-80px text-right text-16px leading-20px text-hex-949494 font-bold mr-30px">考试科目</h3>
-           <div class="flex-1 text-16px leading-20px">语文 数学 英语 物理 化学 生物 地理</div>
-         </div>
-         <div class="mt-40px flex">
-           <h3 class="w-80px text-right text-16px leading-20px text-hex-949494 font-bold mr-30px">考试形式</h3>
-           <div class="flex-1 text-16px leading-20px">线上考试</div>
+           <div class="flex-1 text-16px leading-20px">{{ykj_detail.ykj_kskm_name}}</div>
          </div>
          <div class="mt-40px flex">
            <h3 class="w-80px text-right text-16px leading-20px text-hex-949494 font-bold mr-30px">阅卷流程</h3>
-           <div class="flex-1 text-16px leading-20px">先上传后划块</div>
+           <div class="flex-1 text-16px leading-20px">
+             <span v-if="ykj_detail.ykj_yjlc === '1'">先上传后划块</span>
+             <span v-if="ykj_detail.ykj_yjlc === '2'">先划块后上传</span>
+           </div>
          </div>
          <div class="mt-40px flex">
            <h3 class="text-16px leading-20px w-80px text-right text-hex-949494 font-bold mr-30px">状态</h3>
@@ -67,10 +74,31 @@
 </route>
 <script setup>
 import { useRouter } from "vue-router";
+import request from "@/utils/request";
 const router = useRouter();
+const route = useRoute();
 const linkTo = (name) => {
   router.push({ name });
 };
+let ykj_id = $ref('');
+let ykj_detail = $ref({});
+function getDetail() {
+  request({
+    url: "/yzy/ksjh/detail",
+    data: {
+      ykj_id: ykj_id,
+    },
+  }).then((res) => {
+    if (res.code === "1") {
+      ykj_detail= res.data.one_info;
+    }
+  });
+}
+
+if (route.params.id) {
+  ykj_id = route.params.id;
+  getDetail();
+}
 </script>
 
 <style lang="scss" scoped>

+ 307 - 0
src/pages/process/edit/[id].vue

@@ -0,0 +1,307 @@
+<template>
+  <NavHeader/>
+  <bread-crumb/>
+  <div class="w-1200px m-auto">
+    <div class="relative -mt-40px flex justify-end">
+      <button type="button" class="back-btn" @click="linkTo('process')">返回</button>
+    </div>
+    <div class="mt-10px w-full min-h-860px bg-hex-FFF pt-25px">
+      <h3 class="text-18px text-center">编辑考试计划</h3>
+      <div class="mt-60px pl-250px">
+        <el-form ref="ruleFormRef" :rules="rules" :model="createForm" label-width="120px" size="large" status-icon>
+          <el-form-item label="考试名称" prop="ksmc" style="width: 620px">
+            <el-input v-model="createForm.ksmc" placeholder="请输入考试名称" />
+          </el-form-item>
+          <el-form-item label="考试时间" prop="kssj" style="width: 620px">
+            <el-date-picker  v-model="createForm.kssj" type="daterange" range-separator="至" start-placeholder="考试开始时间"
+                            end-placeholder="考试结束时间" value-format="YYYY-MM-DD" />
+          </el-form-item>
+          <el-form-item label="考试类型" prop="kslx" style="width: 620px">
+            <el-radio-group v-model="createForm.kslx">
+              <el-radio v-for="item in type_list" :label="item.value">{{item.label}}</el-radio>
+            </el-radio-group>
+          </el-form-item>
+          <el-form-item v-if="createForm.kslx === '7'" label="联考学校" prop="lkxx">
+            <el-select v-model="createForm.lkxx" style="width: 500px" multiple placeholder="请选择联考学校">
+              <el-option
+                v-for="item in school_list"
+                :label="item.schoolname"
+                :value="{value:item.schoolid,label:item.schoolname}"
+              />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="考试年级" prop="ksnj">
+            <el-select v-model="createForm.ksnj" style="width: 500px" disabled placeholder="请选择考试年级" @change="getSubjectList">
+              <el-option
+                v-for="item in grade_list"
+                :label="item.gradename"
+                :value="{label:item.gradename,value:item.grade}"
+              />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="考试科目" prop="kskm">
+            <el-select v-model="createForm.kskm" style="width: 500px" disabled multiple placeholder="请选择考试科目">
+              <el-option
+                v-for="item in subject_list"
+                :label="item.subject_name"
+                :value="{label:item.subject_name,value:item.subject_id}"
+              />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="阅卷流程" prop="yjlc" style="width: 620px">
+            <el-radio-group v-model="createForm.yjlc">
+              <el-radio v-for="item in process_type" :label="item.value">{{item.label}}</el-radio>
+            </el-radio-group>
+          </el-form-item>
+          <el-form-item>
+            <div class="mt-50px pl-50px">
+              <el-button class="mr-20px" @click="linkTo('process')"><span class="px-40px">取消</span></el-button>
+              <el-button type="primary" color="#003eee" @click="handleSubmit(ruleFormRef)"><span class="px-40px">确定</span></el-button>
+            </div>
+
+
+          </el-form-item>
+        </el-form>
+      </div>
+    </div>
+  </div>
+  <commonFooter/>
+</template>
+<route lang="json">
+{
+"meta":{
+"title":"编辑考试计划",
+"breadcrumb": true
+}
+}
+</route>
+<script setup>
+import { useRouter } from "vue-router";
+import request from "~/utils/request";
+import {user} from "~/store";
+const router = useRouter();
+const route = useRoute();
+const linkTo = (name) => {
+  router.push({ name });
+};
+const rules = $ref({
+  ksmc:[{ required: true, message: '请输入考试名称', trigger: 'blur' }],
+  kssj:[{ required: true, message: "请选择考试时间", trigger: "blur" }],
+  kslx: [{required: true, message: '请选择考试类型', trigger: 'change'}],
+  ksnj: [{required: true, message: '请选择一个年级', trigger: 'change'}],
+  kskm: [{required: true, message: '请至少选择一个科目', trigger: 'change'}],
+  yjlc: [{required: true, message: '请选择阅卷流程', trigger: 'change'}],
+  lkxx: [{required: true, message: '请至少选择一个学校', trigger: 'change'}],
+})
+const ruleFormRef = ref(null);
+let createForm = $ref({
+  ksmc:'',
+  kssj:'',
+  kslx:'1',
+  ksnj:{},
+  kskm:[],
+  yjlc:'1',
+  lkxx:[]
+})
+let type_list = $ref([])
+if(user.value.user_role_id < 72) {
+  type_list = [{
+    value: '1',
+    label: '周考'
+  }, {
+    value: '2',
+    label: '月考'
+  }, {
+    value: '3',
+    label: '期中'
+  },{
+    value: '4',
+    label: '期末'
+  }, {
+    value: '5',
+    label: '作业'
+  }, {
+    value: '6',
+    label: '测试'
+  },{
+    value: '7',
+    label: '联考'
+  }];
+} else {
+  type_list = [{
+    value: '1',
+    label: '周考'
+  }, {
+    value: '2',
+    label: '月考'
+  }, {
+    value: '3',
+    label: '期中'
+  },{
+    value: '4',
+    label: '期末'
+  }, {
+    value: '5',
+    label: '作业'
+  }, {
+    value: '6',
+    label: '测试'
+  }];
+}
+let grade_list = $ref([])
+let subject_list = $ref([])
+let process_type = [{
+  value: '1',
+  label: '先上传后划块'
+},{
+  value: '2',
+  label: '先划块后上传'
+}]
+let school_list = $ref([])
+const getSchool= () => {
+  request({
+    url:window.GLOBAL_CONFIG.uc + "/index.php",
+    data: {
+      mod:'school',
+      action:'main',
+      do:'index',
+      page:'1',
+      limit:'999'
+    },
+  }).then((res) => {
+    if (res.code === "1") {
+      school_list = res.data.page_data;
+    }
+  });
+}
+getSchool();
+function getGrade() {
+  let data = {
+    for_mistake:'1'
+  }
+  if(user.value.user_role_id < 72) {
+    data.sm_id = user.value.sm_info.sm_id
+  }
+  request({
+    url: window.GLOBAL_CONFIG.uc + '/index.php?mod=school&action=main&do=base_grade',
+    data: data,
+  }).then((res) => {
+    if (res.code === "1") {
+      grade_list = res.data;
+    }
+  });
+}
+getGrade();
+const getSubjectList = () => {
+  for(let i in grade_list) {
+    if(grade_list[i].grade == createForm.ksnj.value) {
+      createForm.kskm = [];
+      subject_list = grade_list[i].subjects;
+    }
+  }
+}
+const handleCancel = () => {
+  router.back();
+}
+
+const handleSubmit = async (formEl) => {
+  if (!formEl) return;
+
+  formEl.validate(async (valid, fields) => {
+    if (valid) {
+      let kskm_label = [];
+      let kskm_value = [];
+      for(let i in createForm.kskm) {
+        kskm_label.push(createForm.kskm[i].label);
+        kskm_value.push(createForm.kskm[i].value);
+      }
+
+      let data = {
+        issubmit:'1',
+        ykj_id:ykj_id,
+        yzy_ksjh:{
+          ykj_ksrwmc:createForm.ksmc,
+          ykj_ksrq:createForm.kssj[0],
+          ykj_jsrq:createForm.kssj[1],
+          ykj_kslx:createForm.kslx,
+          ykj_ksnj:createForm.ksnj.value,
+          ykj_ksnj_name:createForm.ksnj.label,
+          ykj_kskm:kskm_value.join(','),
+          ykj_kskm_name:kskm_label.join(','),
+          ykj_yjlc:createForm.yjlc
+        }
+      }
+      if(createForm.kslx === '7') {
+        let lkxx_value = [];
+        let lkxx_label = [];
+        for(let j in createForm.lkxx) {
+          lkxx_label.push(createForm.lkxx[j].label);
+          lkxx_value.push(createForm.lkxx[j].value);
+        }
+        data.yzy_ksjh.ykj_lkxx = lkxx_value.join(',');
+        data.yzy_ksjh.ykj_lkxx_name  = lkxx_label.join(',');
+      }
+      request({
+        url: '/yzy/ksjh/edit',
+        data: data,
+      }).then((res) => {
+        if (res.code === "1") {
+          ElMessage.success("考试计划编辑成功!");
+          linkTo('process');
+        }
+      });
+    } else {
+      console.log("error submit!", fields);
+    }
+  });
+}
+let ykj_id = $ref('');
+function getDetail() {
+  request({
+    url: "/yzy/ksjh/detail",
+    data: {
+      ykj_id: ykj_id,
+    },
+  }).then((res) => {
+    if (res.code === "1") {
+      // createForm= res.data.one_info;
+      createForm.ksmc = res.data.one_info.ykj_ksrwmc;
+      createForm.kssj = [res.data.one_info.ykj_ksrq,res.data.one_info.ykj_jsrq];
+      createForm.kslx = res.data.one_info.ykj_kslx;
+      createForm.ksnj = {
+        label:res.data.one_info.ykj_ksnj_name,
+        value:res.data.one_info.ykj_ksnj
+      }
+      if(createForm.ksnj.value !== '') {
+        getSubjectList();
+      }
+      createForm.yjlc = res.data.one_info.ykj_yjlc;
+      for(let i in res.data.one_info.ykj_kskm.split(',')) {
+        let obj = {
+          value:res.data.one_info.ykj_kskm.split(',')[i],
+          label:res.data.one_info.ykj_kskm_name.split(',')[i]
+        }
+        createForm.kskm.push(obj);
+      }
+      if(res.data.one_info.ykj_kslx === '7') {
+        for(let j in res.data.one_info.ykj_lkxx.split(',')) {
+          let ob = {
+            value:res.data.one_info.ykj_lkxx.split(',')[j],
+            label:res.data.one_info.ykj_lkxx_name.split(',')[j]
+          }
+          createForm.lkxx.push(ob);
+        }
+      }
+    }
+  });
+}
+
+if (route.params.id) {
+  ykj_id = route.params.id;
+  getDetail();
+}
+</script>
+
+<style scoped>
+
+</style>

+ 740 - 0
src/pages/process/fjct/[ze_id]/[zs_id].vue

@@ -0,0 +1,740 @@
+<template>
+  <NavHeader/>
+  <bread-crumb/>
+  <div class="w-1200px m-auto">
+    <div class="relative -mt-40px flex justify-end">
+      <button type="button" class="back-btn" @click="linkTo('process')">返回</button>
+    </div>
+    <div class="mt-10px w-full min-h-860px bg-hex-FFF pt-25px pb-30px">
+      <h3 class="text-18px text-center">附件出题</h3>
+      <div class="mt-60px pl-250px">
+        <el-form ref="ruleFormRef" :rules="rules" :model="createForm" label-width="140px" size="large" status-icon>
+          <el-form-item label="学科" style="width: 620px">
+            <h3 class="text-14px">{{ createForm.xkmc }}</h3>
+          </el-form-item>
+          <el-form-item label="答题卡名称" prop="dtkmc" style="width: 620px">
+            <el-input v-model="createForm.dtkmc" placeholder="请输入答题卡名称"/>
+          </el-form-item>
+          <el-form-item label="答题卡别名" style="width: 620px">
+            <el-input v-model="createForm.dtkbm" placeholder="请输入答题卡别名"/>
+          </el-form-item>
+          <el-form-item label="及格分数" prop="jgfs" style="width: 620px">
+            <el-input v-model="createForm.jgfs" placeholder="请输入及格分数"/>
+          </el-form-item>
+          <el-form-item label="优秀分数" prop="yxfs" style="width: 620px">
+            <el-input v-model="createForm.yxfs" placeholder="请输入优秀分数"/>
+          </el-form-item>
+          <el-form-item label="流程类型" prop="lclx" style="width: 620px">
+            <el-radio-group v-model="createForm.lclx">
+              <el-radio v-for="item in lc_type_list" :label="item.value">{{ item.label }}</el-radio>
+            </el-radio-group>
+          </el-form-item>
+          <el-form-item label="阅卷流程" prop="fj_choose" style="width: 620px">
+            <el-radio-group v-model="createForm.fj_choose">
+              <el-radio v-for="item in yjlc" :label="item.value" @change="fileList = []">{{ item.label }}</el-radio>
+            </el-radio-group>
+          </el-form-item>
+          <el-form-item>
+            <el-upload v-if="createForm.fj_choose === '1'"
+                       action=""
+                       :auto-upload="false"
+                       :show-file-list="false"
+                       :on-change="uploadFile"
+                       v-loading.fullscreen.lock="fullscreenLoading"
+                       accept=".jpg,.png,.jpeg"
+                       class="upload-demo"
+            >
+              <el-button type="primary" color="#003eee">
+                <el-icon :size="24">
+                  <UploadFilled/>
+                </el-icon>
+                <span>上传文件</span>
+              </el-button>
+              <template #tip>
+                <div class="el-upload__tip">
+                  上传文件格式支持 jpg,png,jpeg
+                </div>
+              </template>
+            </el-upload>
+            <div v-else-if="createForm.fj_choose === '2'">
+              <el-button type="primary" color="#003eee" @click="launchClient">
+                <el-icon :size="24">
+                  <Promotion/>
+                </el-icon>
+                <span>启动客户端</span>
+              </el-button>
+            </div>
+            <div v-else>
+              <el-button type="primary" color="#003eee" @click="chooseCard">
+                <el-icon :size="24">
+                  <Plus/>
+                </el-icon>
+                <span>请选择答题卡</span>
+              </el-button>
+            </div>
+          </el-form-item>
+          <el-form-item v-if="fileList.length > 0" label="文件列表">
+            <div class="flex">
+              <div class="w-370px">名称</div>
+              <div class="w-200px">操作</div>
+            </div>
+            <div class="flex" v-for="(item,index) in fileList">
+              <div class="w-370px truncate">{{ item.name }}</div>
+              <div class="w-200px">
+                <el-link :underline="false" @click="filePreview(item)">预览</el-link>
+                <el-link class="ml-10px" :underline="false" @click="downloadFile(item)">下载</el-link>
+                <el-link class="ml-10px" :underline="false" @click="delFile(index)">删除</el-link>
+              </div>
+            </div>
+          </el-form-item>
+          <el-form-item>
+            <div class="mt-50px pl-50px">
+              <el-button class="mr-20px" @click="linkTo('process')"><span class="px-40px">取消</span></el-button>
+              <el-button type="primary" color="#003eee" @click="handleSubmit(ruleFormRef)"><span
+                class="px-40px">确定</span></el-button>
+            </div>
+
+
+          </el-form-item>
+        </el-form>
+      </div>
+    </div>
+  </div>
+  <el-dialog v-model="previewDialogVisible" title="文件预览"
+             width="850px"
+             custom-class="dialogTrick"
+             append-to-body>
+    <div class="w-full h-700px overflow-auto">
+      <img class="w-full" v-if="fileType === 'img'" :src="fileUrl" alt="Preview Image"/>
+      <video class="w-full h-full" controls v-if="fileType === 'mp4'" :src="fileUrl"></video>
+      <iframe class="w-full h-full" v-if="fileType === 'file'" :src="fileUrl" frameborder="0"></iframe>
+    </div>
+
+  </el-dialog>
+  <el-dialog
+    v-model="dialogVisible"
+    title="答题卡选择"
+    width="980px"
+    custom-class="dialogTrick"
+    append-to-body
+  >
+    <el-form :inline="true" class="flex justify-between" size="large">
+      <el-form-item label="考试时间筛选">
+        <el-date-picker
+          v-model="exam_time"
+          value-format="YYYY-MM-DD"
+          type="daterange"
+          range-separator="至"
+          start-placeholder="开始时间"
+          end-placeholder="结束时间"
+          @change="handleDateChange"
+          size="large"
+        />
+      </el-form-item>
+      <div>
+        <el-form-item style="margin-right: 10px">
+          <el-input v-model="keyword" style="width: 200px;" placeholder="请输入关键字" clearable @keyup.enter="filterData"
+                    @clear="filterData"/>
+        </el-form-item>
+        <el-form-item>
+          <el-button color="#003eee" type="primary" @click="filterData">搜索</el-button>
+        </el-form-item>
+
+      </div>
+
+    </el-form>
+    <div v-if="cardList.length > 0">
+      <ul class="card-list py-15px pl-20px">
+        <li v-for="item in cardList" class="relative py-15px" :class="chooseCheck === item.zs_id?'selected':''">
+          <div class="choose">
+            <p class="set-check">
+              <input type="radio" :id="item.zs_id" :value="item.zs_id" v-model="chooseCheck">
+              <label :for="item.zs_id"></label>
+            </p>
+          </div>
+          <div class="w-162px h-108px m-auto overflow-hidden">
+            <img class="w-full"
+                 :src="item.fj_content[0].url"
+                 alt="">
+          </div>
+          <h3 class="mt-10px mb-10px px-20px text-13px leading-20px truncate text-center">{{item.zs_name}}</h3>
+          <button type="button" class="op-btn block m-auto" :disabled="item.not_allowed" @click="imgShow(item)">查看</button>
+        </li>
+      </ul>
+      <div class="mt-20px page-new flex justify-end">
+        <el-pagination v-model:current-page="cur_page" v-model:page-size="limit" layout="total,prev, pager, next" :total="total" :background="true" @current-change="handleSelectionChange"></el-pagination>
+      </div>
+    </div>
+    <div v-else class="no-data">
+      <div>
+        <h3 class="no-data-img"></h3>
+        <h4 class="mt-25px text-18px text-hex-0048e5 text-center">暂无数据</h4>
+      </div>
+    </div>
+
+    <template #footer>
+      <span class="dialog-footer">
+        <el-button @click="dialogVisible = false" class="mr-15px" size="large">
+          <span class="px-10px">取消</span>
+        </el-button>
+        <el-button size="large" color="#003eee" type="primary" :disabled="chooseCheck === ''" @click="chooseCardSub">
+          <span class="px-10px">确定</span>
+        </el-button>
+      </span>
+    </template>
+
+  </el-dialog>
+  <div class="loading-mask" v-if="scanLoading">
+    <div class="text-center">
+      <div class="loading-icon"></div>
+      <h3 class="text-16px text-center text-hex-959595">客户端处理中,耐心等待……</h3>
+    </div>
+  </div>
+  <div class="preview-box" v-if="showPreview">
+    <el-icon class="preview-close cursor-pointer" @click="showPreview = false"><CloseBold /></el-icon>
+    <el-carousel class="h-full overflow-y-auto" :autoplay="false" indicator-position="none">
+      <el-carousel-item v-for="item in imgPreview" :key="item">
+        <img class="m-auto block" :src="item.url" alt="">
+      </el-carousel-item>
+    </el-carousel>
+  </div>
+  <commonFooter/>
+</template>
+<route lang="json">
+{
+"meta":{
+"title":"附件出题",
+"breadcrumb": true
+}
+}
+</route>
+<script setup>
+import {useRouter} from "vue-router";
+import request from "~/utils/request";
+import {REQUEST} from "~/utils/request";
+import {user} from "~/store";
+
+const router = useRouter();
+const route = useRoute();
+const linkTo = (name) => {
+  router.push({name});
+};
+const rules = $ref({
+  dtkmc: [{required: true, message: '请输入答题卡名称', trigger: 'blur'}],
+  jgfs: [{required: true, message: '请输入及格分数', trigger: 'blur'}],
+  yxfs: [{required: true, message: '请输入优秀分数', trigger: 'blur'}],
+  lclx: [{required: true, message: '请选择流程类型', trigger: 'change'}],
+  fj_choose: [{required: true, message: '请选择阅卷流程', trigger: 'change'}],
+})
+const ruleFormRef = ref(null);
+let createForm = $ref({
+  xkmc: '',
+  dtkmc: '',
+  dtkbm: '',
+  jgfs: '',
+  yxfs: '',
+  lclx: '',
+  fj_choose: '1'
+})
+let lc_type_list = [{
+  value: '0',
+  label: '常规'
+}, {
+  value: '1',
+  label: '自定义框选'
+}, {
+  value: '2',
+  label: '无定位点框选(第三方答题卡)'
+}]
+let yjlc = [{
+  value: '1',
+  label: '上传文件'
+}, {
+  value: '2',
+  label: '模板预扫描'
+}, {
+  value: '3',
+  label: '沿用答题卡'
+}]
+
+const handleCancel = () => {
+  router.back();
+}
+
+const handleSubmit = async (formEl) => {
+  if (!formEl) return;
+
+  formEl.validate(async (valid, fields) => {
+    if (valid) {
+      if (fileList.length === 0) {
+        ElMessage({
+          type: "warning",
+          message: "请先上传附件!",
+        });
+      } else {
+        request({
+          url: '/yzy/ksjh/fjct_edit',
+          data: {
+            zs_id: zs_id,
+            ze_id: ze_id,
+            zs_name: createForm.dtkmc,
+            zs_alias: createForm.dtkbm,
+            zs_lctype: createForm.lclx,
+            fj_choose: createForm.fj_choose,
+            fj_content: fileList,
+            ze_pass_score: createForm.jgfs,
+            ze_max_score: createForm.yxfs
+          }
+        }).then(res => {
+          if (res.code === '1') {
+            ElMessage.success("附件出题编辑成功!");
+            // 需要跳转到新流程页面
+          }
+        })
+      }
+    } else {
+      console.log("error submit!", fields);
+    }
+  });
+}
+
+let dialogVisible = $ref(false)
+let chooseCheck = $ref('');
+let ze_id = $ref('');
+let zs_id = $ref('');
+if (route.params.ze_id) {
+  ze_id = route.params.ze_id;
+  zs_id = route.params.zs_id;
+  getDetail();
+}
+let fullscreenLoading = $ref(false)
+let fileList = $ref([])
+let scanLoading = $ref(false)
+
+function getDetail() {
+  request({
+    url: "/yzy/ksjh/fjct_detail",
+    data: {
+      ze_id: ze_id,
+      zs_id: zs_id
+    },
+  }).then((res) => {
+    if (res.code === "1") {
+      createForm.xkmc = res.data.one_info.ze_xueke_name;
+      createForm.dtkmc = res.data.one_info.zs_name;
+      createForm.dtkbm = res.data.one_info.zs_alias;
+      createForm.jgfs = res.data.one_info.ze_pass_score;
+      createForm.yxfs = res.data.one_info.ze_max_score;
+      createForm.lclx = res.data.one_info.zs_lctype;
+      if (res.data.one_info.fj_choose === '0') {
+        createForm.fj_choose = '1';
+      } else {
+        createForm.fj_choose = res.data.one_info.fj_choose;
+      }
+
+      fileList = [];
+      if (res.data.one_info.fj_content !== '') {
+        let i_arr = res.data.one_info.fj_content.split('**');
+        for (let i in i_arr) {
+          let f_obj = {
+            name: i_arr[i].split('##')[0],
+            url: i_arr[i].split('##')[1]
+          }
+          fileList.push(f_obj);
+        }
+      }
+
+    }
+  });
+}
+
+const uploadFile = (file) => {
+  // console.log(file, 87)
+  fullscreenLoading = true;
+  REQUEST.upload({
+    url: '/upload/main/file',
+    data: {
+      filedata: file.raw,
+      mod: 'upload',
+      action: 'main',
+      do: 'file',
+      urltype: '1'
+    }
+  }).then(res => {
+    fullscreenLoading = false;
+    if (res.code === '1') {
+      // console.log(res.data, 89)
+      let file_info = {
+        name: res.data.file_name,
+        url: res.data.url
+      }
+      fileList.push(file_info);
+    } else {
+      ElMessage({
+        type: "warning",
+        message: "上传失败",
+      });
+    }
+  })
+}
+let previewDialogVisible = $ref(false)
+let fileType = $ref('')
+let fileUrl = $ref('')
+const filePreview = (item) => {
+  previewDialogVisible = true;
+
+  if (/\.(jpg|png|jpeg)/.test(item.url)) {
+    fileType = 'img';
+    fileUrl = item.url;
+  } else if (/\.mp4/.test(item.url)) {
+    fileType = 'mp4';
+    fileUrl = item.url;
+  } else if (/\.(docx|doc|pdf|ppt|pptx|xls|xlsx)/.test(item.url)) {
+    fileType = 'file';
+    fileUrl = 'https://view.officeapps.live.com/op/view.aspx?src=' + item.url;
+  }
+}
+const downloadFile = (item) => {
+  window.open(item.url, '_blank')
+}
+const delFile = (index) => {
+  fileList.splice(index, 1)
+}
+const launchClient = () => {
+  scanLoading = true;
+  let scan_batch = parseInt(new Date().getTime() / 1000) + randomString(5);
+  let clientLink = 'bozeduyuejuan://' + user.value.token + ',0,' + window.GLOBAL_CONFIG.yzy + ',pre_scan,' + scan_batch;
+  window.open(clientLink, '_blank');
+  getScanStatus(scan_batch);
+}
+
+function randomString(e) {
+  e = e || 32;
+  var t = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz123456789",
+    a = t.length,
+    n = "";
+  for (let i = 0; i < e; i++) n += t.charAt(Math.floor(Math.random() * a));
+  return n
+}
+
+let timer = null;
+
+function interval(func, wait) {
+  let interv = () => {
+    func.call(null);
+    timer = setTimeout(interv, wait);
+  };
+  timer = setTimeout(interv, wait);
+}
+
+function getScanStatus(scan_batch) {
+  request({
+    url: "/yzy/kmksyjlc/pre_scan_get",
+    data: {
+      tag: scan_batch
+    },
+  }).then((res) => {
+    if (res.code === "1") {
+      if (res.data.files.length === 0) {
+
+        interval(() => {
+          if (timer) {
+            clearTimeout(timer);
+            timer = null;
+          }
+          getScanStatus(scan_batch)
+        }, 10000);
+      } else {
+        scanLoading = false;
+        if (timer) {
+          clearTimeout(timer);
+          timer = null;
+        }
+        fileList = [];
+        for (let i = 0; i < res.data.files.length; i++) {
+          let file_info = {
+            name: '模板_' + (i + 1),
+            url: window.GLOBAL_CONFIG.yzy + '/' + res.data.files[i]
+          }
+          fileList.push(file_info);
+        }
+      }
+    }
+  })
+}
+
+let limit = $ref(8)
+let total = $ref(0)
+let cur_page = $ref(1)
+let exam_time = $ref([])
+let keyword = $ref('')
+let cardList = $ref([]);
+const chooseCard = () => {
+  getListData();
+  chooseCheck = '';
+  dialogVisible = true;
+
+}
+
+function getListData() {
+  let data = {
+    page: cur_page,
+    limit: limit,
+    keyword: keyword
+  }
+  if(exam_time && exam_time.length > 0) {
+    data.date_start = exam_time[0];
+    data.date_end = exam_time[1];
+  } else {
+    data.date_start = '';
+    data.date_end = '';
+  }
+  request({
+    url: "/yzy/ksjh/before_paper",
+    data: data,
+  }).then((res) => {
+    if (res.code === '1') {
+      cardList = res.data.page_data;
+      total = Number(res.data.total_rows);
+      cur_page = Number(res.data.page_now);
+      for(let i in cardList) {
+        for(let j in cardList[i].fj_content) {
+          cardList[i].not_allowed = /\.(docx|doc|pdf|ppt|pptx|xls|xlsx|mp4)/.test(cardList[i].fj_content[j].url);
+        }
+      }
+    }
+  })
+}
+
+const handleDateChange = (val) => {
+  if (val) {
+    exam_time = [val[0], val[1]];
+  } else {
+    exam_time = [];
+  }
+  cur_page = 1;
+  getListData();
+}
+const handleSelectionChange = (val) => {
+  cur_page = val;
+  getListData();
+};
+function filterData() {
+  cur_page = 1;
+  getListData();
+}
+function chooseCardSub() {
+  for(let i in cardList) {
+    if(cardList[i].zs_id === chooseCheck) {
+      fileList = cardList[i].fj_content;
+    }
+  }
+  dialogVisible = false;
+
+}
+let imgPreview = $ref([]);
+let showPreview = $ref(false)
+function imgShow(item) {
+  imgPreview = item.fj_content;
+  showPreview = true;
+}
+</script>
+
+<style lang="scss">
+
+.dialogTrick .el-dialog__footer {
+  text-align: center;
+}
+</style>
+
+<style lang="scss" scoped>
+::v-deep .el-radio__input.is-checked .el-radio__inner {
+  border-color: #003eee;
+  background: #003eee;
+}
+
+::v-deep .el-radio__input.is-checked + .el-radio__label {
+  color: #003eee;
+}
+::v-deep .el-carousel__container{
+  height: 100%;
+}
+
+.card-list {
+  display: flex;
+  flex-wrap: wrap;
+  max-height: 515px;
+  overflow-y: auto;
+
+  li {
+    width: 203px;
+    background: #ffffff;
+    border: 2px solid #cacaca;
+    border-radius: 10px;
+    margin-right: 30px;
+    margin-bottom: 30px;
+
+    &.selected {
+      border-color: #003eee;
+    }
+
+    &:nth-child(4n) {
+      margin-right: 0;
+    }
+
+    &:hover {
+      .card-pop {
+        display: flex;
+      }
+    }
+
+    .card-title {
+      width: 100%;
+      font-size: 13px;
+      line-height: 15px;
+    }
+  }
+
+  .card-pop {
+    position: absolute;
+    left: 0;
+    top: 0;
+    width: 100%;
+    height: 100%;
+    border-radius: 10px;
+    z-index: 30;
+    background: rgba(0, 0, 0, .45);
+    display: none;
+    align-items: center;
+    justify-content: center;
+  }
+}
+
+.op-btn {
+  width: 60px;
+  height: 30px;
+  background: #fff;
+  border: 1px solid #003eee;
+  border-radius: 2px;
+  font-size: 14px;
+  color: #003eee;
+  text-align: center;
+  &:disabled{
+    background: #ccc;
+    border-color: #ccc;
+    color: #fff;
+    pointer-events: none;
+  }
+}
+
+.choose {
+  position: absolute;
+  left: -12px;
+  top: -12px;
+  z-index: 50;
+}
+
+.set-check {
+  position: relative;
+  z-index: 40;
+  width: 25px;
+  height: 25px;
+
+  label {
+    position: absolute;
+    left: 0;
+    width: 25px;
+    height: 25px;
+    cursor: pointer;
+    background: #fff;
+    border-radius: 4px;
+    box-shadow: 0 0 4px rgba(0, 0, 0, 0.18);
+  }
+
+  input[type=radio] {
+    width: 25px;
+    height: 25px;
+    opacity: 0;
+
+    &:checked + label {
+      background: #003eee;
+    }
+
+    &:checked + label:after {
+      content: '';
+      width: 16px;
+      height: 10px;
+      position: absolute;
+      top: 5px;
+      left: 4px;
+      border: 3px solid #fff;
+      border-top: none;
+      border-right: none;
+      -moz-transform: rotate(-45deg);
+      -ms-transform: rotate(-45deg);
+      -webkit-transform: rotate(-45deg);
+      transform: rotate(-45deg);
+    }
+  }
+
+}
+
+.loading-mask {
+  position: fixed;
+  left: 0;
+  top: 0;
+  width: 100%;
+  height: 100%;
+  z-index: 1500;
+  background: rgba(255, 255, 255, .6);
+  display: flex;
+  justify-content: center;
+  align-items: center;
+}
+
+.loading-mask .loading-icon {
+  margin: 0 auto 15px;
+  width: 72px;
+  height: 72px;
+  background: url("/images/loading-new.gif") center no-repeat;
+}
+.no-data {
+  width: 100%;
+  height: 300px;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+
+  .no-data-img {
+    width: 233px;
+    height: 199px;
+    background: url("/images/no-data.png") center no-repeat;
+  }
+}
+.preview-box{
+  position: fixed;
+  left: 0;
+  top: 0;
+  width: 100%;
+  height: 100%;
+  z-index: 2100;
+  background: rgba(0,0,0,.5);
+  .preview-close{
+    position: absolute;
+    right: 15px;
+    top: 15px;
+    font-size: 40px;
+    color: #fff;
+    z-index:2200 ;
+  }
+  .el-carousel__item{
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    overflow-y: auto;
+  }
+  img{
+    max-width: 80% !important;
+  }
+}
+</style>

+ 0 - 378
src/pages/process/fjct/index.vue

@@ -1,378 +0,0 @@
-<template>
-  <NavHeader/>
-  <bread-crumb/>
-  <div class="w-1200px m-auto">
-    <div class="relative -mt-40px flex justify-end">
-      <button type="button" class="back-btn" @click="linkTo('process')">返回</button>
-    </div>
-    <div class="mt-10px w-full min-h-860px bg-hex-FFF pt-25px">
-      <h3 class="text-18px text-center">附件出题</h3>
-      <div class="mt-60px pl-250px">
-        <el-form ref="ruleFormRef" :rules="rules" :model="createForm" label-width="140px" size="large" status-icon>
-          <el-form-item label="学科" style="width: 620px">
-             <h3 class="text-14px">{{createForm.xkmc}}</h3>
-          </el-form-item>
-          <el-form-item label="答题卡名称" prop="dtkmc" style="width: 620px">
-            <el-input v-model="createForm.dtkmc" placeholder="请输入答题卡名称" />
-          </el-form-item>
-          <el-form-item label="答题卡别名" style="width: 620px">
-            <el-input v-model="createForm.dtkbm" placeholder="请输入答题卡别名" />
-          </el-form-item>
-          <el-form-item label="及格分数" prop="jgfs" style="width: 620px">
-            <el-input v-model="createForm.jgfs" placeholder="请输入及格分数" />
-          </el-form-item>
-          <el-form-item label="优秀分数" prop="yxfs" style="width: 620px">
-            <el-input v-model="createForm.yxfs" placeholder="请输入优秀分数" />
-          </el-form-item>
-          <el-form-item label="流程类型" prop="lclx" style="width: 620px">
-            <el-radio-group v-model="createForm.lclx">
-              <el-radio v-for="item in lc_type_list" :label="item.value">{{item.label}}</el-radio>
-            </el-radio-group>
-          </el-form-item>
-          <el-form-item label="阅卷流程" prop="yjlc" style="width: 620px">
-            <el-radio-group v-model="createForm.yjlc">
-              <el-radio v-for="item in yjlc" :label="item.value">{{item.label}}</el-radio>
-            </el-radio-group>
-          </el-form-item>
-          <el-form-item>
-            <div v-if="createForm.yjlc === '1'">
-              <el-button type="primary" color="#003eee">
-                <el-icon :size="24"><UploadFilled /></el-icon>
-                <span>上传文件</span>
-              </el-button>
-              <span class="ml-10px text-13px text-hex-999999">上传文件格式支持 jpg,png,jpeg,docx,doc,mp4,pdf,ppt,pptx,xls,xlsx</span>
-            </div>
-            <div v-else-if="createForm.yjlc === '2'">
-              <el-button type="primary" color="#003eee">
-                <el-icon :size="24"><Promotion /></el-icon>
-                <span>启动客户端</span>
-              </el-button>
-            </div>
-            <div v-else>
-              <el-button type="primary" color="#003eee" @click="dialogVisible = true">
-                <el-icon :size="24"><Plus /></el-icon>
-                <span>请选择答题卡</span>
-              </el-button>
-            </div>
-          </el-form-item>
-          <el-form-item v-if="createForm.yjlc === '2'" label="扫描文件展示列表"></el-form-item>
-          <el-form-item>
-            <div class="mt-50px pl-50px">
-              <el-button class="mr-20px" @click="linkTo('process')"><span class="px-40px">取消</span></el-button>
-              <el-button type="primary" color="#003eee" @click="handleSubmit(ruleFormRef)"><span class="px-40px">确定</span></el-button>
-            </div>
-
-
-          </el-form-item>
-        </el-form>
-      </div>
-    </div>
-  </div>
-  <el-dialog
-    v-model="dialogVisible"
-    title="答题卡选择"
-    width="980px"
-    custom-class="dialogTrick"
-    append-to-body
-  >
-    <el-form :inline="true" class="flex justify-between" size="large">
-      <el-form-item label="考试时间筛选">
-        <el-date-picker
-          v-model="time"
-          type="date"
-          placeholder="请选择考试时间"
-        />
-      </el-form-item>
-      <div>
-        <el-form-item style="margin-right: 10px">
-          <el-input v-model="keyword" placeholder="请输入关键字" clearable />
-        </el-form-item>
-        <el-form-item>
-          <el-button color="#003eee" type="primary">搜索</el-button>
-        </el-form-item>
-
-      </div>
-
-    </el-form>
-    <ul class="card-list py-15px">
-      <li class="relative py-15px" :class="chooseCheck.includes('1')?'selected':''">
-        <div class="choose">
-          <p class="set-check">
-            <input type="checkbox" id="1" value="1" v-model="chooseCheck">
-            <label :for="1"></label>
-          </p>
-        </div>
-        <div class="w-162px h-108px m-auto overflow-hidden">
-          <img class="w-full" src="https://yzy.bozedu.net/data/upload/exam_package/20230329/1521/210900241/5-1521-210900241-4096-20230329101520/image_20230329101519044.jpg" alt="">
-        </div>
-        <h3 class="mt-10px mb-10px px-20px text-13px leading-20px truncate text-center">2023-11-12联考答题卡</h3>
-        <button type="button" class="op-btn block m-auto">查看</button>
-      </li>
-      <li class="relative py-15px">
-        <div class="choose">
-          <p class="set-check">
-            <input type="checkbox" id="2" value="2" v-model="chooseCheck">
-            <label :for="2"></label>
-          </p>
-        </div>
-        <div class="w-162px h-108px m-auto overflow-hidden">
-          <img class="w-full" src="https://yzy.bozedu.net/data/upload/exam_package/20230329/1521/210900241/5-1521-210900241-4096-20230329101520/image_20230329101519044.jpg" alt="">
-        </div>
-        <h3 class="mt-10px mb-10px px-20px text-13px leading-20px truncate text-center">2023-11-12联考答题卡</h3>
-        <button type="button" class="op-btn block m-auto">查看</button>
-      </li>
-      <li class="relative py-15px">
-        <div class="w-162px h-108px m-auto overflow-hidden">
-          <img class="w-full" src="https://yzy.bozedu.net/data/upload/exam_package/20230329/1521/210900241/5-1521-210900241-4096-20230329101520/image_20230329101519044.jpg" alt="">
-        </div>
-        <h3 class="mt-10px mb-10px px-20px text-13px leading-20px truncate text-center">2023-11-12联考答题卡</h3>
-        <button type="button" class="op-btn block m-auto">查看</button>
-      </li>
-      <li class="relative py-15px">
-        <div class="w-162px h-108px m-auto overflow-hidden">
-          <img class="w-full" src="https://yzy.bozedu.net/data/upload/exam_package/20230329/1521/210900241/5-1521-210900241-4096-20230329101520/image_20230329101519044.jpg" alt="">
-        </div>
-        <h3 class="mt-10px mb-10px px-20px text-13px leading-20px truncate text-center">2023-11-12联考答题卡</h3>
-        <button type="button" class="op-btn block m-auto">查看</button>
-      </li>
-      <li class="relative py-15px">
-        <div class="w-162px h-108px m-auto overflow-hidden">
-          <img class="w-full" src="https://yzy.bozedu.net/data/upload/exam_package/20230329/1521/210900241/5-1521-210900241-4096-20230329101520/image_20230329101519044.jpg" alt="">
-        </div>
-        <h3 class="mt-10px mb-10px px-20px text-13px leading-20px truncate text-center">2023-11-12联考答题卡</h3>
-        <button type="button" class="op-btn block m-auto">查看</button>
-      </li>
-      <li class="relative py-15px">
-        <div class="w-162px h-108px m-auto overflow-hidden">
-          <img class="w-full" src="https://yzy.bozedu.net/data/upload/exam_package/20230329/1521/210900241/5-1521-210900241-4096-20230329101520/image_20230329101519044.jpg" alt="">
-        </div>
-        <h3 class="mt-10px mb-10px px-20px text-13px leading-20px truncate text-center">2023-11-12联考答题卡</h3>
-        <button type="button" class="op-btn block m-auto">查看</button>
-      </li>
-      <li class="relative py-15px">
-        <div class="w-162px h-108px m-auto overflow-hidden">
-          <img class="w-full" src="https://yzy.bozedu.net/data/upload/exam_package/20230329/1521/210900241/5-1521-210900241-4096-20230329101520/image_20230329101519044.jpg" alt="">
-        </div>
-        <h3 class="mt-10px mb-10px px-20px text-13px leading-20px truncate text-center">2023-11-12联考答题卡</h3>
-        <button type="button" class="op-btn block m-auto">查看</button>
-      </li>
-      <li class="relative py-15px">
-        <div class="w-162px h-108px m-auto overflow-hidden">
-          <img class="w-full" src="https://yzy.bozedu.net/data/upload/exam_package/20230329/1521/210900241/5-1521-210900241-4096-20230329101520/image_20230329101519044.jpg" alt="">
-        </div>
-        <h3 class="mt-10px mb-10px px-20px text-13px leading-20px truncate text-center">2023-11-12联考答题卡</h3>
-        <button type="button" class="op-btn block m-auto">查看</button>
-      </li>
-      <li class="relative py-15px">
-        <div class="w-162px h-108px m-auto overflow-hidden">
-          <img class="w-full" src="https://yzy.bozedu.net/data/upload/exam_package/20230329/1521/210900241/5-1521-210900241-4096-20230329101520/image_20230329101519044.jpg" alt="">
-        </div>
-        <h3 class="mt-10px mb-10px px-20px text-13px leading-20px truncate text-center">2023-11-12联考答题卡</h3>
-        <button type="button" class="op-btn block m-auto">查看</button>
-      </li>
-      <li class="relative py-15px">
-        <div class="w-162px h-108px m-auto overflow-hidden">
-          <img class="w-full" src="https://yzy.bozedu.net/data/upload/exam_package/20230329/1521/210900241/5-1521-210900241-4096-20230329101520/image_20230329101519044.jpg" alt="">
-        </div>
-        <h3 class="mt-10px mb-10px px-20px text-13px leading-20px truncate text-center">2023-11-12联考答题卡</h3>
-        <button type="button" class="op-btn block m-auto">查看</button>
-      </li>
-    </ul>
-    <template #footer>
-      <span class="dialog-footer">
-        <el-button @click="dialogVisible = false" class="mr-15px" size="large">
-          <span class="px-10px">取消</span>
-        </el-button>
-        <el-button size="large" color="#003eee" type="primary" @click="dialogVisible = false">
-          <span class="px-10px">确定</span>
-        </el-button>
-      </span>
-    </template>
-
-  </el-dialog>
-  <commonFooter/>
-</template>
-<route lang="json">
-{
-"meta":{
-"title":"附件出题",
-"breadcrumb": true
-}
-}
-</route>
-<script setup>
-import { useRouter } from "vue-router";
-const router = useRouter();
-const linkTo = (name) => {
-  router.push({ name });
-};
-const rules = $ref({
-  dtkmc:[{ required: true, message: '请输入答题卡名称', trigger: 'blur' }],
-  jgfs:[{ required: true, message: '请输入及格分数', trigger: 'blur' }],
-  yxfs:[{ required: true, message: '请输入优秀分数', trigger: 'blur' }],
-  lclx: [{required: true, message: '请选择流程类型', trigger: 'change'}],
-  yjlc: [{required: true, message: '请选择阅卷流程', trigger: 'change'}],
-})
-const ruleFormRef = ref(null);
-let createForm = $ref({
-  xkmc:'语文',
-  dtkmc:'',
-  dtkbm:'',
-  jgfs:'',
-  yxfs:'',
-  lclx:'1',
-  yjlc:'1'
-})
-let lc_type_list = [{
-  value: '1',
-  label: '常规'
-}, {
-  value: '2',
-  label: '自定义框选'
-}, {
-  value: '3',
-  label: '无定位点框选(第三方答题卡)'
-}]
-let yjlc = [{
-  value: '1',
-  label: '上传文件'
-}, {
-  value: '2',
-  label: '模板预扫描'
-}, {
-  value: '3',
-  label: '沿用答题卡'
-}]
-
-const handleCancel = () => {
-  router.back();
-}
-
-const handleSubmit = async (formEl) => {
-  if (!formEl) return;
-
-  formEl.validate(async (valid, fields) => {
-    if (valid) {
-
-    } else {
-      console.log("error submit!", fields);
-    }
-  });
-}
-let dialogVisible = $ref(false)
-let time = $ref('')
-let keyword = $ref('')
-let chooseCheck = $ref([]);
-</script>
-
-<style lang="scss">
-
-.dialogTrick .el-dialog__footer {
-  text-align: center;
-}
-</style>
-
-<style lang="scss" scoped>
-.card-list{
-  display: flex;
-  flex-wrap: wrap;
-  max-height: 480px;
-  overflow-y:auto;
-  li{
-    width: 203px;
-    background: #ffffff;
-    border: 2px solid #cacaca;
-    border-radius: 10px;
-    margin-right: 40px;
-    margin-bottom: 30px;
-    &.selected{
-      border-color:#003eee;
-    }
-    &:nth-child(4n) {
-      margin-right: 0;
-    }
-    &:hover{
-      .card-pop{
-        display: flex;
-      }
-    }
-    .card-title{
-      width: 100%;
-      font-size: 13px;
-      line-height: 15px;
-    }
-  }
-  .card-pop{
-    position: absolute;
-    left: 0;
-    top: 0;
-    width: 100%;
-    height: 100%;
-    border-radius: 10px;
-    z-index: 30;
-    background: rgba(0,0,0,.45);
-    display: none;
-    align-items: center;
-    justify-content: center;
-  }
-}
-.op-btn {
-  width: 60px;
-  height: 30px;
-  background: #fff;
-  border: 1px solid #003eee;
-  border-radius: 2px;
-  font-size: 14px;
-  color: #003eee;
-  text-align: center;
-}
-.choose{
-  position: absolute;
-  left: -12px;
-  top:-12px;
-  z-index: 50;
-}
-.set-check {
-  position: relative;
-  z-index: 40;
-  width: 25px;
-  height: 25px;
-
-  label {
-    position: absolute;
-    left: 0;
-    width: 25px;
-    height: 25px;
-    cursor: pointer;
-    background: #fff;
-    border-radius: 4px;
-    box-shadow: 0 0 4px rgba(0,0,0,0.18);
-  }
-
-  input[type=checkbox] {
-    width: 25px;
-    height: 25px;
-    opacity: 0;
-    &:checked + label {
-      background: #003eee;
-    }
-
-    &:checked + label:after {
-      content: '';
-      width: 16px;
-      height: 10px;
-      position: absolute;
-      top: 5px;
-      left: 4px;
-      border: 3px solid #fff;
-      border-top: none;
-      border-right: none;
-      -moz-transform: rotate(-45deg);
-      -ms-transform: rotate(-45deg);
-      -webkit-transform: rotate(-45deg);
-      transform: rotate(-45deg);
-    }
-  }
-
-}
-</style>

+ 289 - 268
src/pages/process/index.vue

@@ -3,24 +3,20 @@
   <bread-crumb/>
   <div class="w-1200px m-auto">
     <div class="flex items-center">
-      <el-date-picker
-        v-model="exam_time"
-        value-format="YYYY-MM-DD"
-        type="date"
-        placeholder="考试时间"
-        size="large"
-      />
-      <el-select class="ml-10px" v-model="exam_form" placeholder="考试形式" size="large">
-        <el-option label="全部" value="0"
-        />
-        <el-option
-          v-for="item in form_list"
-          :key="item.value"
-          :label="item.label"
-          :value="item.value"
+      <div class="w-360px">
+        <el-date-picker
+          v-model="exam_time"
+          value-format="YYYY-MM-DD"
+          type="daterange"
+          range-separator="至"
+          start-placeholder="开始时间"
+          end-placeholder="结束时间"
+          @change="handleDateChange"
+          size="large"
         />
-      </el-select>
-      <el-select class="ml-20px" v-model="exam_form" placeholder="考试类型" size="large">
+      </div>
+
+      <el-select class="ml-10px" v-model="exam_type" placeholder="考试类型" size="large" @change="filterData">
         <el-option label="全部" value="0"
         />
         <el-option
@@ -36,9 +32,11 @@
         style="width: 200px;"
         size="large"
         clearable
+        @keyup.enter="filterData"
+        @clear="filterData"
         placeholder="请输入关键字"
       />
-      <el-button color="#003eee" class="ml-20px" type="primary" size="large">搜索</el-button>
+      <el-button color="#003eee" class="ml-20px" type="primary" size="large" @click="filterData">搜索</el-button>
     </div>
     <div class="flex mt-20px justify-between">
       <button type="button" class="add-btn" @click="linkTo({name:'process-create'})">
@@ -47,222 +45,93 @@
         </el-icon>
         <span class="ml-5px inline-block align-middle">新建考试计划</span>
       </button>
-      <button type="button" class="del-btn">批量删除</button>
     </div>
-    <div class="mt-20px process-list-table">
-      <div class="head">
-        <div class="w-60px">
-          <p class="set-check all">
-            <input type="checkbox" id="chooseAll" @change="chooseAll" v-model="checked">
-            <label for="chooseAll"></label>
-          </p>
+    <div class="mt-20px" v-if="listData.length > 0">
+      <div class="process-list-table">
+        <div class="head">
+          <div class="w-340px text-left pl-20px">考试计划名称</div>
+          <div class="w-250px">状态</div>
+          <div class="w-130px">考试类型</div>
+          <div class="w-220px">考试时间</div>
+          <div class="w-300px">操作</div>
         </div>
-        <div class="w-150px text-left">考试计划名称</div>
-        <div class="w-250px">状态</div>
-        <div class="w-130px">考试形式</div>
-        <div class="w-130px">考试类型</div>
-        <div class="w-180px">考试时间</div>
-        <div class="w-300px">操作</div>
-      </div>
-      <div>
-        <div class="line">
-          <div class="up">
-            <div class="w-60px">
-              <p class="set-check single">
-                <input type="checkbox" id="1" :value="1" v-model="chooseCheck">
-                <label :for="1"></label>
-              </p>
-            </div>
-            <div class="w-150px text-left">考试计划名称</div>
-            <div class="w-250px">
-              <span class="inline-block align-middle">进行中</span>
-              <div class="inline-block align-middle ml-10px process-state">
-                <h3 class="state-line">
-                  <span style="width: 11%;"></span>
-                </h3>
-              </div>
-              <span class="ml-10px inline-block align-middle">11%</span>
-            </div>
-            <div class="w-130px text-left">线下考试</div>
-            <div class="w-130px text-left">联考</div>
-            <div class="w-180px text-left">2023.2.4~2023.2.17</div>
-            <div class="w-300px">
-              <button type="button" class="op-btn">编辑</button>
-              <button type="button" class="op-btn ml-10px" @click="linkTo({name:'process-detail-id',params:{id:'1'}})">详情</button>
-              <div class="ml-10px relative op-btn cursor-pointer">
-                <span class="inline-block align-middle leading-28px">更多</span>
-                <div class="more-list">
-                  <ul>
-                    <li>阅卷任务</li>
-                    <li>扫描批阅进度</li>
-                    <li>考试分析</li>
-                    <li>删除</li>
-                  </ul>
+        <div>
+          <div v-for="(item,index) in listData" class="line">
+            <div class="up">
+              <div class="w-340px pl-20px text-left">{{item.ykj_ksrwmc}}</div>
+              <div class="w-250px">
+                <span class="inline-block align-middle">进行中</span>
+                <div class="inline-block align-middle ml-10px process-state">
+                  <h3 class="state-line">
+                    <span style="width: 11%;"></span>
+                  </h3>
                 </div>
+                <span class="ml-10px inline-block align-middle">11%</span>
               </div>
-              <button type="button" class="ml-10px inline-block align-middle arrow-btn up"></button>
-            </div>
-          </div>
-          <div class="down pt-15px pl-35px">
-            <ul class="subject-list">
-              <li>
-                <div>
-                  <div class="w-140px h-195px m-auto">
-                    <img src="/images/yuwen.png" class="w-full" alt="">
-                  </div>
-                  <div class="mt-5px">
-                    <div class="inline-block align-middle process-state">
-                      <h3 class="state-line">
-                        <span style="width: 11%;"></span>
-                      </h3>
-                    </div>
-                    <span class="ml-10px text-14px inline-block align-middle">11%</span>
-                  </div>
-                  <div class="mt-5px text-center">
-                    <button type="button" class="op-btn">查看</button>
-                  </div>
-                </div>
-              </li>
-              <li>
-                <div>
-                  <div class="w-140px h-195px m-auto">
-                    <img src="/images/shuxue.png" class="w-full" alt="">
-                  </div>
-                  <div class="mt-5px">
-                    <div class="inline-block align-middle process-state">
-                      <h3 class="state-line">
-                        <span style="width: 11%;"></span>
-                      </h3>
-                    </div>
-                    <span class="ml-10px text-14px inline-block align-middle">11%</span>
-                  </div>
-                  <div class="mt-5px text-center">
-                    <button type="button" class="op-btn">查看</button>
-                  </div>
-                </div>
-              </li>
-              <li>
-                <div>
-                  <div class="w-140px h-195px m-auto">
-                    <img src="/images/yingyu.png" class="w-full" alt="">
-                  </div>
-                  <div class="mt-5px">
-                    <div class="inline-block align-middle process-state">
-                      <h3 class="state-line">
-                        <span style="width: 11%;"></span>
-                      </h3>
-                    </div>
-                    <span class="ml-10px text-14px inline-block align-middle">11%</span>
-                  </div>
-                  <div class="mt-5px text-center">
-                    <button type="button" class="op-btn">查看</button>
-                  </div>
-                </div>
-              </li>
-              <li>
-                <div>
-                  <div class="w-140px h-195px m-auto">
-                    <img src="/images/wuli.png" class="w-full" alt="">
-                  </div>
-                  <div class="mt-5px">
-                    <div class="inline-block align-middle process-state">
-                      <h3 class="state-line">
-                        <span style="width: 11%;"></span>
-                      </h3>
-                    </div>
-                    <span class="ml-10px text-14px inline-block align-middle">11%</span>
-                  </div>
-                  <div class="mt-5px text-center">
-                    <button type="button" class="op-btn">查看</button>
+              <div class="w-130px text-left">
+                <span v-if="item.ykj_kslx === '1'">周考</span>
+                <span v-if="item.ykj_kslx === '2'">月考</span>
+                <span v-if="item.ykj_kslx === '3'">作业</span>
+                <span v-if="item.ykj_kslx === '4'">测验</span>
+                <span v-if="item.ykj_kslx === '5'">期中</span>
+                <span v-if="item.ykj_kslx === '6'">期末</span>
+                <span v-if="item.ykj_kslx === '7'">联考</span>
+              </div>
+              <div class="w-220px text-left">{{item.ykj_ksrq}}~{{item.ykj_jsrq}}</div>
+              <div class="w-300px">
+                <button type="button" class="op-btn" :disabled="item.create_user_id != user.user_id" @click="linkTo({name:'process-edit-id',params:{id:item.ykj_id}})">编辑</button>
+                <button type="button" class="op-btn ml-10px" @click="linkTo({name:'process-detail-id',params:{id:item.ykj_id}})">详情</button>
+                <div class="ml-10px relative op-btn cursor-pointer">
+                  <span class="inline-block align-middle leading-28px">更多</span>
+                  <div class="more-list">
+                    <ul>
+                      <li @click="linkTo({name:'process-smpyjd-ykj_id',params:{ykj_id:item.ykj_id}})">扫描批阅进度</li>
+                      <li>考试分析</li>
+                      <li v-if="item.create_user_id == user.user_id" @click="delProject(item)">删除</li>
+                    </ul>
                   </div>
                 </div>
-              </li>
-              <li>
-                <div>
-                  <div class="w-140px h-195px m-auto">
-                    <img src="/images/huaxue.png" class="w-full" alt="">
-                  </div>
-                  <div class="mt-5px">
-                    <div class="inline-block align-middle process-state">
-                      <h3 class="state-line">
-                        <span style="width: 11%;"></span>
-                      </h3>
+                <button type="button" class="ml-10px inline-block align-middle arrow-btn" :class="item.showSub?'up':'down'" @click="toggleDown(index)"></button>
+              </div>
+            </div>
+            <div class="down pt-15px pl-35px" v-if="item.showSub">
+              <ul class="subject-list">
+                <li v-for="items in item.lc">
+                  <span class="sub-del cursor-pointer" @click="del_sub(item.ykj_id,items.ykl_id)"></span>
+                  <div>
+                    <div class="subject-name m-auto">{{items.ykl_lc !== ''?JSON.parse(items.ykl_lc).ze_xueke_name:''}}</div>
+                    <div class="mt-5px">
+                      <div class="inline-block align-middle process-state">
+                        <h3 class="state-line">
+                          <span style="width: 11%;"></span>
+                        </h3>
+                      </div>
+                      <span class="ml-10px text-14px inline-block align-middle">11%</span>
                     </div>
-                    <span class="ml-10px text-14px inline-block align-middle">11%</span>
-                  </div>
-                  <div class="mt-5px text-center">
-                    <button type="button" class="op-btn">查看</button>
-                  </div>
-                </div>
-              </li>
-              <li>
-                <div>
-                  <div class="w-140px h-195px m-auto">
-                    <img src="/images/shengwu.png" class="w-full" alt="">
-                  </div>
-                  <div class="mt-5px">
-                    <div class="inline-block align-middle process-state">
-                      <h3 class="state-line">
-                        <span style="width: 11%;"></span>
-                      </h3>
+                    <div class="mt-5px text-center">
+                      <button type="button" class="op-btn">批阅任务</button>
+                      <button type="button" class="ml-10px op-btn">查看</button>
                     </div>
-                    <span class="ml-10px text-14px inline-block align-middle">11%</span>
-                  </div>
-                  <div class="mt-5px text-center">
-                    <button type="button" class="op-btn">查看</button>
                   </div>
-                </div>
-              </li>
-              <li class="cursor-pointer" @click="dialogVisible = true">
-                <div class="subject-add-btn"></div>
-              </li>
-            </ul>
-          </div>
-        </div>
-        <div class="line">
-          <div class="up">
-            <div class="w-60px">
-              <p class="set-check single">
-                <input type="checkbox" id="1" :value="1" v-model="chooseCheck">
-                <label :for="1"></label>
-              </p>
-            </div>
-            <div class="w-150px text-left">考试计划名称</div>
-            <div class="w-250px">
-              <span class="inline-block align-middle">进行中</span>
-              <div class="inline-block align-middle ml-10px process-state">
-                <h3 class="state-line">
-                  <span style="width: 11%;"></span>
-                </h3>
-              </div>
-              <span class="ml-10px inline-block align-middle">11%</span>
-            </div>
-            <div class="w-130px text-left">线下考试</div>
-            <div class="w-130px text-left">联考</div>
-            <div class="w-180px text-left">2023.2.4~2023.2.17</div>
-            <div class="w-300px">
-              <button type="button" class="op-btn">编辑</button>
-              <button type="button" class="op-btn ml-10px">详情</button>
-              <div class="ml-10px relative op-btn cursor-pointer">
-                <span class="inline-block align-middle leading-28px">更多</span>
-                <div class="more-list">
-                  <ul>
-                    <li>阅卷任务</li>
-                    <li>扫描批阅进度</li>
-                    <li>考试分析</li>
-                    <li>删除</li>
-                  </ul>
-                </div>
-              </div>
-              <button type="button" class="ml-10px inline-block align-middle arrow-btn down"></button>
+                </li>
+                <li class="cursor-pointer" @click="addSubject(item,index)">
+                  <div class="subject-add-btn"></div>
+                </li>
+              </ul>
             </div>
           </div>
         </div>
-      </div>
 
+      </div>
+      <div class="mt-20px page-new flex justify-end">
+        <el-pagination v-model:current-page="cur_page" v-model:page-size="limit" layout="total,prev, pager, next" :total="total" :background="true" @current-change="handleSelectionChange"></el-pagination>
+      </div>
     </div>
-    <div class="mt-20px page-new flex justify-end">
-      <el-pagination v-model:current-page="cur_page" v-model:page-size="limit" layout="total,prev, pager, next" :total="total" :background="true" @current-change="handleSelectionChange"></el-pagination>
+    <div v-else class="no-data">
+      <div>
+        <h3 class="no-data-img"></h3>
+        <h4 class="mt-25px text-18px text-hex-0048e5 text-center">暂无数据</h4>
+      </div>
     </div>
   </div>
   <el-dialog
@@ -275,8 +144,8 @@
     <div>
       <el-form label-width="120px" size="large">
         <el-form-item label="请选择学科">
-          <el-select v-model="add_sub_id" placeholder="请选择学科">
-            <el-option v-for="item in subject_list" :label="item.label" :value="item.value" />
+          <el-select v-model="add_sub" placeholder="请选择学科">
+            <el-option v-for="item in sub_filter_list" :label="item.subject_name" :value="{value:item.subject_id,label:item.subject_name}" />
           </el-select>
         </el-form-item>
       </el-form>
@@ -284,7 +153,7 @@
     <template #footer>
       <span class="dialog-footer text-right">
         <el-button @click="dialogVisible = false" size="large">取消</el-button>
-        <el-button size="large" color="#003eee" type="primary" @click="dialogVisible = false">
+        <el-button size="large" color="#003eee" :disabled="add_sub.value === '' || isSubmit" type="primary" @click="addSubmit">
           确定
         </el-button>
       </span>
@@ -302,24 +171,18 @@
 }
 </route>
 <script setup>
-import {process_list} from "~/pages/process/api";
+import {project_list,subject,add_subject} from "~/pages/process/api";
 import { useRouter } from "vue-router";
+import {user} from "~/store";
+import request from "@/utils/request";
 const router = useRouter();
-console.log(router,87)
+console.log(router,7)
 const linkTo = (obj) => {
   router.push(obj);
 };
-let exam_time = $ref('')
-let exam_form = $ref('')
+let exam_time = $ref([])
 let exam_type = $ref('')
 let keyword = $ref('')
-let form_list = [{
-  value: '1',
-  label: '线上考试'
-}, {
-  value: '2',
-  label: '线下考试'
-}]
 let type_list = [{
   value: '1',
   label: '周考'
@@ -328,63 +191,181 @@ let type_list = [{
   label: '月考'
 }, {
   value: '3',
-  label: '期中'
-},{
-  value: '4',
-  label: '期末'
-}, {
-  value: '5',
   label: '作业'
-}, {
-  value: '6',
-  label: '测试'
-}]
-let subject_list = [{
-  value: '1',
-  label: '语文'
-}, {
-  value: '2',
-  label: '数学'
-}, {
-  value: '3',
-  label: '英语'
 },{
   value: '4',
-  label: '物理'
+  label: '测验'
 }, {
   value: '5',
-  label: '生物'
+  label: '期中'
 }, {
   value: '6',
-  label: '化学'
+  label: '期末'
+},{
+  value: '7',
+  label: '联考'
 }]
-let chooseCheck = $ref([]);
-let checked = $ref(false);
-let checkedIds = $ref([]);
-let noData = $ref(null);
-let limit = $ref(10);
-let total = $ref(0);
-let cur_page = $ref(1);
-let listData = $ref([]);
+let subject_list = $ref([])
+let noData = $ref(null)
+let limit = $ref(10)
+let total = $ref(0)
+let cur_page = $ref(1)
+let listData = $ref([])
 let dialogVisible = $ref(false)
-let add_sub_id = $ref('')
-function chooseAll() {
-
+let sub_filter_list = $ref([])
+let allSub = $ref([])
+let add_sub = $ref({
+  value:'',
+  label:''
+})
+let isSubmit = $ref(false)
+let add_ykj_id = $ref('')
+function getSubject() {
+   let data = {
+     for_mistake:'1'
+   }
+   if(user.value.user_role_id < 72) {
+     data.sm_id = user.value.sm_info.sm_id
+   }
+   subject(data).then(res =>{
+     if(res.code === '1') {
+       allSub = res.data;
+     }
+   })
 }
+getSubject();
 function getListData() {
   let data = {
     page:cur_page,
     limit:limit,
+    keyword:keyword,
+    ykj_ksrq:exam_time[0],
+    ykj_jsrq:exam_time[1],
+    ykj_kslx:exam_type
+
   };
-  process_list(data).then(res=>{
+  project_list(data).then(res=>{
     if(res.code === '1') {
       listData = res.data.page_data;
+      for(let i in listData) {
+        if(i == 0) {
+          listData[i].showSub = true;
+        } else {
+          listData[i].showSub = false;
+        }
+
+      }
+      // console.log(listData,87)
       total = Number(res.data.total_rows);
       cur_page = Number(res.data.page_now);
     }
   })
 }
 getListData();
+
+function filterData() {
+  cur_page = 1;
+  getListData();
+}
+const handleSelectionChange = (val) => {
+  cur_page = val;
+  getListData();
+};
+const handleDateChange = (val) => {
+  if (val) {
+    exam_time = [val[0],val[1]];
+  } else {
+    exam_time = [];
+  }
+  cur_page = 1;
+  getListData();
+}
+function addSubject(item) {
+  let filter_list = item.ykj_kskm.split(',');
+  add_ykj_id = item.ykj_id;
+  dialogVisible = true;
+  add_sub = {
+    label:'',
+    value:''
+  }
+  for(let i in allSub) {
+    if(allSub[i].grade == item.ykj_ksnj) {
+      subject_list = allSub[i].subjects;
+      sub_filter_list = subject_list.filter(item=>!filter_list.some(ele=>ele === item.subject_id))
+    }
+  }
+}
+function addSubmit() {
+   isSubmit = true;
+   let data = {
+     ykj_id:add_ykj_id,
+     ykj_kskm:add_sub.value,
+     ykj_kskm_name:add_sub.label
+   }
+   add_subject(data).then(res =>{
+     isSubmit = false;
+     if(res.code === '1') {
+       ElMessage.success("科目添加成功!");
+       dialogVisible = false;
+       getListData();
+     }
+   })
+}
+function del_sub(ykj_id,ykl_id) {
+  ElMessageBox.confirm("确认删除该学科的考试?", "", {
+    confirmButtonText: "确认",
+    cancelButtonText: "取消",
+    type: "warning",
+  }).then(() => {
+
+    request({
+      url: "/yzy/ksjh/liankao_del_subject",
+      data: {
+        ykj_id: ykj_id,
+        ykl_id: ykl_id
+      },
+    }).then((res) => {
+      if (res.code === "1") {
+        ElMessage({
+          type: "success",
+          message: "删除成功",
+        });
+        getListData();
+      }
+    });
+  })
+}
+function toggleDown(index) {
+  if(listData[index].showSub) {
+    listData[index].showSub = false;
+  } else {
+    listData[index].showSub = true;
+  }
+}
+function delProject(item) {
+  ElMessageBox.confirm("删除考试计划将会清除考试计划下的所有数据,是否继续", "", {
+    confirmButtonText: "确认",
+    cancelButtonText: "取消",
+    type: "warning",
+  }).then(() => {
+
+    request({
+      url: "/yzy/ksjh/delete",
+      data: {
+        ykj_id: item.ykj_id,
+        clear: '1'
+      },
+    }).then((res) => {
+      if (res.code === "1") {
+        ElMessage({
+          type: "success",
+          message: "删除成功",
+        });
+        getListData();
+      }
+    });
+  })
+}
 </script>
 <style lang="scss" scoped>
 $color: #0048e5;
@@ -412,6 +393,10 @@ $color: #0048e5;
   font-size: 14px;
   color: #fff;
   text-align: center;
+  &:disabled{
+    opacity: .45;
+    cursor: default;
+  }
 }
 
 .process-list-table {
@@ -639,6 +624,7 @@ $color: #0048e5;
   display: flex;
   flex-wrap: wrap;
   li{
+    position: relative;
     width: 205px;
     height: 280px;
     margin: 0 28px 23px 0;
@@ -648,10 +634,45 @@ $color: #0048e5;
     justify-content: center;
     align-items: center;
   }
+  .sub-del{
+    position: absolute;
+    right: 3px;
+    top: 3px;
+    z-index: 50;
+    width: 20px;
+    height: 20px;
+    background: url("/images/icon-close.png") center no-repeat;
+    background-size: 20px 20px;
+  }
 }
 .subject-add-btn{
   width: 57px;
   height: 57px;
   background: url("/images/icon-add.png") center no-repeat;
 }
+.no-data {
+  width: 100%;
+  height: 450px;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+
+  .no-data-img {
+    width: 233px;
+    height: 199px;
+    background: url("/images/no-data.png") center no-repeat;
+  }
+}
+.subject-name{
+  width: 138px;
+  height: 195px;
+  background: url("/images/subject-bg.png") center no-repeat;
+  background-size: 138px 195px;
+  padding: 20px 10px 0 10px;
+  font-size: 22px;
+  font-weight: bold;
+  color: #fff;
+  text-align: center;
+
+}
 </style>

+ 418 - 0
src/pages/process/kdsmjd/[ykj_id].vue

@@ -0,0 +1,418 @@
+<script setup>
+import * as echarts from 'echarts'
+import request from "~/utils/request";
+import {REQUEST} from "~/utils/request";
+import {user} from "~/store";
+import {useRouter} from "vue-router";
+const router = useRouter();
+const route = useRoute();
+const linkTo = (obj) => {
+  router.push(obj);
+};
+let ykj_id = $ref('');
+let ykj_name = $ref('');
+let sm_id = $ref('');
+let subject_id = $ref('')
+let school_list = $ref([])
+let subject_list = $ref([])
+let tableData = $ref([])
+let barSubject = $ref([]);
+let barPercent = $ref([]);
+let barUnusual = $ref(['缺考','学号异常','页码异常','缺考异常','客观题异常','选择题异常','判断题异常','填空题异常']);
+let barUnData = $ref([40,70,100,70,70,70,80,90])
+let sub_nav = [{
+  id:'1',
+  name:'考场进度监控'
+},{
+  id:'2',
+  name:'异常分类监控'
+}]
+let cur_sub = $ref({
+  id:'1',
+  name:'考场进度监控'
+})
+function getFilterData() {
+  let data = {
+    ykj_id: ykj_id
+  };
+  request({
+    url: "/yzy/ksjh/detail",
+    data: data,
+  }).then((res) => {
+    if (res.code === '1') {
+      subject_list = res.data.one_info.ykj_kskm_ex;
+      school_list = res.data.one_info.ykj_lkxx_ex;
+    }
+  })
+}
+function getData() {
+  let data = {
+    ykj_id: ykj_id,
+    sm_id: sm_id,
+    subject_id: subject_id,
+  };
+  request({
+    url: "/yzy/scan/km",
+    data: data,
+  }).then((res) => {
+    if (res.code === '1') {
+     ykj_name = res.data.ksjh.ykj_ksrwmc;
+     tableData = res.data.list;
+     barSubject = [];
+     barPercent = [];
+     tableData.forEach(item =>{
+       barSubject.push(item.ze_xueke_name);
+       barPercent.push(item.scan_percent);
+     })
+      nextTick(()=>{
+        initChart();
+      })
+
+    }
+  })
+}
+function initChart() {
+  // 基于准备好的dom,初始化echarts实例
+  let myChart = echarts.init(document.getElementById('barBox'));
+  myChart.setOption({
+    tooltip: {
+      trigger: 'axis',
+      axisPointer: {
+        type: 'shadow'
+      }
+    },
+    grid: {
+      left: '3%',
+      right: '4%',
+      bottom: '3%',
+      containLabel: true
+    },
+    xAxis: [
+      {
+        type: 'category',
+        name: '学校',
+        data: barSubject,
+        axisTick: {
+          alignWithLabel: true
+        },
+      }
+    ],
+    yAxis: [
+      {
+        type: 'value',
+        name: '扫描进度(%)',
+        nameTextStyle: {
+          fontSize: 14
+        }
+      }
+    ],
+    series: [
+      {
+        type: 'bar',
+        barWidth: '27px',
+        label: {
+          show: true,
+          position: 'top',
+          color: '#000',
+          fontSize: 14
+        },
+        itemStyle:{
+          color:'#6897FF',
+          borderRadius: [16, 16, 0, 0]
+        },
+        data: barPercent
+      }
+    ]
+  });
+}
+function initUnChart() {
+  // 绘制图表
+  let myChart_u = echarts.init(document.getElementById('unBox'));
+  myChart_u.setOption({
+    tooltip: {
+      trigger: 'axis',
+      axisPointer: {
+        type: 'shadow'
+      }
+    },
+    grid: {
+      left: '3%',
+      right: '4%',
+      bottom: '3%',
+      containLabel: true
+    },
+    xAxis: [
+      {
+        type: 'category',
+        name: '考点',
+        data: barUnusual,
+        axisTick: {
+          alignWithLabel: true
+        },
+      }
+    ],
+    yAxis: [
+      {
+        type: 'value',
+        name: '人数(%)',
+        nameTextStyle: {
+          fontSize: 14
+        }
+      }
+    ],
+    series: [
+      {
+        type: 'bar',
+        barWidth: '27px',
+        label: {
+          show: true,
+          position: 'top',
+          color: '#000',
+          fontSize: 14
+        },
+        itemStyle:{
+          color:'#6897FF',
+          borderRadius: [16, 16, 0, 0]
+        },
+        data: barUnData
+      }
+    ]
+  });
+}
+function switchSub(item) {
+  cur_sub = item;
+  if(item.id === '1') {
+    nextTick(()=>{
+      initChart();
+    })
+
+  } else {
+    nextTick(()=>{
+      initUnChart();
+    })
+
+  }
+
+}
+onMounted(() => {
+  if (route.params.ykj_id) {
+    ykj_id = route.params.ykj_id;
+    getData();
+    getFilterData();
+  }
+})
+
+</script>
+<route lang="json">
+{
+"meta":{
+"title":"扫描批阅进度",
+"breadcrumb":true
+}
+}
+</route>
+<template>
+  <NavHeader/>
+  <bread-crumb/>
+  <div class="w-1200px m-auto">
+    <div class="relative -mt-40px flex justify-end">
+      <button type="button" class="back-btn" @click="linkTo({name:'process'})">返回</button>
+    </div>
+    <div class="mt-10px w-full bg-hex-fff py-20px px-15px">
+      <h3 class="mb-20px text-16px text-center">{{ykj_name}}</h3>
+      <ul class="tab-nav m-auto">
+        <li @click="linkTo({name:'process-smpyjd-ykj_id',params:{ykj_id:ykj_id}})">科目扫描进度</li>
+        <li class="selected">考点扫描进度</li>
+        <li @click="linkTo({name:'process-pyjd-ykj_id',params:{ykj_id:ykj_id}})">批阅进度</li>
+      </ul>
+      <div class="mt-30px flex items-center justify-between">
+        <div>
+          <el-select v-model="subject_id" placeholder="全部科目" size="large" @change="getData">
+            <el-option label="全部" value=""
+            />
+            <el-option
+              v-for="item in subject_list"
+              :key="item.subject_id"
+              :label="item.subject_name"
+              :value="item.subject_id"
+            />
+          </el-select>
+          <el-select class="ml-20px" v-model="sm_id" placeholder="全部学校" size="large" @change="getData">
+            <el-option label="全部" value=""
+            />
+            <el-option
+              v-for="item in school_list"
+              :key="item.sm_id"
+              :label="item.sm_name"
+              :value="item.sm_id"
+            />
+          </el-select>
+        </div>
+        <ul class="sub-nav">
+          <li v-for="item in sub_nav" :class="item.id === cur_sub.id?'selected':''" @click="switchSub(item)">{{item.name}}</li>
+        </ul>
+      </div>
+      <div v-if="cur_sub.id === '1'">
+        <div id="barBox" style="height: 500px"></div>
+        <table class="mt-20px data-table" cellpadding="0" cellspacing="0">
+          <tr>
+            <th>考点</th>
+            <th>扫描<br>进度</th>
+            <th>学生数</th>
+            <th>扫描数</th>
+            <th>缺考数</th>
+            <th>学号<br>异常数</th>
+            <th>页码<br>异常数</th>
+            <th>缺考<br>异常数</th>
+            <th>客观题<br>异常数</th>
+            <th>选择题<br>异常数</th>
+            <th>判断题<br>异常数</th>
+            <th>填空题<br>异常数</th>
+            <th>操作</th>
+          </tr>
+          <tr v-for="item in tableData">
+            <td>{{item.ze_xueke_name}}</td>
+            <td>{{item.scan_percent}}</td>
+            <td>{{item.student_num}}</td>
+            <td>{{item.scan_num}}</td>
+            <td>{{item.qks}}</td>
+            <td>{{item.xhycs}}</td>
+            <td>{{item.ymycs}}</td>
+            <td>{{item.qkycs}}</td>
+            <td>{{item.kgtycs}}</td>
+            <td>{{item.xztycs}}</td>
+            <td>{{item.pdtycs}}</td>
+            <td>{{item.tktycs}}</td>
+            <td>
+              <button type="button" class="op-btn">查看详情</button>
+            </td>
+          </tr>
+        </table>
+      </div>
+      <div v-else>
+        <div id="unBox" style="height: 500px"></div>
+      </div>
+    </div>
+
+  </div>
+
+</template>
+
+<style scoped lang="scss">
+$color: #0048e5;
+.tab-nav{
+  width: 457px;
+  background: #ffffff;
+  border: 1px solid #dbe7ec;
+  border-radius: 6px;
+  display: flex;
+  align-items: center;
+  padding: 6px 9px;
+  li{
+    width: 140px;
+    height: 28px;
+    border-radius: 4px;
+    font-size: 16px;
+    color: #666;
+    text-align: center;
+    line-height: 28px;
+    cursor: pointer;
+    &+li{
+      margin-left: 10px;
+    }
+    &.selected{
+      background: #e2eaf9;
+      color: #000;
+    }
+  }
+}
+.data-table {
+  width: 100%;
+  table-layout: fixed;
+
+  tr:nth-child(even) {
+    background: #F1F7FF;
+  }
+
+  th {
+    height: 74px;
+    background: $color;
+    font-weight: normal;
+    text-align: center;
+    font-size: 16px;
+    color: #fff;
+    &:first-child{
+      border-radius: 6px 0 0 0;
+    }
+    &:last-child{
+      border-radius: 0 6px 0 0;
+    }
+  }
+
+  td {
+    padding: 15px 0;
+    font-size: 16px;
+    color: #474747;
+    text-align: center;
+  }
+}
+
+.no-data {
+  width: 100%;
+  height: 450px;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+
+  .no-data-img {
+    width: 233px;
+    height: 199px;
+    background: url("/images/no-data.png") center no-repeat;
+  }
+}
+.op-btn {
+  width: 82px;
+  height: 30px;
+  background: #fff;
+  border: 1px solid #003eee;
+  border-radius: 2px;
+  font-size: 14px;
+  color: #003eee;
+  text-align: center;
+  &:disabled{
+    background: #ccc;
+    border-color: #ccc;
+    color: #fff;
+    pointer-events: none;
+  }
+}
+.sub-nav{
+  width: 280px;
+  height: 30px;
+  display: flex;
+  li{
+    width: 50%;
+    background: #ffffff;
+    font-size: 16px;
+    color: #000;
+    border: 1px solid #dbe7ec;
+    line-height: 28px;
+    text-align: center;
+    cursor: pointer;
+    &.selected{
+      border-radius: 4px!important;
+      background:#003eee;
+      border-color: #003eee;
+      color: #fff;
+    }
+    &:first-child{
+      border-right: 0;
+      border-radius: 4px 0 0 4px;
+    }
+    &:last-child{
+      border-left: 0;
+      border-radius: 0 4px 4px 0;
+    }
+  }
+}
+</style>

+ 178 - 0
src/pages/process/kdsmjd/detail/[id].vue

@@ -0,0 +1,178 @@
+<script setup>
+import request from "~/utils/request";
+import {REQUEST} from "~/utils/request";
+import {user} from "~/store";
+import {useRouter} from "vue-router";
+const router = useRouter();
+const route = useRoute();
+const linkTo = (name) => {
+  router.push({name});
+};
+let type_list = $ref([{
+  id:'1',
+  name:'缺考'
+},{
+  id:'2',
+  name:'学号异常'
+},{
+  id:'3',
+  name:'页码异常',
+},{
+  id:'4',
+  name:'缺考异常'
+},{
+  id:'5',
+  name:'客观题异常'
+},{
+  id:'6',
+  name:'选择题异常'
+},{
+  id:'7',
+  name:'判断题异常'
+},{
+  id:'8',
+  name:'填空题异常'
+}])
+let cur_type = $ref({
+  id:'1',
+  name:'缺考'
+})
+function switchType(item) {
+  cur_type = item;
+}
+function getListData() {
+
+}
+let limit = $ref(10);
+let total = $ref(0);
+let cur_page = $ref(1);
+const handleSelectionChange = (val) => {
+  cur_page = val;
+  getListData();
+};
+</script>
+<route lang="json">
+{
+"meta":{
+"title":"科目扫描进度详情",
+"breadcrumb":true
+}
+}
+</route>
+<template>
+  <NavHeader/>
+  <bread-crumb/>
+  <div class="w-1200px m-auto">
+    <div class="relative -mt-40px flex justify-end">
+      <button type="button" class="back-btn" @click="linkTo('process')">返回</button>
+    </div>
+    <div class="mt-10px w-full bg-hex-fff py-20px px-15px">
+      <h3 class="mb-45px text-18px text-center">语文</h3>
+      <ul class="type-list">
+        <li v-for="item in type_list" :class="item.id === cur_type.id?'selected':''" @click="switchType(item)">
+          {{item.name}}
+          <span></span>
+        </li>
+      </ul>
+      <ul class="mt-10px stu-list">
+        <li>
+          <h3 class="text-16px">蒙阴市中小学</h3>
+          <h3 class="text-16px mt-8px">第一考场</h3>
+          <h3 class="text-16px mt-8px">1392384789&nbsp;&nbsp;张大大</h3>
+        </li>
+        <li>
+          <h3 class="text-16px">蒙阴市中小学</h3>
+          <h3 class="text-16px mt-8px">第一考场</h3>
+          <h3 class="text-16px mt-8px">1392384789&nbsp;&nbsp;张大大</h3>
+        </li>
+        <li>
+          <h3 class="text-16px">蒙阴市中小学</h3>
+          <h3 class="text-16px mt-8px">第一考场</h3>
+          <h3 class="text-16px mt-8px">1392384789&nbsp;&nbsp;张大大</h3>
+        </li>
+        <li>
+          <h3 class="text-16px">蒙阴市中小学</h3>
+          <h3 class="text-16px mt-8px">第一考场</h3>
+          <h3 class="text-16px mt-8px">1392384789&nbsp;&nbsp;张大大</h3>
+        </li>
+        <li>
+          <h3 class="text-16px">蒙阴市中小学</h3>
+          <h3 class="text-16px mt-8px">第一考场</h3>
+          <h3 class="text-16px mt-8px">1392384789&nbsp;&nbsp;张大大</h3>
+        </li>
+        <li>
+          <h3 class="text-16px">蒙阴市中小学</h3>
+          <h3 class="text-16px mt-8px">第一考场</h3>
+          <h3 class="text-16px mt-8px">1392384789&nbsp;&nbsp;张大大</h3>
+        </li>
+        <li>
+          <h3 class="text-16px">蒙阴市中小学</h3>
+          <h3 class="text-16px mt-8px">第一考场</h3>
+          <h3 class="text-16px mt-8px">1392384789&nbsp;&nbsp;张大大</h3>
+        </li>
+      </ul>
+      <div class="mt-20px page-new flex justify-end">
+        <el-pagination v-model:current-page="cur_page" v-model:page-size="limit" layout="total,prev, pager, next"
+                       :total="total" :background="true" @current-change="handleSelectionChange"></el-pagination>
+      </div>
+    </div>
+  </div>
+</template>
+
+<style scoped lang="scss">
+$color: #0048e5;
+::v-deep .el-pagination.is-background .btn-next.is-active,
+::v-deep .el-pagination.is-background .btn-prev.is-active,
+::v-deep .el-pagination.is-background .el-pager li.is-active {
+  background-color: $color;
+}
+.type-list{
+  width: 100%;
+  border-bottom: 1px solid #D4E1FF;
+  display: flex;
+  align-items: center;
+  padding-left: 10px;
+  li{
+    position: relative;
+    width: 100px;
+    font-size: 16px;
+    color: #595959;
+    padding-bottom: 15px;
+    text-align: center;
+    cursor: pointer;
+    &+li{
+      margin-left: 25px;
+    }
+    &.selected{
+      font-size: 18px;
+      color: #0148E5;
+      span{
+        display: block;
+      }
+    }
+    span{
+      display: none;
+      position: absolute;
+      left: 0;
+      bottom: 0;
+      width: 100%;
+      height: 4px;
+      background: #0148e5;
+      border-radius: 2px;
+    }
+  }
+}
+.stu-list{
+  width: 100%;
+  display: flex;
+  flex-wrap: wrap;
+  li{
+    width: 237px;
+    background: #f1f7ff;
+    border-radius: 40px;
+    margin: 35px 0 0 35px;
+    padding: 20px 0;
+    text-align: center;
+  }
+}
+</style>

+ 2 - 2
src/pages/process/paper-scan/[id].vue

@@ -97,8 +97,8 @@ import {useRouter} from "vue-router";
 
 const router = useRouter();
 const route = useRoute();
-const linkTo = () => {
-  window.location.href = window.GLOBAL_CONFIG.web_pc + '/webapps/page/marking-answer-sheet-liankao.html?ze_id=1018'
+const linkTo = (name) => {
+  router.push({name});
 };
 let sm_id = $ref('');
 let ykg_id = $ref('');

+ 430 - 0
src/pages/process/pyjd/[ykj_id].vue

@@ -0,0 +1,430 @@
+<script setup>
+import * as echarts from 'echarts'
+import request from "~/utils/request";
+import {REQUEST} from "~/utils/request";
+import {user} from "~/store";
+import {useRouter} from "vue-router";
+const router = useRouter();
+const route = useRoute();
+const linkTo = (obj) => {
+  router.push(obj);
+};
+let ykj_id = $ref('');
+let ykj_name = $ref('');
+let sm_id = $ref('');
+let subject_id = $ref('')
+let school_list = $ref([])
+let subject_list = $ref([])
+let tableData = $ref([])
+let barSubject = $ref([]);
+let barPercent = $ref([]);
+let barUnusual = $ref(['缺考','学号异常','页码异常','缺考异常','客观题异常','选择题异常','判断题异常','填空题异常']);
+let barUnData = $ref([40,70,100,70,70,70,80,90])
+let sub_nav = [{
+  id:'1',
+  name:'教师批阅情况'
+},{
+  id:'2',
+  name:'科目批阅进度总览'
+}]
+let cur_sub = $ref({
+  id:'1',
+  name:'教师批阅情况'
+})
+function getFilterData() {
+  let data = {
+    ykj_id: ykj_id
+  };
+  request({
+    url: "/yzy/ksjh/detail",
+    data: data,
+  }).then((res) => {
+    if (res.code === '1') {
+      subject_list = res.data.one_info.ykj_kskm_ex;
+      school_list = res.data.one_info.ykj_lkxx_ex;
+    }
+  })
+}
+function getData() {
+  let data = {
+    ykj_id: ykj_id,
+    sm_id: sm_id,
+    subject_id: subject_id,
+  };
+  request({
+    url: "/yzy/scan/km",
+    data: data,
+  }).then((res) => {
+    if (res.code === '1') {
+      ykj_name = res.data.ksjh.ykj_ksrwmc;
+      tableData = res.data.list;
+      barSubject = [];
+      barPercent = [];
+      tableData.forEach(item =>{
+        barSubject.push(item.ze_xueke_name);
+        barPercent.push(item.scan_percent);
+      })
+      nextTick(()=>{
+        initChart();
+      })
+
+    }
+  })
+}
+function initChart() {
+  // 基于准备好的dom,初始化echarts实例
+  let myChart = echarts.init(document.getElementById('barBox'));
+  myChart.setOption({
+    tooltip: {
+      trigger: 'axis',
+      axisPointer: {
+        type: 'shadow'
+      }
+    },
+    grid: {
+      left: '3%',
+      right: '4%',
+      bottom: '3%',
+      containLabel: true
+    },
+    xAxis: [
+      {
+        type: 'category',
+        name: '教师',
+        data: barSubject,
+        axisTick: {
+          alignWithLabel: true
+        },
+      }
+    ],
+    yAxis: [
+      {
+        type: 'value',
+        name: '扫描进度(%)',
+        nameTextStyle: {
+          fontSize: 14
+        }
+      }
+    ],
+    series: [
+      {
+        type: 'bar',
+        barWidth: '27px',
+        label: {
+          show: true,
+          position: 'top',
+          color: '#000',
+          fontSize: 14
+        },
+        itemStyle:{
+          color:'#6897FF',
+          borderRadius: [16, 16, 0, 0]
+        },
+        data: barPercent
+      }
+    ]
+  });
+}
+function initUnChart() {
+  // 绘制图表
+  let myChart_u = echarts.init(document.getElementById('unBox'));
+  myChart_u.setOption({
+    tooltip: {
+      trigger: 'axis',
+      axisPointer: {
+        type: 'shadow'
+      }
+    },
+    grid: {
+      left: '3%',
+      right: '4%',
+      bottom: '3%',
+      containLabel: true
+    },
+    xAxis: [
+      {
+        type: 'category',
+        name: '学科',
+        data: barSubject,
+        axisTick: {
+          alignWithLabel: true
+        },
+      }
+    ],
+    yAxis: [
+      {
+        type: 'value',
+        name: '批阅进度(%)',
+        nameTextStyle: {
+          fontSize: 14
+        }
+      }
+    ],
+    series: [
+      {
+        type: 'bar',
+        barWidth: '27px',
+        label: {
+          show: true,
+          position: 'top',
+          color: '#000',
+          fontSize: 14
+        },
+        itemStyle:{
+          color:'#6897FF',
+          borderRadius: [16, 16, 0, 0]
+        },
+        data: barUnData
+      }
+    ]
+  });
+}
+function switchSub(item) {
+  cur_sub = item;
+  if(item.id === '1') {
+    nextTick(()=>{
+      initChart();
+    })
+
+  } else {
+    nextTick(()=>{
+      initUnChart();
+    })
+
+  }
+
+}
+onMounted(() => {
+  if (route.params.ykj_id) {
+    ykj_id = route.params.ykj_id;
+    getData();
+    getFilterData();
+  }
+})
+
+</script>
+<route lang="json">
+{
+"meta":{
+"title":"扫描批阅进度",
+"breadcrumb":true
+}
+}
+</route>
+<template>
+  <NavHeader/>
+  <bread-crumb/>
+  <div class="w-1200px m-auto">
+    <div class="relative -mt-40px flex justify-end">
+      <button type="button" class="back-btn" @click="linkTo({name:'process'})">返回</button>
+    </div>
+    <div class="mt-10px w-full bg-hex-fff py-20px px-15px">
+      <h3 class="mb-20px text-16px text-center">{{ykj_name}}</h3>
+      <ul class="tab-nav m-auto">
+        <li @click="linkTo({name:'process-smpyjd-ykj_id',params:{ykj_id:ykj_id}})">科目扫描进度</li>
+        <li @click="linkTo({name:'process-kdsmjd-ykj_id',params:{ykj_id:ykj_id}})">考点扫描进度</li>
+        <li class="selected">批阅进度</li>
+      </ul>
+      <div class="mt-30px flex items-center justify-between">
+        <div>
+          <el-select v-model="subject_id" placeholder="全部科目" size="large" @change="getData">
+            <el-option label="全部" value=""
+            />
+            <el-option
+              v-for="item in subject_list"
+              :key="item.subject_id"
+              :label="item.subject_name"
+              :value="item.subject_id"
+            />
+          </el-select>
+          <el-select class="ml-20px" v-model="sm_id" placeholder="全部学校" size="large" @change="getData">
+            <el-option label="全部" value=""
+            />
+            <el-option
+              v-for="item in school_list"
+              :key="item.sm_id"
+              :label="item.sm_name"
+              :value="item.sm_id"
+            />
+          </el-select>
+        </div>
+        <ul class="sub-nav">
+          <li v-for="item in sub_nav" :class="item.id === cur_sub.id?'selected':''" @click="switchSub(item)">{{item.name}}</li>
+        </ul>
+      </div>
+      <div v-if="cur_sub.id === '1'">
+        <div id="barBox" style="height: 500px"></div>
+        <table class="mt-20px data-table" cellpadding="0" cellspacing="0">
+          <tr>
+            <th>教师</th>
+            <th>进度</th>
+            <th>完成量</th>
+            <th>总份数</th>
+            <th>平均分</th>
+            <th>操作</th>
+          </tr>
+          <tr v-for="item in tableData">
+            <td>{{item.ze_xueke_name}}</td>
+            <td>{{item.scan_percent}}</td>
+            <td>{{item.student_num}}</td>
+            <td>{{item.scan_num}}</td>
+            <td>{{item.qks}}</td>
+            <td>
+              <button type="button" class="op-btn">查看详情</button>
+            </td>
+          </tr>
+        </table>
+      </div>
+      <div v-else>
+        <div id="unBox" style="height: 500px"></div>
+        <table class="mt-20px data-table" cellpadding="0" cellspacing="0">
+          <tr>
+            <th>学科</th>
+            <th>批阅进度</th>
+            <th>总份数</th>
+            <th>完成量</th>
+            <th>标记<br>异常数</th>
+            <th>平均分</th>
+            <th>满分</th>
+            <th>在线人数</th>
+            <th>操作</th>
+          </tr>
+          <tr v-for="item in tableData">
+            <td>{{item.ze_xueke_name}}</td>
+            <td>{{item.scan_percent}}</td>
+            <td>{{item.student_num}}</td>
+            <td>{{item.scan_num}}</td>
+            <td>{{item.qks}}</td>
+            <td>{{item.xhycs}}</td>
+            <td>{{item.ymycs}}</td>
+            <td>{{item.qkycs}}</td>
+            <td>
+              <button type="button" class="op-btn">查看详情</button>
+            </td>
+          </tr>
+        </table>
+      </div>
+    </div>
+
+  </div>
+
+</template>
+
+<style scoped lang="scss">
+$color: #0048e5;
+.tab-nav{
+  width: 457px;
+  background: #ffffff;
+  border: 1px solid #dbe7ec;
+  border-radius: 6px;
+  display: flex;
+  align-items: center;
+  padding: 6px 9px;
+  li{
+    width: 140px;
+    height: 28px;
+    border-radius: 4px;
+    font-size: 16px;
+    color: #666;
+    text-align: center;
+    line-height: 28px;
+    cursor: pointer;
+    &+li{
+      margin-left: 10px;
+    }
+    &.selected{
+      background: #e2eaf9;
+      color: #000;
+    }
+  }
+}
+.data-table {
+  width: 100%;
+  table-layout: fixed;
+
+  tr:nth-child(even) {
+    background: #F1F7FF;
+  }
+
+  th {
+    height: 74px;
+    background: $color;
+    font-weight: normal;
+    text-align: center;
+    font-size: 16px;
+    color: #fff;
+    &:first-child{
+      border-radius: 6px 0 0 0;
+    }
+    &:last-child{
+      border-radius: 0 6px 0 0;
+    }
+  }
+
+  td {
+    padding: 15px 0;
+    font-size: 16px;
+    color: #474747;
+    text-align: center;
+  }
+}
+
+.no-data {
+  width: 100%;
+  height: 450px;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+
+  .no-data-img {
+    width: 233px;
+    height: 199px;
+    background: url("/images/no-data.png") center no-repeat;
+  }
+}
+.op-btn {
+  width: 82px;
+  height: 30px;
+  background: #fff;
+  border: 1px solid #003eee;
+  border-radius: 2px;
+  font-size: 14px;
+  color: #003eee;
+  text-align: center;
+  &:disabled{
+    background: #ccc;
+    border-color: #ccc;
+    color: #fff;
+    pointer-events: none;
+  }
+}
+.sub-nav{
+  width: 280px;
+  height: 30px;
+  display: flex;
+  li{
+    width: 50%;
+    background: #ffffff;
+    font-size: 16px;
+    color: #000;
+    border: 1px solid #dbe7ec;
+    line-height: 28px;
+    text-align: center;
+    cursor: pointer;
+    &.selected{
+      border-radius: 4px!important;
+      background:#003eee;
+      border-color: #003eee;
+      color: #fff;
+    }
+    &:first-child{
+      border-right: 0;
+      border-radius: 4px 0 0 4px;
+    }
+    &:last-child{
+      border-left: 0;
+      border-radius: 0 4px 4px 0;
+    }
+  }
+}
+</style>

+ 298 - 0
src/pages/process/smpyjd/[ykj_id].vue

@@ -0,0 +1,298 @@
+<script setup>
+import * as echarts from 'echarts'
+import request from "~/utils/request";
+import {REQUEST} from "~/utils/request";
+import {user} from "~/store";
+import {useRouter} from "vue-router";
+const router = useRouter();
+const route = useRoute();
+const linkTo = (obj) => {
+  router.push(obj);
+};
+let ykj_id = $ref('');
+let ykj_name = $ref('');
+let sm_id = $ref('');
+let subject_id = $ref('')
+let school_list = $ref([])
+let subject_list = $ref([])
+let tableData = $ref([])
+let barSubject = $ref([]);
+let barPercent = $ref([]);
+function getFilterData() {
+  let data = {
+    ykj_id: ykj_id
+  };
+  request({
+    url: "/yzy/ksjh/detail",
+    data: data,
+  }).then((res) => {
+    if (res.code === '1') {
+      subject_list = res.data.one_info.ykj_kskm_ex;
+      school_list = res.data.one_info.ykj_lkxx_ex;
+    }
+  })
+}
+function getData() {
+  let data = {
+    ykj_id: ykj_id,
+    sm_id: sm_id,
+    subject_id: subject_id,
+  };
+  request({
+    url: "/yzy/scan/km",
+    data: data,
+  }).then((res) => {
+    if (res.code === '1') {
+     ykj_name = res.data.ksjh.ykj_ksrwmc;
+     tableData = res.data.list;
+     barSubject = [];
+     barPercent = [];
+     tableData.forEach(item =>{
+       barSubject.push(item.ze_xueke_name);
+       barPercent.push(item.scan_percent);
+     })
+      nextTick(()=>{
+        initChart();
+      })
+
+    }
+  })
+}
+function initChart() {
+  // 基于准备好的dom,初始化echarts实例
+  var myChart = echarts.init(document.getElementById('barBox'));
+// 绘制图表
+  myChart.setOption({
+    tooltip: {
+      trigger: 'axis',
+      axisPointer: {
+        type: 'shadow'
+      }
+    },
+    grid: {
+      left: '3%',
+      right: '4%',
+      bottom: '3%',
+      containLabel: true
+    },
+    xAxis: [
+      {
+        type: 'category',
+        name: '学科',
+        data: barSubject,
+        axisTick: {
+          alignWithLabel: true
+        },
+      }
+    ],
+    yAxis: [
+      {
+        type: 'value',
+        name: '扫描进度(%)',
+        nameTextStyle: {
+          fontSize: 14
+        }
+      }
+    ],
+    series: [
+      {
+        type: 'bar',
+        barWidth: '27px',
+        label: {
+          show: true,
+          position: 'top',
+          color: '#000',
+          fontSize: 14
+        },
+        itemStyle:{
+          color:'#6897FF',
+          borderRadius: [16, 16, 0, 0]
+        },
+        data: barPercent
+      }
+    ]
+  });
+}
+onMounted(() => {
+  if (route.params.ykj_id) {
+    ykj_id = route.params.ykj_id;
+    getData();
+    getFilterData();
+  }
+})
+
+</script>
+<route lang="json">
+{
+"meta":{
+"title":"扫描批阅进度",
+"breadcrumb":true
+}
+}
+</route>
+<template>
+  <NavHeader/>
+  <bread-crumb/>
+  <div class="w-1200px m-auto">
+    <div class="relative -mt-40px flex justify-end">
+      <button type="button" class="back-btn" @click="linkTo({name:'process'})">返回</button>
+    </div>
+    <div class="mt-10px w-full bg-hex-fff py-20px px-15px">
+      <h3 class="mb-20px text-16px text-center">{{ykj_name}}</h3>
+      <ul class="tab-nav m-auto">
+        <li class="selected">科目扫描进度</li>
+        <li @click="linkTo({name:'process-kdsmjd-ykj_id',params:{ykj_id:ykj_id}})">考点扫描进度</li>
+        <li @click="linkTo({name:'process-pyjd-ykj_id',params:{ykj_id:ykj_id}})">批阅进度</li>
+      </ul>
+      <div class="mt-30px flex items-center">
+        <el-select v-model="subject_id" placeholder="全部科目" size="large" @change="getData">
+          <el-option label="全部" value=""
+          />
+          <el-option
+            v-for="item in subject_list"
+            :key="item.subject_id"
+            :label="item.subject_name"
+            :value="item.subject_id"
+          />
+        </el-select>
+        <el-select class="ml-20px" v-model="sm_id" placeholder="全部学校" size="large" @change="getData">
+          <el-option label="全部" value=""
+          />
+          <el-option
+            v-for="item in school_list"
+            :key="item.sm_id"
+            :label="item.sm_name"
+            :value="item.sm_id"
+          />
+        </el-select>
+      </div>
+      <div id="barBox" style="height: 500px"></div>
+      <table class="mt-20px data-table" cellpadding="0" cellspacing="0">
+        <tr>
+          <th>科目</th>
+          <th>扫描<br>进度</th>
+          <th>学生数</th>
+          <th>扫描数</th>
+          <th>缺考数</th>
+          <th>学号<br>异常数</th>
+          <th>页码<br>异常数</th>
+          <th>缺考<br>异常数</th>
+          <th>客观题<br>异常数</th>
+          <th>选择题<br>异常数</th>
+          <th>判断题<br>异常数</th>
+          <th>填空题<br>异常数</th>
+          <th>操作</th>
+        </tr>
+        <tr v-for="item in tableData">
+          <td>{{item.ze_xueke_name}}</td>
+          <td>{{item.scan_percent}}</td>
+          <td>{{item.student_num}}</td>
+          <td>{{item.scan_num}}</td>
+          <td>{{item.qks}}</td>
+          <td>{{item.xhycs}}</td>
+          <td>{{item.ymycs}}</td>
+          <td>{{item.qkycs}}</td>
+          <td>{{item.kgtycs}}</td>
+          <td>{{item.xztycs}}</td>
+          <td>{{item.pdtycs}}</td>
+          <td>{{item.tktycs}}</td>
+          <td>
+            <button type="button" class="op-btn" @click="linkTo({name:'process-smpyjd-detail-ykj_id-ze_id',params:{ze_id:item.ze_id,ykj_id:ykj_id}})">查看详情</button>
+          </td>
+        </tr>
+      </table>
+    </div>
+
+  </div>
+
+</template>
+
+<style scoped lang="scss">
+$color: #0048e5;
+.tab-nav{
+  width: 457px;
+  background: #ffffff;
+  border: 1px solid #dbe7ec;
+  border-radius: 6px;
+  display: flex;
+  align-items: center;
+  padding: 6px 9px;
+  li{
+    width: 140px;
+    height: 28px;
+    border-radius: 4px;
+    font-size: 16px;
+    color: #666;
+    text-align: center;
+    line-height: 28px;
+    cursor: pointer;
+    &+li{
+      margin-left: 10px;
+    }
+    &.selected{
+      background: #e2eaf9;
+      color: #000;
+    }
+  }
+}
+.data-table {
+  width: 100%;
+  table-layout: fixed;
+
+  tr:nth-child(even) {
+    background: #F1F7FF;
+  }
+
+  th {
+    height: 74px;
+    background: $color;
+    font-weight: normal;
+    text-align: center;
+    font-size: 16px;
+    color: #fff;
+    &:first-child{
+      border-radius: 6px 0 0 0;
+    }
+    &:last-child{
+      border-radius: 0 6px 0 0;
+    }
+  }
+
+  td {
+    padding: 15px 0;
+    font-size: 16px;
+    color: #474747;
+    text-align: center;
+  }
+}
+
+.no-data {
+  width: 100%;
+  height: 450px;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+
+  .no-data-img {
+    width: 233px;
+    height: 199px;
+    background: url("/images/no-data.png") center no-repeat;
+  }
+}
+.op-btn {
+  width: 82px;
+  height: 30px;
+  background: #fff;
+  border: 1px solid #003eee;
+  border-radius: 2px;
+  font-size: 14px;
+  color: #003eee;
+  text-align: center;
+  &:disabled{
+    background: #ccc;
+    border-color: #ccc;
+    color: #fff;
+    pointer-events: none;
+  }
+}
+</style>

+ 199 - 0
src/pages/process/smpyjd/detail/[ykj_id]/[ze_id].vue

@@ -0,0 +1,199 @@
+<script setup>
+import request from "~/utils/request";
+import {REQUEST} from "~/utils/request";
+import {user} from "~/store";
+import {useRouter} from "vue-router";
+const router = useRouter();
+const route = useRoute();
+const linkTo = (obj) => {
+  router.push(obj);
+};
+let type_list = $ref([{
+  id:'qks',
+  name:'缺考'
+},{
+  id:'xhycs',
+  name:'学号异常'
+},{
+  id:'ymycs',
+  name:'页码异常',
+},{
+  id:'qkycs',
+  name:'缺考异常'
+},{
+  id:'kgtycs',
+  name:'客观题异常'
+},{
+  id:'xztycs',
+  name:'选择题异常'
+},{
+  id:'pdtycs',
+  name:'判断题异常'
+},{
+  id:'tktycs',
+  name:'填空题异常'
+}])
+let cur_type = $ref({
+  id:'qks',
+  name:'缺考'
+})
+let ze_id = $ref('')
+let ykj_id = $ref('')
+let limit = $ref(10);
+let total = $ref(0);
+let cur_page = $ref(1);
+let listData = $ref([]);
+let fullscreenLoading = $ref(false);
+function switchType(item) {
+  cur_type = item;
+  cur_page = 1;
+  getListData();
+}
+function getListData() {
+  fullscreenLoading = true;
+  let data = {
+    ze_id:ze_id,
+    page: cur_page,
+    limit: limit,
+    tab:cur_type.id
+  };
+  request({
+    url: "/yzy/scan/km_detail",
+    data: data,
+  }).then((res) => {
+    fullscreenLoading = false;
+    if (res.code === '1') {
+      listData = res.data.page_data;
+      total = Number(res.data.total_rows);
+      cur_page = Number(res.data.page_now);
+    }
+  })
+}
+const handleSelectionChange = (val) => {
+  cur_page = val;
+  getListData();
+};
+if (route.params.ze_id) {
+  ze_id = route.params.ze_id;
+  ykj_id = route.params.ykj_id;
+  getListData();
+}
+</script>
+<route lang="json">
+{
+"meta":{
+"title":"科目扫描进度详情",
+"breadcrumb":true
+}
+}
+</route>
+<template>
+  <NavHeader/>
+  <bread-crumb/>
+  <div class="w-1200px m-auto" v-loading.fullscreen.lock="fullscreenLoading">
+    <div class="relative -mt-40px flex justify-end">
+      <button type="button" class="back-btn" @click="linkTo({name:'process-smpyjd-ykj_id',params:{ykj_id:ykj_id}})">返回</button>
+    </div>
+    <div class="mt-10px w-full bg-hex-fff py-20px px-15px">
+      <h3 class="mb-45px text-18px text-center">语文</h3>
+      <ul class="type-list">
+        <li v-for="item in type_list" :class="item.id === cur_type.id?'selected':''" @click="switchType(item)">
+          {{item.name}}
+          <span></span>
+        </li>
+      </ul>
+      <div v-if="listData.length > 0">
+        <ul class="mt-10px stu-list min-h-400px">
+          <li v-for="item in listData">
+            <h3 class="text-16px">{{item.sm_name}}</h3>
+            <h3 class="text-16px mt-8px">{{item.ykg_name}}</h3>
+            <h3 class="text-16px mt-8px">{{item.student_no}}&nbsp;&nbsp;{{item.user_realname}}</h3>
+          </li>
+        </ul>
+        <div class="mt-20px page-new flex justify-end">
+          <el-pagination v-model:current-page="cur_page" v-model:page-size="limit" layout="total,prev, pager, next"
+                         :total="total" :background="true" @current-change="handleSelectionChange"></el-pagination>
+        </div>
+      </div>
+      <div v-else class="no-data">
+        <div>
+          <h3 class="no-data-img"></h3>
+          <h4 class="mt-25px text-18px text-hex-0048e5 text-center">暂无数据</h4>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<style scoped lang="scss">
+$color: #0048e5;
+::v-deep .el-pagination.is-background .btn-next.is-active,
+::v-deep .el-pagination.is-background .btn-prev.is-active,
+::v-deep .el-pagination.is-background .el-pager li.is-active {
+  background-color: $color;
+}
+.type-list{
+  width: 100%;
+  border-bottom: 1px solid #D4E1FF;
+  display: flex;
+  align-items: center;
+  padding-left: 10px;
+  li{
+    position: relative;
+    width: 100px;
+    font-size: 16px;
+    color: #595959;
+    padding-bottom: 15px;
+    text-align: center;
+    cursor: pointer;
+    &+li{
+      margin-left: 25px;
+    }
+    &.selected{
+      font-size: 18px;
+      color: #0148E5;
+      span{
+        display: block;
+      }
+    }
+    span{
+      display: none;
+      position: absolute;
+      left: 0;
+      bottom: 0;
+      width: 100%;
+      height: 4px;
+      background: #0148e5;
+      border-radius: 2px;
+    }
+  }
+}
+.stu-list{
+  width: 100%;
+  display: flex;
+  flex-wrap: wrap;
+  align-items:flex-start;
+  li{
+    width: 237px;
+    height: auto;
+    background: #f1f7ff;
+    border-radius: 40px;
+    margin: 35px 0 0 35px;
+    padding: 20px 0;
+    text-align: center;
+  }
+}
+.no-data {
+  width: 100%;
+  height: 450px;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+
+  .no-data-img {
+    width: 233px;
+    height: 199px;
+    background: url("/images/no-data.png") center no-repeat;
+  }
+}
+</style>

+ 245 - 0
src/pages/process/xgcj/[id].vue

@@ -0,0 +1,245 @@
+<template>
+  <NavHeader/>
+  <bread-crumb/>
+  <div class="w-1200px m-auto">
+    <div class="relative -mt-40px flex justify-end">
+      <button type="button" class="back-btn" @click="linkTo('process')">返回</button>
+    </div>
+    <div class="mt-10px w-full bg-hex-fff py-20px px-15px">
+      <div class="flex items-center">
+        <el-select v-model="sm_id" placeholder="全部学校" size="large" @change="filterSchool">
+          <el-option label="全部" value=""
+          />
+          <el-option
+            v-for="item in school_list"
+            :key="item.sm_id"
+            :label="item.sm_name"
+            :value="item.sm_id"
+          />
+        </el-select>
+        <el-select class="ml-20px" v-model="cm_id" :disabled="sm_id === ''" placeholder="全部班级" size="large"
+                   @change="filterData">
+          <el-option label="全部" value=""
+          />
+          <el-option
+            v-for="item in classes_list"
+            :key="item.cm_id"
+            :label="item.cm_name"
+            :value="item.cm_id"
+          />
+        </el-select>
+        <el-input
+          v-model="keyword"
+          class="ml-20px"
+          style="width: 200px;"
+          size="large"
+          @keyup.enter="filterData"
+          @clear="filterData"
+          clearable
+          placeholder="请输入关键字"
+        />
+        <el-button color="#003eee" class="ml-20px" type="primary" size="large" @click="filterData">搜索</el-button>
+      </div>
+      <div v-if="tableData.length > 0">
+        <table class="mt-20px data-table" cellpadding="0" cellspacing="0">
+          <tr>
+            <th>学校</th>
+            <th>班级</th>
+            <th>学号</th>
+            <th>姓名</th>
+            <th>成绩</th>
+            <th>主观题得分</th>
+            <th>客观题得分</th>
+            <th>操作</th>
+          </tr>
+          <tr v-for="item in tableData">
+            <td>{{ item.sm_name }}</td>
+            <td>{{item.cm_name}}</td>
+            <td>{{item.student_no}}</td>
+            <td>{{item.user_realname}}</td>
+            <td>{{item.ysk_cj}}</td>
+            <td>{{item.ysk_cj_zg}}</td>
+            <td>{{item.ysk_cj_kg}}</td>
+            <td>
+               <button type="button" class="op-btn" @click="toRevise(item)">修改成绩</button>
+            </td>
+          </tr>
+        </table>
+        <div class="mt-20px page-new flex justify-end">
+          <el-pagination v-model:current-page="cur_page" v-model:page-size="limit" layout="total,prev, pager, next"
+                         :total="total" :background="true" @current-change="handleSelectionChange"></el-pagination>
+        </div>
+      </div>
+      <div v-else class="no-data">
+        <div>
+          <h3 class="no-data-img"></h3>
+          <h4 class="mt-25px text-18px text-hex-0048e5 text-center">暂无数据</h4>
+        </div>
+      </div>
+    </div>
+
+  </div>
+
+  <commonFooter/>
+</template>
+<route lang="json">
+{
+"meta":{
+"title":"修改成绩",
+"breadcrumb":true
+}
+}
+</route>
+<script setup>
+import {useRouter} from "vue-router";
+import request from "~/utils/request";
+import {REQUEST} from "~/utils/request";
+import {user} from "~/store";
+
+const router = useRouter();
+const route = useRoute();
+const linkTo = (name) => {
+  router.push({name});
+};
+let ze_id = $ref('')
+let sm_id = $ref('');
+let cm_id = $ref('');
+let school_list = $ref([]);
+let classes_list = $ref([]);
+let keyword = $ref('');
+let tableData = $ref([]);
+let limit = $ref(10);
+let total = $ref(0);
+let cur_page = $ref(1);
+
+function getListData() {
+  let data = {
+    ze_id: ze_id,
+    sm_id: sm_id,
+    cm_id: cm_id,
+    keyword: keyword,
+    page: cur_page,
+    limit: limit,
+  };
+  request({
+    url: "/yzy/xsjjdtk/index",
+    data: data,
+  }).then((res) => {
+    if (res.code === '1') {
+      tableData = res.data.page_data;
+      total = Number(res.data.total_rows);
+      cur_page = Number(res.data.page_now);
+    }
+  })
+}
+
+function getSchool() {
+  let data = {
+    ze_id: ze_id
+  };
+  request({
+    url: "/yzy/xsjjdtk/school_class",
+    data: data,
+  }).then((res) => {
+    if (res.code === '1') {
+      school_list = res.data.list;
+    }
+  })
+}
+
+function filterData() {
+  cur_page = 1;
+  getListData();
+}
+
+function filterSchool() {
+  for (let i in school_list) {
+    if (school_list[i].sm_id === sm_id) {
+      classes_list = school_list[i].classes;
+    }
+  }
+  filterData();
+}
+function toRevise(item) {
+  router.push({name:'process-xgfs-ze_id-ysk_id',params:{ze_id:item.ze_id,ysk_id:item.ysk_id}});
+}
+const handleSelectionChange = (val) => {
+  cur_page = val;
+  getListData();
+};
+if (route.params.id) {
+  ze_id = route.params.id;
+  getListData();
+  getSchool();
+}
+</script>
+
+<style lang="scss" scoped>
+$color: #0048e5;
+::v-deep .el-pagination.is-background .btn-next.is-active,
+::v-deep .el-pagination.is-background .btn-prev.is-active,
+::v-deep .el-pagination.is-background .el-pager li.is-active {
+  background-color: $color;
+}
+
+.data-table {
+  width: 100%;
+  table-layout: fixed;
+
+  tr:nth-child(even) {
+    background: #F1F7FF;
+  }
+
+  th {
+    height: 74px;
+    background: $color;
+    font-weight: normal;
+    text-align: center;
+    font-size: 16px;
+    color: #fff;
+    &:first-child{
+      border-radius: 6px 0 0 0;
+    }
+    &:last-child{
+      border-radius: 0 6px 0 0;
+    }
+  }
+
+  td {
+    padding: 15px 0;
+    font-size: 16px;
+    color: #474747;
+    text-align: center;
+  }
+}
+
+.no-data {
+  width: 100%;
+  height: 450px;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+
+  .no-data-img {
+    width: 233px;
+    height: 199px;
+    background: url("/images/no-data.png") center no-repeat;
+  }
+}
+.op-btn {
+  width: 82px;
+  height: 30px;
+  background: #fff;
+  border: 1px solid #003eee;
+  border-radius: 2px;
+  font-size: 14px;
+  color: #003eee;
+  text-align: center;
+  &:disabled{
+    background: #ccc;
+    border-color: #ccc;
+    color: #fff;
+    pointer-events: none;
+  }
+}
+</style>

+ 258 - 0
src/pages/process/xgfs/[ze_id]/[ysk_id].vue

@@ -0,0 +1,258 @@
+<template>
+  <NavHeader/>
+  <div class="w-1200px m-auto pt-10px">
+    <div class="relative flex justify-end">
+      <button type="button" class="back-btn" @click="linkTo('process-xgcj-id')">返回</button>
+    </div>
+    <div class="mt-10px w-full bg-hex-fff py-20px px-15px">
+      <div class="flex justify-between">
+        <div class="w-375px">
+          <table class="data-table" cellpadding="0" cellspacing="0">
+            <tr>
+              <th>题目</th>
+              <th>满分</th>
+              <th>标注答案</th>
+              <th>得分</th>
+              <th>操作</th>
+            </tr>
+            <tr v-for="item in listData">
+              <td>{{item.ysdt_stsxbh}}</td>
+              <td>{{item.hq_score}}</td>
+              <td>{{item.hq_answer}}</td>
+              <td>{{item.ysdt_pydf}}</td>
+              <td>
+                <button type="button" class="op-btn" @click="reviseScore(item)">改分</button>
+              </td>
+            </tr>
+          </table>
+        </div>
+        <div class="w-780px">
+          <el-carousel class="w-full h-550px" :autoplay="false" arrow="always" indicator-position="none">
+            <el-carousel-item v-for="item in imgList" :key="item">
+              <img class="m-auto block" :src="item" alt="">
+            </el-carousel-item>
+          </el-carousel>
+        </div>
+      </div>
+    </div>
+  </div>
+  <commonFooter/>
+  <div class="revise-pop" v-if="reviseShow">
+    <div class="revise-box">
+      <h3 class="pop-title mb-50px">修改分数</h3>
+      <div class="flex items-center">
+        <div class="w-180px text-right text-16px">题目</div>
+        <div class="flex-1 ml-25px text-14px">{{reviseInfo.ysdt_stsxbh}}</div>
+      </div>
+      <div class="mt-40px flex items-center">
+        <div class="w-180px text-right text-16px">满分</div>
+        <div class="flex-1 ml-25px text-14px">{{reviseInfo.hq_score}}</div>
+      </div>
+      <div class="mt-40px flex items-center">
+        <div class="w-180px text-right text-16px">标准答案</div>
+        <div class="flex-1 ml-25px text-14px">{{reviseInfo.hq_answer}}</div>
+      </div>
+      <div class="mt-40px flex items-center">
+        <div class="w-180px text-right text-16px">得分</div>
+        <div class="flex-1 ml-25px">
+          <input type="text" class="revise-in" v-model="reviseInfo.ysdt_pydf">
+        </div>
+      </div>
+      <div class="mt-70px text-center">
+        <button type="button" class="revise-btn cancel" @click="reviseShow = false">取消</button>
+        <button type="button" :disabled="reviseInfo.ysdt_pydf === '' || isSub" class="ml-45px revise-btn sub" @click="reviseSub">确定</button>
+      </div>
+    </div>
+  </div>
+</template>
+<route lang="json">
+{
+"meta":{
+"title":"改分",
+"breadcrumb":true
+}
+}
+</route>
+<script setup>
+import {useRouter} from "vue-router";
+import request from "~/utils/request";
+import {REQUEST} from "~/utils/request";
+import {user} from "~/store";
+const router = useRouter();
+const route = useRoute();
+const linkTo = (name) => {
+  router.push({name:name,params:{id:ze_id}});
+};
+let ze_id = $ref('')
+let ysk_id = $ref('')
+let listData = $ref([])
+let imgList = $ref([])
+let reviseShow = $ref(false)
+let isSub = $ref(false)
+let reviseInfo = $ref({})
+function getCardDetail() {
+  let data = {
+    ysk_id:ysk_id,
+    limit:'999'
+  }
+  request({
+    url: "/yzy/xsdtdtqt/index",
+    data: data,
+  }).then((res) => {
+    if (res.code === '1') {
+      listData = res.data.page_data;
+      imgList = res.data.dtk_pic;
+    }
+  })
+}
+function reviseScore(item) {
+  reviseShow = true;
+  reviseInfo = item;
+}
+function reviseSub() {
+  if (!(/^\d+(\.\d{1,1})?$/).test(reviseInfo.ysdt_pydf)) {
+    ElMessage({
+      type: "warning",
+      message: "请输入正整数或仅带有一位小数的数字!",
+    });
+  } else {
+    isSub = true;
+    let params = {
+      issubmit:'1',
+      ysdt_id:reviseInfo.ysdt_id,
+      yzy_xsdtdtqt:{
+        ysdt_pydf:reviseInfo.ysdt_pydf
+      }
+    }
+    request({
+      url: "/yzy/xsdtdtqt/edit",
+      data: params,
+    }).then((res) => {
+      isSub = false;
+      if (res.code === '1') {
+        ElMessage({
+          type: "success",
+          message: "成绩修改成功!",
+        });
+        reviseShow = false;
+        getCardDetail();
+      }
+    })
+  }
+}
+if (route.params.ze_id) {
+  ze_id = route.params.ze_id;
+  ysk_id = route.params.ysk_id;
+  getCardDetail();
+}
+</script>
+
+<style lang="scss" scoped>
+$color: #0048e5;
+::v-deep .el-carousel__container{
+  height: 100%;
+}
+.data-table {
+  width: 100%;
+  table-layout: fixed;
+
+  tr:nth-child(even) {
+    background: #F1F7FF;
+  }
+
+  th {
+    height: 50px;
+    background: $color;
+    font-weight: normal;
+    text-align: center;
+    font-size: 14px;
+    color: #fff;
+    &:first-child{
+      border-radius: 6px 0 0 0;
+    }
+    &:last-child{
+      border-radius: 0 6px 0 0;
+    }
+  }
+
+  td {
+    padding: 15px 0;
+    font-size: 14px;
+    color: #333;
+    text-align: center;
+  }
+}
+.op-btn {
+  width: 50px;
+  height: 30px;
+  background: #fff;
+  border: 1px solid #003eee;
+  border-radius: 2px;
+  font-size: 14px;
+  color: #003eee;
+  text-align: center;
+  &:disabled{
+    background: #ccc;
+    border-color: #ccc;
+    color: #fff;
+    pointer-events: none;
+  }
+}
+.revise-pop{
+  position: fixed;
+  left: 0;
+  top: 0;
+  z-index: 2000;
+  width: 100%;
+  height: 100%;
+  background: rgba(0,0,0,.5);
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  .revise-box{
+    width: 519px;
+    height: 448px;
+    background: #ffffff;
+    border-radius: 6px;
+  }
+  .pop-title{
+    font-size: 16px;
+    border-bottom: 1px solid #F3F3F3;
+    line-height: 50px;
+    color: #333;
+    text-align: center;
+  }
+  .revise-in{
+    width: 224px;
+    height: 40px;
+    background: #fff;
+    border: 1px solid #dcdfe6;
+    outline: none;
+    border-radius: 4px;
+    padding-left: 15px;
+    font-size: 14px;
+    color: #333;
+  }
+  .revise-btn{
+    width: 100px;
+    height: 40px;
+    border-radius: 2px;
+    font-size: 14px;
+    text-align: center;
+    &:disabled{
+      background: #ccc!important;
+      color: #fff!important;
+      cursor: default;
+    }
+    &.cancel{
+      border: 1px solid #BFBFBF;
+      background: #fff;
+      color: #1C1C1C;
+    }
+    &.sub{
+      background: $color;
+      color: #fff;
+    }
+  }
+}
+</style>