updateMusic.tsx 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343
  1. import {defineComponent, onMounted, reactive, ref} from "vue";
  2. import {NButton, NCascader, NForm, NFormItem, NInputNumber, NSelect, NSpace, useMessage} from "naive-ui";
  3. import {musicSheetApplicationExtendCategoryApplicationExtendInfo, musicSheetApplicationExtendTagList, musicSheetApplicationExtendUpdate} from "@views/music-library/api";
  4. import {getSelectDataFromObj} from "@/utils/objectUtil";
  5. import {scoreType} from "@/utils/constant";
  6. import {formatTree} from "@views/music-library/musicUtil";
  7. export default defineComponent({
  8. name: 'project-music-cooleshow-edu-updateMusic',
  9. props: {
  10. appId: {
  11. type: String,
  12. required: true
  13. },
  14. rowData: {
  15. type: Object,
  16. required: true
  17. },
  18. musicSheetCategories: {
  19. type: Array,
  20. default: () => []
  21. }
  22. },
  23. emits: ['close', 'getList'],
  24. setup(props, {slots, attrs, emit}) {
  25. const message = useMessage()
  26. const btnLoading = ref(false)
  27. const forms = reactive({
  28. musicSheetCategoryId: null as any,
  29. sortNo: null as any,
  30. paymentType: null as any,
  31. isConvertibleScore: null as any,//是否支持转简谱
  32. status: null as any, // 是否启用
  33. scoreType: null as any,//默认谱面
  34. musicTagIds: [] as any, //标签
  35. recommendFlag: false, // 是否推荐
  36. })
  37. const formsRef = ref()
  38. const state = reactive({
  39. rowData: null as any,
  40. musicSheetTagListKt: [] as any,
  41. musicSheetCategories: [] as any,
  42. })
  43. const getTagList = async () => {
  44. try {
  45. const { data } = await musicSheetApplicationExtendTagList({
  46. applicationId: props.appId,
  47. })
  48. if (data && data.length > 0) {
  49. data.forEach((item: any) => {
  50. state.musicSheetTagListKt.push({
  51. ...item,
  52. label: item.name,
  53. value: item.id
  54. })
  55. })
  56. }
  57. } catch {}
  58. }
  59. onMounted(async () => {
  60. state.rowData = props.rowData
  61. formatTree(props.musicSheetCategories)
  62. state.musicSheetCategories = props.musicSheetCategories
  63. await getTagList()
  64. const {data} = await musicSheetApplicationExtendCategoryApplicationExtendInfo({musicSheetId: state.rowData.id, applicationId: props.appId}) as any
  65. if (!data) {
  66. message.error("加载应用失败")
  67. return
  68. }
  69. forms.musicTagIds = data[0].musicTagIds ? data[0].musicTagIds.split(',') : []
  70. forms.recommendFlag = data[0].recommendFlag
  71. forms.musicSheetCategoryId = data[0].musicSheetCategoryId
  72. forms.sortNo = data[0].sortNo
  73. forms.paymentType = data[0].paymentType
  74. forms.isConvertibleScore = data[0].isConvertibleScore
  75. forms.scoreType = data[0].scoreType
  76. forms.status = data[0].status
  77. })
  78. const onSubmit = async () => {
  79. formsRef.value.validate(async (error: any) => {
  80. if (error) return false
  81. btnLoading.value = true
  82. try {
  83. const res = await musicSheetApplicationExtendUpdate(
  84. {
  85. ...forms,
  86. musicTagIds: forms.musicTagIds ? forms.musicTagIds.join(',') : '',
  87. musicSheetId: state.rowData.id,
  88. applicationId: props.appId
  89. }
  90. ) as any;
  91. if (res && res.code === 200) {
  92. emit('close')
  93. emit('getList')
  94. }
  95. } catch (error) {
  96. }
  97. btnLoading.value = false
  98. })
  99. }
  100. return () => {
  101. return (
  102. <div style="background: #fff; padding-top: 12px">
  103. <NForm
  104. ref={formsRef}
  105. labelPlacement="top"
  106. model={forms}
  107. label-placement="left"
  108. label-width="auto"
  109. >
  110. <NFormItem
  111. label="曲目标签"
  112. path="musicTagIds"
  113. rule={[
  114. {
  115. required: true,
  116. message: '请选择曲目标签'
  117. }
  118. ]}
  119. >
  120. <NSelect
  121. placeholder="请选择曲目标签"
  122. value={forms.musicTagIds}
  123. options={state.musicSheetTagListKt}
  124. clearable
  125. multiple
  126. maxTagCount={2}
  127. onUpdate:show={(value: any) => {
  128. state.musicSheetTagListKt.forEach((item: any) => {
  129. if(forms['musicTagIds']?.length >= 3) {
  130. if(forms['musicTagIds']?.includes(item.id)) {
  131. item.disabled = false
  132. } else {
  133. item.disabled = true
  134. }
  135. } else {
  136. item.disabled = false
  137. }
  138. })
  139. }}
  140. onUpdate:value={(value) => {
  141. forms['musicTagIds'] = value
  142. state.musicSheetTagListKt.forEach((item: any) => {
  143. if(forms['musicTagIds']?.length >= 3) {
  144. if(forms['musicTagIds']?.includes(item.id)) {
  145. item.disabled = false
  146. } else {
  147. item.disabled = true
  148. }
  149. } else {
  150. item.disabled = false
  151. }
  152. })
  153. }}
  154. />
  155. </NFormItem>
  156. <NFormItem
  157. label="是否推荐"
  158. path="recommendFlag"
  159. rule={[
  160. {
  161. required: true,
  162. message: '请选择是否推荐',
  163. type: "boolean"
  164. }
  165. ]}
  166. >
  167. <NSelect
  168. placeholder="请选择是否推荐"
  169. value={forms.recommendFlag as any}
  170. options={[{ label: '是', value: true },
  171. { label: '否', value: false } as any]}
  172. clearable
  173. onUpdateValue={(value) => {
  174. forms['recommendFlag'] = value
  175. }}
  176. />
  177. </NFormItem>
  178. <NFormItem
  179. label="乐谱教材"
  180. path="musicSheetCategoryId"
  181. rule={[
  182. {
  183. required: true,
  184. message: '请选择乐谱教材'
  185. }
  186. ]}
  187. >
  188. <NCascader
  189. valueField="id"
  190. labelField="name"
  191. children-field="children"
  192. placeholder="请选择乐谱教材"
  193. value={forms.musicSheetCategoryId}
  194. options={state.musicSheetCategories}
  195. checkStrategy={"child"}
  196. onUpdateValue={(value: any) => {
  197. forms.musicSheetCategoryId = value
  198. }}
  199. clearable
  200. />
  201. </NFormItem>
  202. <NFormItem
  203. label="收费方式"
  204. path="paymentType"
  205. rule={[
  206. {
  207. required: true,
  208. message: '请选择收费方式'
  209. }
  210. ]}
  211. >
  212. <NSelect
  213. placeholder="请选择收费方式"
  214. options={[
  215. {
  216. label:'免费',
  217. value:'FREE'
  218. },
  219. {
  220. label:'会员',
  221. value:'VIP'
  222. }
  223. ]}
  224. v-model:value={forms.paymentType}
  225. clearable
  226. />
  227. </NFormItem>
  228. <NFormItem
  229. label="默认谱面"
  230. path="scoreType"
  231. rule={[
  232. {
  233. required: true,
  234. message: '请选择默认谱面'
  235. }
  236. ]}
  237. >
  238. <NSelect
  239. v-model:value={forms.scoreType}
  240. placeholder="请选择默认谱面"
  241. options={getSelectDataFromObj(scoreType)}
  242. clearable
  243. />
  244. </NFormItem>
  245. <NFormItem
  246. label="支持转谱"
  247. path="isConvertibleScore"
  248. rule={[
  249. {
  250. required: true,
  251. message: '请选择是否支持转谱',
  252. trigger: ['input', 'blur'],
  253. type: 'boolean'
  254. }
  255. ]}
  256. >
  257. <NSelect
  258. v-model:value={forms.isConvertibleScore}
  259. options={
  260. [
  261. {
  262. label: '是',
  263. value: true
  264. },
  265. {
  266. label: '否',
  267. value: false
  268. }
  269. ] as any
  270. }
  271. placeholder="请选择是否支持转谱"
  272. onUpdateValue={async (value: any) => {
  273. if (!value) {
  274. //如果不支持,修改默认谱面
  275. // forms.scoreType = 'STAVE'
  276. }
  277. }}
  278. clearable
  279. ></NSelect>
  280. </NFormItem>
  281. <NFormItem
  282. label="是否启用"
  283. path="status"
  284. rule={[
  285. {
  286. required: true,
  287. message: '请选择是否启用'
  288. }
  289. ]}
  290. >
  291. <NSelect
  292. placeholder="请选择是否启用"
  293. options={[
  294. {
  295. label: '是',
  296. value: true
  297. },
  298. {
  299. label: '否',
  300. value: false
  301. }
  302. ] as any}
  303. v-model:value={forms.status}
  304. clearable
  305. />
  306. </NFormItem>
  307. <NFormItem
  308. label="排序值"
  309. path="sortNo"
  310. >
  311. <NInputNumber
  312. v-model:value={forms.sortNo}
  313. placeholder="请输入排序值"
  314. clearable
  315. precision={0}
  316. min={0}
  317. max={9999}
  318. style={{width: '100%'}}
  319. />
  320. </NFormItem>
  321. </NForm>
  322. <NSpace justify="end">
  323. <NButton onClick={() => emit('close')}>取消</NButton>
  324. <NButton type="primary" onClick={onSubmit}
  325. loading={btnLoading.value}
  326. disabled={btnLoading.value}
  327. >
  328. 保存
  329. </NButton>
  330. </NSpace>
  331. </div>
  332. )
  333. }
  334. }
  335. })