music-platform.tsx 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794
  1. import { appKey, musicSheetAvailableType, musicSheetPaymentType, musicSheetSourceType, musicSheetType, scoreType } from '@/utils/constant'
  2. import { getSelectDataFromObj } from '@/utils/objectUtil'
  3. import { NButton, NCheckbox, NForm, NFormItem, NGi, NGrid, NInputNumber, NSelect, NSpace, NSpin, useMessage } from 'naive-ui'
  4. import {computed, defineComponent, onMounted, reactive, ref} from 'vue'
  5. import { musicSheetApplicationExtendCategoryList, musicSheetApplicationExtendTagList, musicSheetApplicationExtendCategoryApplicationExtendInfo, musicSheetApplicationExtendSave } from '../../api'
  6. export default defineComponent({
  7. name: 'music-platform',
  8. props: {
  9. type: {
  10. type: String,
  11. default: ''
  12. },
  13. useProject: {
  14. type: Array,
  15. required: true,
  16. default: []
  17. },
  18. id: {
  19. type: String,
  20. required: true,
  21. default: null
  22. }
  23. },
  24. emits: ['close', 'getList'],
  25. setup(props, { emit }) {
  26. // 'KT' | 'GYT' | 'KLX' | 'GYM' | 'KLXT'
  27. const message = useMessage()
  28. const forms = reactive({
  29. gym: {
  30. applicationId: '',
  31. checked: true,
  32. paymentType: 'VIP',
  33. isConvertibleScore: false,
  34. scoreType: 'STAVE',
  35. status: true,
  36. sortNo: null
  37. },
  38. gyt: {
  39. applicationId: '',
  40. checked: true,
  41. availableType: 'PLATFORM',
  42. isConvertibleScore: false,
  43. scoreType: 'STAVE',
  44. status: true,
  45. sortNo: null
  46. },
  47. klxt: {
  48. applicationId: '',
  49. checked: true,
  50. isConvertibleScore: false,
  51. scoreType: 'STAVE',
  52. status: true,
  53. sortNo: null
  54. },
  55. klx: {
  56. applicationId: '',
  57. checked: true,
  58. musicTagIds: [] as any, // 标签
  59. paymentType: ['VIP'] as any, // 收费方式
  60. musicPrice: null as any, // 曲目价格
  61. availableType: 'PLATFORM',
  62. topFlag: false,
  63. exquisiteFlag: false,
  64. isConvertibleScore: true,
  65. scoreType: 'FIRST',
  66. status: true,
  67. sortNo: null
  68. },
  69. kt: {
  70. applicationId: '',
  71. checked: true,
  72. musicSheetCategoryId: null, // 乐谱教材
  73. paymentType: 'VIP',
  74. isConvertibleScore: true,
  75. scoreType: 'FIRST',
  76. status: true,
  77. sortNo: null,
  78. musicTagIds: [] as any, // 标签
  79. recommendFlag: false,
  80. }
  81. })
  82. // 类型是否支持
  83. const useProjectStatus = computed(() => {
  84. return {
  85. GYM: checkHasProject('GYM'),
  86. KLX_JG: checkHasProject("KLX_JG"),
  87. KLX: checkHasProject("KLX"),
  88. KT: checkHasProject("KT"),
  89. GYT: checkHasProject("GYT")
  90. }
  91. })
  92. const formsRef = ref()
  93. const dataLoading = ref(false)
  94. const musicSheetTagList = ref<any[]>([])
  95. const musicSheetTagListKt = ref<any[]>([])
  96. const musicSheetCategories = ref<any[]>([])
  97. const btnLoading = ref(false)
  98. // 检测是否存在
  99. const checkHasProject = (name: string) => {
  100. const useProject = props.useProject || []
  101. return useProject.findIndex((item: any) => item.appKey === name) !== -1 ? true : false
  102. }
  103. /** 检测数据 */
  104. const checkSubmitForms = () => {
  105. let status = false
  106. const gym = forms.gym
  107. if(gym.checked) {
  108. if(!gym.paymentType) {
  109. message.error('请选择收费方式')
  110. return true
  111. }
  112. console.log(gym.isConvertibleScore, 'gym.isConvertibleScore')
  113. if(gym.isConvertibleScore == null) {
  114. message.error('请选择是否支持转谱')
  115. return true
  116. }
  117. if(!gym.scoreType) {
  118. message.error('请选择默认谱面')
  119. return true
  120. }
  121. if(gym.status == null) {
  122. message.error('请选择是否启用')
  123. return true
  124. }
  125. }
  126. const gyt = forms.gyt
  127. if(gyt.checked) {
  128. if(!gyt.availableType) {
  129. message.error('请选择可用途径')
  130. return true
  131. }
  132. if(gyt.isConvertibleScore == null) {
  133. message.error('请选择是否支持转谱')
  134. return true
  135. }
  136. if(!gyt.scoreType) {
  137. message.error('请选择默认谱面')
  138. return true
  139. }
  140. if(gyt.status == null) {
  141. message.error('请选择是否启用')
  142. return true
  143. }
  144. }
  145. const klxt = forms.klxt
  146. if(klxt.checked) {
  147. if(klxt.isConvertibleScore == null) {
  148. message.error('请选择是否支持转谱')
  149. return true
  150. }
  151. if(!klxt.scoreType) {
  152. message.error('请选择默认谱面')
  153. return true
  154. }
  155. if(klxt.status == null) {
  156. message.error('请选择是否启用')
  157. return true
  158. }
  159. }
  160. const klx = forms.klx
  161. if(klx.checked) {
  162. if(klx.musicTagIds.length <= 0) {
  163. message.error('请选择曲目标签')
  164. return true
  165. }
  166. if(!klx.paymentType || klx.paymentType.length <= 0) {
  167. message.error('请选择收费方式')
  168. return true
  169. }
  170. if (!klx.paymentType.includes('CHARGE')) {
  171. klx.musicPrice = 0
  172. } else {
  173. if (klx.musicPrice === null || klx.musicPrice === undefined || klx.musicPrice === '') {
  174. message.error('曲目价格不能为空')
  175. return true
  176. }
  177. }
  178. // if(klx.availableType == null) {
  179. // message.error('请选择可用途径')
  180. // return true
  181. // }
  182. if (typeof klx.topFlag !== 'boolean') {
  183. message.error('请选择是否置顶')
  184. return true
  185. }
  186. if (typeof klx.exquisiteFlag !== 'boolean') {
  187. message.error('请选择是否精品')
  188. return true
  189. }
  190. if(klx.isConvertibleScore == null) {
  191. message.error('请选择是否支持转谱')
  192. return true
  193. }
  194. if(!klx.scoreType) {
  195. message.error('请选择默认谱面')
  196. return true
  197. }
  198. if(klx.status == null) {
  199. message.error('请选择是否启用')
  200. return true
  201. }
  202. }
  203. const kt = forms.kt
  204. if(kt.checked) {
  205. if(!kt.musicSheetCategoryId) {
  206. message.error('请选择乐谱教材')
  207. return true
  208. }
  209. if(!kt.paymentType) {
  210. message.error('请选择收费方式')
  211. return true
  212. }
  213. if(kt.isConvertibleScore == null) {
  214. message.error('请选择是否支持转谱')
  215. return true
  216. }
  217. if(!kt.scoreType) {
  218. message.error('请选择默认谱面')
  219. return true
  220. }
  221. if(kt.status == null) {
  222. message.error('请选择是否启用')
  223. return true
  224. }
  225. if(kt.musicTagIds.length <= 0) {
  226. message.error('请选择曲目标签')
  227. return true
  228. }
  229. if(kt.recommendFlag == null) {
  230. message.error('请选择是否推荐')
  231. return true
  232. }
  233. }
  234. return status
  235. }
  236. /** 获取参数 */
  237. const getSubmitParams = () => {
  238. const params: any = []
  239. const useApplicationIds: any = []
  240. if(forms.gym.checked) {
  241. params.push({
  242. ...forms.gym
  243. })
  244. useApplicationIds.push(forms.gym.applicationId)
  245. }
  246. if(forms.gyt.checked) {
  247. params.push({
  248. ...forms.gyt
  249. })
  250. useApplicationIds.push(forms.gyt.applicationId)
  251. }
  252. if(forms.klxt.checked) {
  253. params.push({
  254. ...forms.klxt
  255. })
  256. useApplicationIds.push(forms.klxt.applicationId)
  257. }
  258. if(forms.klx.checked) {
  259. params.push({
  260. ...forms.klx,
  261. musicTagIds: forms.klx.musicTagIds.join(','),
  262. paymentType: forms.klx.paymentType.join(',')
  263. })
  264. useApplicationIds.push(forms.klx.applicationId)
  265. }
  266. if(forms.kt.checked) {
  267. params.push({
  268. ...forms.kt,
  269. musicTagIds: forms.kt.musicTagIds.join(','),
  270. })
  271. useApplicationIds.push(forms.kt.applicationId)
  272. }
  273. return {
  274. musicSheetId: props.id,
  275. applicationExtends: params || {},
  276. useApplicationIds: useApplicationIds.join(',') || ''
  277. }
  278. }
  279. // 提交数据
  280. const onSubmit = async () => {
  281. try {
  282. if(checkSubmitForms()) return
  283. btnLoading.value = true
  284. const params = getSubmitParams()
  285. await musicSheetApplicationExtendSave(params)
  286. message.success('保存成功')
  287. emit('close')
  288. emit('getList')
  289. } catch {}
  290. btnLoading.value = false
  291. }
  292. /** 酷乐秀 加载曲目标签 */
  293. const getMusicTags = async () => {
  294. try {
  295. const useProject = props.useProject || []
  296. const item: any = useProject.find((item: any) => item.appKey === 'KLX')
  297. if(!item) return
  298. const { data } = await musicSheetApplicationExtendTagList({
  299. applicationId: item.id
  300. })
  301. if (data && data.length > 0) {
  302. data.forEach((item: any) => {
  303. musicSheetTagList.value.push({
  304. ...item,
  305. label: item.name,
  306. value: item.id
  307. })
  308. })
  309. }
  310. } catch (err) {}
  311. }
  312. /** 课堂乐器 加载曲目标签 */
  313. const getMusicTagsKt = async () => {
  314. try {
  315. const useProject = props.useProject || []
  316. const item: any = useProject.find((item: any) => item.appKey === 'KT')
  317. if(!item) return
  318. const { data } = await musicSheetApplicationExtendTagList({
  319. applicationId: item.id
  320. })
  321. if (data && data.length > 0) {
  322. data.forEach((item: any) => {
  323. musicSheetTagListKt.value.push({
  324. ...item,
  325. label: item.name,
  326. value: item.id
  327. })
  328. })
  329. }
  330. } catch (err) {}
  331. }
  332. /** 课堂乐器 乐谱教材 */
  333. const getMusicSheetCategories = async () => {
  334. //加载曲目分类列表
  335. const useProject = props.useProject || []
  336. const item: any = useProject.find((item: any) => item.appKey === 'KT')
  337. if(!item) return
  338. const categoryRes = await musicSheetApplicationExtendCategoryList({
  339. applicationIds: item.id
  340. })
  341. if (categoryRes.data && categoryRes.data.length > 0) {
  342. musicSheetCategories.value = categoryRes.data[0].musicSheetCategories
  343. }
  344. }
  345. const getDetail = async () => {
  346. try {
  347. // 加载已经配置的APP
  348. const { data } = await musicSheetApplicationExtendCategoryApplicationExtendInfo({ musicSheetId: props.id })
  349. const result = data || []
  350. result.forEach((item: any) => {
  351. if(item.appKey === 'GYM') {
  352. forms.gym.checked = true;
  353. forms.gym.paymentType = item.paymentType
  354. forms.gym.isConvertibleScore = item.isConvertibleScore
  355. forms.gym.scoreType = item.scoreType
  356. forms.gym.status = item.status
  357. forms.gym.sortNo = item.sortNo
  358. } else if(item.appKey === 'GYT') {
  359. forms.gyt.checked = true
  360. forms.gyt.availableType = item.availableType
  361. forms.gyt.isConvertibleScore = item.isConvertibleScore
  362. forms.gyt.scoreType = item.scoreType
  363. forms.gyt.status = item.status
  364. forms.gyt.sortNo = item.sortNo
  365. } else if(item.appKey === 'KLX_JG') {
  366. forms.klxt.checked = true
  367. forms.klxt.isConvertibleScore = item.isConvertibleScore
  368. forms.klxt.scoreType = item.scoreType
  369. forms.klxt.status = item.status
  370. forms.klxt.sortNo = item.sortNo
  371. } else if(item.appKey === 'KLX') {
  372. forms.klx.checked = true
  373. forms.klx.musicTagIds = item.musicTagIds ? item.musicTagIds.split(',') : [] // 标签
  374. forms.klx.paymentType = item.paymentType ? item.paymentType.split(',') : [] // 收费方式
  375. forms.klx.musicPrice = item.musicPrice // 曲目价格
  376. forms.klx.availableType = item.availableType
  377. forms.klx.topFlag = item.topFlag
  378. forms.klx.exquisiteFlag = item.exquisiteFlag
  379. forms.klx.isConvertibleScore = item.isConvertibleScore
  380. forms.klx.scoreType = item.scoreType
  381. forms.klx.status = item.status
  382. forms.klx.sortNo = item.sortNo
  383. } else if(item.appKey === 'KT') {
  384. forms.kt.checked = true
  385. forms.kt.musicSheetCategoryId = item.musicSheetCategoryId // 乐谱教材
  386. forms.kt.paymentType = item.paymentType
  387. forms.kt.isConvertibleScore = item.isConvertibleScore
  388. forms.kt.scoreType = item.scoreType
  389. forms.kt.status = item.status
  390. forms.kt.sortNo = item.sortNo
  391. forms.kt.musicTagIds = item.musicTagIds ? item.musicTagIds.split(',') : [] // 标签
  392. forms.kt.recommendFlag = item.recommendFlag
  393. }
  394. })
  395. } catch {
  396. }
  397. }
  398. onMounted(async () => {
  399. dataLoading.value = true
  400. if(props.type !== 'add') {
  401. // 默认重置为false
  402. forms.gym.checked = false
  403. forms.gyt.checked = false
  404. forms.klxt.checked = false
  405. forms.klx.checked = false
  406. forms.kt.checked = false
  407. }
  408. // 初始话应用编号
  409. const useProject = props.useProject || []
  410. useProject.forEach((item: any) => {
  411. if(item.appKey === 'GYM') {
  412. forms.gym.applicationId = item.id
  413. } else if(item.appKey === 'KLX_JG') {
  414. forms.klxt.applicationId = item.id
  415. } else if(item.appKey === 'KLX') {
  416. forms.klx.applicationId = item.id
  417. } else if(item.appKey === 'KT') {
  418. forms.kt.applicationId = item.id
  419. } else if(item.appKey === 'GYT') {
  420. forms.gyt.applicationId = item.id
  421. }
  422. })
  423. await getMusicTags()
  424. await getMusicTagsKt()
  425. await getMusicSheetCategories()
  426. await getDetail()
  427. dataLoading.value = false
  428. })
  429. return () => <NSpin show={dataLoading.value}>
  430. <NForm
  431. model={forms}
  432. ref={formsRef}
  433. label-placement="top"
  434. label-width="85"
  435. >
  436. {useProjectStatus.value.GYM && <NGrid cols={8} xGap={12} style={{ marginBottom: '12px' }}>
  437. <NGi span={1} style={{ display: 'flex', alignItems: 'center' }}>
  438. <NCheckbox v-model:checked={forms.gym.checked}>管乐迷</NCheckbox>
  439. </NGi>
  440. <NGi span={7} style={{ background: '#f9f9f9', padding: '20px 16px 0', borderRadius: '8px' }}>
  441. <NGrid cols={6} xGap={12}>
  442. <NGi>
  443. <NFormItem label='收费方式' path="paymentType" required>
  444. <NSelect v-model:value={forms.gym.paymentType} clearable options={[
  445. { label: '免费', value: 'FREE' },
  446. { label: '收费', value: 'VIP' }]} />
  447. </NFormItem>
  448. </NGi>
  449. <NGi>
  450. <NFormItem label='是否支持转谱' path="isConvertibleScore" required>
  451. <NSelect v-model:value={forms.gym.isConvertibleScore} clearable options={[
  452. { label: '是', value: true },
  453. { label: '否', value: false }
  454. ] as any} />
  455. </NFormItem>
  456. </NGi>
  457. <NGi>
  458. <NFormItem label='默认谱面' path="scoreType" required>
  459. <NSelect v-model:value={forms.gym.scoreType} options={getSelectDataFromObj(scoreType)} />
  460. </NFormItem>
  461. </NGi>
  462. <NGi>
  463. <NFormItem label='是否启用' path="status" required>
  464. <NSelect v-model:value={forms.gym.status} options={[
  465. { label: '是', value: true },
  466. { label: '否', value: false }
  467. ] as any} />
  468. </NFormItem>
  469. </NGi>
  470. <NGi>
  471. <NFormItem label='排序' path="sortNo">
  472. <NInputNumber precision={0} min={0} max={999999999} v-model:value={forms.gym.sortNo} showButton={false} />
  473. </NFormItem>
  474. </NGi>
  475. </NGrid>
  476. </NGi>
  477. </NGrid>}
  478. {useProjectStatus.value.GYT && <NGrid cols={8} xGap={12} style={{ marginBottom: '12px' }}>
  479. <NGi span={1} style={{ display: 'flex', alignItems: 'center' }}>
  480. <NCheckbox v-model:checked={forms.gyt.checked}>管乐团</NCheckbox>
  481. </NGi>
  482. <NGi span={7} style={{ background: '#f9f9f9', padding: '20px 16px 0', borderRadius: '8px' }}>
  483. <NGrid cols={6} xGap={12}>
  484. <NGi>
  485. <NFormItem label='可用途径' path="availableType" required>
  486. <NSelect v-model:value={forms.gyt.availableType} clearable options={[
  487. {
  488. label: '学校',
  489. value: 'ORG'
  490. },
  491. {
  492. label: '平台',
  493. value: 'PLATFORM'
  494. }
  495. ]} />
  496. </NFormItem>
  497. </NGi>
  498. <NGi>
  499. <NFormItem label='是否支持转谱' path="isConvertibleScore" required>
  500. <NSelect v-model:value={forms.gyt.isConvertibleScore} clearable options={[
  501. { label: '是', value: true },
  502. { label: '否', value: false }
  503. ] as any} />
  504. </NFormItem>
  505. </NGi>
  506. <NGi>
  507. <NFormItem label='默认谱面' path="scoreType" required>
  508. <NSelect v-model:value={forms.gyt.scoreType} options={getSelectDataFromObj(scoreType)} />
  509. </NFormItem>
  510. </NGi>
  511. <NGi>
  512. <NFormItem label='是否启用' path="status" required>
  513. <NSelect v-model:value={forms.gyt.status} options={[
  514. { label: '是', value: true },
  515. { label: '否', value: false }
  516. ] as any} />
  517. </NFormItem>
  518. </NGi>
  519. <NGi>
  520. <NFormItem label='排序' path="sortNo">
  521. <NInputNumber precision={0} min={0} max={999999999} v-model:value={forms.gyt.sortNo} showButton={false} />
  522. </NFormItem>
  523. </NGi>
  524. </NGrid>
  525. </NGi>
  526. </NGrid>}
  527. {useProjectStatus.value.KLX_JG && <NGrid cols={8} xGap={12} style={{ marginBottom: '12px' }}>
  528. <NGi span={1} style={{ display: 'flex', alignItems: 'center' }}>
  529. <NCheckbox v-model:checked={forms.klxt.checked}>酷乐秀机构</NCheckbox>
  530. </NGi>
  531. <NGi span={7} style={{ background: '#f9f9f9', padding: '20px 16px 0', borderRadius: '8px' }}>
  532. <NGrid cols={6} xGap={12}>
  533. <NGi>
  534. <NFormItem label='是否支持转谱' path="isConvertibleScore" required>
  535. <NSelect v-model:value={forms.klxt.isConvertibleScore} clearable options={[
  536. { label: '是', value: true },
  537. { label: '否', value: false }
  538. ] as any} />
  539. </NFormItem>
  540. </NGi>
  541. <NGi>
  542. <NFormItem label='默认谱面' path="scoreType" required>
  543. <NSelect v-model:value={forms.klxt.scoreType} options={getSelectDataFromObj(scoreType)} />
  544. </NFormItem>
  545. </NGi>
  546. <NGi>
  547. <NFormItem label='是否启用' path="status" required>
  548. <NSelect v-model:value={forms.klxt.status} options={[
  549. { label: '是', value: true },
  550. { label: '否', value: false }
  551. ] as any} />
  552. </NFormItem>
  553. </NGi>
  554. <NGi>
  555. <NFormItem label='排序' path="sortNo">
  556. <NInputNumber precision={0} min={0} max={999999999} v-model:value={forms.klxt.sortNo} showButton={false} />
  557. </NFormItem>
  558. </NGi>
  559. </NGrid>
  560. </NGi>
  561. </NGrid>}
  562. {useProjectStatus.value.KLX && <NGrid cols={8} xGap={12} style={{ marginBottom: '12px' }}>
  563. <NGi span={1} style={{ display: 'flex', alignItems: 'center' }}>
  564. <NCheckbox v-model:checked={forms.klx.checked}>酷乐秀平台</NCheckbox>
  565. </NGi>
  566. <NGi span={7} style={{ background: '#f9f9f9', padding: '20px 16px 0', borderRadius: '8px' }}>
  567. <NGrid cols={6} xGap={12}>
  568. <NGi>
  569. <NFormItem label='曲目标签' required>
  570. <NSelect v-model:value={forms.klx.musicTagIds} multiple maxTagCount={1} clearable options={musicSheetTagList.value} onUpdate:value={() => {
  571. musicSheetTagList.value.forEach((item: any) => {
  572. if(forms.klx.musicTagIds?.length >= 3) {
  573. if(forms.klx.musicTagIds?.includes(item.id)) {
  574. item.disabled = false
  575. } else {
  576. item.disabled = true
  577. }
  578. } else {
  579. item.disabled = false
  580. }
  581. })
  582. }} />
  583. </NFormItem>
  584. </NGi>
  585. <NGi>
  586. <NFormItem label='收费方式' path="paymentType" required>
  587. <NSelect v-model:value={forms.klx.paymentType} multiple maxTagCount={1} clearable options={getSelectDataFromObj(musicSheetPaymentType)}
  588. onUpdate:value={(v: any) => {
  589. forms.klx.paymentType = v
  590. const free = 'FREE'
  591. if (forms.klx.paymentType[forms.klx.paymentType.length - 1] == free) {
  592. forms.klx.paymentType = [free]
  593. } else if (forms.klx.paymentType.length > 1 && forms.klx.paymentType.includes(free)) {
  594. forms.klx.paymentType.splice(forms.klx.paymentType.indexOf(free), 1)
  595. }
  596. if (!forms.klx.paymentType.includes('CHARGE')) {
  597. forms.klx.musicPrice = 0
  598. }
  599. }} />
  600. </NFormItem>
  601. </NGi>
  602. <NGi>
  603. <NFormItem label='曲目价格' path="musicPrice" required>
  604. <NInputNumber disabled={!forms.klx.paymentType?.includes('CHARGE')} precision={2 } min={0} max={9999} v-model:value={forms.klx.musicPrice} showButton={false} />
  605. </NFormItem>
  606. </NGi>
  607. {/* <NGi>
  608. <NFormItem label='可用途径' path="availableType">
  609. <NSelect v-model:value={forms.klx.availableType} clearable options={getSelectDataFromObj(musicSheetAvailableType)} />
  610. </NFormItem>
  611. </NGi> */}
  612. <NGi>
  613. <NFormItem label='是否置顶' path="topFlag" required>
  614. <NSelect v-model:value={forms.klx.topFlag} clearable options={[
  615. { label: '是', value: true },
  616. { label: '否', value: false }
  617. ] as any} />
  618. </NFormItem>
  619. </NGi>
  620. <NGi>
  621. <NFormItem label='是否精品' path="exquisiteFlag" required>
  622. <NSelect v-model:value={forms.klx.exquisiteFlag} clearable options={[
  623. { label: '是', value: true },
  624. { label: '否', value: false }
  625. ] as any} />
  626. </NFormItem>
  627. </NGi>
  628. <NGi>
  629. <NFormItem label='是否支持转谱' path="isConvertibleScore" required>
  630. <NSelect v-model:value={forms.klx.isConvertibleScore} clearable options={[
  631. { label: '是', value: true },
  632. { label: '否', value: false }
  633. ] as any} />
  634. </NFormItem>
  635. </NGi>
  636. <NGi>
  637. <NFormItem label='默认谱面' path="scoreType" required>
  638. <NSelect v-model:value={forms.klx.scoreType} options={getSelectDataFromObj(scoreType)} />
  639. </NFormItem>
  640. </NGi>
  641. <NGi>
  642. <NFormItem label='是否启用' path="status" required>
  643. <NSelect v-model:value={forms.klx.status} options={[
  644. { label: '是', value: true },
  645. { label: '否', value: false }
  646. ] as any} />
  647. </NFormItem>
  648. </NGi>
  649. <NGi>
  650. <NFormItem label='排序' path="sortNo">
  651. <NInputNumber precision={0} min={0} max={999999999} v-model:value={forms.klx.sortNo} showButton={false} />
  652. </NFormItem>
  653. </NGi>
  654. </NGrid>
  655. </NGi>
  656. </NGrid>}
  657. {useProjectStatus.value.KT && <NGrid cols={8} xGap={12} style={{ marginBottom: '12px' }}>
  658. <NGi span={1} style={{ display: 'flex', alignItems: 'center' }}>
  659. <NCheckbox v-model:checked={forms.kt.checked}>音乐数字课堂</NCheckbox>
  660. </NGi>
  661. <NGi span={7} style={{ background: '#f9f9f9', padding: '20px 16px 0', borderRadius: '8px' }}>
  662. <NGrid cols={6} xGap={12}>
  663. <NGi>
  664. <NFormItem label='乐谱教材' path="musicSheetCategoryId" required>
  665. <NSelect filterable v-model:value={forms.kt.musicSheetCategoryId} clearable options={musicSheetCategories.value} labelField='name' valueField='id' />
  666. </NFormItem>
  667. </NGi>
  668. <NGi>
  669. <NFormItem label='收费方式' path="paymentType" required>
  670. <NSelect v-model:value={forms.kt.paymentType} clearable options={[
  671. { label: '免费', value: 'FREE' },
  672. { label: '会员', value: 'VIP' }]} />
  673. </NFormItem>
  674. </NGi>
  675. <NGi>
  676. <NFormItem label='是否支持转谱' path="isConvertibleScore" required>
  677. <NSelect v-model:value={forms.kt.isConvertibleScore} clearable options={[
  678. { label: '是', value: true },
  679. { label: '否', value: false }
  680. ] as any} />
  681. </NFormItem>
  682. </NGi>
  683. <NGi>
  684. <NFormItem label='默认谱面' path="scoreType" required>
  685. <NSelect v-model:value={forms.kt.scoreType} options={getSelectDataFromObj(scoreType)} />
  686. </NFormItem>
  687. </NGi>
  688. <NGi>
  689. <NFormItem label='是否启用' path="status" required>
  690. <NSelect v-model:value={forms.kt.status} options={[
  691. { label: '是', value: true },
  692. { label: '否', value: false }
  693. ] as any} />
  694. </NFormItem>
  695. </NGi>
  696. <NGi>
  697. <NFormItem label='排序' path="sortNo">
  698. <NInputNumber precision={0} min={0} max={999999999} v-model:value={forms.kt.sortNo} showButton={false} />
  699. </NFormItem>
  700. </NGi>
  701. <NGi>
  702. <NFormItem label='曲目标签' required>
  703. <NSelect v-model:value={forms.kt.musicTagIds} multiple maxTagCount={1} clearable options={musicSheetTagListKt.value}
  704. onUpdate:show={(value: any) => {
  705. musicSheetTagListKt.value.forEach((item: any) => {
  706. if(forms.kt.musicTagIds.length >= 3) {
  707. if(forms.kt.musicTagIds?.includes(item.id)) {
  708. item.disabled = false
  709. } else {
  710. item.disabled = true
  711. }
  712. } else {
  713. item.disabled = false
  714. }
  715. })
  716. }}
  717. onUpdate:value={() => {
  718. musicSheetTagListKt.value.forEach((item: any) => {
  719. if(forms.kt.musicTagIds.length >= 3) {
  720. if(forms.kt.musicTagIds?.includes(item.id)) {
  721. item.disabled = false
  722. } else {
  723. item.disabled = true
  724. }
  725. } else {
  726. item.disabled = false
  727. }
  728. })
  729. }} />
  730. </NFormItem>
  731. </NGi>
  732. <NGi>
  733. <NFormItem label='是否推荐' required>
  734. <NSelect v-model:value={forms.kt.recommendFlag} clearable options={[
  735. { label: '是', value: true },
  736. { label: '否', value: false }
  737. ] as any} />
  738. </NFormItem>
  739. </NGi>
  740. </NGrid>
  741. </NGi>
  742. </NGrid>}
  743. <NSpace justify="end" style={'margin-top: 10px'}>
  744. <NButton type="default" onClick={() => emit('close', true)}>
  745. 取消
  746. </NButton>
  747. <NButton
  748. type="primary"
  749. onClick={() => onSubmit()}
  750. loading={btnLoading.value}
  751. disabled={btnLoading.value}
  752. >
  753. 确认
  754. </NButton>
  755. </NSpace>
  756. </NForm>
  757. </NSpin>
  758. },
  759. })