batchCreationClassDialog.vue 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290
  1. <template>
  2. <div class="batchCreationClassDialog">
  3. <el-dialog
  4. :visible.sync="show"
  5. width="100%"
  6. height="100%"
  7. fullscreen
  8. :modal="false"
  9. :close-on-click-modal="true"
  10. :show-close="false"
  11. >
  12. <div class="box">
  13. <div class="b_back">
  14. <div class="b_b_left" @click="close()">
  15. <img src="../../../../assets/icon/classroomObservation/right.svg" />
  16. <span>返回</span>
  17. </div>
  18. <div class="b_b_right">
  19. <el-button type="primary" size="small" @click="uploadFile"
  20. >上传文件</el-button
  21. >
  22. </div>
  23. </div>
  24. <div class="b_head">
  25. <span>已上传的课堂实录</span>
  26. </div>
  27. <div class="b_nav">
  28. <div class="b_n_left">
  29. <span
  30. :class="{ b_n_l_active: selectStatus == item.value }"
  31. v-for="item in statusList"
  32. :key="item.value"
  33. @click="changeStatus(item.value)"
  34. >{{ item.label }}</span
  35. >
  36. </div>
  37. <div class="b_n_right">
  38. <span>总计{{ dataList.length }}个</span>
  39. </div>
  40. </div>
  41. <div class="b_bottom">
  42. <div class="b_b_operation">
  43. <div class="b_b_o_left">
  44. <span
  45. >当前进度 {{ progress }}/{{
  46. dataList.filter(
  47. i =>
  48. selectStatus == "99" ||
  49. statusList
  50. .find(i => i.value === selectStatus)
  51. .allow.includes(i.state)
  52. ).length
  53. }}</span
  54. >
  55. </div>
  56. <div class="b_b_o_right">
  57. <div>
  58. <el-checkbox v-model="selectAll" :indeterminate="indeterminate"
  59. >全选</el-checkbox
  60. >
  61. </div>
  62. <span>
  63. <img
  64. @click="delSelectBtn"
  65. src="../../../../assets/icon/classroomObservation/del2.svg"
  66. />
  67. </span>
  68. </div>
  69. </div>
  70. <div class="b_b_list">
  71. <batchClassCard
  72. v-for="item in dataList"
  73. :data="item"
  74. :isSelect="selectList.includes(item.id)"
  75. :key="item.id"
  76. v-show="
  77. selectStatus === '99' ||
  78. statusList
  79. .find(i => i.value === selectStatus)
  80. .allow.includes(item.status)
  81. "
  82. @changeChecked="changeCardChecked"
  83. @editBaseMessage="editBaseMessage"
  84. @changeData="changeData"
  85. @taskBtn="taskBtn"
  86. />
  87. </div>
  88. </div>
  89. </div>
  90. <uploadFileToCreateClassDialog
  91. ref="uploadFileToCreateClassDialogRef"
  92. @success="uploadFileSuccess"
  93. />
  94. <editBaseMessageDialog
  95. ref="editBaseMessageDialogRef"
  96. @success="editBaseMessageSuccess"
  97. />
  98. </el-dialog>
  99. </div>
  100. </template>
  101. <script>
  102. import batchClassCard from "../newComponents/batchClassCard.vue";
  103. import uploadFileToCreateClassDialog from "./uploadFileToCreateClassDialog.vue";
  104. import editBaseMessageDialog from "./editBaseMessageDialog.vue";
  105. import { v4 as uuidv4 } from "uuid";
  106. import { toolMixin } from "../tools/mixin";
  107. export default {
  108. mixins: [toolMixin],
  109. components: {
  110. batchClassCard,
  111. uploadFileToCreateClassDialog,
  112. editBaseMessageDialog
  113. },
  114. data() {
  115. return {
  116. statusList: [
  117. { label: "全部", value: "99", allow: [] },
  118. { label: "已完成", value: "2", allow: ["2"] },
  119. { label: "处理中", value: "1", allow: ["1"] },
  120. { label: "等待处理", value: "0", allow: ["0"] },
  121. { label: "待开始", value: "3", allow: ["3"] }
  122. ],
  123. userId: this.$route.query["userid"],
  124. selectStatus: "99",
  125. show: false,
  126. selectList: [],
  127. dataList: [],
  128. nowDoTaskId: [],
  129. dialogTagDataList: []
  130. };
  131. },
  132. computed: {
  133. selectAll: {
  134. get() {
  135. let _result = false;
  136. let _data = this.dataList.filter(
  137. i =>
  138. this.selectStatus === "99" ||
  139. this.statusList
  140. .find(i2 => i2.value === this.selectStatus)
  141. .allow.includes(i.status)
  142. );
  143. if (_data.length > 0 && _data.length === this.selectList.length) {
  144. _result = true;
  145. }
  146. return _result;
  147. },
  148. set(value) {
  149. if (value) {
  150. this.selectList = this.dataList
  151. .filter(
  152. i =>
  153. this.selectStatus === "99" ||
  154. this.statusList
  155. .find(i2 => i2.value === this.selectStatus)
  156. .allow.includes(i.status)
  157. )
  158. .map(i => i.id);
  159. this.$forceUpdate();
  160. } else {
  161. this.selectList = [];
  162. }
  163. }
  164. },
  165. indeterminate() {
  166. let _result = false;
  167. let _data = this.dataList.filter(
  168. i =>
  169. this.selectStatus === "99" ||
  170. this.statusList
  171. .find(i2 => i2.value === this.selectStatus)
  172. .allow.includes(i.status)
  173. );
  174. if (_data.length > this.selectList.length && this.selectList.length > 0) {
  175. _result = true;
  176. }
  177. return _result;
  178. },
  179. progress() {
  180. return this.dataList.filter(
  181. i =>
  182. i.status == "2" &&
  183. (this.selectStatus == "99" ||
  184. this.statusList
  185. .find(i2 => i2.value == this.selectStatus)
  186. .allow.includes(i.state))
  187. ).length;
  188. }
  189. },
  190. watch: {
  191. selectList(newValue, oldValue) {
  192. console.log(newValue, oldValue);
  193. }
  194. },
  195. methods: {
  196. open() {
  197. this.show = true;
  198. },
  199. close() {
  200. this.show = false;
  201. },
  202. init() {},
  203. changeStatus(newValue) {
  204. this.selectStatus = newValue;
  205. this.selectList = [];
  206. },
  207. uploadFile() {
  208. this.$refs.uploadFileToCreateClassDialogRef.open();
  209. },
  210. //批量上传文件成功
  211. async uploadFileSuccess(data) {
  212. this.$refs.uploadFileToCreateClassDialogRef.close();
  213. let { fileList, automaticCoding, analysisTemplate } = data;
  214. this.loading = true;
  215. let fileDataList = fileList.map(i => i.successData);
  216. let _tempData = await this.getTemplateData(analysisTemplate[1]);
  217. let _analysisList = JSON.parse(_tempData.tips);
  218. let tagList = _analysisList.find(i => i.isOtherData);
  219. if (!tagList) {
  220. tagList = [
  221. { value: 0, name: "通用课堂分析", loading: false },
  222. { value: 1, name: "学科课堂分析", loading: false },
  223. { value: 2, name: "扩展分析", loading: false }
  224. ];
  225. }else{
  226. tagList = tagList.dialogTagList;
  227. }
  228. let batch = uuidv4();
  229. _analysisList = _analysisList.filter(
  230. i => !i.isOtherData && i.jsonData.name != "词频词汇分析"
  231. );
  232. let promiseList = [];
  233. fileDataList.forEach(i => {
  234. let data = {
  235. id: uuidv4(),
  236. create_at: "2025-05-07 16.05.03",
  237. remarks: "备注",
  238. batch: batch,
  239. status: "3",
  240. createId: "",
  241. jsonData: {
  242. file_ids: "",
  243. baseMessage: {
  244. courseName: i.name,
  245. teacherName: "",
  246. time: "",
  247. grade: "",
  248. subject: "",
  249. textbook: "",
  250. studentNum: 0,
  251. imageList: {
  252. fileList: [],
  253. fileList1: [],
  254. fileList2: [],
  255. fileList3: [],
  256. name:"课堂记录",
  257. NephogramList: [],
  258. videoList: []
  259. }
  260. },
  261. tagList: tagList,
  262. steps: [],
  263. analysisList: _analysisList,
  264. fileData: i,
  265. automaticCoding: automaticCoding
  266. }
  267. };
  268. if (i.type == "text/plain") {
  269. data.jsonData.steps = [
  270. {
  271. type: "uploadFile",
  272. text: "上传文件",
  273. status: "1"
  274. },
  275. {
  276. type: "transcription",
  277. text: "文本转录",
  278. status: "0",
  279. progress: "0"
  280. },
  281. {
  282. type: "getFileIds",
  283. text: "获取文件fileid",
  284. status: "0"
  285. },
  286. {
  287. type: "generateReport",
  288. text: "生成报告",
  289. status: "0",
  290. progress: "0"
  291. },
  292. {
  293. type: "createClass",
  294. text: "创建课堂",
  295. status: "0",
  296. progress: "0"
  297. }
  298. ];
  299. } else if (i.type == "audio/wav") {
  300. data.jsonData.baseMessage.imageList.fileList = [
  301. {
  302. name: i.name,
  303. status: "success",
  304. url: i.url,
  305. uid: "1"
  306. }
  307. ];
  308. data.jsonData.steps = [
  309. {
  310. type: "uploadFile",
  311. text: "上传文件",
  312. status: "1"
  313. },
  314. {
  315. type: "transcription",
  316. text: "文本转录",
  317. status: "0",
  318. progress: "0"
  319. }
  320. ];
  321. if (data.json.automaticCoding) {
  322. data.jsonData.steps.push({
  323. type: "automaticCoding",
  324. text: "自动编码",
  325. status: "0",
  326. progress: "0"
  327. });
  328. }
  329. data.jsonData.steps.push(
  330. ...[
  331. {
  332. type: "getFileIds",
  333. text: "获取文件fileid",
  334. status: "0"
  335. },
  336. {
  337. type: "generateReport",
  338. text: "生成报告",
  339. status: "0",
  340. progress: "0"
  341. },
  342. {
  343. type: "createClass",
  344. text: "创建课堂",
  345. status: "0",
  346. progress: "0"
  347. }
  348. ]
  349. );
  350. } else if (i.type == "video/mp4") {
  351. data.jsonData.baseMessage.imageList.videoList = [
  352. {
  353. name: i.name,
  354. status: "success",
  355. url: i.url,
  356. uid: "1"
  357. }
  358. ];
  359. data.jsonData.steps = [
  360. {
  361. type: "uploadFile",
  362. text: "上传文件",
  363. status: "1"
  364. },
  365. {
  366. type: "getVideoVoice",
  367. text: "视频提取音频",
  368. status: "0",
  369. progress: "0"
  370. },
  371. {
  372. type: "transcription",
  373. text: "文本转录",
  374. status: "0",
  375. progress: "0"
  376. }
  377. ];
  378. if (data.jsonData.automaticCoding) {
  379. data.jsonData.steps.push({
  380. type: "automaticCoding",
  381. text: "自动编码",
  382. status: "0",
  383. progress: "0"
  384. });
  385. }
  386. data.jsonData.steps.push(
  387. ...[
  388. {
  389. type: "getFileIds",
  390. text: "获取文件fileid",
  391. status: "0"
  392. },
  393. {
  394. type: "generateReport",
  395. text: "生成报告",
  396. status: "0",
  397. progress: "0"
  398. },
  399. {
  400. type: "createClass",
  401. text: "创建课堂",
  402. status: "0",
  403. progress: "0"
  404. }
  405. ]
  406. );
  407. }
  408. promiseList.push(
  409. new Promise((resolve, reject) => {
  410. // 本地保存fileObj
  411. const fileObj = data.jsonData.fileData.fileObj;
  412. delete data.jsonData.fileData.fileObj;
  413. const params = [
  414. {
  415. remarks: data.remarks,
  416. status: data.status,
  417. json: JSON.stringify(data.jsonData),
  418. batch: data.batch,
  419. createId: data.createId,
  420. userId: this.userId
  421. }
  422. ];
  423. console.log(params);
  424. this.ajax
  425. .post(this.$store.state.api + "insert_classroomTask", params)
  426. .then(res => {
  427. const _data = res.data[0][0];
  428. if (_data.id) {
  429. data.jsonData.fileData.fileObj = fileObj;
  430. data.id = _data.id;
  431. this.dataList.push(data);
  432. }
  433. resolve();
  434. })
  435. .catch(err => {
  436. console.error(err);
  437. reject(err);
  438. });
  439. })
  440. );
  441. });
  442. console.log(promiseList);
  443. Promise.all(promiseList)
  444. .then(res => {
  445. this.$message.success("创建成功");
  446. })
  447. .catch(err => {
  448. console.log("创建出错", err);
  449. });
  450. },
  451. //获取模板的数据
  452. getTemplateData(tid) {
  453. return new Promise(resolve => {
  454. let params = {
  455. uid: this.userId,
  456. cid: tid,
  457. st: 0
  458. };
  459. this.ajax
  460. .get(this.$store.state.api + "selectClassroomTemplateDetail", params)
  461. .then(res => {
  462. let _data = res.data[0][0];
  463. resolve(_data);
  464. });
  465. });
  466. },
  467. changeCardChecked({ type = 0, id }) {
  468. if (type === 0 && !this.selectList.includes(id)) {
  469. this.selectList.push(id);
  470. } else if (type === 1 && this.selectList.push(id)) {
  471. this.selectList = this.selectList.filter(i => i != id);
  472. }
  473. },
  474. //修改课堂的baseMessage按钮
  475. editBaseMessage(id) {
  476. let _data = this.dataList.find(i => i.id === id);
  477. if (_data) {
  478. this.$refs.editBaseMessageDialogRef.open({
  479. editId: _data.id,
  480. message: _data.jsonData.baseMessage
  481. });
  482. } else {
  483. this.$message.error("未查询到该数据");
  484. }
  485. },
  486. //修改课堂的baseMessage
  487. editBaseMessageSuccess({ editId, message }) {
  488. if (editId) {
  489. this.dataList.find(i => i.id === editId).jsonData.baseMessage = message;
  490. this.$forceUpdate();
  491. this.$refs.editBaseMessageDialogRef.close();
  492. this.updateTask(editId);
  493. }
  494. },
  495. // 删除选择的数据
  496. delSelectBtn() {
  497. let _delList = this.dataList.filter(
  498. i =>
  499. this.selectList.includes(i.id) &&
  500. (this.selectStatus === "99" ||
  501. this.statusList
  502. .find(i2 => i2.value === this.selectStatus)
  503. .allow.includes(i.status))
  504. );
  505. if (_delList.length <= 0) return this.$message.info("请先选择列表");
  506. this.$confirm("您确定要删除选中的数据吗?", "提示", {
  507. confirmButtonText: "确定",
  508. cancelButtonText: "取消",
  509. type: "warning"
  510. })
  511. .then(() => {
  512. // 确定删除
  513. let params = [
  514. {
  515. idList: _delList.map(i => i.id).join(","),
  516. userId: this.userId
  517. }
  518. ];
  519. this.ajax
  520. .post(this.$store.state.api + "delete_classroomTask", params)
  521. .then(res => {
  522. if (res.data > 0) {
  523. this.$message.success("删除成功");
  524. this.dataList = this.dataList.filter(
  525. i => !_delList.find(del => del.id === i.id)
  526. );
  527. this.selectList = [];
  528. }
  529. })
  530. .catch(err => {
  531. console.log(err);
  532. this.$message.error("删除失败");
  533. });
  534. })
  535. .catch(() => {
  536. // 取消删除
  537. });
  538. },
  539. //获取任务列表
  540. getTaskList() {
  541. let params = {
  542. userId: this.userId
  543. };
  544. this.ajax
  545. .get(this.$store.state.api + "select_classroomTask", params)
  546. .then(res => {
  547. let _data = res.data[0];
  548. if (_data.length > 0) {
  549. _data.forEach(i => (i.jsonData = JSON.parse(i.jsonData)));
  550. this.dataList = _data;
  551. }
  552. });
  553. },
  554. //获取所有的模块分析
  555. getDialogTagDataList() {
  556. let params = {
  557. uid: this.userId
  558. };
  559. this.ajax
  560. .get(this.$store.state.api + "select_smodel", params)
  561. .then(res => {
  562. let _result = res.data[0];
  563. this.dialogTagDataList = _result;
  564. })
  565. .catch(e => {
  566. console.log(e);
  567. this.$message.error("获取模块分析列表失败");
  568. });
  569. },
  570. updateTask(id) {
  571. return new Promise((resolve, reject) => {
  572. let _data = this.dataList.find(i => i.id === id);
  573. if (_data) {
  574. const dataCopy = JSON.parse(JSON.stringify(_data));
  575. if (dataCopy.jsonData.fileData.fileObj) {
  576. delete _data.jsonData.fileData.fileObj;
  577. }
  578. if (dataCopy.jsonData.baseMessage.editorBarData && dataCopy.jsonData.baseMessage.editorBarData.content) {
  579. delete dataCopy.jsonData.baseMessage.editorBarData.content;
  580. }
  581. console.log("dataCopy", dataCopy);
  582. let params = [
  583. {
  584. id: dataCopy.id,
  585. userId: this.userId,
  586. remarks: dataCopy.remarks,
  587. status: ["0", "1"].includes(dataCopy.status)
  588. ? "3"
  589. : dataCopy.status,
  590. json: JSON.stringify(dataCopy.jsonData),
  591. createId: dataCopy.createId,
  592. batch: dataCopy.batch
  593. }
  594. ];
  595. this.ajax
  596. .post(this.$store.state.api + "update_classroomTask", params)
  597. .then(res => {
  598. if (res.data == 1) {
  599. console.log("修改任务成功");
  600. resolve();
  601. } else {
  602. reject();
  603. this.$message.error("修改任务失败");
  604. }
  605. })
  606. .catch(err => {
  607. console.log(err);
  608. this.$message.error("修改任务失败");
  609. reject();
  610. });
  611. }
  612. });
  613. },
  614. changeData({ field, data }) {
  615. let _index = this.dataList.findIndex(i => i.id === data.id);
  616. if (_index != -1) {
  617. if (this.dataList[_index][field] != data[field]) {
  618. this.dataList[_index][field] = data[field];
  619. this.updateTask(this.dataList[_index].id);
  620. }
  621. }
  622. },
  623. taskBtn(obj) {
  624. let { type, id } = obj;
  625. if (type === "startTask" && id) {
  626. // this.startTask(id);
  627. if (
  628. this.dataList.some(i => i.status === "1") &&
  629. this.dataList.find(i => i.id === id).status === "0"
  630. ) {
  631. this.$confirm(
  632. "您确定要开始该任务嘛?其他已开始的任务会暂停。",
  633. "提示",
  634. {
  635. confirmButtonText: "确定",
  636. cancelButtonText: "取消",
  637. type: "warning"
  638. }
  639. )
  640. .then(() => {
  641. this.startTask(id);
  642. })
  643. .catch(() => {
  644. console.log("不暂停");
  645. });
  646. } else {
  647. this.startTask(id);
  648. }
  649. } else if (type === "stopTask" && id) {
  650. this.$confirm("您确定要停止该任务吗?", "提示", {
  651. confirmButtonText: "确定",
  652. cancelButtonText: "取消",
  653. type: "warning"
  654. })
  655. .then(() => {
  656. this.stopTask(id);
  657. })
  658. .catch(() => {
  659. console.log("不暂停");
  660. });
  661. } else if (type === "pauseTask" && id) {
  662. this.$confirm("您确定要暂停该任务吗?", "提示", {
  663. confirmButtonText: "确定",
  664. cancelButtonText: "取消",
  665. type: "warning"
  666. })
  667. .then(() => {
  668. this.pauseTask(id);
  669. })
  670. .catch(() => {
  671. console.log("不暂停");
  672. });
  673. }
  674. },
  675. async startTask(id) {
  676. let _isStartTaskIndex = this.dataList.findIndex(i => i.status === "1");
  677. let _needStartTaskIndex = this.dataList.findIndex(i => i.id === id);
  678. if (_isStartTaskIndex === -1) {
  679. //没有任务在进行,直接开始处理
  680. this.dataList[_needStartTaskIndex].status = "1"; //处理中
  681. } else if (
  682. this.dataList[_needStartTaskIndex].status === "3" &&
  683. _isStartTaskIndex !== -1
  684. ) {
  685. //有任务在进行,且这个任务是从待开始状态到开始状态,等待处理
  686. this.dataList[_needStartTaskIndex].status = "0";
  687. } else if (
  688. _isStartTaskIndex !== -1 &&
  689. this.dataList[_needStartTaskIndex].status === "0"
  690. ) {
  691. //有任务在进行,且这个任务是从等待状态到开始状态,停止现任务,开始新任务
  692. this.nowDoTaskId = this.nowDoTaskId.filter(
  693. i => i !== this.dataList[_isStartTaskIndex].id
  694. );
  695. this.dataList[_isStartTaskIndex].status = "0"; //
  696. this.dataList[_needStartTaskIndex].status = "1"; //处理中
  697. }
  698. if (
  699. !this.nowDoTaskId.includes(this.dataList.find(i => i.status === "1").id)
  700. ) {
  701. let _startData = JSON.parse(
  702. JSON.stringify(this.dataList.find(i => i.status === "1"))
  703. );
  704. if (
  705. this.dataList.find(i => i.id === _startData.id).jsonData.fileData
  706. .fileObj
  707. ) {
  708. _startData.jsonData.fileData.fileObj = this.dataList.find(
  709. i => i.id === _startData.id
  710. ).jsonData.fileData.fileObj;
  711. }
  712. this.nowDoTaskId.push(_startData.id);
  713. let _stepList = _startData.jsonData.steps;
  714. for (let i = 0; i < _stepList.length; i++) {
  715. //按顺序处理任务
  716. let _step = _stepList[i];
  717. console.log(_step);
  718. if (_step.status === "1") continue;
  719. if (_step.type === "uploadFile") continue;
  720. if (_step.type === "getVideoVoice") {
  721. //视频提取音频
  722. _stepList[i].status = "2";
  723. this.dataList.find(
  724. i => i.id === _startData.id
  725. ).jsonData.steps = _stepList;
  726. let _fileData = _startData.jsonData.fileData;
  727. console.log("👉", _fileData);
  728. let audioFile = await this.getVideoToVoiceAndUploadMixin(_fileData);
  729. console.log("👉", audioFile);
  730. _startData.jsonData.fileData.videoUrl = _fileData.url;
  731. _startData.jsonData.fileData.url = audioFile.Location;
  732. _startData.jsonData.baseMessage.imageList.fileList = [
  733. {
  734. name: _fileData.name,
  735. status: "success",
  736. url: audioFile.Location,
  737. uid: "1"
  738. }
  739. ];
  740. _stepList[i].status = "1";
  741. this.dataList.find(i => i.id === _startData.id).jsonData =
  742. _startData.jsonData;
  743. this.updateTask(_startData.id);
  744. _startData.jsonData = JSON.parse(
  745. JSON.stringify(
  746. this.dataList.find(i => i.id === _startData.id).jsonData
  747. )
  748. );
  749. // console.log(`${_startData.id}:已完成视频转音频`);
  750. } else if (_step.type === "transcription") {
  751. //文本转录
  752. const fileData = _startData.jsonData.fileData;
  753. if (fileData.type === "text/plain") {
  754. //txt文件
  755. _stepList[i].status = "2";
  756. this.dataList.find(
  757. i => i.id === _startData.id
  758. ).jsonData.steps = _stepList;
  759. let { editorBarData } = await this.getTextContentMixin(fileData);
  760. this.dataList.find(
  761. i => i.id === _startData.id
  762. ).jsonData.baseMessage.editorBarData = editorBarData;
  763. _stepList[i].status = "1";
  764. this.dataList.find(
  765. i => i.id === _startData.id
  766. ).jsonData.steps = _stepList;
  767. this.updateTask(_startData.id);
  768. _startData.jsonData = JSON.parse(
  769. JSON.stringify(
  770. this.dataList.find(i => i.id === _startData.id).jsonData
  771. )
  772. );
  773. console.log(`${_startData.id}:已获取转录文稿(txt)`);
  774. } else if (
  775. fileData.type === "video/mp4" ||
  776. fileData.type === "audio/wav"
  777. ) {
  778. //mp4与wav文件
  779. _stepList[i].status = "2";
  780. this.dataList.find(
  781. i => i.id === _startData.id
  782. ).jsonData.steps = _stepList;
  783. // let { editorBarData } = await this.getTextContentMixin(fileData);
  784. this.dataList.find(
  785. i => i.id === _startData.id
  786. ).jsonData.baseMessage.editorBarData = {
  787. content: "xxxxxx",
  788. url: "xxxxxxx"
  789. };
  790. _stepList[i].status = "1";
  791. this.dataList.find(
  792. i => i.id === _startData.id
  793. ).jsonData.steps = _stepList;
  794. this.updateTask(_startData.id);
  795. _startData.jsonData = JSON.parse(
  796. JSON.stringify(
  797. this.dataList.find(i => i.id === _startData.id).jsonData
  798. )
  799. );
  800. console.log(`${_startData.id}:已获取转录文稿(mp4/wav)`);
  801. }
  802. } else if (_step.type === "automaticCoding") {
  803. if (_startData.jsonData.automaticCoding) {
  804. console.log("开始自动编码");
  805. } else {
  806. _stepList[i].status = "1";
  807. this.dataList.find(
  808. i => i.id === _startData.id
  809. ).jsonData.steps = _stepList;
  810. this.updateTask(_startData.id);
  811. _startData.jsonData = JSON.parse(
  812. JSON.stringify(
  813. this.dataList.find(i => i.id === _startData.id).jsonData
  814. )
  815. );
  816. }
  817. } else if (_step.type === "getFileIds") {
  818. //文件获取fileId
  819. _stepList[i].status = "2";
  820. this.dataList.find(
  821. i => i.id === _startData.id
  822. ).jsonData.steps = _stepList;
  823. let _fileData = _startData.jsonData.fileData;
  824. let { fileId } = await this.getFileIdMixin(_fileData.url);
  825. this.dataList.find(
  826. i => i.id === _startData.id
  827. ).jsonData.file_ids = fileId;
  828. _stepList[i].status = "1";
  829. this.dataList.find(
  830. i => i.id === _startData.id
  831. ).jsonData.steps = _stepList;
  832. this.updateTask(_startData.id);
  833. _startData.jsonData = JSON.parse(
  834. JSON.stringify(
  835. this.dataList.find(i => i.id === _startData.id).jsonData
  836. )
  837. );
  838. console.log(`${_startData.id}:已获取fileId`);
  839. } else if (_step.type === "generateReport") {
  840. //生成报告
  841. _stepList[i].status = "2";
  842. this.dataList.find(
  843. i => i.id === _startData.id
  844. ).jsonData.steps = _stepList;
  845. let _analysisList = _startData.jsonData.analysisList;
  846. let promises = [];
  847. let _content =
  848. _startData.jsonData.baseMessage.editorBarData.content;
  849. if (!_content) {
  850. _content = await this.getFile(
  851. _startData.jsonData.baseMessage.editorBarData.url
  852. );
  853. _content = _content.data;
  854. _startData.jsonData.baseMessage.editorBarData.content = _content;
  855. }
  856. promises = _analysisList.map((i, index) => {
  857. return new Promise(async resolve => {
  858. _startData.jsonData.analysisList[index].status = "default"; //默认状态
  859. let _num = 0;
  860. let _maxNum = 5;
  861. const getAnalysis = async () => {
  862. if (
  863. ["tryAgainMax", "noAgentData"].includes(
  864. _startData.jsonData.analysisList[index].status
  865. )
  866. ) {
  867. return resolve(_startData.jsonData.analysisList[index]);
  868. }
  869. if (_num >= _maxNum) {
  870. _startData.jsonData.analysisList[index].status =
  871. "tryAgainMax"; //超过尝试次数
  872. return resolve();
  873. }
  874. _num += 1;
  875. let _assistantData =
  876. this.dialogTagDataList.find(
  877. i2 => i2.id == i.jsonData.mId
  878. ) ||
  879. this.dialogTagDataList.find(
  880. i2 => i2.name == i.jsonData.name
  881. );
  882. if (!_assistantData) {
  883. _startData.jsonData.analysisList[index].status =
  884. "noAgentData"; //无对应的智能体
  885. return resolve();
  886. }
  887. let data = await this.getAnalysisMixin({
  888. fileId: _startData.jsonData.file_ids,
  889. content: _content,
  890. analysisData: i.jsonData,
  891. assistantData: _assistantData,
  892. baseMessage: _startData.jsonData.baseMessage
  893. });
  894. if (data.data == 1) {
  895. if (_num < _maxNum) {
  896. //重试
  897. getAnalysis();
  898. }
  899. } else {
  900. _startData.jsonData.analysisList[index].status = "success";
  901. _startData.jsonData.analysisList[index].jsonData =
  902. data.data;
  903. resolve();
  904. }
  905. };
  906. getAnalysis();
  907. });
  908. });
  909. await Promise.all(promises).then(() => {
  910. console.log(`${_startData.id}:已完成分析获取`);
  911. console.log(_startData.jsonData.analysisList)
  912. _stepList[i].status = "1";
  913. this.dataList.find(
  914. i => i.id === _startData.id
  915. ).jsonData.steps = _stepList;
  916. this.updateTask(_startData.id);
  917. _startData.jsonData = JSON.parse(
  918. JSON.stringify(
  919. this.dataList.find(i => i.id === _startData.id).jsonData
  920. )
  921. );
  922. });
  923. } else if (_step.type === "createClass") {
  924. //创建课堂
  925. _stepList[i].status = "2";
  926. this.dataList.find(
  927. i => i.id === _startData.id
  928. ).jsonData.steps = _stepList;
  929. //创建课堂 赋值好fileid 替换创建后课堂的基础数据 继续下一个任务
  930. let newOption = await this.createClassMixin(_startData.jsonData);
  931. this.$emit("addNewCourseOption",newOption.data);
  932. this.dataList.find(
  933. i => i.id === _startData.id
  934. ).jsonData.createId = newOption.tid;
  935. _stepList[i].status = "1";
  936. this.dataList.find(
  937. i => i.id === _startData.id
  938. ).jsonData.steps = _stepList;
  939. this.dataList.find(
  940. i => i.id === _startData.id
  941. ).status = "2";
  942. this.updateTask(_startData.id);
  943. _startData.jsonData = JSON.parse(
  944. JSON.stringify(
  945. this.dataList.find(i => i.id === _startData.id).jsonData
  946. )
  947. );
  948. console.log(`${_startData.id}:已创建课堂`);
  949. // 查看是否有需要开启的任务
  950. if(this.dataList.find(i=>i.status=='0')){
  951. let id = this.dataList.find(i=>i.status=='0').id;
  952. this.startTask(id);
  953. }
  954. // let _analysisList = _startData.jsonData.analysisList;
  955. // let createJson = _analysisList.map(i=>{return {
  956. // jsonData: i.jsonData,
  957. // type: i.Type,
  958. // index: i.tIndex
  959. // }})
  960. // var OpenCC = require("opencc-js");
  961. // let converter = OpenCC.Converter({
  962. // from: "hk",
  963. // to: "cn"
  964. // });
  965. // createJson = createJson.filter(
  966. // i =>
  967. // !i.isOtherData &&
  968. // converter(i.jsonData.name) != converter("词频词汇分析")
  969. // );
  970. // let params = {
  971. // tid: uuidv4(),
  972. // userid: this.userId,
  973. // template: createJson
  974. // }
  975. // this.ajax
  976. // .post(
  977. // "https://gpt4.cocorobo.cn/insert_classroom_observation_template",
  978. // params
  979. // )
  980. // .then(res => {
  981. // let _data = res.data.FunctionResponse;
  982. // if (converter(_data.message) == converter("创建成功")) {
  983. // this.ajax
  984. // .post("https://gpt4.cocorobo.cn/insert_classroom_observation", {
  985. // tid: params.tid,
  986. // type: 10,
  987. // index: 0,
  988. // json_data: JSON.stringify({ file_ids: _startData.jsonData.file_ids }),
  989. // userid: this.userId
  990. // })
  991. // .then(res2 => {
  992. // let _data2 = res2.data.FunctionResponse;
  993. // if (converter(_data2.message) == converter("创建成功")) {
  994. // let newOption = {id:uuidv4(),label:_startData.jsonData.baseMessage.name,value:params.tid}
  995. // console.log(newOption);
  996. // this.$emit("addNewCourseOption",newOption);
  997. // _stepList[i].status = "1";
  998. // this.dataList.find(
  999. // i => i.id === _startData.id
  1000. // ).jsonData.steps = _stepList;
  1001. // this.dataList.find(
  1002. // i => i.id === _startData.id
  1003. // ).status = "2";
  1004. // this.updateTask(_startData.id);
  1005. // _startData.jsonData = JSON.parse(
  1006. // JSON.stringify(
  1007. // this.dataList.find(i => i.id === _startData.id).jsonData
  1008. // )
  1009. // );
  1010. // console.log(`${_startData.id}:已创建课堂`);
  1011. // // 查看是否有需要开启的任务
  1012. // if(this.dataList.find(i=>i.status=='0')){
  1013. // let id = this.dataList.find(i=>i.status=='0').id;
  1014. // this.startTask(id);
  1015. // }
  1016. // }
  1017. // }).catch(err=>{
  1018. // console.log("存储fileId失败")
  1019. // console.log(err)
  1020. // })
  1021. // }
  1022. // }).catch(err=>{
  1023. // console.log("创建课堂失败")
  1024. // console.log(err)
  1025. // })
  1026. }
  1027. }
  1028. }
  1029. },
  1030. // 暂停任务
  1031. pauseTask(id) {
  1032. let _waitTask = this.dataList.find(i => i.status === "0");
  1033. if (_waitTask) {
  1034. //暂停这个任务,
  1035. this.dataList.find(i => i.id === id).status = "0";
  1036. // 开始另一个任务
  1037. this.startTask(_waitTask.id);
  1038. } else {
  1039. //没有任务了,所以改为待开始(停止)
  1040. this.dataList.find(i => i.id === id).status = "3";
  1041. }
  1042. },
  1043. //停止任务
  1044. stopTask(id) {
  1045. let _waitTask = this.dataList.find(i => i.status === "0");
  1046. if (_waitTask) {
  1047. //停止这个任务,
  1048. this.dataList.find(i => i.id === id).status = "3";
  1049. // 开始另一个任务
  1050. this.startTask(_waitTask.id);
  1051. } else {
  1052. //只停止这个任务
  1053. this.dataList.find(i => i.id === id).status = "3";
  1054. }
  1055. }
  1056. },
  1057. mounted() {
  1058. this.getTaskList();
  1059. this.getDialogTagDataList();
  1060. }
  1061. };
  1062. </script>
  1063. <style scoped>
  1064. .batchCreationClassDialog {
  1065. width: 100vw;
  1066. height: 100vh;
  1067. }
  1068. .batchCreationClassDialog >>> .el-dialog__header,
  1069. .batchCreationClassDialog >>> .el-dialog__footer {
  1070. display: none; /* 隐藏头部和底部 */
  1071. }
  1072. .batchCreationClassDialog >>> .el-dialog__body {
  1073. padding: 0;
  1074. margin: 0;
  1075. height: 100vh;
  1076. width: 100vw;
  1077. overflow: auto;
  1078. display: flex;
  1079. justify-content: center;
  1080. }
  1081. .box {
  1082. width: 70%;
  1083. min-width: 500px;
  1084. height: 100%;
  1085. box-sizing: border-box;
  1086. border-left: solid 1px #e1e1e1;
  1087. border-right: solid 1px #e1e1e1;
  1088. padding: 0 40px;
  1089. }
  1090. .b_back {
  1091. height: 50px;
  1092. width: 100%;
  1093. display: flex;
  1094. align-items: center;
  1095. justify-content: space-between;
  1096. margin-top: 20px;
  1097. }
  1098. .b_b_left {
  1099. display: flex;
  1100. align-items: center;
  1101. cursor: pointer;
  1102. }
  1103. .b_b_left > img {
  1104. width: 25px;
  1105. height: 25px;
  1106. transform: rotate(180deg);
  1107. }
  1108. .b_b_left > span {
  1109. font-size: 16px;
  1110. font-weight: bold;
  1111. margin-left: 5px;
  1112. }
  1113. .b_head {
  1114. width: 100%;
  1115. height: 50px;
  1116. margin: 20px 0 10px 0;
  1117. box-sizing: border-box;
  1118. }
  1119. .b_head > span {
  1120. font-size: 18px;
  1121. font-weight: bold;
  1122. color: #000;
  1123. }
  1124. .b_nav {
  1125. width: 100%;
  1126. height: 50px;
  1127. display: flex;
  1128. align-items: center;
  1129. justify-content: space-between;
  1130. box-sizing: border-box;
  1131. border-bottom: solid 1px rgba(150, 155, 163, 1);
  1132. }
  1133. .b_n_left {
  1134. width: calc(100% - 60px);
  1135. height: 100%;
  1136. display: flex;
  1137. align-items: center;
  1138. }
  1139. .b_n_left > span {
  1140. height: 100%;
  1141. padding: 0 20px;
  1142. display: flex;
  1143. align-items: center;
  1144. justify-content: center;
  1145. position: relative;
  1146. cursor: pointer;
  1147. transition: 0.3s;
  1148. font-size: 16px;
  1149. }
  1150. .b_n_left > span:hover {
  1151. color: rgba(5, 96, 253, 1);
  1152. }
  1153. .b_n_left > .b_n_l_active {
  1154. color: rgba(5, 96, 253, 1);
  1155. }
  1156. .b_n_left > .b_n_l_active::after {
  1157. content: "";
  1158. position: absolute;
  1159. width: 70%;
  1160. height: 4px;
  1161. border-radius: 4px;
  1162. bottom: -1px;
  1163. left: 50%;
  1164. transform: translateX(-50%);
  1165. background-color: rgba(5, 96, 253, 1);
  1166. }
  1167. .b_n_right {
  1168. width: 60px;
  1169. height: 100%;
  1170. display: flex;
  1171. align-items: center;
  1172. justify-content: flex-end;
  1173. color: rgba(150, 155, 163, 1);
  1174. font-size: 16px;
  1175. }
  1176. .b_bottom {
  1177. width: 100%;
  1178. height: auto;
  1179. min-height: calc(100% - 210px);
  1180. /* height: calc(100% - 200px); */
  1181. }
  1182. .b_b_operation {
  1183. width: 100%;
  1184. height: 40px;
  1185. display: flex;
  1186. align-items: center;
  1187. justify-content: space-between;
  1188. margin-top: 10px;
  1189. }
  1190. .b_b_o_left {
  1191. width: calc(100% - 100px);
  1192. height: 100%;
  1193. display: flex;
  1194. align-items: center;
  1195. font-size: 16px;
  1196. }
  1197. .b_b_o_right {
  1198. width: 100px;
  1199. height: 100%;
  1200. display: flex;
  1201. align-items: center;
  1202. justify-content: space-between;
  1203. }
  1204. .b_b_o_right > div {
  1205. margin-right: 10px;
  1206. font-size: 16px;
  1207. }
  1208. .b_b_o_right > div >>> .el-checkbox {
  1209. display: flex;
  1210. align-items: center;
  1211. }
  1212. .b_b_o_right > span {
  1213. width: 20px;
  1214. height: 20px;
  1215. cursor: pointer;
  1216. }
  1217. .b_b_o_right > span > img {
  1218. width: 100%;
  1219. height: 100%;
  1220. }
  1221. .b_b_list {
  1222. width: 100%;
  1223. height: auto;
  1224. padding-bottom: 40px;
  1225. }
  1226. </style>