瀏覽代碼

修改搜索和规则

lex 2 年之前
父節點
當前提交
6f84ed25e7
共有 3 個文件被更改,包括 470 次插入190 次删除
  1. 92 43
      src/views/attendance-rule/index.tsx
  2. 139 3
      src/views/exercise-record/index.module.less
  3. 239 144
      src/views/exercise-record/index.tsx

+ 92 - 43
src/views/attendance-rule/index.tsx

@@ -30,7 +30,7 @@ export default defineComponent({
         })
         if (data) {
           data.forEach((item: any) => {
-            forms[item.id] = item.paramValue
+            forms[item.paramName] = item.paramValue
           })
         }
         console.log(forms)
@@ -78,40 +78,64 @@ export default defineComponent({
                 <div class={styles.textWrap}>
                   <h4>可签到时间范围:</h4>
                   <p>
-                    课程<span>开始前{forms[15] ? forms[15] : 0}分钟</span>至课程<span>结束前</span>
+                    课程
+                    <span>
+                      开始前{forms['normal_sign_in_start'] ? forms['normal_sign_in_start'] : 0}分钟
+                    </span>
+                    至课程<span>结束前</span>
+                  </p>
+                  <p>
+                    时间段:{reduceFormMinute('12:00:00', forms['normal_sign_in_start'])} ~13:00:00{' '}
                   </p>
-                  <p>时间段:{reduceFormMinute('12:00:00', forms[15])} ~13:00:00 </p>
                 </div>
 
                 <div class={styles.textWrap}>
                   <h4>正常签到:</h4>
                   <p>
-                    课程<span>开始前{forms[15] ? forms[15] : 0}分钟</span>至课程
-                    <span>开始前{forms[16] ? forms[16] : 0}分钟</span>
+                    课程
+                    <span>
+                      开始前{forms['normal_sign_in_start'] ? forms['normal_sign_in_start'] : 0}分钟
+                    </span>
+                    至课程
+                    <span>
+                      开始前{forms['normal_sign_in_end'] ? forms['normal_sign_in_end'] : 0}分钟
+                    </span>
                     签到 <br />
-                    GPS定位点在教学点<span>{forms[10] ? forms[10] : 0}米内</span>
+                    GPS定位点在教学点
+                    <span>
+                      {forms['scope_of_attendance'] ? forms['scope_of_attendance'] : 0}米内
+                    </span>
                   </p>
                   <p>
-                    时间段:{reduceFormMinute('12:00:00', forms[15])} ~{' '}
-                    {reduceFormMinute('12:00:00', forms[16])}
+                    时间段:{reduceFormMinute('12:00:00', forms['normal_sign_in_start'])} ~{' '}
+                    {reduceFormMinute('12:00:00', forms['normal_sign_in_end'])}
                   </p>
                 </div>
 
                 <div class={styles.textWrap}>
                   <h4>异常签到:</h4>
                   <p>
-                    课程<span>开始前{forms[17] ? forms[17] : 0}分钟</span>后至课程
+                    课程
+                    <span>
+                      开始前{forms['abnormal_sign_in'] ? forms['abnormal_sign_in'] : 0}分钟
+                    </span>
+                    后至课程
                     <span>开始前</span>
                     签到
                     <br />
-                    GPS定位点在教学点<span>{forms[10] ? forms[10] : 0}米内</span>
+                    GPS定位点在教学点
+                    <span>
+                      {forms['scope_of_attendance'] ? forms['scope_of_attendance'] : 0}米内
+                    </span>
+                  </p>
+                  <p>
+                    时间段:{reduceFormMinute('12:00:00', forms['abnormal_sign_in'])} ~ 12:00:00
                   </p>
-                  <p>时间段:{reduceFormMinute('12:00:00', forms[17])} ~ 12:00:00</p>
                   <p>
                     扣除训练补助:
                     <span>
-                      -{forms[18] ? forms[18] : 0}
-                      {forms[19] == 'MONEY' ? '元' : '%'}
+                      -{forms['abnormal_sign_in_fee'] ? forms['abnormal_sign_in_fee'] : 0}
+                      {forms['abnormal_sign_in_fee_type'] == 'MONEY' ? '元' : '%'}
                     </span>
                   </p>
                 </div>
@@ -119,14 +143,15 @@ export default defineComponent({
                 <div class={styles.textWrap}>
                   <h4>迟到:</h4>
                   <p>
-                    课程<span>开始后{forms[20] ? forms[20] : 0}分钟</span>内签到
+                    课程<span>开始后{forms['late_sign_in'] ? forms['late_sign_in'] : 0}分钟</span>
+                    内签到
                   </p>
-                  <p>时间段:12:00:00 ~ {addFormMinute('12:00:00', forms[20])}</p>
+                  <p>时间段:12:00:00 ~ {addFormMinute('12:00:00', forms['late_sign_in'])}</p>
                   <p>
                     扣除训练补助:
                     <span>
-                      -{forms[21] ? forms[21] : 0}
-                      {forms[22] == 'MONEY' ? '元' : '%'}
+                      -{forms['late_sign_in_fee'] ? forms['late_sign_in_fee'] : 0}
+                      {forms['late_sign_in_fee_type'] == 'MONEY' ? '元' : '%'}
                     </span>
                   </p>
                 </div>
@@ -134,18 +159,20 @@ export default defineComponent({
                 <div class={styles.textWrap}>
                   <h4>旷课:</h4>
                   <p>
-                    课程<span>开始后{forms[23] ? forms[23] : 0}分钟</span>至课程<span>结束前</span>
+                    课程
+                    <span>开始后{forms['absence_sign_in'] ? forms['absence_sign_in'] : 0}分钟</span>
+                    至课程<span>结束前</span>
                     签到
                   </p>
                   <p>
-                    时间段:{addFormMinute('12:00:00', forms[23])}后签到(含
-                    {addFormMinute('12:00:00', forms[23])})
+                    时间段:{addFormMinute('12:00:00', forms['absence_sign_in'])}后签到(含
+                    {addFormMinute('12:00:00', forms['absence_sign_in'])})
                   </p>
                   <p>
                     扣除训练补助:
                     <span>
-                      -{forms[24] ? forms[24] : 0}
-                      {forms[25] == 'MONEY' ? '元' : '%'}
+                      -{forms['absence_sign_in_fee'] ? forms['absence_sign_in_fee'] : 0}
+                      {forms['absence_sign_in_fee_type'] == 'MONEY' ? '元' : '%'}
                     </span>
                   </p>
                 </div>
@@ -156,7 +183,8 @@ export default defineComponent({
                   <p>
                     扣除训练补助:
                     <span>
-                      -{forms[26] ? forms[26] : 0} {forms[27] == 'MONEY' ? '元' : '%'}
+                      -{forms['not_sign_in_fee'] ? forms['not_sign_in_fee'] : 0}{' '}
+                      {forms['not_sign_in_fee_type'] == 'MONEY' ? '元' : '%'}
                     </span>
                   </p>
                 </div>
@@ -194,26 +222,34 @@ export default defineComponent({
                 <div class={styles.textWrap}>
                   <h4>正常签退:</h4>
                   <p>
-                    课程<span>结束后</span>至课程<span>结束后{forms[28] ? forms[28] : 0}分钟</span>
+                    课程<span>结束后</span>至课程
+                    <span>结束后{forms['normal_sign_out'] ? forms['normal_sign_out'] : 0}分钟</span>
                     签退 <br />
-                    GPS定位点在教学点<span>{forms[10] ? forms[10] : 0}米内</span>
+                    GPS定位点在教学点
+                    <span>
+                      {forms['scope_of_attendance'] ? forms['scope_of_attendance'] : 0}米内
+                    </span>
                   </p>
-                  <p>时间段:13:00:00 ~ {addFormMinute('13:00:00', forms[28])}</p>
+                  <p>时间段:13:00:00 ~ {addFormMinute('13:00:00', forms['normal_sign_out'])}</p>
                 </div>
                 <div class={styles.textWrap}>
                   <h4>早退:</h4>
                   <p>
-                    课程<span>结束前{forms[32] ? forms[32] : 0}分钟</span>内签退
+                    课程
+                    <span>
+                      结束前{forms['premise_sign_out'] ? forms['premise_sign_out'] : 0}分钟
+                    </span>
+                    内签退
                   </p>
                   <p>
-                    时间段:{reduceFormMinute('13:00:00', forms[32])}前签退(含
-                    {reduceFormMinute('13:00:00', forms[32])}){' '}
+                    时间段:{reduceFormMinute('13:00:00', forms['premise_sign_out'])}前签退(含
+                    {reduceFormMinute('13:00:00', forms['premise_sign_out'])}){' '}
                   </p>
                   <p>
                     扣除训练补助:
                     <span>
-                      -{forms[33] ? forms[33] : 0}
-                      {forms[34] == 'MONEY' ? '元' : '%'}
+                      -{forms['premise_sign_out_fee'] ? forms['premise_sign_out_fee'] : 0}
+                      {forms['premise_sign_out_fee_type'] == 'MONEY' ? '元' : '%'}
                     </span>
                   </p>
                 </div>
@@ -221,14 +257,25 @@ export default defineComponent({
                 <div class={styles.textWrap}>
                   <h4>异常签退:</h4>
                   <p>
-                    课程<span>结束前{forms[29] ? forms[29] : 0}分钟</span>至<span>课程结束前</span>
-                    <br /> 或GPS定位点在教学点<span> {forms[10] ? forms[10] : 0}米内</span>
+                    课程
+                    <span>
+                      结束前{forms['abnormal_sign_out'] ? forms['abnormal_sign_out'] : 0}分钟
+                    </span>
+                    至<span>课程结束前</span>
+                    <br /> 或GPS定位点在教学点
+                    <span>
+                      {' '}
+                      {forms['scope_of_attendance'] ? forms['scope_of_attendance'] : 0}米内
+                    </span>
+                  </p>
+                  <p>
+                    时间段:{reduceFormMinute('13:00:00', forms['abnormal_sign_out'])} ~ 12:59:59
                   </p>
-                  <p>时间段:{reduceFormMinute('13:00:00', forms[29])} ~ 12:59:59</p>
                   <p>
                     扣除训练补助:
                     <span>
-                      -{forms[30] ? forms[30] : 0} {forms[31] == 'MONEY' ? '元' : '%'}
+                      -{forms['abnormal_sign_out_fee'] ? forms['abnormal_sign_out_fee'] : 0}{' '}
+                      {forms['abnormal_sign_out_fee_type'] == 'MONEY' ? '元' : '%'}
                     </span>
                   </p>
                 </div>
@@ -239,8 +286,8 @@ export default defineComponent({
                   <p>
                     扣除训练补助:
                     <span>
-                      -{forms[45] ? forms[45] : 0}
-                      {forms[38] == 'MONEY' ? '元' : '%'}
+                      -{forms['not_sign_out_fee'] ? forms['not_sign_out_fee'] : 0}
+                      {forms['not_sign_out_fee_type'] == 'MONEY' ? '元' : '%'}
                     </span>
                   </p>
                 </div>
@@ -266,30 +313,32 @@ export default defineComponent({
                   <p>
                     <span>
                       若签到时间在正常范围内
-                      <br /> 但同时GPS定位在教学点{forms[10] ? forms[10] : 0}
+                      <br /> 但同时GPS定位在教学点
+                      {forms['scope_of_attendance'] ? forms['scope_of_attendance'] : 0}
                       米外
                     </span>
                   </p>
                   <p>
                     扣除训练补助:
                     <span>
-                      - {forms[11] ? forms[11] : 0}
-                      {forms[12] == 'MONEY' ? '元' : '%'}
+                      - {forms['sign_in_attendance'] ? forms['sign_in_attendance'] : 0}
+                      {forms['sign_in_attendance_type'] == 'MONEY' ? '元' : '%'}
                     </span>
                   </p>
                 </div>
                 <div class={styles.textWrap}>
                   <p>
                     <span>
-                      若签退时间在正常范围内 <br /> 但同时GPS定位在教学点{forms[10] ? forms[10] : 0}
+                      若签退时间在正常范围内 <br /> 但同时GPS定位在教学点
+                      {forms['scope_of_attendance'] ? forms['scope_of_attendance'] : 0}
                       米外
                     </span>
                   </p>
                   <p>
                     扣除训练补助:
                     <span>
-                      - {forms[13] ? forms[13] : 0}
-                      {forms[14] == 'MONEY' ? '元' : '%'}
+                      - {forms['sign_out_attendance'] ? forms['sign_out_attendance'] : 0}
+                      {forms['sign_out_attendance_type'] == 'MONEY' ? '元' : '%'}
                     </span>
                   </p>
                 </div>

+ 139 - 3
src/views/exercise-record/index.module.less

@@ -20,10 +20,146 @@
   }
 }
 
-.recordSearch {
+// .recordSearch {
+//   :global {
+//     .van-search {
+//       padding-bottom: 0;
+//     }
+//   }
+// }
+
+.exerciseRecord {
+  :global {
+    .van-haptics-feedback:active {
+      opacity: 1;
+    }
+  }
+}
+
+.searchMore {
+  line-height: 1.2 !important;
   :global {
-    .van-search {
-      padding-bottom: 0;
+    .van-dropdown-item {
+      z-index: 99;
+    }
+    .van-dropdown-menu__bar {
+      box-shadow: none;
+      height: var(--van-nav-bar-height);
+    }
+    .van-dropdown-item__content {
+      border-radius: 0 0 12px 12px;
+      // padding-bottom: calc(var(--van-button-large-height) + 52px);
+      max-height: 100%;
+    }
+    .van-button + .van-button {
+      margin-left: 15px;
+    }
+  }
+  .searchContainer {
+    max-height: 400px;
+    overflow-y: auto;
+    box-sizing: border-box;
+    padding-bottom: 16px;
+    background: var(--van-popup-background);
+    transition: var(--van-popup-transition);
+  }
+
+  .searchMoreGroup {
+    display: flex;
+    align-items: center;
+    padding: 18px 13px;
+    background-color: #fff;
+  }
+
+  .searchTitle {
+    padding: 15px 13px 2px;
+    font-size: 15px;
+    font-weight: 600;
+    color: #333333;
+    line-height: 21px;
+    text-align: left;
+  }
+
+  .searchTypeGroup {
+    display: flex;
+    align-items: center;
+    padding: 0 13px;
+    flex-wrap: wrap;
+    justify-content: space-between;
+  }
+  .searchTypeFlex {
+    .searchTypeItem {
+      width: 49%;
+    }
+  }
+  .searchTypeFlex1 {
+    justify-content: flex-start;
+    .searchTypeItem {
+      width: 31%;
+
+      &:nth-child(3n + 1) {
+        margin-right: 2.333%;
+      }
+      &:nth-child(3n + 3) {
+        margin-left: 2.333%;
+      }
+    }
+  }
+  .searchTypeFlex2 {
+    .searchTypeItem {
+      width: 45%;
+    }
+  }
+  .searchTypeItemLine {
+    margin-top: 10px;
+    width: 16px;
+    height: 1px;
+    background: #d8d8d8;
+  }
+  .searchTypeItem {
+    box-sizing: border-box;
+    margin-top: 10px;
+    height: 32px;
+    line-height: 32px;
+    background: #f6f6f6;
+    border: 1px solid #f6f6f6;
+    border-radius: 16px;
+    font-size: 13px;
+    color: #333333;
+    padding: 0 7px;
+    text-align: center;
+
+    &.is-active {
+      background: #fff5f2;
+      border: 1px solid #ffb097;
+      color: #f67146;
+    }
+  }
+}
+
+.searchPreview {
+  margin: 0 13px;
+  padding-bottom: 12px;
+  white-space: nowrap;
+  overflow-y: auto;
+  .searchPreviewItem {
+    display: inline-flex;
+    align-items: center;
+    line-height: 28px;
+    background: #f6f6f6;
+    border-radius: 16px;
+    margin-right: 8px;
+    padding: 1px 10px 0;
+    font-size: 13px;
+    color: #333333;
+    &:last-child {
+      margin-right: 0;
+    }
+
+    .cross {
+      font-size: 8px;
+      margin-left: 6px;
+      color: #aaaaaa;
     }
   }
 }

+ 239 - 144
src/views/exercise-record/index.tsx

@@ -3,6 +3,8 @@ import OSearch from '@/components/o-search'
 import OSticky from '@/components/o-sticky'
 import OEmpty from '@/components/o-empty'
 import dayjs from 'dayjs'
+import isBetween from 'dayjs/plugin/isBetween'
+dayjs.extend(isBetween)
 import {
   Cell,
   Icon,
@@ -15,10 +17,13 @@ import {
   PullRefresh,
   ActionSheet,
   showToast,
-  Picker
+  Picker,
+  DropdownMenu,
+  DropdownItem,
+  Button,
+  Calendar
 } from 'vant'
 import OFullRefresh from '@/components/o-full-refresh'
-
 import StudentItem from './modals/student-item'
 import { defineComponent, reactive, ref, onMounted } from 'vue'
 import { state as globalState } from '@/state'
@@ -33,42 +38,24 @@ export default defineComponent({
     const platformApi = ref(globalState.platformApi)
     const router = useRouter()
     const state = reactive({
+      showSearchStatus: true,
       showPopoverTime: false,
-      showPopoverOrchestra: false,
-      showPopoverSubject: false,
-      showPopoverSort: false,
       actions: [] as any,
-      subjects: [] as any,
-      actionSorts: [
-        {
-          name: '按天数',
-          value: 'PRACTICE_DAY',
-          selected: true
-        },
-        {
-          name: '按时长',
-          value: 'PRACTICE_TIMES'
-        }
-        //   color: forms.sortType == 'PRACTICE_DAY' ? '#FF8057' : '#333'
-      ],
-      currentDate: [dayjs().format('YYYY'), dayjs().format('MM')]
+      subjects: [] as any
     })
     const forms = reactive({
-      practiceMonth: state.currentDate[0] + '' + state.currentDate[1],
-      practiceMonthName: state.currentDate[0] + '年' + state.currentDate[1] + '月',
+      startTime: dayjs().day(1).format('YYYY-MM-DD'),
+      endTime: dayjs().day(7).format('YYYY-MM-DD'),
       orchestraId: '',
-      orchestraName: '全部乐团',
+      orchestraName: '',
       subjectId: '',
-      subjectName: '全部声部',
-      sortType: 'PRACTICE_DAY',
-      sortTypeName: '按天数',
+      subjectName: '',
+      sortType: '',
+      sortTypeName: '',
       keyword: '',
       page: 1,
       rows: 20
     })
-    const minDate = ref(new Date(dayjs().subtract(10, 'year').format('YYYY-MM-DD')))
-    const maxDate = ref(new Date(dayjs().add(10, 'year').format('YYYY-MM-DD')))
-    const columnsType = ref<DatePickerColumnType[]>(['year', 'month'])
     const refreshing = ref(false)
     const loading = ref(false)
     const finished = ref(false)
@@ -82,9 +69,12 @@ export default defineComponent({
           list.value = []
           refreshing.value = false
         }
-        const res = await request.post(`${platformApi.value}/student/page`, {
-          data: { ...forms }
-        })
+        const res = await request.post(
+          `${platformApi.value}/musicPracticeRecord/school/studentPracticeThisWeek`,
+          {
+            data: { ...forms }
+          }
+        )
 
         if (list.value.length > 0 && res.data.pages === 1) {
           return
@@ -118,37 +108,16 @@ export default defineComponent({
     const checkSort = (val: any) => {
       forms.sortType = val.value
       forms.sortTypeName = val.name
-      state.actionSorts.forEach((child: any) => {
-        child.selected = false
-      })
-      val.selected = true
-      state.showPopoverSort = false
-      refreshing.value = true
-      getList()
-    }
-    const checkTimer = (val: any) => {
-      forms.practiceMonth = val.selectedValues[0] + val.selectedValues[1]
-      forms.practiceMonthName = val.selectedValues[0] + '年' + val.selectedValues[1] + '月'
-      state.showPopoverTime = false
-      refreshing.value = true
-      getList()
     }
+
     const checkOrchestra = (val: any) => {
-      const selectedOptions = val.selectedOptions[0] || {}
-      forms.orchestraId = selectedOptions.value
-      forms.orchestraName = selectedOptions.name
-      state.showPopoverOrchestra = false
-      refreshing.value = true
-      getList()
+      forms.orchestraId = val.value
+      forms.orchestraName = val.name
     }
 
     const checkSubject = (val: any) => {
-      const selectedOptions = val.selectedOptions[0] || {}
-      forms.subjectId = selectedOptions.value
-      forms.subjectName = selectedOptions.name
-      state.showPopoverSubject = false
-      refreshing.value = true
-      getList()
+      forms.subjectId = val.value
+      forms.subjectName = val.name
     }
     const getOrchestraList = async () => {
       try {
@@ -161,7 +130,6 @@ export default defineComponent({
             value: item.id as string
           }
         })
-        state.actions.unshift({ name: '全部乐团', value: '' })
       } catch (e: any) {
         const message = e.message
         showToast(message)
@@ -179,7 +147,6 @@ export default defineComponent({
             value: item.subjectId as string
           }
         })
-        state.subjects.unshift({ name: '全部声部', value: '' })
       } catch (e: any) {
         const message = e.message
         showToast(message)
@@ -193,11 +160,149 @@ export default defineComponent({
       getList()
     }
 
+    // 名称
+    const formatLength = (name: string) => {
+      if (name.length > 9) {
+        const fristName = name.substring(0, 6)
+        const lastName = name.substring(name.length - 6, name.length - 1)
+        return fristName + '...' + lastName
+      } else {
+        return name
+      }
+    }
+
+    const dropdownMenuRef = ref()
+    const dropdownItemRef = ref()
+    // 重置
+    const onSearchReset = () => {
+      forms.startTime = dayjs().day(1).format('YYYY-MM-DD')
+      forms.endTime = dayjs().day(7).format('YYYY-MM-DD')
+      forms.orchestraId = ''
+      forms.orchestraName = ''
+      forms.subjectId = ''
+      forms.subjectName = ''
+      forms.sortType = ''
+      forms.sortTypeName = ''
+      state.showSearchStatus = false
+      refreshing.value = true
+      getList()
+    }
+
+    // 搜索
+    const onSearchConfirm = () => {
+      dropdownItemRef.value?.toggle()
+      refreshing.value = true
+      getList()
+    }
+
     return () => (
-      <div class={!showContact.value && 'emptyRootContainer'}>
+      <div class={[!showContact.value ? 'emptyRootContainer' : '', styles.exerciseRecord]}>
         <OSticky position="top" background="#F8F8F8">
-          <div>
-            {/* <OHeader onHeaderBack={onBack}></OHeader> */}
+          <OHeader border={false}>
+            {{
+              right: () => (
+                <DropdownMenu
+                  class={styles.searchMore}
+                  closeOnClickOverlay={false}
+                  closeOnClickOutside={false}
+                  ref={dropdownMenuRef}
+                >
+                  <DropdownItem title="筛选" v-model={state.showSearchStatus} ref={dropdownItemRef}>
+                    <div class={styles.searchContainer}>
+                      {state.actions.length > 0 && (
+                        <>
+                          <div class={styles.searchTitle}>乐团</div>
+                          <div class={[styles.searchTypeGroup, styles.searchTypeFlex]}>
+                            {state.actions.map((item: any) => (
+                              <div
+                                class={[
+                                  styles.searchTypeItem,
+                                  item.value === forms.orchestraId && styles['is-active']
+                                ]}
+                                onClick={() => checkOrchestra(item)}
+                              >
+                                {formatLength(item.name)}
+                              </div>
+                            ))}
+                          </div>
+                        </>
+                      )}
+
+                      <div class={styles.searchTitle}>时间段</div>
+                      <div class={[styles.searchTypeGroup, styles.searchTypeFlex2]}>
+                        <div
+                          class={styles.searchTypeItem}
+                          onClick={() => (state.showPopoverTime = true)}
+                        >
+                          {forms.startTime}
+                        </div>
+                        <div
+                          class={styles.searchTypeItemLine}
+                          onClick={() => (state.showPopoverTime = true)}
+                        ></div>
+                        <div
+                          class={styles.searchTypeItem}
+                          onClick={() => (state.showPopoverTime = true)}
+                        >
+                          {forms.endTime}
+                        </div>
+                      </div>
+                      <div class={styles.searchTitle}>声部</div>
+                      <div class={[styles.searchTypeGroup, styles.searchTypeFlex1]}>
+                        {state.subjects.map((subject: any) => (
+                          <div
+                            class={[
+                              styles.searchTypeItem,
+                              subject.value === forms.subjectId && styles['is-active']
+                            ]}
+                            onClick={() => checkSubject(subject)}
+                          >
+                            {subject.name}
+                          </div>
+                        ))}
+                      </div>
+                      <div class={styles.searchTitle}>排序方式</div>
+                      <div class={[styles.searchTypeGroup, styles.searchTypeFlex]}>
+                        {[
+                          {
+                            name: '按时长',
+                            value: 'PRACTICE_TIMES'
+                          },
+                          {
+                            name: '按天数',
+                            value: 'PRACTICE_DAY'
+                          }
+                        ].map((item: any) => (
+                          <div
+                            class={[
+                              styles.searchTypeItem,
+                              forms.sortType === item.value && styles['is-active']
+                            ]}
+                            onClick={() => checkSort(item)}
+                          >
+                            {item.name}
+                          </div>
+                        ))}
+                      </div>
+                    </div>
+                    <div class={[styles.searchMoreGroup, 'van-hairline--top']}>
+                      <Button type="default" block round size="large" onClick={onSearchReset}>
+                        重置
+                      </Button>
+                      <Button type="primary" block round size="large" onClick={onSearchConfirm}>
+                        查询
+                      </Button>
+                    </div>
+                  </DropdownItem>
+                </DropdownMenu>
+              )
+            }}
+          </OHeader>
+          <div
+            style={{
+              backgroundColor: '#fff'
+            }}
+          >
             <OSearch
               placeholder="请输入学员姓名"
               class={styles.recordSearch}
@@ -207,43 +312,65 @@ export default defineComponent({
                 getList()
               }}
             ></OSearch>
-            <div class={'searchGroup'}>
-              <div
-                class={['searchItem', state.showPopoverTime ? 'searchItem-active' : '']}
-                onClick={() => {
-                  state.showPopoverTime = true
-                }}
-              >
-                <span>{forms.practiceMonthName}</span>
-                <i class="arrow"></i>
-              </div>
-              <div
-                class={['searchItem', state.showPopoverOrchestra ? 'searchItem-active' : '']}
-                onClick={() => {
-                  state.showPopoverOrchestra = true
-                }}
-              >
-                <span>{forms.orchestraName}</span>
-                <i class="arrow"></i>
-              </div>
-              <div
-                class={['searchItem', state.showPopoverSubject ? 'searchItem-active' : '']}
-                onClick={() => {
-                  state.showPopoverSubject = true
-                }}
-              >
-                <span>{forms.subjectName}</span>
-                <i class="arrow"></i>
-              </div>
+            <div class={styles.searchPreview}>
               <div
-                class={['searchItem', state.showPopoverSort ? 'searchItem-active' : '']}
+                class={styles.searchPreviewItem}
                 onClick={() => {
-                  state.showPopoverSort = true
+                  // console.log(dropdownItemRef.value, dropdownMenuRef.value)
+                  // dropdownItemRef.value?.toggle()
+                  // dropdownMenuRef.value?.click()
                 }}
               >
-                <span>{forms.sortTypeName}</span>
-                <i class="arrow"></i>
+                {forms.startTime}~{forms.endTime}
               </div>
+              {forms.orchestraId && (
+                <div class={styles.searchPreviewItem}>
+                  {formatLength(forms.orchestraName)}
+                  <Icon
+                    name="cross"
+                    class={styles.cross}
+                    onClick={(e: any) => {
+                      forms.orchestraId = ''
+                      forms.orchestraName = ''
+                      e.stopPropagation()
+                      refreshing.value = true
+                      getList()
+                    }}
+                  />
+                </div>
+              )}
+              {forms.subjectId && (
+                <div class={styles.searchPreviewItem}>
+                  {forms.subjectName}
+                  <Icon
+                    name="cross"
+                    class={styles.cross}
+                    onClick={(e: any) => {
+                      forms.subjectId = ''
+                      forms.subjectName = ''
+                      e.stopPropagation()
+                      refreshing.value = true
+                      getList()
+                    }}
+                  />
+                </div>
+              )}
+              {forms.sortType && (
+                <div class={styles.searchPreviewItem}>
+                  {forms.sortTypeName}
+                  <Icon
+                    name="cross"
+                    class={styles.cross}
+                    onClick={(e: any) => {
+                      forms.sortType = ''
+                      forms.sortTypeName = ''
+                      e.stopPropagation()
+                      refreshing.value = true
+                      getList()
+                    }}
+                  />
+                </div>
+              )}
             </div>
           </div>
         </OSticky>
@@ -272,58 +399,26 @@ export default defineComponent({
           <OEmpty tips="暂无练习记录" />
         )}
 
-        <Popup
+        <Calendar
           v-model:show={state.showPopoverTime}
-          position="bottom"
-          round
-          class={'popupBottomSearch'}
-        >
-          <DatePicker
-            onCancel={() => {
-              state.showPopoverTime = false
-            }}
-            onConfirm={checkTimer}
-            v-model={state.currentDate}
-            minDate={minDate.value}
-            formatter={formatterDatePicker}
-            maxDate={maxDate.value}
-            columnsType={columnsType.value}
-          />
-        </Popup>
-
-        <OActionSheet
-          v-model:show={state.showPopoverSort}
-          actions={state.actionSorts}
-          onSelect={checkSort}
+          firstDayOfWeek={1}
+          showConfirm={false}
+          type="range"
+          maxRange={7}
+          minDate={new Date('2023-02-27')}
+          defaultDate={[dayjs(forms.startTime).toDate(), dayjs(forms.endTime).toDate()]}
+          style={{
+            height: '70%'
+          }}
+          onSelect={(item: any) => {
+            forms.startTime = ''
+            forms.endTime = ''
+            if (!dayjs(item[0]).isBetween(dayjs(forms.startTime), dayjs(forms.endTime))) {
+              forms.startTime = dayjs(item[0]).day(1).format('YYYY-MM-DD')
+              forms.endTime = dayjs(item[0]).day(7).format('YYYY-MM-DD')
+            }
+          }}
         />
-
-        <Popup
-          v-model:show={state.showPopoverOrchestra}
-          position="bottom"
-          round
-          class={'popupBottomSearch'}
-        >
-          <Picker
-            columns={state.actions}
-            onCancel={() => (state.showPopoverOrchestra = false)}
-            onConfirm={(val: any) => checkOrchestra(val)}
-            columnsFieldNames={{ text: 'name', value: 'value' }}
-          />
-        </Popup>
-
-        <Popup
-          v-model:show={state.showPopoverSubject}
-          position="bottom"
-          round
-          class={'popupBottomSearch'}
-        >
-          <Picker
-            columns={state.subjects}
-            onCancel={() => (state.showPopoverSubject = false)}
-            onConfirm={(val: any) => checkSubject(val)}
-            columnsFieldNames={{ text: 'name', value: 'value' }}
-          />
-        </Popup>
       </div>
     )
   }