index.tsx 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427
  1. import request from '@/helpers/request'
  2. import { verifyNumberIntegerAndFloat } from '@/helpers/toolsValidate'
  3. import { teacherState } from '@/views/role-auth/teacherAuth/teacherState'
  4. import {
  5. ElButton,
  6. ElDialog,
  7. ElForm,
  8. ElFormItem,
  9. ElInput,
  10. ElMessage,
  11. ElOption,
  12. ElOptionGroup,
  13. ElRadio,
  14. ElRadioButton,
  15. ElRadioGroup,
  16. ElSelect
  17. } from 'element-plus'
  18. import { defineComponent } from 'vue'
  19. import PracticeTimer from '../model/practice-timer'
  20. import styles from './index.module.less'
  21. export default defineComponent({
  22. name: 'practice-setting',
  23. data() {
  24. return {
  25. subjectList: [],
  26. chargeTypeArr: {
  27. 0: '否',
  28. 1: '是'
  29. },
  30. classTimeStatus: false,
  31. subjectStatus: false,
  32. timerStatus: false,
  33. timeSetting: {
  34. courseMinutes: 25,
  35. freeMinutes: 5,
  36. startSetting: '08:00',
  37. endSetting: '18:00'
  38. },
  39. timerObject: {} as any,
  40. form: {
  41. enableFlag: 1,
  42. courseMinutes: null as any,
  43. freeMinutes: 0,
  44. subjectIdTemp: '',
  45. subjectId: [] as any[],
  46. subjectPrice: [] as any[],
  47. skipHolidayFlag: 1,
  48. setting: '未设置'
  49. },
  50. minutes: [] as any,
  51. rate: 0
  52. }
  53. },
  54. async mounted() {
  55. try {
  56. // 获取手续费和分钟数
  57. let config = await request.get(
  58. '/api-website/sysConfig/queryByParamNameList',
  59. {
  60. params: {
  61. paramNames:
  62. 'practice_times_setting,practice_service_fee,course_start_setting,course_end_setting'
  63. }
  64. }
  65. )
  66. let configData = config.data || []
  67. configData.forEach((item: any) => {
  68. if (item.paramName === 'practice_times_setting') {
  69. let mins = item.paramValue ? JSON.parse(item.paramValue) : []
  70. let tempArr = [] as any
  71. mins.forEach((item: any) => {
  72. tempArr.push({
  73. ...item,
  74. name: item.courseMinutes
  75. })
  76. })
  77. this.minutes = [...tempArr]
  78. }
  79. if (item.paramName === 'practice_service_fee') {
  80. this.rate = item.paramValue
  81. }
  82. if (item.paramName === 'course_start_setting') {
  83. this.timeSetting.startSetting = item.paramValue
  84. }
  85. if (item.paramName === 'course_end_setting') {
  86. this.timeSetting.endSetting = item.paramValue
  87. }
  88. })
  89. let teacher = await request.post('/api-website/teacher/querySubject')
  90. this.subjectList = teacher.data || []
  91. // 获取课程设置
  92. const setting = await request.post(
  93. '/api-website/teacherFreeTime/getDetail',
  94. {
  95. data: {
  96. defaultFlag: 1
  97. }
  98. }
  99. )
  100. const sr = setting.data
  101. if (sr) {
  102. this.timeSetting.courseMinutes = sr.courseMinutes
  103. this.timeSetting.freeMinutes = sr.freeMinutes
  104. this.timerObject = {
  105. monday: sr.monday ? JSON.parse(sr.monday) : [],
  106. tuesday: sr.tuesday ? JSON.parse(sr.tuesday) : [],
  107. wednesday: sr.wednesday ? JSON.parse(sr.wednesday) : [],
  108. thursday: sr.thursday ? JSON.parse(sr.thursday) : [],
  109. friday: sr.friday ? JSON.parse(sr.friday) : [],
  110. saturday: sr.saturday ? JSON.parse(sr.saturday) : [],
  111. sunday: sr.sunday ? JSON.parse(sr.sunday) : []
  112. }
  113. let tempIds: any = []
  114. let tempPrices: any = []
  115. const subjectPrice = sr.subjectPrice || []
  116. subjectPrice.forEach((item: any) => {
  117. tempIds.push(item.subjectId)
  118. tempPrices.push({
  119. subjectId: item.subjectId,
  120. subjectPrice: item.subjectPrice,
  121. subjectName: item.subjectName
  122. })
  123. })
  124. const to = this.timerObject
  125. this.form = {
  126. enableFlag: sr.enableFlag ? 1 : 0,
  127. courseMinutes: sr.courseMinutes,
  128. freeMinutes: sr.freeMinutes,
  129. subjectIdTemp: tempIds.join(','),
  130. subjectId: tempIds,
  131. subjectPrice: tempPrices,
  132. skipHolidayFlag: sr.skipHolidayFlag ? 1 : 0,
  133. setting:
  134. to.monday.length > 0 ||
  135. to.tuesday.length > 0 ||
  136. to.wednesday.length > 0 ||
  137. to.thursday.length > 0 ||
  138. to.friday.length > 0 ||
  139. to.saturday.length > 0 ||
  140. to.sunday.length > 0
  141. ? '已设置'
  142. : '未设置'
  143. }
  144. }
  145. } catch {}
  146. },
  147. methods: {
  148. onSelect(item: any) {
  149. // 如果分钟数不同,则清空
  150. if (this.form.courseMinutes !== item.courseMinutes) {
  151. this.timerObject = {}
  152. this.form.setting = '未设置'
  153. }
  154. this.form.courseMinutes = item.courseMinutes
  155. this.form.freeMinutes = item.freeMinutes
  156. },
  157. async onTimer() {
  158. try {
  159. const form = this.form
  160. if (!form.courseMinutes) {
  161. // Toast('请选择单课时时长')
  162. ElMessage.error('请选择单课时时长')
  163. return
  164. }
  165. this.timeSetting.courseMinutes = Number(form.courseMinutes)
  166. this.timeSetting.freeMinutes = Number(form.freeMinutes)
  167. this.timerStatus = true
  168. } catch {}
  169. },
  170. onChoiceTimer(item: any, status: boolean) {
  171. // console.log(item, 'item')
  172. this.form.setting = status ? '已设置' : ''
  173. this.timerObject = item
  174. this.timerStatus = false
  175. },
  176. onChoice(item: any) {
  177. const tempItem = item || []
  178. this.form.subjectId = tempItem
  179. this.form.subjectIdTemp = tempItem.join(',') || ''
  180. let subjectPriceList = [...this.form.subjectPrice]
  181. tempItem.forEach((item: any) => {
  182. const index = subjectPriceList.findIndex(
  183. (subject: any) => subject.subjectId === item
  184. )
  185. if (index === -1) {
  186. subjectPriceList.push({
  187. subjectId: item,
  188. subjectPrice: null as any,
  189. subjectName: ''
  190. })
  191. }
  192. })
  193. const temp: any = []
  194. subjectPriceList.forEach((item: any) => {
  195. const isExist = tempItem.some(
  196. (subjectId: any) => subjectId === item.subjectId
  197. )
  198. isExist && temp.push(item)
  199. })
  200. this.form.subjectPrice = temp
  201. this.subjectStatus = false
  202. },
  203. getSubjectName(id: any) {
  204. const subject: any = this.subjectList.find((item: any) => item.id === id)
  205. return subject ? subject.name : ''
  206. },
  207. onFormatter(e: any) {
  208. // console.log(verifyNumberIntegerAndFloat(e.target.value))
  209. e.target.value = verifyNumberIntegerAndFloat(e.target.value)
  210. },
  211. async onSubmit() {
  212. ;(this as any).$refs.form.validate(async (_: boolean) => {
  213. if (_) {
  214. try {
  215. const form = this.form
  216. form.subjectPrice.forEach((item: any) => {
  217. item.subjectName = this.getSubjectName(item.subjectId)
  218. })
  219. form.setting = form.setting === '未设置' ? '' : form.setting
  220. await request.post('/api-website/teacherFreeTime/upSet', {
  221. data: {
  222. ...form,
  223. ...this.timerObject
  224. }
  225. })
  226. ElMessage.success('设置成功')
  227. setTimeout(() => {
  228. postMessage({ api: 'back', content: {} })
  229. }, 500)
  230. } catch {}
  231. } else {
  232. this.$nextTick(() => {
  233. let isError = document.getElementsByClassName('is-error')
  234. isError[0].scrollIntoView({
  235. block: 'center',
  236. behavior: 'smooth'
  237. })
  238. })
  239. return false
  240. }
  241. })
  242. }
  243. },
  244. render() {
  245. return (
  246. <div class={styles.setting}>
  247. <div class="text-base text-[#666] leading-none px-6 py-5 border-b border-b-[#E5E5E5]">
  248. 陪练课设置
  249. </div>
  250. <ElForm
  251. labelPosition="left"
  252. labelWidth={'180px'}
  253. size="large"
  254. model={this.form}
  255. ref="form"
  256. class="px-44 py-5"
  257. >
  258. <ElFormItem
  259. label="是否开启陪练"
  260. prop="enableFlag"
  261. rules={[
  262. {
  263. required: true,
  264. message: '请选择是否开启陪练'
  265. }
  266. ]}
  267. >
  268. <ElSelect class="w-full" v-model={this.form.enableFlag}>
  269. <ElSelect.Option value={1} label={'是'}>
  270. </ElSelect.Option>
  271. <ElSelect.Option value={0} label={'否'}>
  272. </ElSelect.Option>
  273. </ElSelect>
  274. </ElFormItem>
  275. <ElFormItem
  276. label="可教授声部"
  277. prop={'subjectId'}
  278. rules={[
  279. {
  280. required: true,
  281. message: '请选择可教授声部',
  282. trigger: 'change'
  283. }
  284. ]}
  285. >
  286. <ElSelect
  287. multiple
  288. filterable
  289. placeholder="请选择可教授声部"
  290. class="w-full"
  291. multipleLimit={5}
  292. v-model={this.form.subjectId}
  293. onChange={this.onChoice}
  294. >
  295. {this.subjectList.map((item: any) => (
  296. <ElOption key={item.id} value={item.id} label={item.name} />
  297. ))}
  298. </ElSelect>
  299. </ElFormItem>
  300. <ElFormItem
  301. label="单课时长"
  302. prop="courseMinutes"
  303. rules={[
  304. {
  305. required: true,
  306. message: '请选择单课时长',
  307. trigger: 'change'
  308. }
  309. ]}
  310. >
  311. <ElSelect
  312. class="w-full"
  313. placeholder="请选择单课时时长"
  314. v-model={this.form.courseMinutes}
  315. >
  316. {this.minutes.map((item: any) => (
  317. <ElOption key={item.courseMinutes} value={item.courseMinutes}>
  318. {item.name}
  319. </ElOption>
  320. ))}
  321. </ElSelect>
  322. </ElFormItem>
  323. {this.form.subjectPrice.map((item: any, index: number) => (
  324. <ElFormItem
  325. label={`${this.getSubjectName(item.subjectId)}陪练价格`}
  326. prop={`subjectPrice.${index}.subjectPrice`}
  327. rules={[
  328. {
  329. required: true,
  330. message: `请选择声部陪练价格`
  331. }
  332. ]}
  333. >
  334. <ElInput
  335. // @ts-ignore
  336. onKeyup={this.onFormatter}
  337. type="text"
  338. placeholder="请输入陪练价格"
  339. v-model={item.subjectPrice}
  340. v-slots={{
  341. append: () => <span class="text-base text-[#333]">元</span>
  342. }}
  343. />
  344. </ElFormItem>
  345. ))}
  346. <ElFormItem label="是否跳过节假日">
  347. <ElRadioGroup v-model={this.form.skipHolidayFlag}>
  348. <ElRadioButton label={1} class="mr-3 w-24">
  349. </ElRadioButton>
  350. <ElRadioButton label={0} class="w-24">
  351. </ElRadioButton>
  352. </ElRadioGroup>
  353. </ElFormItem>
  354. <ElFormItem label="陪练时间段">
  355. <div onClick={this.onTimer} class="w-full">
  356. <ElInput
  357. readonly
  358. class="cursor-pointer"
  359. v-model={this.form.setting}
  360. placeholder="请选择陪练时间段"
  361. suffixIcon={'ArrowDown'}
  362. />
  363. </div>
  364. </ElFormItem>
  365. </ElForm>
  366. <div class="border-t border-t-[#E5E5E5] text-center pt-6 pb-7">
  367. <ElButton
  368. class="!w-40 !h-[38px]"
  369. onClick={() => {
  370. // 重置数据
  371. this.form = {
  372. enableFlag: 1,
  373. courseMinutes: null as any,
  374. freeMinutes: 0,
  375. subjectIdTemp: '',
  376. subjectId: [] as any[],
  377. subjectPrice: [] as any[],
  378. skipHolidayFlag: 1,
  379. setting: '未设置'
  380. }
  381. ;(this as any).$refs.form.resetFields()
  382. }}
  383. >
  384. 重置
  385. </ElButton>
  386. <ElButton
  387. type="primary"
  388. class="!w-40 !h-[38px]"
  389. onClick={this.onSubmit}
  390. >
  391. 保存设置
  392. </ElButton>
  393. </div>
  394. <ElDialog
  395. modelValue={this.timerStatus}
  396. onUpdate:modelValue={val => (this.timerStatus = val)}
  397. showClose
  398. >
  399. <PracticeTimer
  400. onChoice={this.onChoiceTimer}
  401. onClose={() => {
  402. this.timerStatus = false
  403. }}
  404. timerObject={this.timerObject}
  405. courseMinutes={Number(this.timeSetting.courseMinutes)}
  406. freeMinutes={Number(this.timeSetting.freeMinutes)}
  407. startSetting={this.timeSetting.startSetting}
  408. endSetting={this.timeSetting.endSetting}
  409. />
  410. </ElDialog>
  411. </div>
  412. )
  413. }
  414. })