Bläddra i källkod

管理端待办事项和补助详情

skyblued 2 år sedan
förälder
incheckning
3d76e5bb09

+ 102 - 49
src/school/approval-manage/agency/index.tsx

@@ -7,69 +7,122 @@ import iconPhoto from '../images/icon-photo.png'
 import request from '@/helpers/request'
 import { state } from '@/state'
 
+interface ISalaryRecord {
+  /**学校补助确认记录ID */
+  id: string
+  /**练习补助 */
+  trainingSalary: number | string
+  /**课程训练补助 */
+  courseSalary: number | string
+  /**一周开始日期 */
+  startDate: string
+  /**一周结束日期 */
+  endDate: string
+  /**已发练习补助 */
+  issueTrainingSalary: number | string
+  /**结算状态 */
+  withdrawalStatus: 'WAIT' | 'SETTLED' | 'PART_SETTLED' | 'SETTLE_FAIL'
+  /**管理补助 */
+  manageSalary: number | string
+  /**已发课程训练补助 */
+  issueCourseSalary: number | string
+  /**已发管理补助 */
+  issueManageSalary: number | string
+}
+
 export default defineComponent({
   name: 'approval-manage-agency',
   setup() {
     const data = reactive({
-
+      salaryRecordList: [{}] as ISalaryRecord[],
+      /**训练照片 */
+      schoolWeekPhoto: {
+        /**预计的训练照片数 */
+        expectPhotoNum: 0,
+        /**结束日期 */
+        endDate: '',
+        /**开始日期 */
+        startDate: '',
+        /**训练照片数 */
+        photoNum: 0
+      },
+      /**乐团资讯 */
+      schoolWeekNews: {
+        //
+        /**乐团资讯数 */
+        newsNum: 0,
+        /**结束日期 */
+        endDate: '',
+        /**开始日期 */
+        startDate: '',
+        /**预计的乐团资讯数 */
+        expectNewsNum: 0
+      }
     })
     const getData = async () => {
-        try {
-            const res: any = await request.post(`${state.platformApi}/schoolWeekSalaryRecord/manage`)
-        } catch (error) {
-            
-        }
+      try {
+        const res: any = await request.post(`${state.platformApi}/schoolWeekSalaryRecord/manage`)
+      } catch (error) {}
     }
     onMounted(() => {
-        getData()
+      getData()
     })
     return () => (
       <div>
-        <div class={styles.item}>
-          <Cell center label="2023-1-16 至 2023-1-2" isLink to={'/approval-manage-subsidy'}>
-            {{
-              title: () => (
-                <div class={styles.itemTitle}>
-                  <img class={styles.titleIcon} src={iconSubsidy} />
-                  <span>补助确认</span>
-                </div>
-              )
-            }}
-          </Cell>
-          <Grid class={styles.grid} columnNum={3} border={false}>
-            <GridItem>
-              <div class={styles.gridItem}>
-                <div class={styles.gridItemTop}>
-                  <span class={styles.topNum}>240</span>元
-                </div>
-                <div>管理补助</div>
-              </div>
-            </GridItem>
-            <GridItem>
-              <div class={styles.gridItem}>
-                <div class={styles.gridItemTop}>
-                  <span class={styles.topNum}>240</span>元
-                </div>
-                <div>管理补助</div>
-              </div>
-            </GridItem>
-            <GridItem>
-              <div class={styles.gridItem}>
-                <div class={styles.gridItemTop}>
-                  <span class={styles.topNum}>240</span>元
-                </div>
-                <div>管理补助</div>
-              </div>
-            </GridItem>
-          </Grid>
-        </div>
+        {data.salaryRecordList.map((item: ISalaryRecord) => {
+          return (
+            <div class={styles.item}>
+              <Cell
+                center
+                label={`${item.startDate} 至 ${item.endDate}`}
+                isLink
+                to={'/approval-manage-subsidy?salaryId=' + (item.id || '')}
+              >
+                {{
+                  title: () => (
+                    <div class={styles.itemTitle}>
+                      <img class={styles.titleIcon} src={iconSubsidy} />
+                      <span>补助确认</span>
+                    </div>
+                  )
+                }}
+              </Cell>
+              <Grid class={styles.grid} columnNum={3} border={false}>
+                <GridItem>
+                  <div class={styles.gridItem}>
+                    <div class={styles.gridItemTop}>
+                      <span class={styles.topNum}>{item.manageSalary}</span>元
+                    </div>
+                    <div>管理补助</div>
+                  </div>
+                </GridItem>
+                <GridItem>
+                  <div class={styles.gridItem}>
+                    <div class={styles.gridItemTop}>
+                      <span class={styles.topNum}>{item.courseSalary}</span>元
+                    </div>
+                    <div>训练补助</div>
+                  </div>
+                </GridItem>
+                <GridItem>
+                  <div class={styles.gridItem}>
+                    <div class={styles.gridItemTop}>
+                      <span class={styles.topNum}>{item.trainingSalary}</span>元
+                    </div>
+                    <div>练习奖励</div>
+                  </div>
+                </GridItem>
+              </Grid>
+            </div>
+          )
+        })}
 
         <div class={styles.item}>
           <Cell
             style={{ '--van-cell-value-color': '#333' }}
             center
-            label="2023-1-16 至 2023-1-2"
-            value="1/6"
+            label={`${data.schoolWeekPhoto.startDate} 至 ${data.schoolWeekPhoto.endDate}`}
+            value={data.schoolWeekPhoto.photoNum + '/' + data.schoolWeekPhoto.expectPhotoNum}
             isLink
           >
             {{
@@ -86,8 +139,8 @@ export default defineComponent({
           <Cell
             style={{ '--van-cell-value-color': '#333' }}
             center
-            label="2023-1-16 至 2023-1-2"
-            value="1/6"
+            label={`${data.schoolWeekNews.startDate} 至 ${data.schoolWeekNews.endDate}`}
+            value={data.schoolWeekNews.newsNum + '/' + data.schoolWeekNews.expectNewsNum}
             isLink
           >
             {{

+ 34 - 3
src/school/approval-manage/index.module.less

@@ -20,7 +20,22 @@
     }
   }
 }
-
+.rightTip {
+  :global {
+    .van-nav-bar__right {
+      background: rgba(239, 135, 97, 1);
+      color: #fff;
+      border-radius: 50%;
+      width: 22px;
+      height: 22px;
+      padding: 0;
+      justify-content: center;
+      top: 50%;
+      right: 13px;
+      transform: translateY(-50%);
+    }
+  }
+}
 .item {
   border-radius: 10px;
   margin: 12px 13px;
@@ -85,6 +100,22 @@
     }
   }
 }
+.tipItem {
+  margin: 0;
+  :global{
+    .van-cell{
+      padding: 25px 25px 20px 25px;
+    }
+  }
+}
+.tipContent {
+  font-size: 15px;
+  font-family: PingFangSC-Regular, PingFang SC;
+  font-weight: 400;
+  color: #333;
+  line-height: 22px;
+  padding: 0 25px 25px 25px;
+}
 .listItem {
   padding-top: 4px;
   padding-bottom: 4px;
@@ -185,10 +216,10 @@
       font-weight: bold;
     }
   }
-  .startTime{
+  .startTime {
     margin-right: 5px;
   }
-  .endTime{
+  .endTime {
     margin-left: 5px;
   }
 }

+ 27 - 15
src/school/approval-manage/subsidy/details.tsx

@@ -1,57 +1,69 @@
 import { Cell, Grid, GridItem } from 'vant'
-import { defineComponent } from 'vue'
+import { defineComponent, PropType } from 'vue'
 import styles from '../index.module.less'
 import iconA from '../images/icon-photo.png'
 import iconTime from '../images/icon-time.png'
 import iconPrimary from '../images/icon-primary.png'
 import iconError from '../images/icon-error.png'
+import {courseEmnu} from '@/constant'
 
 export default defineComponent({
   name: 'subsidy-detail',
-  setup() {
+  props: {
+    item: {
+      type: Object as PropType<ICourseSalaryRecordDetailItem>,
+      default() {
+        return {
+            courseScheduleTeacherAttendanceList: [{}]
+        }
+      }
+    }
+  },
+  setup(props) {
+    console.log("🚀 ~ props", props)
     return () => (
       <div>
         <div class={[styles.item, styles.listItem]}>
-          <Cell border={false} center class={styles.listItem} title="补助标准" value={'240元/天'} />
+          <Cell border={false} center class={styles.listItem} title="补助标准" value={`${props.item.standardSalary}元/天`} />
           <Cell
             border={false}
             center
             class={styles.listItem}
             title="补助课程"
-            value={'长笛单技课'}
+            value={courseEmnu[props.item.courseType]}
           />
           <Cell
             border={false}
             center
             class={styles.listItem}
             title="课件使用未达标"
-            value={'-240.00元'}
+            value={`-${props.item.reduceSalary}元`}
           />
-          <Cell border={false} center class={styles.listItem} title="早退" value={'-50.00元'} />
+          <Cell border={false} center class={styles.listItem} title="早退" value={`-0.00元`} />
           <Cell
             border={false}
             center
             class={styles.listItem}
             title="实际补助金额"
-            value={'190.00元'}
+            value={`${props.item.actualSalary}元`}
           />
         </div>
 
-        {[1, 2, 3].map((item: any) => (
+        {props.item.courseScheduleTeacherAttendanceList.map((item: ICourseScheduleTeacherAttendance) => (
           <div class={styles.item}>
             <Cell center>
               {{
                 title: () => (
                   <div class={styles.itemTitle}>
                     <img class={styles.titleIcon} src={iconTime} />
-                    <span>2023-1-17 14:00~15:3</span>
+                    <span>{item.startTime} - {item.endTime}</span>
                   </div>
                 )
               }}
             </Cell>
             <div class={styles.itemContent}>
               <div class={styles.itemContentTitle}>
-                <span>长笛单技课-张老师</span>
+                <span>{item.classGroupName}-{item.teacherName}</span>
                 <span
                   class={styles.itemContentTitleDetail}
                   style={{ color: 1 ? '#358AF5' : '#F44541' }}
@@ -59,21 +71,21 @@ export default defineComponent({
                   课件使用:15/20分钟
                 </span>
               </div>
-              <div class={styles.itemContentLabel}>武汉市洪山区第二小学2022标准团</div>
+              <div class={styles.itemContentLabel}>{item.orchestraName}</div>
               <div class={styles.times}>
                 <div class={[styles.timesItem, styles.startTime]}>
                   <div class={styles.startTimeTop}>
                     <span>签到时间</span>
-                    <img src={iconPrimary} />
+                    <img src={item.signInStatus === 'NORMAL' ? iconPrimary : iconError} />
                   </div>
-                  <div class={styles.startTimeBottom}>14:08:25</div>
+                  <div class={styles.startTimeBottom}>{item.signInTime}</div>
                 </div>
                 <div class={[styles.timesItem, styles.endTime]}>
                   <div class={styles.startTimeTop}>
                     <span>签退时间</span>
-                    <img src={iconError} />
+                    <img src={item.signOutStatus === 'NORMAL' ?iconPrimary : iconError} />
                   </div>
-                  <div class={styles.startTimeBottom}>15:35:25</div>
+                  <div class={styles.startTimeBottom}>{item.signOutTime}</div>
                 </div>
               </div>
             </div>

+ 127 - 51
src/school/approval-manage/subsidy/exercise-detail.tsx

@@ -1,74 +1,150 @@
-import { Cell, Grid, GridItem } from 'vant'
-import { defineComponent } from 'vue'
+import { Cell, Grid, GridItem, NavBar, Popup, Sticky } from 'vant'
+import { defineComponent, onMounted, reactive, ref } from 'vue'
 import styles from '../index.module.less'
 import iconA from '../images/icon-photo.png'
+import { useRoute } from 'vue-router'
+import request from '@/helpers/request'
+import { state } from '@/state'
+import OFullRefresh from '@/components/o-full-refresh'
+import Details from './details'
+import OHeader from '@/components/o-header'
 
 export default defineComponent({
   name: 'subsidy-exercise-detail',
   setup() {
+    const route = useRoute()
+    const refreshing = ref(false)
+    const modelData = reactive({
+      show: false,
+      row: {} as ICourseSalaryRecordDetailItem
+    })
+    const data = reactive({
+      /**补助明细 */
+      record: {
+        courseSalaryRecordDetailList: [{}] as ICourseSalaryRecordDetailItem[]
+      } as ICourseSalaryRecordDetail
+    })
+    const getData = () => {
+      request
+        .post(`${state.platformApi}/schoolWeekSalaryRecord/detailInfo/course`, {
+          data: {
+            id: route.query.id,
+            userId: state.user.data.id
+          }
+        })
+        .then((res: any) => {
+          data.record = res?.data || {}
+        })
+        .finally(() => {
+          refreshing.value = false
+        })
+    }
+    onMounted(() => {
+      getData()
+    })
     return () => (
       <div>
-        <div class={styles.item}>
-          <Cell center class={styles.rewardItem}>
-            {{
-              icon: <img class={styles.itemPicture} src={iconA} />,
-              title: () => (
-                <div class={styles.itemTitle}>
-                  <span>邓同学</span>
-                </div>
-              ),
-              value: () => (
-                <div class={styles.gridItem}>
-                  <div class={styles.gridItemTop}>
-                    <span class={styles.topNum}>40</span>元
-                  </div>
-                  <div class={styles.valeLabel}>实际补助</div>
-                </div>
-              )
-            }}
-          </Cell>
-        </div>
-
-        {[1, 2, 3].map((item: any) => (
+        <OFullRefresh
+          v-model:modelValue={refreshing.value}
+          onRefresh={getData}
+          style="min-height: 100vh"
+        >
           <div class={styles.item}>
-            <Cell center value="1天" isLink to={'/subsidy-details'}>
+            <Cell center class={styles.rewardItem}>
               {{
+                icon: () => <img class={styles.itemPicture} src={iconA} />,
                 title: () => (
                   <div class={styles.itemTitle}>
-                    <div class={styles.titleLine}></div>
-                    <span>长笛单技训练</span>
+                    <span>邓同学</span>
+                  </div>
+                ),
+                value: () => (
+                  <div class={styles.gridItem}>
+                    <div class={styles.gridItemTop}>
+                      <span class={styles.topNum}>{data.record.actualSalary}</span>元
+                    </div>
+                    <div class={styles.valeLabel}>实际补助</div>
                   </div>
                 )
               }}
             </Cell>
-            <Grid class={styles.grid} columnNum={3} border={false}>
-              <GridItem>
-                <div class={styles.gridItem}>
-                  <div class={styles.gridItemTop}>
-                    <span class={styles.topNum}>240</span>元
+          </div>
+
+          {data.record.courseSalaryRecordDetailList.map((item: ICourseSalaryRecordDetailItem) => (
+            <div class={styles.item}>
+              <Cell
+                center
+                value={`${item.days}天`}
+                isLink
+                onClick={() => {
+                  modelData.show = true
+                  modelData.row = item
+                }}
+              >
+                {{
+                  title: () => (
+                    <div class={styles.itemTitle}>
+                      <div class={styles.titleLine}></div>
+                      <span>长笛单技训练</span>
+                    </div>
+                  )
+                }}
+              </Cell>
+              <Grid class={styles.grid} columnNum={3} border={false}>
+                <GridItem>
+                  <div class={styles.gridItem}>
+                    <div class={styles.gridItemTop}>
+                      <span class={styles.topNum}>{item.expectSalary || 0}</span>元
+                    </div>
+                    <div>预计补助</div>
                   </div>
-                  <div>预计补助</div>
-                </div>
-              </GridItem>
-              <GridItem>
-                <div class={styles.gridItem}>
-                  <div class={styles.gridItemTop}>
-                    <span class={styles.topNum}>0.00</span>元
+                </GridItem>
+                <GridItem>
+                  <div class={styles.gridItem}>
+                    <div class={styles.gridItemTop}>
+                      <span class={styles.topNum}>{item.reduceSalary || 0}</span>元
+                    </div>
+                    <div>考勤扣款</div>
                   </div>
-                  <div>考勤扣款</div>
-                </div>
-              </GridItem>
-              <GridItem>
-                <div class={styles.gridItem}>
-                  <div class={styles.gridItemTop}>
-                    <span class={styles.topNum}>240</span>课元
+                </GridItem>
+                <GridItem>
+                  <div class={styles.gridItem}>
+                    <div class={styles.gridItemTop}>
+                      <span class={styles.topNum}>{item.actualSalary || 0}</span>课元
+                    </div>
+                    <div>实际补助</div>
                   </div>
-                  <div>实际补助</div>
-                </div>
-              </GridItem>
-            </Grid>
+                </GridItem>
+              </Grid>
+            </div>
+          ))}
+        </OFullRefresh>
+        <Popup
+          v-model:show={modelData.show}
+          position="right"
+          style={{
+            width: '100vw',
+            '--van-popup-background': 'rgba(246,246,246,1)',
+            '--van-nav-bar-icon-color': '#333'
+          }}
+        >
+          <NavBar
+            leftArrow
+            title="补助明细"
+            onClickLeft={() => {
+              modelData.show = false
+            }}
+          />
+          <div
+            style={{
+              height: 'calc(100vh - var(--van-nav-bar-height))',
+              overflow: 'hidden',
+              'overflow-y': 'auto'
+            }}
+          >
+            <Details />
           </div>
-        ))}
+        </Popup>
       </div>
     )
   }

+ 106 - 25
src/school/approval-manage/subsidy/grant-detail.tsx

@@ -1,16 +1,67 @@
-import { Cell, Grid, GridItem } from 'vant'
-import { defineComponent } from 'vue'
+import { Cell, Dialog, Grid, GridItem, Sticky } from 'vant'
+import { defineComponent, onMounted, reactive, ref } from 'vue'
 import styles from '../index.module.less'
 import iconTime from '../images/icon-time.png'
+import { useRoute } from 'vue-router'
+import request from '@/helpers/request'
+import { state } from '@/state'
+import OFullRefresh from '@/components/o-full-refresh'
+import OHeader from '@/components/o-header'
 
 export default defineComponent({
   name: 'subsidy-grant-detail',
   setup() {
+    const route = useRoute()
+    const refreshing = ref(false)
+    const dialog = ref(false)
+    const data = reactive({
+      /**管理补助 */
+      manageSalary: {} as ISchoolStaffManageSalary,
+      rows: [] as ICourseSchedule[]
+    })
+    const getData = () => {
+      request
+        .post(`${state.platformApi}/schoolWeekSalaryRecord/detailInfo/manageTitle`, {
+          data: {
+            id: route.query.id,
+            userId: state.user.data.id
+          }
+        })
+        .then((res: any) => {
+          data.manageSalary = res?.data || {}
+        })
+      request
+        .post(`${state.platformApi}/schoolWeekSalaryRecord/detailInfo/managePage`, {
+          data: {
+            id: route.query.id,
+            userId: state.user.data.id
+          }
+        })
+        .then((res: any) => {
+          data.rows = res?.data?.rows || []
+        })
+        .finally(() => {
+          refreshing.value = false
+        })
+    }
+    onMounted(() => {
+      getData()
+    })
     return () => (
-      <div>
-
+      <OFullRefresh
+        v-model:modelValue={refreshing.value}
+        onRefresh={getData}
+        style="min-height: 100vh"
+      >
+        <Sticky>
+          <OHeader
+            class={styles.rightTip}
+            rightText="?"
+            onClickRight={() => (dialog.value = true)}
+          ></OHeader>
+        </Sticky>
         <div class={styles.item}>
-          <Cell center value="训练照片2/6">
+          <Cell center value={`${data.manageSalary.photoNum}/${data.manageSalary.expectPhotoNum}`}>
             {{
               title: () => (
                 <div class={styles.itemTitle}>
@@ -24,7 +75,10 @@ export default defineComponent({
             <GridItem>
               <div class={styles.gridItem}>
                 <div class={styles.gridItemTop}>
-                  <span class={styles.topNum}>240</span>元/周
+                  <span class={styles.topNum} style={{ color: '#333' }}>
+                    {data.manageSalary.standardSalary || 0}
+                  </span>
+                  元/周
                 </div>
                 <div>补助标准</div>
               </div>
@@ -32,39 +86,66 @@ export default defineComponent({
             <GridItem>
               <div class={styles.gridItem}>
                 <div class={styles.gridItemTop}>
-                  <span class={styles.topNum}>240</span>元/周
+                  <span class={styles.topNum} style={{ color: '#333' }}>
+                    {data.manageSalary.coursewareNum || 0}
+                  </span>
+                  课时
                 </div>
-                <div>补助标准</div>
+                <div>本周课时数</div>
               </div>
             </GridItem>
             <GridItem>
               <div class={styles.gridItem}>
                 <div class={styles.gridItemTop}>
-                  <span class={styles.topNum}>240</span>课时
+                  <span class={styles.topNum}>{data.manageSalary.actualSalary || 0}</span>元
                 </div>
-                <div>本周课时数</div>
+                <div>实际补助</div>
               </div>
             </GridItem>
           </Grid>
         </div>
 
-        <div class={styles.item}>
-          <Cell center>
-            {{
-              title: () => (
-                <div class={styles.itemTitle}>
-                  <img class={styles.titleIcon} src={iconTime} />
-                  <span>2023-1-17 14:00~15:3</span>
+        {data.rows.map((item: ICourseSchedule) => {
+          return () => (
+            <div class={styles.item}>
+              <Cell center>
+                {{
+                  title: () => (
+                    <div class={styles.itemTitle}>
+                      <img class={styles.titleIcon} src={iconTime} />
+                      <span>{item.startTime}</span>
+                    </div>
+                  )
+                }}
+              </Cell>
+              <div class={styles.itemContent}>
+                <div class={styles.itemContentTitle}>
+                  {item.className}-{item.teacherName}
                 </div>
-              )
-            }}
-          </Cell>
-          <div class={styles.itemContent}>
-            <div class={styles.itemContentTitle}>长笛单技课-张老师</div>
-            <div class={styles.itemContentLabel}>武汉市洪山区第二小学2022标准团</div>
+                <div class={styles.itemContentLabel}>{item.orchestraName}</div>
+              </div>
+            </div>
+          )
+        })}
+        <Dialog v-model:show={dialog.value} confirmButtonText="我知道了">
+          <div class={[styles.item, styles.tipItem]}>
+            <Cell center border={false}>
+              {{
+                title: () => (
+                  <div class={styles.itemTitle}>
+                    <div class={styles.titleLine}></div>
+                    <span>补助标准</span>
+                  </div>
+                )
+              }}
+            </Cell>
+            <div class={styles.tipContent}>
+              1、若未在学期时间内发布不少于2篇乐团资讯,则下一学期管理补助按标准金额的80%发放<br />
+              2、如该学期管理补助是按标准金额的80%发放,只要该学期完成不少于2篇乐团资讯推送,则下学期恢复正常管理补助标准
+            </div>
           </div>
-        </div>
-      </div>
+        </Dialog>
+      </OFullRefresh>
     )
   }
 })

+ 245 - 165
src/school/approval-manage/subsidy/index.tsx

@@ -1,191 +1,271 @@
-import { Cell, Grid, GridItem } from 'vant'
-import { defineComponent } from 'vue'
+import { Cell, Dialog, Grid, GridItem, Sticky } from 'vant'
+import { defineComponent, onMounted, reactive, ref } from 'vue'
 import styles from '../index.module.less'
 import iconA from '../images/icon-photo.png'
+import request from '@/helpers/request'
+import { state } from '@/state'
+import { useRoute } from 'vue-router'
+import OFullRefresh from '@/components/o-full-refresh'
+import OHeader from '@/components/o-header'
 
 export default defineComponent({
   name: 'approval-manage-subsidy',
   setup() {
+    const route = useRoute()
+    const dialog = ref(false)
+    const refreshing = ref(false)
+    const data = reactive({
+      startDate: '',
+      endDate: '',
+      manageSalary: '',
+      courseSalary: '',
+      practiceSalary: '',
+      /**管理补助 */
+      manageSalaryInfo: {} as any,
+      /**训练补助 */
+      courseSalaryInfo: {} as any,
+      /**练习奖励 */
+      practiceSalaryInfo: {} as any
+    })
+    const getData = async () => {
+      try {
+        const res: any = await request.post(
+          `${state.platformApi}/schoolWeekSalaryRecord/manageConfirm/${route.query.salaryId}`
+        )
+      } catch (error) {}
+      refreshing.value = false
+    }
+    onMounted(() => {
+      getData()
+    })
     return () => (
       <div>
-        <div class={styles.item}>
-          <Cell center isLink>
-            {{
-              title: () => (
-                <div class={styles.itemTitle}>
-                  <span>2023-1-16 至 2023-1-2</span>
-                  <span class={styles.itemTag}>补助周期</span>
-                </div>
-              )
-            }}
-          </Cell>
-          <Grid class={styles.grid} columnNum={3} border={false}>
-            <GridItem>
-              <div class={styles.gridItem}>
-                <div class={styles.gridItemTop}>
-                  <span class={styles.topNum}>240</span>元
+        <OFullRefresh
+          v-model:modelValue={refreshing.value}
+          onRefresh={getData}
+          style="min-height: 100vh"
+        >
+          <Sticky>
+            <OHeader
+              class={styles.rightTip}
+              rightText="?"
+              onClickRight={() => (dialog.value = true)}
+            ></OHeader>
+          </Sticky>
+
+          <div class={styles.item}>
+            <Cell center isLink>
+              {{
+                title: () => (
+                  <div class={styles.itemTitle}>
+                    <span>
+                      {data.startDate} 至 {data.endDate}
+                    </span>
+                    <span class={styles.itemTag}>补助周期</span>
+                  </div>
+                )
+              }}
+            </Cell>
+            <Grid class={styles.grid} columnNum={3} border={false}>
+              <GridItem>
+                <div class={styles.gridItem}>
+                  <div class={styles.gridItemTop}>
+                    <span class={styles.topNum}>{data.manageSalary || 0}</span>元
+                  </div>
+                  <div>管理补助</div>
                 </div>
-                <div>管理补助</div>
-              </div>
-            </GridItem>
-            <GridItem>
-              <div class={styles.gridItem}>
-                <div class={styles.gridItemTop}>
-                  <span class={styles.topNum}>240</span>元
+              </GridItem>
+              <GridItem>
+                <div class={styles.gridItem}>
+                  <div class={styles.gridItemTop}>
+                    <span class={styles.topNum}>{data.courseSalary || 0}</span>元
+                  </div>
+                  <div>训练补助</div>
                 </div>
-                <div>训练补助</div>
-              </div>
-            </GridItem>
-            <GridItem>
-              <div class={styles.gridItem}>
-                <div class={styles.gridItemTop}>
-                  <span class={styles.topNum}>240</span>元
+              </GridItem>
+              <GridItem>
+                <div class={styles.gridItem}>
+                  <div class={styles.gridItemTop}>
+                    <span class={styles.topNum}>{data.practiceSalary || 0}</span>元
+                  </div>
+                  <div>练习奖励</div>
                 </div>
-                <div>练习奖励</div>
-              </div>
-            </GridItem>
-          </Grid>
-        </div>
+              </GridItem>
+            </Grid>
+          </div>
 
-        <div class={styles.item}>
-          <Cell
-            style={{ '--van-cell-value-color': '#F44541' }}
-            center
-            value="训练照片2/6"
-            isLink
-            to={'/subsidy-grant-detail'}
-          >
-            {{
-              title: () => (
-                <div class={styles.itemTitle}>
-                  <div class={styles.titleLine}></div>
-                  <span>管理补助</span>
-                </div>
-              )
-            }}
-          </Cell>
-          <Grid class={styles.grid} columnNum={3} border={false}>
-            <GridItem>
-              <div class={styles.gridItem}>
-                <div class={styles.gridItemTop}>
-                  <span class={styles.topNum}>240</span>元/周
+          <div class={styles.item}>
+            <Cell
+              style={{ '--van-cell-value-color': '#F44541' }}
+              center
+              value={`${data.manageSalaryInfo.expectPhotoNum}/${data.manageSalaryInfo.photoNum}`}
+              isLink
+              to={'/subsidy-grant-detail?id=' + (data.manageSalaryInfo.id || '')}
+            >
+              {{
+                title: () => (
+                  <div class={styles.itemTitle}>
+                    <div class={styles.titleLine}></div>
+                    <span>管理补助</span>
+                  </div>
+                )
+              }}
+            </Cell>
+            <Grid class={styles.grid} columnNum={3} border={false}>
+              <GridItem>
+                <div class={styles.gridItem}>
+                  <div class={styles.gridItemTop}>
+                    <span class={styles.topNum} style={{ color: '#333' }}>
+                      {data.manageSalaryInfo.standardSalary || 0}
+                    </span>
+                    元/周
+                  </div>
+                  <div>补助标准</div>
                 </div>
-                <div>补助标准</div>
-              </div>
-            </GridItem>
-            <GridItem>
-              <div class={styles.gridItem}>
-                <div class={styles.gridItemTop}>
-                  <span class={styles.topNum}>240</span>元/周
+              </GridItem>
+              <GridItem>
+                <div class={styles.gridItem}>
+                  <div class={styles.gridItemTop}>
+                    <span class={styles.topNum} style={{ color: '#333' }}>
+                      {data.manageSalaryInfo.standardSalary || 0}
+                    </span>
+                    课时
+                  </div>
+                  <div>本周课时数</div>
                 </div>
-                <div>补助标准</div>
-              </div>
-            </GridItem>
-            <GridItem>
-              <div class={styles.gridItem}>
-                <div class={styles.gridItemTop}>
-                  <span class={styles.topNum}>240</span>课时
+              </GridItem>
+              <GridItem>
+                <div class={styles.gridItem}>
+                  <div class={styles.gridItemTop}>
+                    <span class={styles.topNum}>{data.manageSalaryInfo.actualSalary || 0}</span>元
+                  </div>
+                  <div>实际补助</div>
                 </div>
-                <div>本周课时数</div>
-              </div>
-            </GridItem>
-          </Grid>
-        </div>
+              </GridItem>
+            </Grid>
+          </div>
 
-        <div class={styles.item}>
-          <Cell center isLink to={'/subsidy-reward-detail'}>
-            {{
-              title: () => (
-                <div class={styles.itemTitle}>
-                  <div class={styles.titleLine}></div>
-                  <span>练习奖励</span>
+          <div class={styles.item}>
+            <Cell center isLink to={'/subsidy-reward-detail'}>
+              {{
+                title: () => (
+                  <div class={styles.itemTitle}>
+                    <div class={styles.titleLine}></div>
+                    <span>练习奖励</span>
+                  </div>
+                )
+              }}
+            </Cell>
+            <Grid class={styles.grid} columnNum={3} border={false}>
+              <GridItem>
+                <div class={styles.gridItem}>
+                  <div class={styles.gridItemTop}>
+                    <span class={styles.topNum}>{data.practiceSalaryInfo.standardSalary || 0}</span>元/人
+                  </div>
+                  <div>补助标准</div>
                 </div>
-              )
-            }}
-          </Cell>
-          <Grid class={styles.grid} columnNum={3} border={false}>
-            <GridItem>
-              <div class={styles.gridItem}>
-                <div class={styles.gridItemTop}>
-                  <span class={styles.topNum}>5</span>元/人
+              </GridItem>
+              <GridItem>
+                <div class={styles.gridItem}>
+                  <div class={styles.gridItemTop}>
+                    <span class={styles.topNum}>{data.practiceSalaryInfo.targetNum || 0}</span>人
+                  </div>
+                  <div>练习达标人数</div>
                 </div>
-                <div>补助标准</div>
-              </div>
-            </GridItem>
-            <GridItem>
-              <div class={styles.gridItem}>
-                <div class={styles.gridItemTop}>
-                  <span class={styles.topNum}>78</span>人
+              </GridItem>
+              <GridItem>
+                <div class={styles.gridItem}>
+                  <div class={styles.gridItemTop}>
+                    <span class={styles.topNum}>{data.practiceSalaryInfo.actualSalary || 0}</span>元
+                  </div>
+                  <div>实际奖励</div>
                 </div>
-                <div>练习达标人数</div>
-              </div>
-            </GridItem>
-            <GridItem>
-              <div class={styles.gridItem}>
-                <div class={styles.gridItemTop}>
-                  <span class={styles.topNum}>240</span>元
-                </div>
-                <div>实际奖励</div>
-              </div>
-            </GridItem>
-          </Grid>
-        </div>
+              </GridItem>
+            </Grid>
+          </div>
 
-        <div class={styles.item}>
-          <Cell center isLink to={'/subsidy-exercise-detail'}>
-            {{
-              title: () => (
-                <div class={styles.itemTitle}>
-                  <div class={styles.titleLine}></div>
-                  <span>训练补助</span>
-                </div>
-              )
-            }}
-          </Cell>
-          <Grid class={styles.grid} columnNum={3} border={false}>
-            <GridItem>
-              <div class={styles.gridItem}>
-                <div class={styles.gridItemTop}>
-                  <span class={styles.topNum}>240</span>元/人
+          <div class={styles.item}>
+            <Cell center to={'/subsidy-exercise-detail'}>
+              {{
+                title: () => (
+                  <div class={styles.itemTitle}>
+                    <div class={styles.titleLine}></div>
+                    <span>训练补助</span>
+                  </div>
+                )
+              }}
+            </Cell>
+            <Grid class={styles.grid} columnNum={3} border={false}>
+              <GridItem>
+                <div class={styles.gridItem}>
+                  <div class={styles.gridItemTop}>
+                    <span class={styles.topNum}>{data.courseSalaryInfo.singleSubsidyStandard || 0}</span>
+                    元/人
+                  </div>
+                  <div>单技补助标准</div>
                 </div>
-                <div>单技补助标准</div>
-              </div>
-            </GridItem>
-            <GridItem>
-              <div class={styles.gridItem}>
-                <div class={styles.gridItemTop}>
-                  <span class={styles.topNum}>240</span>元/天
+              </GridItem>
+              <GridItem>
+                <div class={styles.gridItem}>
+                  <div class={styles.gridItemTop}>
+                    <span class={styles.topNum}>{data.courseSalaryInfo.musicSubsidyStandard || 0}</span>
+                    元/天
+                  </div>
+                  <div>乐理补助标准</div>
                 </div>
-                <div>乐理补助标准</div>
-              </div>
-            </GridItem>
-            <GridItem>
-              <div class={styles.gridItem}>
-                <div class={styles.gridItemTop}>
-                  <span class={styles.topNum}>240</span>元
+              </GridItem>
+              <GridItem>
+                <div class={styles.gridItem}>
+                  <div class={styles.gridItemTop}>
+                    <span class={styles.topNum}>
+                      {data.courseSalaryInfo.ensembleSubsidyStandard || 0}
+                    </span>
+                    元
+                  </div>
+                  <div>合奏补助标准</div>
                 </div>
-                <div>合奏补助标准</div>
-              </div>
-            </GridItem>
-          </Grid>
-          {[1, 2, 3].map((teacher: any) => {
-            return (
-              <Cell center title="邓老师" isLink>
-                {{
-                  icon: () => <img class={styles.itemPicture} src={iconA} />,
-                  value: () => (
-                    <div class={styles.gridItem}>
-                      <div class={styles.gridItemTop}>
-                        <span class={styles.topNum}>240</span>元
-                      </div>
-                      <div class={styles.valeLabel}>实际奖励</div>
-                    </div>
-                  )
-                }}
-              </Cell>
-            )
-          })}
-        </div>
+              </GridItem>
+            </Grid>
+            {Array.isArray(data.courseSalaryInfo.salaryRecordDetailItemList) &&
+              data.courseSalaryInfo.salaryRecordDetailItemList.map((teacher: any) => {
+                return (
+                  <Cell center title={teacher.userName} isLink to={'/subsidy-exercise-detail?id='}>
+                    {{
+                      icon: () => <img class={styles.itemPicture} src={teacher.avatar} />,
+                      value: () => (
+                        <div class={styles.gridItem}>
+                          <div class={styles.gridItemTop}>
+                            <span class={styles.topNum}>{teacher.salary || 0}</span>元
+                          </div>
+                          <div class={styles.valeLabel}>实际奖励</div>
+                        </div>
+                      )
+                    }}
+                  </Cell>
+                )
+              })}
+          </div>
+        </OFullRefresh>
+        <Dialog v-model:show={dialog.value} confirmButtonText="我知道了">
+          <div class={[styles.item, styles.tipItem]}>
+            <Cell center border={false}>
+              {{
+                title: () => (
+                  <div class={styles.itemTitle}>
+                    <div class={styles.titleLine}></div>
+                    <span>补助发放规则</span>
+                  </div>
+                )
+              }}
+            </Cell>
+            <div class={styles.tipContent}>
+              1、每周一上午10点生成上一周实际补助数据<br />
+              2、每周一24点前完成补助确认,则该补助将会在当周周五发放<br />
+              3、超过周一24点确认,则延后到下周周五发放 4、如遇法定节假日,则统一延后到下一周五发放<br />
+              5、未绑定银行卡造成无法发放时,在绑定银行卡后的下一周五一次性将已确认且未发放的金额一次性发放
+            </div>
+          </div>
+        </Dialog>
       </div>
     )
   }

+ 144 - 70
src/school/approval-manage/subsidy/reward-detail.tsx

@@ -1,105 +1,179 @@
 import { ActionSheet, ActionSheetAction, Cell, Grid, GridItem } from 'vant'
-import { computed, defineComponent, ref } from 'vue'
+import { computed, defineComponent, onMounted, reactive, ref } from 'vue'
 import styles from '../index.module.less'
 import iconA from '../images/icon-photo.png'
 import iconArrow from '../images/icon-arrow.png'
+import OFullRefresh from '@/components/o-full-refresh'
+import { useRoute } from 'vue-router'
+import request from '@/helpers/request'
+import { state } from '@/state'
+import OEmpty from '@/components/o-empty'
 
 export default defineComponent({
   name: 'subsidy-reward-detail',
   setup() {
+    const route = useRoute()
+    const refreshing = ref(false)
+    const dialog = ref(false)
+    const data = reactive({
+      /**声部ID */
+      subjectId: '',
+      /**声部列表 */
+      subjects: [] as any[],
+      /**管理补助 */
+      manageSalary: {} as ISchoolStaffTrainingSalary,
+      rows: [] as IStudent[]
+    })
+    const getData = () => {
+      request
+        .post(`${state.platformApi}/schoolWeekSalaryRecord/detailInfo/trainingTitle`, {
+          data: {
+            id: route.query.id,
+            userId: state.user.data.id,
+            subjectId: data.subjectId
+          }
+        })
+        .then((res: any) => {
+          data.manageSalary = res?.data || {}
+        })
+      request
+        .post(`${state.platformApi}/schoolWeekSalaryRecord/detailInfo/trainingPage`, {
+          data: {
+            id: route.query.id,
+            userId: state.user.data.id,
+            subjectId: data.subjectId
+          }
+        })
+        .then((res: any) => {
+          data.rows = res?.data?.rows || []
+        })
+        .finally(() => {
+          refreshing.value = false
+        })
+    }
+    onMounted(() => {
+      request
+        .post(`${state.platformApi}/subjectBasicConfig/page`, {
+          data: { page: 1, rows: 9999 }
+        })
+        .then((res: any) => {
+          if (Array.isArray(res?.data?.rows)) {
+            data.subjects = res.data.rows
+          }
+        })
+      getData()
+    })
     const actions = computed(() => {
+      const subList = data.subjects.map((n: any) => {
+        return {
+          name: n.subjectName,
+          value: n.subjectId,
+          color: activeName.value == n.subjectName ? 'var(--van-primary-color)' : ''
+        }
+      })
       return [
         {
           name: '全部声部',
           color: activeName.value == '全部声部' ? 'var(--van-primary-color)' : ''
         },
-        { name: '待审批', color: activeName.value == '待审批' ? 'var(--van-primary-color)' : '' },
-        { name: '已完成', color: activeName.value == '已完成' ? 'var(--van-primary-color)' : '' }
+        ...subList
       ]
     })
     const activeName = ref('全部声部')
     const show = ref(false)
     return () => (
       <div>
-        <div class={styles.item}>
-          <Cell center>
-            {{
-              title: () => (
-                <div class={styles.itemTitle}>
-                  <div class={styles.titleLine}></div>
-                  <span>练习奖励</span>
+        <OFullRefresh
+          v-model:modelValue={refreshing.value}
+          onRefresh={getData}
+          style="min-height: 100vh"
+        >
+          <div class={styles.item}>
+            <Cell center>
+              {{
+                title: () => (
+                  <div class={styles.itemTitle}>
+                    <div class={styles.titleLine}></div>
+                    <span>练习奖励</span>
+                  </div>
+                )
+              }}
+            </Cell>
+            <Grid class={styles.grid} columnNum={3} border={false}>
+              <GridItem>
+                <div class={styles.gridItem}>
+                  <div class={styles.gridItemTop}>
+                    <span class={styles.topNum}>{data.manageSalary.standardSalary || 0}</span>元/人
+                  </div>
+                  <div>补助标准</div>
                 </div>
-              )
-            }}
-          </Cell>
-          <Grid class={styles.grid} columnNum={3} border={false}>
-            <GridItem>
-              <div class={styles.gridItem}>
-                <div class={styles.gridItemTop}>
-                  <span class={styles.topNum}>5</span>元/人
+              </GridItem>
+              <GridItem>
+                <div class={styles.gridItem}>
+                  <div class={styles.gridItemTop}>
+                    <span class={styles.topNum}>{data.manageSalary.targetNum || 0}</span>人
+                  </div>
+                  <div>练习达标人数</div>
                 </div>
-                <div>补助标准</div>
-              </div>
-            </GridItem>
-            <GridItem>
-              <div class={styles.gridItem}>
-                <div class={styles.gridItemTop}>
-                  <span class={styles.topNum}>78</span>人
+              </GridItem>
+              <GridItem>
+                <div class={styles.gridItem}>
+                  <div class={styles.gridItemTop}>
+                    <span class={styles.topNum}>{data.manageSalary.actualSalary || 0}</span>元
+                  </div>
+                  <div>实际奖励</div>
                 </div>
-                <div>练习达标人数</div>
-              </div>
-            </GridItem>
-            <GridItem>
-              <div class={styles.gridItem}>
-                <div class={styles.gridItemTop}>
-                  <span class={styles.topNum}>240</span>元
-                </div>
-                <div>实际奖励</div>
-              </div>
-            </GridItem>
-          </Grid>
-        </div>
+              </GridItem>
+            </Grid>
+          </div>
 
-        <div class={styles.itemSelect}>
-          <div class={styles.select} onClick={() => (show.value = true)}>
-            <span>{activeName.value}</span>
-            <img src={iconArrow} />
+          <div class={styles.itemSelect}>
+            <div class={styles.select} onClick={() => (show.value = true)}>
+              <span>{activeName.value}</span>
+              <img src={iconArrow} />
+            </div>
           </div>
-        </div>
 
-        <div class={styles.item}>
-          {[1, 2, 3].map((item: any) => {
-            return (
-              <Cell center class={styles.rewardItem}>
-                {{
-                  icon: <img class={styles.itemPicture} src={iconA} />,
-                  title: () => (
-                    <div class={styles.itemTitle}>
-                      <span>邓同学</span>
-                    </div>
-                  ),
-                  label: () => <span class={styles.itemTag}>长笛</span>,
-                  value: () => (
-                    <div class={styles.gridItem}>
-                      <div class={styles.gridItemTop}>
-                        <span class={styles.topNum}>40</span>分钟
-                      </div>
-                      <div class={styles.valeLabel}>练习时长</div>
-                    </div>
-                  )
-                }}
-              </Cell>
-            )
-          })}
-        </div>
+          {data.rows.length ? (
+            <div class={styles.item}>
+              {data.rows.map((item: IStudent) => {
+                return (
+                  <Cell center>
+                    {{
+                      icon: () => <img class={styles.itemPicture} src={item.avatar} />,
+                      title: () => (
+                        <div class={styles.itemTitle}>
+                          <span>{item.nickname}</span>
+                        </div>
+                      ),
+                      label: () => <span class={styles.itemTag}>{item.subjectNames}</span>,
+                      value: () => (
+                        <div class={styles.gridItem}>
+                          <div class={styles.gridItemTop}>
+                            <span class={styles.topNum}>{item.practiceTimes}</span>分钟
+                          </div>
+                          <div class={styles.valeLabel}>练习时长</div>
+                        </div>
+                      )
+                    }}
+                  </Cell>
+                )
+              })}
+            </div>
+          ) : (
+            <OEmpty tips="暂无学生练习" />
+          )}
+        </OFullRefresh>
         <ActionSheet
           teleport="body"
           cancelText="取消"
           v-model:show={show.value}
           actions={actions.value}
-          onSelect={(action: ActionSheetAction, index: number) => {
-            activeName.value = action.name || '待审批'
+          onSelect={(action: any, index: number) => {
+            activeName.value = action.name || '全部声部'
+            data.subjectId = action.value || ''
             show.value = false
+            getData()
           }}
         ></ActionSheet>
       </div>

+ 252 - 0
src/school/approval-manage/subsidy/subsidyTypes.ts

@@ -0,0 +1,252 @@
+/**管理老师管理补助表 */
+interface ISchoolStaffManageSalary {
+  /**预计的训练照片数 */
+  expectPhotoNum: number | string
+  /**扣减奖励 */
+  reduceSalary: number | string
+  /**补助标准 */
+  standardSalary: number | string
+  /**实际奖励 */
+  actualSalary: number | string
+  /**课件数 */
+  coursewareNum: number | string
+  /**预计奖励 */
+  expectSalary: number | string
+  /**训练照片数 */
+  photoNum: number | string
+}
+
+/**老师课程表 */
+interface ICourseSchedule {
+  /**课程计划编号 */
+  lessonCoursewareId: string
+  /**训练规划类型: STANDARD:标准 PRACTISE:加练 ADJUST:调整 */
+  arrangeType: 'STANDARD' | 'PRACTISE' | 'ADJUST'
+  /**班级名 */
+  className: string
+  /**课程类型 */
+  type:
+    | 'PERCUSSION_SINGLE'
+    | 'FLUTE_SINGLE'
+    | 'SAX_SINGLE'
+    | 'CLARINET_SINGLE'
+    | 'TRUMPET_SINGLE'
+    | 'TROMBONE_SINGLE'
+    | 'HORN_SINGLE'
+    | 'BARITONE_TUBA_SINGLE'
+    | 'EUPHONIUM_SINGLE'
+    | 'TUBA_SINGLE'
+    | 'MUSIC_THEORY'
+    | 'INSTRUMENTAL_ENSEMBLE'
+  /**训练时长 */
+  singleCourseTime: string | number
+  /**班组IM群 */
+  imGroupId: string
+  /**乐团id */
+  orchestraId: string
+  /**学校编号 */
+  schoolId: number | string
+  /**是否必须配置课件 */
+  coursewareFlag: boolean
+  /**上课时间 */
+  startTime: string
+  /**课程id */
+  id: string
+  /**签退时间 */
+  signOutTime: string
+  /**课程老师签到信息 */
+  attendanceStatus:
+    | 'NORMAL'
+    | 'EXCEPTION'
+    | 'LATE'
+    | 'EARLY'
+    | 'TRUANCY'
+    | 'NO_SIGN'
+    | 'NO_SIGN_OUT'
+    | 'LOCATION_EXCEPTION'
+  /**伴学老师名 */
+  teacherAvatar: string
+  /**课程计划内容编号 */
+  lessonCoursewareDetailId: string
+  /**上课日期 */
+  classDate: string
+  /**伴学老师名 */
+  teacherName: string
+  /**学生考勤 */
+  studentAttendance: 'LATE' | 'NORMAL' | 'LEAVE' | 'TRUANCY' | 'UNCALLED'
+  /**时间冲突 */
+  timeConflict: boolean
+  /**乐团名 */
+  orchestraName: string
+  /**是否签退 */
+  signOut: boolean
+  /**签到时间 */
+  signInTime: string
+  /**伴学老师Id */
+  teacherId: string
+  /**是否签到 */
+  signIn: boolean
+  /**作业是否完成:NO_HOMEWORK:未布置作业 UNSUBMITTED:未提交 SUBMITTED:已提交 TARGET:已达标 */
+  homeworkComplete: 'NO_HOMEWORK' | 'UNSUBMITTED' | 'SUBMITTED' | 'TARGET'
+  /**冲突类型 */
+  conflictType: Array<any> | string
+  /**下课时间 */
+  endTime: string
+  /**班级id */
+  classGroupId: string
+  /**预计上课人数 */
+  preStudentNum: string
+  /**课程状态 NOT_START未开始 ING进行中 COMPLETE已完成 */
+  status: 'NOT_START' | 'ING' | 'COMPLETE'
+}
+
+/**管理老师训练奖励表 */
+interface ISchoolStaffTrainingSalary {
+  /**一周结束日期 */
+  endDate: string
+  /**扣减明细 */
+  deductionDetail: string
+  /**老师编号 */
+  userId: string
+  /**奖励变动原因 */
+  deductionReason: string
+  /**扣减奖励 */
+  reduceSalary: number
+  /**奖励标准 */
+  standardSalary: number
+  /**实际奖励 */
+  actualSalary: number
+  /**结算时间 */
+  settlementTime: string
+  /**达标人数 */
+  targetNum: number
+  /**学校id */
+  schoolId: string
+  /**预计奖励 */
+  expectSalary: number
+  /**一周开始日期 */
+  startDate: string
+  /**结算状态 */
+  status: 'WAIT' | 'SETTLED' | 'PART_SETTLED' | 'SETTLE_FAIL'
+}
+
+/**学生列表 */
+interface IStudent {
+  /**练习分钟 */
+  practiceTimes: number
+  /**昵称 */
+  nickname: string
+  /**头像 */
+  avatar: string
+  /**声部名, 多个逗号隔开 */
+  subjectNames: string
+  /**主键ID */
+  userId: string
+  /**声部ID */
+  subjectId: string
+}
+
+/**补助详情数据明细-课程补助明细 */
+interface ICourseSalaryRecordDetail {
+  /**扣款金额 */
+  reduceSalary: number
+  /**补助详情列表数据 */
+  courseSalaryRecordDetailList: ICourseSalaryRecordDetailItem[]
+  /**实际补助金额 */
+  actualSalary: number
+  /**预计补助金额 */
+  expectSalary: number
+}
+/**课程补助详情数据集合 */
+interface ICourseSalaryRecordDetailItem {
+  /**课程类型 */
+  courseType:
+    | 'PERCUSSION_SINGLE'
+    | 'FLUTE_SINGLE'
+    | 'SAX_SINGLE'
+    | 'CLARINET_SINGLE'
+    | 'TRUMPET_SINGLE'
+    | 'TROMBONE_SINGLE'
+    | 'HORN_SINGLE'
+    | 'BARITONE_TUBA_SINGLE'
+    | 'EUPHONIUM_SINGLE'
+    | 'TUBA_SINGLE'
+    | 'TEST_CLARINET'
+    | 'MUSIC_THEORY'
+    | 'INSTRUMENTAL_ENSEMBLE'
+  /**扣款金额 */
+  reduceSalary: number
+  /**补助标准 */
+  standardSalary: number
+  /**实际补助金额 */
+  actualSalary: number
+  /**天数 */
+  days: number
+  /**预计补助金额 */
+  expectSalary: number
+  /**课程考勤信息 */
+  courseScheduleTeacherAttendanceList: ICourseScheduleTeacherAttendance[]
+}
+/**伴学老师签到 */
+interface ICourseScheduleTeacherAttendance {
+  /**老师名称 */
+  teacherName: string
+  /**乐团名称 */
+  orchestraName: string
+  /**课程编号 */
+  courseScheduleId: string
+  /**训练时长 */
+  singleCourseTime: string
+  /**签到状态(正常、异常、迟到、早退、旷课、未签到) */
+  signInStatus:
+    | 'NORMAL'
+    | 'EXCEPTION'
+    | 'LATE'
+    | 'EARLY'
+    | 'TRUANCY'
+    | 'NO_SIGN'
+    | 'NO_SIGN_OUT'
+    | 'LOCATION_EXCEPTION'
+  /**乐团编号 */
+  orchestraId: string
+  /**班级名称 */
+  classGroupName: string
+  /**签到时间 */
+  signInTime: string
+  /**是否为补助考勤 */
+  subsidyFlag: boolean
+  /**老师编号 */
+  teacherId: string
+  /**学校编号 */
+  schoolId: string
+  /**用户聊天ID */
+  imUserId: string
+  /**老师电话 */
+  teacherPhone: string
+  /**上课时间 */
+  startTime: string
+  /**班级im聊天 */
+  classGroupImToken: string
+  /**下课时间 */
+  endTime: string
+  /**考勤id */
+  id: string
+  /**签退状态(正常、异常、迟到、早退、旷课、未签到) */
+  signOutStatus:
+    | 'NORMAL'
+    | 'EXCEPTION'
+    | 'LATE'
+    | 'EARLY'
+    | 'TRUANCY'
+    | 'NO_SIGN'
+    | 'NO_SIGN_OUT'
+    | 'LOCATION_EXCEPTION'
+  /**签退时间 */
+  signOutTime: string
+  /**课程类型 */
+  classType: 'SINGLE' | 'MUSIC_THEORY' | 'INSTRUMENTAL_ENSEMBLE'
+  /**老师头像 */
+  teacherAvatar: string
+  /**班级编号 */
+  classGroupId: string
+}