Bladeren bron

Merge branch 'master' into jenkins

lex 2 jaren geleden
bovenliggende
commit
e98e357ef9

+ 2 - 2
dist/assets/index-legacy.2ae28dc5.js

@@ -13143,7 +13143,7 @@
                                   (e.loading = !0),
                                   (n.prev = 7),
                                   (n.next = 10),
-                                  xp.get(zv.platformApi + '/appLoginUser/getUserInfo', {
+                                  xp.get(zv.platformApi + '/user/getUserInfo', {
                                     initRequest: !0,
                                     requestType: 'form'
                                   })
@@ -13407,7 +13407,7 @@
                                   (e.loading = !0),
                                   (n.prev = 7),
                                   (n.next = 10),
-                                  Gp.get('/api-student/appLoginUser/getUserInfo', {
+                                  Gp.get('/api-student/user/getUserInfo', {
                                     initRequest: !0,
                                     requestType: 'form'
                                   })

File diff suppressed because it is too large
+ 0 - 0
dist/assets/index.879f7421.js


File diff suppressed because it is too large
+ 0 - 0
dist/assets/login-legacy.279a4f4f.js


File diff suppressed because it is too large
+ 0 - 0
dist/assets/login-legacy.ef512287.js


File diff suppressed because it is too large
+ 0 - 0
dist/assets/login.27932eb5.js


File diff suppressed because it is too large
+ 0 - 0
dist/assets/login.c7a7b0d6.js


+ 1 - 0
src/components/o-empty/index.module.less

@@ -7,6 +7,7 @@
   display: flex;
   align-items: center;
   justify-content: center;
+  flex-direction: column;
   .tips {
     font-size: 14px;
     color: #333;

+ 1 - 1
src/helpers/request.ts

@@ -54,7 +54,7 @@ request.interceptors.request.use(
       Authorization &&
       ![
         '/api-oauth/userlogin',
-        // `${state.platformApi}/appLoginUser/getUserInfo`,
+        // `${state.platformApi}/user/getUserInfo`,
         '/api-oauth/open/sendSms'
       ].includes(url)
     ) {

+ 9 - 1
src/router/routes-teacher.ts

@@ -126,7 +126,15 @@ export default [
         meta: {
           title: '测验详情'
         }
-      }
+      },
+      {
+        path: '/subsidy-exercise-details',
+        name: 'subsidy-exercise-details',
+        component: () => import('@/school/approval-manage/subsidy/details'),
+        meta: {
+          title: '补助明细'
+        }
+      },
 
       //unitDetail 选择阶段自测
     ]

+ 23 - 4
src/school/approval-manage/components/student-leave.tsx

@@ -12,6 +12,7 @@ import eiditICon from '../images/eidit-icon.png'
 import questICon from '../images/quest-icon.png'
 import StudentCourseItem from './student-course-item'
 import dayjs from 'dayjs'
+import ODialog from '@/components/o-dialog'
 const activeName = ref('wait')
 const item = ref({} as any)
 const courseScheduleList = ref([] as any)
@@ -22,7 +23,10 @@ export default defineComponent({
   setup() {
     const router = useRouter()
     const route = useRoute()
-    const state = reactive({})
+    const state = reactive({
+      dialogStatus: false,
+      dialogMessage: ''
+    })
 
     const getLeaveDetail = async () => {
       try {
@@ -51,15 +55,20 @@ export default defineComponent({
         return
       }
       try {
-        const { data } = await request.post(`/api-school/userApproveRecord/approval`, {
+        const res = await request.post(`/api-school/userApproveRecord/approval`, {
           data: {
             id: route.query.id,
             approvalComments: leaveReason.value,
             status: val
           }
         })
-        showToast('提交成功')
-        router.go(-1)
+        if (res.code === 999) {
+          state.dialogStatus = true
+          state.dialogMessage = res.message
+        } else {
+          showToast('提交成功')
+          router.push('/approval-manage')
+        }
       } catch (e: any) {
         showToast(e.message || '提交失败')
       }
@@ -162,6 +171,16 @@ export default defineComponent({
               </Button>
             </div>
           )}
+
+          <ODialog
+            title="提示"
+            v-model:show={state.dialogStatus}
+            message={state.dialogMessage}
+            confirmButtonText="确定"
+            onConfirm={() => {
+              router.back()
+            }}
+          />
         </div>
       </>
     )

+ 23 - 0
src/school/approval-manage/index.module.less

@@ -228,8 +228,31 @@
       }
     }
     .startTimeBottom {
+      padding-top: 5px;
       font-size: 18px;
       font-weight: bold;
+      display: flex;
+      align-items: center;
+    }
+    .startTimeStatus {
+      margin-right: 12px;
+      font-size: 14px;
+      font-weight: 500;
+      color: #333333;
+      line-height: 20px;
+    }
+    .startTimePosition {
+      font-size: 14px;
+      font-weight: 500;
+      color: #333333;
+      line-height: 20px;
+    }
+    .startTimePositionLook {
+      font-size: 12px;
+      font-weight: 500;
+      line-height: 17px;
+      display: flex;
+      align-items: center;
     }
   }
   .startTime {

+ 189 - 38
src/school/approval-manage/subsidy/details.tsx

@@ -1,39 +1,75 @@
-import { Cell, Grid, GridItem } from 'vant'
-import { defineComponent, onMounted, PropType } from 'vue'
+import { Cell, Grid, GridItem, Icon } from 'vant'
+import { defineComponent, onMounted, PropType, reactive } 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'
-import { courseSalaryRecordDetailItem } from './exercise-detail'
 import OSticky from '@/components/o-sticky'
 import OHeader from '@/components/o-header'
 import OEmpty from '@/components/o-empty'
 import dayjs from 'dayjs'
 import { getSecondRPM } from '@/helpers/utils'
+import request from '@/helpers/request'
+import { useRoute } from 'vue-router'
+import { postMessage } from '@/helpers/native-message'
+import { state as baseState } from '@/state'
 
 export default defineComponent({
   name: 'subsidy-detail',
   setup() {
-    const record: ICourseSalaryRecordDetailItem = courseSalaryRecordDetailItem.value! || ''
-    console.log(record)
-    if (Array.isArray(record?.courseScheduleTeacherAttendanceList)) {
-      record.courseScheduleTeacherAttendanceList.forEach((n: any) => {
-        n.times =
-          (n?.startTime ? dayjs(n.startTime).format('YYYY-MM-DD HH:mm') : '') +
-          ' ~ ' +
-          (n?.endTime ? dayjs(n.endTime).format('HH:mm') : '')
-        n.signInTime = n?.signInTime?.split(' ')[1]
-        n.signOutTime = n?.signOutTime?.split(' ')[1]
-      })
+    const route = useRoute()
+    const state = reactive({
+      record: {} as any
+    })
+
+    const getDetails = async () => {
+      try {
+        let result: any = {}
+        if (baseState.platformType === 'TEACHER') {
+          const { data } = await request.get(
+            '/api-teacher/courseScheduleTeacherSalary/detail/' + route.query.id,
+            {}
+          )
+          result = data || {}
+        } else {
+          const { data } = await request.post(
+            '/api-school/schoolWeekSalaryRecord/detailInfoByCourseType',
+            {
+              data: {
+                ...route.query
+              }
+            }
+          )
+          result = data || {}
+        }
+        state.record = result || {}
+        if (Array.isArray(state.record?.courseScheduleTeacherAttendanceList)) {
+          state.record.courseScheduleTeacherAttendanceList.forEach((n: any) => {
+            n.times =
+              (n?.startTime ? dayjs(n.startTime).format('YYYY-MM-DD HH:mm') : '') +
+              ' ~ ' +
+              (n?.endTime ? dayjs(n.endTime).format('HH:mm') : '')
+            n.signInTime = n?.signInTime?.split(' ')[1]
+            n.signOutTime = n?.signOutTime?.split(' ')[1]
+          })
+
+          state.record.courseScheduleTeacherAttendanceList.push({})
+        }
+      } catch {
+        //
+      }
     }
+    onMounted(() => {
+      getDetails()
+    })
     return () => (
       <div>
         <OSticky>
           <OHeader />
         </OSticky>
-        {!!record && (
+        {!!state.record && (
           <div class={styles.wrap}>
             <div class={[styles.item, styles.listItem]}>
               <Cell
@@ -41,41 +77,36 @@ export default defineComponent({
                 center
                 class={styles.listItem}
                 title="补助标准"
-                value={`${record.standardSalary}元/天`}
+                value={`${state.record.standardSalary}元/天`}
               />
               <Cell
                 border={false}
                 center
                 class={styles.listItem}
                 title="补助课程"
-                value={courseEmnu[record.courseType]}
-              />
-              <Cell
-                border={false}
-                center
-                class={styles.listItem}
-                valueClass={styles.valueColor}
-                title="课件使用未达标"
-                value={`-${record.reduceSalary}元`}
-              />
-              <Cell
-                border={false}
-                center
-                class={styles.listItem}
-                valueClass={styles.valueColor}
-                title="早退"
-                value={`-0.00元`}
+                value={courseEmnu[state.record.courseType]}
               />
+              {state.record.attendanceInfoList &&
+                state.record.attendanceInfoList.map((item: any) => (
+                  <Cell
+                    border={false}
+                    center
+                    class={styles.listItem}
+                    valueClass={styles.valueColor}
+                    title={item.reason}
+                    value={`${item.salary}元`}
+                  />
+                ))}
               <Cell
                 border={false}
                 center
                 class={styles.listItem}
                 title="实际补助金额"
-                value={`${record.actualSalary}元`}
+                value={`${state.record.actualSalary}元`}
               />
             </div>
 
-            {record?.courseScheduleTeacherAttendanceList?.map(
+            {state.record?.courseScheduleTeacherAttendanceList?.map(
               (item: ICourseScheduleTeacherAttendance) => (
                 <div class={styles.item}>
                   <Cell center>
@@ -113,14 +144,134 @@ export default defineComponent({
                           <span>签到时间</span>
                           <img src={item.signInStatus === 'NORMAL' ? iconPrimary : iconError} />
                         </div>
-                        <div class={styles.startTimeBottom}>{item.signInTime}</div>
+                        <div class={styles.startTimeBottom}>
+                          <span
+                            class={styles.startTimeStatus}
+                            style={{
+                              color: item.signInStatus === 'NORMAL' ? '' : '#F44541'
+                            }}
+                          >
+                            {item.signInStatusTitle}
+                          </span>
+                          {item.signInTime}
+                        </div>
                       </div>
                       <div class={[styles.timesItem, styles.endTime]}>
                         <div class={styles.startTimeTop}>
+                          <span>签到定位</span>
+                          <img
+                            src={
+                              item.signInLongitudeLatitudeStatus === 'NORMAL'
+                                ? iconPrimary
+                                : iconError
+                            }
+                          />
+                        </div>
+                        <div
+                          class={styles.startTimeBottom}
+                          style={{ justifyContent: 'space-between' }}
+                        >
+                          {item.signInLongitudeLatitude ? (
+                            <>
+                              <span class={styles.startTimePosition}>
+                                {item.signInLongitudeLatitudeStatus === 'NORMAL'
+                                  ? '考勤范围内'
+                                  : '考勤范围外'}
+                              </span>
+                              <span
+                                class={styles.startTimePositionLook}
+                                style={{
+                                  color:
+                                    item.signInLongitudeLatitudeStatus === 'NORMAL'
+                                      ? '#4493F6'
+                                      : '#F44541'
+                                }}
+                                onClick={() => {
+                                  postMessage({
+                                    api: 'sourseMapApi',
+                                    content: {
+                                      type: 'display',
+                                      myPoint: item.schoolLongitudeLatitude,
+                                      orginPoint: item.signInLongitudeLatitude
+                                    }
+                                  })
+                                }}
+                              >
+                                查看定位 <Icon name="arrow" />
+                              </span>
+                            </>
+                          ) : (
+                            <span class={styles.startTimePosition}>暂无定位</span>
+                          )}
+                        </div>
+                      </div>
+                    </div>
+                    <div class={styles.times}>
+                      <div class={[styles.timesItem, styles.startTime]}>
+                        <div class={styles.startTimeTop}>
                           <span>签退时间</span>
                           <img src={item.signOutStatus === 'NORMAL' ? iconPrimary : iconError} />
                         </div>
-                        <div class={styles.startTimeBottom}>{item.signOutTime}</div>
+                        <div class={styles.startTimeBottom}>
+                          <span
+                            class={styles.startTimeStatus}
+                            style={{
+                              color: item.signOutStatus === 'NORMAL' ? '' : '#F44541'
+                            }}
+                          >
+                            {item.signOutStatusTitle}
+                          </span>
+                          {item.signOutTime}
+                        </div>
+                      </div>
+                      <div class={[styles.timesItem, styles.endTime]}>
+                        <div class={styles.startTimeTop}>
+                          <span>签退定位</span>
+                          <img
+                            src={
+                              item.signOutLongitudeLatitudeStatus === 'NORMAL'
+                                ? iconPrimary
+                                : iconError
+                            }
+                          />
+                        </div>
+                        <div
+                          class={styles.startTimeBottom}
+                          style={{ justifyContent: 'space-between' }}
+                        >
+                          {item.signOutLongitudeLatitude ? (
+                            <>
+                              <span class={styles.startTimePosition}>
+                                {item.signOutLongitudeLatitudeStatus === 'NORMAL'
+                                  ? '考勤范围内'
+                                  : '考勤范围外'}
+                              </span>
+                              <span
+                                class={styles.startTimePositionLook}
+                                style={{
+                                  color:
+                                    item.signOutLongitudeLatitudeStatus === 'NORMAL'
+                                      ? '#4493F6'
+                                      : '#F44541'
+                                }}
+                                onClick={() => {
+                                  postMessage({
+                                    api: 'sourseMapApi',
+                                    content: {
+                                      type: 'display',
+                                      myPoint: item.schoolLongitudeLatitude,
+                                      orginPoint: item.signOutLongitudeLatitude
+                                    }
+                                  })
+                                }}
+                              >
+                                查看定位 <Icon name="arrow" />
+                              </span>
+                            </>
+                          ) : (
+                            <span class={styles.startTimePosition}>暂无定位</span>
+                          )}
+                        </div>
                       </div>
                     </div>
                   </div>
@@ -129,7 +280,7 @@ export default defineComponent({
             )}
           </div>
         )}
-        {!record && <OEmpty tips="暂无明细" />}
+        {!state.record && <OEmpty tips="暂无明细" />}
       </div>
     )
   }

+ 5 - 1
src/school/approval-manage/subsidy/exercise-detail.tsx

@@ -106,7 +106,11 @@ export default defineComponent({
                   onClick={() => {
                     courseSalaryRecordDetailItem.value = item
                     router.push({
-                      path: '/subsidy-exercise-details'
+                      path: '/subsidy-exercise-details',
+                      query: {
+                        ...route.query,
+                        courseType: item.courseType
+                      }
                     })
                   }}
                 >

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

@@ -217,6 +217,12 @@ interface ICourseScheduleTeacherAttendance {
   | 'NO_SIGN'
   | 'NO_SIGN_OUT'
   | 'LOCATION_EXCEPTION'
+  /**签到状态(正常、异常、迟到、早退、旷课、未签到)中文 */
+  signInStatusTitle?: string,
+  /** 签到金纬度状态 */
+  signInLongitudeLatitudeStatus?:
+  | 'NORMAL'
+  | 'LOCATION_EXCEPTION'
   /**乐团编号 */
   orchestraId: string
   /**班级名称 */
@@ -251,6 +257,12 @@ interface ICourseScheduleTeacherAttendance {
   | 'NO_SIGN'
   | 'NO_SIGN_OUT'
   | 'LOCATION_EXCEPTION'
+  /**签退状态(正常、异常、迟到、早退、旷课、未签到) */
+  signOutStatusTitle?: string
+  /** 签退经纬度状态 */
+  signOutLongitudeLatitudeStatus?:
+  | 'NORMAL'
+  | 'LOCATION_EXCEPTION'
   /**签退时间 */
   signOutTime: string
   /**课程类型 */
@@ -259,4 +271,10 @@ interface ICourseScheduleTeacherAttendance {
   teacherAvatar: string
   /**班级编号 */
   classGroupId: string
+  /**学校经纬度 */
+  schoolLongitudeLatitude: string
+  /**签退经纬度 */
+  signOutLongitudeLatitude?: string
+  /**签到经纬度 */
+  signInLongitudeLatitude: string
 }

+ 0 - 1
src/school/orchestra/compontent/photo.tsx

@@ -58,7 +58,6 @@ export default defineComponent({
         if (state.selectType === 'add') {
           await request.post('/api-school/orchestraPhotoAlbum/save', {
             data: {
-              orchestraId: route.query.id,
               name: state.photoName
             }
           })

+ 17 - 3
src/school/practice-rewards/detail.tsx

@@ -14,7 +14,7 @@ export default defineComponent({
     const route = useRoute()
     const state = reactive({
       subjectStatus: false,
-      subjectList: [],
+      subjectList: [] as any,
       isClick: false,
       list: [] as any,
       listState: {
@@ -24,8 +24,10 @@ export default defineComponent({
         refreshing: false,
         height: 0 // 页面头部高度,为了处理下拉刷新用的
       },
+      subjectName: '全部声部',
       params: {
         type: null,
+        subjectId: null,
         page: 1,
         rows: 20
       }
@@ -40,7 +42,12 @@ export default defineComponent({
             rows: 50
           }
         })
+
         state.subjectList = data.rows || []
+        state.subjectList.unshift({
+          subjectId: '',
+          subjectName: '全部声部'
+        })
       } catch {
         //
       }
@@ -156,7 +163,7 @@ export default defineComponent({
               state.subjectStatus = !state.subjectStatus
             }}
           >
-            <div>全部声部</div>
+            <div>{state.subjectName}</div>
           </span>
         </div>
         {state.listState.dataShow ? (
@@ -212,7 +219,14 @@ export default defineComponent({
           <Picker
             columns={state.subjectList}
             onCancel={() => (state.subjectStatus = false)}
-            onConfirm={(val: any) => {}}
+            onConfirm={(val: any) => {
+              console.log(val)
+              const selectOptions = val.selectedOptions[0]
+              state.subjectName = selectOptions.subjectName
+              state.params.subjectId = selectOptions.subjectId
+              onRefresh()
+              state.subjectStatus = false
+            }}
             columnsFieldNames={{ text: 'subjectName', value: 'subjectId' }}
           />
         </Popup>

+ 24 - 3
src/school/practice-rewards/index.tsx

@@ -11,7 +11,9 @@ import { moneyFormat } from '@/helpers/utils'
 export default defineComponent({
   name: 'practice-rewards',
   setup() {
+    const seeType = localStorage.getItem('practice-rewards-see-type')
     const state = reactive({
+      seeType: seeType || 'see',
       list: [] as any,
       listState: {
         dataShow: true, // 判断是否有数据
@@ -76,9 +78,23 @@ export default defineComponent({
           <div class={styles.headerContainer}>
             <div class={styles.headerContent}>
               {/* closed-eye eye-o */}
-              <Icon class={styles.iconEye} name="eye-o" />
+              <Icon
+                class={styles.iconEye}
+                name={state.seeType === 'see' ? 'eye-o' : 'closed-eye'}
+                onClick={() => {
+                  if (state.seeType === 'see') {
+                    localStorage.setItem('practice-rewards-see-type', 'hide')
+                    state.seeType = 'hide'
+                  } else {
+                    localStorage.setItem('practice-rewards-see-type', 'see')
+                    state.seeType = 'see'
+                  }
+                }}
+              />
               <div class={styles.priceTitle}>待结算金额 (元)</div>
-              <div class={styles.priceCount}>{moneyFormat(state.statistics.waitSalary)}</div>
+              <div class={styles.priceCount}>
+                {state.seeType === 'see' ? moneyFormat(state.statistics.waitSalary) : '******'}
+              </div>
               <Progress
                 color="#fff"
                 trackColor="#E7441A"
@@ -87,7 +103,12 @@ export default defineComponent({
                 strokeWidth={8}
               />
               <div class={styles.countRewards}>
-                累计奖励 (元) :<span>{moneyFormat(state.statistics.totalTrainingSalary)}</span>
+                累计奖励 (元) :
+                <span>
+                  {state.seeType === 'see'
+                    ? moneyFormat(state.statistics.totalTrainingSalary)
+                    : '******'}
+                </span>
               </div>
             </div>
           </div>

+ 1 - 1
src/student/music-group/layout/auth.tsx

@@ -46,7 +46,7 @@ export default defineComponent({
       if (state.user.status === 'init' || state.user.status === 'error') {
         this.loading = true
         try {
-          const res = await request.get('/api-student/appLoginUser/getUserInfo', {
+          const res = await request.get('/api-student/user/getUserInfo', {
             initRequest: true, // 初始化接口
             requestType: 'form'
           })

+ 1 - 1
src/student/music-group/layout/login.tsx

@@ -158,7 +158,7 @@ export default defineComponent({
 
         setAuth(data.token_type + ' ' + data.access_token)
 
-        const userCash = await request.get('/api-student/appLoginUser/getUserInfo', {
+        const userCash = await request.get('/api-student/user/getUserInfo', {
           initRequest: true // 初始化接口
         })
         setLogin(userCash.data)

+ 1 - 1
src/views/layout/auth.tsx

@@ -45,7 +45,7 @@ export default defineComponent({
       if (state.user.status === 'init' || state.user.status === 'error') {
         this.loading = true
         try {
-          const res = await request.get(state.platformApi + '/appLoginUser/getUserInfo', {
+          const res = await request.get(state.platformApi + '/user/getUserInfo', {
             initRequest: true, // 初始化接口
             requestType: 'form',
             hideLoading: true

+ 1 - 1
src/views/layout/login.tsx

@@ -84,7 +84,7 @@ export default defineComponent({
 
         setAuth(data.token_type + ' ' + data.access_token)
 
-        const userCash = await request.get(state.platformApi + '/appLoginUser/getUserInfo', {
+        const userCash = await request.get(state.platformApi + '/user/getUserInfo', {
           initRequest: true // 初始化接口
         })
         // 初始化学校信息

+ 1 - 1
src/views/mine-orchestra/my-class/index.tsx

@@ -106,7 +106,7 @@ export default defineComponent({
                   <p class={styles.name}>学生人数</p>
                 </GridItem>
                 <GridItem>
-                  <p class={[styles.title]}>{item.totalCourseNum - item.completeCourseNum || 0}</p>
+                  <p class={[styles.title]}>{item.notStartCourseNum || 0}</p>
                   <p class={styles.name}>剩余课时</p>
                 </GridItem>
                 <GridItem>

Some files were not shown because too many files changed in this diff