瀏覽代碼

添加字段

lex-xin 9 月之前
父節點
當前提交
4c77a9b665

+ 0 - 1
components.d.ts

@@ -37,7 +37,6 @@ declare module '@vue/runtime-core' {
     NRadio: typeof import('naive-ui')['NRadio']
     NRadioGroup: typeof import('naive-ui')['NRadioGroup']
     NSpace: typeof import('naive-ui')['NSpace']
-    NSpin: typeof import('naive-ui')['NSpin']
     NTooltip: typeof import('naive-ui')['NTooltip']
     Recharge: typeof import('./src/components/Lockscreen/Recharge.vue')['default']
     RouterError: typeof import('./src/components/RouterError/RouterError.vue')['default']

+ 77 - 4
src/views/music-library/music-sheet/modal/music-platform.tsx

@@ -79,7 +79,9 @@ export default defineComponent({
                 isConvertibleScore: true,
                 scoreType: 'FIRST',
                 status: true,
-                sortNo: null
+                sortNo: null,
+                musicTagIds: [] as any, // 标签
+                recommendFlag: false,
             }
         })
 
@@ -96,6 +98,7 @@ export default defineComponent({
         const formsRef = ref()
         const dataLoading  = ref(false)
         const musicSheetTagList = ref<any[]>([])
+        const musicSheetTagListKt = ref<any[]>([])
         const musicSheetCategories = ref<any[]>([])
         const btnLoading = ref(false)
 
@@ -235,6 +238,14 @@ export default defineComponent({
                     message.error('请选择是否启用')
                     return true
                 }
+                if(kt.musicTagIds.length <= 0) {
+                    message.error('请选择曲目标签')
+                    return true
+                }
+                if(kt.recommendFlag == null) {
+                    message.error('请选择是否推荐')
+                    return true
+                }
             }
 
             return status
@@ -272,7 +283,8 @@ export default defineComponent({
             }
             if(forms.kt.checked) {
                 params.push({
-                    ...forms.kt
+                    ...forms.kt,
+                    musicTagIds: forms.kt.musicTagIds.join(','),
                 })
                 useApplicationIds.push(forms.kt.applicationId)
             }
@@ -317,6 +329,26 @@ export default defineComponent({
                 }
             } catch (err) {}
         }
+        /** 课堂乐器 加载曲目标签 */
+        const getMusicTagsKt = async () => {
+            try {
+                const useProject = props.useProject || []
+                const item: any = useProject.find((item: any) => item.appKey === 'KT')
+                if(!item) return
+                const { data } = await musicSheetApplicationExtendTagList({ 
+                    applicationId: item.id 
+                })
+                if (data && data.length > 0) {
+                data.forEach((item: any) => {
+                    musicSheetTagListKt.value.push({
+                        ...item,
+                        label: item.name,
+                        value: item.id
+                    })
+                })
+                }
+            } catch (err) {}
+        }
 
         /** 课堂乐器 乐谱教材 */
         const getMusicSheetCategories = async () => {
@@ -383,6 +415,8 @@ export default defineComponent({
                         forms.kt.scoreType = item.scoreType
                         forms.kt.status = item.status
                         forms.kt.sortNo = item.sortNo
+                        forms.kt.musicTagIds = item.musicTagIds ? item.musicTagIds.split(',') : []  // 标签
+                        forms.kt.recommendFlag = item.recommendFlag
                     }
                 })
             } catch {
@@ -416,6 +450,7 @@ export default defineComponent({
                 } 
             })
             await getMusicTags()
+            await getMusicTagsKt()
             await getMusicSheetCategories()
             await getDetail()
             dataLoading.value = false
@@ -565,7 +600,19 @@ export default defineComponent({
                     <NGrid cols={6} xGap={12}>
                         <NGi>
                         <NFormItem label='曲目标签' required>
-                            <NSelect v-model:value={forms.klx.musicTagIds} multiple maxTagCount={1} clearable options={musicSheetTagList.value} />
+                            <NSelect v-model:value={forms.klx.musicTagIds} multiple maxTagCount={1} clearable options={musicSheetTagList.value} onUpdate:value={() => {
+                                    musicSheetTagList.value.forEach((item: any) => {
+                                        if(forms.klx.musicTagIds?.length >= 3) {
+                                            if(forms.klx.musicTagIds?.includes(item.id)) {
+                                                item.disabled = false
+                                            } else {
+                                                item.disabled = true
+                                            }
+                                        } else {
+                                            item.disabled = false
+                                        }
+                                    })
+                                }} />
                         </NFormItem>
                         </NGi>
                         <NGi>
@@ -649,7 +696,7 @@ export default defineComponent({
                     <NGrid cols={6} xGap={12}>
                         <NGi>
                         <NFormItem label='乐谱教材' path="musicSheetCategoryId" required>
-                            <NSelect v-model:value={forms.kt.musicSheetCategoryId} clearable options={musicSheetCategories.value} labelField='name' valueField='id' />
+                            <NSelect filterable v-model:value={forms.kt.musicSheetCategoryId} clearable options={musicSheetCategories.value} labelField='name' valueField='id' />
                         </NFormItem>
                         </NGi>
                         <NGi>
@@ -685,6 +732,32 @@ export default defineComponent({
                             <NInputNumber precision={0} min={0} max={999999999} v-model:value={forms.kt.sortNo} showButton={false} />
                         </NFormItem>
                         </NGi>
+                        <NGi>
+                        <NFormItem label='曲目标签' required>
+                            <NSelect v-model:value={forms.kt.musicTagIds} multiple maxTagCount={1} clearable options={musicSheetTagListKt.value} 
+                                onUpdate:value={() => {
+                                    musicSheetTagListKt.value.forEach((item: any) => {
+                                        if(forms.kt.musicTagIds.length >= 3) {
+                                            if(forms.kt.musicTagIds?.includes(item.id)) {
+                                                item.disabled = false
+                                            } else {
+                                                item.disabled = true
+                                            }
+                                        } else {
+                                            item.disabled = false
+                                        }
+                                    })
+                                }} />
+                        </NFormItem>
+                        </NGi>
+                        <NGi>
+                        <NFormItem label='是否推荐' required>
+                            <NSelect v-model:value={forms.kt.recommendFlag} clearable options={[
+                                {  label: '是',  value: true },
+                                { label: '否',  value: false }
+                                ] as any} />
+                        </NFormItem>
+                        </NGi>
                     </NGrid>
                 </NGi>
             </NGrid>}

+ 240 - 3
src/views/music-library/project-music-sheet/module/kt/addMusic.tsx

@@ -24,6 +24,7 @@ import { appKey, musicSheetSourceType, musicSheetType, scoreType } from '@/utils
 import {
   musicSheetApplicationExtendCategoryList,
   musicSheetApplicationExtendSaveBatch,
+  musicSheetApplicationExtendTagList,
   musicSheetApplicationOwnerList,
   musicSheetPage
 } from '@views/music-library/api'
@@ -80,6 +81,9 @@ export default defineComponent({
       dataList: [],
       selectRowData: [] as any, // 选择的数据列表
       musicSheetCategories: [] as any,
+      musicSheetTagListKt: [] as any,
+      musicTagIds: [] as any, //标签
+      recommendFlag: false, // 是否推荐
       startSortNum: null as any, // 排序起始值
       projectMusicCategoryId: null as any, // 曲目分类ID
       isConvertibleScore: null as any, //是否支持转简谱
@@ -92,6 +96,23 @@ export default defineComponent({
       globalPaymentType: null as any
     })
 
+    const getTagList = async () => {
+      try {
+        const { data } = await musicSheetApplicationExtendTagList({
+          applicationId: props.appId,
+        })
+        if (data && data.length > 0) {
+          data.forEach((item: any) => {
+            state.musicSheetTagListKt.push({
+                ...item,
+                label: item.name,
+                value: item.id
+            })
+        })
+        }
+      } catch {}
+    }
+
     onMounted(async () => {
       state.searchForm.keyword = null
       // state.searchForm.musicSheetType = null
@@ -113,6 +134,9 @@ export default defineComponent({
           state.musicSheetCategories = data[0].musicSheetCategories
         }
       } catch {}
+
+      
+      await getTagList()
       await initUseAppList()
       await getList()
     })
@@ -184,6 +208,15 @@ export default defineComponent({
       const params = [] as any[]
       for (let i = 0; i < state.selectRowData.length; i++) {
         const item = state.selectRowData[i]
+
+        if (item.musicTagIds.length <= 0) {
+          message.error('曲目标签不能为空')
+          return
+        }
+        if (item.recommendFlag == null) {
+          message.error('请选择是否推荐')
+          return
+        }
         if (!item.projectMusicCategoryId) {
           message.error('乐谱教材不能为空')
           return
@@ -212,6 +245,7 @@ export default defineComponent({
           musicSheetId: item.id,
           musicSheetCategoryId: item.projectMusicCategoryId,
           applicationId: props.appId,
+          musicTagIds: item.musicTagIds ? item.musicTagIds.join(','): '',
           id: null
         })
       }
@@ -291,6 +325,211 @@ export default defineComponent({
     const stepColumns = (): DataTableColumns => {
       const field = deepClone(columnsField)
       field.splice(0, 1)
+
+
+      // {
+      //   title: '曲目标签',
+      //   key: 'userName',
+      //   render: (row: any) => <TheTooltip content={row.musicTagNames} />
+      // }
+      // ,
+      // {
+      //   title: '是否推荐',
+      //   key: 'userName',
+      //   render: (row: any) => (
+      //     row.recommendFlag ? '是' : '否'
+      //   )
+      // }
+      field.push({
+        title(column: any) {
+          return (
+            <NSpace>
+              曲目标签
+              <NButton
+                type="primary"
+                size="small"
+                text
+                onClick={() => {
+                  state.musicSheetTagListKt.forEach((item: any) => {  
+                      item.disabled = false
+                  })
+                  dialogs.create({
+                    title: '请选择曲目标签',
+                    showIcon: false,
+                    content: () => {
+                      return h(
+                        'div',
+                        {
+                          class: 'flex flex-col justify-center items-center text-14px'
+                        },
+                        [
+                          h(NSelect, {
+                            onUpdateValue(v) {
+                              state.musicTagIds = v
+                              state.musicSheetTagListKt.forEach((item: any) => {
+                                if(state.musicTagIds?.length >= 3) {
+                                    if(state.musicTagIds?.includes(item.id)) {
+                                        item.disabled = false
+                                    } else {
+                                        item.disabled = true
+                                    }
+                                } else {
+                                    item.disabled = false
+                                }
+                              })
+                            },
+                            multiple: true,
+                            maxTagCount: 2,
+                            clearable: true,
+                            options: state.musicSheetTagListKt
+                          })
+                        ]
+                      )
+                    },
+                    positiveText: '确定',
+                    negativeText: '取消',
+                    onPositiveClick: () => {
+                      for (let i = 0; i < state.selectRowData.length; i++) {
+                        const item = state.selectRowData[i]
+                        item.musicTagIds = state.musicTagIds
+                      }
+                    },
+                    onNegativeClick: () => {
+
+                    }
+                  })
+                }}
+              >
+                <NIcon size={15} style="padding-left: 5px;margin-top:4px">
+                  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32">
+                    <path d="M2 26h28v2H2z" fill="currentColor"></path>
+                    <path
+                      d="M25.4 9c.8-.8.8-2 0-2.8l-3.6-3.6c-.8-.8-2-.8-2.8 0l-15 15V24h6.4l15-15zm-5-5L24 7.6l-3 3L17.4 7l3-3zM6 22v-3.6l10-10l3.6 3.6l-10 10H6z"
+                      fill="currentColor"
+                    ></path>
+                  </svg>
+                </NIcon>
+              </NButton>
+            </NSpace>
+          )
+        },
+        key: 'musicTagIds',
+        width: 200,
+        render: (row: any) => {
+          // })
+          return (
+            <NSelect
+              placeholder="请选择曲目标签"
+              value={row.musicTagIds}
+              options={state.musicSheetTagListKt}
+              clearable
+              multiple
+              maxTagCount={1}
+              onUpdate:show={(value: any) => {
+                  state.musicSheetTagListKt.forEach((item: any) => {
+                    if(row['musicTagIds']?.length >= 3) {
+                        if(row['musicTagIds']?.includes(item.id)) {
+                            item.disabled = false
+                        } else {
+                            item.disabled = true
+                        }
+                    } else {
+                        item.disabled = false
+                    }
+                })
+              }}
+              onUpdate:value={(value) => {
+                row['musicTagIds'] = value
+                state.musicSheetTagListKt.forEach((item: any) => {
+                    if(row['musicTagIds']?.length >= 3) {
+                        if(row['musicTagIds']?.includes(item.id)) {
+                            item.disabled = false
+                        } else {
+                            item.disabled = true
+                        }
+                    } else {
+                        item.disabled = false
+                    }
+                })
+                
+              }} 
+            />
+          )
+        }
+      })
+      field.push({
+        title(column: any) {
+          return (
+            <NSpace>
+              是否推荐
+              <NButton
+                type="primary"
+                size="small"
+                text
+                onClick={() => {
+                  dialogs.create({
+                    title: '请选择是否推荐',
+                    showIcon: false,
+                    content: () => {
+                      return h(
+                        'div',
+                        {
+                          class: 'flex flex-col justify-center items-center text-14px'
+                        },
+                        [
+                          h(NSelect, {
+                            onUpdateValue(v) {
+                              state.recommendFlag = v
+                            },
+                            clearable: true,
+                            options: [{  label: '是',  value: true },
+                              { label: '否',  value: false } as any]
+                          })
+                        ]
+                      )
+                    },
+                    positiveText: '确定',
+                    negativeText: '取消',
+                    onPositiveClick: () => {
+                      for (let i = 0; i < state.selectRowData.length; i++) {
+                        const item = state.selectRowData[i]
+                        item.recommendFlag = state.recommendFlag
+                      }
+                    }
+                  })
+                }}
+              >
+                <NIcon size={15} style="padding-left: 5px;margin-top:4px">
+                  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32">
+                    <path d="M2 26h28v2H2z" fill="currentColor"></path>
+                    <path
+                      d="M25.4 9c.8-.8.8-2 0-2.8l-3.6-3.6c-.8-.8-2-.8-2.8 0l-15 15V24h6.4l15-15zm-5-5L24 7.6l-3 3L17.4 7l3-3zM6 22v-3.6l10-10l3.6 3.6l-10 10H6z"
+                      fill="currentColor"
+                    ></path>
+                  </svg>
+                </NIcon>
+              </NButton>
+            </NSpace>
+          )
+        },
+        key: 'recommendFlag',
+        width: 200,
+        render: (row: any) => {
+          // })
+          return (
+            <NSelect
+            placeholder="请选择是否推荐"
+            value={row.recommendFlag}
+            options={[{  label: '是',  value: true },
+              { label: '否',  value: false } as any]}
+            clearable
+            onUpdateValue={(value) => {
+              row['recommendFlag'] = value
+            }}
+          />
+          )
+        }
+      })
       field.push({
         title(column: any) {
           return (
@@ -351,7 +590,6 @@ export default defineComponent({
           )
         },
         key: 'projectMusicCategoryId',
-        fixed: 'right',
         width: 200,
         render: (row: any) => {
           // })
@@ -770,7 +1008,6 @@ export default defineComponent({
           )
         },
         key: 'sortNo',
-        fixed: 'right',
         width: 150,
         render: (row: any) => {
           return h(NInputNumber, {
@@ -1028,7 +1265,7 @@ export default defineComponent({
                 data={state.selectRowData}
                 rowKey={(row: any) => row.id}
                 maxHeight={500}
-                scrollX={1800}
+                scrollX={2500}
               ></NDataTable>
             </div>
           )}

+ 58 - 0
src/views/music-library/project-music-sheet/module/kt/music-sheet-kt.tsx

@@ -26,6 +26,7 @@ import {
   musicSheetApplicationExtendCategoryList,
   musicSheetApplicationExtendDel,
   musicSheetApplicationExtendStatus,
+  musicSheetApplicationExtendTagList,
   musicSheetApplicationOwnerList,
   musicSheetPageByApplication,
   musicSheetRemove
@@ -77,6 +78,8 @@ export default defineComponent({
         times: null, // 上传时间
         // startTime: null, //上传时间(年月日)
         // endTime: null, //上传时间(年月日)
+        musicTagIds: null as any, // 曲目标签
+        recommendFlag: null, // 是否推荐
         audioType: null, //音频类型(HOMEMODE: 自制 COMMON: 普通)
         exquisiteFlag: null, //精品标志
         topFlag: null, //是否置顶(0:否;1:是)
@@ -101,6 +104,26 @@ export default defineComponent({
       musicScore: null as any,
       useProjectData: [] as any // 适用项目行数据
     })
+    const musicSheetTagListKt = ref<any[]>([])
+
+
+    /** 课堂乐器 加载曲目标签 */
+    const getMusicTagsKt = async () => {
+      try {
+          const { data } = await musicSheetApplicationExtendTagList({ 
+              applicationId: state.applicationId
+          })
+          if (data && data.length > 0) {
+          data.forEach((item: any) => {
+              musicSheetTagListKt.value.push({
+                  ...item,
+                  label: item.name,
+                  value: item.id
+              })
+          })
+          }
+      } catch (err) {}
+  }
 
     onMounted(async () => {
       state.loading = true
@@ -137,6 +160,7 @@ export default defineComponent({
           state.musicSheetCategories = categoryRes.data[0].musicSheetCategories
         }
       } catch {}
+      await getMusicTagsKt()
       // 加载表格数据
       initUseAppList()
       getList()
@@ -189,6 +213,7 @@ export default defineComponent({
         const params = {
           ...state.pagination,
           ...state.searchForm,
+          musicTagIds:  state.searchForm.musicTagIds ?  state.searchForm.musicTagIds.join(',') : '',
           userId: sourceType && sourceType === 'PERSON' ? state.searchForm.userId : null,
           organizationRoleId: sourceType && sourceType === 'ORG' ? state.searchForm.userId : null,
           ...filterTimes(state.searchForm.times, ['startTime', 'endTime']),
@@ -364,6 +389,18 @@ export default defineComponent({
             )
           }
         },
+        {
+          title: '曲目标签',
+          key: 'musicTagNames',
+          render: (row: any) => <TheTooltip content={row.musicTagNames} />
+        },
+        {
+          title: '是否推荐',
+          key: 'recommendFlag',
+          render: (row: any) => (
+            row.recommendFlag ? '是' : '否'
+          )
+        },
         // {
         //   title: '可用声部',
         //   key: 'subjectNames',
@@ -686,6 +723,27 @@ export default defineComponent({
                 clearable
               />
             </NFormItem>
+            <NFormItem label="曲目标签" path="musicTagIds">
+              <NSelect
+                v-model:value={state.searchForm.musicTagIds}
+                placeholder="请选择曲目标签"
+                options={musicSheetTagListKt.value}
+                clearable
+                multiple
+                maxTagCount={2}
+              />
+            </NFormItem>
+            <NFormItem label="是否推荐" path="recommendFlag">
+              <NSelect
+                v-model:value={state.searchForm.recommendFlag}
+                placeholder="请选择是否推荐"
+                options={[
+                  {  label: '是',  value: true },
+                  { label: '否',  value: false }
+                  ] as any}
+                clearable
+              />
+            </NFormItem>
             <NFormItem>
               <NSpace>
                 <NButton type="primary" onClick={onSearch}>

+ 95 - 1
src/views/music-library/project-music-sheet/module/kt/updateMusic.tsx

@@ -1,6 +1,6 @@
 import {defineComponent, onMounted, reactive, ref} from "vue";
 import {NButton, NCascader, NForm, NFormItem, NInputNumber, NSelect, NSpace, useMessage} from "naive-ui";
-import {musicSheetApplicationExtendCategoryApplicationExtendInfo, musicSheetApplicationExtendUpdate} from "@views/music-library/api";
+import {musicSheetApplicationExtendCategoryApplicationExtendInfo, musicSheetApplicationExtendTagList, musicSheetApplicationExtendUpdate} from "@views/music-library/api";
 import {getSelectDataFromObj} from "@/utils/objectUtil";
 import {scoreType} from "@/utils/constant";
 import {formatTree} from "@views/music-library/musicUtil";
@@ -32,23 +32,46 @@ export default defineComponent({
       isConvertibleScore: null as any,//是否支持转简谱
       status: null as any, // 是否启用
       scoreType: null as any,//默认谱面
+      musicTagIds: [] as any, //标签
+      recommendFlag: false, // 是否推荐
     })
     const formsRef = ref()
 
     const state = reactive({
       rowData: null as any,
+      musicSheetTagListKt: [] as any,
       musicSheetCategories: [] as any,
     })
 
+    const getTagList = async () => {
+      try {
+        const { data } = await musicSheetApplicationExtendTagList({
+          applicationId: props.appId,
+        })
+        if (data && data.length > 0) {
+          data.forEach((item: any) => {
+            state.musicSheetTagListKt.push({
+                ...item,
+                label: item.name,
+                value: item.id
+            })
+        })
+        }
+      } catch {}
+    }
+
     onMounted(async () => {
       state.rowData = props.rowData
       formatTree(props.musicSheetCategories)
       state.musicSheetCategories = props.musicSheetCategories
+      await getTagList()
       const {data} = await musicSheetApplicationExtendCategoryApplicationExtendInfo({musicSheetId: state.rowData.id, applicationId: props.appId}) as any
       if (!data) {
         message.error("加载应用失败")
         return
       }
+      forms.musicTagIds = data[0].musicTagIds ? data[0].musicTagIds.split(',') : []
+      forms.recommendFlag = data[0].recommendFlag
       forms.musicSheetCategoryId = data[0].musicSheetCategoryId
       forms.sortNo = data[0].sortNo
       forms.paymentType = data[0].paymentType
@@ -65,6 +88,7 @@ export default defineComponent({
           const res = await musicSheetApplicationExtendUpdate(
               {
                 ...forms,
+                musicTagIds: forms.musicTagIds ? forms.musicTagIds.join(',') : '',
                 musicSheetId: state.rowData.id,
                 applicationId: props.appId
               }
@@ -90,6 +114,75 @@ export default defineComponent({
                 label-width="auto"
             >
               <NFormItem
+                  label="曲目标签"
+                  path="musicTagIds"
+                  rule={[
+                    {
+                      required: true,
+                      message: '请选择曲目标签'
+                    }
+                  ]}
+              >
+                <NSelect
+                  placeholder="请选择曲目标签"
+                  value={forms.musicTagIds}
+                  options={state.musicSheetTagListKt}
+                  clearable
+                  multiple
+                  maxTagCount={2}
+                  onUpdate:show={(value: any) => {
+                      state.musicSheetTagListKt.forEach((item: any) => {
+                        if(forms['musicTagIds']?.length >= 3) {
+                            if(forms['musicTagIds']?.includes(item.id)) {
+                                item.disabled = false
+                            } else {
+                                item.disabled = true
+                            }
+                        } else {
+                            item.disabled = false
+                        }
+                    })
+                  }}
+                  onUpdate:value={(value) => {
+                    forms['musicTagIds'] = value
+                    state.musicSheetTagListKt.forEach((item: any) => {
+                        if(forms['musicTagIds']?.length >= 3) {
+                            if(forms['musicTagIds']?.includes(item.id)) {
+                                item.disabled = false
+                            } else {
+                                item.disabled = true
+                            }
+                        } else {
+                            item.disabled = false
+                        }
+                    })
+                    
+                  }} 
+                />
+              </NFormItem>
+              <NFormItem
+                  label="是否推荐"
+                  path="recommendFlag"
+                  rule={[
+                    {
+                      required: true,
+                      message: '请选择是否推荐',
+                      type: "boolean"
+                    }
+                  ]}
+              >
+              <NSelect
+                placeholder="请选择是否推荐"
+                value={forms.recommendFlag as any}
+                options={[{  label: '是',  value: true },
+                  { label: '否',  value: false } as any]}
+                clearable
+                onUpdateValue={(value) => {
+                  forms['recommendFlag'] = value
+                }}
+              />
+          </NFormItem>
+              <NFormItem
                   label="乐谱教材"
                   path="musicSheetCategoryId"
                   rule={[
@@ -226,6 +319,7 @@ export default defineComponent({
                     v-model:value={forms.sortNo}
                     placeholder="请输入排序值"
                     clearable
+                    precision={0}
                     min={0}
                     max={9999}
                     style={{width: '100%'}}