index.tsx 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  1. import { defineComponent, onMounted, reactive } from 'vue';
  2. import styles from './index.module.less';
  3. import {
  4. NButton,
  5. NDatePicker,
  6. NModal,
  7. NScrollbar,
  8. NSpace,
  9. NSpin,
  10. useMessage
  11. } from 'naive-ui';
  12. import TrainType from '@/views/attend-class/model/train-type';
  13. import TrainUpdate from '../train-update';
  14. import SelectMusic from '@/views/prepare-lessons/model/select-music';
  15. import {
  16. lessonPreTrainingPage,
  17. lessonTrainingAdd
  18. } from '/src/views/prepare-lessons/api';
  19. import { evaluateDifficult } from '/src/utils/contants';
  20. import dayjs from 'dayjs';
  21. import TheEmpty from '/src/components/TheEmpty';
  22. import requestOrigin from 'umi-request';
  23. export default defineComponent({
  24. name: 'train-settings',
  25. props: {
  26. /** 章节编号 */
  27. detailId: {
  28. type: String,
  29. default: ''
  30. },
  31. /** 声部编号 */
  32. subjectId: {
  33. type: String,
  34. default: ''
  35. },
  36. /** 班级编号 */
  37. classGroupId: {
  38. type: String,
  39. default: ''
  40. },
  41. /** 上课编号 */
  42. courseScheduleId: {
  43. type: String,
  44. default: ''
  45. }
  46. },
  47. emits: ['close', 'confirm'],
  48. setup(props, { emit }) {
  49. const message = useMessage();
  50. const trainForms = reactive({
  51. type: 'add' as 'add' | 'update',
  52. btnLoading: false,
  53. loadingStatus: false,
  54. editStatus: false,
  55. editItem: {} as any,
  56. selectMusicStatus: false,
  57. trainList: [] as any,
  58. currentTime: dayjs(dayjs().format('YYYY-MM-DD')).valueOf(),
  59. expireDate: dayjs().add(7, 'day').format('YYYY-MM-DD') as any // 默认7天
  60. });
  61. const getList = async () => {
  62. trainForms.loadingStatus = true;
  63. try {
  64. // 判断是否有选择对应的课件
  65. const { data } = await lessonPreTrainingPage({
  66. coursewareKnowledgeDetailId: props.detailId,
  67. subjectId: props.subjectId,
  68. page: 1,
  69. rows: 99
  70. });
  71. const tempRows = data.rows || [];
  72. const temp: any = [];
  73. tempRows.forEach((row: any) => {
  74. const tList = typeFormat(row.trainingType, row.trainingConfigJson);
  75. temp.push({
  76. typeList: tList || [],
  77. ...row
  78. });
  79. });
  80. trainForms.trainList = temp || [];
  81. } catch {
  82. //
  83. }
  84. trainForms.loadingStatus = false;
  85. };
  86. const typeFormat = (trainingType: string, configJson: any) => {
  87. let tList: string[] = [];
  88. if (trainingType === 'EVALUATION') {
  89. tList = [
  90. `${evaluateDifficult[configJson.evaluateDifficult]}`,
  91. configJson.practiceChapterBegin || configJson.practiceChapterEnd
  92. ? `${configJson.practiceChapterBegin}-${configJson.practiceChapterEnd}小节`
  93. : '全部小节',
  94. // `速度${configJson.evaluateSpeed}`,
  95. `${configJson.trainingTimes}分合格`
  96. ];
  97. } else {
  98. tList = [
  99. `${configJson.practiceChapterBegin}-${configJson.practiceChapterEnd}小节`,
  100. `速度${configJson.practiceSpeed}`,
  101. `${configJson.trainingTimes}分钟`
  102. ];
  103. }
  104. return tList;
  105. };
  106. const onAdd = async (item: any) => {
  107. let xmlStatus = 'init';
  108. // 第一个声部小节
  109. let firstMeasures: any = null;
  110. try {
  111. // 获取文件
  112. const res = await requestOrigin.get(item.xmlFileUrl, {
  113. mode: 'cors'
  114. });
  115. const xmlParse = new DOMParser().parseFromString(res, 'text/xml');
  116. const parts = xmlParse.getElementsByTagName('part');
  117. firstMeasures = parts[0]?.getElementsByTagName('measure');
  118. xmlStatus = 'success';
  119. } catch (error) {
  120. xmlStatus = 'error';
  121. }
  122. // 判断读取小节数
  123. if (xmlStatus == 'success') {
  124. item.practiceChapterMax = firstMeasures.length;
  125. } else {
  126. item.practiceChapterMax = 0;
  127. }
  128. item.coursewareKnowledgeDetailId = props.detailId;
  129. item.subjectId = props.subjectId;
  130. trainForms.editItem = item;
  131. trainForms.editStatus = true;
  132. };
  133. const onSubmit = async () => {
  134. // 训练内容不能为空
  135. if (!trainForms.expireDate) {
  136. message.error('请选择截止日期');
  137. return;
  138. }
  139. if (trainForms.trainList.length <= 0) {
  140. message.error('训练内容不能为空');
  141. return;
  142. }
  143. trainForms.btnLoading = true;
  144. try {
  145. const trainList = trainForms.trainList || [];
  146. const details: any[] = [];
  147. trainList.forEach((item: any) => {
  148. details.push({
  149. trainingType: item.trainingType,
  150. musicId: item.musicId,
  151. trainingConfigJsonObject: item.trainingConfigJson
  152. });
  153. });
  154. const params = {
  155. lessonTrainingDetails: details,
  156. expireDate: trainForms.expireDate + ' 23:59:59',
  157. classGroupId: props.classGroupId,
  158. courseScheduleId: props.courseScheduleId || null
  159. };
  160. await lessonTrainingAdd(params);
  161. message.success('布置成功');
  162. emit('close');
  163. emit('confirm');
  164. } catch {
  165. //
  166. }
  167. trainForms.btnLoading = false;
  168. };
  169. onMounted(() => {
  170. // 判断是否有数据
  171. if (props.detailId && props.subjectId) {
  172. getList();
  173. }
  174. });
  175. return () => (
  176. <div class={styles.trainSettings}>
  177. <div class={styles.searchGroup}>
  178. <NButton
  179. onClick={() => {
  180. trainForms.selectMusicStatus = true;
  181. trainForms.type = 'add';
  182. }}>
  183. 添加作业
  184. </NButton>
  185. <div class={styles.datetime}>
  186. <label>截止时间:</label>
  187. <NDatePicker
  188. style={{ width: '200px' }}
  189. placeholder="请选择截止日期"
  190. v-model:formatted-value={trainForms.expireDate}
  191. type="date"
  192. valueFormat="yyyy-MM-dd"
  193. isDateDisabled={(ts: number) => {
  194. return ts < trainForms.currentTime;
  195. }}
  196. />
  197. </div>
  198. </div>
  199. <NScrollbar class={styles.trainList}>
  200. <NSpin show={trainForms.loadingStatus}>
  201. <div
  202. class={[
  203. styles.listSection,
  204. !trainForms.loadingStatus && trainForms.trainList.length <= 0
  205. ? styles.emptySection
  206. : ''
  207. ]}>
  208. {trainForms.trainList.length > 0 && (
  209. <div class={styles.list}>
  210. {trainForms.trainList.map((item: any, index: number) => (
  211. <TrainType
  212. item={item}
  213. type="homework"
  214. onEdit={(child: any) => {
  215. const { trainingConfigJson, id, musicId, ...res } =
  216. child;
  217. trainForms.editItem = {
  218. ...res,
  219. id: musicId,
  220. trainId: id,
  221. ...trainingConfigJson
  222. };
  223. console.log(trainForms.editItem);
  224. trainForms.type = 'update';
  225. trainForms.editStatus = true;
  226. }}
  227. onDelete={() => {
  228. // 删除
  229. // const index = trainForms.trainList.findIndex(
  230. // (c: any) => c.id === item.id
  231. // );
  232. trainForms.trainList.splice(index, 1);
  233. }}
  234. />
  235. ))}
  236. </div>
  237. )}
  238. {!trainForms.loadingStatus &&
  239. trainForms.trainList.length <= 0 && (
  240. <TheEmpty description="暂无作业" />
  241. )}
  242. </div>
  243. </NSpin>
  244. </NScrollbar>
  245. <NSpace class={styles.trainBtnGroup}>
  246. <NButton strong type="default" round onClick={() => emit('close')}>
  247. 取消布置
  248. </NButton>
  249. <NButton
  250. strong
  251. type="primary"
  252. round
  253. disabled={trainForms.trainList.length <= 0 ? true : false}
  254. onClick={onSubmit}>
  255. 立即布置
  256. </NButton>
  257. </NSpace>
  258. <NModal
  259. v-model:show={trainForms.editStatus}
  260. class={['modalTitle background', styles.trainEditModal]}
  261. preset="card"
  262. title="作业设置">
  263. <TrainUpdate
  264. item={trainForms.editItem}
  265. type="homework"
  266. onClose={() => (trainForms.editStatus = false)}
  267. onConfirm={(item: any) => {
  268. console.log(item, 'update', trainForms);
  269. const tList = typeFormat(
  270. item.trainingType,
  271. item.trainingConfigJson
  272. );
  273. // 更新
  274. if (trainForms.type === 'update') {
  275. trainForms.trainList.forEach((train: any) => {
  276. if (train.id === item.id) {
  277. train.trainingType = item.trainingType;
  278. train.trainingConfigJson = item.trainingConfigJson;
  279. train.typeList = tList;
  280. }
  281. });
  282. } else {
  283. //
  284. trainForms.trainList.push({
  285. ...item,
  286. id: +new Date(),
  287. musicName: trainForms.editItem.title,
  288. typeList: tList
  289. });
  290. }
  291. trainForms.editItem = {};
  292. }}
  293. />
  294. </NModal>
  295. <NModal
  296. v-model:show={trainForms.selectMusicStatus}
  297. class={['modalTitle', styles.selectMusicModal]}
  298. preset="card"
  299. title={'选择曲目'}>
  300. <SelectMusic
  301. type="homework"
  302. onAdd={(item: any) => {
  303. trainForms.selectMusicStatus = false;
  304. onAdd(item);
  305. }}
  306. />
  307. </NModal>
  308. </div>
  309. );
  310. }
  311. });