updateMusic.tsx 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. import {defineComponent, onMounted, reactive, ref} from "vue";
  2. import {NButton, NForm, NFormItem, NInputNumber, NSelect, NSpace, useMessage} from "naive-ui";
  3. import {musicSheetApplicationExtendCategoryApplicationExtendInfo, musicSheetApplicationExtendUpdate} from "@views/music-library/api";
  4. import {getSelectDataFromObj} from "@/utils/objectUtil";
  5. import {musicSheetAvailableType, musicSheetPaymentType} from "@/utils/constant";
  6. export default defineComponent({
  7. name: 'project-music-cooleshow-edu-updateMusic',
  8. props: {
  9. appId: {
  10. type: String,
  11. required: true
  12. },
  13. rowData: {
  14. type: Object,
  15. required: true
  16. },
  17. musicSheetTagList: {
  18. type: Array,
  19. default: () => []
  20. }
  21. },
  22. emits: ['close', 'getList'],
  23. setup(props, {slots, attrs, emit}) {
  24. const message = useMessage()
  25. const btnLoading = ref(false)
  26. const forms = reactive({
  27. musicTagIds: [] as any,
  28. sortNo: null as any,
  29. paymentType: [] as any,
  30. musicPrice: null as any,
  31. availableType: null as any,
  32. topFlag: null as any,
  33. exquisiteFlag: null as any,
  34. })
  35. const formsRef = ref()
  36. const state = reactive({
  37. rowData: null as any,
  38. musicSheetTagList: [] as any,
  39. })
  40. onMounted(async () => {
  41. state.rowData = props.rowData
  42. state.musicSheetTagList = props.musicSheetTagList
  43. const {data} = await musicSheetApplicationExtendCategoryApplicationExtendInfo({musicSheetId: state.rowData.id, applicationId: props.appId}) as any
  44. if (!data) {
  45. message.error("加载应用失败")
  46. return
  47. }
  48. forms.musicTagIds = data[0].musicTagIds?.split(',')
  49. forms.sortNo = data[0].sortNo
  50. forms.paymentType = data[0].paymentType?.split(',')
  51. forms.musicPrice = data[0].musicPrice
  52. forms.availableType = data[0].availableType
  53. forms.topFlag = data[0].topFlag
  54. forms.exquisiteFlag = data[0].exquisiteFlag
  55. })
  56. const onSubmit = async () => {
  57. formsRef.value.validate(async (error: any) => {
  58. if (error) return false
  59. btnLoading.value = true
  60. try {
  61. const res = await musicSheetApplicationExtendUpdate(
  62. {
  63. ...forms,
  64. musicSheetId: state.rowData.id,
  65. musicTagIds: forms.musicTagIds.join(','),
  66. paymentType: forms.paymentType.join(','),
  67. applicationId: props.appId
  68. }
  69. ) as any;
  70. if (res && res.code === 200) {
  71. emit('close')
  72. emit('getList')
  73. }
  74. } catch (error) {
  75. }
  76. btnLoading.value = false
  77. })
  78. }
  79. return () => {
  80. return (
  81. <div style="background: #fff; padding-top: 12px">
  82. <NForm
  83. ref={formsRef}
  84. labelPlacement="top"
  85. model={forms}
  86. label-placement="left"
  87. label-width="auto"
  88. >
  89. <NFormItem
  90. label="曲目标签"
  91. path="musicTagIds"
  92. rule={[
  93. {
  94. required: true,
  95. message: '请选择曲目标签'
  96. }
  97. ]}
  98. >
  99. <NSelect
  100. multiple
  101. placeholder="请选择曲目标签"
  102. options={state.musicSheetTagList}
  103. v-model:value={forms.musicTagIds}
  104. clearable
  105. />
  106. </NFormItem>
  107. <NFormItem
  108. label="收费方式"
  109. path="paymentType"
  110. rule={[
  111. {
  112. required: true,
  113. message: '请选择收费方式'
  114. }
  115. ]}
  116. >
  117. <NSelect
  118. placeholder="请选择收费方式"
  119. options={getSelectDataFromObj(musicSheetPaymentType)}
  120. v-model:value={forms.paymentType}
  121. multiple
  122. onUpdate:value={() => {
  123. const free = 'FREE'
  124. if (forms.paymentType[forms.paymentType.length - 1] == free) {
  125. forms.paymentType = [free]
  126. } else if (forms.paymentType.length > 1 && forms.paymentType.includes(free)) {
  127. forms.paymentType.splice(forms.paymentType.indexOf(free), 1)
  128. }
  129. if (!forms.paymentType.includes("CHARGE")) {
  130. forms.musicPrice = 0
  131. }
  132. }}
  133. clearable
  134. />
  135. </NFormItem>
  136. {forms.paymentType.includes('CHARGE') && (
  137. <NFormItem
  138. label="曲目价格"
  139. path="musicPrice"
  140. rule={[
  141. {
  142. required: true,
  143. message: '请输入曲目价格'
  144. }
  145. ]}
  146. >
  147. <NInputNumber
  148. style={'width:100%'}
  149. placeholder="请输入曲目价格"
  150. v-model:value={forms.musicPrice}
  151. clearable
  152. />
  153. </NFormItem>
  154. )}
  155. <NFormItem
  156. label="可用途径"
  157. path="availableType"
  158. rule={[
  159. {
  160. required: true,
  161. message: '请选择可用途径'
  162. }
  163. ]}
  164. >
  165. <NSelect
  166. placeholder="请选择可用途径"
  167. options={getSelectDataFromObj(musicSheetAvailableType)}
  168. v-model:value={forms.availableType}
  169. clearable
  170. />
  171. </NFormItem>
  172. <NFormItem
  173. label="是否置顶"
  174. path="topFlag"
  175. rule={[
  176. {
  177. required: true,
  178. message: '请选择是否置顶'
  179. }
  180. ]}
  181. >
  182. <NSelect
  183. placeholder="请选择是否置顶"
  184. options={[
  185. {
  186. label: '是',
  187. value: true
  188. },
  189. {
  190. label: '否',
  191. value: false
  192. }
  193. ] as any}
  194. v-model:value={forms.topFlag}
  195. clearable
  196. />
  197. </NFormItem>
  198. <NFormItem
  199. label="是否精品"
  200. path="exquisiteFlag"
  201. rule={[
  202. {
  203. required: true,
  204. message: '请选择是否精品'
  205. }
  206. ]}
  207. >
  208. <NSelect
  209. placeholder="请选择是否精品"
  210. options={[
  211. {
  212. label: '是',
  213. value: true
  214. },
  215. {
  216. label: '否',
  217. value: false
  218. }
  219. ] as any}
  220. v-model:value={forms.exquisiteFlag}
  221. clearable
  222. />
  223. </NFormItem>
  224. <NFormItem
  225. label="排序值"
  226. path="sortNo"
  227. rule={[
  228. {
  229. required: true,
  230. message: '请输入排序值'
  231. }
  232. ]}
  233. >
  234. <NInputNumber
  235. v-model:value={forms.sortNo}
  236. placeholder="请输入排序值"
  237. clearable
  238. min={0}
  239. max={9999}
  240. style={{width: '100%'}}
  241. />
  242. </NFormItem>
  243. </NForm>
  244. <NSpace justify="end">
  245. <NButton onClick={() => emit('close')}>取消</NButton>
  246. <NButton type="primary" onClick={onSubmit}
  247. loading={btnLoading.value}
  248. disabled={btnLoading.value}
  249. >
  250. 保存
  251. </NButton>
  252. </NSpace>
  253. </div>
  254. )
  255. }
  256. }
  257. })