NewTask.vue 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547
  1. <template>
  2. <div class="new-task">
  3. <div class="go-back">
  4. <el-button @click="goBack">
  5. <div class="go-back-button"><svg-icon icon-class="go-back" /><span>返回</span></div>
  6. </el-button>
  7. </div>
  8. <div class="new-task-container">
  9. <div class="title">新任务</div>
  10. <el-form ref="newTaskForm" :model="form" :rules="rules" label-width="150px" label-position="left">
  11. <el-form-item label="任务名称" prop="name">
  12. <el-input v-model="form.name" />
  13. </el-form-item>
  14. <el-form-item v-if="!is_template" label="授课教师" prop="teacher_id">
  15. <el-select v-model="form.teacher_id">
  16. <el-option
  17. v-for="item in teacher_list"
  18. :key="item.teacher_id"
  19. :label="item.teacher_name"
  20. :value="item.teacher_id"
  21. />
  22. </el-select>
  23. </el-form-item>
  24. <el-form-item label="时间">
  25. <el-date-picker v-model="form.begin_date" type="date" value-format="yyyy-MM-dd" />&nbsp;
  26. <el-select v-model="form.begin_date_hour" class="date-hour">
  27. <el-option v-for="item in hourArr" :key="item" :label="item" :value="item" />
  28. </el-select>
  29. <span> : </span>
  30. <el-select v-model="form.begin_date_minute" class="date-minute">
  31. <el-option v-for="item in minuteArr" :key="item" :label="item" :value="item" />
  32. </el-select>
  33. <span> ~ </span>
  34. <el-date-picker v-model="form.end_date" type="date" value-format="yyyy-MM-dd" />&nbsp;
  35. <el-select v-model="form.end_date_hour" class="date-hour">
  36. <el-option v-for="item in hourArr" :key="item" :label="item" :value="item" />
  37. </el-select>
  38. <span> : </span>
  39. <el-select v-model="form.end_date_minute" class="date-minute">
  40. <el-option v-for="item in minuteArr" :key="item" :label="item" :value="item" />
  41. </el-select>
  42. </el-form-item>
  43. <el-form-item label="任务说明">
  44. <el-input v-model="form.content" type="textarea" rows="5" resize="none" />
  45. </el-form-item>
  46. <el-form-item label="任务模板">
  47. <el-select v-model="form.teaching_type">
  48. <el-option v-for="item in type_list" :key="item.type" :label="item.name" :value="item.type" />
  49. </el-select>
  50. </el-form-item>
  51. <el-form-item>
  52. <!-- 任务模式 直播 -->
  53. <div v-if="form.teaching_type === 10" class="task-template">
  54. <el-form :model="liveForm" label-width="100px" label-position="left">
  55. <el-form-item label="课件任务">
  56. <el-button @click="dialogVisible = true"> <i class="el-icon-plus" /> 添加课件 </el-button>
  57. <div>
  58. <el-tag
  59. v-for="(item, i) in liveForm.coursewareInfo"
  60. :key="item.courseware_id"
  61. color="#fff"
  62. closable
  63. :title="item.courseware_name"
  64. @close="closeCourse(i, 'live')"
  65. >
  66. <span>{{ item.courseware_name }}</span>
  67. </el-tag>
  68. </div>
  69. </el-form-item>
  70. <el-form-item label="上传文档">
  71. <el-upload action="no" :http-request="upload" multiple :show-file-list="false" accept="*">
  72. <el-button><svg-icon icon-class="upload" /> 上传文档</el-button>
  73. </el-upload>
  74. <el-tag
  75. v-for="(item, i) in liveForm.file_info_list"
  76. :key="item.file_id"
  77. color="#fff"
  78. closable
  79. :title="item.file_name"
  80. @close="closeFile(i, liveForm.file_info_list)"
  81. >
  82. <span>{{ item.file_name }}</span>
  83. </el-tag>
  84. </el-form-item>
  85. <el-form-item label="可见性">
  86. <el-radio v-model="liveForm.courseware_visible_mode" :label="21"> 手动推送 </el-radio>
  87. <el-radio v-model="liveForm.courseware_visible_mode" :label="22"> 一直可见 </el-radio>
  88. </el-form-item>
  89. <el-form-item label="直播录制">
  90. <el-radio v-model="liveForm.zhibo_record_mode" :label="31">自动开启</el-radio>
  91. <el-radio v-model="liveForm.zhibo_record_mode" :label="32">手动开启</el-radio>
  92. </el-form-item>
  93. </el-form>
  94. </div>
  95. <!-- 任务模式 课件 -->
  96. <div v-else-if="form.teaching_type === 11" class="task-template">
  97. <el-form :model="courseForm" label-width="100px" label-position="left">
  98. <el-form-item label="课件任务">
  99. <el-button @click="dialogVisible = true"> <i class="el-icon-plus" /> 添加课件 </el-button>
  100. <div>
  101. <el-tag
  102. v-for="(item, i) in courseForm.coursewareInfo"
  103. :key="item.courseware_id"
  104. color="#fff"
  105. closable
  106. :title="item.courseware_name"
  107. @close="closeCourse(i, 'course')"
  108. >
  109. <span>{{ item.courseware_name }}</span>
  110. </el-tag>
  111. </div>
  112. </el-form-item>
  113. <el-form-item label="任务模式">
  114. <el-radio
  115. v-for="item in mode_list"
  116. :key="item.code"
  117. v-model="courseForm.task_mode"
  118. :label="item.code"
  119. >
  120. {{ item.name }}
  121. </el-radio>
  122. </el-form-item>
  123. <el-form-item label="留言功能">
  124. <el-radio v-model="courseForm.is_enable_message" :label="true">开启</el-radio>
  125. <el-radio v-model="courseForm.is_enable_message" :label="false">关闭</el-radio>
  126. </el-form-item>
  127. </el-form>
  128. </div>
  129. <!-- 任务模式 基础 -->
  130. <div v-else-if="form.teaching_type === 12" class="task-template">
  131. <el-form :model="basicForm" label-width="100px" label-position="left">
  132. <el-form-item label="上传文档">
  133. <el-upload action="no" :http-request="upload" multiple :show-file-list="false" accept="*">
  134. <el-button><svg-icon icon-class="upload" /> 上传文档</el-button>
  135. </el-upload>
  136. <el-tag
  137. v-for="(item, i) in basicForm.file_info_list"
  138. :key="item.file_id"
  139. color="#fff"
  140. closable
  141. :title="item.file_name"
  142. @close="closeFile(i, basicForm.file_info_list)"
  143. >
  144. <span>{{ item.file_name }}</span>
  145. </el-tag>
  146. </el-form-item>
  147. <el-form-item label="提交作业">
  148. <el-radio v-model="basicForm.is_enable_homework" :label="true">开启</el-radio>
  149. <el-radio v-model="basicForm.is_enable_homework" :label="false">关闭</el-radio>
  150. </el-form-item>
  151. <el-form-item label="留言功能">
  152. <el-radio v-model="basicForm.is_enable_message" :label="true">开启</el-radio>
  153. <el-radio v-model="basicForm.is_enable_message" :label="false">关闭</el-radio>
  154. </el-form-item>
  155. </el-form>
  156. </div>
  157. </el-form-item>
  158. <el-form-item>
  159. <el-button class="done" type="primary" @click="addTaskToCSItem">确定</el-button>
  160. </el-form-item>
  161. </el-form>
  162. </div>
  163. <!--选择课件-->
  164. <select-course
  165. :id="cs_item_id"
  166. :dialog-visible="dialogVisible"
  167. @selectCourse="selectCourse"
  168. @dialogClose="dialogClose"
  169. />
  170. </div>
  171. </template>
  172. <script>
  173. import SelectCourse from '@/components/select/SelectCourse.vue';
  174. import { GetTaskTeachingTypeList, GetTaskModeList, GetTeacherListByCourseID } from '@/api/select';
  175. import { AddTaskToCSItem, GetTreeNodeInfo_BookChapterStruct, GetTaskInfo, UpdateTask } from '@/api/course';
  176. import { fileUpload } from '@/api/app';
  177. export default {
  178. name: 'NewTask',
  179. components: { SelectCourse },
  180. data() {
  181. const validateTeacher = (rule, value, callback) => {
  182. if (this.form.teaching_type === 10 && !this.form.teacher_id && !this.is_template) {
  183. callback(new Error('授课教师不能为空'));
  184. } else {
  185. callback();
  186. }
  187. };
  188. return {
  189. id: this.$route.params.id,
  190. task_id: this.$route.query.task_id,
  191. time_type: this.$route.params.time_type,
  192. cs_item_id: this.$route.params.cs_item_id,
  193. is_template: 'is_template' in this.$route.query ? JSON.parse(this.$route.query.is_template) : false,
  194. dialogVisible: false,
  195. type_list: [],
  196. teacher_list: [],
  197. mode_list: [],
  198. form: {
  199. name: '',
  200. teacher_id: '',
  201. begin_date: '',
  202. begin_date_hour: '00',
  203. begin_date_minute: '00',
  204. end_date: '',
  205. end_date_hour: '00',
  206. end_date_minute: '00',
  207. teaching_type: 12,
  208. content: ''
  209. },
  210. hourArr: [],
  211. minuteArr: [],
  212. rules: {
  213. name: { required: true, message: '任务名称不能为空', trigger: 'blur' },
  214. teacher_id: { trigger: 'blur', validator: validateTeacher }
  215. },
  216. liveForm: {
  217. coursewareInfo: [],
  218. file_info_list: [],
  219. courseware_visible_mode: 21,
  220. zhibo_record_mode: 31
  221. },
  222. courseForm: {
  223. coursewareInfo: [],
  224. task_mode: 'PRACTICE',
  225. is_enable_message: true
  226. },
  227. basicForm: {
  228. file_info_list: [],
  229. is_enable_homework: true,
  230. is_enable_message: true
  231. }
  232. };
  233. },
  234. created() {
  235. for (let i = 0; i < 60; i++) {
  236. let item = String(i);
  237. if (i < 10) item = '0' + item;
  238. if (i < 24) this.hourArr.push(item);
  239. this.minuteArr.push(item);
  240. }
  241. this.getPageNeedPage();
  242. if (this.task_id) {
  243. this.getTaskInfo();
  244. }
  245. },
  246. methods: {
  247. getPageNeedPage() {
  248. GetTaskTeachingTypeList().then(({ type_list }) => {
  249. this.type_list = type_list;
  250. });
  251. if (!this.is_template) {
  252. GetTeacherListByCourseID({ course_id: this.id }).then(({ teacher_list }) => {
  253. this.teacher_list = teacher_list;
  254. });
  255. }
  256. GetTaskModeList().then(({ mode_list }) => {
  257. this.mode_list = mode_list;
  258. });
  259. },
  260. addTaskToCSItem() {
  261. this.$refs.newTaskForm.validate(valid => {
  262. if (valid) {
  263. let teaching_type = this.form.teaching_type;
  264. let data = {
  265. cs_item_id: this.cs_item_id,
  266. name: this.form.name,
  267. time_type: Number(this.time_type),
  268. teaching_type,
  269. begin_time: `${this.form.begin_date} ${this.form.begin_date_hour}:${this.form.begin_date_minute}`,
  270. end_time: `${this.form.end_date} ${this.form.end_date_hour}:${this.form.end_date_minute}`,
  271. teacher_id: this.form.teacher_id,
  272. content: this.form.content
  273. };
  274. if (teaching_type === 10) {
  275. let courseware_id_list = [];
  276. this.liveForm.coursewareInfo.forEach(item => {
  277. courseware_id_list.push(item.courseware_id);
  278. });
  279. data['courseware_id_list'] = courseware_id_list;
  280. let file_info_list = [];
  281. this.liveForm.file_info_list.forEach(item => {
  282. file_info_list.push(item.file_id);
  283. });
  284. data['file_id_list'] = file_info_list;
  285. data['courseware_visible_mode'] = this.liveForm.courseware_visible_mode;
  286. data['zhibo_record_mode'] = this.liveForm.zhibo_record_mode;
  287. }
  288. if (teaching_type === 11) {
  289. let courseware_id_list = [];
  290. this.courseForm.coursewareInfo.forEach(item => {
  291. courseware_id_list.push(item.courseware_id);
  292. });
  293. data['courseware_id_list'] = courseware_id_list;
  294. data['task_mode'] = this.courseForm.task_mode;
  295. data['is_enable_message'] = this.courseForm.is_enable_message;
  296. }
  297. if (teaching_type === 12) {
  298. let file_info_list = [];
  299. this.basicForm.file_info_list.forEach(item => {
  300. file_info_list.push(item.file_id);
  301. });
  302. data['file_id_list'] = file_info_list;
  303. data['is_enable_homework'] = this.basicForm.is_enable_homework;
  304. data['is_enable_message'] = this.basicForm.is_enable_message;
  305. }
  306. if (this.task_id) {
  307. data['id'] = this.task_id;
  308. UpdateTask(data).then(() => {
  309. this.goBack();
  310. });
  311. } else {
  312. AddTaskToCSItem(data).then(() => {
  313. this.goBack();
  314. });
  315. }
  316. } else {
  317. return false;
  318. }
  319. });
  320. },
  321. goBack() {
  322. this.$router.push({
  323. path: `/create_course_step_table/create_task/${this.id}?is_template=${this.is_template}`
  324. });
  325. },
  326. upload(file) {
  327. let type = this.form.teaching_type;
  328. fileUpload('Open', file).then(({ file_info_list }) => {
  329. if (type === 10) {
  330. this.liveForm.file_info_list = this.liveForm.file_info_list.concat(file_info_list);
  331. return;
  332. }
  333. if (type === 12) {
  334. this.basicForm.file_info_list = this.basicForm.file_info_list.concat(file_info_list);
  335. }
  336. });
  337. },
  338. closeFile(i, arr) {
  339. arr.splice(i, 1);
  340. },
  341. // 选择课件
  342. dialogClose() {
  343. this.dialogVisible = false;
  344. },
  345. selectCourse(course_id) {
  346. if (course_id.length === 0) {
  347. this.$message.warning('请选择课件');
  348. return;
  349. }
  350. let type = this.form.teaching_type;
  351. if (type === 10) {
  352. this.getTreeNodeInfo_BookChapterStruct(course_id, 'live');
  353. }
  354. if (type === 11) {
  355. this.getTreeNodeInfo_BookChapterStruct(course_id, 'course');
  356. }
  357. this.dialogVisible = false;
  358. },
  359. getTreeNodeInfo_BookChapterStruct(id, type) {
  360. GetTreeNodeInfo_BookChapterStruct({ id }).then(({ name, id }) => {
  361. if (type === 'live') {
  362. this.liveForm.coursewareInfo.push({ courseware_id: id, courseware_name: name });
  363. }
  364. if (type === 'course') {
  365. this.courseForm.coursewareInfo.push({ courseware_id: id, courseware_name: name });
  366. }
  367. });
  368. },
  369. closeCourse(i, type) {
  370. let courseInfo = type === 'live' ? this.liveForm.coursewareInfo : this.courseForm.coursewareInfo;
  371. courseInfo.splice(i, 1);
  372. },
  373. getTaskInfo() {
  374. GetTaskInfo({ id: this.task_id }).then(
  375. ({
  376. begin_time,
  377. end_time,
  378. time_type,
  379. teaching_type,
  380. name,
  381. teacher_id,
  382. content,
  383. courseware_list,
  384. accessory_list,
  385. task_mode,
  386. is_enable_homework,
  387. is_enable_message,
  388. courseware_visible_mode,
  389. zhibo_record_mode
  390. }) => {
  391. if (begin_time.length > 0) {
  392. let begin = begin_time.split(' ');
  393. this.form.begin_date = begin[0];
  394. let bTime = begin[1].split(':');
  395. this.form.begin_date_hour = bTime[0];
  396. this.form.begin_date_minute = bTime[1];
  397. }
  398. if (end_time.length > 0) {
  399. let end = end_time.split(' ');
  400. this.form.end_date = end[0];
  401. let eTime = end[1].split(':');
  402. this.form.end_date_hour = eTime[0];
  403. this.form.end_date_minute = eTime[1];
  404. }
  405. this.time_type = time_type;
  406. this.form.teaching_type = teaching_type;
  407. this.form.name = name;
  408. this.form.teacher_id = teacher_id;
  409. this.form.content = content;
  410. if (teaching_type === 10) {
  411. this.liveForm.coursewareInfo = courseware_list;
  412. this.liveForm.file_info_list = accessory_list;
  413. this.liveForm.courseware_visible_mode = courseware_visible_mode;
  414. this.liveForm.zhibo_record_mode = zhibo_record_mode;
  415. }
  416. if (teaching_type === 11) {
  417. this.courseForm.coursewareInfo = courseware_list;
  418. this.courseForm.task_mode = task_mode;
  419. }
  420. if (teaching_type === 12) {
  421. this.basicForm.file_info_list = accessory_list;
  422. this.basicForm.is_enable_homework = is_enable_homework === 'true';
  423. this.basicForm.is_enable_message = is_enable_message === 'true';
  424. }
  425. }
  426. );
  427. }
  428. }
  429. };
  430. </script>
  431. <style lang="scss">
  432. @import '~@/styles/mixin';
  433. .new-task {
  434. @include container;
  435. .go-back {
  436. margin-bottom: 16px;
  437. &-button {
  438. display: flex;
  439. justify-content: space-between;
  440. width: 78px;
  441. }
  442. }
  443. &-container {
  444. width: 100%;
  445. padding: 24px 32px;
  446. background-color: #fff;
  447. .title {
  448. margin-bottom: 24px;
  449. font: {
  450. size: 18px;
  451. weight: 700;
  452. }
  453. }
  454. .el-form {
  455. .el-input,
  456. .el-textarea,
  457. .task-template {
  458. width: 640px;
  459. }
  460. .date-minute,
  461. .date-hour {
  462. width: 78px;
  463. > .el-input {
  464. width: 100%;
  465. }
  466. }
  467. .el-date-editor.el-input {
  468. width: 140px;
  469. }
  470. .task-template {
  471. padding: 24px 32px;
  472. background-color: #fbfbfb;
  473. border: 1px solid #d9d9d9;
  474. border-radius: 8px;
  475. .el-form-item:not(:first-child, :last-child) {
  476. margin: 20px 0;
  477. }
  478. }
  479. .el-button.done {
  480. width: 120px;
  481. }
  482. .el-tag {
  483. margin-right: 16px;
  484. > span {
  485. display: inline-block;
  486. max-width: 200px;
  487. overflow: hidden;
  488. text-overflow: ellipsis;
  489. white-space: nowrap;
  490. vertical-align: bottom;
  491. }
  492. }
  493. }
  494. }
  495. }
  496. </style>