dedsudiyu 5 giorni fa
parent
commit
51c060a56e

+ 8 - 0
src/api/safetyEducationExaminationNew/index.js

@@ -923,3 +923,11 @@ export function examUserExamAttemptFinished(data) {
     data: data
   })
 }
+//确认安全承诺书
+export function examUserExamSecurityCommitmentExamConfirm(data) {
+  return request({
+    url: '/exam/user/exam/securityCommitment/exam/confirm',
+    method: 'post',
+    data: data
+  })
+}

+ 8 - 0
src/views/safetyEducationExaminationNew/components/coursewareComponent.vue

@@ -139,6 +139,14 @@
           player.play();
         }
       },
+      //文件加载成功
+      renderedHandler() {
+        this.$set(this,'officeNullType',false);
+      },
+      //文件加载失败
+      errorHandler() {
+        this.$set(this,'officeNullType',true);
+      },
     }
   }
 </script>

+ 10 - 2
src/views/safetyEducationExaminationNew/components/safetyCommitmentLetter.vue

@@ -43,7 +43,7 @@
       VueOfficePdf,
     },
     props: {
-      answerKeyPropsData: {}
+      safetyCommitmentLetterPropsData: {}
     },
     data() {
       return {
@@ -63,7 +63,7 @@
       }
     },
     mounted() {
-      this.initialize('安全承诺书','http://192.168.1.88/statics/study/bigFile/2026/09/29/f2384978-355f-4dab-ba05-7738e8423a30.docx','docx');
+      this.initialize('安全承诺书',this.safetyCommitmentLetterPropsData.securityCommitmentPath,'pdf');
     },
     methods: {
       //初始化
@@ -108,6 +108,14 @@
           // 解析失败保持默认纵向
         }
       },
+      //文件加载成功
+      renderedHandler() {
+        this.$set(this,'officeNullType',false);
+      },
+      //文件加载失败
+      errorHandler() {
+        this.$set(this,'officeNullType',true);
+      },
     },
   }
 </script>

+ 20 - 20
src/views/safetyEducationExaminationNew/examManagement/examinationArrange/addPage.vue

@@ -556,27 +556,27 @@
                   </div>
                 </el-form-item>
 
-                <!--<el-form-item label="安全承诺书" prop="securityCommitmentEnabled">-->
-                  <!--<div class="switch-row">-->
-                    <!--<el-switch :disabled="showType" v-model="newData.securityCommitmentEnabled" :active-value="1" :inactive-value="0"-->
-                               <!--active-color="#0183FB" inactive-color="#AAAAAA"-->
-                    <!--/>-->
-                    <!--<p v-if="newData.securityCommitmentEnabled==1&&!showType" class="checkButton-p" style="margin-left:20px;"-->
-                       <!--@click="openSafetyCommitmentLetterDrawer"-->
-                    <!--&gt;选择模板</p>-->
-                  <!--</div>-->
-                  <!--<div class="mock-stat-bar" style="padding:0 20px;"-->
-                       <!--v-if="newData.securityCommitmentTemplateId&&newData.securityCommitmentEnabled == 1">-->
-                    <!--<span style="margin-right:20px;"><b>{{ newData.securityCommitmentTemplateName}}</b></span>-->
-                    <!--&lt;!&ndash;<i class="el-icon-close" @click="newData.certificateTemplateId = null;newData.certificateTemplateName = '';"></i>&ndash;&gt;-->
-                  <!--</div>-->
-                <!--</el-form-item>-->
+                <el-form-item label="安全承诺书" prop="securityCommitmentEnabled">
+                  <div class="switch-row">
+                    <el-switch :disabled="showType" v-model="newData.securityCommitmentEnabled" :active-value="1" :inactive-value="0"
+                               active-color="#0183FB" inactive-color="#AAAAAA"
+                    />
+                    <p v-if="newData.securityCommitmentEnabled==1&&!showType" class="checkButton-p" style="margin-left:20px;"
+                       @click="openSafetyCommitmentLetterDrawer"
+                    >选择模板</p>
+                  </div>
+                  <div class="mock-stat-bar" style="padding:0 20px;"
+                       v-if="newData.securityCommitmentTemplateId&&newData.securityCommitmentEnabled == 1">
+                    <span style="margin-right:20px;"><b>{{ newData.securityCommitmentTemplateName}}</b></span>
+                    <!--<i class="el-icon-close" @click="newData.certificateTemplateId = null;newData.certificateTemplateName = '';"></i>-->
+                  </div>
+                </el-form-item>
 
-                <!--<el-form-item label="承诺书打印" v-if="newData.securityCommitmentEnabled == 1">-->
-                  <!--<el-switch :disabled="showType" v-model="newData.securityCommitmentPrintEnabled" :active-value="1" :inactive-value="0"-->
-                             <!--active-color="#0183FB" inactive-color="#AAAAAA"-->
-                  <!--/>-->
-                <!--</el-form-item>-->
+                <el-form-item label="承诺书打印" v-if="newData.securityCommitmentEnabled == 1">
+                  <el-switch :disabled="showType" v-model="newData.securityCommitmentPrintEnabled" :active-value="1" :inactive-value="0"
+                             active-color="#0183FB" inactive-color="#AAAAAA"
+                  />
+                </el-form-item>
               </div>
             </div>
           </el-form>

+ 102 - 11
src/views/safetyEducationExaminationNew/featurePage/startTheExam/index.vue

@@ -92,17 +92,38 @@
           <!--<p>成绩无效</p>-->
         <!--</div>-->
         <p class="text-p">{{shadeData.type==1||shadeData.type==2?'本次考试成绩不及格!':(shadeData.type==3?'本次考试成绩突破历史最佳记录':(shadeData.type==4?'本次考试成绩未突破历史最佳记录,故作无效处理!':''))}}</p>
+        <p class="text-p" style="line-height:30px;" v-if="shadeData.type==5">成绩合格!</p>
+        <p class="text-p" style="line-height:30px;" v-if="shadeData.type==5">请仔细阅读并确认《实验室安全承诺书》,否则考试成绩无效。</p>
         <div class="button-box">
           <p class="null-p"></p>
           <p class="button-p-1" v-if="shadeData.type==1||shadeData.type==2" @click="reviewMistakes()">查看错题</p>
           <p class="button-p-2" v-if="(shadeData.type==1||shadeData.type==2)&&shadeData.canContinueExam == 1" @click="retakeExam()">重新考试</p>
           <p class="button-p-2" v-if="shadeData.type==3||shadeData.type==4" @click="backPage()">确定</p>
+          <p class="button-p-3" v-if="shadeData.type==5" @click="safetyCommitmentLetterDialogButton(1)">确认安全承诺书</p>
           <p class="null-p"></p>
         </div>
         <p class="out-button el-icon-close" @click="backPage()"></p>
       </div>
     </div>
     <historyOfIncorrectQuestions :historyOfIncorrectQuestionsPropsData="historyOfIncorrectQuestionsPropsData" v-if="pageType === 2"></historyOfIncorrectQuestions>
+    <el-dialog class="safetyCommitmentLetter-dialog"
+               :modal-append-to-body="false"
+               :close-on-click-modal="false" :close-on-press-escape="false"
+               title="安全承诺书"
+               :visible.sync="safetyCommitmentLetterDialogType"
+               v-if="safetyCommitmentLetterDialogType"
+               width="908px"
+               append-to-body>
+      <div style="height:600px;display: flex;flex-direction: column;overflow: hidden">
+        <safetyCommitmentLetter ref="dataStatisticsReport" :safetyCommitmentLetterPropsData="safetyCommitmentLetterPropsData"></safetyCommitmentLetter>
+      </div>
+      <div slot="footer" class="dialog-footer dialog-footer-box" v-if="safetyCommitmentLetterPropsData.securityCommitmentPrintEnabled == 1 && safetyCommitmentLetterPropsData.securityCommitmentStatus != 1">
+        <p class="dialog-footer-button-null"></p>
+        <p class="dialog-footer-button-border" v-if="safetyCommitmentLetterPropsData.securityCommitmentPrintEnabled == 1" @click="safetyCommitmentLetterDialogButton(2)">下载</p>
+        <p class="dialog-footer-button-primary" v-if="safetyCommitmentLetterPropsData.securityCommitmentStatus != 1" @click="safetyCommitmentLetterDialogButton(3)">确认</p>
+        <p class="dialog-footer-button-null"></p>
+      </div>
+    </el-dialog>
   </div>
 </template>
 <script>
@@ -110,14 +131,16 @@
   import {
     examElExamAttemptReviewSidebar, examElExamAttemptReviewQuestion,
     examUserExamGetExamSurplusTime,examUserExamAnswerSave,
-    examUserExamSubmit,examUserExamStart,
+    examUserExamSubmit,examUserExamStart,examUserExamSecurityCommitmentExamConfirm,
   } from '@/api/safetyEducationExaminationNew/index'
   import historyOfIncorrectQuestions from "@/views/safetyEducationExaminationNew/components/historyOfIncorrectQuestions.vue";
+  import safetyCommitmentLetter from "@/views/safetyEducationExaminationNew/components/safetyCommitmentLetter.vue";
 
   export default {
     name: 'index',
     components: {
       historyOfIncorrectQuestions,
+      safetyCommitmentLetter
     },
     data() {
       return {
@@ -153,6 +176,13 @@
         },
         historyOfIncorrectQuestionsPropsData:{},
         submitType:false,
+        //安全承诺书
+        safetyCommitmentLetterDialogType:false,
+        safetyCommitmentLetterPropsData:{
+          securityCommitmentPath:'',
+          securityCommitmentPrintEnabled:0,
+          securityCommitmentStatus:0,
+        },
       }
     },
     computed: {
@@ -373,22 +403,39 @@
             this.warningTimer = null; // 建议同时将实例置为 null
           }
           if(response.data.totalScore >= this.examInfo.passScore){
-            if(response.data.needPrompt == 1){
+            //考试通过-判定通知书相关
+            if(response.data.securityCommitmentEnabled == 1 && response.data.securityCommitmentStatus != 1){
               //最佳记录
-              this.$set(this,'shadeData',{
-                type:3,
-                totalScore:response.data.totalScore,
-                canContinueExam:0,
+              this.$set(this,'safetyCommitmentLetterPropsData',{
+                examId:this.newData.examId,
+                securityCommitmentPath:response.data.securityCommitmentPath,
+                securityCommitmentPrintEnabled:response.data.securityCommitmentPrintEnabled,
+                securityCommitmentStatus:response.data.securityCommitmentStatus,
               });
-              this.$set(this,'shadeType',true);
-            }else{
-              //非最佳记录
               this.$set(this,'shadeData',{
-                type:4,
+                type:5,
                 totalScore:response.data.totalScore,
                 canContinueExam:0,
               });
               this.$set(this,'shadeType',true);
+            }else{
+              if(response.data.needPrompt == 1){
+                //最佳记录
+                this.$set(this,'shadeData',{
+                  type:3,
+                  totalScore:response.data.totalScore,
+                  canContinueExam:0,
+                });
+                this.$set(this,'shadeType',true);
+              }else{
+                //非最佳记录
+                this.$set(this,'shadeData',{
+                  type:4,
+                  totalScore:response.data.totalScore,
+                  canContinueExam:0,
+                });
+                this.$set(this,'shadeType',true);
+              }
             }
           }else{
             if(response.data.canContinueExam == 1){
@@ -532,7 +579,42 @@
         } else {
           return `${seconds}秒`
         }
-      }
+      },
+
+      //安全承诺书
+      safetyCommitmentLetterDialogButton(type,item){
+        if(type == 1){
+          this.$set(this,'safetyCommitmentLetterDialogType',true);
+        }else if(type == 2){
+          this.downloadOffice();
+        }else if(type == 3){
+          this.examUserExamSecurityCommitmentExamConfirm();
+        }
+      },
+      //下载
+      async downloadOffice() {
+        // 获取图片对象和画布对象
+        const imgUrl = this.safetyCommitmentLetterPropsData.securityCommitmentPath;
+        const response = await fetch(imgUrl)
+        const blob = await response.blob()
+        // 创建下载链接
+        const url = window.URL.createObjectURL(blob)
+        const link = document.createElement('a')
+        link.href = url
+        link.download = '安全承诺书'
+        document.body.appendChild(link)
+        link.click()
+        document.body.removeChild(link)
+        // 释放 Blob URL
+        window.URL.revokeObjectURL(url)
+      },
+      //确认安全承诺书
+      examUserExamSecurityCommitmentExamConfirm(){
+        examUserExamSecurityCommitmentExamConfirm({examId:this.safetyCommitmentLetterPropsData.examId}).then(response => {
+          this.msgSuccess(response.message);
+          this.$router.back();
+        })
+      },
     },
     beforeDestroy() {
       //离开提交
@@ -1095,6 +1177,15 @@
             color:#fff;
             background-color: #0183fa;
           }
+          .button-p-3{
+            cursor: pointer;
+            width:150px;
+            border:1px solid #0183fa;
+            color:#fff;
+            background-color: #0183fa;
+            margin-left:0;
+            margin-top:0;
+          }
         }
         .out-button{
           position: absolute;

+ 71 - 9
src/views/safetyEducationExaminationNew/safetyTest/myGrades/index.vue

@@ -49,8 +49,11 @@
       <div class="page-content-box">
         <div class="for-max-big-box scrollbar-box">
           <div class="for-big-box" v-for="(item,index) in dataList" :key="index">
-            <p class="title-p">{{item.examTypeName}}</p>
-            <p class="text-p">{{item.examName}}<span :class="item.examScene == 1?'color-A':'color-B'">{{item.examScene == 1?'在线考试':'模拟考试'}}</span></p>
+            <p class="title-p">{{item.examName}}</p>
+            <p class="text-p">{{item.examTypeName}}
+              <span :class="item.examScene == 1?'color-A':'color-B'">{{item.examScene == 1?'在线考试':'模拟考试'}}</span>
+              <span class="button-border-box" v-if="item.securityCommitmentEnabled == 1" @click="safetyCommitmentLetterDialogButton(1,item)">安全承诺书</span>
+            </p>
             <p class="text-p">{{parseTime(item.startTime,"{y}-{m}-{d} {h}:{i}")}} 至 {{parseTime(item.endTime,"{y}-{m}-{d} {h}:{i}")}}</p>
             <p class="color-p">时长:{{item.answerDuration}}分钟 丨 总分:{{item.totalScore}}分 丨 及格分:{{item.passScore}}分 丨 考试次数:{{item.attemptCount}}/{{item.attemptLimit==0?'无限':item.attemptLimit}}次</p>
             <div class="color-box">
@@ -104,10 +107,10 @@
       <div style="height:600px;display: flex;flex-direction: column;overflow: hidden">
         <safetyCommitmentLetter ref="dataStatisticsReport" :safetyCommitmentLetterPropsData="safetyCommitmentLetterPropsData"></safetyCommitmentLetter>
       </div>
-      <div slot="footer" class="dialog-footer dialog-footer-box">
+      <div slot="footer" class="dialog-footer dialog-footer-box" v-if="safetyCommitmentLetterPropsData.securityCommitmentPrintEnabled == 1 || !safetyCommitmentLetterPropsData.securityCommitmentConfirmed">
         <p class="dialog-footer-button-null"></p>
-        <p class="dialog-footer-button-border" @click="safetyCommitmentLetterDialogButton(type)">下载</p>
-        <p class="dialog-footer-button-primary" @click="safetyCommitmentLetterDialogButton(type)">确认</p>
+        <p class="dialog-footer-button-border" v-if="safetyCommitmentLetterPropsData.securityCommitmentPrintEnabled == 1" @click="safetyCommitmentLetterDialogButton(2)">下载</p>
+        <p class="dialog-footer-button-primary" v-if="!safetyCommitmentLetterPropsData.securityCommitmentConfirmed" @click="safetyCommitmentLetterDialogButton(3)">确认</p>
         <p class="dialog-footer-button-null"></p>
       </div>
     </el-dialog>
@@ -121,7 +124,10 @@
   import historyOfIncorrectQuestions from "@/views/safetyEducationExaminationNew/components/historyOfIncorrectQuestions.vue";
   import examRecords from "@/views/safetyEducationExaminationNew/components/examRecords.vue";
   import safetyCommitmentLetter from "@/views/safetyEducationExaminationNew/components/safetyCommitmentLetter.vue";
-  import { examElExamUserResultMyScoreListPage,examUserExamTypeSelectExamType,examElLabEduRelationGraduationReport, } from "@/api/safetyEducationExaminationNew/index";
+  import {
+    examElExamUserResultMyScoreListPage,examUserExamTypeSelectExamType,
+    examElLabEduRelationGraduationReport,examUserExamSecurityCommitmentExamConfirm,
+  } from "@/api/safetyEducationExaminationNew/index";
   export default {
     name: 'index',
     components: {
@@ -158,7 +164,11 @@
         dataStatisticsReportPropsData:{},
         //安全承诺书
         safetyCommitmentLetterDialogType:false,
-        safetyCommitmentLetterPropsData:null,
+        safetyCommitmentLetterPropsData:{
+          securityCommitmentPath:'',
+          securityCommitmentPrintEnabled:0,
+          securityCommitmentConfirmed:false,
+        },
       }
     },
     created() {
@@ -291,8 +301,51 @@
         return ((arg1*m+arg2*m)/m).toFixed(0);
       },
       //安全承诺书
-      safetyCommitmentLetterDialogButton(type){
-
+      safetyCommitmentLetterDialogButton(type,item){
+        if(type == 1){
+          this.$set(this,'safetyCommitmentLetterPropsData',{
+            examId:item.examId,
+            securityCommitmentPath:item.securityCommitmentPath,
+            securityCommitmentPrintEnabled:item.securityCommitmentPrintEnabled,
+            securityCommitmentConfirmed:item.securityCommitmentConfirmed,
+          });
+          this.$set(this,'safetyCommitmentLetterDialogType',true);
+        }else if(type == 2){
+          this.downloadOffice();
+        }else if(type == 3){
+          this.examUserExamSecurityCommitmentExamConfirm();
+        }
+      },
+      //下载
+      async downloadOffice() {
+        // 获取图片对象和画布对象
+        const imgUrl = this.safetyCommitmentLetterPropsData.securityCommitmentPath;
+        const response = await fetch(imgUrl)
+        const blob = await response.blob()
+        // 创建下载链接
+        const url = window.URL.createObjectURL(blob)
+        const link = document.createElement('a')
+        link.href = url
+        link.download = '安全承诺书'
+        document.body.appendChild(link)
+        link.click()
+        document.body.removeChild(link)
+        // 释放 Blob URL
+        window.URL.revokeObjectURL(url)
+      },
+      //确认安全承诺书
+      examUserExamSecurityCommitmentExamConfirm(){
+        examUserExamSecurityCommitmentExamConfirm({examId:this.safetyCommitmentLetterPropsData.examId}).then(response => {
+          this.msgSuccess(response.message)
+          this.$set(this,'safetyCommitmentLetterDialogType',false);
+          this.$set(this,'safetyCommitmentLetterPropsData',{
+            examId:null,
+            securityCommitmentPath:'',
+            securityCommitmentPrintEnabled:0,
+            securityCommitmentConfirmed:false,
+          });
+          this.getList();
+        })
       },
     },
     beforeRouteLeave(to, from, next) {
@@ -483,6 +536,15 @@
             text-align: center;
             cursor: pointer;
           }
+          .button-border-box{
+            margin:0 0 0 10px;
+            border:1px solid #0183fa;
+            padding:0 10px;
+            border-radius:4px;
+            cursor: pointer;
+            color:#0183fa;
+            font-size:14px;
+          }
         }
       }