SanHQin пре 4 месеци
родитељ
комит
d503b88933

+ 1 - 1
dist/index.html

@@ -32,7 +32,7 @@
       width: 100%;
       background: #e6eaf0;
       font-family: '黑体';
-    }</style><link href=./static/css/app.3eb815cf8219036b2f594c61b5a36c3b.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=./static/js/manifest.161e82026ac2ae03ab6f.js></script><script type=text/javascript src=./static/js/vendor.bb486323f0fa002ba2e7.js></script><script type=text/javascript src=./static/js/app.afde9fc35ba410f7dd95.js></script></body></html><script>function stopSafari() {
+    }</style><link href=./static/css/app.9081293af2bd4241aa93580b1f8990c2.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=./static/js/manifest.161e82026ac2ae03ab6f.js></script><script type=text/javascript src=./static/js/vendor.bb486323f0fa002ba2e7.js></script><script type=text/javascript src=./static/js/app.6f325a8a48860d6e2d3a.js></script></body></html><script>function stopSafari() {
     //阻止safari浏览器双击放大功能
     let lastTouchEnd = 0  //更新手指弹起的时间
     document.documentElement.addEventListener("touchstart", function (event) {

Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
dist/static/css/app.9081293af2bd4241aa93580b1f8990c2.css


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
dist/static/css/app.9081293af2bd4241aa93580b1f8990c2.css.map


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
dist/static/js/app.6f325a8a48860d6e2d3a.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
dist/static/js/app.6f325a8a48860d6e2d3a.js.map


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
dist/static/js/manifest.161e82026ac2ae03ab6f.js.map


+ 5 - 2
src/components/pages/classroomObservation/components/previewVideoDialog.vue

@@ -16,8 +16,12 @@
 		  title="视频预览"
 		  :visible.sync="dialogVisible"
 			show-close
+      :modal="true"
+      :close-on-click-modal="true"
 			top="3vh"
 			width="60vw"
+      class="videoPreview"
+      :append-to-body="true"
 			:before-close="handleClose">
 			<div class="video-player-box" v-if="option.sources!=''">
 				<video-player
@@ -62,7 +66,7 @@ export default {
     };
   },
   watch: {
-    
+
   },
   methods: {
     open(url) {
@@ -81,7 +85,6 @@ export default {
 </script>
 
 <style scoped>
-
 .video-player-box{
 	width: 100%;
 	height: 100%;

+ 352 - 131
src/components/pages/classroomObservation/dialog/batchCreationClassDialog.vue

@@ -35,25 +35,54 @@
             >
           </div>
           <div class="b_n_right">
-            <span>总计3个</span>
+            <span>总计{{ dataList.length }}个</span>
           </div>
         </div>
         <div class="b_bottom">
           <div class="b_b_operation">
             <div class="b_b_o_left">
-              <span>当前进度 10/12</span>
+              <span
+                >当前进度 {{ progress }}/{{
+                  dataList.filter(
+                    i =>
+                      selectStatus == "99" ||
+                      statusList
+                        .find(i => i.value == selectStatus)
+                        .allow.includes(i.state)
+                  ).length
+                }}</span
+              >
             </div>
             <div class="b_b_o_right">
-              <div><el-checkbox v-model="selectAll">全选</el-checkbox></div>
+              <div>
+                <el-checkbox v-model="selectAll" :indeterminate="indeterminate"
+                  >全选</el-checkbox
+                >
+              </div>
               <span>
                 <img
+                  @click="delSelectBtn"
                   src="../../../../assets/icon/classroomObservation/del2.svg"
                 />
               </span>
             </div>
           </div>
           <div class="b_b_list">
-            <batchClassCard v-for="item in 10" :key="item" />
+            <batchClassCard
+              v-for="item in dataList"
+              :data="item"
+              :isSelect="selectList.includes(item.id)"
+              :key="item.id"
+              v-show="
+                selectStatus === '99' ||
+                  statusList
+                    .find(i => i.value === selectStatus)
+                    .allow.includes(item.status)
+              "
+              @changeChecked="changeCardChecked"
+              @editBaseMessage="editBaseMessage"
+              @changeData="changeData"
+            />
           </div>
         </div>
       </div>
@@ -61,6 +90,10 @@
         ref="uploadFileToCreateClassDialogRef"
         @success="uploadFileSuccess"
       />
+      <editBaseMessageDialog
+        ref="editBaseMessageDialogRef"
+        @success="editBaseMessageSuccess"
+      />
     </el-dialog>
   </div>
 </template>
@@ -68,92 +101,98 @@
 <script>
 import batchClassCard from "../newComponents/batchClassCard.vue";
 import uploadFileToCreateClassDialog from "./uploadFileToCreateClassDialog.vue";
+import editBaseMessageDialog from "./editBaseMessageDialog.vue";
 import { v4 as uuidv4 } from "uuid";
 export default {
   components: {
     batchClassCard,
-    uploadFileToCreateClassDialog
+    uploadFileToCreateClassDialog,
+    editBaseMessageDialog
   },
   data() {
     return {
       statusList: [
-        { label: "全部", value: "0" },
-        { label: "已完成", value: "1" },
-        { label: "处理中", value: "2" },
-        { label: "等待处理", value: "3" }
+        { label: "全部", value: "99", allow: [] },
+        { label: "已完成", value: "2", allow: ["2"] },
+        { label: "处理中", value: "1", allow: ["1"] },
+        { label: "等待处理", value: "0", allow: ["0"] },
+        { label: "停止中",value:"3",allow:['3']}
       ],
       userId: this.$route.query["userid"],
-      selectStatus: "0",
+      selectStatus: "99",
       show: false,
-      selectAll: false,
-      dataList: [
-        {
-          id: "1",
-          name: "文件名称文件名称文件名称",
-          create_at: "2025-05-07 16.05.03",
-          remarks: "备注1",
-          jsonData: {
-            baseMessage: {
-              courseName: "",
-              teacherName: "",
-              time: "",
-              grade: "",
-              subject: "",
-              textbook: "",
-              studentNum: 0,
-              imageList: {
-                fileList1: [],
-                fileList2: [],
-                fileList3: [],
-                NephogramList: [],
-                videoList: []
-              }
-            },
-            tagList: [
-              { value: 0, name: "通用课堂分析", loading: false },
-              { value: 1, name: "学科课堂分析", loading: false },
-              { value: 2, name: "扩展分析", loading: false }
-            ],
-            steps: [
-              {
-                type: "uploadFile",
-                text: "上传文件",
-                status: "0",
-                progress: "0"
-              },
-              {
-                type: "transcription",
-                text: "文本转录",
-                status: "0",
-                progress: "0"
-              },
-              {
-                type: "automaticCoding",
-                text: "自动编码",
-                status: "0",
-                progress: "0"
-              },
-              {
-                type: "generateReport",
-                text: "生成报告",
-                status: "0",
-
-                progress: "0"
-              }
-            ],
-            analysisList:[],
-            fileData:{
-              name: "文件名称",
-              url: "",
-              type: "text/plain",
-              size: "10kb"
-            },
-            automaticCoding:false,
-          }
-        }
-      ]
+      selectList: [],
+      dataList: []
     };
   },
+  computed: {
+    selectAll: {
+      get() {
+        let _result = false;
+
+        let _data = this.dataList.filter(
+          i =>
+            this.selectStatus === "99" ||
+            this.statusList
+              .find(i2 => i2.value === this.selectStatus)
+              .allow.includes(i.status)
+        );
+
+        if (_data.length > 0 && _data.length === this.selectList.length) {
+          _result = true;
+        }
+        return _result;
+      },
+      set(value) {
+        if (value) {
+          this.selectList = this.dataList
+            .filter(
+              i =>
+                this.selectStatus === "99" ||
+                this.statusList
+                  .find(i2 => i2.value === this.selectStatus)
+                  .allow.includes(i.status)
+            )
+            .map(i => i.id);
+          this.$forceUpdate();
+        } else {
+          this.selectList = [];
+        }
+      }
+    },
+    indeterminate() {
+      let _result = false;
+
+      let _data = this.dataList.filter(
+        i =>
+          this.selectStatus === "99" ||
+          this.statusList
+            .find(i2 => i2.value === this.selectStatus)
+            .allow.includes(i.status)
+      );
+
+      if (_data.length > this.selectList.length && this.selectList.length > 0) {
+        _result = true;
+      }
+
+      return _result;
+    },
+    progress() {
+      return this.dataList.filter(
+        i =>
+          i.status == "2" &&
+          (this.selectStatus == "99" ||
+            this.statusList
+              .find(i2 => i2.value == this.selectStatus)
+              .allow.includes(i.state))
+      ).length;
+    }
+  },
+  watch: {
+    selectList(newValue, oldValue) {
+      console.log(newValue, oldValue);
+    }
+  },
   methods: {
     open() {
       this.show = true;
@@ -164,24 +203,24 @@ export default {
     init() {},
     changeStatus(newValue) {
       this.selectStatus = newValue;
+      this.selectList = [];
     },
     uploadFile() {
       this.$refs.uploadFileToCreateClassDialogRef.open();
     },
+    //批量上传文件成功
     async uploadFileSuccess(data) {
       this.$refs.uploadFileToCreateClassDialogRef.close();
-      console.log("上传文件成功", data);
       let { fileList, automaticCoding, analysisTemplate } = data;
       this.loading = true;
 
-      let fileDataList =  fileList.map(i => i.successData);
+      let fileDataList = fileList.map(i => i.successData);
 
       let _tempData = await this.getTemplateData(analysisTemplate[1]);
 
       let _analysisList = JSON.parse(_tempData.tips);
       let tagList = _analysisList.find(i => i.isOtherData);
 
-
       if (!tagList) {
         tagList = [
           { value: 0, name: "通用课堂分析", loading: false },
@@ -192,20 +231,22 @@ export default {
 
       let batch = uuidv4();
 
-      _analysisList = _analysisList.fileList(i=>(!i.isOtherData && i.jsonData.name!="词频词汇分析"));
-
-      fileDataList.forEach(i=>{
-
+      _analysisList = _analysisList.filter(
+        i => !i.isOtherData && i.jsonData.name != "词频词汇分析"
+      );
 
+      let promiseList = [];
 
+      fileDataList.forEach(i => {
         let data = {
-          id: "1",
-          name: i.name,
+          id: uuidv4(),
           create_at: "2025-05-07 16.05.03",
           remarks: "备注",
-          batch:batch,
+          batch: batch,
+          status: "3",
+          createId: "",
           jsonData: {
-            file_ids:"",
+            file_ids: "",
             baseMessage: {
               courseName: i.name,
               teacherName: "",
@@ -215,7 +256,7 @@ export default {
               textbook: "",
               studentNum: 0,
               imageList: {
-                fileList:[],
+                fileList: [],
                 fileList1: [],
                 fileList2: [],
                 fileList3: [],
@@ -225,18 +266,18 @@ export default {
             },
             tagList: tagList,
             steps: [],
-            analysisList:_analysisList,
-            fileData:i,
-            automaticCoding:automaticCoding,
+            analysisList: _analysisList,
+            fileData: i,
+            automaticCoding: automaticCoding
           }
-        }
+        };
 
-        if(i.type == "text/plain"){
-          data.jsonData.steps= [
+        if (i.type == "text/plain") {
+          data.jsonData.steps = [
             {
               type: "uploadFile",
               text: "上传文件",
-              status: "1",
+              status: "1"
             },
             {
               type: "transcription",
@@ -247,7 +288,7 @@ export default {
             {
               type: "getFileIds",
               text: "获取文件fileid",
-              status: "0",
+              status: "0"
             },
             {
               type: "generateReport",
@@ -255,19 +296,21 @@ export default {
               status: "0",
               progress: "0"
             }
-          ]
-        }else if(i.type == "audio/wav"){
-          data.jsonData.baseMessage.imageList.fileList = [{
-            name: i.name,
-            status: "success",
-					  url: i.url,
-            uid:"1"
-          }]
-          data.jsonData.steps= [
-          {
+          ];
+        } else if (i.type == "audio/wav") {
+          data.jsonData.baseMessage.imageList.fileList = [
+            {
+              name: i.name,
+              status: "success",
+              url: i.url,
+              uid: "1"
+            }
+          ];
+          data.jsonData.steps = [
+            {
               type: "uploadFile",
               text: "上传文件",
-              status: "1",
+              status: "1"
             },
             {
               type: "transcription",
@@ -284,7 +327,7 @@ export default {
             {
               type: "getFileIds",
               text: "获取文件fileid",
-              status: "0",
+              status: "0"
             },
             {
               type: "generateReport",
@@ -292,23 +335,26 @@ export default {
               status: "0",
               progress: "0"
             }
-          ]
-        }else if(i.type == "video/mp4"){
-          data.jsonData.baseMessage.imageList.videoList = [{
-            name: i.name,
-            status: "success",
-					  url: i.url,
-            uid:"1"
-          }]
-          data.jsonData.steps= [{
+          ];
+        } else if (i.type == "video/mp4") {
+          data.jsonData.baseMessage.imageList.videoList = [
+            {
+              name: i.name,
+              status: "success",
+              url: i.url,
+              uid: "1"
+            }
+          ];
+          data.jsonData.steps = [
+            {
               type: "uploadFile",
               text: "上传文件",
-              status: "1",
+              status: "1"
             },
             {
-              type:"getVideoVoice",
-              text:"视频提取音频",
-              status:"0",
+              type: "getVideoVoice",
+              text: "视频提取音频",
+              status: "0",
               progress: "0"
             },
             {
@@ -326,18 +372,57 @@ export default {
             {
               type: "getFileIds",
               text: "获取文件fileid",
-              status: "0",
+              status: "0"
             },
             {
               type: "generateReport",
               text: "生成报告",
               status: "0",
               progress: "0"
-            }]
+            }
+          ];
         }
-      })
 
+        promiseList.push(
+          new Promise((resolve, reject) => {
+            const params = [
+              {
+                remarks: data.remarks,
+                status: data.status,
+                json: JSON.stringify(data.jsonData),
+                batch: data.batch,
+                createId: data.createId,
+                userId: this.userId
+              }
+            ];
+            console.log(params);
+            this.ajax
+              .post(this.$store.state.api + "insert_classroomTask", params)
+              .then(res => {
+                const _data = res.data[0][0];
+                if (_data.id) {
+                  data.id = _data.id;
+                  this.dataList.push(data);
+                }
+                resolve();
+              })
+              .catch(err => {
+                console.error(err);
+                reject(err);
+              });
+          })
+        );
+      });
+      console.log(promiseList);
+      Promise.all(promiseList)
+        .then(res => {
+          this.$message.success("创建成功");
+        })
+        .catch(err => {
+          console.log("创建出错", err);
+        });
     },
+    //获取模板的数据
     getTemplateData(tid) {
       return new Promise(resolve => {
         let params = {
@@ -352,9 +437,144 @@ export default {
             resolve(_data);
           });
       });
+    },
+    changeCardChecked({ type = 0, id }) {
+      if (type === 0 && !this.selectList.includes(id)) {
+        this.selectList.push(id);
+      } else if (type === 1 && this.selectList.push(id)) {
+        this.selectList = this.selectList.filter(i => i != id);
+      }
+    },
+    //修改课堂的baseMessage按钮
+    editBaseMessage(id) {
+      let _data = this.dataList.find(i => i.id === id);
+      if (_data) {
+        this.$refs.editBaseMessageDialogRef.open({
+          editId: _data.id,
+          message: _data.jsonData.baseMessage
+        });
+      } else {
+        this.$message.error("未查询到该数据");
+      }
+    },
+    //修改课堂的baseMessage
+    editBaseMessageSuccess({ editId, message }) {
+      if (editId) {
+        this.dataList.find(i => i.id === editId).jsonData.baseMessage = message;
+        this.$forceUpdate();
+        this.$refs.editBaseMessageDialogRef.close();
+        this.updateTask(editId);
+      }
+    },
+    // 删除选择的数据
+    delSelectBtn() {
+      let _delList = this.dataList.filter(
+        i =>
+          this.selectList.includes(i.id) &&
+          (this.selectStatus === "99" ||
+            this.statusList
+              .find(i2 => i2.value === this.selectStatus)
+              .allow.includes(i.status))
+      );
+
+      if (_delList.length <= 0) return this.$message.info("请先选择列表");
+      this.$confirm("您确定要删除选中的数据吗?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      })
+        .then(() => {
+          // 确定删除
+          let params = [
+            {
+              idList: _delList.map(i => i.id).join(","),
+              userId: this.userId
+            }
+          ];
+
+          this.ajax
+            .post(this.$store.state.api + "delete_classroomTask", params)
+            .then(res => {
+              if (res.data > 0) {
+                this.$message.success("删除成功");
+                this.dataList = this.dataList.filter(
+                  i => !_delList.find(del => del.id === i.id)
+                );
+                this.selectList = [];
+              }
+            })
+            .catch(err => {
+              console.log(err);
+              this.$message.error("删除失败");
+            });
+        })
+        .catch(() => {
+          // 取消删除
+        });
+    },
+    //获取任务列表
+    getTaskList() {
+      let params = {
+        userId: this.userId
+      };
+      this.ajax
+        .get(this.$store.state.api + "select_classroomTask", params)
+        .then(res => {
+          let _data = res.data[0];
+          if (_data.length > 0) {
+            _data.forEach(i => (i.jsonData = JSON.parse(i.jsonData)));
+            this.dataList = _data;
+          }
+        });
+    },
+    updateTask(id) {
+      return new Promise((resolve, reject) => {
+        let _data = this.dataList.find(i => i.id === id);
+        if (_data) {
+          let params = [
+            {
+              id: _data.id,
+              userId: this.userId,
+              remarks: _data.remarks,
+              status: _data.status,
+              json: JSON.stringify(_data.jsonData),
+              createId: _data.createId,
+              batch: _data.batch
+            }
+          ];
+
+          this.ajax
+            .post(this.$store.state.api + "update_classroomTask", params)
+            .then(res => {
+              if (res.data == 1) {
+                console.log("修改任务成功");
+                resolve();
+              } else {
+                reject();
+                this.$message.error("修改任务失败");
+              }
+            })
+            .catch(err => {
+              console.log(err);
+              this.$message.error("修改任务失败");
+              reject();
+            });
+        }
+      });
+    },
+    changeData({ field, data }) {
+      let _index = this.dataList.findIndex(i => i.id === data.id);
+      if (_index != -1) {
+        if (this.dataList[_index][field] != data[field]) {
+          this.dataList[_index][field] = data[field];
+          this.updateTask(this.dataList[_index].id);
+        }
+      }
     }
   },
-  mounted() {}
+  mounted() {
+    this.getTaskList();
+  }
 };
 </script>
 
@@ -382,7 +602,7 @@ export default {
 .box {
   width: 70%;
   min-width: 500px;
-  height: fit-content;
+  height: 100%;
   box-sizing: border-box;
   border-left: solid 1px #e1e1e1;
   border-right: solid 1px #e1e1e1;
@@ -405,13 +625,13 @@ export default {
 }
 
 .b_b_left > img {
-  width: 30px;
-  height: 30px;
+  width: 25px;
+  height: 25px;
   transform: rotate(180deg);
 }
 
 .b_b_left > span {
-  font-size: 20px;
+  font-size: 16px;
   font-weight: bold;
   margin-left: 5px;
 }
@@ -424,7 +644,7 @@ export default {
 }
 
 .b_head > span {
-  font-size: 26px;
+  font-size: 18px;
   font-weight: bold;
   color: #000;
 }
@@ -491,6 +711,7 @@ export default {
 .b_bottom {
   width: 100%;
   height: auto;
+  min-height: calc(100% - 210px);
   /* height: calc(100% - 200px); */
 }
 

+ 61 - 27
src/components/pages/classroomObservation/dialog/editBaseMessageDialog.vue

@@ -4,9 +4,10 @@
 			:center="true"
 			:visible.sync="show"
 			:close-on-click-modal="false"
-      :modal="false"
+      :modal="true"
 			width="auto"
 			height="auto"
+      :append-to-body="true"
 			class="editBaseMessageDialog"
 		>
     <div class="box">
@@ -127,7 +128,7 @@
 					<div class="m-m-formImage" v-loading="uploadImageLoading">
 								<div
 									class="m-m-fi-imageItem"
-									v-for="(value, key, index) in imageList"
+									v-for="(value, key, index) in data.imageList"
 									:key="index"
 									v-if="(key == 'fileList1' || key == 'fileList2' || key == 'fileList3') && value.length >0"
 									@click.stop="previewImg(value[0].url)"
@@ -149,10 +150,10 @@
 								@click.stop="addImage2()"
 								style="max-width:32%;"
 								v-if="
-									imageList.fileList1 &&
-									imageList.fileList1.length +
-										imageList.fileList2.length +
-										imageList.fileList3.length <
+									data.imageList.fileList1 &&
+									data.imageList.fileList1.length +
+                  data.imageList.fileList2.length +
+                  data.imageList.fileList3.length <
 										3
 								"
 							>
@@ -187,8 +188,8 @@
 								<div
 									class="m-m-fi-imageItem"
 									style="max-width:100%;"
-									v-if="!imageList.videoList.length==0"
-									v-for="(item, index) in imageList.videoList?imageList.videoList:[]"
+									v-if="!data.imageList.videoList.length==0"
+									v-for="(item, index) in data.imageList.videoList?data.imageList.videoList:[]"
 									:key="index"
 									@click.stop="previewVideo(item.url)"
 								>
@@ -206,7 +207,7 @@
   					  width="180"
   					  trigger="hover"
 							style="width: 140px"
-							v-if="(((imageList.videoList&&imageList.videoList.length<=0) || !imageList.videoList) && !progressData.uploadVideo)"
+							v-if="(((data.imageList.videoList&&data.imageList.videoList.length<=0) || !data.imageList.videoList) && !progressData.uploadVideo)"
   					>
 						<div class="m_m_box">
 							<el-button-group style="width: 100%;display: flex;justify-content: center;">
@@ -219,7 +220,7 @@
 								class="m-m-fi-imageItem"
 								@click.stop="addVideo()"
 								style="max-width:100%;"
-								v-if="(((imageList.videoList&&imageList.videoList.length<=0) || !imageList.videoList) && !progressData.uploadVideo)"
+								v-if="(((data.imageList.videoList&&data.imageList.videoList.length<=0) || !data.imageList.videoList) && !progressData.uploadVideo)"
 							>
 								<img
 									src="../../../../assets/icon/classroomObservation/Union.svg"
@@ -241,7 +242,7 @@
 							<div
 								class="m-m-fi-imageItem"
 								style="max-width:60%;border-radius: 8px;overflow: hidden;"
-								v-if="progressData.uploadVideo && !imageList.videoList.length""
+								v-if="progressData.uploadVideo && !data.imageList.videoList.length""
 							>
 							<el-image
 								class="itemUrl"
@@ -276,7 +277,7 @@
 									class="m-m-fi-nephogramItem"
 									style="width:100%;"
 									 v-loading="uploadNephogramLoading"
-									v-if="(imageList.NephogramList&&imageList.NephogramList.length>0)"
+									v-if="(data.imageList.NephogramList&&data.imageList.NephogramList.length>0)"
 								>
 									<wordcloudEChart :data="imageList.NephogramList[0]"/>
 									<span @click.stop="delNephogram('NephogramList')"></span>
@@ -286,7 +287,7 @@
 								 v-loading="uploadNephogramLoading"
 								@click.stop="addNephogram()"
 								style="width:60%;max-height: 100px;"
-								v-if="((imageList.NephogramList&&imageList.NephogramList.length<=0) || !imageList.NephogramList)"
+								v-if="((data.imageList.NephogramList&&data.imageList.NephogramList.length<=0) || !data.imageList.NephogramList)"
 							>
 								<img
 									:src="require('../../../../assets/icon/classroomObservation/bmRefresh.png')"
@@ -327,7 +328,6 @@
 import previewVideoDialog from '../components/previewVideoDialog.vue';
 import wordcloudEChart from '../components/wordcloudEChart.vue'
 import uploadFile from '../components/uploadFile.vue';
-import { v4 as uuidv4 } from "uuid";
 import resourceLibraryDialog from '../components/resourceLibraryDialog.vue';
 export default {
   components:{
@@ -343,6 +343,7 @@ export default {
       uploadVideoLoading:false,
       uploadImageLoading:false,
       uploadNephogramLoading:false,
+      editId:null,
       data: {
 				courseName: "",
 				teacherName: "",
@@ -351,7 +352,13 @@ export default {
 				subject: "",
         textbook:"",
 				studentNum: 0,
-        NephogramList:[],
+        imageList:{
+        fileList1: [],
+        fileList2: [],
+        fileList3: [],
+        NephogramList: [],
+        videoList: []
+      },
 			},
       gradeList: [
 				{ value: "小学一年级", label: "小学一年级" },
@@ -386,11 +393,7 @@ export default {
 				{ value: "音乐", label: "音乐" },
 				{ value: "其他", label: "其他" },
 			],
-      imageList:{
-        fileList1:[],
-        fileList2:[],
-        fileList3:[],
-      },
+
 			progressData:{
 				stop:false,
 				uploadVideo:false,
@@ -403,10 +406,11 @@ export default {
 			loading:false,
 		};
 	},
-	computed: {},
 	methods: {
-		open(data) {
-			this.loading = false;
+		open({editId,message}) {
+      this.editId = editId;
+      this.data = JSON.parse(JSON.stringify(message));
+      this.loading = false;
 			this.show = true;
 		},
 		close() {
@@ -415,13 +419,38 @@ export default {
 		},
 		init() {
 			this.loading = false;
+      this.data = {
+        courseName: "",
+				teacherName: "",
+        time:"",
+				grade: "",
+				subject: "",
+        textbook:"",
+				studentNum: 0,
+        imageList:{
+        fileList1: [],
+        fileList2: [],
+        fileList3: [],
+        NephogramList: [],
+        videoList: []
+      }
+    }
+    this.progressData = {
+      stop:false,
+				uploadVideo:false,
+				value:0,
+				status:"",
+				key:"",
+				uploadid:"",
+    }
+      this.editId = null;
 		},
     submit(){
-      this.$message.info("确认修改")
-      this.close();
+      if(!this.data.courseName.trim())return this.$message.error("请输入胡课堂名称");
+      this.$emit("success",{editId:this.editId,message:JSON.parse(JSON.stringify(this.data))})
     },
     changeData(){
-      this.$message.info("更新数据")
+      // this.$message.info("更新数据")
     },
     //本地上传
     localUploadVideo(){
@@ -545,6 +574,9 @@ export default {
       //     this.uploadImageLoading = false;
       //   })
 			// };
+    },
+    previewVideo(url){
+      this.$refs.previewVideoDialogRef.open(url)
     },
 	},
 };
@@ -556,6 +588,7 @@ export default {
 	border-radius: 8px;
 	background-color: #fff;
 	overflow: hidden;
+  padding: 0;
 }
 
 .editBaseMessageDialog >>> .el-dialog__body {
@@ -564,6 +597,7 @@ export default {
 	flex-shrink: 0;
 	box-sizing: border-box;
 	overflow: auto;
+  padding: 0;
 }
 
 .editBaseMessageDialog >>> .el-dialog__header {
@@ -591,7 +625,7 @@ export default {
 }
 
 .b_head>span{
-  font-size: 16px;
+  font-size: 18px;
   font-weight: bold;
   color: #000;
 }

+ 7 - 4
src/components/pages/classroomObservation/dialog/uploadFileToCreateClassDialog.vue

@@ -4,9 +4,10 @@
       :center="true"
       :visible.sync="show"
       :close-on-click-modal="false"
-      :modal="false"
+      :modal="true"
       width="auto"
       height="auto"
+      :append-to-body="true"
       class="uploadFileToCreateClassDialog"
     >
       <div class="box">
@@ -106,7 +107,7 @@
         <div class="b_bottom">
           <el-button size="small" @click="close()">取消</el-button>
           <el-button size="small" type="primary" @click="submit"
-            >确定修改</el-button
+            >确定添加</el-button
           >
         </div>
         <uploadFile
@@ -314,6 +315,7 @@ export default {
 .uploadFileToCreateClassDialog >>> .el-dialog {
   width: 900px !important;
   border-radius: 8px;
+  padding: 0;
   background-color: #fff;
   overflow: hidden;
 }
@@ -322,6 +324,7 @@ export default {
   width: 900px !important;
   height: auto;
   flex-shrink: 0;
+  padding: 0;
   box-sizing: border-box;
   overflow: auto;
 }
@@ -352,7 +355,7 @@ export default {
 }
 
 .b_head > span {
-  font-size: 16px;
+  font-size: 18px;
   font-weight: bold;
   color: #000;
 }
@@ -422,7 +425,7 @@ export default {
 }
 
 .b_m_right > span {
-  font-size: 16px;
+  font-size: 18px;
   font-weight: bold;
   color: #000;
 }

+ 2 - 2
src/components/pages/classroomObservation/index.vue

@@ -83,10 +83,10 @@
       </div>
       <div class="co-h2-right">
 
-        <!-- <div class="co-h2-r-btn" style="background: rgba(54, 129, 252, 1)" @click.stop="batchBtn()">
+        <div class="co-h2-r-btn" style="background: rgba(54, 129, 252, 1)" @click.stop="batchBtn()">
           <span class="co-h2-r-b-icon3"></span>
           <div style="color: #fff;">批量创建</div>
-        </div> -->
+        </div>
         <div
           :class="['co-h2-r-btn', fileId && tid ? '' : 'ca-h2-r-noActive']"
           style="background: rgba(54, 129, 252, 1)"

+ 198 - 73
src/components/pages/classroomObservation/newComponents/batchClassCard.vue

@@ -1,92 +1,216 @@
 <template>
   <div class="batchClassCard">
     <div class="bcc_left">
-      <el-checkbox v-model="checked"></el-checkbox>
+      <el-checkbox v-model="checked" @change="changeChecked"></el-checkbox>
     </div>
     <div class="bcc_right">
       <div class="bcc_r_top">
         <div class="bcc_r_t_left">
           <div class="bcc_r_t_l_image">
-            <img src="../../../../assets/icon/classroomObservation/file_icon.svg">
+            <img
+              v-if="cardData.jsonData.fileData.type=='text/plain'"
+              src="../../../../assets/icon/classroomObservation/file_icon.svg"
+            />
+            <img
+              v-if="cardData.jsonData.fileData.type=='audio/wav'"
+              src="../../../../assets/icon/classroomObservation/audio_file.svg"
+            />
+            <img
+              v-if="cardData.jsonData.fileData.type=='video/mp4'"
+              src="../../../../assets/icon/classroomObservation/videoFile_icon.svg"
+            />
           </div>
           <div class="bcc_r_t_l_message">
             <div>
-              <span>文件名称文件名称文件名称文件名称文件名称文件名称文件名称文件名称文件名称文件名称文件名称</span>
-              <img src="../../../../assets/icon/classroomObservation/table_edit.svg" @click="editBaseMessage">
+              <span>{{ cardData.jsonData.baseMessage.courseName }}</span>
+              <img
+                src="../../../../assets/icon/classroomObservation/table_edit.svg"
+                @click="editBaseMessage"
+              />
             </div>
-            <span>2025-05-07 16.05.03</span>
+            <span>{{ cardData.create_at }}</span>
           </div>
         </div>
         <div class="bcc_r_t_right">
-          <span class="status_fail" v-if="data.status=='3'">失败</span>
-          <span class="status_success" v-if="data.status=='2'">已完成</span>
-          <span class="status_doing" v-if="data.status=='1'">处理中</span>
-          <span class="status_wait" v-if="data.status=='0'">等待处理</span>
+          <span class="status_wait" v-if="cardData.status == '3'">停止中</span>
+          <span class="status_fail" v-if="cardData.status == '4'">失败</span>
+          <span class="status_success" v-if="cardData.status == '2'"
+            >已完成</span
+          >
+          <span class="status_doing" v-if="cardData.status == '1'">处理中</span>
+          <span class="status_wait" v-if="cardData.status == '0'"
+            >等待处理</span
+          >
         </div>
       </div>
       <div class="bcc_r_bottom">
         <div class="bcc_r_b_left">
-          <el-input placeholder="备注" v-model="data.remarks"></el-input>
+          <el-input placeholder="备注" v-model="cardData.remarks" @change="changeRemarks"></el-input>
         </div>
         <div class="bcc_r_b_right">
-          <el-button size="small" @click="goToEdit">前往编辑</el-button>
-          <el-button size="small" @click="lookReport">查看报告</el-button>
-          <el-button size="small" @click="regenerate">重新生成</el-button>
+          <el-button
+            size="small"
+            @click="goToEdit"
+            v-if="[2].includes(cardData.status)"
+            >前往编辑</el-button
+          >
+          <!-- <el-button size="small" @click="lookReport">查看报告</el-button> -->
+          <el-button
+            size="small"
+            @click="regenerate"
+            v-if="[2, 3].includes(cardData.status)"
+            >重新生成</el-button
+          >
         </div>
       </div>
     </div>
-    <editBaseMessageDialog ref="editBaseMessageDialogRef"/>
   </div>
 </template>
 
 <script>
-import editBaseMessageDialog from '../dialog/editBaseMessageDialog.vue';
 export default {
-  components:{
-    editBaseMessageDialog
+  props: {
+    data: {
+      type: Object,
+      default: () => {
+        return {};
+      }
+    },
+    isSelect:{
+      type:Boolean,
+      default:false
+    },
   },
-  data(){
-    return{
-      checked:false,
-      data:{
-        remarks:"备注",
-        status:"0",//0 等待处理  1处理中  2已完成  3失败
-        stepsList:[
-          {type:"uploadFile",text:"上传文件",status:"0",progress:"0"},
-          {type:"transcription",text:"文本转录",status:"0",progress:"0"},
-          {type:"automaticCoding",text:"自动编码",status:"0",progress:"0"},
-          {type:"generateReport",text:"生成报告",status:"0",progress:"0"}
-        ],
-      },
-    }
+  data() {
+    return {
+      checked: false,
+      cardData: {
+        id: "1",
+        name: "文件名称文件名称文件名称",
+        create_at: "2025-05-07 16.05.03",
+        remarks: "备注1",
+        status: "0",
+        jsonData: {
+          baseMessage: {
+            courseName: "",
+            teacherName: "",
+            time: "",
+            grade: "",
+            subject: "",
+            textbook: "",
+            studentNum: 0,
+            imageList: {
+              fileList1: [],
+              fileList2: [],
+              fileList3: [],
+              NephogramList: [],
+              videoList: []
+            }
+          },
+          tagList: [
+            { value: 0, name: "通用课堂分析", loading: false },
+            { value: 1, name: "学科课堂分析", loading: false },
+            { value: 2, name: "扩展分析", loading: false }
+          ],
+          steps: [
+            {
+              type: "uploadFile",
+              text: "上传文件",
+              status: "0",
+              progress: "0"
+            },
+            {
+              type: "transcription",
+              text: "文本转录",
+              status: "0",
+              progress: "0"
+            },
+            {
+              type: "automaticCoding",
+              text: "自动编码",
+              status: "0",
+              progress: "0"
+            },
+            {
+              type: "generateReport",
+              text: "生成报告",
+              status: "0",
+
+              progress: "0"
+            }
+          ],
+          analysisList: [],
+          fileData: {
+            name: "文件名称",
+            url: "",
+            type: "text/plain",
+            size: "10kb"
+          },
+          automaticCoding: false
+        }
+      }
+    };
   },
-  watch:{
-    checked(newValue){
-      if(newValue){
-        this.$message.info("添加至列表")
-      }else{
-        this.$message.info("列表删除")
+  watch: {
+    isSelect(newValue){
+      this.checked = newValue;
+    },
+    // checked(newValue) {
+    //   if (newValue && newValue!=this.isSelect) {
+    //     this.$emit("changeChecked", {type:0,id:this.cardData.id});
+    //   } else {
+    //     this.$emit("changeChecked", {type:1,id:this.cardData.id});
+    //   }
+    // },
+    data: {
+      deep: true,
+      handler(newValue) {
+        if (newValue) {
+          this.cardData = JSON.parse(JSON.stringify(newValue));
+          this.$forceUpdate()
+        }
       }
-    }
+    },
+    // cardData(newValue) {
+    //   if (JSON.stringify(this.data) != JSON.stringify(newValue)) {
+    //     this.$emit("changeData", {});
+    //   }
+    // }
   },
   methods: {
-    editBaseMessage(){
-      this.$refs.editBaseMessageDialogRef.open();
+    editBaseMessage() {
+      this.$emit("editBaseMessage",this.cardData.id);
     },
     //前往编辑
-    goToEdit(){
-      this.$message.info("前往编辑")
+    goToEdit() {
+      this.$message.info("前往编辑");
     },
     //查看报告
-    lookReport(){
-      this.$message.info("查看报告")
+    lookReport() {
+      this.$message.info("查看报告");
     },
     //重新生成
-    regenerate(){
-      this.$message.info("重新生成")
+    regenerate() {
+      this.$message.info("重新生成");
+    },
+    changeRemarks(newValue){
+      if(this.data.remarks !=newValue){
+        this.$emit("changeData",{field:['remarks'],data:this.cardData})
+      }
+    },
+    changeChecked(newValue){
+      if (newValue && newValue!=this.isSelect) {
+        this.$emit("changeChecked", {type:0,id:this.cardData.id});
+      } else {
+        this.$emit("changeChecked", {type:1,id:this.cardData.id});
+      }
     },
-
   },
+  mounted() {
+    if (this.data) {
+      this.cardData = JSON.parse(JSON.stringify(this.data));
+    }
+  }
 };
 </script>
 
@@ -121,7 +245,7 @@ export default {
   flex-direction: column;
 }
 
-.bcc_r_top{
+.bcc_r_top {
   width: 100%;
   height: 60px;
   display: flex;
@@ -129,24 +253,24 @@ export default {
   justify-content: space-between;
 }
 
-.bcc_r_t_left{
+.bcc_r_t_left {
   width: calc(100% - 100px);
   height: 100%;
   display: flex;
   align-items: center;
 }
 
-.bcc_r_t_l_image{
+.bcc_r_t_l_image {
   width: 50px;
   height: 50px;
 }
 
-.bcc_r_t_l_image>img{
+.bcc_r_t_l_image > img {
   width: 45px;
   height: 45px;
   object-fit: cover;
 }
-.bcc_r_t_right{
+.bcc_r_t_right {
   width: 100px;
   height: 100%;
   display: flex;
@@ -155,23 +279,23 @@ export default {
   cursor: pointer;
 }
 
-.bcc_r_t_right>span{
+.bcc_r_t_right > span {
   font-size: 16px;
 }
 
-.bcc_r_t_l_message{
+.bcc_r_t_l_message {
   width: 100%;
   height: 50px;
 }
 
-.bcc_r_t_l_message>div{
+.bcc_r_t_l_message > div {
   width: 100%;
   height: auto;
   display: flex;
   align-items: center;
 }
 
-.bcc_r_t_l_message>div>span{
+.bcc_r_t_l_message > div > span {
   max-width: calc(100% - 70px);
   text-overflow: ellipsis;
   overflow: hidden;
@@ -180,21 +304,21 @@ export default {
   color: #000;
 }
 
-.bcc_r_t_l_message>div>img{
+.bcc_r_t_l_message > div > img {
   width: 18px;
   height: 18px;
   margin-left: 10px;
   cursor: pointer;
 }
 
-.bcc_r_t_l_message>span{
+.bcc_r_t_l_message > span {
   margin-top: 10px;
   font-size: 14px;
   display: block;
   color: rgba(150, 155, 163, 1);
 }
 
-.bcc_r_bottom{
+.bcc_r_bottom {
   width: 100%;
   display: flex;
   align-items: center;
@@ -202,9 +326,10 @@ export default {
   height: calc(100% - 60px);
 }
 
-.bcc_r_b_left{
+.bcc_r_b_left {
   /* width: calc(100% - 200px); */
-  width: calc(100% - 290px);
+  /* width: calc(100% - 290px); */
+  flex: 1;
   height: 100%;
   border-radius: 5px;
   box-sizing: border-box;
@@ -213,47 +338,47 @@ export default {
   align-items: center;
 }
 
-.bcc_r_b_left>span{
+.bcc_r_b_left > span {
   display: block;
   width: 100%;
   height: 100%;
   line-height: 25px;
 }
 
-.bcc_r_b_left >>> .el-input{
+.bcc_r_b_left >>> .el-input {
   width: 100%;
   height: 100%;
 }
 
-.bcc_r_b_left >>> .el-input >.el-input__inner{
+.bcc_r_b_left >>> .el-input > .el-input__inner {
   width: 100%;
   height: 100%;
   border: none;
   outline: none;
 }
 
-.bcc_r_b_right{
-  width: 260px;
+.bcc_r_b_right {
+  width: auto;
+  padding: 0 0 0 10px;
   height: 100%;
   display: flex;
   align-items: center;
   justify-content: flex-end;
 }
 
-.status_success{
-color: rgba(188, 230, 133, 1);
+.status_success {
+  color: rgba(188, 230, 133, 1);
 }
 
-.status_doing{
+.status_doing {
   color: rgba(54, 129, 252, 1);
 }
 
-.status_wait{
-  color:rgba(150, 155, 163, 1);
+.status_wait {
+  color: rgba(150, 155, 163, 1);
 }
 
-.status_fail{
+.status_fail {
   color: rgb(185, 2, 2);
 }
-
 </style>

+ 1 - 0
src/components/pages/test/check/docxTemplateDialog.vue

@@ -533,6 +533,7 @@ export default {
             );
           } else if (fieldList[i].type == "file") {
             let _text = ``;
+            if(!fieldList[i].value || !fileList[i].value.length<=0)continue;
             // this.fieldList[i].value.forEach(async f => {
             for (let j = 0; j < fieldList[i].value.length; j++) {
               let f = fieldList[i].value[j];

Неке датотеке нису приказане због велике количине промена