|
@@ -0,0 +1,704 @@
|
|
|
|
+<template>
|
|
|
|
+ <div class="create-priv-container">
|
|
|
|
+ <div class="create-header">
|
|
|
|
+ <p class="create-header-title" @click="consData">{{ $t("learnActivity.createEv.createLabel") }}</p>
|
|
|
|
+ <Button class="btn-save" type="text" :loading="isLoading" ghost icon="ios-albums-outline" @click="saveEvaluation" style="margin-right: 30px">
|
|
|
|
+ {{ $t("learnActivity.createEv.publishEv") }}
|
|
|
|
+ </Button>
|
|
|
|
+ <Button class="btn-save" type="text" ghost icon="md-arrow-back" @click="confirmToManage">
|
|
|
|
+ {{ $t("learnActivity.createEv.return") }}
|
|
|
|
+ </Button>
|
|
|
|
+ </div>
|
|
|
|
+ <div class="create-body">
|
|
|
|
+ <div class="evaluation-attr-wrap">
|
|
|
|
+ <p class="wrap-label">{{ $t("learnActivity.createEv.baseInfo") }}</p>
|
|
|
|
+ <div style="width: 100%; height: calc(100% - 45px); padding-top: 15px" class="ivu-select-nochoose light-iview-form light-el-input">
|
|
|
|
+ <vuescroll>
|
|
|
|
+ <Form ref="evaForm" :model="evaluationInfo" label-position="top" class="evaluation-attr-form" label-colon :rules="ruleValidate">
|
|
|
|
+ <FormItem :label="$t('learnActivity.createEv.evName')" prop="name">
|
|
|
|
+ <Input v-special-char v-model="evaluationInfo.name" :placeholder="$t('learnActivity.createEv.evName')"></Input>
|
|
|
|
+ </FormItem>
|
|
|
|
+ <FormItem prop="source">
|
|
|
|
+ <label slot="label" style="width:200px">
|
|
|
|
+ <span>{{ $t("learnActivity.createEv.evMode") }}</span>
|
|
|
|
+ <Tooltip :content="$t('tip.examMode')" transfer theme="light" max-width="300">
|
|
|
|
+ <Icon type="ios-information-circle-outline" color="#1cc0f3" style="margin-left: 5px" />
|
|
|
|
+ </Tooltip>
|
|
|
|
+ </label>
|
|
|
|
+ <Select v-model="evaluationInfo.source" @on-change="checkItemSort">
|
|
|
|
+ <!-- 暂时取消创建课中评量 -->
|
|
|
|
+ <!-- 20230105課中評測放回 -->
|
|
|
|
+ <Option v-for="(item, index) in $GLOBAL.EV_MODE()" v-show="true" :label="item.label" :value="item.value" :key="index" :disabled="index > 1 && (!$store.state.userInfo.hasSchool || !$store.state.user.schoolProfile.svcStatus.VABAJ6NV)">
|
|
|
|
+ <div>
|
|
|
|
+ <span>
|
|
|
|
+ {{ item.label }}
|
|
|
|
+ </span>
|
|
|
|
+ <span @click.stop="toProduct" v-show="index > 1 && scaleStatusText()" class="no-auth-tag">
|
|
|
|
+ {{ scaleStatusText() }}
|
|
|
|
+ </span>
|
|
|
|
+ </div>
|
|
|
|
+ </Option>
|
|
|
|
+ </Select>
|
|
|
|
+ </FormItem>
|
|
|
|
+ <!-- 去掉系统预设考试类型 20220413 -->
|
|
|
|
+ <!-- <FormItem :label="$t('learnActivity.createEv.evType')" prop="type">
|
|
|
|
+ <Select v-model="evaluationInfo.type">
|
|
|
|
+ <Option v-for="(item,index) in $GLOBAL.EV_TYPE()" :value="item.value" :key="index">{{ item.label }}</Option>
|
|
|
|
+ </Select>
|
|
|
|
+ </FormItem> -->
|
|
|
|
+ <!-- 使用级联选择 课程--》班级 -->
|
|
|
|
+ <!-- <FormItem :label="$t('learnActivity.createEv.evTarget')" prop="targets">
|
|
|
|
+ <label slot="label">
|
|
|
|
+ <span>{{ $t("learnActivity.createEv.evTarget") }}</span>
|
|
|
|
+ <Tooltip :content="$t('tip.targetTips')" transfer theme="light" max-width="300">
|
|
|
|
+ <Icon type="ios-information-circle-outline" color="#1cc0f3" style="margin-left: 5px" />
|
|
|
|
+ </Tooltip>
|
|
|
|
+ </label>
|
|
|
|
+ <PrivateTargetSingle :defaultScope="defaultScope" :defTargets="defTargets" @on-scope-change="getScope" @on-target-change="treeChange"></PrivateTargetSingle>
|
|
|
|
+ </FormItem> -->
|
|
|
|
+ <!-- <FormItem :label="$t('learnActivity.createEv.publishType')" prop="publish">
|
|
|
|
+ <Checkbox v-model="evaluationInfo.publish" :true-value="$GLOBAL.PUBLISH_TYPE()[0].value" :false-value="$GLOBAL.PUBLISH_TYPE()[1].value" @on-change="publishChange">
|
|
|
|
+ <span style="margin-left:5px;user-select: none;">{{$GLOBAL.PUBLISH_TYPE()[0].label}}</span>
|
|
|
|
+ </Checkbox>
|
|
|
|
+ </FormItem> -->
|
|
|
|
+ <FormItem :label="$t('learnActivity.createEv.startTime') + '(' + $t('learnActivity.noStartTimeTip') + ')'">
|
|
|
|
+ <DatePicker :options="dateOpt" type="datetime" format="yyyy/MM/dd HH:mm" v-model="startTime" split-panels :placeholder="$t('learnActivity.createEv.sTimeHolder')" style="width: 100%" @on-change="getDate($event, 0)"></DatePicker>
|
|
|
|
+ </FormItem>
|
|
|
|
+ <FormItem :label="$t('learnActivity.createEv.endTime')" prop="endTime">
|
|
|
|
+ <DatePicker :options="dateOpt1" type="datetime" format="yyyy/MM/dd HH:mm" v-model="endTime" split-panels :placeholder="$t('learnActivity.createEv.eTimeHolder')" style="width: 100%" @on-change="getDate($event, 1)"></DatePicker>
|
|
|
|
+ </FormItem>
|
|
|
|
+ <FormItem>
|
|
|
|
+ <Checkbox v-model="evaluationInfo.isCompletion">{{ $t("learnActivity.createEv.completeScore") }}</Checkbox>
|
|
|
|
+ </FormItem>
|
|
|
|
+ </Form>
|
|
|
|
+ </vuescroll>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ <div class="evaluation-question-wrap">
|
|
|
|
+ <div class="evaluation-question-main">
|
|
|
|
+ <Tabs v-model="activeTab" type="card" class="question-main-tabs" name="createTest">
|
|
|
|
+ <TabPane :label="$t('learnActivity.createEv.papersLabel')" name="manualPaper" v-if="createType == 'manualPaper'" :index="1" tab="createTest">
|
|
|
|
+ <ManualPaper ref="manualPaper" @selectPaper="selectPaper" :selectedId="evaluationInfo.paperInfo[0] ? evaluationInfo.paperInfo[0].id : ''"></ManualPaper>
|
|
|
|
+ </TabPane>
|
|
|
|
+ <TabPane :label="$t('learnActivity.createEv.perviewLabel')" name="preview" :index="2" tab="createTest">
|
|
|
|
+ <div class="teacher-preview-container">
|
|
|
|
+ <!--返回顶部-->
|
|
|
|
+ <!-- <div class="back-to-top" :title="$t('learnActivity.mgtScEv.returnTop')" v-show="showBack" @click="handleBackToTop">
|
|
|
|
+ <Icon type="ios-arrow-up" />
|
|
|
|
+ </div> -->
|
|
|
|
+ <BackToTop @on-to-top="handleBackToTop"></BackToTop>
|
|
|
|
+ <vuescroll ref="paper-preview" @handle-scroll="checkBackTop">
|
|
|
|
+ <TestPaper v-if="activeTab == 'preview'" :paper="evaluationInfo.paperInfo.length ? evaluationInfo.paperInfo[0] : { item: [] }" isExamPaper hideSheet></TestPaper>
|
|
|
|
+ </vuescroll>
|
|
|
|
+ </div>
|
|
|
|
+ </TabPane>
|
|
|
|
+ </Tabs>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+</template>
|
|
|
|
+<script>
|
|
|
|
+ import BlobTool from "@/utils/blobTool.js";
|
|
|
|
+ import TestPaper from "@/view/evaluation/index/TestPaper.vue";
|
|
|
|
+ import ManualPaper from "./ManualPaper.vue";
|
|
|
|
+ export default {
|
|
|
|
+ components: {
|
|
|
|
+ TestPaper,
|
|
|
|
+ ManualPaper
|
|
|
|
+ },
|
|
|
|
+ data() {
|
|
|
|
+ const _this = this;
|
|
|
|
+ return {
|
|
|
|
+ dateOpt: {
|
|
|
|
+ disabledDate(date) {
|
|
|
|
+ return date && date.valueOf() < Date.now() - 86400000;
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+ dateOpt1: {
|
|
|
|
+ disabledDate(date) {
|
|
|
|
+ let d = _this.evaluationInfo.startTime ? _this.evaluationInfo.startTime : Date.now();
|
|
|
|
+ return d && d > date.valueOf();
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+ defaultScope: "",
|
|
|
|
+ defTargets: [],
|
|
|
|
+ createType: "manualPaper",
|
|
|
|
+ startTime: "",
|
|
|
|
+ endTime: "",
|
|
|
|
+ isLoading: false,
|
|
|
|
+ ruleValidate: {
|
|
|
|
+ name: [{ required: true, message: this.$t("learnActivity.createEv.errTips1"), trigger: "change" }],
|
|
|
|
+ "type.id": [{ required: true, message: this.$t("learnActivity.createEv.errTips2"), trigger: "change" }],
|
|
|
|
+ source: [{ required: true, message: this.$t("learnActivity.createEv.errTips3"), trigger: "change" }],
|
|
|
|
+ type: [{ required: true, message: this.$t("learnActivity.createEv.errTips4"), trigger: "change" }],
|
|
|
|
+ "examType.id": [{ required: true, message: this.$t("learnActivity.createEv.errTips5"), trigger: "change" }],
|
|
|
|
+ targets: [{ required: true, message: this.$t("learnActivity.createEv.errTips6"), type: "array", trigger: "change" }],
|
|
|
|
+ classes: [{ required: true, message: this.$t("learnActivity.createEv.errTips6"), type: "array", trigger: "change" }],
|
|
|
|
+ publish: [{ required: true, message: this.$t("learnActivity.createEv.errTips7"), trigger: "change" }],
|
|
|
|
+ startTime: [{ required: true, type: "number", message: this.$t("learnActivity.createEv.errTips8"), trigger: "change" }],
|
|
|
|
+ endTime: [{ required: true, type: "number", message: this.$t("learnActivity.createEv.errTips9"), trigger: "change" }]
|
|
|
|
+ },
|
|
|
|
+ activeTab: "manualPaper",
|
|
|
|
+ isMarkMode: false,
|
|
|
|
+ evaluationInfo: {
|
|
|
|
+ name: "",
|
|
|
|
+ targets: [],
|
|
|
|
+ classes: [],
|
|
|
|
+ scope: "",
|
|
|
|
+ type: "", //测试类别
|
|
|
|
+ source: "",
|
|
|
|
+ publish: "0",
|
|
|
|
+ examType: null, //测试类型
|
|
|
|
+ startTime: undefined,
|
|
|
|
+ endTime: undefined,
|
|
|
|
+ paperInfo: [],
|
|
|
|
+ papers: [],
|
|
|
|
+ isCompletion: 0
|
|
|
|
+ },
|
|
|
|
+ mode: "",
|
|
|
|
+ selectBefore: [],
|
|
|
|
+ stuList: [],
|
|
|
|
+ showBack: false,
|
|
|
|
+ isComplete: false
|
|
|
|
+ };
|
|
|
|
+ },
|
|
|
|
+ methods: {
|
|
|
|
+ scaleStatusText() {
|
|
|
|
+ if (!this.$store.state.userInfo.hasSchool) {
|
|
|
|
+ return this.$t("learnActivity.createEv.noSchool");
|
|
|
|
+ }
|
|
|
|
+ if (this.$store.state.user.schoolProfile.svcStatus.VABAJ6NV) {
|
|
|
|
+ return "";
|
|
|
|
+ } else {
|
|
|
|
+ return this.$t("learnActivity.createEv.noAuth");
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+ toProduct() {
|
|
|
|
+ if (this.$store.state.userInfo.hasSchool) {
|
|
|
|
+ this.$router.push({
|
|
|
|
+ name: "product"
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+ getScope(data) {
|
|
|
|
+ this.evaluationInfo.scope = data;
|
|
|
|
+ },
|
|
|
|
+ /**vuescroll回到顶部 */
|
|
|
|
+ handleBackToTop() {
|
|
|
|
+ this.$refs["paper-preview"].scrollTo(
|
|
|
|
+ {
|
|
|
|
+ y: "0"
|
|
|
|
+ },
|
|
|
|
+ 300
|
|
|
|
+ );
|
|
|
|
+ },
|
|
|
|
+ /**
|
|
|
|
+ * 判断是否显示回到顶部按钮
|
|
|
|
+ * @param vertical
|
|
|
|
+ * @param horizontal
|
|
|
|
+ * @param nativeEvent
|
|
|
|
+ */
|
|
|
|
+ checkBackTop(vertical, horizontal, nativeEvent) {
|
|
|
|
+ if (vertical.scrollTop > 100) {
|
|
|
|
+ this.showBack = true;
|
|
|
|
+ } else {
|
|
|
|
+ this.showBack = false;
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+ publishChange(data) {
|
|
|
|
+ if (data == 0) {
|
|
|
|
+ this.startTime = new Date();
|
|
|
|
+ this.evaluationInfo.startTime = Date.now();
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+ treeChange(data) {
|
|
|
|
+ this.evaluationInfo.targets = data.targets;
|
|
|
|
+ this.$refs["evaForm"]?.validate();
|
|
|
|
+ // 1、设置发布对象
|
|
|
|
+ //个人课程
|
|
|
|
+ if (this.evaluationInfo.scope == "private") {
|
|
|
|
+ this.evaluationInfo.stuLists = this.evaluationInfo.targets.map((item) => {
|
|
|
|
+ return item[1];
|
|
|
|
+ });
|
|
|
|
+ this.evaluationInfo.classes = [];
|
|
|
|
+ }
|
|
|
|
+ //学校课程教学班
|
|
|
|
+ else if (this.evaluationInfo.scope == "school" && this.evaluationInfo.targets.length && this.evaluationInfo.targets[0][1] == "teach") {
|
|
|
|
+ this.evaluationInfo.stuLists = this.evaluationInfo.targets.map((item) => {
|
|
|
|
+ return item[2];
|
|
|
|
+ });
|
|
|
|
+ this.evaluationInfo.classes = [];
|
|
|
|
+ this.evaluationInfo.grades = [];
|
|
|
|
+ }
|
|
|
|
+ // 学校课程行政班
|
|
|
|
+ else {
|
|
|
|
+ this.evaluationInfo.classes = this.evaluationInfo.targets.map((item) => {
|
|
|
|
+ return item[2];
|
|
|
|
+ });
|
|
|
|
+ this.evaluationInfo.stuLists = [];
|
|
|
|
+ //补充年级信息
|
|
|
|
+ this.evaluationInfo.grades = [];
|
|
|
|
+ let courseClassList = data.course?.children?.find((item) => item.id == "class")?.children;
|
|
|
|
+ if (courseClassList && courseClassList.length) {
|
|
|
|
+ let sltClass = courseClassList.filter((item) => this.evaluationInfo.classes.includes(item.id));
|
|
|
|
+ let grades = Array.from(new Set(sltClass?.map((item) => item.year)));
|
|
|
|
+
|
|
|
|
+ let gradesInfo = grades.map((item) => {
|
|
|
|
+ return this.$jsFn.getGradeInfoByYear(item, data.course.periodId);
|
|
|
|
+ });
|
|
|
|
+ gradesInfo = gradesInfo.filter((item) => !!item);
|
|
|
|
+ gradesInfo.forEach((item) => {
|
|
|
|
+ item.id = item.id.toString();
|
|
|
|
+ });
|
|
|
|
+ this.evaluationInfo.grades = gradesInfo;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //2、设置评测“学科”
|
|
|
|
+ this.evaluationInfo.subjects = [];
|
|
|
|
+ // 个人课程用课程名称代替学科
|
|
|
|
+ if (this.evaluationInfo.scope == "private") {
|
|
|
|
+ if (data.targets.length && data.course) {
|
|
|
|
+ this.evaluationInfo.subjects.push({
|
|
|
|
+ id: data.course.id,
|
|
|
|
+ name: data.course.name
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ this.evaluationInfo.period = undefined;
|
|
|
|
+ }
|
|
|
|
+ //校本课程用课程关联的学生,并补充学段信息
|
|
|
|
+ else {
|
|
|
|
+ if (data.targets.length && data.course) {
|
|
|
|
+ this.evaluationInfo.subjects.push({
|
|
|
|
+ id: data.course.subjectId,
|
|
|
|
+ name: data.course.subject
|
|
|
|
+ });
|
|
|
|
+ this.evaluationInfo.period = {
|
|
|
|
+ id: data.course.periodId,
|
|
|
|
+ name: data.course.period
|
|
|
|
+ };
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+ /*
|
|
|
|
+ * 返回上一级
|
|
|
|
+ */
|
|
|
|
+ confirmToManage() {
|
|
|
|
+ this.$router.go(-1);
|
|
|
|
+ // if (this.mode == 'private') {
|
|
|
|
+ // this.$router.push({
|
|
|
|
+ // name: 'privExam'
|
|
|
|
+ // })
|
|
|
|
+ // } else {
|
|
|
|
+ // this.$router.push({
|
|
|
|
+ // name: 'schoolExam'
|
|
|
|
+ // })
|
|
|
|
+ // }
|
|
|
|
+ },
|
|
|
|
+ //设置评测模式后检查试卷itemSort
|
|
|
|
+ checkItemSort() {
|
|
|
|
+ this.evaluationInfo.paperInfo = [];
|
|
|
|
+ this.evaluationInfo.papers = [];
|
|
|
|
+ this.activeTab = "manualPaper";
|
|
|
|
+ this.$Message.warning(this.$t('evaluation.markMode.tip5'));
|
|
|
|
+ this.isMarkMode = this.evaluationInfo.source == "2";
|
|
|
|
+ this.$refs.manualPaper.getPaperList();
|
|
|
|
+ },
|
|
|
|
+ /**
|
|
|
|
+ * 处理挑选试卷事件
|
|
|
|
+ * @param data
|
|
|
|
+ */
|
|
|
|
+ selectPaper(data) {
|
|
|
|
+ if (this.evaluationInfo.source == "2" && data.itemSort == 1) {
|
|
|
|
+ return this.$Message.warning(this.$t("learnActivity.createEv.sort3"));
|
|
|
|
+ }
|
|
|
|
+ let simplePaper = data;
|
|
|
|
+ this.$Modal.confirm({
|
|
|
|
+ title: this.$t("learnActivity.createEv.stPaperTitle"),
|
|
|
|
+ content: `${this.$t("learnActivity.createEv.stPaperContent")}${data.name}?`,
|
|
|
|
+ onOk: async () => {
|
|
|
|
+ let fullPaper = await this.$evTools.getFullPaper(simplePaper);
|
|
|
|
+ this.comfirmSelectPaper(simplePaper, fullPaper);
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ },
|
|
|
|
+ comfirmSelectPaper(simplePaper, fullPaper) {
|
|
|
|
+ if (!this.evaluationInfo.name) {
|
|
|
|
+ this.evaluationInfo.name = simplePaper.name;
|
|
|
|
+ }
|
|
|
|
+ fullPaper.examId = "";
|
|
|
|
+ fullPaper.examScope = this.mode;
|
|
|
|
+ fullPaper.examCode = this.$store.state.userInfo.schoolCode;
|
|
|
|
+ this.evaluationInfo.paperInfo[0] = fullPaper;
|
|
|
|
+ this.evaluationInfo.papers[0] = simplePaper;
|
|
|
|
+ this.goToPreview();
|
|
|
|
+ },
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 将日期控件时间格式转成时间戳
|
|
|
|
+ * @param value
|
|
|
|
+ * @param date
|
|
|
|
+ */
|
|
|
|
+ getDate(value, flag) {
|
|
|
|
+ if (flag == 0) {
|
|
|
|
+ this.startTime = value;
|
|
|
|
+ this.evaluationInfo.startTime = new Date(value).getTime();
|
|
|
|
+ if (this.evaluationInfo.startTime >= this.evaluationInfo.endTime) {
|
|
|
|
+ this.endTime = undefined;
|
|
|
|
+ this.evaluationInfo.endTime = undefined;
|
|
|
|
+ }
|
|
|
|
+ } else if (flag == 1) {
|
|
|
|
+ if (value.indexOf("00:00") > 0) {
|
|
|
|
+ value = value.replace("00:00", "23:59:59");
|
|
|
|
+ }
|
|
|
|
+ this.endTime = value;
|
|
|
|
+ this.evaluationInfo.endTime = new Date(value).getTime();
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+ goToPreview() {
|
|
|
|
+ this.activeTab = "preview";
|
|
|
|
+ },
|
|
|
|
+ consData() {
|
|
|
|
+ console.log("evaluationInfo", this.evaluationInfo);
|
|
|
|
+ },
|
|
|
|
+ async saveEvaluation() {
|
|
|
|
+ //表单验证
|
|
|
|
+ let flag = true;
|
|
|
|
+ this.$refs["evaForm"].validate((valid) => {
|
|
|
|
+ if (!valid) {
|
|
|
|
+ this.$Message.warning(this.$t("learnActivity.createEv.formWarning"));
|
|
|
|
+ flag = false;
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ if (!flag) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ //检查试卷是否添加
|
|
|
|
+ if (this.evaluationInfo.papers.length < 1) {
|
|
|
|
+ this.$Message.warning({
|
|
|
|
+ content: this.$t("learnActivity.createEv.paperWarning"),
|
|
|
|
+ duration: 2
|
|
|
|
+ });
|
|
|
|
+ flag = false;
|
|
|
|
+ }
|
|
|
|
+ if (!flag) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ let examId = this.$tools.guid();
|
|
|
|
+ let apiPapers = this.getPaperInfo(examId);
|
|
|
|
+ let requestData = {
|
|
|
|
+ jointEventId: this.$route.params.data.id,
|
|
|
|
+ jointGroupId: this.$route.params.jointGroupId,
|
|
|
|
+ jointScheduleId: this.$route.params.jointScheduleId,
|
|
|
|
+ jointExamId: "",
|
|
|
|
+ creatorId: this.$route.params.data.creatorId,
|
|
|
|
+ name: this.evaluationInfo.name,
|
|
|
|
+ source: this.evaluationInfo.source,
|
|
|
|
+ papers: apiPapers
|
|
|
|
+ }
|
|
|
|
+ //发布成功需要备份试卷数据
|
|
|
|
+
|
|
|
|
+ let privateSas = {};
|
|
|
|
+ if (this.$store.state.user.userProfile) {
|
|
|
|
+ let blobInfo = this.$store.state.user.userProfile;
|
|
|
|
+ privateSas.sas = "?" + blobInfo.blob_sas;
|
|
|
|
+ privateSas.url = blobInfo.blob_uri.slice(0, blobInfo.blob_uri.lastIndexOf(this.$store.state.userInfo.TEAMModelId) - 1);
|
|
|
|
+ privateSas.name = this.$store.state.userInfo.TEAMModelId;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ let schoolSas = {};
|
|
|
|
+ if (this.$store.state.userInfo.hasSchool) {
|
|
|
|
+ schoolSas = {
|
|
|
|
+ sas: "?" + this.$store.state.user.schoolProfile.blob_sas,
|
|
|
|
+ //url: this.$store.state.user.schoolProfile.blob_uri.slice(0, this.$store.state.user.schoolProfile.blob_uri.lastIndexOf(this.$store.state.userInfo.schoolCode) - 1),
|
|
|
|
+ url: this.$store.state.user.schoolProfile.blob_uri.slice(0, this.$store.state.user.schoolProfile.blob_uri.lastIndexOf("/")),
|
|
|
|
+ name: this.$store.state.userInfo.schoolCode
|
|
|
|
+ };
|
|
|
|
+ }
|
|
|
|
+ //校本课程复制到学校容器 个人课程复制到个人容器
|
|
|
|
+ let targetBlob = undefined;
|
|
|
|
+ if (this.evaluationInfo.scope == "school") {
|
|
|
|
+ targetBlob = new BlobTool(schoolSas.url, schoolSas.name, schoolSas.sas, "school");
|
|
|
|
+ } else {
|
|
|
|
+ targetBlob = new BlobTool(privateSas.url, privateSas.name, privateSas.sas, "private");
|
|
|
|
+ }
|
|
|
|
+ let privateBlob = new BlobTool(privateSas.url, privateSas.name, privateSas.sas, "private");
|
|
|
|
+ let schoolBlob = undefined;
|
|
|
|
+ let targetFolder = "jointexam/" + examId + "/paper/";
|
|
|
|
+ let count = 0;
|
|
|
|
+ requestData.papers.forEach(async (item, index) => {
|
|
|
|
+ if (item.blobUrl.indexOf("/exam/") == 0) {
|
|
|
|
+ if (++count == requestData.papers.length) {
|
|
|
|
+ this.$Message.success(this.$t("learnActivity.createEv.publishOk"));
|
|
|
|
+ this.isLoading = false;
|
|
|
|
+ // let route = this.mode + 'Evaluation'
|
|
|
|
+ this.$router.push({
|
|
|
|
+ name: "htMgtExam",
|
|
|
|
+ params: {
|
|
|
|
+ data: this.$route.params.data
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ // 挑选的是校本试卷
|
|
|
|
+ if (item.scope == "school") {
|
|
|
|
+ if (!schoolBlob) schoolBlob = new BlobTool(schoolSas.url, schoolSas.name, schoolSas.sas, "school");
|
|
|
|
+ // 將公用試卷複製一份到該評量的位置
|
|
|
|
+ targetBlob
|
|
|
|
+ .copyFolder(targetFolder + requestData.papers[0].id + "/", item.blobUrl.substring(1), schoolBlob)
|
|
|
|
+ .then()
|
|
|
|
+ .finally(() => {
|
|
|
|
+ if (++count == requestData.papers.length) {
|
|
|
|
+ requestData.jointExamId = examId;
|
|
|
|
+ this.upsertData(requestData);
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ //挑选的是个人试卷
|
|
|
|
+ else if (item.scope == "private") {
|
|
|
|
+ if (!privateBlob) privateBlob = new BlobTool(privateSas.url, privateSas.name, privateSas.sas, "private");
|
|
|
|
+ // 將公用試卷複製一份到該評量的位置
|
|
|
|
+ targetBlob
|
|
|
|
+ .copyFolder(targetFolder + requestData.papers[0].id + "/", item.blobUrl.substring(1), privateBlob)
|
|
|
|
+ .then()
|
|
|
|
+ .finally(() => {
|
|
|
|
+ if (++count == requestData.papers.length) {// 上傳blob成功
|
|
|
|
+ requestData.jointExamId = examId;
|
|
|
|
+ this.upsertData(requestData);
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ },
|
|
|
|
+ // 呼叫寫入API
|
|
|
|
+ upsertData(requestData){
|
|
|
|
+ this.$api.htcommunity.jointExamUpsert(requestData).then(// 呼叫API寫入評量
|
|
|
|
+ (res) => {
|
|
|
|
+ this.isComplete = true;
|
|
|
|
+ if (res.err === "") {
|
|
|
|
+ this.$Message.success(this.$t("learnActivity.createEv.publishOk"));
|
|
|
|
+ this.isLoading = false;
|
|
|
|
+ let route = this.mode + 'Evaluation'
|
|
|
|
+ this.$router.push({
|
|
|
|
+ name: "htMgtExam",
|
|
|
|
+ params: {
|
|
|
|
+ data: this.$route.params.data
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ } else {
|
|
|
|
+ // this.$Message.error('API ERROR!')
|
|
|
|
+ this.$Message.error(this.$t("learnActivity.mark.saveErr"));
|
|
|
|
+ this.isLoading = false;
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+ (err) => {
|
|
|
|
+ this.$Message.error(this.$t("learnActivity.mgtScEv.updErr"));
|
|
|
|
+ })
|
|
|
|
+ },
|
|
|
|
+ //拼接API需要的paper数据
|
|
|
|
+ getPaperInfo(examId) {
|
|
|
|
+ let data = this.evaluationInfo.papers;
|
|
|
|
+ let rule = this.evaluationInfo.paperInfo;
|
|
|
|
+ if (data) {
|
|
|
|
+ let paperDto = [];
|
|
|
|
+ let typeArr = ["single", "multiple", "judge"];
|
|
|
|
+ if (this.evaluationInfo.isCompletion) {
|
|
|
|
+ typeArr.push("complete");
|
|
|
|
+ }
|
|
|
|
+ for (let i = 0; i < data.length; i++) {
|
|
|
|
+ if (data[i].blob.indexOf("/exam/") == 0) {
|
|
|
|
+ paperDto.push(data[i]);
|
|
|
|
+ } else {
|
|
|
|
+ let paper = {};
|
|
|
|
+ paper.id = data[i].id;
|
|
|
|
+ paper.code = data[i].code;
|
|
|
|
+ paper.name = data[i].name;
|
|
|
|
+ paper.blob = "/jointexam/" + examId + "/paper/" + data[i].id;// 公用試卷庫的blob位置
|
|
|
|
+ paper.blobUrl = data[i].blob;// 新增評量試卷放的blob位置
|
|
|
|
+ paper.scope = data[i].scope;
|
|
|
|
+ paper.sheet = data[i].sheet;
|
|
|
|
+ paper.periodId = data[i].periodId;
|
|
|
|
+ paper.multipleRule = rule[i].multipleRule;
|
|
|
|
+ paper.answers = [];
|
|
|
|
+ paper.point = [];
|
|
|
|
+ paper.knowledge = [];
|
|
|
|
+ paper.field = [];
|
|
|
|
+ paper.type = []; //后面新增字段, 保存每个题目类型
|
|
|
|
+ for (let k = 0; k < rule[i].item.length; k++) {
|
|
|
|
+ // scoring中只有客观题答案,这里改为从题目中获取客观题和填空题的答案
|
|
|
|
+ if (rule[i].item[k].children.length) {
|
|
|
|
+ for (let m = 0; m < rule[i].item[k].children.length; m++) {
|
|
|
|
+ paper.answers.push(typeArr.includes(rule[i].item[k].children[m].type) ? (rule[i].item[k].children[m].answer ? rule[i].item[k].children[m].answer : []) : []);
|
|
|
|
+ paper.point.push(rule[i].item[k].children[m].score);
|
|
|
|
+ paper.knowledge.push(rule[i].item[k].children[m].knowledge ? rule[i].item[k].children[m].knowledge : []);
|
|
|
|
+ paper.field.push(rule[i].item[k].children[m].field ? rule[i].item[k].children[m].field : []);
|
|
|
|
+ paper.type.push(rule[i].item[k].children[m].type); //后面新增字段, 保存每个题目类型
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ paper.answers.push(typeArr.includes(rule[i].item[k].type) ? (rule[i].item[k].answer ? rule[i].item[k].answer : []) : []);
|
|
|
|
+ paper.point.push(rule[i].item[k].score);
|
|
|
|
+ paper.knowledge.push(rule[i].item[k].knowledge ? rule[i].item[k].knowledge : []);
|
|
|
|
+ paper.field.push(rule[i].item[k].field ? rule[i].item[k].field : []);
|
|
|
|
+ paper.type.push(rule[i].item[k].type); //后面新增字段, 保存每个题目类型
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ /* for (let k = 0; k < rule[i].slides.length; k++) {
|
|
|
|
+ if (rule[i].slides[k].type !== 'compose') {
|
|
|
|
+ paper.answers.push(rule[i].slides[k].scoring.ans ? rule[i].slides[k].scoring.ans : [])
|
|
|
|
+ paper.point.push(rule[i].slides[k].scoring.score)
|
|
|
|
+ paper.knowledge.push(rule[i].slides[k].scoring.knowledge ? rule[i].slides[k].scoring.knowledge : [])
|
|
|
|
+ paper.field.push(rule[i].slides[k].scoring.field ? rule[i].slides[k].scoring.field : [])
|
|
|
|
+ paper.type.push(rule[i].slides[k].type) //后面新增字段, 保存每个题目类型
|
|
|
|
+ }
|
|
|
|
+ } */
|
|
|
|
+ paper.subjectName = this.evaluationInfo.subjects && this.evaluationInfo.subjects.length ? this.evaluationInfo.subjects[0].name : "";
|
|
|
|
+ paper.subjectId = this.evaluationInfo.subjects && this.evaluationInfo.subjects.length ? this.evaluationInfo.subjects[0].id : "";
|
|
|
|
+ paperDto.push(paper);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return paperDto;
|
|
|
|
+ } else {
|
|
|
|
+ return [];
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+ //复制或编辑评测初始化数据
|
|
|
|
+ async initData(data) {
|
|
|
|
+ let subjects = this._.cloneDeep(data.subjects);
|
|
|
|
+ data.id = "";
|
|
|
|
+ data.name = `${data.name}(${this.$t("learnActivity.mgtScEv.copy")})`;
|
|
|
|
+ this.startTime = new Date(data.startTime);
|
|
|
|
+ this.endTime = new Date(data.endTime);
|
|
|
|
+ let pp = {
|
|
|
|
+ "@DESC": "createTime",
|
|
|
|
+ code: data.papers[0].code?.replace("Paper-", ""),
|
|
|
|
+ scope: data.papers[0].scope,
|
|
|
|
+ id: data.papers.map((item) => item.id)
|
|
|
|
+ };
|
|
|
|
+ data.paperInfo = [];
|
|
|
|
+ data.papers = [];
|
|
|
|
+ this.defTargets = data.targets;
|
|
|
|
+ this.defaultScope = data.scope;
|
|
|
|
+ data.publish = "0";
|
|
|
|
+ this.evaluationInfo = data;
|
|
|
|
+ console.log(JSON.stringify(this.evaluationInfo));
|
|
|
|
+ try {
|
|
|
|
+ let paperInfo = await this.$api.learnActivity.FindExamPaper(pp);
|
|
|
|
+ if (!paperInfo.length) {
|
|
|
|
+ // pp.sc
|
|
|
|
+ paperInfo = await this.$api.learnActivity.FindExamPaper(pp);
|
|
|
|
+ }
|
|
|
|
+ for (let i = 0; i < paperInfo.papers.length; i++) {
|
|
|
|
+ let fullPaper = await this.$evTools.getFullPaper(paperInfo.papers[i]);
|
|
|
|
+ this.comfirmSelectPaper(paperInfo.papers[i], fullPaper);
|
|
|
|
+ }
|
|
|
|
+ this.evaluationInfo.subjects = subjects;
|
|
|
|
+ } catch (e) {}
|
|
|
|
+ this.activeTab = "preview";
|
|
|
|
+ this.endTime = new Date(new Date(new Date().toLocaleDateString()).getTime() + 2 * 24 * 60 * 60 * 1000 - 1);
|
|
|
|
+ this.evaluationInfo.endTime = new Date(new Date().toLocaleDateString()).getTime() + 2 * 24 * 60 * 60 * 1000 - 1;
|
|
|
|
+ // data.id = ''
|
|
|
|
+ // data.name = `${data.name}(${this.$t('learnActivity.mgtScEv.copy')})`
|
|
|
|
+ // this.startTime = new Date(data.startTime)
|
|
|
|
+ // this.endTime = new Date(data.endTime)
|
|
|
|
+ // data.paperInfo = []
|
|
|
|
+ // this.defTargets = data.targets
|
|
|
|
+ // for (let i = 0; i < data.papers.length; i++) {
|
|
|
|
+ // let paper = this._.cloneDeep(data.papers[i])
|
|
|
|
+ // data.paperInfo.push(paper)
|
|
|
|
+ // data.paperInfo[i].subjectId = data.subjects[i].id
|
|
|
|
+ // data.paperInfo[i].subjectName = data.subjects[i].name
|
|
|
|
+ // }
|
|
|
|
+ // data.publish = '0'
|
|
|
|
+ // this.evaluationInfo = data
|
|
|
|
+ // this.activeTab = 'preview'
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+ mounted(){
|
|
|
|
+ // 如果取不到活動資料則返回活動列表頁
|
|
|
|
+ if(!this.$route.params.data){
|
|
|
|
+ this.$router.push({
|
|
|
|
+ name: "htMgtHome"
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+ created() {
|
|
|
|
+ // 处理默认时间
|
|
|
|
+ // this.startTime = new Date()
|
|
|
|
+ // this.evaluationInfo.startTime = new Date().getTime()
|
|
|
|
+ this.endTime = new Date(new Date(new Date().toLocaleDateString()).getTime() + 2 * 24 * 60 * 60 * 1000 - 1);
|
|
|
|
+ this.evaluationInfo.endTime = new Date(new Date().toLocaleDateString()).getTime() + 2 * 24 * 60 * 60 * 1000 - 1;
|
|
|
|
+ //判断创建个人还是校本评测
|
|
|
|
+ this.mode = "private";
|
|
|
|
+ //编辑评测逻辑
|
|
|
|
+ let routerData = this.$route.params.evaluationInfo;
|
|
|
|
+ if (routerData) {
|
|
|
|
+ // console.log(JSON.stringify(routerData))
|
|
|
|
+ console.log(routerData.subjects);
|
|
|
|
+ this.initData(routerData);
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+ beforeRouteLeave(to, from, next) {
|
|
|
|
+ if (this.isComplete) {
|
|
|
|
+ if (to.name == "answerSheet") {
|
|
|
|
+ from.meta.isKeep = true;
|
|
|
|
+ } else {
|
|
|
|
+ from.meta.isKeep = false;
|
|
|
|
+ }
|
|
|
|
+ next();
|
|
|
|
+ } else {
|
|
|
|
+ this.$Modal.confirm({
|
|
|
|
+ title: this.$t("evaluation.newExercise.modalTip"),
|
|
|
|
+ content: this.$t("learnActivity.createEv.unSaveTip"),
|
|
|
|
+ cancelText: this.$t("auth.cancel"),
|
|
|
|
+ onOk: () => {
|
|
|
|
+ if (to.name == "answerSheet") {
|
|
|
|
+ from.meta.isKeep = true;
|
|
|
|
+ } else {
|
|
|
|
+ from.meta.isKeep = false;
|
|
|
|
+ }
|
|
|
|
+ next();
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ };
|
|
|
|
+</script>
|
|
|
|
+<style scoped lang="less">
|
|
|
|
+ @import "./CreatePrivEva.less";
|
|
|
|
+</style>
|
|
|
|
+<style lang="less">
|
|
|
|
+ .one-hidden-check-box {
|
|
|
|
+ .el-cascader-menu:nth-child(1) .el-checkbox {
|
|
|
|
+ display: none;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ .teacher-preview-container .paper-main-wrap {
|
|
|
|
+ padding: 0px;
|
|
|
|
+ margin-top: 0px;
|
|
|
|
+ }
|
|
|
|
+ .evaluation-attr-wrap .ivu-form .ivu-form-item-label {
|
|
|
|
+ color: var(--second-text-color);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ .evaluation-question-main .ivu-tabs-tab-active {
|
|
|
|
+ font-weight: 600;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ .evaluation-question-main .ivu-tabs .ivu-tabs-content-animated {
|
|
|
|
+ height: 100%;
|
|
|
|
+ margin-bottom: 10px;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ .evaluation-question-main .ivu-tabs-bar {
|
|
|
|
+ border-color: #404040;
|
|
|
|
+ margin-bottom: 0px;
|
|
|
|
+ border-bottom: none;
|
|
|
|
+ }
|
|
|
|
+ .evaluation-question-main .ivu-tabs.ivu-tabs-card .ivu-tabs-bar .ivu-tabs-tab {
|
|
|
|
+ margin-right: 2px;
|
|
|
|
+ }
|
|
|
|
+</style>
|