6 Commits 4c3e8026d5 ... cd4ffb18db

Author SHA1 Message Date
  bzkf3 cd4ffb18db 考试计划编辑禁用部分字段修改 1 year ago
  bzkf3 c0964a3840 按钮事件绑定位置修改 1 year ago
  bzkf3 0808179b87 bug 1113 1 year ago
  bzkf3 e74d86b39c 6-5 bug修改 1 year ago
  bzkf3 7824bf4a9b ~ 1 year ago
  bzkf3 96b44e92aa 优化 占坑题号非简答题 1 year ago

+ 3 - 0
components.d.ts

@@ -24,6 +24,9 @@ declare module '@vue/runtime-core' {
     ElConfigProvider: typeof import('element-plus/es')['ElConfigProvider']
     ElDatePicker: typeof import('element-plus/es')['ElDatePicker']
     ElDialog: typeof import('element-plus/es')['ElDialog']
+    ElDropdown: typeof import('element-plus/es')['ElDropdown']
+    ElDropdownItem: typeof import('element-plus/es')['ElDropdownItem']
+    ElDropdownMenu: typeof import('element-plus/es')['ElDropdownMenu']
     ElForm: typeof import('element-plus/es')['ElForm']
     ElFormItem: typeof import('element-plus/es')['ElFormItem']
     ElIcon: typeof import('element-plus/es')['ElIcon']

File diff suppressed because it is too large
+ 1 - 0
public/dtk/assets/index.72940277.js


File diff suppressed because it is too large
+ 1 - 0
public/dtk/assets/index.b33036ab.css


File diff suppressed because it is too large
+ 1 - 0
public/dtk/assets/index.e410b78d.css


File diff suppressed because it is too large
+ 1 - 0
public/dtk/assets/index.fe2cf7b0.js


+ 2 - 2
public/dtk/index.html

@@ -6,10 +6,10 @@
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
     <title>自定义答题卡</title>
     <script src="./config.js"></script>
-    <script type="module" crossorigin src="./assets/index.26656681.js"></script>
+    <script type="module" crossorigin src="./assets/index.fe2cf7b0.js"></script>
     <link rel="modulepreload" href="./assets/vendor.fb7751d4.js">
     <link rel="stylesheet" href="./assets/vendor.e1b158b3.css">
-    <link rel="stylesheet" href="./assets/index.cb418333.css">
+    <link rel="stylesheet" href="./assets/index.e410b78d.css">
   </head>
   <body>
     <div id="app"></div>

+ 204 - 190
src/pages/process/create/index.vue

@@ -1,260 +1,274 @@
-<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" 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" 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>
-
+<script setup>
+import { useRouter } from 'vue-router'
+import request from '~/utils/request'
+import { user } from '~/store'
 
-          </el-form-item>
-        </el-form>
-      </div>
-    </div>
-  </div>
-  <commonFooter/>
-</template>
-<route lang="json">
-{
-"meta":{
-"title":"新建考试计划",
-"breadcrumb": true
+const router = useRouter()
+function linkTo(name) {
+  router.push({ name })
 }
-}
-</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 });
-};
 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'}],
+  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:''
+const ruleFormRef = ref(null)
+const createForm = $ref({
+  ksmc: '',
+  kssj: '',
+  kslx: '1',
+  ksnj: '',
+  kskm: [],
+  yjlc: '1',
+  lkxx: '',
 })
 let type_list = $ref([])
-if(user.value.user_role_id < 72) {
+if (user.value.user_role_id < 72) {
   type_list = [{
     value: '1',
-    label: '周考'
+    label: '周考',
   }, {
     value: '2',
-    label: '月考'
+    label: '月考',
   }, {
     value: '3',
-    label: '期中'
-  },{
+    label: '期中',
+  }, {
     value: '4',
-    label: '期末'
+    label: '期末',
   }, {
     value: '5',
-    label: '作业'
+    label: '作业',
   }, {
     value: '6',
-    label: '测试'
-  },{
+    label: '测试',
+  }, {
     value: '7',
-    label: '联考'
-  }];
-} else {
+    label: '联考',
+  }]
+}
+else {
   type_list = [{
     value: '1',
-    label: '周考'
+    label: '周考',
   }, {
     value: '2',
-    label: '月考'
+    label: '月考',
   }, {
     value: '3',
-    label: '期中'
-  },{
+    label: '期中',
+  }, {
     value: '4',
-    label: '期末'
+    label: '期末',
   }, {
     value: '5',
-    label: '作业'
+    label: '作业',
   }, {
     value: '6',
-    label: '测试'
-  }];
+    label: '测试',
+  }]
 }
 let grade_list = $ref([])
 let subject_list = $ref([])
-let process_type = [{
+const process_type = [{
   value: '1',
-  label: '先上传后划块'
-},{
+  label: '先上传后划块',
+}, {
   value: '2',
-  label: '先划块后上传'
+  label: '先划块后上传',
 }]
 let school_list = $ref([])
-const getSchool= () => {
+function getSchool() {
   request({
-    url:window.GLOBAL_CONFIG.uc + "/index.php",
+    url: `${window.GLOBAL_CONFIG.uc}/index.php`,
     data: {
-      mod:'school',
-      action:'main',
-      do:'index',
-      page:'1',
-      limit:'999'
+      mod: 'school',
+      action: 'main',
+      do: 'index',
+      page: '1',
+      limit: '999',
     },
   }).then((res) => {
-    if (res.code === "1") {
-      school_list = res.data.page_data;
-    }
-  });
+    if (res.code === '1')
+      school_list = res.data.page_data
+  })
 }
-getSchool();
+getSchool()
 function getGrade() {
-  let data = {
-    for_mistake:'1'
+  const data = {
+    for_mistake: '1',
   }
-  if(user.value.user_role_id < 72) {
+  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,
+    url: `${window.GLOBAL_CONFIG.uc}/index.php?mod=school&action=main&do=base_grade`,
+    data,
   }).then((res) => {
-    if (res.code === "1") {
-      grade_list = res.data;
-    }
-  });
+    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;
+getGrade()
+function getSubjectList() {
+  for (const i in grade_list) {
+    if (grade_list[i].grade === createForm.ksnj.value) {
+      createForm.kskm = []
+      subject_list = grade_list[i].subjects
     }
   }
 }
-const handleCancel = () => {
-  router.back();
+function handleCancel() {
+  router.back()
 }
 
-const handleSubmit = async (formEl) => {
-  if (!formEl) return;
+async function handleSubmit(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);
+      const kskm_label = []
+      const kskm_value = []
+      for (const 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
-        }
+      const 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);
+      if (createForm.kslx === '7') {
+        const lkxx_value = []
+        const lkxx_label = []
+        for (const 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(',');
+        data.yzy_ksjh.ykj_lkxx = lkxx_value.join(',')
+        data.yzy_ksjh.ykj_lkxx_name = lkxx_label.join(',')
       }
+      console.log('data : ', data)
+      return false
       request({
         url: '/yzy/ksjh/liankao_add',
-        data: data,
+        data,
       }).then((res) => {
-        if (res.code === "1") {
-          ElMessage.success("考试计划创建成功!");
-          linkTo('process');
+        if (res.code === '1') {
+          ElMessage.success('考试计划创建成功!')
+          linkTo('process')
         }
-      });
-    } else {
-      console.log("error submit!", fields);
+      })
+    }
+    else {
+      console.log('error submit!', createForm)
     }
-  });
+  })
 }
 </script>
 
-<style scoped>
+<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" 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" 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>
+
+<style scoped>
 </style>

+ 236 - 219
src/pages/process/edit/[id].vue

@@ -1,307 +1,324 @@
-<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>
-
+<script setup>
+import { useRouter } from 'vue-router'
+import request from '~/utils/request'
+import { user } from '~/store'
 
-          </el-form-item>
-        </el-form>
-      </div>
-    </div>
-  </div>
-  <commonFooter/>
-</template>
-<route lang="json">
-{
-"meta":{
-"title":"编辑考试计划",
-"breadcrumb": true
+const router = useRouter()
+const route = useRoute()
+function linkTo(name) {
+  router.push({ name })
 }
-}
-</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'}],
+  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:[]
+const ruleFormRef = ref(null)
+const createForm = $ref({
+  ksmc: '',
+  kssj: '',
+  kslx: '1',
+  ksnj: {},
+  kskm: [],
+  yjlc: '1',
+  lkxx: [],
 })
 let type_list = $ref([])
-if(user.value.user_role_id < 72) {
+if (user.value.user_role_id < 72) {
   type_list = [{
     value: '1',
-    label: '周考'
+    label: '周考',
   }, {
     value: '2',
-    label: '月考'
+    label: '月考',
   }, {
     value: '3',
-    label: '期中'
-  },{
+    label: '期中',
+  }, {
     value: '4',
-    label: '期末'
+    label: '期末',
   }, {
     value: '5',
-    label: '作业'
+    label: '作业',
   }, {
     value: '6',
-    label: '测试'
-  },{
+    label: '测试',
+  }, {
     value: '7',
-    label: '联考'
-  }];
-} else {
+    label: '联考',
+  }]
+}
+else {
   type_list = [{
     value: '1',
-    label: '周考'
+    label: '周考',
   }, {
     value: '2',
-    label: '月考'
+    label: '月考',
   }, {
     value: '3',
-    label: '期中'
-  },{
+    label: '期中',
+  }, {
     value: '4',
-    label: '期末'
+    label: '期末',
   }, {
     value: '5',
-    label: '作业'
+    label: '作业',
   }, {
     value: '6',
-    label: '测试'
-  }];
+    label: '测试',
+  }]
 }
 let grade_list = $ref([])
 let subject_list = $ref([])
-let process_type = [{
+const process_type = [{
   value: '1',
-  label: '先上传后划块'
-},{
+  label: '先上传后划块',
+}, {
   value: '2',
-  label: '先划块后上传'
+  label: '先划块后上传',
 }]
 let school_list = $ref([])
-const getSchool= () => {
+function getSchool() {
   request({
-    url:window.GLOBAL_CONFIG.uc + "/index.php",
+    url: `${window.GLOBAL_CONFIG.uc}/index.php`,
     data: {
-      mod:'school',
-      action:'main',
-      do:'index',
-      page:'1',
-      limit:'999'
+      mod: 'school',
+      action: 'main',
+      do: 'index',
+      page: '1',
+      limit: '999',
     },
   }).then((res) => {
-    if (res.code === "1") {
-      school_list = res.data.page_data;
-    }
-  });
+    if (res.code === '1')
+      school_list = res.data.page_data
+  })
 }
-getSchool();
+getSchool()
 function getGrade() {
-  let data = {
-    for_mistake:'1'
+  const data = {
+    for_mistake: '1',
   }
-  if(user.value.user_role_id < 72) {
+  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,
+    url: `${window.GLOBAL_CONFIG.uc}/index.php?mod=school&action=main&do=base_grade`,
+    data,
   }).then((res) => {
-    if (res.code === "1") {
-      grade_list = res.data;
-    }
-  });
+    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;
+getGrade()
+function getSubjectList() {
+  for (const i in grade_list) {
+    if (grade_list[i].grade == createForm.ksnj.value) {
+      createForm.kskm = []
+      subject_list = grade_list[i].subjects
     }
   }
 }
-const handleCancel = () => {
-  router.back();
+function handleCancel() {
+  router.back()
 }
 
-const handleSubmit = async (formEl) => {
-  if (!formEl) return;
+async function handleSubmit(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);
+      const kskm_label = []
+      const kskm_value = []
+      for (const 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
-        }
+      const data = {
+        issubmit: '1',
+        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);
+      if (createForm.kslx === '7') {
+        const lkxx_value = []
+        const lkxx_label = []
+        for (const 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(',');
+        data.yzy_ksjh.ykj_lkxx = lkxx_value.join(',')
+        data.yzy_ksjh.ykj_lkxx_name = lkxx_label.join(',')
       }
       request({
         url: '/yzy/ksjh/edit',
-        data: data,
+        data,
       }).then((res) => {
-        if (res.code === "1") {
-          ElMessage.success("考试计划编辑成功!");
-          linkTo('process');
+        if (res.code === '1') {
+          ElMessage.success('考试计划编辑成功!')
+          linkTo('process')
         }
-      });
-    } else {
-      console.log("error submit!", fields);
+      })
     }
-  });
+    else {
+      console.log('error submit!', fields)
+    }
+  })
 }
-let ykj_id = $ref('');
+let ykj_id = $ref('')
 function getDetail() {
   request({
-    url: "/yzy/ksjh/detail",
+    url: '/yzy/ksjh/detail',
     data: {
-      ykj_id: ykj_id,
+      ykj_id,
     },
   }).then((res) => {
-    if (res.code === "1") {
+    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.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();
+        label: res.data.one_info.ykj_ksnj_name,
+        value: res.data.one_info.ykj_ksnj,
       }
-      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]
+      if (createForm.ksnj.value !== '')
+        getSubjectList()
+
+      createForm.yjlc = res.data.one_info.ykj_yjlc
+      for (const i in res.data.one_info.ykj_kskm.split(',')) {
+        const obj = {
+          value: res.data.one_info.ykj_kskm.split(',')[i],
+          label: res.data.one_info.ykj_kskm_name.split(',')[i],
         }
-        createForm.kskm.push(obj);
+        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]
+      if (res.data.one_info.ykj_kslx === '7') {
+        for (const j in res.data.one_info.ykj_lkxx.split(',')) {
+          const ob = {
+            value: res.data.one_info.ykj_lkxx.split(',')[j],
+            label: res.data.one_info.ykj_lkxx_name.split(',')[j],
           }
-          createForm.lkxx.push(ob);
+          createForm.lkxx.push(ob)
         }
       }
     }
-  });
+  })
 }
 
 if (route.params.id) {
-  ykj_id = route.params.id;
-  getDetail();
+  ykj_id = route.params.id
+  getDetail()
 }
 </script>
 
-<style scoped>
+<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" disabled>
+              <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="请选择联考学校" disabled>
+              <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>
+
+<style scoped>
 </style>

File diff suppressed because it is too large
+ 459 - 420
src/pages/process/fjct/[ze_id]/[zs_id].vue


File diff suppressed because it is too large
+ 557 - 416
src/pages/process/index.vue


+ 143 - 122
src/pages/process/jyysz/[ykj_id].vue

@@ -1,154 +1,150 @@
 <script setup>
-import request from "~/utils/request";
-import {REQUEST} from "~/utils/request";
-import {user} from "~/store";
-import {useRouter} from "vue-router";
+import { useRouter } from 'vue-router'
+import request from '~/utils/request'
 
-const router = useRouter();
-const route = useRoute();
-const linkTo = (obj) => {
-  router.push(obj);
-};
-let ykj_id = $ref('');
-let keyword = $ref('');
-let limit = $ref(10);
-let total = $ref(0);
-let cur_page = $ref(1);
-let listData = $ref([]);
-let dialogVisible = $ref(false);
-let title = $ref('');
-let is_edit = $ref(false);
+const router = useRouter()
+const route = useRoute()
+function linkTo(obj) {
+  router.push(obj)
+}
+let ykj_id = $ref('')
+const keyword = $ref('')
+const limit = $ref(10)
+let total = $ref(0)
+let cur_page = $ref(1)
+let listData = $ref([])
+let dialogVisible = $ref(false)
+let title = $ref('')
+let is_edit = $ref(false)
 let project = $ref({})
 let subject = $ref([])
 let subject_list = $ref([])
 let teacher = $ref({
   value: '',
   label: '',
-  user_realname: ''
+  user_realname: '',
 })
 let yj_id = $ref('')
 let teacher_list = $ref([])
 
 function getListData() {
   request({
-    url: "/yzy/jyy/index",
+    url: '/yzy/jyy/index',
     data: {
-      ykj_id: ykj_id,
-      keyword: keyword,
+      ykj_id,
+      keyword,
       page: cur_page,
-      limit: limit
+      limit,
     },
   }).then((res) => {
     if (res.code === '1') {
-      listData = res.data.page_data;
-      total = Number(res.data.total_rows);
-      cur_page = Number(res.data.page_now);
+      listData = res.data.page_data
+      total = Number(res.data.total_rows)
+      cur_page = Number(res.data.page_now)
     }
   })
 }
 
 function getProjectInfo() {
-  let data = {
-    ykj_id: ykj_id
+  const data = {
+    ykj_id,
   }
   request({
-    url: "/yzy/ksjh/detail",
-    data: data,
+    url: '/yzy/ksjh/detail',
+    data,
   }).then((res) => {
     if (res.code === '1') {
-      project = res.data.one_info;
-      subject_list = project.lc;
-      gerUsers();
+      project = res.data.one_info
+      subject_list = project.lc
+      gerUsers()
     }
   })
 }
 
 function filterData() {
-  cur_page = 1;
-  getListData();
+  cur_page = 1
+  getListData()
 }
 
-const handleSelectionChange = (val) => {
-  cur_page = val;
-  getListData();
-};
+function handleSelectionChange(val) {
+  cur_page = val
+  getListData()
+}
 
 function addTeacher() {
-  is_edit = false;
-  subject = [];
-  title = '增加教研员';
-  dialogVisible = true;
+  is_edit = false
+  subject = []
+  title = '增加教研员'
+  dialogVisible = true
   teacher = {
     value: '',
     label: '',
-    user_realname: ''
+    user_realname: '',
   }
 }
 
 function gerUsers() {
   request({
-    url: window.GLOBAL_CONFIG.uc + "/user/main/index",
+    url: `${window.GLOBAL_CONFIG.uc}/user/main/teachers`,
     data: {
-      sm_id: project.ykj_lkxx,
-      user_role_id: user.user_role_id,
+      // sm_id: project.ykj_lkxx,
+      // user_role_id: user.user_role_id,
       page: '1',
-      limit: '999'
+      limit: '9999',
     },
   }).then((res) => {
-    if (res.code === '1') {
-      teacher_list = res.data.page_data;
-    }
+    if (res.code === '1')
+      teacher_list = res.data.page_data
   })
 }
 
 function editTeacher(item) {
-  is_edit = true;
-  title = '编辑教研员';
+  is_edit = true
+  title = '编辑教研员'
   teacher = {
-    value:item.yj_user_id,
-    label:item.yj_username,
-    user_realname:item.yj_realname
+    value: item.yj_user_id,
+    label: item.yj_username,
+    user_realname: item.yj_realname,
   }
-  yj_id = item.yj_id;
-  subject = [];
-  for(let i in item.yj_subject_id.split(',')) {
-    let obj = {
-      value:item.yj_subject_id.split(',')[i],
-      label:item.yj_subject_name.split(',')[i]
+  yj_id = item.yj_id
+  subject = []
+  for (const i in item.yj_subject_id.split(',')) {
+    const obj = {
+      value: item.yj_subject_id.split(',')[i],
+      label: item.yj_subject_name.split(',')[i],
     }
     subject.push(obj)
   }
-  dialogVisible = true;
+  dialogVisible = true
 }
 function del_teacher(item) {
-  ElMessageBox.confirm("确认删除该教研员?", "", {
-    confirmButtonText: "确认",
-    cancelButtonText: "取消",
-    type: "warning",
+  ElMessageBox.confirm('确认删除该教研员?', '', {
+    confirmButtonText: '确认',
+    cancelButtonText: '取消',
+    type: 'warning',
   }).then(() => {
-
     request({
-      url: "/yzy/jyy/delete",
+      url: '/yzy/jyy/delete',
       data: {
-        yj_id:item.yj_id
+        yj_id: item.yj_id,
       },
     }).then((res) => {
-      if (res.code === "1") {
+      if (res.code === '1') {
         ElMessage({
-          type: "success",
-          message: "删除成功",
-        });
-        getListData();
+          type: 'success',
+          message: '删除成功',
+        })
+        getListData()
       }
-    });
+    })
   })
 }
 function handleSubmit() {
-  let subject_ids = [];
-  let subject_names = [];
-  for (let i in subject) {
-    subject_ids.push(subject[i].value);
-    subject_names.push(subject[i].label);
+  const subject_ids = []
+  const subject_names = []
+  for (const i in subject) {
+    subject_ids.push(subject[i].value)
+    subject_names.push(subject[i].label)
   }
   if (!is_edit) {
     request({
@@ -157,54 +153,55 @@ function handleSubmit() {
       data: {
         issubmit: '1',
         yzy_jyy: {
-          ykj_id: ykj_id,
+          ykj_id,
           yj_user_id: teacher.value,
           yj_realname: teacher.user_realname,
           yj_username: teacher.label,
           yj_subject_id: subject_ids.join(','),
-          yj_subject_name: subject_names.join(',')
-        }
+          yj_subject_name: subject_names.join(','),
+        },
       },
     }).then((res) => {
       if (res.code === '1') {
-        ElMessage.success("教研员添加成功!");
-        dialogVisible = false;
-        getListData();
+        ElMessage.success('教研员添加成功!')
+        dialogVisible = false
+        getListData()
       }
     })
-  } else {
+  }
+  else {
     request({
 
       url: '/yzy/jyy/edit',
       data: {
         issubmit: '1',
-        yj_id:yj_id,
+        yj_id,
         yzy_jyy: {
-          ykj_id: ykj_id,
+          ykj_id,
           yj_user_id: teacher.value,
           yj_realname: teacher.user_realname,
           yj_username: teacher.label,
           yj_subject_id: subject_ids.join(','),
-          yj_subject_name: subject_names.join(',')
-        }
+          yj_subject_name: subject_names.join(','),
+        },
       },
     }).then((res) => {
       if (res.code === '1') {
-        ElMessage.success("教研员编辑成功!");
-        dialogVisible = false;
-        getListData();
+        ElMessage.success('教研员编辑成功!')
+        dialogVisible = false
+        getListData()
       }
     })
   }
-
 }
 
 if (route.params.ykj_id) {
-  ykj_id = route.params.ykj_id;
-  getListData();
-  getProjectInfo();
+  ykj_id = route.params.ykj_id
+  getListData()
+  getProjectInfo()
 }
 </script>
+
 <route lang="json">
 {
 "meta":{
@@ -213,12 +210,15 @@ if (route.params.ykj_id) {
 }
 }
 </route>
+
 <template>
-  <NavHeader/>
-  <bread-crumb/>
+  <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>
+      <button type="button" class="back-btn" @click="linkTo({ name: 'process' })">
+        返回
+      </button>
     </div>
     <div class="mt-10px w-full bg-hex-fff min-h-700px py-20px px-15px">
       <div class="flex align-center">
@@ -228,19 +228,23 @@ if (route.params.ykj_id) {
           style="width: 225px;"
           size="large"
           clearable
+          placeholder="请输入关键字"
           @keyup.enter="filterData"
           @clear="filterData"
-          placeholder="请输入关键字"
         />
-        <el-button color="#003eee" class="ml-10px" type="primary" size="large" @click="filterData">搜索</el-button>
-        <button type="button" class="ml-10px add-btn">
+        <el-button color="#003eee" class="ml-10px" type="primary" size="large" @click="filterData">
+          搜索
+        </el-button>
+        <button type="button" class="ml-10px add-btn" @click="addTeacher">
           <el-icon class="inline-block align-middle">
-            <Plus/>
+            <Plus />
           </el-icon>
-          <span class="ml-5px inline-block align-middle" @click="addTeacher">新增教研员</span>
+          <span class="ml-5px inline-block align-middle">新增教研员</span>
         </button>
       </div>
-      <h3 class="mt-20px mb-10px text-13px text-hex-6F6F6F">(此处为查看扫描批阅进度的权限赋予设置)</h3>
+      <h3 class="mt-20px mb-10px text-13px text-hex-6F6F6F">
+        (此处为查看扫描批阅进度的权限赋予设置)
+      </h3>
       <div v-if="listData.length > 0">
         <table class="data-table" cellpadding="0" cellspacing="0">
           <tr>
@@ -254,25 +258,33 @@ if (route.params.ykj_id) {
             <td>{{ item.yj_username }}</td>
             <td>{{ item.yj_subject_name }}</td>
             <td>
-              <button type="button" class="op-btn edit" @click="editTeacher(item)">编辑</button>
-              <button type="button" class="ml-15px op-btn del" @click="del_teacher(item)">删除</button>
+              <button type="button" class="op-btn edit" @click="editTeacher(item)">
+                编辑
+              </button>
+              <button type="button" class="ml-15px op-btn del" @click="del_teacher(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>
+          <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"
+          />
         </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>
+          <h3 class="no-data-img" />
+          <h4 class="mt-25px text-18px text-hex-0048e5 text-center">
+            暂无数据
+          </h4>
         </div>
       </div>
     </div>
   </div>
-  <commonFooter/>
+  <commonFooter />
   <el-dialog
     v-model="dialogVisible"
     :title="title"
@@ -283,20 +295,29 @@ if (route.params.ykj_id) {
       <el-form label-width="120px" size="large">
         <el-form-item label="教研员">
           <el-select v-model="teacher" placeholder="请选择教研员" filterable style="width: 100%">
-            <el-option v-for="item in teacher_list" :label="item.user_realname+' '+ item.user_phone"
-                       :value="{value:item.user_id,label:item.user_name,user_realname:item.user_realname}"/>
+            <el-option
+              v-for="item in teacher_list" :label="`${item.user_realname} - ${item.user_name}`"
+              :value="{ value: item.user_id, label: item.user_name, user_realname: item.user_realname }"
+            />
           </el-select>
         </el-form-item>
         <el-form-item label="可查看学科">
           <el-select v-model="subject" placeholder="请选择学科" multiple filterable style="width: 100%">
-            <el-option :value-key="item.ze_xueke" v-for="item in subject_list" :label="item.ze_xueke_name"
-                       :value="{value:item.ze_xueke,label:item.ze_xueke_name}"/>
+            <el-option
+              v-for="item in subject_list" :value-key="item.ze_xueke" :label="item.ze_xueke_name"
+              :value="{ value: item.ze_xueke, label: item.ze_xueke_name }"
+            />
           </el-select>
         </el-form-item>
         <div class="mt-40px text-center">
-          <el-button class="mr-30px" @click="dialogVisible = false">取消</el-button>
-          <el-button type="primary" color="#003eee" :disabled="teacher.value === '' || subject.length === 0"
-                     @click="handleSubmit">确定
+          <el-button class="mr-30px" @click="dialogVisible = false">
+            取消
+          </el-button>
+          <el-button
+            type="primary" color="#003eee" :disabled="teacher.value === '' || subject.length === 0"
+            @click="handleSubmit"
+          >
+            确定
           </el-button>
         </div>
       </el-form>

+ 124 - 96
src/pages/process/xgfs/[ze_id]/[ysk_id].vue

@@ -1,32 +1,112 @@
+<script setup>
+import { useRouter } from 'vue-router'
+import request from '~/utils/request'
+
+const router = useRouter()
+const route = useRoute()
+function linkTo(name) {
+  router.push({ 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() {
+  const data = {
+    ysk_id,
+    limit: '999',
+  }
+  request({
+    url: '/yzy/xsdtdtqt/index',
+    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
+    const 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>
+
 <template>
-  <NavHeader/>
+  <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>
+      <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">
+        <div class="w-385px">
           <table class="data-table" cellpadding="0" cellspacing="0">
             <tr>
               <th>题目</th>
               <th>满分</th>
-              <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>{{ item.ysdt_stsxbh }}</td>
+              <td>{{ item.hq_score }}</td>
+              <td>{{ item.hq_answer }}</td>
+              <td>{{ item.ysdt_xsda }}</td>
+              <td>{{ item.ysdt_pydf }}</td>
               <td>
-                <button type="button" class="op-btn" @click="reviseScore(item)">改分</button>
+                <button type="button" class="op-btn" @click="reviseScore(item)">
+                  改分
+                </button>
               </td>
             </tr>
           </table>
         </div>
-        <div class="w-780px">
+        <div class="w-770px">
           <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="">
@@ -36,35 +116,56 @@
       </div>
     </div>
   </div>
-  <commonFooter/>
-  <div class="revise-pop" v-if="reviseShow">
+  <commonFooter />
+  <div v-if="reviseShow" class="revise-pop">
     <div class="revise-box">
-      <h3 class="pop-title mb-50px">修改分数</h3>
+      <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 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 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 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="w-180px text-right text-16px">
+          得分
+        </div>
         <div class="flex-1 ml-25px">
-          <input type="text" class="revise-in" v-model="reviseInfo.ysdt_pydf">
+          <input v-model="reviseInfo.ysdt_pydf" type="text" class="revise-in">
         </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>
+        <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":{
@@ -73,79 +174,6 @@
 }
 }
 </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;

+ 77 - 37
src/pages/step/[id].vue

@@ -243,6 +243,7 @@ watch(() => stepsReactiveMap, (val) => {
 
 let currentStep = $ref<number>(gid)
 
+// 当前步骤的card的ref
 const CardsRef = $shallowRef<Array<Array<typeof import('~/components/TheCard.vue')['default']>>>([])
 const lineList: any[][][] = []
 
@@ -274,38 +275,49 @@ function handleSwitchCurrentStep(id: number) {
 
 onMounted(() => {
   watch(() => currentStep, (val, old) => {
-    if (old !== undefined)
+    if (old !== undefined) {
+      console.log('上次线条存在并隐藏')
       lineList[old].forEach(lines => lines.forEach(line => line?.hide('none')))
+    }
     if (lineList[val]?.length) {
+      console.log('这次线条存在并显示')
       lineList[val].forEach(lines => lines.forEach(line => line?.show('none')))
     }
     else {
+      console.log('这次线条不存在并创建', CardsRef)
       nextTick(() => {
+        console.log('nextTick')
         CardsRef.forEach((cards, idx) => {
           if (idx === CardsRef.length - 1)
             return
           cards.forEach((card, idy) => {
-            if (card === null || CardsRef[idx + 1][0] === null)
+            if ((!card) || (!CardsRef[idx + 1][0]))
               return
-            const line = new LeaderLine(
-              card.getDom(),
-              CardsRef[idx + 1][0].getDom(),
-              {
-                path: 'grid',
-                endPlug: 'behind',
-                size: 6,
-                startSocket: 'right',
-                endSocket: 'left',
-                color: stepsReactiveMap[currentStep][idx][idy] ? '#003eee' : '#a3a3a3',
-              },
-            )
-            line?.position()
-            if (stepsReactiveMap[currentStep][idx][idy])
-              document.querySelectorAll('.leader-line')[line._id as number - 1]?.classList.add('z10')
-
-            lineList[val] = lineList[val] || []
-            lineList[val][idx] = lineList[val][idx] || []
-            lineList[val][idx][idy] = line
+            try {
+              const line = new LeaderLine(
+                card.getDom(),
+                CardsRef[idx + 1][0].getDom(),
+                {
+                  path: 'grid',
+                  endPlug: 'behind',
+                  size: 6,
+                  startSocket: 'right',
+                  endSocket: 'left',
+                  color: stepsReactiveMap[currentStep][idx][idy] ? '#003eee' : '#a3a3a3',
+                },
+              )
+              line?.position()
+              if (stepsReactiveMap[currentStep][idx][idy])
+                document.querySelectorAll('.leader-line')[line._id as number - 1]?.classList.add('z10')
+
+              lineList[val] = lineList[val] || []
+              lineList[val][idx] = lineList[val][idx] || []
+              lineList[val][idx][idy] = line
+              console.log('线条绘制成功', lineList)
+            }
+            catch (error) {
+              console.error('线条绘制失败, error')
+            }
           })
         })
       })
@@ -358,29 +370,47 @@ function handleValidTask(currentStep: number, idx: number, idy: number) {
   }
 }
 
-function judgeIfContinueDoTask(gid: number, pid: number, idy: number) {
+function getArrayLastElement<T>(arr: T[]) {
+  return arr[arr.length - 1]
+}
+
+function judgeIfContinueDoTask(gid: number, pid: number, idy: number, ifMessage: boolean, ifUselessWhenStepEnd: boolean /* 考试关闭后禁用 */) {
   const currentTask = steps[gid].children[pid].children[idy]
-  const continueDoTask = !currentTask.ifCreateUser || isCreateUser
-  if (!continueDoTask) {
-    ElMessage({
+  const continueDoTaskByUser = !currentTask.ifCreateUser || isCreateUser
+  if (!continueDoTaskByUser) {
+    ifMessage && ElMessage({
       message: '只有考试创建人才能操作',
       type: 'warning',
       grouping: true,
     })
+    return false
+  }
+  if (ifUselessWhenStepEnd) {
+    if (judgeStepCompleted(getArrayLastElement(getArrayLastElement(stepsReactiveMap))[0])) {
+      ifMessage && ElMessage({
+        message: '考试已关闭,无法操作',
+        type: 'warning',
+        grouping: true,
+      })
+      return false
+    }
   }
-  return continueDoTask
+
+  return true
 }
 
+const ifUselessWhenStepEndTaskList = ['修改成绩', '考试关闭']
 function beforeClickTask(gid: number, pid: number, idy: number) {
-  const continueDoTask = judgeIfContinueDoTask(gid, pid, idy)
+  const currentTask = steps[gid].children[pid].children[idy]
+  const continueDoTask = judgeIfContinueDoTask(gid, pid, idy, true, ifUselessWhenStepEndTaskList.includes(currentTask.title))
   if (!continueDoTask)
     return false
   else
     return handleValidTask(gid, pid, idy)
 }
 
-function judgeTaskCanClick(gid: number, pid: number, idy: number) {
-  const continueDoTask = judgeIfContinueDoTask(gid, pid, idy)
+function judgeTaskCanClick(gid: number, pid: number, idy: number, ifUselessWhenStepEnd?: boolean /* 考试关闭后是否禁用 */) {
+  const continueDoTask = judgeIfContinueDoTask(gid, pid, idy, false, ifUselessWhenStepEnd)
   if (!continueDoTask) {
     return false
   }
@@ -402,7 +432,7 @@ function judgeTaskCanClick(gid: number, pid: number, idy: number) {
 }
 
 function judgeStepCompleted(val: unknown) {
-  return (!!val) || (typeof val === 'object' && !!(val?.value))
+  return (!!val) || (typeof val === 'object' && val !== null && !!(val?.value))
 }
 
 function handleCompleteTask(gid: number, pid: number, cid: number, val?: unknown, ext?: any): Promise<any> {
@@ -468,16 +498,26 @@ async function handleJumpTask(gid: number, pid: number, idy: number, ext?: objec
   const res = await handleCompleteTask(gid, pid, idy, 1, ext)
   if (res.code === '1') {
     if (pid !== stepsReactiveMap[gid].length - 1) {
-      const line = lineList[gid][pid][idy]
-      line.setOptions({ color: '#003eee' })
-      document.querySelectorAll('.leader-line')[line._id - 1]?.classList.add('z10')
+      try {
+        const line = lineList[gid][pid][idy]
+        line.setOptions({ color: '#003eee' })
+        document.querySelectorAll('.leader-line')[line._id - 1]?.classList.add('z10')
+      }
+      catch (error) {
+        console.error('线条更新失败', error)
+      }
     }
   }
   return res
 }
 
 onBeforeRouteLeave(() => {
-  lineList.forEach(lines => lines.forEach(line => line.forEach(l => l?.hide('none'))))
+  try {
+    lineList.forEach(lines => lines.forEach(line => line.forEach(l => l?.hide('none'))))
+  }
+  catch (error) {
+    console.error('线条卸载失败', error)
+  }
 })
 
 function handleCompleteTaskAuto(ext?: object) {
@@ -717,9 +757,9 @@ const TaskEventMap: { [key: string]: () => void } = {
                 <template #tip>
                   <template v-if="task.title === '成绩发布'">
                     <div class="mt-2 flex flex-col items-start px-1 text-xs space-y-1" style="--el-font-size-base:10px">
-                      <xgstda :disabled="!judgeTaskCanClick(currentStep, idx, idy)" />
-                      <szcjckqx :disabled="!judgeTaskCanClick(currentStep, idx, idy)" />
-                      <bjqk :disabled="!judgeTaskCanClick(currentStep, idx, idy)" />
+                      <xgstda :disabled="!judgeTaskCanClick(currentStep, idx, idy, true)" />
+                      <szcjckqx :disabled="!judgeTaskCanClick(currentStep, idx, idy, false)" />
+                      <bjqk :disabled="!judgeTaskCanClick(currentStep, idx, idy, true)" />
                     </div>
                   </template>
                 </template>