upon hai 10 meses
pai
achega
42d06d3db1

+ 3 - 0
TEAMModelOS/ClientApp/public/lang/en-US.js

@@ -8006,6 +8006,9 @@ const LANG_EN_US = {
         signup:'Sign up',
         activityPlace:'Place',        
         fileUrl:'FileUrl',
+        teacher:'teacher',
+        course:'course',
+        class:'class',
     },
     activity: {
         scoreWord: {

+ 3 - 0
TEAMModelOS/ClientApp/public/lang/zh-CN.js

@@ -8007,6 +8007,9 @@ const LANG_ZH_CN = {
         signup:'报名',
         activityPlace:'地点',        
         fileUrl:'档案连结',
+        teacher:'老师',
+        course:'课程',
+        class:'班级',
     },
     activity: {
         scoreWord: {

+ 3 - 0
TEAMModelOS/ClientApp/public/lang/zh-TW.js

@@ -8007,6 +8007,9 @@ const LANG_ZH_TW = {
         signup:'報名',
         activityPlace:'地點',        
         fileUrl:'檔案連結',
+        teacher:'老師',
+        course:'課程',
+        class:'班級',
     },
     activity: {
         scoreWord: {

+ 8 - 0
TEAMModelOS/ClientApp/src/api/htcommunity.js

@@ -28,6 +28,14 @@ export default {
     jointExamFind: function(data) {
         return post('/joint/exam/find', data)
     },
+    // 取得學生評量結果
+    commonExamFindSummaryRecord: function(data) {
+        return post('/common/exam/find-summary-record', data)
+    },
+    // 新建變更統測評量
+    jointExamUpsert: function(data) {
+        return post('/joint/exam/upsert', data)
+    },
    
    
    

+ 9 - 0
TEAMModelOS/ClientApp/src/router/routes.js

@@ -759,6 +759,15 @@ export const routes = [{
             isKeep: true
         }
     },
+    {
+        path: 'htCreateEva',
+        name: 'htCreateEva',
+        component: () => import('@/view/learnactivity/htCreateEva.vue'),
+        meta: {
+            activeName: '',
+            isKeep: true
+        }
+    },    
     // 创建个人评测
     {
         path: 'createPrivExam',

+ 2 - 1
TEAMModelOS/ClientApp/src/store/module/config.js

@@ -102,7 +102,8 @@ export default {
             if (!stationSetting) {
                 stationSetting = {}
                 stationSetting.station = 'test'
-                stationSetting.srvAdr = 'China'
+                //stationSetting.srvAdr = 'China'
+                stationSetting.srvAdr = 'Global'
                 //这里异常如果本地为 null 本地测试会重复设置为null
                 // if (localStorage.getItem('srvAdr')) stationSetting.srvAdr = localStorage.getItem('srvAdr')
             }

+ 7 - 0
TEAMModelOS/ClientApp/src/view/htcommunity/htMgtExam.less

@@ -176,4 +176,11 @@
     &:hover{
         color: #2d8cf0;
     }
+}
+.selected,
+.fistTag:first-child {
+  background: white;
+  color: #606266;
+  font-weight: bolder;
+  border: white 2px solid;
 }

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 756 - 845
TEAMModelOS/ClientApp/src/view/htcommunity/htMgtExam.vue


+ 1 - 0
TEAMModelOS/ClientApp/src/view/learnactivity/CreatePrivEva.vue

@@ -483,6 +483,7 @@
 								}
 								return;
 							}
+							debugger
 							// 挑选的是校本试卷
 							if (item.scope == "school") {
 								if (!schoolBlob) schoolBlob = new BlobTool(schoolSas.url, schoolSas.name, schoolSas.sas, "school");

+ 5 - 1
TEAMModelOS/ClientApp/src/view/learnactivity/ManualPaper.vue

@@ -300,7 +300,11 @@ export default {
                 if (this.source) {
                     this.scope = this.source
                 } else {
-                    this.scope = this.$route.name == 'createPrivEva' ? this.$store.state.userInfo.TEAMModelId : this.$store.state.userInfo.schoolCode
+                    if(this.$route.name == 'createPrivEva' || this.$route.name == 'htCreateEva'){
+                        this.scope = this.$store.state.userInfo.TEAMModelId;
+                    } else {
+                        this.scope = this.$store.state.userInfo.schoolCode;
+                    }                    
                 }
             },
             immediate: true

+ 700 - 0
TEAMModelOS/ClientApp/src/view/learnactivity/htCreateEva.vue

@@ -0,0 +1,700 @@
+<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 apiPapers = this.getPaperInfo();
+				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 examId = this.$tools.guid();
+				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.blob.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.blob.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.blob.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() {
+				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 = data[i].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>

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1436 - 0
TEAMModelOS/ClientApp/src/view/learnactivity/tabs/htAnswerTable.vue