Browse Source

问题修改

yuanliang 1 year ago
parent
commit
1a4448c968
24 changed files with 3100 additions and 1658 deletions
  1. 13 0
      src/views/music-library/api.ts
  2. 25 7
      src/views/music-library/music-sheet/component/music-list.tsx
  3. 52 3
      src/views/music-library/music-sheet/modal/music-operation.tsx
  4. 27 18
      src/views/music-library/music-sheet/modal/musicSheetOwnerDialog.tsx
  5. 20 6
      src/views/music-library/music-sheet/modal/use-project.tsx
  6. 21 15
      src/views/music-library/project-music-sheet/index.tsx
  7. 0 349
      src/views/music-library/project-music-sheet/module/cooleshow/cooleshow.tsx
  8. 1 1
      src/views/music-library/project-music-sheet/module/gym/addMusic.tsx
  9. 576 0
      src/views/music-library/project-music-sheet/module/gym/music-sheet-gym.tsx
  10. 539 0
      src/views/music-library/project-music-sheet/module/gyt/addMusic.tsx
  11. 576 0
      src/views/music-library/project-music-sheet/module/gyt/music-sheet-gyt.tsx
  12. 0 240
      src/views/music-library/project-music-sheet/module/jmedu/addMusic.tsx
  13. 0 349
      src/views/music-library/project-music-sheet/module/jmedu/jmedu.tsx
  14. 0 0
      src/views/music-library/project-music-sheet/module/klx/addMusic.tsx
  15. 595 0
      src/views/music-library/project-music-sheet/module/klx/music-sheet-klx.tsx
  16. 539 0
      src/views/music-library/project-music-sheet/module/kt/addMusic.tsx
  17. 76 66
      src/views/music-library/project-music-sheet/module/kt/music-sheet-kt.tsx
  18. 0 0
      src/views/music-library/project-music-sheet/module/kt/updateMusic.tsx
  19. 0 240
      src/views/music-library/project-music-sheet/module/mec/addMusic.tsx
  20. 0 349
      src/views/music-library/project-music-sheet/module/mec/mec.tsx
  21. 10 0
      src/views/system-manage/subject-manage/api.ts
  22. 3 7
      src/views/system-manage/subject-manage/instrument/modal/instrument-save.tsx
  23. 23 8
      src/views/system-manage/subject-manage/subject/modal/subject-save.tsx
  24. 4 0
      src/views/system-manage/system-apply/index.tsx

+ 13 - 0
src/views/music-library/api.ts

@@ -281,3 +281,16 @@ export const musicSheetApplicationExtendUpdate = (params?: any) => {
     data: params
   } as any)
 }
+
+
+/**
+ *  @description: 曲目标签列表
+ * @param params
+ */
+export const musicTagList = (params?: any) => {
+  return request({
+    url: '/cbs-app/musicTag/list',
+    method: 'post',
+    data: params
+  } as any)
+}

+ 25 - 7
src/views/music-library/music-sheet/component/music-list.tsx

@@ -64,12 +64,6 @@ export default defineComponent({
           title: '曲目编号',
           key: 'id'
         },
-        // {
-        //   title (column: any) {
-        //     return <NImage width={60} height={60} src={column.titleImg}/>
-        //   },
-        //   key: 'id'
-        // },
         {
           title: '曲目名称',
           key: 'name'
@@ -101,7 +95,10 @@ export default defineComponent({
         },
         {
           title: '所属人',
-          key: 'composer'
+          key: 'composer',
+          render(row: any) {
+            return (getOwnerName(row))
+          }
         },
         {
           title: '上传人',
@@ -243,6 +240,27 @@ export default defineComponent({
       ]
     }
 
+    const getOwnerName = ((row: any) => {
+      let ownerName;
+      if (row.musicSheetExtend?.userName) {
+        ownerName = row.musicSheetExtend.userName
+      }
+
+      const filter = state.useProjectData.filter((next: any) => {
+        return next.id == row.musicSheetExtend?.applicationId
+      }) as any;
+      if (row.sourceType && filter.length > 0) {
+        if (row.sourceType == 'ORG') {
+          ownerName += ' (' + filter[0].appName + ')'
+        } else if (row.sourceType == 'PERSON') {
+          ownerName += ' (' + filter[0].appName + ')'
+        } else if (row.sourceType == 'PLATFORM') {
+          ownerName += ' (' + filter[0].appName + ')'
+        }
+      }
+      return ownerName;
+    })
+
     const checkedRowKeysRef = ref<DataTableRowKey[]>([])
     const handleCheck = (rowKeys: DataTableRowKey[]) => {
       checkedRowKeysRef.value = rowKeys

+ 52 - 3
src/views/music-library/music-sheet/modal/music-operation.tsx

@@ -25,11 +25,12 @@ import UploadFile from '@/components/upload-file'
 import styles from './index.module.less'
 import deepClone from '@/utils/deep.clone'
 import axios from 'axios'
-import {musicSheetSourceType, musicSheetType} from "@/utils/constant";
-import {getSelectDataFromObj} from "@/utils/objectUtil";
+import {appKey, clientType, musicSheetSourceType, musicSheetType} from "@/utils/constant";
+import {getMapValueByKey, getSelectDataFromObj} from "@/utils/objectUtil";
 import {musicalInstrumentPage} from "@views/system-manage/subject-manage/api";
 import {subjectPage} from "@views/system-manage/api";
 import MusicSheetOwnerDialog from "@views/music-library/music-sheet/modal/musicSheetOwnerDialog";
+import {sysApplicationPage} from "@views/menu-manage/api";
 
 /**
  * 获取指定元素下一个Note元素
@@ -321,6 +322,8 @@ export default defineComponent({
       showMusicSheetOwnerDialog: false, //所属人弹框
       // musicSheetOwnerData: {}, //所属人信息
       multiTracks: null,
+      appData: [],// 应用列表
+      ownerName: null as any,// 所属人名称描述
     })
     const gradualData = reactive({
       list: [] as any[],
@@ -538,6 +541,31 @@ export default defineComponent({
       }
     }
 
+    const setOwnerName = (() => {
+      if (!forms.musicSheetExtend || !forms.sourceType || !forms.musicSheetExtend?.userId) {
+        return;
+      }
+      const appId = forms.musicSheetExtend.applicationId;
+      const app = state.appData.filter((next: any) => {
+        return next.id == appId
+      }) as any;
+      if (app.length > 0) {
+        state.ownerName = app[0].appName
+      }
+      if (forms.sourceType == 'ORG') {
+        state.ownerName += '-' + forms.musicSheetExtend.orgName
+
+      } else if (forms.sourceType == 'PERSON') {
+        state.ownerName += '-' + getMapValueByKey(forms.musicSheetExtend.clientType, new Map(Object.entries(clientType)))
+      }
+      if (forms.musicSheetExtend.userName) {
+        state.ownerName += '-' + forms.musicSheetExtend.userName
+      }
+      if (forms.musicSheetExtend.phone) {
+        state.ownerName += '(' + forms.musicSheetExtend.phone + ')'
+      }
+    })
+
     onMounted(async () => {
       state.loading = true
       // 获取乐器信息
@@ -563,6 +591,23 @@ export default defineComponent({
         subject.disabled = !subject.enableFlag
       })
 
+      // 初始化应用
+      // 初始化应用
+      {
+        const appKeys = Object.keys(appKey);
+
+        const {data} = await sysApplicationPage({page: 1, rows: 999, parentId: 0})
+        const tempList = data.rows || []
+        const filter = tempList.filter((next: any) => {
+          return appKeys.includes(next.appKey)
+        });
+        filter.forEach((item: any) => {
+          item.label = item.appName
+          item.value = item.id
+        })
+        state.appData = filter
+      }
+
       if (props.type === 'edit' || props.type === 'preview') {
         const detail = props.data
         try {
@@ -605,6 +650,7 @@ export default defineComponent({
             forms.graduals = extConfigJson.gradualTimes || {}
           } catch (error) {
           }
+          setOwnerName()
           axios.get(data.xmlFileUrl).then((res: any) => {
             if (res?.data) {
               gradualData.list = getGradualLengthByXml(res?.data as any).filter(
@@ -759,6 +805,7 @@ export default defineComponent({
                     onUpdateValue={() => {
                       // 发送变化,清理选择的所属人信息
                       forms.musicSheetExtend = {}
+                      state.ownerName = null
                       // forms.musicSheetExtend.userId = null
                       // forms.musicSheetExtend.userName = null
                       // forms.musicSheetExtend.applicationId = null
@@ -789,7 +836,7 @@ export default defineComponent({
                       state.showMusicSheetOwnerDialog = true
                     }}
                 >
-                  {forms.musicSheetExtend?.userId ? forms.musicSheetExtend.userName + "(" + forms.musicSheetExtend.userId + ")" : '请选择所属人'}
+                  {state.ownerName ? state.ownerName : '请选择所属人'}
                 </NButton>
               </NFormItemGi>
               <NFormItemGi label="速度" path="playSpeed">
@@ -1244,6 +1291,7 @@ export default defineComponent({
             <MusicSheetOwnerDialog
                 musicSheetExtend={forms.musicSheetExtend}
                 sourceType={forms.sourceType}
+                appData={state.appData}
                 onClose={() => {
                   state.showMusicSheetOwnerDialog = false
                 }}
@@ -1251,6 +1299,7 @@ export default defineComponent({
                   forms.musicSheetExtend = {
                     ...musicSheetOwnerData
                   }
+                  setOwnerName()
                 }}
             />
           </NModal>

+ 27 - 18
src/views/music-library/music-sheet/modal/musicSheetOwnerDialog.tsx

@@ -6,6 +6,7 @@ import Pagination from "@components/pagination";
 import {sysApplicationPage} from "@views/menu-manage/api";
 import {appKey, clientType} from "@/utils/constant";
 import {getMapValueByKey} from "@/utils/objectUtil";
+import deepClone from "@/utils/deep.clone";
 
 export default defineComponent({
   name: 'musicSheetOwnerDialog',
@@ -18,12 +19,16 @@ export default defineComponent({
     sourceType: {
       type: String,
       default: null
+    },
+    appData: {
+      type: Array,
+      required:true,
+      default: []
     }
 
   },
   emits: ['close', 'getList', "choseMusicSheetOwnerData"],
   setup(props, {slots, attrs, emit}) {
-    const forms = reactive({})
     const state = reactive({
       loading: false,
       pagination: {
@@ -37,7 +42,7 @@ export default defineComponent({
         sourceType: null as any,
       },
       dataList: [],
-      appData: [], // 适用项目行数据
+      appData: [] as any, // 适用项目行数据
     })
 
     const btnLoading = ref(false)
@@ -75,19 +80,19 @@ export default defineComponent({
     onMounted(async () => {
       // 初始化应用
       {
-        const appKeys = Object.keys(appKey);
-
-        const {data} = await sysApplicationPage({page: 1, rows: 999, parentId: 0})
-        const tempList = data.rows || []
-        const filter = tempList.filter((next: any) => {
-          return appKeys.includes(next.appKey)
-        });
-        filter.forEach((item: any) => {
-          item.label = item.appName
-          item.value = item.id
-        })
-        state.appData = filter
-        if (tempList.length == 0) {
+        // const appKeys = Object.keys(appKey);
+        //
+        // const {data} = await sysApplicationPage({page: 1, rows: 999, parentId: 0})
+        // const tempList = data.rows || []
+        // const filter = tempList.filter((next: any) => {
+        //   return appKeys.includes(next.appKey)
+        // });
+        // filter.forEach((item: any) => {
+        //   item.label = item.appName
+        //   item.value = item.id
+        // })
+        state.appData = deepClone(props.appData)
+        if (state.appData.length == 0) {
           message.warning("获取应用列表失败")
           return
         }
@@ -95,7 +100,7 @@ export default defineComponent({
         if (props.musicSheetExtend && props.musicSheetExtend.applicationId) {
           state.searchForm.applicationId = props.musicSheetExtend.applicationId
         } else {
-          state.searchForm.applicationId = tempList[0].value
+          state.searchForm.applicationId = state.appData[0].value
         }
       }
 
@@ -108,6 +113,10 @@ export default defineComponent({
           key: 'userName'
         },
         {
+          title: '手机号',
+          key: 'phone'
+        },
+        {
           title: '机构',
           key: 'organizationRole'
         },
@@ -163,9 +172,9 @@ export default defineComponent({
                   options={state.appData}
               />
             </NFormItem>
-            <NFormItem label="所属人" path="userName" size="small">
+            <NFormItem label="所属人" path="name" size="small">
               <NInput
-                  placeholder="请选择所属人"
+                  placeholder="请选择所属人/手机号"
                   v-model:value={state.searchForm.name}
                   clearable
               />

+ 20 - 6
src/views/music-library/music-sheet/modal/use-project.tsx

@@ -250,9 +250,16 @@ export default defineComponent({
                           </NFormItem>
                           <NFormItem
                               label="排序值"
-                              path="musicSheetType"
+                              path="useProjectParamConfig.GYM.sortNo"
                           >
-                              <NInput></NInput>
+                              <NInputNumber
+                                  v-model:value={forms.useProjectParamConfig.GYM.sortNo}
+                                  placeholder="请输入排序值"
+                                  clearable
+                                  min={0}
+                                  max={9999}
+                                  style={{width: '100%'}}
+                              />
                           </NFormItem>
                       </NTabPane>
                   }
@@ -280,10 +287,11 @@ export default defineComponent({
                               path="useProjectParamConfig.GYT.sortNo"
                           >
                               <NInputNumber
-                                  v-model:value={forms.useProjectParamConfig.KT.sortNo}
+                                  v-model:value={forms.useProjectParamConfig.GYT.sortNo}
                                   placeholder="请输入排序值"
                                   clearable
                                   min={0}
+                                  max={9999}
                                   style={{width: '100%'}}
                               />
                           </NFormItem>
@@ -380,9 +388,14 @@ export default defineComponent({
                               label="排序值"
                               path="useProjectParamConfig.KLX.sortNo"
                           >
-                              <NInputNumber style={"width:100%"}>
-
-                              </NInputNumber>
+                              <NInputNumber
+                                  v-model:value={forms.useProjectParamConfig.KLX.sortNo}
+                                  placeholder="请输入排序值"
+                                  clearable
+                                  min={0}
+                                  max={9999}
+                                  style={{width: '100%'}}
+                              />
                           </NFormItem>
                       </NTabPane>
                   }
@@ -420,6 +433,7 @@ export default defineComponent({
                                   placeholder="请输入排序值"
                                   clearable
                                   min={0}
+                                  max={9999}
                                   style={{width: '100%'}}
                               />
                           </NFormItem>

+ 21 - 15
src/views/music-library/project-music-sheet/index.tsx

@@ -1,21 +1,27 @@
 import {NTabPane, NTabs} from 'naive-ui'
 import {defineComponent, h, onMounted, reactive} from 'vue'
 import {useRoute} from 'vue-router'
-import {setTabsCaches} from '@/hooks/use-async'
-import Mec from "@views/music-library/project-music-sheet/module/mec/mec";
-import Jmedu from "@views/music-library/project-music-sheet/module/jmedu/jmedu";
-import CooleshowEdu from "@views/music-library/project-music-sheet/module/cooleshow-edu/cooleshow-edu";
+import {getTabsCache, setTabsCaches} from '@/hooks/use-async'
 import {appKey} from "@/utils/constant";
 import {sysApplicationPage} from "@views/menu-manage/api";
-import {getMapValueByKey} from "@/utils/objectUtil";
-import Cooleshow from "@views/music-library/project-music-sheet/module/cooleshow/cooleshow";
+import MusicSheetKt from "@views/music-library/project-music-sheet/module/kt/music-sheet-kt";
+import MusicSheetGym from "@views/music-library/project-music-sheet/module/gym/music-sheet-gym";
+import MusicSheetGyt from "@views/music-library/project-music-sheet/module/gyt/music-sheet-gyt";
+import MusicSheetKlx from "@views/music-library/project-music-sheet/module/klx/music-sheet-klx";
 
 export default defineComponent({
   name: 'project-music-sheet',
   setup() {
     const state = reactive({
       tabName: 'GYM' as 'GYM' | 'GYT' | 'KLX' | 'KT',
-      appKeyList: [] as any
+      appKeyList: [] as any,
+      appNameList: [] as any,
+    })
+    getTabsCache((val: any) => {
+      console.log(val)
+      if (val.form.tabName) {
+        state.tabName = val.form.tabName
+      }
     })
     const route = useRoute()
     const setTabs = (val: any) => {
@@ -32,6 +38,7 @@ export default defineComponent({
         tempList.forEach((next: any) => {
           if (appKeys.includes(next.appKey)) {
             state.appKeyList.push(next.appKey)
+            state.appNameList.push(next.appName)
           }
         })
       }
@@ -54,21 +61,20 @@ export default defineComponent({
                       NTabPane,
                       {
                         name: app,
-                        tab: getMapValueByKey(app, new Map(Object.entries(appKey))
-                        )
+                        tab: state.appNameList[index]
                       },
                       {
                         default: () => {
                           if (app == 'KT') {
-                            return h(CooleshowEdu)
+                            return h(MusicSheetKt, {'appKey': app})
                           } else if (app == 'GYM') {
-                            return h(Mec)
-                          } else if (app == 'CLX') {
-                            return h(Cooleshow)
+                            return h(MusicSheetGym, {'appKey': app})
+                          } else if (app == 'KLX') {
+                            return h(MusicSheetKlx, {'appKey': app})
                           } else if (app == 'GYT') {
-                            return h(Jmedu)
+                            return h(MusicSheetGyt, {'appKey': app})
                           } else {
-                            return h(CooleshowEdu)
+                            return h(MusicSheetKt)
                           }
                         }
                       }

+ 0 - 349
src/views/music-library/project-music-sheet/module/cooleshow/cooleshow.tsx

@@ -1,349 +0,0 @@
-import {defineComponent, onMounted, reactive, ref} from "vue";
-import SaveForm from "@components/save-form";
-import {NButton, NDataTable, NDatePicker, NDescriptions, NDescriptionsItem, NFormItem, NImage, NInput, NModal, NSelect, NSpace} from "naive-ui";
-import Pagination from "@components/pagination";
-import TheTooltip from "@components/TheTooltip";
-import AddMusic from "@views/music-library/project-music-sheet/module/cooleshow/addMusic";
-
-export default defineComponent({
-  name: 'project-music-sheet-cooleshow',
-
-  setup() {
-    const state = reactive({
-      loading: false,
-      pagination: {
-        page: 1,
-        rows: 10,
-        pageTotal: 0
-      },
-      searchForm: {
-        keyword: null,
-        subjectType: null,
-        musicSubject: null,
-        status: null
-      },
-      subjectList: [],
-      showAdd: false
-    })
-
-    onMounted(() => {
-    })
-
-    const saveForm = ref()
-
-    const onSearch = () => {
-      saveForm.value?.submit()
-    }
-    const onBtnReset = () => {
-      saveForm.value?.reset()
-    }
-
-    const onSubmit = () => {
-
-    }
-
-    const columns = (): any => {
-      return [
-        {
-          title: '曲目信息',
-          key: 'id',
-          render: (row: any) => (
-              <>
-                <NDescriptions labelPlacement="left" column={1}>
-                  <NDescriptionsItem label="曲目名称">
-                    <TheTooltip content={row.musicSheetName}/>{' '}
-                  </NDescriptionsItem>
-                  <NDescriptionsItem label="曲目编号">{row.id}</NDescriptionsItem>
-                </NDescriptions>
-              </>
-          )
-        },
-        {
-          title: '封面图',
-          key: 'titleImg',
-          render(row: any) {
-            return <NImage width={60} height={60} src={row.titleImg}/>
-          }
-        },
-        {
-          title: '曲目来源',
-          key: 'musicSheetCategoriesName',
-          render: (row: any) => (
-              <>
-                <NDescriptions labelPlacement="left" column={1}>
-                  <NDescriptionsItem label="曲目来源">
-                    <TheTooltip content={row.musicSheetCategoriesName}/>{' '}
-                  </NDescriptionsItem>
-                  <NDescriptionsItem label="所属人">
-                    {row.accompanimentType === 'HOMEMODE' ? '自制伴奏' : '普通伴奏'}
-                  </NDescriptionsItem>
-                </NDescriptions>
-              </>
-          )
-        },
-        {
-          title: '曲目类型',
-          key: 'musicSheetCategoriesName'
-        },
-        {
-          title: '可用声部',
-          key: 'musicSheetCategoriesName'
-        },
-        {
-          title: '分类',
-          key: 'musicSheetCategoriesName'
-        },
-        {
-          title: '是否收费',
-          key: 'musicSheetCategoriesName'
-        },
-        {
-          title: '上传人',
-          key: 'musicSheetCategoriesName'
-        },
-        {
-          title: '上传时间',
-          key: 'musicSheetCategoriesName'
-        },
-        {
-          title: '状态',
-          key: 'musicSheetCategoriesName'
-        },
-        {
-          title: '操作',
-          key: 'operation',
-          fixed: 'right',
-          render(row: any) {
-            return (
-                <NSpace>
-                  <NButton
-                      type="primary"
-                      size="small"
-                      text
-                      //v-auth="musicSheet/status1612431726029942786"
-                      // onClick={() => onChangeStatus(row)}
-                  >
-                    {row.status ? '停用' : '启用'}
-                  </NButton>
-                  <NButton
-                      type="primary"
-                      size="small"
-                      text
-                      //v-auth="musicSheet/update1602302618558099458"
-                      onClick={() => {
-                        // state.visiableMusic = true
-                        // state.musicOperation = 'edit'
-                        // state.musicData = row
-                      }}
-                  >
-                    修改
-                  </NButton>
-                </NSpace>
-            )
-          }
-        }
-      ]
-    }
-
-    return () => {
-      return (
-          <div class="system-menu-container">
-            <SaveForm
-                ref={saveForm}
-                model={state.searchForm}
-                onSubmit={onSubmit}
-                saveKey="project-music-sheet-cooleshow"
-                onSetModel={(val: any) => (state.searchForm = val)}
-            >
-
-              <NFormItem label="关键词" path="keyword">
-                <NInput
-                    placeholder="曲目名称/编号"
-                    v-model:value={state.searchForm.keyword}
-                    clearable
-                />
-              </NFormItem>
-
-              <NFormItem label="曲目类型" path="subjectType">
-                <NSelect
-                    placeholder="请选择曲目类型"
-                    v-model:value={state.searchForm.subjectType}
-                    options={
-                      [
-                        {
-                          label: '独奏',
-                          value: '1'
-                        },
-                        {
-                          label: '合奏',
-                          value: '2'
-                        }
-                      ]
-                    }
-                    clearable
-                />
-              </NFormItem>
-              <NFormItem label="伴奏类型" path="musicSubject">
-                <NSelect
-                />
-              </NFormItem>
-              <NFormItem label="声部" path="musicSubject">
-                <NSelect
-                    placeholder="请选择声部"
-                    v-model:value={state.searchForm.musicSubject}
-                    options={state.subjectList}
-                    clearable
-                />
-              </NFormItem>
-              <NFormItem label="状态" path="status">
-                <NSelect
-                    v-model={[state.searchForm.status, 'value']}
-                    placeholder="请选择状态"
-                    clearable
-                    options={
-                      [
-                        {
-                          label: '启用',
-                          value: true
-                        },
-                        {
-                          label: '停用',
-                          value: false
-                        }
-                      ] as any
-                    }
-                />
-              </NFormItem>
-              <NFormItem label="曲目来源" path="authorFrom">
-                <NSelect
-                    placeholder="请选择曲目来源"
-                    // v-model:value={state.searchForm.authorFrom}
-                    options={
-                      [
-                        {
-                          label: '平台',
-                          value: 'PLATFORM'
-                        },
-                        {
-                          label: '机构',
-                          value: 'TENANT'
-                        },
-                        {
-                          label: '个人',
-                          value: 'SELF'
-                        }
-                      ] as any
-                    }
-                    clearable
-                />
-              </NFormItem>
-
-              <NFormItem label="曲目类型" path="authorFrom">
-                <NSelect
-                    placeholder="请选择收费类型"
-                    // v-model:value={state.searchForm.authorFrom}
-                    options={
-                      [
-                        {
-                          label: '独奏',
-                          value: 'PLATFORM'
-                        },
-                        {
-                          label: '合奏',
-                          value: 'TENANT'
-                        }
-                      ] as any
-                    }
-                    clearable
-                />
-              </NFormItem>
-
-              <NFormItem label="所属人" path="authorFrom">
-                <NInput></NInput>
-              </NFormItem>
-              <NFormItem label="曲目分类" path="authorFrom">
-                <NSelect></NSelect>
-              </NFormItem>
-              <NFormItem label="上传时间" path="authorFrom">
-                <NDatePicker
-                    // v-model:value={state.searchForm.times}
-                    type="daterange"
-                    clearable
-                    value-format="yyyy.MM.dd"
-                    startPlaceholder="开始时间"
-                    endPlaceholder="结束时间"
-                />
-              </NFormItem>
-              <NFormItem>
-                <NSpace>
-                  <NButton type="primary" onClick={onSearch}>
-                    搜索
-                  </NButton>
-                  <NButton type="default" onClick={onBtnReset}>
-                    重置
-                  </NButton>
-                </NSpace>
-              </NFormItem>
-            </SaveForm>
-
-            <div class={['section-container']}>
-              <NSpace style={{paddingBottom: '12px'}}>
-                <NButton
-                    type="primary"
-                    //v-auth="musicSheet/save1602302550719426561"
-                    onClick={() => {
-                      state.showAdd = true
-                    }}
-                >
-                  新增
-                </NButton>
-                <NButton
-                    //v-auth="musicSheet/save1602302550719426561"
-                    onClick={() => {
-                      // state.musicOperation = 'unable'
-                      // state.musicData = {}
-                    }}
-                >
-                  批量禁用
-                </NButton>
-                <NButton
-                    //v-auth="musicSheet/save1602302550719426561"
-                    onClick={() => {
-                      // state.musicOperation = 'enable'
-                      // state.musicData = {}
-                    }}
-                >
-                  批量启用
-                </NButton>
-              </NSpace>
-
-              <NDataTable
-                  loading={state.loading}
-                  columns={columns()}
-                  // data={state.dataList}
-              ></NDataTable>
-
-              <Pagination
-                  v-model:page={state.pagination.page}
-                  v-model:pageSize={state.pagination.rows}
-                  v-model:pageTotal={state.pagination.pageTotal}
-                  // onList={getList}
-                  sync
-                  saveKey="project-music-sheet-cooleshow"
-              ></Pagination>
-            </div>
-
-            <NModal
-                v-model:show={state.showAdd}
-                preset="dialog"
-                showIcon={false}
-                title={'添加曲目'}
-                style={{width: '1200px',height: '800px'}}
-            >
-              <AddMusic/>
-            </NModal>
-          </div>
-      )
-    }
-  }
-})

+ 1 - 1
src/views/music-library/project-music-sheet/module/cooleshow-edu/addMusic.tsx → src/views/music-library/project-music-sheet/module/gym/addMusic.tsx

@@ -8,7 +8,7 @@ import {musicSheetApplicationExtendSaveBatch, musicSheetPage} from "@views/music
 import deepClone from "@/utils/deep.clone";
 
 export default defineComponent({
-  name: 'project-music-cooleshow-edu-addMusic',
+  name: 'gym-addMusic',
   props: {
     appId: {
       type: String,

+ 576 - 0
src/views/music-library/project-music-sheet/module/gym/music-sheet-gym.tsx

@@ -0,0 +1,576 @@
+import {defineComponent, onMounted, reactive, ref} from "vue";
+import SaveForm from "@components/save-form";
+import {
+  DataTableRowKey,
+  NButton,
+  NCascader,
+  NDataTable,
+  NDatePicker,
+  NDescriptions,
+  NDescriptionsItem,
+  NFormItem,
+  NImage,
+  NInput,
+  NModal,
+  NSelect,
+  NSpace,
+  NTag,
+  useDialog,
+  useMessage
+} from "naive-ui";
+import Pagination from "@components/pagination";
+import TheTooltip from "@components/TheTooltip";
+import AddMusic from "@views/music-library/project-music-sheet/module/gym/addMusic";
+import {getMapValueByKey, getSelectDataFromObj} from "@/utils/objectUtil";
+import {musicSheetAudioType, musicSheetAvailableType, musicSheetPaymentType, musicSheetSourceType, musicSheetType} from "@/utils/constant";
+import {musicSheetApplicationExtendCategoryList, musicSheetApplicationOwnerList, musicSheetPageByApplication, musicSheetStatusList} from "@views/music-library/api";
+import UpdateMusic from "@views/music-library/project-music-sheet/module/kt/updateMusic";
+import {subjectPage, sysApplicationPage} from "@views/system-manage/api";
+import {filterTimes} from "@/utils/dateUtil";
+
+export default defineComponent({
+  name: 'project-music-sheet-mec',
+  props: {
+    appKey: {
+      type: String,
+      default: 'GYT'
+    }
+  },
+
+  setup(props) {
+    const dialog = useDialog()
+    const message = useMessage()
+    const state = reactive({
+      loading: false,
+      appId: null as any,
+      pagination: {
+        page: 1,
+        rows: 10,
+        pageTotal: 0
+      },
+      searchForm: {
+        keyword: null,
+        applicationId: null, //应用ID
+        musicSheetType: null, //曲目类型(SINGLE:单曲 CONCERT:合奏)
+        subjectId: null, //声部ID
+        subjectIds: null, //曲目声部ID集合
+        musicCategoryIds: null, //曲目分类ID
+        status: null, //曲目状态(0:停用,1:启用)
+        sourceType: null, //来源类型/作者属性(PLATFORM: 平台; ORG: 机构; PERSON: 个人)
+        paymentType: null, //收费类型(FREE:免费;VIP:会员;CHARGE:单曲收费)
+        userId: null, //所属人
+        musicCategoryId: null, //曲目分类ID
+        times: null, // 上传时间
+        audioType: null, //音频类型(HOMEMODE: 自制 COMMON: 普通)
+        exquisiteFlag: null, //精品标志
+        topFlag: null, //是否置顶(0:否;1:是)
+        availableType: null, //可用途径 ORG 机构 PLATFORM 平台
+        appAuditFlag: null, //是否审核版本
+        detailFlag: null, //是否查询详情
+      },
+      subjectList: [],
+      dataList: [] as any[],
+      musicSheetCategories: [],
+      showAddDialog: false,
+      showEditDialog: false,
+      userIdDisable: true,
+      userIdData: [] as any,
+      updateRow: {} as any, // 修改选择的行
+    })
+
+    onMounted(async () => {
+      // 获取应用APP信息
+      {
+        const {data} = await sysApplicationPage({page: 1, rows: 1, appKey: props.appKey})
+        const tempList = data.rows || []
+        if (!tempList || tempList.length == 0) {
+          message.error("加载项目信息失败");
+          return
+        }
+        state.appId = tempList[0].id
+        state.searchForm.applicationId = tempList[0].id
+      }
+      // 加载声部
+      {
+        try {
+          const {data} = await subjectPage({page: 1, rows: 999})
+          const tempList = data.rows || []
+          tempList.forEach((item: any) => {
+            item.label = item.name
+            item.value = item.id + ''
+          })
+          state.subjectList = tempList
+        } catch {
+        }
+
+        //加载曲目分类列表
+        {
+          const {data} = await musicSheetApplicationExtendCategoryList({applicationIds: state.appId})
+          if (data && data.length > 0) {
+            state.musicSheetCategories = data[0].musicSheetCategories
+          }
+        }
+
+        // 加载表格数据
+        {
+          getList()
+        }
+      }
+
+    })
+
+    const saveForm = ref()
+
+    const onSearch = () => {
+      saveForm.value?.submit()
+    }
+    const onBtnReset = () => {
+      saveForm.value?.reset()
+    }
+
+    const onSubmit = () => {
+      state.pagination.page = 1
+      getList()
+    }
+
+    const checkedRowKeysRef = ref<DataTableRowKey[]>([])
+    const handleCheck = (rowKeys: DataTableRowKey[]) => {
+      checkedRowKeysRef.value = rowKeys
+    }
+
+    const getList = async () => {
+      try {
+        state.loading = true
+        const {data} = await musicSheetPageByApplication({
+          ...state.pagination,
+          ...state.searchForm,
+          ...filterTimes(state.searchForm.times, ['startTime', 'endTime']),
+        })
+        state.pagination.pageTotal = Number(data.total)
+        state.dataList = data.rows || []
+      } catch {
+      }
+      state.loading = false
+    }
+
+    const onChangeStatus = (row: any) => {
+      const statusStr = row.status ? '停用' : '启用'
+      dialog.warning({
+        title: '警告',
+        content: `是否${statusStr}?`,
+        positiveText: '确定',
+        negativeText: '取消',
+        onPositiveClick: async () => {
+          try {
+            await musicSheetStatusList({
+              ids: new Array(row.id),
+              status: !row.status
+            })
+            getList()
+            message.success(`${statusStr}成功`)
+          } catch {
+          }
+        }
+      })
+    }
+
+
+    const onBatchChangeStatus = (status: boolean) => {
+      const length = checkedRowKeysRef.value.length;
+      if (length == 0) {
+        message.warning("未选择数据")
+      }
+      const statusStr = !status ? '停用' : '启用'
+      dialog.warning({
+        title: '警告',
+        content: `是否${statusStr}` + length + `条数据?`,
+        positiveText: '确定',
+        negativeText: '取消',
+        onPositiveClick: async () => {
+          try {
+            await musicSheetStatusList({
+              ids: checkedRowKeysRef.value,
+              status: status
+            })
+            getList()
+            message.success(`${statusStr}成功`)
+          } catch {
+          }
+        }
+      })
+    }
+
+    const columns = (): any => {
+      return [
+        {
+          type: 'selection'
+        },
+        {
+          title: '曲目信息',
+          key: 'id',
+          render: (row: any) => (
+              <>
+                <NDescriptions labelPlacement="left" column={1}>
+                  <NDescriptionsItem label="曲目名称">
+                    <TheTooltip content={row.name}/>{' '}
+                  </NDescriptionsItem>
+                  <NDescriptionsItem label="曲目编号">{row.id}</NDescriptionsItem>
+                </NDescriptions>
+              </>
+          )
+        },
+        {
+          title: '曲目来源',
+          key: 'musicSheetCategoriesName',
+          render: (row: any) => (
+              <>
+                <NDescriptions labelPlacement="left" column={1}>
+                  <NDescriptionsItem label="曲目来源">
+                    {getMapValueByKey(row.sourceType, new Map(Object.entries(musicSheetSourceType)))}
+                  </NDescriptionsItem>
+                  <NDescriptionsItem label="所属人">{row.userName}</NDescriptionsItem>
+                </NDescriptions>
+              </>
+          )
+        },
+        {
+          title: '封面图',
+          key: 'musicCover',
+          render(row: any): JSX.Element {
+            return <NImage width={60} height={60} src={row.musicCover}/>
+          }
+        },
+        {
+          title: '曲目类型',
+          key: 'musicSheetType',
+          render: (row: any) => {
+            return <div>{getMapValueByKey(row.musicSheetType, new Map(Object.entries(musicSheetType)))}</div>
+          }
+        },
+        {
+          title: '伴奏类型',
+          key: 'audioType',
+          render: (row: any) => {
+            return <div>{getMapValueByKey(row.audioType, new Map(Object.entries(musicSheetAudioType)))}</div>
+          }
+        },
+        {
+          title: '可用声部',
+          key: 'subjectIdNames'
+        },
+        {
+          title: '曲目分类',
+          key: 'musicSheetCategoryName'
+        },
+        // {
+        //   title: '可用途径',
+        //   key: 'availableType',
+        //   render: (row: any) => {
+        //     return <div>{getMapValueByKey(row.availableType, new Map(Object.entries(musicSheetAvailableType)))}</div>
+        //   }
+        // },
+        {
+          title: '收费方式',
+          key: 'paymentType',
+          render: (row: any) => {
+            return <div>{getMapValueByKey(row.paymentType, new Map(Object.entries(musicSheetPaymentType)))}</div>
+          }
+        },
+        {
+          title: '上传人',
+          key: 'createByName'
+        },
+        {
+          title: '上传时间',
+          key: 'createTime'
+        },
+        {
+          title: '状态',
+          key: 'status',
+          render(row: any) {
+            return (
+                <NTag type={row.status ? 'primary' : 'default'}>{row.status ? '启用' : '停用'}</NTag>
+            )
+          }
+        },
+        {
+          title: '操作',
+          key: 'operation',
+          fixed: 'right',
+          render(row: any) {
+            return (
+                <NSpace>
+                  <NButton
+                      type="primary"
+                      size="small"
+                      text
+                      //v-auth="musicSheet/status1612431726029942786"
+                      onClick={() => onChangeStatus(row)}
+                  >
+                    {row.status ? '停用' : '启用'}
+                  </NButton>
+                  <NButton
+                      type="primary"
+                      size="small"
+                      text
+                      //v-auth="musicSheet/update1602302618558099458"
+                      onClick={() => {
+                        state.showEditDialog = true
+                        state.updateRow = row
+                      }}
+                  >
+                    修改
+                  </NButton>
+                </NSpace>
+            )
+          }
+        }
+      ]
+    }
+
+
+    return () => {
+      return (
+          <div class="system-menu-container">
+            <SaveForm
+                ref={saveForm}
+                model={state.searchForm}
+                onSubmit={onSubmit}
+                saveKey="music-sheet-gym"
+                onSetModel={(val: any) => (state.searchForm = val)}
+            >
+
+              <NFormItem label="关键词" path="keyword">
+                <NInput
+                    placeholder="请输入曲目名称/编号"
+                    v-model:value={state.searchForm.keyword}
+                    clearable
+                />
+              </NFormItem>
+              <NFormItem label="曲目来源" path="sourceType">
+                <NSelect
+                    placeholder="请选择曲目来源"
+                    v-model:value={state.searchForm.sourceType}
+                    options={getSelectDataFromObj(musicSheetSourceType)}
+                    onUpdateValue={async (value: any) => {
+                      state.userIdData = []
+                      state.searchForm.userId = null
+                      if (value) {
+                        const {data} = await musicSheetApplicationOwnerList({page: 1, rows: 9999, sourceType: value, applicationId: state.appId})
+                        const temp = data.rows || []
+                        temp.forEach((next: any) => {
+                          state.userIdData.push({
+                            ...next,
+                            label: next.userName,
+                            value: next.userId
+                          })
+                        })
+                        state.userIdDisable = false
+                      } else {
+                        state.userIdDisable = true
+                      }
+                    }}
+                    clearable
+                />
+              </NFormItem>
+              <NFormItem label="所属人" path="userId">
+                <NSelect
+                    placeholder="请选择所属人"
+                    disabled={state.userIdDisable}
+                    v-model:value={state.searchForm.userId}
+                    options={state.userIdData}
+                    clearable
+                >
+                </NSelect>
+              </NFormItem>
+              <NFormItem label="曲目类型" path="subjectType">
+                <NSelect
+                    placeholder="请选择曲目类型"
+                    v-model:value={state.searchForm.musicSheetType}
+                    options={getSelectDataFromObj(musicSheetType)}
+                    clearable
+                />
+              </NFormItem>
+              <NFormItem label="伴奏类型" path="audioType">
+                <NSelect
+                    placeholder="请选择伴奏类型"
+                    v-model:value={state.searchForm.audioType}
+                    options={getSelectDataFromObj(musicSheetAudioType)}
+                    clearable
+                />
+              </NFormItem>
+              <NFormItem label="可用声部" path="subjectId">
+                <NSelect
+                    placeholder="请选择可用声部"
+                    v-model:value={state.searchForm.subjectId}
+                    options={state.subjectList}
+                    clearable
+                />
+              </NFormItem>
+              <NFormItem label="曲目分类" path="musicCategoryId">
+                <NCascader
+                    valueField="id"
+                    labelField="name"
+                    children-field="children"
+                    placeholder="请选择曲目分类"
+                    v-model:value={state.searchForm.musicCategoryId}
+                    options={state.musicSheetCategories}
+                    clearable
+                />
+              </NFormItem>
+              {/*<NFormItem*/}
+              {/*    label="可用途径"*/}
+              {/*    path="availableType"*/}
+              {/*>*/}
+              {/*  <NSelect*/}
+              {/*      placeholder="请选择可用途径"*/}
+              {/*      v-model:value={state.searchForm.availableType}*/}
+              {/*      options={getSelectDataFromObj(musicSheetAvailableType)}*/}
+              {/*      clearable*/}
+              {/*  >*/}
+              {/*  </NSelect>*/}
+              {/*</NFormItem>*/}
+              <NFormItem
+                  label="收费方式"
+                  path="paymentType"
+              >
+                <NSelect
+                    placeholder="请选择收费方式"
+                    v-model:value={state.searchForm.paymentType}
+                    options={getSelectDataFromObj(musicSheetPaymentType)}
+                    clearable
+                >
+                </NSelect>
+              </NFormItem>
+              <NFormItem label="状态" path="status">
+                <NSelect
+                    v-model:value={state.searchForm.status}
+                    placeholder="请选择状态"
+                    options={
+                      [
+                        {
+                          label: '启用',
+                          value: true
+                        },
+                        {
+                          label: '停用',
+                          value: false
+                        }
+                      ] as any
+                    }
+                    clearable
+                />
+              </NFormItem>
+              <NFormItem label="上传时间" path="authorFrom">
+                <NDatePicker
+                    v-model:value={state.searchForm.times}
+                    type="daterange"
+                    clearable
+                    value-format="yyyy.MM.dd"
+                    startPlaceholder="开始时间"
+                    endPlaceholder="结束时间"
+                />
+              </NFormItem>
+              <NFormItem>
+                <NSpace>
+                  <NButton type="primary" onClick={onSearch}>
+                    搜索
+                  </NButton>
+                  <NButton type="default" onClick={onBtnReset}>
+                    重置
+                  </NButton>
+                </NSpace>
+              </NFormItem>
+            </SaveForm>
+
+            <div class={['section-container']}>
+              <NSpace style={{paddingBottom: '12px'}}>
+                <NButton
+                    type="primary"
+                    //v-auth="musicSheet/save1602302550719426561"
+                    onClick={() => {
+                      state.showAddDialog = true
+                    }}
+                >
+                  新增
+                </NButton>
+                <NButton
+                    disabled={checkedRowKeysRef.value.length == 0}
+                    //v-auth="musicSheet/save1602302550719426561"
+                    onClick={() => {
+                      onBatchChangeStatus(false)
+                    }}
+                >
+                  批量禁用
+                </NButton>
+                <NButton
+                    disabled={checkedRowKeysRef.value.length == 0}
+                    //v-auth="musicSheet/save1602302550719426561"
+                    onClick={() => {
+                      onBatchChangeStatus(true)
+                    }}
+                >
+                  批量启用
+                </NButton>
+              </NSpace>
+
+              <NDataTable
+                  loading={state.loading}
+                  columns={columns()}
+                  data={state.dataList}
+                  rowKey={(row: any) => row.id}
+                  onUpdateCheckedRowKeys={handleCheck}
+              ></NDataTable>
+
+              <Pagination
+                  v-model:page={state.pagination.page}
+                  v-model:pageSize={state.pagination.rows}
+                  v-model:pageTotal={state.pagination.pageTotal}
+                  onList={getList}
+                  sync
+                  saveKey="music-sheet-gym"
+              ></Pagination>
+            </div>
+
+            <NModal
+                v-model:show={state.showAddDialog}
+                preset="dialog"
+                showIcon={false}
+                title={'添加曲目'}
+                style={{width: '1200px'}}
+            >
+              <AddMusic
+                  onClose={() => (state.showAddDialog = false)}
+                  onGetList={() => {
+                    state.pagination.page = 1
+                    getList()
+                  }}
+                  subjectList={state.subjectList}
+                  appId={state.appId}
+                  musicSheetCategories={state.musicSheetCategories}
+              />
+            </NModal>
+            <NModal
+                v-model:show={state.showEditDialog}
+                preset="dialog"
+                showIcon={false}
+                title={'修改曲目'}
+                style={{width: '500px'}}
+            >
+              <UpdateMusic
+                  onClose={() => (state.showEditDialog = false)}
+                  onGetList={() => {
+                    state.pagination.page = 1
+                    getList()
+                  }}
+                  rowData={state.updateRow}
+                  appId={state.appId}
+                  musicSheetCategories={state.musicSheetCategories}
+              />
+            </NModal>
+          </div>
+      )
+    }
+
+  }
+})

+ 539 - 0
src/views/music-library/project-music-sheet/module/gyt/addMusic.tsx

@@ -0,0 +1,539 @@
+import {defineComponent, h, onMounted, reactive, ref} from "vue";
+import SaveForm from "@components/save-form";
+import {DataTableColumns, DataTableRowKey, NButton, NCascader, NDataTable, NFormItem, NIcon, NImage, NInput, NInputNumber, NSelect, NSpace, NStep, NSteps, useDialog, useMessage} from "naive-ui";
+import Pagination from "@components/pagination";
+import {getMapValueByKey, getSelectDataFromObj} from "@/utils/objectUtil";
+import {musicSheetSourceType, musicSheetType} from "@/utils/constant";
+import {musicSheetApplicationExtendSaveBatch, musicSheetPage} from "@views/music-library/api";
+import deepClone from "@/utils/deep.clone";
+
+export default defineComponent({
+  name: 'gyt-addMusic',
+  props: {
+    appId: {
+      type: String,
+      required: true
+    },
+    subjectList: {
+      type: Array,
+      default: () => []
+    },
+    musicSheetCategories: {
+      type: Array,
+      default: () => []
+    }
+  },
+  emits: ['close', 'getList'],
+  setup(props, {slots, attrs, emit}) {
+    const dialogs = useDialog()
+    const message = useMessage()
+    const state = reactive({
+      loading: false,
+      pagination: {
+        page: 1,
+        rows: 5,
+        pageTotal: 0
+      },
+      stepPagination: {
+        page: 1,
+        rows: 5,
+        pageTotal: 0
+      },
+      searchForm: {
+        keyword: null,
+        musicSheetType: null,
+        subjectId: null,
+        sourceType: null,
+      },
+      subjectList: [] as any,
+      showAdd: false,
+      currentStep: 1,
+      dataList: [],
+      selectRowData: [] as any,// 选择的数据列表
+      musicSheetCategories: [] as any,
+      startSortNum: null as any,// 排序起始值
+      projectMusicCategoryId: null as any,// 曲目分类ID
+    })
+
+    onMounted(() => {
+      state.subjectList = props.subjectList
+      state.musicSheetCategories = props.musicSheetCategories
+      getList()
+    })
+
+    const getList = async () => {
+      try {
+        state.loading = true
+        const {data} = await musicSheetPage({
+          ...state.pagination,
+          ...state.searchForm,
+          addAppId: props.appId
+        })
+        state.pagination.pageTotal = Number(data.total)
+        state.dataList = data.rows || []
+      } catch {
+      }
+      state.loading = false
+    }
+
+    const saveForm = ref()
+
+    const onSearch = () => {
+      saveForm.value?.submit()
+    }
+    const onBtnReset = () => {
+      saveForm.value?.reset()
+    }
+
+    const onSubmit = () => {
+      state.pagination.page = 1
+      getList()
+    }
+
+    const onSave = async () => {
+      if (state.selectRowData.length == 0) {
+        message.error('未选择曲目');
+        return;
+      }
+      const params = [] as any[];
+      for (let i = 0; i < state.selectRowData.length; i++) {
+        const item = state.selectRowData[i];
+        if (!item.projectMusicCategoryId) {
+          message.error('曲目分类不能为空')
+          return;
+        }
+        if (!item.sortNo || !item.projectMusicCategoryId) {
+          message.error('排序号不能为空')
+          return;
+        }
+        params.push({
+          ...item,
+          musicSheetId: item.id,
+          musicSheetCategoryId: item.projectMusicCategoryId,
+          applicationId: props.appId,
+          id: null
+        })
+      }
+      const res = await musicSheetApplicationExtendSaveBatch(params) as any
+      if (res && res.code == '200') {
+        message.success(`添加成功`)
+        emit('getList')
+        emit('close')
+      }
+
+
+    }
+
+    const columnsField = [
+      {
+        type: 'selection'
+      },
+      {
+        title: '曲目编号',
+        key: 'id',
+      },
+      {
+        title: '封面图',
+        key: 'titleImg',
+        render(row: any) {
+          return <NImage width={40} height={40} src={row.musicCover}/>
+        }
+      },
+      {
+        title: '声部',
+        key: 'subjectNames',
+      },
+      {
+        title: '曲目名称',
+        key: 'name',
+      },
+      {
+        title: '音乐人',
+        key: 'composer',
+      },
+      {
+        title: '曲目类型',
+        key: 'musicSheetType',
+        render: (row: any) => {
+          return <div>{getMapValueByKey(row.musicSheetType, new Map(Object.entries(musicSheetType)))}</div>
+        }
+      },
+      {
+        title: '作者属性',
+        key: 'sourceType',
+        render(row: any) {
+          return getMapValueByKey(row.sourceType, new Map(Object.entries(musicSheetSourceType)));
+        }
+      },
+      {
+        title: '所属人',
+        key: 'userName',
+        render: (row: any) => {
+          return <div>{row.musicSheetExtend?.userName ? row.musicSheetExtend?.userName : ''}</div>
+        }
+      },
+    ]
+
+    const columns = (): any => {
+      return columnsField
+    }
+
+    const stepColumns = (): DataTableColumns => {
+      const field = deepClone(columnsField);
+      field.splice(0, 1)
+      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",
+                                   },
+                                   [
+                                     // icon
+                                     h(NCascader, {
+                                       onUpdateValue(v) {
+                                         state.projectMusicCategoryId = v
+                                       },
+                                       valueField: 'id',
+                                       labelField: "name",
+                                       childrenField: 'children',
+                                       placeholderField: '请选择曲目分类',
+                                       options: state.musicSheetCategories
+                                     }),
+                                   ]
+                               )
+                             },
+                             positiveText: "确定",
+                             negativeText: '取消',
+                             onPositiveClick: () => {
+                               for (let i = 0; i < state.selectRowData.length; i++) {
+                                 const item = state.selectRowData[i];
+                                 item.projectMusicCategoryId = state.projectMusicCategoryId
+                               }
+                             },
+                           })
+                         }
+                         }
+                >
+                  <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: 'projectMusicCategoryId',
+        fixed: 'right',
+        width: 200,
+        render: (row: any) => {
+          // })
+          return (
+              <NCascader
+                  valueField="id"
+                  labelField="name"
+                  children-field="children"
+                  placeholder="请选择曲目分类"
+                  value={row.projectMusicCategoryId}
+                  options={state.musicSheetCategories}
+                  onUpdateValue={(value: any) => {
+                    row.projectMusicCategoryId = value
+                  }}
+                  clearable
+              />
+          )
+        }
+      })
+      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",
+                                   },
+                                   [
+                                     // icon
+                                     h(NInputNumber, {
+                                       onUpdateValue(v) {
+                                         state.startSortNum = v
+                                       },
+                                       min: 0,
+                                       max: 9999,
+                                     }),
+                                   ]
+                               )
+                             },
+                             positiveText: "确定",
+                             negativeText: '取消',
+                             onPositiveClick: () => {
+                               if (state.startSortNum) {
+                                 for (let i = 0; i < state.selectRowData.length; i++) {
+                                   const item = state.selectRowData[i];
+                                   item.sortNo = state.startSortNum + i
+                                 }
+                               }
+                             },
+                           })
+                         }
+                         }
+                >
+                  <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: 'sortNo',
+        fixed: 'right',
+        width: 150,
+        render: (row: any) => {
+          return h(NInputNumber, {
+            value: row.sortNo,
+            min: 0,
+            max: 9999,
+            onUpdateValue(value: any) {
+              row.sortNo = value
+            }
+          })
+        }
+      })
+      field.push({
+        title: '操作',
+        key: 'operation',
+        fixed: 'right',
+        render(row: any) {
+          return (
+              <NSpace>
+                <NButton
+                    type="primary"
+                    size="small"
+                    text
+                    //v-auth="musicSheet/update1602302618558099458"
+                    onClick={() => {
+                      dialogs.warning({
+                        title: '警告',
+                        content: `是否删除该数据?`,
+                        positiveText: '确定',
+                        negativeText: '取消',
+                        onPositiveClick: async () => {
+                          try {
+                            const index = state.selectRowData.findIndex((item: any) => {
+                              if (item.id == row.id) {
+                                return true
+                              }
+                            })
+                            if (index > -1) {
+                              state.selectRowData.splice(index, 1)
+                            }
+                            const index1 = checkedRowKeysRef.value.findIndex((item: any) => {
+                              if (item == row.id) {
+                                return true
+                              }
+                            })
+                            if (index1 > -1) {
+                              checkedRowKeysRef.value.splice(index, 1)
+                            }
+                          } catch {
+                          }
+                        }
+                      })
+                    }}
+                >
+                  移除
+                </NButton>
+              </NSpace>
+          )
+        }
+      })
+      return field;
+    }
+
+    const checkedRowKeysRef = ref<DataTableRowKey[]>([])
+    const handleCheck = (rowKeys: DataTableRowKey[]) => {
+      checkedRowKeysRef.value = rowKeys
+      // 添加行更新值
+      state.dataList.forEach((next: any) => {
+        if (checkedRowKeysRef.value.includes(next.id)) {
+          const find = state.selectRowData.find((row: any) => {
+            return row.id === next.id
+          });
+          if (!find) {
+            state.selectRowData.push(next)
+          }
+        }
+      })
+
+      // 去掉行更新值
+      state.selectRowData = state.selectRowData.filter((next: any) => {
+        return checkedRowKeysRef.value.includes(next.id)
+      })
+    }
+
+    return () => {
+      return (
+          <div class="system-menu-container">
+            <NSpace vertical size="medium">
+              <NSteps
+                  current={state.currentStep}
+                  // onUpdateCurrent={()=>{
+                  //   state.currentStep = val
+                  // }}
+                  style={"margin-bottom: 10px;margin-top: 10px"}
+              >
+                <NStep
+                    title="选择曲目"
+                    description=""
+                >
+                </NStep>
+                <NStep
+                    title="设置曲目信息"
+                    description=""
+                >
+                </NStep>
+              </NSteps>
+            </NSpace>
+            {state.currentStep === 1 && (
+                <div class="system-menu-container">
+                  <SaveForm
+                      ref={saveForm}
+                      model={state.searchForm}
+                      onSubmit={onSubmit}
+                      // saveKey="cooleshow-edu-addMusic"
+                      onSetModel={(val: any) => (state.searchForm = val)}
+                  >
+                    <NFormItem label="关键词" path="keyword">
+                      <NInput
+                          v-model:value={state.searchForm.keyword}
+                          placeholder="请输入曲目名称/编号"
+                          clearable
+                      />
+                    </NFormItem>
+                    <NFormItem label="曲目类型" path="musicSheetType">
+                      <NSelect
+                          placeholder="请选择曲目类型"
+                          v-model:value={state.searchForm.musicSheetType}
+                          options={getSelectDataFromObj(musicSheetType)}
+                          clearable
+                      />
+                    </NFormItem>
+                    <NFormItem label="声部" path="musicSubject">
+                      <NSelect
+                          placeholder="请选择声部"
+                          v-model:value={state.searchForm.subjectId}
+                          options={state.subjectList}
+                          clearable
+                      />
+                    </NFormItem>
+                    <NFormItem label="曲目来源" path="sourceType">
+                      <NSelect
+                          placeholder="请选择曲目来源"
+                          v-model:value={state.searchForm.sourceType}
+                          options={getSelectDataFromObj(musicSheetSourceType)}
+                          // onUpdateValue={async (value: any) => {
+                          // }}
+                          clearable
+                      />
+                    </NFormItem>
+                    <NFormItem>
+                      <NSpace>
+                        <NButton type="primary" onClick={onSearch}>
+                          搜索
+                        </NButton>
+                        <NButton type="default" onClick={onBtnReset}>
+                          重置
+                        </NButton>
+                      </NSpace>
+                    </NFormItem>
+                  </SaveForm>
+                  <NDataTable
+                      loading={state.loading}
+                      columns={columns()}
+                      data={state.dataList}
+                      rowKey={(row: any) => row.id}
+                      onUpdateCheckedRowKeys={handleCheck}
+                  ></NDataTable>
+                  <Pagination
+                      v-model:page={state.pagination.page}
+                      v-model:pageSize={state.pagination.rows}
+                      v-model:pageTotal={state.pagination.pageTotal}
+                      onList={getList}
+                      sync
+                      // saveKey="cooleshow-edu-addMusic"
+                  ></Pagination>
+                </div>
+            )}
+            {state.currentStep === 2 && (
+                <div class="system-menu-container" style={"margin-top: 15px;"}>
+                  <NDataTable
+                      loading={state.loading}
+                      columns={stepColumns()}
+                      data={state.selectRowData}
+                      rowKey={(row: any) => row.id}
+                      maxHeight={500}
+                  ></NDataTable>
+                </div>
+            )}
+            <NSpace justify="end" style={"margin-top:10px"}>
+              <NButton type="default" onClick={() => {
+                if (state.currentStep > 1) {
+                  state.currentStep = state.currentStep - 1;
+                } else {
+                  emit('close')
+                }
+              }}>
+                {state.currentStep === 1 ? '取消' : '上一步'}
+              </NButton>
+              <NButton
+                  type="primary"
+                  onClick={() => {
+                    if (state.currentStep < 2) {
+                      if (state.selectRowData.length == 0) {
+                        message.warning("请选择曲目")
+                        return
+                      }
+                      state.currentStep = state.currentStep + 1;
+                    } else {
+                      onSave()
+                    }
+                  }}
+                  // loading={btnLoading.value}
+                  // disabled={btnLoading.value}
+              >
+                {state.currentStep === 2 ? '确定' : '下一步'}
+              </NButton>
+            </NSpace>
+          </div>
+      )
+    }
+  }
+})

+ 576 - 0
src/views/music-library/project-music-sheet/module/gyt/music-sheet-gyt.tsx

@@ -0,0 +1,576 @@
+import {defineComponent, onMounted, reactive, ref} from "vue";
+import SaveForm from "@components/save-form";
+import {
+  DataTableRowKey,
+  NButton,
+  NCascader,
+  NDataTable,
+  NDatePicker,
+  NDescriptions,
+  NDescriptionsItem,
+  NFormItem,
+  NImage,
+  NInput,
+  NModal,
+  NSelect,
+  NSpace,
+  NTag,
+  useDialog,
+  useMessage
+} from "naive-ui";
+import Pagination from "@components/pagination";
+import TheTooltip from "@components/TheTooltip";
+import AddMusic from "@views/music-library/project-music-sheet/module/gym/addMusic";
+import {getMapValueByKey, getSelectDataFromObj} from "@/utils/objectUtil";
+import {musicSheetAudioType, musicSheetAvailableType, musicSheetPaymentType, musicSheetSourceType, musicSheetType} from "@/utils/constant";
+import {musicSheetApplicationExtendCategoryList, musicSheetApplicationOwnerList, musicSheetPageByApplication, musicSheetStatusList} from "@views/music-library/api";
+import UpdateMusic from "@views/music-library/project-music-sheet/module/kt/updateMusic";
+import {subjectPage, sysApplicationPage} from "@views/system-manage/api";
+import {filterTimes} from "@/utils/dateUtil";
+
+export default defineComponent({
+  name: 'project-music-sheet-gyt',
+  props: {
+    appKey: {
+      type: String,
+      default: 'GYT'
+    }
+  },
+
+  setup(props) {
+    const dialog = useDialog()
+    const message = useMessage()
+    const state = reactive({
+      loading: false,
+      appId: null as any,
+      pagination: {
+        page: 1,
+        rows: 10,
+        pageTotal: 0
+      },
+      searchForm: {
+        keyword: null,
+        applicationId: null, //应用ID
+        musicSheetType: null, //曲目类型(SINGLE:单曲 CONCERT:合奏)
+        subjectId: null, //声部ID
+        subjectIds: null, //曲目声部ID集合
+        musicCategoryIds: null, //曲目分类ID
+        status: null, //曲目状态(0:停用,1:启用)
+        sourceType: null, //来源类型/作者属性(PLATFORM: 平台; ORG: 机构; PERSON: 个人)
+        paymentType: null, //收费类型(FREE:免费;VIP:会员;CHARGE:单曲收费)
+        userId: null, //所属人
+        musicCategoryId: null, //曲目分类ID
+        times: null, // 上传时间
+        audioType: null, //音频类型(HOMEMODE: 自制 COMMON: 普通)
+        exquisiteFlag: null, //精品标志
+        topFlag: null, //是否置顶(0:否;1:是)
+        availableType: null, //可用途径 ORG 机构 PLATFORM 平台
+        appAuditFlag: null, //是否审核版本
+        detailFlag: null, //是否查询详情
+      },
+      subjectList: [],
+      dataList: [] as any[],
+      musicSheetCategories: [],
+      showAddDialog: false,
+      showEditDialog: false,
+      userIdDisable: true,
+      userIdData: [] as any,
+      updateRow: {} as any, // 修改选择的行
+    })
+
+    onMounted(async () => {
+      // 获取应用APP信息
+      {
+        const {data} = await sysApplicationPage({page: 1, rows: 1, appKey: props.appKey})
+        const tempList = data.rows || []
+        if (!tempList || tempList.length == 0) {
+          message.error("加载项目信息失败");
+          return
+        }
+        state.appId = tempList[0].id
+        state.searchForm.applicationId = tempList[0].id
+      }
+      // 加载声部
+      {
+        try {
+          const {data} = await subjectPage({page: 1, rows: 999})
+          const tempList = data.rows || []
+          tempList.forEach((item: any) => {
+            item.label = item.name
+            item.value = item.id + ''
+          })
+          state.subjectList = tempList
+        } catch {
+        }
+
+        //加载曲目分类列表
+        {
+          const {data} = await musicSheetApplicationExtendCategoryList({applicationIds: state.appId})
+          if (data && data.length > 0) {
+            state.musicSheetCategories = data[0].musicSheetCategories
+          }
+        }
+
+        // 加载表格数据
+        {
+          getList()
+        }
+      }
+
+    })
+
+    const saveForm = ref()
+
+    const onSearch = () => {
+      saveForm.value?.submit()
+    }
+    const onBtnReset = () => {
+      saveForm.value?.reset()
+    }
+
+    const onSubmit = () => {
+      state.pagination.page = 1
+      getList()
+    }
+
+    const checkedRowKeysRef = ref<DataTableRowKey[]>([])
+    const handleCheck = (rowKeys: DataTableRowKey[]) => {
+      checkedRowKeysRef.value = rowKeys
+    }
+
+    const getList = async () => {
+      try {
+        state.loading = true
+        const {data} = await musicSheetPageByApplication({
+          ...state.pagination,
+          ...state.searchForm,
+          ...filterTimes(state.searchForm.times, ['startTime', 'endTime']),
+        })
+        state.pagination.pageTotal = Number(data.total)
+        state.dataList = data.rows || []
+      } catch {
+      }
+      state.loading = false
+    }
+
+    const onChangeStatus = (row: any) => {
+      const statusStr = row.status ? '停用' : '启用'
+      dialog.warning({
+        title: '警告',
+        content: `是否${statusStr}?`,
+        positiveText: '确定',
+        negativeText: '取消',
+        onPositiveClick: async () => {
+          try {
+            await musicSheetStatusList({
+              ids: new Array(row.id),
+              status: !row.status
+            })
+            getList()
+            message.success(`${statusStr}成功`)
+          } catch {
+          }
+        }
+      })
+    }
+
+
+    const onBatchChangeStatus = (status: boolean) => {
+      const length = checkedRowKeysRef.value.length;
+      if (length == 0) {
+        message.warning("未选择数据")
+      }
+      const statusStr = !status ? '停用' : '启用'
+      dialog.warning({
+        title: '警告',
+        content: `是否${statusStr}` + length + `条数据?`,
+        positiveText: '确定',
+        negativeText: '取消',
+        onPositiveClick: async () => {
+          try {
+            await musicSheetStatusList({
+              ids: checkedRowKeysRef.value,
+              status: status
+            })
+            getList()
+            message.success(`${statusStr}成功`)
+          } catch {
+          }
+        }
+      })
+    }
+
+    const columns = (): any => {
+      return [
+        {
+          type: 'selection'
+        },
+        {
+          title: '曲目信息',
+          key: 'id',
+          render: (row: any) => (
+              <>
+                <NDescriptions labelPlacement="left" column={1}>
+                  <NDescriptionsItem label="曲目名称">
+                    <TheTooltip content={row.name}/>{' '}
+                  </NDescriptionsItem>
+                  <NDescriptionsItem label="曲目编号">{row.id}</NDescriptionsItem>
+                </NDescriptions>
+              </>
+          )
+        },
+        {
+          title: '曲目来源',
+          key: 'musicSheetCategoriesName',
+          render: (row: any) => (
+              <>
+                <NDescriptions labelPlacement="left" column={1}>
+                  <NDescriptionsItem label="曲目来源">
+                    {getMapValueByKey(row.sourceType, new Map(Object.entries(musicSheetSourceType)))}
+                  </NDescriptionsItem>
+                  <NDescriptionsItem label="所属人">{row.userName}</NDescriptionsItem>
+                </NDescriptions>
+              </>
+          )
+        },
+        {
+          title: '封面图',
+          key: 'musicCover',
+          render(row: any): JSX.Element {
+            return <NImage width={60} height={60} src={row.musicCover}/>
+          }
+        },
+        {
+          title: '曲目类型',
+          key: 'musicSheetType',
+          render: (row: any) => {
+            return <div>{getMapValueByKey(row.musicSheetType, new Map(Object.entries(musicSheetType)))}</div>
+          }
+        },
+        {
+          title: '伴奏类型',
+          key: 'audioType',
+          render: (row: any) => {
+            return <div>{getMapValueByKey(row.audioType, new Map(Object.entries(musicSheetAudioType)))}</div>
+          }
+        },
+        {
+          title: '可用声部',
+          key: 'subjectIdNames'
+        },
+        {
+          title: '曲目分类',
+          key: 'musicSheetCategoryName'
+        },
+        // {
+        //   title: '可用途径',
+        //   key: 'availableType',
+        //   render: (row: any) => {
+        //     return <div>{getMapValueByKey(row.availableType, new Map(Object.entries(musicSheetAvailableType)))}</div>
+        //   }
+        // },
+        {
+          title: '收费方式',
+          key: 'paymentType',
+          render: (row: any) => {
+            return <div>{getMapValueByKey(row.paymentType, new Map(Object.entries(musicSheetPaymentType)))}</div>
+          }
+        },
+        {
+          title: '上传人',
+          key: 'createByName'
+        },
+        {
+          title: '上传时间',
+          key: 'createTime'
+        },
+        {
+          title: '状态',
+          key: 'status',
+          render(row: any) {
+            return (
+                <NTag type={row.status ? 'primary' : 'default'}>{row.status ? '启用' : '停用'}</NTag>
+            )
+          }
+        },
+        {
+          title: '操作',
+          key: 'operation',
+          fixed: 'right',
+          render(row: any) {
+            return (
+                <NSpace>
+                  <NButton
+                      type="primary"
+                      size="small"
+                      text
+                      //v-auth="musicSheet/status1612431726029942786"
+                      onClick={() => onChangeStatus(row)}
+                  >
+                    {row.status ? '停用' : '启用'}
+                  </NButton>
+                  <NButton
+                      type="primary"
+                      size="small"
+                      text
+                      //v-auth="musicSheet/update1602302618558099458"
+                      onClick={() => {
+                        state.showEditDialog = true
+                        state.updateRow = row
+                      }}
+                  >
+                    修改
+                  </NButton>
+                </NSpace>
+            )
+          }
+        }
+      ]
+    }
+
+
+    return () => {
+      return (
+          <div class="system-menu-container">
+            <SaveForm
+                ref={saveForm}
+                model={state.searchForm}
+                onSubmit={onSubmit}
+                saveKey="music-sheet-gyt"
+                onSetModel={(val: any) => (state.searchForm = val)}
+            >
+
+              <NFormItem label="关键词" path="keyword">
+                <NInput
+                    placeholder="请输入曲目名称/编号"
+                    v-model:value={state.searchForm.keyword}
+                    clearable
+                />
+              </NFormItem>
+              <NFormItem label="曲目来源" path="sourceType">
+                <NSelect
+                    placeholder="请选择曲目来源"
+                    v-model:value={state.searchForm.sourceType}
+                    options={getSelectDataFromObj(musicSheetSourceType)}
+                    onUpdateValue={async (value: any) => {
+                      state.userIdData = []
+                      state.searchForm.userId = null
+                      if (value) {
+                        const {data} = await musicSheetApplicationOwnerList({page: 1, rows: 9999, sourceType: value, applicationId: state.appId})
+                        const temp = data.rows || []
+                        temp.forEach((next: any) => {
+                          state.userIdData.push({
+                            ...next,
+                            label: next.userName,
+                            value: next.userId
+                          })
+                        })
+                        state.userIdDisable = false
+                      } else {
+                        state.userIdDisable = true
+                      }
+                    }}
+                    clearable
+                />
+              </NFormItem>
+              <NFormItem label="所属人" path="userId">
+                <NSelect
+                    placeholder="请选择所属人"
+                    disabled={state.userIdDisable}
+                    v-model:value={state.searchForm.userId}
+                    options={state.userIdData}
+                    clearable
+                >
+                </NSelect>
+              </NFormItem>
+              <NFormItem label="曲目类型" path="subjectType">
+                <NSelect
+                    placeholder="请选择曲目类型"
+                    v-model:value={state.searchForm.musicSheetType}
+                    options={getSelectDataFromObj(musicSheetType)}
+                    clearable
+                />
+              </NFormItem>
+              <NFormItem label="伴奏类型" path="audioType">
+                <NSelect
+                    placeholder="请选择伴奏类型"
+                    v-model:value={state.searchForm.audioType}
+                    options={getSelectDataFromObj(musicSheetAudioType)}
+                    clearable
+                />
+              </NFormItem>
+              <NFormItem label="可用声部" path="subjectId">
+                <NSelect
+                    placeholder="请选择可用声部"
+                    v-model:value={state.searchForm.subjectId}
+                    options={state.subjectList}
+                    clearable
+                />
+              </NFormItem>
+              <NFormItem label="曲目分类" path="musicCategoryId">
+                <NCascader
+                    valueField="id"
+                    labelField="name"
+                    children-field="children"
+                    placeholder="请选择曲目分类"
+                    v-model:value={state.searchForm.musicCategoryId}
+                    options={state.musicSheetCategories}
+                    clearable
+                />
+              </NFormItem>
+              {/*<NFormItem*/}
+              {/*    label="可用途径"*/}
+              {/*    path="availableType"*/}
+              {/*>*/}
+              {/*  <NSelect*/}
+              {/*      placeholder="请选择可用途径"*/}
+              {/*      v-model:value={state.searchForm.availableType}*/}
+              {/*      options={getSelectDataFromObj(musicSheetAvailableType)}*/}
+              {/*      clearable*/}
+              {/*  >*/}
+              {/*  </NSelect>*/}
+              {/*</NFormItem>*/}
+              <NFormItem
+                  label="收费方式"
+                  path="paymentType"
+              >
+                <NSelect
+                    placeholder="请选择收费方式"
+                    v-model:value={state.searchForm.paymentType}
+                    options={getSelectDataFromObj(musicSheetPaymentType)}
+                    clearable
+                >
+                </NSelect>
+              </NFormItem>
+              <NFormItem label="状态" path="status">
+                <NSelect
+                    v-model:value={state.searchForm.status}
+                    placeholder="请选择状态"
+                    options={
+                      [
+                        {
+                          label: '启用',
+                          value: true
+                        },
+                        {
+                          label: '停用',
+                          value: false
+                        }
+                      ] as any
+                    }
+                    clearable
+                />
+              </NFormItem>
+              <NFormItem label="上传时间" path="authorFrom">
+                <NDatePicker
+                    v-model:value={state.searchForm.times}
+                    type="daterange"
+                    clearable
+                    value-format="yyyy.MM.dd"
+                    startPlaceholder="开始时间"
+                    endPlaceholder="结束时间"
+                />
+              </NFormItem>
+              <NFormItem>
+                <NSpace>
+                  <NButton type="primary" onClick={onSearch}>
+                    搜索
+                  </NButton>
+                  <NButton type="default" onClick={onBtnReset}>
+                    重置
+                  </NButton>
+                </NSpace>
+              </NFormItem>
+            </SaveForm>
+
+            <div class={['section-container']}>
+              <NSpace style={{paddingBottom: '12px'}}>
+                <NButton
+                    type="primary"
+                    //v-auth="musicSheet/save1602302550719426561"
+                    onClick={() => {
+                      state.showAddDialog = true
+                    }}
+                >
+                  新增
+                </NButton>
+                <NButton
+                    disabled={checkedRowKeysRef.value.length == 0}
+                    //v-auth="musicSheet/save1602302550719426561"
+                    onClick={() => {
+                      onBatchChangeStatus(false)
+                    }}
+                >
+                  批量禁用
+                </NButton>
+                <NButton
+                    disabled={checkedRowKeysRef.value.length == 0}
+                    //v-auth="musicSheet/save1602302550719426561"
+                    onClick={() => {
+                      onBatchChangeStatus(true)
+                    }}
+                >
+                  批量启用
+                </NButton>
+              </NSpace>
+
+              <NDataTable
+                  loading={state.loading}
+                  columns={columns()}
+                  data={state.dataList}
+                  rowKey={(row: any) => row.id}
+                  onUpdateCheckedRowKeys={handleCheck}
+              ></NDataTable>
+
+              <Pagination
+                  v-model:page={state.pagination.page}
+                  v-model:pageSize={state.pagination.rows}
+                  v-model:pageTotal={state.pagination.pageTotal}
+                  onList={getList}
+                  sync
+                  saveKey="music-sheet-gyt"
+              ></Pagination>
+            </div>
+
+            <NModal
+                v-model:show={state.showAddDialog}
+                preset="dialog"
+                showIcon={false}
+                title={'添加曲目'}
+                style={{width: '1200px'}}
+            >
+              <AddMusic
+                  onClose={() => (state.showAddDialog = false)}
+                  onGetList={() => {
+                    state.pagination.page = 1
+                    getList()
+                  }}
+                  subjectList={state.subjectList}
+                  appId={state.appId}
+                  musicSheetCategories={state.musicSheetCategories}
+              />
+            </NModal>
+            <NModal
+                v-model:show={state.showEditDialog}
+                preset="dialog"
+                showIcon={false}
+                title={'修改曲目'}
+                style={{width: '500px'}}
+            >
+              <UpdateMusic
+                  onClose={() => (state.showEditDialog = false)}
+                  onGetList={() => {
+                    state.pagination.page = 1
+                    getList()
+                  }}
+                  rowData={state.updateRow}
+                  appId={state.appId}
+                  musicSheetCategories={state.musicSheetCategories}
+              />
+            </NModal>
+          </div>
+      )
+    }
+
+  }
+})

+ 0 - 240
src/views/music-library/project-music-sheet/module/jmedu/addMusic.tsx

@@ -1,240 +0,0 @@
-import {defineComponent, onMounted, reactive, ref} from "vue";
-import SaveForm from "@components/save-form";
-import {NButton, NDataTable, NDatePicker, NDescriptions, NDescriptionsItem, NFormItem, NImage, NInput, NModal, NSelect, NSpace, NStep, NSteps} from "naive-ui";
-import Pagination from "@components/pagination";
-import TheTooltip from "@components/TheTooltip";
-
-export default defineComponent({
-  name: 'project-music-sheet-mec',
-  setup(props, {slots, attrs, emit}) {
-    const state = reactive({
-      loading: false,
-      pagination: {
-        page: 1,
-        rows: 10,
-        pageTotal: 0
-      },
-      searchForm: {
-        keyword: null,
-        subjectType: null,
-        musicSubject: null,
-        status: null
-      },
-      subjectList: [],
-      showAdd: false,
-      currentStep: 1,
-      dataList: []
-    })
-
-    onMounted(() => {
-    })
-
-    const saveForm = ref()
-
-    const onSearch = () => {
-      saveForm.value?.submit()
-    }
-    const onBtnReset = () => {
-      saveForm.value?.reset()
-    }
-
-    const onSubmit = () => {
-
-    }
-
-    const columns = (): any => {
-      return [
-        {
-          title: '曲目信息',
-          key: 'id',
-          render: (row: any) => (
-              <>
-                <NDescriptions labelPlacement="left" column={1}>
-                  <NDescriptionsItem label="曲目名称">
-                    <TheTooltip content={row.musicSheetName}/>{' '}
-                  </NDescriptionsItem>
-                  <NDescriptionsItem label="曲目编号">{row.id}</NDescriptionsItem>
-                </NDescriptions>
-              </>
-          )
-        },
-        {
-          title: '封面图',
-          key: 'titleImg',
-          render(row: any) {
-            return <NImage width={60} height={60} src={row.titleImg}/>
-          }
-        },
-        {
-          title: '声部',
-          key: 'titleImg',
-        },
-        {
-          title: '曲目名称',
-          key: 'titleImg',
-        },
-        {
-          title: '音乐人',
-          key: 'titleImg',
-        },
-        {
-          title: '曲目类型',
-          key: 'titleImg',
-        },
-        {
-          title: '作者属性',
-          key: 'titleImg',
-        },
-        {
-          title: '所属人',
-          key: 'titleImg',
-        },
-        {
-          title: '操作',
-          key: 'operation',
-          fixed: 'right',
-          render(row: any) {
-            return (
-                <NSpace>
-                  <NButton
-                      type="primary"
-                      size="small"
-                      text
-                      //v-auth="musicSheet/status1612431726029942786"
-                      // onClick={() => onChangeStatus(row)}
-                  >
-                    {row.status ? '停用' : '启用'}
-                  </NButton>
-                  <NButton
-                      type="primary"
-                      size="small"
-                      text
-                      //v-auth="musicSheet/update1602302618558099458"
-                      onClick={() => {
-                        // state.visiableMusic = true
-                        // state.musicOperation = 'edit'
-                        // state.musicData = row
-                      }}
-                  >
-                    修改
-                  </NButton>
-                </NSpace>
-            )
-          }
-        }
-      ]
-    }
-
-    const updateCurrent = (val: any) => {
-      state.currentStep = val
-    }
-
-    return () => {
-      return (
-          <div class="system-menu-container">
-            <NSpace vertical size="medium">
-              <NSteps current={state.currentStep} onUpdateCurrent={updateCurrent} style={"margin-bottom: 20px;"}>
-                <NStep
-                    title="选择分类"
-                    description=""
-                >
-                </NStep>
-                <NStep
-                    title="选择分类下曲目"
-                    description=""
-                >
-                </NStep>
-                <NStep
-                    title="设置曲目信息"
-                    description=""
-                >
-                </NStep>
-              </NSteps>
-            </NSpace>
-            {state.currentStep === 1 && (
-                <SaveForm>
-                  <NFormItem label="关键词" path="keyword">
-                    <NSelect></NSelect>
-                  </NFormItem>
-                </SaveForm>
-            )}
-            {state.currentStep === 2 && (
-                <div class="system-menu-container">
-                  <SaveForm>
-                    <NFormItem label="关键词" path="keyword">
-                      <NSelect></NSelect>
-                    </NFormItem>
-                    <NFormItem label="曲目类型" path="keyword">
-                      <NSelect></NSelect>
-                    </NFormItem>
-                    <NFormItem label="声部" path="keyword">
-                      <NSelect></NSelect>
-                    </NFormItem>
-                    <NFormItem label="曲目来源" path="keyword">
-                      <NSelect></NSelect>
-                    </NFormItem>
-                    <NFormItem>
-                      <NSpace>
-                        <NButton type="primary" onClick={onSearch}>
-                          搜索
-                        </NButton>
-                        <NButton type="default" onClick={onBtnReset}>
-                          重置
-                        </NButton>
-                      </NSpace>
-                    </NFormItem>
-                  </SaveForm>
-                  <NDataTable
-                      loading={state.loading}
-                      columns={columns()}
-                      data={state.dataList}
-                  ></NDataTable>
-                  <Pagination
-                      v-model:page={state.pagination.page}
-                      v-model:pageSize={state.pagination.rows}
-                      v-model:pageTotal={state.pagination.pageTotal}
-                      // onList={getList}
-                      sync
-                      saveKey="music-list"
-                  ></Pagination>
-                </div>
-            )}
-            {state.currentStep === 3 && (
-                <div class="system-menu-container" style={"margin-top: 15px;"}>
-                  <NDataTable
-                      loading={state.loading}
-                      columns={columns()}
-                      data={state.dataList}
-                  ></NDataTable>
-                </div>
-            )}
-            <NSpace justify="end">
-              <NButton type="default" onClick={() => {
-                if (state.currentStep > 1) {
-                  state.currentStep = state.currentStep - 1;
-                } else {
-                  emit('close')
-                }
-              }}>
-                {state.currentStep === 1 ? '取消' : '上一步'}
-              </NButton>
-              <NButton
-                  type="primary"
-                  onClick={() => {
-                    if (state.currentStep < 3) {
-                      state.currentStep = state.currentStep + 1;
-                    } else {
-                      onSubmit()
-                    }
-                  }}
-                  // loading={btnLoading.value}
-                  // disabled={btnLoading.value}
-              >
-                {state.currentStep === 3 ? '确定' : '下一步'}
-              </NButton>
-            </NSpace>
-          </div>
-      )
-    }
-  }
-})

+ 0 - 349
src/views/music-library/project-music-sheet/module/jmedu/jmedu.tsx

@@ -1,349 +0,0 @@
-import {defineComponent, onMounted, reactive, ref} from "vue";
-import SaveForm from "@components/save-form";
-import {NButton, NDataTable, NDatePicker, NDescriptions, NDescriptionsItem, NFormItem, NImage, NInput, NModal, NSelect, NSpace} from "naive-ui";
-import Pagination from "@components/pagination";
-import TheTooltip from "@components/TheTooltip";
-import AddMusic from "@views/music-library/project-music-sheet/module/jmedu/addMusic";
-
-export default defineComponent({
-  name: 'project-music-sheet-jmedu',
-
-  setup() {
-    const state = reactive({
-      loading: false,
-      pagination: {
-        page: 1,
-        rows: 10,
-        pageTotal: 0
-      },
-      searchForm: {
-        keyword: null,
-        subjectType: null,
-        musicSubject: null,
-        status: null
-      },
-      subjectList: [],
-      showAdd: false
-    })
-
-    onMounted(() => {
-    })
-
-    const saveForm = ref()
-
-    const onSearch = () => {
-      saveForm.value?.submit()
-    }
-    const onBtnReset = () => {
-      saveForm.value?.reset()
-    }
-
-    const onSubmit = () => {
-
-    }
-
-    const columns = (): any => {
-      return [
-        {
-          title: '曲目信息',
-          key: 'id',
-          render: (row: any) => (
-              <>
-                <NDescriptions labelPlacement="left" column={1}>
-                  <NDescriptionsItem label="曲目名称">
-                    <TheTooltip content={row.musicSheetName}/>{' '}
-                  </NDescriptionsItem>
-                  <NDescriptionsItem label="曲目编号">{row.id}</NDescriptionsItem>
-                </NDescriptions>
-              </>
-          )
-        },
-        {
-          title: '封面图',
-          key: 'titleImg',
-          render(row: any) {
-            return <NImage width={60} height={60} src={row.titleImg}/>
-          }
-        },
-        {
-          title: '曲目来源',
-          key: 'musicSheetCategoriesName',
-          render: (row: any) => (
-              <>
-                <NDescriptions labelPlacement="left" column={1}>
-                  <NDescriptionsItem label="曲目来源">
-                    <TheTooltip content={row.musicSheetCategoriesName}/>{' '}
-                  </NDescriptionsItem>
-                  <NDescriptionsItem label="所属人">
-                    {row.accompanimentType === 'HOMEMODE' ? '自制伴奏' : '普通伴奏'}
-                  </NDescriptionsItem>
-                </NDescriptions>
-              </>
-          )
-        },
-        {
-          title: '曲目类型',
-          key: 'musicSheetCategoriesName'
-        },
-        {
-          title: '可用声部',
-          key: 'musicSheetCategoriesName'
-        },
-        {
-          title: '分类',
-          key: 'musicSheetCategoriesName'
-        },
-        {
-          title: '是否收费',
-          key: 'musicSheetCategoriesName'
-        },
-        {
-          title: '上传人',
-          key: 'musicSheetCategoriesName'
-        },
-        {
-          title: '上传时间',
-          key: 'musicSheetCategoriesName'
-        },
-        {
-          title: '状态',
-          key: 'musicSheetCategoriesName'
-        },
-        {
-          title: '操作',
-          key: 'operation',
-          fixed: 'right',
-          render(row: any) {
-            return (
-                <NSpace>
-                  <NButton
-                      type="primary"
-                      size="small"
-                      text
-                      //v-auth="musicSheet/status1612431726029942786"
-                      // onClick={() => onChangeStatus(row)}
-                  >
-                    {row.status ? '停用' : '启用'}
-                  </NButton>
-                  <NButton
-                      type="primary"
-                      size="small"
-                      text
-                      //v-auth="musicSheet/update1602302618558099458"
-                      onClick={() => {
-                        // state.visiableMusic = true
-                        // state.musicOperation = 'edit'
-                        // state.musicData = row
-                      }}
-                  >
-                    修改
-                  </NButton>
-                </NSpace>
-            )
-          }
-        }
-      ]
-    }
-
-    return () => {
-      return (
-          <div class="system-menu-container">
-            <SaveForm
-                ref={saveForm}
-                model={state.searchForm}
-                onSubmit={onSubmit}
-                saveKey="project-music-sheet-jmedu"
-                onSetModel={(val: any) => (state.searchForm = val)}
-            >
-
-              <NFormItem label="关键词" path="keyword">
-                <NInput
-                    placeholder="曲目名称/编号"
-                    v-model:value={state.searchForm.keyword}
-                    clearable
-                />
-              </NFormItem>
-
-              <NFormItem label="曲目类型" path="subjectType">
-                <NSelect
-                    placeholder="请选择曲目类型"
-                    v-model:value={state.searchForm.subjectType}
-                    options={
-                      [
-                        {
-                          label: '独奏',
-                          value: '1'
-                        },
-                        {
-                          label: '合奏',
-                          value: '2'
-                        }
-                      ]
-                    }
-                    clearable
-                />
-              </NFormItem>
-              <NFormItem label="伴奏类型" path="musicSubject">
-                <NSelect
-                />
-              </NFormItem>
-              <NFormItem label="声部" path="musicSubject">
-                <NSelect
-                    placeholder="请选择声部"
-                    v-model:value={state.searchForm.musicSubject}
-                    options={state.subjectList}
-                    clearable
-                />
-              </NFormItem>
-              <NFormItem label="状态" path="status">
-                <NSelect
-                    v-model={[state.searchForm.status, 'value']}
-                    placeholder="请选择状态"
-                    clearable
-                    options={
-                      [
-                        {
-                          label: '启用',
-                          value: true
-                        },
-                        {
-                          label: '停用',
-                          value: false
-                        }
-                      ] as any
-                    }
-                />
-              </NFormItem>
-              <NFormItem label="曲目来源" path="authorFrom">
-                <NSelect
-                    placeholder="请选择曲目来源"
-                    // v-model:value={state.searchForm.authorFrom}
-                    options={
-                      [
-                        {
-                          label: '平台',
-                          value: 'PLATFORM'
-                        },
-                        {
-                          label: '机构',
-                          value: 'TENANT'
-                        },
-                        {
-                          label: '个人',
-                          value: 'SELF'
-                        }
-                      ] as any
-                    }
-                    clearable
-                />
-              </NFormItem>
-
-              <NFormItem label="曲目类型" path="authorFrom">
-                <NSelect
-                    placeholder="请选择收费类型"
-                    // v-model:value={state.searchForm.authorFrom}
-                    options={
-                      [
-                        {
-                          label: '独奏',
-                          value: 'PLATFORM'
-                        },
-                        {
-                          label: '合奏',
-                          value: 'TENANT'
-                        }
-                      ] as any
-                    }
-                    clearable
-                />
-              </NFormItem>
-
-              <NFormItem label="所属人" path="authorFrom">
-                <NInput></NInput>
-              </NFormItem>
-              <NFormItem label="曲目分类" path="authorFrom">
-                <NSelect></NSelect>
-              </NFormItem>
-              <NFormItem label="上传时间" path="authorFrom">
-                <NDatePicker
-                    // v-model:value={state.searchForm.times}
-                    type="daterange"
-                    clearable
-                    value-format="yyyy.MM.dd"
-                    startPlaceholder="开始时间"
-                    endPlaceholder="结束时间"
-                />
-              </NFormItem>
-              <NFormItem>
-                <NSpace>
-                  <NButton type="primary" onClick={onSearch}>
-                    搜索
-                  </NButton>
-                  <NButton type="default" onClick={onBtnReset}>
-                    重置
-                  </NButton>
-                </NSpace>
-              </NFormItem>
-            </SaveForm>
-
-            <div class={['section-container']}>
-              <NSpace style={{paddingBottom: '12px'}}>
-                <NButton
-                    type="primary"
-                    //v-auth="musicSheet/save1602302550719426561"
-                    onClick={() => {
-                      state.showAdd = true
-                    }}
-                >
-                  新增
-                </NButton>
-                <NButton
-                    //v-auth="musicSheet/save1602302550719426561"
-                    onClick={() => {
-                      // state.musicOperation = 'unable'
-                      // state.musicData = {}
-                    }}
-                >
-                  批量禁用
-                </NButton>
-                <NButton
-                    //v-auth="musicSheet/save1602302550719426561"
-                    onClick={() => {
-                      // state.musicOperation = 'enable'
-                      // state.musicData = {}
-                    }}
-                >
-                  批量启用
-                </NButton>
-              </NSpace>
-
-              <NDataTable
-                  loading={state.loading}
-                  columns={columns()}
-                  // data={state.dataList}
-              ></NDataTable>
-
-              <Pagination
-                  v-model:page={state.pagination.page}
-                  v-model:pageSize={state.pagination.rows}
-                  v-model:pageTotal={state.pagination.pageTotal}
-                  // onList={getList}
-                  sync
-                  saveKey="project-music-sheet-jmedu"
-              ></Pagination>
-            </div>
-
-            <NModal
-                v-model:show={state.showAdd}
-                preset="dialog"
-                showIcon={false}
-                title={'添加曲目'}
-                style={{width: '1200px',height: '800px'}}
-            >
-              <AddMusic/>
-            </NModal>
-          </div>
-      )
-    }
-  }
-})

+ 0 - 0
src/views/music-library/project-music-sheet/module/cooleshow/addMusic.tsx → src/views/music-library/project-music-sheet/module/klx/addMusic.tsx


+ 595 - 0
src/views/music-library/project-music-sheet/module/klx/music-sheet-klx.tsx

@@ -0,0 +1,595 @@
+import {defineComponent, onMounted, reactive, ref} from "vue";
+import SaveForm from "@components/save-form";
+import {
+  DataTableRowKey,
+  NButton,
+  NCascader,
+  NDataTable,
+  NDatePicker,
+  NDescriptions,
+  NDescriptionsItem,
+  NFormItem,
+  NImage,
+  NInput,
+  NModal,
+  NSelect,
+  NSpace,
+  NTag,
+  useDialog,
+  useMessage
+} from "naive-ui";
+import Pagination from "@components/pagination";
+import TheTooltip from "@components/TheTooltip";
+import AddMusic from "@views/music-library/project-music-sheet/module/gym/addMusic";
+import {getMapValueByKey, getSelectDataFromObj} from "@/utils/objectUtil";
+import {musicSheetAudioType, musicSheetAvailableType, musicSheetPaymentType, musicSheetSourceType, musicSheetType} from "@/utils/constant";
+import {musicSheetApplicationExtendCategoryList, musicSheetApplicationOwnerList, musicSheetPageByApplication, musicSheetStatusList} from "@views/music-library/api";
+import UpdateMusic from "@views/music-library/project-music-sheet/module/kt/updateMusic";
+import {subjectPage, sysApplicationPage} from "@views/system-manage/api";
+import {filterTimes} from "@/utils/dateUtil";
+
+export default defineComponent({
+  name: 'music-sheet-klx',
+  props: {
+    appKey: {
+      type: String,
+      default: 'KLX'
+    }
+  },
+
+  setup(props) {
+    const dialog = useDialog()
+    const message = useMessage()
+    const state = reactive({
+      loading: false,
+      appId: null as any,
+      pagination: {
+        page: 1,
+        rows: 10,
+        pageTotal: 0
+      },
+      searchForm: {
+        keyword: null,
+        applicationId: null, //应用ID
+        musicSheetType: null, //曲目类型(SINGLE:单曲 CONCERT:合奏)
+        subjectId: null, //声部ID
+        subjectIds: null, //曲目声部ID集合
+        musicCategoryIds: null, //曲目分类ID
+        status: null, //曲目状态(0:停用,1:启用)
+        sourceType: null, //来源类型/作者属性(PLATFORM: 平台; ORG: 机构; PERSON: 个人)
+        paymentType: null, //收费类型(FREE:免费;VIP:会员;CHARGE:单曲收费)
+        userId: null, //所属人
+        musicCategoryId: null, //曲目分类ID
+        times: null, // 上传时间
+        audioType: null, //音频类型(HOMEMODE: 自制 COMMON: 普通)
+        exquisiteFlag: null, //精品标志
+        topFlag: null, //是否置顶(0:否;1:是)
+        availableType: null, //可用途径 ORG 机构 PLATFORM 平台
+        appAuditFlag: null, //是否审核版本
+        detailFlag: null, //是否查询详情
+        musicTagIds: [], //曲目标签
+      },
+      subjectList: [],
+      dataList: [] as any[],
+      musicSheetCategories: [],
+      showAddDialog: false,
+      showEditDialog: false,
+      userIdDisable: true,
+      userIdData: [] as any,
+      updateRow: {} as any, // 修改选择的行
+      musicTagList:[] as any,//曲目标签
+    })
+
+    onMounted(async () => {
+      // 获取应用APP信息
+      {
+        const {data} = await sysApplicationPage({page: 1, rows: 1, appKey: props.appKey})
+        const tempList = data.rows || []
+        if (!tempList || tempList.length == 0) {
+          message.error("加载项目信息失败");
+          return
+        }
+        state.appId = tempList[0].id
+        state.searchForm.applicationId = tempList[0].id
+      }
+      // 加载声部
+      {
+        try {
+          const {data} = await subjectPage({page: 1, rows: 999})
+          const tempList = data.rows || []
+          tempList.forEach((item: any) => {
+            item.label = item.name
+            item.value = item.id + ''
+          })
+          state.subjectList = tempList
+        } catch {
+        }
+
+        //加载曲目分类列表
+        {
+          const {data} = await musicSheetApplicationExtendCategoryList({applicationIds: state.appId})
+          if (data && data.length > 0) {
+            state.musicSheetCategories = data[0].musicSheetCategories
+          }
+        }
+
+        // 加载表格数据
+        {
+          getList()
+        }
+      }
+
+    })
+
+    const saveForm = ref()
+
+    const onSearch = () => {
+      saveForm.value?.submit()
+    }
+    const onBtnReset = () => {
+      saveForm.value?.reset()
+    }
+
+    const onSubmit = () => {
+      state.pagination.page = 1
+      getList()
+    }
+
+    const checkedRowKeysRef = ref<DataTableRowKey[]>([])
+    const handleCheck = (rowKeys: DataTableRowKey[]) => {
+      checkedRowKeysRef.value = rowKeys
+    }
+
+    const getList = async () => {
+      try {
+        state.loading = true
+        const {data} = await musicSheetPageByApplication({
+          ...state.pagination,
+          ...state.searchForm,
+          ...filterTimes(state.searchForm.times, ['startTime', 'endTime']),
+        })
+        state.pagination.pageTotal = Number(data.total)
+        state.dataList = data.rows || []
+      } catch {
+      }
+      state.loading = false
+    }
+
+    const onChangeStatus = (row: any) => {
+      const statusStr = row.status ? '停用' : '启用'
+      dialog.warning({
+        title: '警告',
+        content: `是否${statusStr}?`,
+        positiveText: '确定',
+        negativeText: '取消',
+        onPositiveClick: async () => {
+          try {
+            await musicSheetStatusList({
+              ids: new Array(row.id),
+              status: !row.status
+            })
+            getList()
+            message.success(`${statusStr}成功`)
+          } catch {
+          }
+        }
+      })
+    }
+
+
+    const onBatchChangeStatus = (status: boolean) => {
+      const length = checkedRowKeysRef.value.length;
+      if (length == 0) {
+        message.warning("未选择数据")
+      }
+      const statusStr = !status ? '停用' : '启用'
+      dialog.warning({
+        title: '警告',
+        content: `是否${statusStr}` + length + `条数据?`,
+        positiveText: '确定',
+        negativeText: '取消',
+        onPositiveClick: async () => {
+          try {
+            await musicSheetStatusList({
+              ids: checkedRowKeysRef.value,
+              status: status
+            })
+            getList()
+            message.success(`${statusStr}成功`)
+          } catch {
+          }
+        }
+      })
+    }
+
+    const columns = (): any => {
+      return [
+        {
+          type: 'selection'
+        },
+        {
+          title: '曲目信息',
+          key: 'id',
+          render: (row: any) => (
+              <>
+                <NDescriptions labelPlacement="left" column={1}>
+                  <NDescriptionsItem label="曲目名称">
+                    <TheTooltip content={row.name}/>{' '}
+                  </NDescriptionsItem>
+                  <NDescriptionsItem label="曲目编号">{row.id}</NDescriptionsItem>
+                </NDescriptions>
+              </>
+          )
+        },
+        {
+          title: '曲目来源',
+          key: 'musicSheetCategoriesName',
+          render: (row: any) => (
+              <>
+                <NDescriptions labelPlacement="left" column={1}>
+                  <NDescriptionsItem label="曲目来源">
+                    {getMapValueByKey(row.sourceType, new Map(Object.entries(musicSheetSourceType)))}
+                  </NDescriptionsItem>
+                  <NDescriptionsItem label="所属人">{row.userName}</NDescriptionsItem>
+                </NDescriptions>
+              </>
+          )
+        },
+        {
+          title: '封面图',
+          key: 'musicCover',
+          render(row: any): JSX.Element {
+            return <NImage width={60} height={60} src={row.musicCover}/>
+          }
+        },
+        {
+          title: '曲目类型',
+          key: 'musicSheetType',
+          render: (row: any) => {
+            return <div>{getMapValueByKey(row.musicSheetType, new Map(Object.entries(musicSheetType)))}</div>
+          }
+        },
+        {
+          title: '伴奏类型',
+          key: 'audioType',
+          render: (row: any) => {
+            return <div>{getMapValueByKey(row.audioType, new Map(Object.entries(musicSheetAudioType)))}</div>
+          }
+        },
+        {
+          title: '可用声部',
+          key: 'subjectIdNames'
+        },
+        {
+          title: '标签',
+          key: 'musicTagNames'
+        },
+        {
+          title: '可用途径',
+          key: 'availableType',
+          render: (row: any) => {
+            return <div>{getMapValueByKey(row.availableType, new Map(Object.entries(musicSheetAvailableType)))}</div>
+          }
+        },
+        {
+          title: '是否置顶',
+          key: 'topFlag',
+          render: (row: any) => {
+            return <div>{row.topFlag?'是':'否'}</div>
+          }
+        },
+        {
+          title: '是否精品',
+          key: 'exquisiteFlag',
+          render: (row: any) => {
+            return <div>{row.topFlag?'是':'否'}</div>
+          }
+        },
+        {
+          title: '收费方式',
+          key: 'paymentType',
+          render: (row: any) => {
+            return <div>{getMapValueByKey(row.paymentType, new Map(Object.entries(musicSheetPaymentType)))}</div>
+          }
+        },
+        {
+          title: '曲目价格',
+          key: 'musicPrice',
+        },
+        {
+          title: '上传人',
+          key: 'createByName'
+        },
+        {
+          title: '上传时间',
+          key: 'createTime'
+        },
+        {
+          title: '状态',
+          key: 'status',
+          render(row: any) {
+            return (
+                <NTag type={row.status ? 'primary' : 'default'}>{row.status ? '启用' : '停用'}</NTag>
+            )
+          }
+        },
+        {
+          title: '操作',
+          key: 'operation',
+          fixed: 'right',
+          render(row: any) {
+            return (
+                <NSpace>
+                  <NButton
+                      type="primary"
+                      size="small"
+                      text
+                      //v-auth="musicSheet/status1612431726029942786"
+                      onClick={() => onChangeStatus(row)}
+                  >
+                    {row.status ? '停用' : '启用'}
+                  </NButton>
+                  <NButton
+                      type="primary"
+                      size="small"
+                      text
+                      //v-auth="musicSheet/update1602302618558099458"
+                      onClick={() => {
+                        state.showEditDialog = true
+                        state.updateRow = row
+                      }}
+                  >
+                    修改
+                  </NButton>
+                </NSpace>
+            )
+          }
+        }
+      ]
+    }
+
+
+    return () => {
+      return (
+          <div class="system-menu-container">
+            <SaveForm
+                ref={saveForm}
+                model={state.searchForm}
+                onSubmit={onSubmit}
+                saveKey="music-sheet-klx"
+                onSetModel={(val: any) => (state.searchForm = val)}
+            >
+
+              <NFormItem label="关键词" path="keyword">
+                <NInput
+                    placeholder="请输入曲目名称/编号"
+                    v-model:value={state.searchForm.keyword}
+                    clearable
+                />
+              </NFormItem>
+              <NFormItem label="曲目来源" path="sourceType">
+                <NSelect
+                    placeholder="请选择曲目来源"
+                    v-model:value={state.searchForm.sourceType}
+                    options={getSelectDataFromObj(musicSheetSourceType)}
+                    onUpdateValue={async (value: any) => {
+                      state.userIdData = []
+                      state.searchForm.userId = null
+                      if (value) {
+                        const {data} = await musicSheetApplicationOwnerList({page: 1, rows: 9999, sourceType: value, applicationId: state.appId})
+                        const temp = data.rows || []
+                        temp.forEach((next: any) => {
+                          state.userIdData.push({
+                            ...next,
+                            label: next.userName,
+                            value: next.userId
+                          })
+                        })
+                        state.userIdDisable = false
+                      } else {
+                        state.userIdDisable = true
+                      }
+                    }}
+                    clearable
+                />
+              </NFormItem>
+              <NFormItem label="所属人" path="userId">
+                <NSelect
+                    placeholder="请选择所属人"
+                    disabled={state.userIdDisable}
+                    v-model:value={state.searchForm.userId}
+                    options={state.userIdData}
+                    clearable
+                >
+                </NSelect>
+              </NFormItem>
+              <NFormItem label="曲目类型" path="subjectType">
+                <NSelect
+                    placeholder="请选择曲目类型"
+                    v-model:value={state.searchForm.musicSheetType}
+                    options={getSelectDataFromObj(musicSheetType)}
+                    clearable
+                />
+              </NFormItem>
+              <NFormItem label="伴奏类型" path="audioType">
+                <NSelect
+                    placeholder="请选择伴奏类型"
+                    v-model:value={state.searchForm.audioType}
+                    options={getSelectDataFromObj(musicSheetAudioType)}
+                    clearable
+                />
+              </NFormItem>
+              <NFormItem label="可用声部" path="subjectId">
+                <NSelect
+                    placeholder="请选择可用声部"
+                    v-model:value={state.searchForm.subjectId}
+                    options={state.subjectList}
+                    clearable
+                />
+              </NFormItem>
+              <NFormItem label="曲目标签" path="musicTagIds">
+                <NSelect
+                    placeholder="请选择曲目标签"
+                    v-model:value={state.searchForm.musicTagIds}
+                    options={state.musicTagList}
+                    multiple
+                    maxTagCount={2}
+                    clearable
+                />
+              </NFormItem>
+              {/*<NFormItem*/}
+              {/*    label="可用途径"*/}
+              {/*    path="availableType"*/}
+              {/*>*/}
+              {/*  <NSelect*/}
+              {/*      placeholder="请选择可用途径"*/}
+              {/*      v-model:value={state.searchForm.availableType}*/}
+              {/*      options={getSelectDataFromObj(musicSheetAvailableType)}*/}
+              {/*      clearable*/}
+              {/*  >*/}
+              {/*  </NSelect>*/}
+              {/*</NFormItem>*/}
+              <NFormItem
+                  label="收费方式"
+                  path="paymentType"
+              >
+                <NSelect
+                    placeholder="请选择收费方式"
+                    v-model:value={state.searchForm.paymentType}
+                    options={getSelectDataFromObj(musicSheetPaymentType)}
+                    clearable
+                >
+                </NSelect>
+              </NFormItem>
+              <NFormItem label="状态" path="status">
+                <NSelect
+                    v-model:value={state.searchForm.status}
+                    placeholder="请选择状态"
+                    options={
+                      [
+                        {
+                          label: '启用',
+                          value: true
+                        },
+                        {
+                          label: '停用',
+                          value: false
+                        }
+                      ] as any
+                    }
+                    clearable
+                />
+              </NFormItem>
+              <NFormItem label="上传时间" path="authorFrom">
+                <NDatePicker
+                    v-model:value={state.searchForm.times}
+                    type="daterange"
+                    clearable
+                    value-format="yyyy.MM.dd"
+                    startPlaceholder="开始时间"
+                    endPlaceholder="结束时间"
+                />
+              </NFormItem>
+              <NFormItem>
+                <NSpace>
+                  <NButton type="primary" onClick={onSearch}>
+                    搜索
+                  </NButton>
+                  <NButton type="default" onClick={onBtnReset}>
+                    重置
+                  </NButton>
+                </NSpace>
+              </NFormItem>
+            </SaveForm>
+
+            <div class={['section-container']}>
+              <NSpace style={{paddingBottom: '12px'}}>
+                <NButton
+                    type="primary"
+                    //v-auth="musicSheet/save1602302550719426561"
+                    onClick={() => {
+                      state.showAddDialog = true
+                    }}
+                >
+                  新增
+                </NButton>
+                <NButton
+                    disabled={checkedRowKeysRef.value.length == 0}
+                    //v-auth="musicSheet/save1602302550719426561"
+                    onClick={() => {
+                      onBatchChangeStatus(false)
+                    }}
+                >
+                  批量禁用
+                </NButton>
+                <NButton
+                    disabled={checkedRowKeysRef.value.length == 0}
+                    //v-auth="musicSheet/save1602302550719426561"
+                    onClick={() => {
+                      onBatchChangeStatus(true)
+                    }}
+                >
+                  批量启用
+                </NButton>
+              </NSpace>
+
+              <NDataTable
+                  loading={state.loading}
+                  columns={columns()}
+                  data={state.dataList}
+                  rowKey={(row: any) => row.id}
+                  onUpdateCheckedRowKeys={handleCheck}
+              ></NDataTable>
+
+              <Pagination
+                  v-model:page={state.pagination.page}
+                  v-model:pageSize={state.pagination.rows}
+                  v-model:pageTotal={state.pagination.pageTotal}
+                  onList={getList}
+                  sync
+                  saveKey="music-sheet-klx"
+              ></Pagination>
+            </div>
+
+            <NModal
+                v-model:show={state.showAddDialog}
+                preset="dialog"
+                showIcon={false}
+                title={'添加曲目'}
+                style={{width: '1200px'}}
+            >
+              <AddMusic
+                  onClose={() => (state.showAddDialog = false)}
+                  onGetList={() => {
+                    state.pagination.page = 1
+                    getList()
+                  }}
+                  subjectList={state.subjectList}
+                  appId={state.appId}
+                  musicSheetCategories={state.musicSheetCategories}
+              />
+            </NModal>
+            <NModal
+                v-model:show={state.showEditDialog}
+                preset="dialog"
+                showIcon={false}
+                title={'修改曲目'}
+                style={{width: '500px'}}
+            >
+              <UpdateMusic
+                  onClose={() => (state.showEditDialog = false)}
+                  onGetList={() => {
+                    state.pagination.page = 1
+                    getList()
+                  }}
+                  rowData={state.updateRow}
+                  appId={state.appId}
+                  musicSheetCategories={state.musicSheetCategories}
+              />
+            </NModal>
+          </div>
+      )
+    }
+
+  }
+})

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

@@ -0,0 +1,539 @@
+import {defineComponent, h, onMounted, reactive, ref} from "vue";
+import SaveForm from "@components/save-form";
+import {DataTableColumns, DataTableRowKey, NButton, NCascader, NDataTable, NFormItem, NIcon, NImage, NInput, NInputNumber, NSelect, NSpace, NStep, NSteps, useDialog, useMessage} from "naive-ui";
+import Pagination from "@components/pagination";
+import {getMapValueByKey, getSelectDataFromObj} from "@/utils/objectUtil";
+import {musicSheetSourceType, musicSheetType} from "@/utils/constant";
+import {musicSheetApplicationExtendSaveBatch, musicSheetPage} from "@views/music-library/api";
+import deepClone from "@/utils/deep.clone";
+
+export default defineComponent({
+  name: 'kt-addMusic',
+  props: {
+    appId: {
+      type: String,
+      required: true
+    },
+    subjectList: {
+      type: Array,
+      default: () => []
+    },
+    musicSheetCategories: {
+      type: Array,
+      default: () => []
+    }
+  },
+  emits: ['close', 'getList'],
+  setup(props, {slots, attrs, emit}) {
+    const dialogs = useDialog()
+    const message = useMessage()
+    const state = reactive({
+      loading: false,
+      pagination: {
+        page: 1,
+        rows: 5,
+        pageTotal: 0
+      },
+      stepPagination: {
+        page: 1,
+        rows: 5,
+        pageTotal: 0
+      },
+      searchForm: {
+        keyword: null,
+        musicSheetType: null,
+        subjectId: null,
+        sourceType: null,
+      },
+      subjectList: [] as any,
+      showAdd: false,
+      currentStep: 1,
+      dataList: [],
+      selectRowData: [] as any,// 选择的数据列表
+      musicSheetCategories: [] as any,
+      startSortNum: null as any,// 排序起始值
+      projectMusicCategoryId: null as any,// 曲目分类ID
+    })
+
+    onMounted(() => {
+      state.subjectList = props.subjectList
+      state.musicSheetCategories = props.musicSheetCategories
+      getList()
+    })
+
+    const getList = async () => {
+      try {
+        state.loading = true
+        const {data} = await musicSheetPage({
+          ...state.pagination,
+          ...state.searchForm,
+          addAppId: props.appId
+        })
+        state.pagination.pageTotal = Number(data.total)
+        state.dataList = data.rows || []
+      } catch {
+      }
+      state.loading = false
+    }
+
+    const saveForm = ref()
+
+    const onSearch = () => {
+      saveForm.value?.submit()
+    }
+    const onBtnReset = () => {
+      saveForm.value?.reset()
+    }
+
+    const onSubmit = () => {
+      state.pagination.page = 1
+      getList()
+    }
+
+    const onSave = async () => {
+      if (state.selectRowData.length == 0) {
+        message.error('未选择曲目');
+        return;
+      }
+      const params = [] as any[];
+      for (let i = 0; i < state.selectRowData.length; i++) {
+        const item = state.selectRowData[i];
+        if (!item.projectMusicCategoryId) {
+          message.error('曲目分类不能为空')
+          return;
+        }
+        if (!item.sortNo || !item.projectMusicCategoryId) {
+          message.error('排序号不能为空')
+          return;
+        }
+        params.push({
+          ...item,
+          musicSheetId: item.id,
+          musicSheetCategoryId: item.projectMusicCategoryId,
+          applicationId: props.appId,
+          id: null
+        })
+      }
+      const res = await musicSheetApplicationExtendSaveBatch(params) as any
+      if (res && res.code == '200') {
+        message.success(`添加成功`)
+        emit('getList')
+        emit('close')
+      }
+
+
+    }
+
+    const columnsField = [
+      {
+        type: 'selection'
+      },
+      {
+        title: '曲目编号',
+        key: 'id',
+      },
+      {
+        title: '封面图',
+        key: 'titleImg',
+        render(row: any) {
+          return <NImage width={40} height={40} src={row.musicCover}/>
+        }
+      },
+      {
+        title: '声部',
+        key: 'subjectNames',
+      },
+      {
+        title: '曲目名称',
+        key: 'name',
+      },
+      {
+        title: '音乐人',
+        key: 'composer',
+      },
+      {
+        title: '曲目类型',
+        key: 'musicSheetType',
+        render: (row: any) => {
+          return <div>{getMapValueByKey(row.musicSheetType, new Map(Object.entries(musicSheetType)))}</div>
+        }
+      },
+      {
+        title: '作者属性',
+        key: 'sourceType',
+        render(row: any) {
+          return getMapValueByKey(row.sourceType, new Map(Object.entries(musicSheetSourceType)));
+        }
+      },
+      {
+        title: '所属人',
+        key: 'userName',
+        render: (row: any) => {
+          return <div>{row.musicSheetExtend?.userName ? row.musicSheetExtend?.userName : ''}</div>
+        }
+      },
+    ]
+
+    const columns = (): any => {
+      return columnsField
+    }
+
+    const stepColumns = (): DataTableColumns => {
+      const field = deepClone(columnsField);
+      field.splice(0, 1)
+      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",
+                                   },
+                                   [
+                                     // icon
+                                     h(NCascader, {
+                                       onUpdateValue(v) {
+                                         state.projectMusicCategoryId = v
+                                       },
+                                       valueField: 'id',
+                                       labelField: "name",
+                                       childrenField: 'children',
+                                       placeholderField: '请选择曲目分类',
+                                       options: state.musicSheetCategories
+                                     }),
+                                   ]
+                               )
+                             },
+                             positiveText: "确定",
+                             negativeText: '取消',
+                             onPositiveClick: () => {
+                               for (let i = 0; i < state.selectRowData.length; i++) {
+                                 const item = state.selectRowData[i];
+                                 item.projectMusicCategoryId = state.projectMusicCategoryId
+                               }
+                             },
+                           })
+                         }
+                         }
+                >
+                  <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: 'projectMusicCategoryId',
+        fixed: 'right',
+        width: 200,
+        render: (row: any) => {
+          // })
+          return (
+              <NCascader
+                  valueField="id"
+                  labelField="name"
+                  children-field="children"
+                  placeholder="请选择曲目分类"
+                  value={row.projectMusicCategoryId}
+                  options={state.musicSheetCategories}
+                  onUpdateValue={(value: any) => {
+                    row.projectMusicCategoryId = value
+                  }}
+                  clearable
+              />
+          )
+        }
+      })
+      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",
+                                   },
+                                   [
+                                     // icon
+                                     h(NInputNumber, {
+                                       onUpdateValue(v) {
+                                         state.startSortNum = v
+                                       },
+                                       min: 0,
+                                       max: 9999,
+                                     }),
+                                   ]
+                               )
+                             },
+                             positiveText: "确定",
+                             negativeText: '取消',
+                             onPositiveClick: () => {
+                               if (state.startSortNum) {
+                                 for (let i = 0; i < state.selectRowData.length; i++) {
+                                   const item = state.selectRowData[i];
+                                   item.sortNo = state.startSortNum + i
+                                 }
+                               }
+                             },
+                           })
+                         }
+                         }
+                >
+                  <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: 'sortNo',
+        fixed: 'right',
+        width: 150,
+        render: (row: any) => {
+          return h(NInputNumber, {
+            value: row.sortNo,
+            min: 0,
+            max: 9999,
+            onUpdateValue(value: any) {
+              row.sortNo = value
+            }
+          })
+        }
+      })
+      field.push({
+        title: '操作',
+        key: 'operation',
+        fixed: 'right',
+        render(row: any) {
+          return (
+              <NSpace>
+                <NButton
+                    type="primary"
+                    size="small"
+                    text
+                    //v-auth="musicSheet/update1602302618558099458"
+                    onClick={() => {
+                      dialogs.warning({
+                        title: '警告',
+                        content: `是否删除该数据?`,
+                        positiveText: '确定',
+                        negativeText: '取消',
+                        onPositiveClick: async () => {
+                          try {
+                            const index = state.selectRowData.findIndex((item: any) => {
+                              if (item.id == row.id) {
+                                return true
+                              }
+                            })
+                            if (index > -1) {
+                              state.selectRowData.splice(index, 1)
+                            }
+                            const index1 = checkedRowKeysRef.value.findIndex((item: any) => {
+                              if (item == row.id) {
+                                return true
+                              }
+                            })
+                            if (index1 > -1) {
+                              checkedRowKeysRef.value.splice(index, 1)
+                            }
+                          } catch {
+                          }
+                        }
+                      })
+                    }}
+                >
+                  移除
+                </NButton>
+              </NSpace>
+          )
+        }
+      })
+      return field;
+    }
+
+    const checkedRowKeysRef = ref<DataTableRowKey[]>([])
+    const handleCheck = (rowKeys: DataTableRowKey[]) => {
+      checkedRowKeysRef.value = rowKeys
+      // 添加行更新值
+      state.dataList.forEach((next: any) => {
+        if (checkedRowKeysRef.value.includes(next.id)) {
+          const find = state.selectRowData.find((row: any) => {
+            return row.id === next.id
+          });
+          if (!find) {
+            state.selectRowData.push(next)
+          }
+        }
+      })
+
+      // 去掉行更新值
+      state.selectRowData = state.selectRowData.filter((next: any) => {
+        return checkedRowKeysRef.value.includes(next.id)
+      })
+    }
+
+    return () => {
+      return (
+          <div class="system-menu-container">
+            <NSpace vertical size="medium">
+              <NSteps
+                  current={state.currentStep}
+                  // onUpdateCurrent={()=>{
+                  //   state.currentStep = val
+                  // }}
+                  style={"margin-bottom: 10px;margin-top: 10px"}
+              >
+                <NStep
+                    title="选择曲目"
+                    description=""
+                >
+                </NStep>
+                <NStep
+                    title="设置曲目信息"
+                    description=""
+                >
+                </NStep>
+              </NSteps>
+            </NSpace>
+            {state.currentStep === 1 && (
+                <div class="system-menu-container">
+                  <SaveForm
+                      ref={saveForm}
+                      model={state.searchForm}
+                      onSubmit={onSubmit}
+                      // saveKey="cooleshow-edu-addMusic"
+                      onSetModel={(val: any) => (state.searchForm = val)}
+                  >
+                    <NFormItem label="关键词" path="keyword">
+                      <NInput
+                          v-model:value={state.searchForm.keyword}
+                          placeholder="请输入曲目名称/编号"
+                          clearable
+                      />
+                    </NFormItem>
+                    <NFormItem label="曲目类型" path="musicSheetType">
+                      <NSelect
+                          placeholder="请选择曲目类型"
+                          v-model:value={state.searchForm.musicSheetType}
+                          options={getSelectDataFromObj(musicSheetType)}
+                          clearable
+                      />
+                    </NFormItem>
+                    <NFormItem label="声部" path="musicSubject">
+                      <NSelect
+                          placeholder="请选择声部"
+                          v-model:value={state.searchForm.subjectId}
+                          options={state.subjectList}
+                          clearable
+                      />
+                    </NFormItem>
+                    <NFormItem label="曲目来源" path="sourceType">
+                      <NSelect
+                          placeholder="请选择曲目来源"
+                          v-model:value={state.searchForm.sourceType}
+                          options={getSelectDataFromObj(musicSheetSourceType)}
+                          // onUpdateValue={async (value: any) => {
+                          // }}
+                          clearable
+                      />
+                    </NFormItem>
+                    <NFormItem>
+                      <NSpace>
+                        <NButton type="primary" onClick={onSearch}>
+                          搜索
+                        </NButton>
+                        <NButton type="default" onClick={onBtnReset}>
+                          重置
+                        </NButton>
+                      </NSpace>
+                    </NFormItem>
+                  </SaveForm>
+                  <NDataTable
+                      loading={state.loading}
+                      columns={columns()}
+                      data={state.dataList}
+                      rowKey={(row: any) => row.id}
+                      onUpdateCheckedRowKeys={handleCheck}
+                  ></NDataTable>
+                  <Pagination
+                      v-model:page={state.pagination.page}
+                      v-model:pageSize={state.pagination.rows}
+                      v-model:pageTotal={state.pagination.pageTotal}
+                      onList={getList}
+                      sync
+                      // saveKey="cooleshow-edu-addMusic"
+                  ></Pagination>
+                </div>
+            )}
+            {state.currentStep === 2 && (
+                <div class="system-menu-container" style={"margin-top: 15px;"}>
+                  <NDataTable
+                      loading={state.loading}
+                      columns={stepColumns()}
+                      data={state.selectRowData}
+                      rowKey={(row: any) => row.id}
+                      maxHeight={500}
+                  ></NDataTable>
+                </div>
+            )}
+            <NSpace justify="end" style={"margin-top:10px"}>
+              <NButton type="default" onClick={() => {
+                if (state.currentStep > 1) {
+                  state.currentStep = state.currentStep - 1;
+                } else {
+                  emit('close')
+                }
+              }}>
+                {state.currentStep === 1 ? '取消' : '上一步'}
+              </NButton>
+              <NButton
+                  type="primary"
+                  onClick={() => {
+                    if (state.currentStep < 2) {
+                      if (state.selectRowData.length == 0) {
+                        message.warning("请选择曲目")
+                        return
+                      }
+                      state.currentStep = state.currentStep + 1;
+                    } else {
+                      onSave()
+                    }
+                  }}
+                  // loading={btnLoading.value}
+                  // disabled={btnLoading.value}
+              >
+                {state.currentStep === 2 ? '确定' : '下一步'}
+              </NButton>
+            </NSpace>
+          </div>
+      )
+    }
+  }
+})

+ 76 - 66
src/views/music-library/project-music-sheet/module/cooleshow-edu/cooleshow-edu.tsx → src/views/music-library/project-music-sheet/module/kt/music-sheet-kt.tsx

@@ -20,24 +20,29 @@ import {
 } from "naive-ui";
 import Pagination from "@components/pagination";
 import TheTooltip from "@components/TheTooltip";
-import AddMusic from "@views/music-library/project-music-sheet/module/cooleshow-edu/addMusic";
-import UpdateMusic from "@views/music-library/project-music-sheet/module/cooleshow-edu/updateMusic";
+import AddMusic from "@views/music-library/project-music-sheet/module/kt/addMusic";
+import UpdateMusic from "@views/music-library/project-music-sheet/module/kt/updateMusic";
 import {musicSheetApplicationExtendCategoryList, musicSheetApplicationOwnerList, musicSheetPageByApplication, musicSheetStatusList} from "@views/music-library/api";
 import {getMapValueByKey, getSelectDataFromObj} from "@/utils/objectUtil";
-import {musicSheetAudioType, musicSheetAvailableType, musicSheetPaymentType, musicSheetSourceType, musicSheetType} from "@/utils/constant";
+import {musicSheetAudioType, musicSheetSourceType, musicSheetType} from "@/utils/constant";
 import {sysApplicationPage} from "@views/menu-manage/api";
 import {subjectPage} from "@views/system-manage/api";
 import {filterTimes} from "@/utils/dateUtil";
 
 export default defineComponent({
-  name: 'project-music-sheet-jmedu',
+  name: 'project-music-sheet-KT',
+  props: {
+    appKey: {
+      type: String,
+      default: 'KT'
+    }
+  },
 
-  setup() {
+  setup(props) {
     const dialog = useDialog()
     const message = useMessage()
     const state = reactive({
       loading: false,
-      appKey: 'KT',
       appId: null as any,
       pagination: {
         page: 1,
@@ -67,7 +72,6 @@ export default defineComponent({
         detailFlag: null, //是否查询详情
       },
       subjectList: [],
-      showAdd: false,
       dataList: [] as any[],
       musicSheetCategories: [],
       showAddDialog: false,
@@ -78,10 +82,9 @@ export default defineComponent({
     })
 
     onMounted(async () => {
-
       // 获取应用APP信息
       {
-        const {data} = await sysApplicationPage({page: 1, rows: 1, appKey: state.appKey})
+        const {data} = await sysApplicationPage({page: 1, rows: 1, appKey: props.appKey})
         const tempList = data.rows || []
         if (!tempList || tempList.length == 0) {
           message.error("加载项目信息失败");
@@ -234,6 +237,13 @@ export default defineComponent({
           )
         },
         {
+          title: '封面图',
+          key: 'musicCover',
+          render(row: any): JSX.Element {
+            return <NImage width={60} height={60} src={row.musicCover}/>
+          }
+        },
+        {
           title: '曲目类型',
           key: 'musicSheetType',
           render: (row: any) => {
@@ -255,13 +265,13 @@ export default defineComponent({
           title: '曲目分类',
           key: 'musicSheetCategoryName'
         },
-        {
-          title: '封面图',
-          key: 'musicCover',
-          render(row: any): JSX.Element {
-            return <NImage width={60} height={60} src={row.musicCover}/>
-          }
-        },
+        // {
+        //   title: '可用途径',
+        //   key: 'availableType',
+        //   render: (row: any) => {
+        //     return <div>{getMapValueByKey(row.availableType, new Map(Object.entries(musicSheetAvailableType)))}</div>
+        //   }
+        // },
         // {
         //   title: '收费方式',
         //   key: 'paymentType',
@@ -339,37 +349,6 @@ export default defineComponent({
                     clearable
                 />
               </NFormItem>
-              <NFormItem label="分类" path="musicCategoryId">
-                <NCascader
-                    valueField="id"
-                    labelField="name"
-                    children-field="children"
-                    placeholder="请选择分类"
-                    v-model:value={state.searchForm.musicCategoryId}
-                    options={state.musicSheetCategories}
-                    clearable
-                />
-              </NFormItem>
-              <NFormItem
-                  label="可用途径"
-                  path="availableType"
-              >
-                <NSelect
-                    placeholder="请选择可用途径"
-                    v-model:value={state.searchForm.availableType}
-                    options={getSelectDataFromObj(musicSheetAvailableType)}
-                    clearable
-                >
-                </NSelect>
-              </NFormItem>
-              <NFormItem label="曲目类型" path="subjectType">
-                <NSelect
-                    placeholder="请选择曲目类型"
-                    v-model:value={state.searchForm.musicSheetType}
-                    options={getSelectDataFromObj(musicSheetType)}
-                    clearable
-                />
-              </NFormItem>
               <NFormItem label="曲目来源" path="sourceType">
                 <NSelect
                     placeholder="请选择曲目来源"
@@ -406,6 +385,53 @@ export default defineComponent({
                 >
                 </NSelect>
               </NFormItem>
+              <NFormItem label="曲目类型" path="subjectType">
+                <NSelect
+                    placeholder="请选择曲目类型"
+                    v-model:value={state.searchForm.musicSheetType}
+                    options={getSelectDataFromObj(musicSheetType)}
+                    clearable
+                />
+              </NFormItem>
+              <NFormItem label="伴奏类型" path="audioType">
+                <NSelect
+                    placeholder="请选择伴奏类型"
+                    v-model:value={state.searchForm.audioType}
+                    options={getSelectDataFromObj(musicSheetAudioType)}
+                    clearable
+                />
+              </NFormItem>
+              <NFormItem label="可用声部" path="subjectId">
+                <NSelect
+                    placeholder="请选择可用声部"
+                    v-model:value={state.searchForm.subjectId}
+                    options={state.subjectList}
+                    clearable
+                />
+              </NFormItem>
+              <NFormItem label="曲目分类" path="musicCategoryId">
+                <NCascader
+                    valueField="id"
+                    labelField="name"
+                    children-field="children"
+                    placeholder="请选择曲目分类"
+                    v-model:value={state.searchForm.musicCategoryId}
+                    options={state.musicSheetCategories}
+                    clearable
+                />
+              </NFormItem>
+              {/*<NFormItem*/}
+              {/*    label="可用途径"*/}
+              {/*    path="availableType"*/}
+              {/*>*/}
+              {/*  <NSelect*/}
+              {/*      placeholder="请选择可用途径"*/}
+              {/*      v-model:value={state.searchForm.availableType}*/}
+              {/*      options={getSelectDataFromObj(musicSheetAvailableType)}*/}
+              {/*      clearable*/}
+              {/*  >*/}
+              {/*  </NSelect>*/}
+              {/*</NFormItem>*/}
               <NFormItem label="状态" path="status">
                 <NSelect
                     v-model:value={state.searchForm.status}
@@ -425,22 +451,6 @@ export default defineComponent({
                     clearable
                 />
               </NFormItem>
-              <NFormItem label="声部" path="subjectId">
-                <NSelect
-                    placeholder="请选择声部"
-                    v-model:value={state.searchForm.subjectId}
-                    options={state.subjectList}
-                    clearable
-                />
-              </NFormItem>
-              <NFormItem label="伴奏类型" path="audioType">
-                <NSelect
-                    placeholder="请选择伴奏类型"
-                    v-model:value={state.searchForm.audioType}
-                    options={getSelectDataFromObj(musicSheetAudioType)}
-                    clearable
-                />
-              </NFormItem>
               <NFormItem label="上传时间" path="authorFrom">
                 <NDatePicker
                     v-model:value={state.searchForm.times}
@@ -469,7 +479,7 @@ export default defineComponent({
                     type="primary"
                     //v-auth="musicSheet/save1602302550719426561"
                     onClick={() => {
-                      state.showAdd = true
+                      state.showAddDialog = true
                     }}
                 >
                   新增
@@ -513,14 +523,14 @@ export default defineComponent({
             </div>
 
             <NModal
-                v-model:show={state.showAdd}
+                v-model:show={state.showAddDialog}
                 preset="dialog"
                 showIcon={false}
                 title={'添加曲目'}
                 style={{width: '1200px'}}
             >
               <AddMusic
-                  onClose={() => (state.showAdd = false)}
+                  onClose={() => (state.showAddDialog = false)}
                   onGetList={() => {
                     state.pagination.page = 1
                     getList()

+ 0 - 0
src/views/music-library/project-music-sheet/module/cooleshow-edu/updateMusic.tsx → src/views/music-library/project-music-sheet/module/kt/updateMusic.tsx


+ 0 - 240
src/views/music-library/project-music-sheet/module/mec/addMusic.tsx

@@ -1,240 +0,0 @@
-import {defineComponent, onMounted, reactive, ref} from "vue";
-import SaveForm from "@components/save-form";
-import {NButton, NDataTable, NDatePicker, NDescriptions, NDescriptionsItem, NFormItem, NImage, NInput, NModal, NSelect, NSpace, NStep, NSteps} from "naive-ui";
-import Pagination from "@components/pagination";
-import TheTooltip from "@components/TheTooltip";
-
-export default defineComponent({
-  name: 'project-music-sheet-mec',
-  setup(props, {slots, attrs, emit}) {
-    const state = reactive({
-      loading: false,
-      pagination: {
-        page: 1,
-        rows: 10,
-        pageTotal: 0
-      },
-      searchForm: {
-        keyword: null,
-        subjectType: null,
-        musicSubject: null,
-        status: null
-      },
-      subjectList: [],
-      showAdd: false,
-      currentStep: 1,
-      dataList: []
-    })
-
-    onMounted(() => {
-    })
-
-    const saveForm = ref()
-
-    const onSearch = () => {
-      saveForm.value?.submit()
-    }
-    const onBtnReset = () => {
-      saveForm.value?.reset()
-    }
-
-    const onSubmit = () => {
-
-    }
-
-    const columns = (): any => {
-      return [
-        {
-          title: '曲目信息',
-          key: 'id',
-          render: (row: any) => (
-              <>
-                <NDescriptions labelPlacement="left" column={1}>
-                  <NDescriptionsItem label="曲目名称">
-                    <TheTooltip content={row.musicSheetName}/>{' '}
-                  </NDescriptionsItem>
-                  <NDescriptionsItem label="曲目编号">{row.id}</NDescriptionsItem>
-                </NDescriptions>
-              </>
-          )
-        },
-        {
-          title: '封面图',
-          key: 'titleImg',
-          render(row: any) {
-            return <NImage width={60} height={60} src={row.titleImg}/>
-          }
-        },
-        {
-          title: '声部',
-          key: 'titleImg',
-        },
-        {
-          title: '曲目名称',
-          key: 'titleImg',
-        },
-        {
-          title: '音乐人',
-          key: 'titleImg',
-        },
-        {
-          title: '曲目类型',
-          key: 'titleImg',
-        },
-        {
-          title: '作者属性',
-          key: 'titleImg',
-        },
-        {
-          title: '所属人',
-          key: 'titleImg',
-        },
-        {
-          title: '操作',
-          key: 'operation',
-          fixed: 'right',
-          render(row: any) {
-            return (
-                <NSpace>
-                  <NButton
-                      type="primary"
-                      size="small"
-                      text
-                      //v-auth="musicSheet/status1612431726029942786"
-                      // onClick={() => onChangeStatus(row)}
-                  >
-                    {row.status ? '停用' : '启用'}
-                  </NButton>
-                  <NButton
-                      type="primary"
-                      size="small"
-                      text
-                      //v-auth="musicSheet/update1602302618558099458"
-                      onClick={() => {
-                        // state.visiableMusic = true
-                        // state.musicOperation = 'edit'
-                        // state.musicData = row
-                      }}
-                  >
-                    修改
-                  </NButton>
-                </NSpace>
-            )
-          }
-        }
-      ]
-    }
-
-    const updateCurrent = (val: any) => {
-      state.currentStep = val
-    }
-
-    return () => {
-      return (
-          <div class="system-menu-container">
-            <NSpace vertical size="medium">
-              <NSteps current={state.currentStep} onUpdateCurrent={updateCurrent} style={"margin-bottom: 20px;"}>
-                <NStep
-                    title="选择分类"
-                    description=""
-                >
-                </NStep>
-                <NStep
-                    title="选择分类下曲目"
-                    description=""
-                >
-                </NStep>
-                <NStep
-                    title="设置曲目信息"
-                    description=""
-                >
-                </NStep>
-              </NSteps>
-            </NSpace>
-            {state.currentStep === 1 && (
-                <SaveForm>
-                  <NFormItem label="关键词" path="keyword">
-                    <NSelect></NSelect>
-                  </NFormItem>
-                </SaveForm>
-            )}
-            {state.currentStep === 2 && (
-                <div class="system-menu-container">
-                  <SaveForm>
-                    <NFormItem label="关键词" path="keyword">
-                      <NSelect></NSelect>
-                    </NFormItem>
-                    <NFormItem label="曲目类型" path="keyword">
-                      <NSelect></NSelect>
-                    </NFormItem>
-                    <NFormItem label="声部" path="keyword">
-                      <NSelect></NSelect>
-                    </NFormItem>
-                    <NFormItem label="曲目来源" path="keyword">
-                      <NSelect></NSelect>
-                    </NFormItem>
-                    <NFormItem>
-                      <NSpace>
-                        <NButton type="primary" onClick={onSearch}>
-                          搜索
-                        </NButton>
-                        <NButton type="default" onClick={onBtnReset}>
-                          重置
-                        </NButton>
-                      </NSpace>
-                    </NFormItem>
-                  </SaveForm>
-                  <NDataTable
-                      loading={state.loading}
-                      columns={columns()}
-                      data={state.dataList}
-                  ></NDataTable>
-                  <Pagination
-                      v-model:page={state.pagination.page}
-                      v-model:pageSize={state.pagination.rows}
-                      v-model:pageTotal={state.pagination.pageTotal}
-                      // onList={getList}
-                      sync
-                      saveKey="music-list"
-                  ></Pagination>
-                </div>
-            )}
-            {state.currentStep === 3 && (
-                <div class="system-menu-container" style={"margin-top: 15px;"}>
-                  <NDataTable
-                      loading={state.loading}
-                      columns={columns()}
-                      data={state.dataList}
-                  ></NDataTable>
-                </div>
-            )}
-            <NSpace justify="end">
-              <NButton type="default" onClick={() => {
-                if (state.currentStep > 1) {
-                  state.currentStep = state.currentStep - 1;
-                } else {
-                  emit('close')
-                }
-              }}>
-                {state.currentStep === 1 ? '取消' : '上一步'}
-              </NButton>
-              <NButton
-                  type="primary"
-                  onClick={() => {
-                    if (state.currentStep < 3) {
-                      state.currentStep = state.currentStep + 1;
-                    } else {
-                      onSubmit()
-                    }
-                  }}
-                  // loading={btnLoading.value}
-                  // disabled={btnLoading.value}
-              >
-                {state.currentStep === 3 ? '确定' : '下一步'}
-              </NButton>
-            </NSpace>
-          </div>
-      )
-    }
-  }
-})

+ 0 - 349
src/views/music-library/project-music-sheet/module/mec/mec.tsx

@@ -1,349 +0,0 @@
-import {defineComponent, onMounted, reactive, ref} from "vue";
-import SaveForm from "@components/save-form";
-import {NButton, NDataTable, NDatePicker, NDescriptions, NDescriptionsItem, NFormItem, NImage, NInput, NModal, NSelect, NSpace} from "naive-ui";
-import Pagination from "@components/pagination";
-import TheTooltip from "@components/TheTooltip";
-import AddMusic from "@views/music-library/project-music-sheet/module/mec/addMusic";
-
-export default defineComponent({
-  name: 'project-music-sheet-mec',
-
-  setup() {
-    const state = reactive({
-      loading: false,
-      pagination: {
-        page: 1,
-        rows: 10,
-        pageTotal: 0
-      },
-      searchForm: {
-        keyword: null,
-        subjectType: null,
-        musicSubject: null,
-        status: null
-      },
-      subjectList: [],
-      showAdd: false
-    })
-
-    onMounted(() => {
-    })
-
-    const saveForm = ref()
-
-    const onSearch = () => {
-      saveForm.value?.submit()
-    }
-    const onBtnReset = () => {
-      saveForm.value?.reset()
-    }
-
-    const onSubmit = () => {
-
-    }
-
-    const columns = (): any => {
-      return [
-        {
-          title: '曲目信息',
-          key: 'id',
-          render: (row: any) => (
-              <>
-                <NDescriptions labelPlacement="left" column={1}>
-                  <NDescriptionsItem label="曲目名称">
-                    <TheTooltip content={row.musicSheetName}/>{' '}
-                  </NDescriptionsItem>
-                  <NDescriptionsItem label="曲目编号">{row.id}</NDescriptionsItem>
-                </NDescriptions>
-              </>
-          )
-        },
-        {
-          title: '封面图',
-          key: 'titleImg',
-          render(row: any) {
-            return <NImage width={60} height={60} src={row.titleImg}/>
-          }
-        },
-        {
-          title: '曲目来源',
-          key: 'musicSheetCategoriesName',
-          render: (row: any) => (
-              <>
-                <NDescriptions labelPlacement="left" column={1}>
-                  <NDescriptionsItem label="曲目来源">
-                    <TheTooltip content={row.musicSheetCategoriesName}/>{' '}
-                  </NDescriptionsItem>
-                  <NDescriptionsItem label="所属人">
-                    {row.accompanimentType === 'HOMEMODE' ? '自制伴奏' : '普通伴奏'}
-                  </NDescriptionsItem>
-                </NDescriptions>
-              </>
-          )
-        },
-        {
-          title: '曲目类型',
-          key: 'musicSheetCategoriesName'
-        },
-        {
-          title: '可用声部',
-          key: 'musicSheetCategoriesName'
-        },
-        {
-          title: '分类',
-          key: 'musicSheetCategoriesName'
-        },
-        {
-          title: '是否收费',
-          key: 'musicSheetCategoriesName'
-        },
-        {
-          title: '上传人',
-          key: 'musicSheetCategoriesName'
-        },
-        {
-          title: '上传时间',
-          key: 'musicSheetCategoriesName'
-        },
-        {
-          title: '状态',
-          key: 'musicSheetCategoriesName'
-        },
-        {
-          title: '操作',
-          key: 'operation',
-          fixed: 'right',
-          render(row: any) {
-            return (
-                <NSpace>
-                  <NButton
-                      type="primary"
-                      size="small"
-                      text
-                      //v-auth="musicSheet/status1612431726029942786"
-                      // onClick={() => onChangeStatus(row)}
-                  >
-                    {row.status ? '停用' : '启用'}
-                  </NButton>
-                  <NButton
-                      type="primary"
-                      size="small"
-                      text
-                      //v-auth="musicSheet/update1602302618558099458"
-                      onClick={() => {
-                        // state.visiableMusic = true
-                        // state.musicOperation = 'edit'
-                        // state.musicData = row
-                      }}
-                  >
-                    修改
-                  </NButton>
-                </NSpace>
-            )
-          }
-        }
-      ]
-    }
-
-    return () => {
-      return (
-          <div class="system-menu-container">
-            <SaveForm
-                ref={saveForm}
-                model={state.searchForm}
-                onSubmit={onSubmit}
-                saveKey="project-music-sheet-mec"
-                onSetModel={(val: any) => (state.searchForm = val)}
-            >
-
-              <NFormItem label="关键词" path="keyword">
-                <NInput
-                    placeholder="曲目名称/编号"
-                    v-model:value={state.searchForm.keyword}
-                    clearable
-                />
-              </NFormItem>
-
-              <NFormItem label="曲目类型" path="subjectType">
-                <NSelect
-                    placeholder="请选择曲目类型"
-                    v-model:value={state.searchForm.subjectType}
-                    options={
-                      [
-                        {
-                          label: '独奏',
-                          value: '1'
-                        },
-                        {
-                          label: '合奏',
-                          value: '2'
-                        }
-                      ]
-                    }
-                    clearable
-                />
-              </NFormItem>
-              <NFormItem label="声部" path="musicSubject">
-                <NSelect
-                    placeholder="请选择声部"
-                    v-model:value={state.searchForm.musicSubject}
-                    options={state.subjectList}
-                    clearable
-                />
-              </NFormItem>
-              <NFormItem label="状态" path="status">
-                <NSelect
-                    v-model={[state.searchForm.status, 'value']}
-                    placeholder="请选择状态"
-                    clearable
-                    options={
-                      [
-                        {
-                          label: '启用',
-                          value: true
-                        },
-                        {
-                          label: '停用',
-                          value: false
-                        }
-                      ] as any
-                    }
-                />
-              </NFormItem>
-              <NFormItem label="曲目来源" path="authorFrom">
-                <NSelect
-                    placeholder="请选择曲目来源"
-                    // v-model:value={state.searchForm.authorFrom}
-                    options={
-                      [
-                        {
-                          label: '平台',
-                          value: 'PLATFORM'
-                        },
-                        {
-                          label: '机构',
-                          value: 'TENANT'
-                        },
-                        {
-                          label: '个人',
-                          value: 'SELF'
-                        }
-                      ] as any
-                    }
-                    clearable
-                />
-              </NFormItem>
-
-              <NFormItem label="收费类型" path="authorFrom">
-                <NSelect
-                    placeholder="请选择收费类型"
-                    // v-model:value={state.searchForm.authorFrom}
-                    options={
-                      [
-                        {
-                          label: '免费',
-                          value: 'PLATFORM'
-                        },
-                        {
-                          label: '收费',
-                          value: 'TENANT'
-                        },
-                        {
-                          label: '单曲收费',
-                          value: 'SELF'
-                        }
-                      ] as any
-                    }
-                    clearable
-                />
-              </NFormItem>
-
-              <NFormItem label="所属人" path="authorFrom">
-                <NInput></NInput>
-              </NFormItem>
-              <NFormItem label="曲目分类" path="authorFrom">
-                <NSelect></NSelect>
-              </NFormItem>
-              <NFormItem label="上传时间" path="authorFrom">
-                <NDatePicker
-                    // v-model:value={state.searchForm.times}
-                    type="daterange"
-                    clearable
-                    value-format="yyyy.MM.dd"
-                    startPlaceholder="开始时间"
-                    endPlaceholder="结束时间"
-                />
-              </NFormItem>
-              <NFormItem>
-                <NSpace>
-                  <NButton type="primary" onClick={onSearch}>
-                    搜索
-                  </NButton>
-                  <NButton type="default" onClick={onBtnReset}>
-                    重置
-                  </NButton>
-                </NSpace>
-              </NFormItem>
-            </SaveForm>
-
-            <div class={['section-container']}>
-              <NSpace style={{paddingBottom: '12px'}}>
-                <NButton
-                    type="primary"
-                    //v-auth="musicSheet/save1602302550719426561"
-                    onClick={() => {
-                      state.showAdd = true
-                    }}
-                >
-                  新增
-                </NButton>
-                <NButton
-                    //v-auth="musicSheet/save1602302550719426561"
-                    onClick={() => {
-                      // state.musicOperation = 'unable'
-                      // state.musicData = {}
-                    }}
-                >
-                  批量禁用
-                </NButton>
-                <NButton
-                    //v-auth="musicSheet/save1602302550719426561"
-                    onClick={() => {
-                      // state.musicOperation = 'enable'
-                      // state.musicData = {}
-                    }}
-                >
-                  批量启用
-                </NButton>
-              </NSpace>
-
-              <NDataTable
-                  loading={state.loading}
-                  columns={columns()}
-                  // data={state.dataList}
-              ></NDataTable>
-
-              <Pagination
-                  v-model:page={state.pagination.page}
-                  v-model:pageSize={state.pagination.rows}
-                  v-model:pageTotal={state.pagination.pageTotal}
-                  // onList={getList}
-                  sync
-                  saveKey="project-music-sheet-mec"
-              ></Pagination>
-            </div>
-
-            <NModal
-                v-model:show={state.showAdd}
-                preset="dialog"
-                showIcon={false}
-                title={'添加曲目'}
-                style={{width: '1200px',height: '800px'}}
-            >
-              <AddMusic/>
-            </NModal>
-          </div>
-      )
-    }
-  }
-})

+ 10 - 0
src/views/system-manage/subject-manage/api.ts

@@ -10,6 +10,16 @@ export const musicalInstrumentPage = (data: object) => {
     data
   } as any)
 }
+/**
+ * 乐器列表
+ */
+export const musicalInstrumentQueryNotRelated = (data: object) => {
+  return request({
+    url: '/cbs-app/musicalInstrument/queryNotRelated',
+    method: 'post',
+    data
+  } as any)
+}
 
 /**
  * 乐器新增

+ 3 - 7
src/views/system-manage/subject-manage/instrument/modal/instrument-save.tsx

@@ -11,10 +11,6 @@ export default defineComponent({
       type: String,
       default: 'add'
     },
-    applyList: {
-      type: Array as PropType<any>,
-      default: () => []
-    },
     data: {
       type: Object as PropType<any>,
       default: () => {
@@ -71,7 +67,7 @@ export default defineComponent({
 
     return () => (
         <div style="background: #fff; padding-top: 12px">
-          <NForm model={forms} ref={formsRef} label-placement="left" label-width="auto">
+          <NForm model={forms} ref={formsRef} label-placement="left" label-width="100px">
             <NFormItem
                 label="乐器名称"
                 path="name"
@@ -91,8 +87,8 @@ export default defineComponent({
               ></NInput>
             </NFormItem>
             <NFormItem
-                label="是否支持转简谱"
-                path="isConvertibleScore"
+                label="支持转简谱"
+                path="transferFlag"
                 rule={[
                   {
                     required: true,

+ 23 - 8
src/views/system-manage/subject-manage/subject/modal/subject-save.tsx

@@ -1,6 +1,6 @@
 import {NButton, NForm, NFormItem, NInput, NSelect, NSpace, useMessage} from 'naive-ui'
 import {defineComponent, onMounted, PropType, reactive, ref} from 'vue'
-import {subjectUpdate, subjectSave} from "@views/system-manage/subject-manage/api";
+import {subjectUpdate, subjectSave, musicalInstrumentQueryNotRelated} from "@views/system-manage/subject-manage/api";
 import UploadFile from "@components/upload-file";
 import deepClone from "@/utils/deep.clone";
 
@@ -33,11 +33,11 @@ export default defineComponent({
         name: null,
         img: null,
         code: null,
-        musicalInstrumentIds: [],
+        musicalInstrumentIds: [] as any,
       },
       rowData: {},
       categoryList: [],
-      instrumentList: [],
+      instrumentList: [] as any,
     })
     const btnLoading = ref(false)
     const formsRef = ref()
@@ -76,7 +76,6 @@ export default defineComponent({
 
     onMounted(async () => {
       state.categoryList = deepClone(props.categoryList)
-      state.instrumentList = deepClone(props.instrumentList)
       state.categoryList.forEach((next: any) => {
         next.disabled = !next.enableFlag
       })
@@ -90,15 +89,31 @@ export default defineComponent({
         state.forms.img = data.img
         state.forms.code = data.code
         state.forms.musicalInstrumentIds = data.musicalInstrumentIds?.split(',') || [];
+        props.instrumentList.forEach((next: any) => {
+          if (state.forms.musicalInstrumentIds.includes(next.value + '')) {
+            state.instrumentList.push({
+              label: next.label,
+              value: next.value
+            })
+          }
+
+        });
       } else {
         state.categoryList = state.categoryList.filter((next: any) => {
           return next.enableFlag == true
         })
-        // state.instrumentList = state.instrumentList.filter((next: any) => {
-        //   return next.enableFlag == true
-        // })
       }
-
+      // 查询未关联声部的乐器
+      {
+        const {data} = await musicalInstrumentQueryNotRelated({});
+        data.forEach((next: any) => {
+          state.instrumentList.push({
+            label: next.name,
+            value: next.id + ''
+          })
+        })
+      }
+      console.log(state.instrumentList)
     })
 
     return () => (

+ 4 - 0
src/views/system-manage/system-apply/index.tsx

@@ -42,6 +42,10 @@ export default defineComponent({
         title: '应用名称',
         key: 'appName'
       },
+      {
+        title: '应用编码',
+        key: 'appKey'
+      },
       // {
       //   title: '应用分类',
       //   key: 'parentId'