batchCreationClassDialog.vue 42 KB

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