Просмотр исходного кода

Merge branch 'master' of http://git.dayaedu.com/lex/orchestra-app

mo 2 лет назад
Родитель
Сommit
ab686a5a36
32 измененных файлов с 727 добавлено и 119 удалено
  1. 5 10
      package-lock.json
  2. 7 0
      src/router/routes-student.ts
  3. 3 0
      src/school/approval-manage/course-adjust.tsx
  4. 1 1
      src/school/companion-teacher/companion-detail.tsx
  5. 2 1
      src/school/companion-teacher/compontent/teacher.tsx
  6. 2 4
      src/school/companion-teacher/index.tsx
  7. 4 1
      src/school/manage-teacher/manage-detail.tsx
  8. 4 4
      src/school/orchestra/compontent/information.tsx
  9. 4 4
      src/school/orchestra/compontent/plan.tsx
  10. 1 1
      src/school/orchestra/modal/student-list.tsx
  11. 3 1
      src/school/orchestra/modal/teacher-list.tsx
  12. 5 4
      src/school/train-planning/component/standard/index.tsx
  13. 13 3
      src/school/train-planning/modal/calendar/index.tsx
  14. 19 1
      src/school/train-planning/modal/practice-class/index.tsx
  15. 1 1
      src/state.ts
  16. 7 7
      src/student/music-group/pre-apply/component/apply.tsx
  17. 142 3
      src/student/music-group/pre-apply/component/order.tsx
  18. 25 4
      src/student/music-group/pre-apply/component/payment.tsx
  19. 36 0
      src/student/music-group/pre-apply/index.module.less
  20. 22 8
      src/student/music-group/pre-apply/order-detail.tsx
  21. 2 1
      src/student/music-group/shop-address/address-operation.tsx
  22. 114 0
      src/student/my-orchestra/index.module.less
  23. 59 0
      src/student/my-orchestra/index.tsx
  24. 6 1
      src/student/payment-result/index.tsx
  25. 118 27
      src/student/trade-record/component/paid-list.tsx
  26. 0 1
      src/student/trade-record/component/refund-list.tsx
  27. 0 1
      src/student/trade-record/component/wait-pay.tsx
  28. 51 0
      src/student/trade-record/index.module.less
  29. 10 2
      src/student/trade-record/index.tsx
  30. 17 13
      src/views/courseList/index.tsx
  31. 25 6
      src/views/coursewarePlay/index.tsx
  32. 19 9
      src/views/lessonCourseware/index.tsx

+ 5 - 10
package-lock.json

@@ -11493,8 +11493,7 @@
       "version": "2.0.1",
       "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-2.0.1.tgz",
       "integrity": "sha512-wtdMnGVvys9K8tg+DxowU1ytTrdVveXr3LzdhaKakysgGXyrsfaeds2cDywtvujEASjWOwWL/OgWM+qoeM8Plg==",
-      "dev": true,
-      "requires": {}
+      "dev": true
     },
     "@vitejs/plugin-vue-jsx": {
       "version": "1.3.8",
@@ -11778,8 +11777,7 @@
       "version": "5.3.1",
       "resolved": "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz",
       "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==",
-      "dev": true,
-      "requires": {}
+      "dev": true
     },
     "aggregate-error": {
       "version": "3.1.0",
@@ -15093,8 +15091,7 @@
       "version": "6.0.0",
       "resolved": "https://registry.npmmirror.com/postcss-pxtorem/-/postcss-pxtorem-6.0.0.tgz",
       "integrity": "sha512-ZRXrD7MLLjLk2RNGV6UA4f5Y7gy+a/j1EqjAfp9NdcNYVjUMvg5HTYduTjSkKBkRkfqbg/iKrjMO70V4g1LZeg==",
-      "dev": true,
-      "requires": {}
+      "dev": true
     },
     "postcss-value-parser": {
       "version": "4.2.0",
@@ -15295,8 +15292,7 @@
     "qrcode.vue": {
       "version": "3.3.3",
       "resolved": "https://registry.npmmirror.com/qrcode.vue/-/qrcode.vue-3.3.3.tgz",
-      "integrity": "sha512-OsD4tQjIbxg/K6D5ZkWjBdYI9eg9K2i8qeYILdEAX5mdAydSAxV7xKmmZSP/hA12olLqEMZ9ryqDQrwa9jEMgw==",
-      "requires": {}
+      "integrity": "sha512-OsD4tQjIbxg/K6D5ZkWjBdYI9eg9K2i8qeYILdEAX5mdAydSAxV7xKmmZSP/hA12olLqEMZ9ryqDQrwa9jEMgw=="
     },
     "qs": {
       "version": "6.10.3",
@@ -16266,8 +16262,7 @@
     "vue-demi": {
       "version": "0.13.2",
       "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.13.2.tgz",
-      "integrity": "sha512-41ukrclEbMddAyP7PvxMSYqnOSzPV6r7GNnyTSKSCNTaz19GehxmTiXyP9kwHSUv2+Dr6hHqiUiF7L1VAw2KdQ==",
-      "requires": {}
+      "integrity": "sha512-41ukrclEbMddAyP7PvxMSYqnOSzPV6r7GNnyTSKSCNTaz19GehxmTiXyP9kwHSUv2+Dr6hHqiUiF7L1VAw2KdQ=="
     },
     "vue-echarts": {
       "version": "6.2.3",

+ 7 - 0
src/router/routes-student.ts

@@ -58,6 +58,13 @@ export default [
         meta: {
           title: '交易记录'
         }
+      }, {
+        path: '/my-orchestra',
+        name: 'my-orchestra',
+        component: () => import('@/student/my-orchestra/index'),
+        meta: {
+          title: '我的乐团'
+        }
       }
     ]
   },

+ 3 - 0
src/school/approval-manage/course-adjust.tsx

@@ -219,6 +219,9 @@ export default defineComponent({
 
                 forms.startTime = ''
               }}
+              onDestory={() => {
+                getList()
+              }}
               v-model:calendarDate={state.calendarDate}
             />
           </OPopup>

+ 1 - 1
src/school/companion-teacher/companion-detail.tsx

@@ -197,7 +197,7 @@ export default defineComponent({
           {state.classList.length <= 0 && <OEmpty btnStatus={false} tips="暂无班级" />}
         </CellGroup>
 
-        {state.detail.delFalg && (
+        {state.detail.id && !state.detail.delFlag && (
           <OSticky position="bottom">
             <div class={['btnGroup']} style={{ paddingLeft: '13px', paddingRight: '13px' }}>
               <Button type="primary" round block onClick={onDetail}>

+ 2 - 1
src/school/companion-teacher/compontent/teacher.tsx

@@ -34,7 +34,8 @@ export default defineComponent({
         const res = await request.post('/api-school/teacher/page', {
           data: {
             ...form.params,
-            schoolId: state.user.data.school.id
+            schoolId: state.user.data.school.id,
+            delFlag: false
           }
         })
         form.listState.loading = false

+ 2 - 4
src/school/companion-teacher/index.tsx

@@ -86,7 +86,6 @@ export default defineComponent({
     const getDetail = async (id: string | number) => {
       try {
         const res = await request.get('/api-school/schoolStaff/detail/' + id)
-        console.log(res, 'res')
         form.schoolName = res.data.schoolName
         form.schoolId = res.data.schoolId
         form.url =
@@ -203,8 +202,8 @@ export default defineComponent({
             immediateCheck={false}
           >
             {form.list.map((item: any) => (
-              <CellGroup inset style={{ marginBottom: '12px' }}>
-                <Cell center isLink class={styles.manageCell} onClick={() => onDetail(item)}>
+              <CellGroup inset style={{ marginBottom: '12px' }} onClick={() => onDetail(item)}>
+                <Cell center isLink class={styles.manageCell}>
                   {{
                     icon: () => (
                       <Image class={styles.img} src={item.avatar ? item.avatar : iconTeacher} />
@@ -320,7 +319,6 @@ export default defineComponent({
           v-model:show={form.showMessage}
           position="bottom"
           style={{ background: 'transparent' }}
-          safeAreaInsetBottom={true}
         >
           <div class={styles.codeContainer}>
             <div class={styles.codeBottom}>

+ 4 - 1
src/school/manage-teacher/manage-detail.tsx

@@ -74,7 +74,10 @@ export default defineComponent({
 
         <CellGroup inset class={styles.detailCellGroup}>
           <Cell title={'手机号码'} value={detail.value.nickname}></Cell>
-          <Cell title={'性别'} value={detail.value.gender ? '男' : '女'}></Cell>
+          <Cell
+            title={'性别'}
+            value={detail.value.gender == 1 ? '男' : detail.value.gender == 0 ? '女' : ''}
+          ></Cell>
         </CellGroup>
 
         {/* 判断是否有权限 */}

+ 4 - 4
src/school/orchestra/compontent/information.tsx

@@ -55,12 +55,12 @@ export default defineComponent({
       state.actionType = val.value
 
       if (val.value === 'up') {
-        state.params.startTime = dayjs().year() + '-03-01 00:00:00'
-        state.params.endTime = dayjs().year() + '-09-01 00:00:00'
+        state.params.startTime = state.currentData[0] + '-03-01 00:00:00'
+        state.params.endTime = state.currentData[0] + '-09-01 00:00:00'
       } else if (val.value === 'down') {
         console.log(dayjs().add(1, 'year'), 'dayjs().add(1, ')
-        state.params.startTime = dayjs().year() + '-09-01 00:00:00'
-        state.params.endTime = dayjs().add(1, 'year').year() + '-03-01 00:00:00'
+        state.params.startTime = state.currentData[0] + '-09-01 00:00:00'
+        state.params.endTime = Number(state.currentData[0]) + 1 + '-03-01 00:00:00'
       }
       onSearch()
     }

+ 4 - 4
src/school/orchestra/compontent/plan.tsx

@@ -51,12 +51,12 @@ export default defineComponent({
       state.actionType = val.value
 
       if (val.value === 'up') {
-        state.params.startTime = dayjs().year() + '-03-01 00:00:00'
-        state.params.endTime = dayjs().year() + '-09-01 00:00:00'
+        state.params.startTime = state.currentData[0] + '-03-01 00:00:00'
+        state.params.endTime = state.currentData[0] + '-09-01 00:00:00'
       } else if (val.value === 'down') {
         console.log(dayjs().add(1, 'year'), 'dayjs().add(1, ')
-        state.params.startTime = dayjs().year() + '-09-01 00:00:00'
-        state.params.endTime = dayjs().add(1, 'year').year() + '-03-01 00:00:00'
+        state.params.startTime = state.currentData[0] + '-09-01 00:00:00'
+        state.params.endTime = Number(state.currentData[0]) + 1 + '-03-01 00:00:00'
       }
       onSearch()
     }

+ 1 - 1
src/school/orchestra/modal/student-list.tsx

@@ -100,7 +100,7 @@ export default defineComponent({
             ...state.params,
             subjectId: props.subjectId,
             orchestraId: state.orchestra.id,
-            classId: state.class.id
+            currentGradeNum: state.class.id
           }
         })
         state.listState.loading = false

+ 3 - 1
src/school/orchestra/modal/teacher-list.tsx

@@ -59,7 +59,8 @@ export default defineComponent({
         const res = await request.post('/api-school/teacher/page', {
           data: {
             ...forms.params,
-            schoolId: state.user.data.school.id
+            schoolId: state.user.data.school.id,
+            delFlag: false
           }
         })
         forms.listState.loading = false
@@ -104,6 +105,7 @@ export default defineComponent({
     watch(
       () => props.courseType,
       () => {
+        console.log(props.courseType, 'course')
         forms.params.courseType = props.courseType
         onSearch()
       }

+ 5 - 4
src/school/train-planning/component/standard/index.tsx

@@ -273,11 +273,9 @@ export default defineComponent({
             prevMonth={(date: Date) => getList(date)}
             onSelect={(date: any) => {
               forms.calendarStatus = false
-              console.log(date, 'data')
-              if (forms.trainStartDate == date) {
-                console.log('true ------')
-              }
+
               forms.trainStartDate = date
+              forms.trainStartTime = null
 
               const days = dayjs(date).day()
               const selectDays = weekdays[days === 0 ? 6 : days - 1]
@@ -292,6 +290,9 @@ export default defineComponent({
                 }
               })
             }}
+            onDestory={() => {
+              getList()
+            }}
             v-model:calendarDate={forms.calendarDate}
           />
         </OPopup>

+ 13 - 3
src/school/train-planning/modal/calendar/index.tsx

@@ -47,6 +47,13 @@ export default defineComponent({
     selectDay: {
       type: Function,
       default: (obj: any) => {}
+    },
+    /**
+     * 销毁时
+     * */
+    onDestory: {
+      type: Function,
+      default: () => {}
     }
   },
   data() {
@@ -80,14 +87,14 @@ export default defineComponent({
   mounted() {
     // 初始化标题和最大显示日期
     this.subtitle = dayjs(this.calendarDate || new Date())
-      .add(1, 'day')
+      // .add(1, 'day')
       .format('YYYY年MM月')
     this.maxDate = dayjs(this.calendarDate || new Date())
-      .add(1, 'day')
+      // .add(1, 'day')
       .endOf('month')
       .toDate()
     this.minDate = dayjs(this.calendarDate || new Date())
-      .add(1, 'day')
+      // .add(1, 'day')
       .toDate()
 
     console.log(this.list, 'this.list')
@@ -150,6 +157,9 @@ export default defineComponent({
       this.$emit('update:calendarDate', dayjs(date).format('YYYY-MM-DD'))
     }
   },
+  unmounted() {
+    this.onDestory()
+  },
   render() {
     return (
       <div class={styles.calendarContainer}>

+ 19 - 1
src/school/train-planning/modal/practice-class/index.tsx

@@ -15,7 +15,7 @@ import {
   Popup,
   Tag
 } from 'vant'
-import { defineComponent, onMounted, reactive } from 'vue'
+import { defineComponent, onMounted, reactive, watch } from 'vue'
 import styles from './index.module.less'
 import iconTeacher from '@common/images/icon_teacher.png'
 import { state as baseState } from '@/state'
@@ -37,6 +37,7 @@ export default defineComponent({
       orchestraId: null as any,
       orchestraName: null as any,
       orchestraList: [] as any,
+      isClick: false,
       list: [] as any,
       listState: {
         dataShow: true, // 判断是否有数据
@@ -85,6 +86,8 @@ export default defineComponent({
     const getList = async () => {
       // 查询没有设置指导老师的班级
       try {
+        if (forms.isClick) return
+        forms.isClick = true
         const { data } = await request.post('/api-school/classGroup/page', {
           data: {
             page: 1,
@@ -95,6 +98,7 @@ export default defineComponent({
             // orchestraType: 'DELIVERY'
           }
         })
+        forms.isClick = false
         // 班级数据
         forms.listState.loading = false
         const result = data || {}
@@ -109,9 +113,23 @@ export default defineComponent({
       } catch {
         forms.listState.dataShow = false
         forms.listState.finished = true
+        forms.isClick = false
       }
     }
 
+    // 监听班级类型变化
+    watch(
+      () => props.classType,
+      () => {
+        forms.params.page = 1
+        forms.list = []
+        forms.listState.dataShow = true // 判断是否有数据
+        forms.listState.loading = false
+        forms.listState.finished = false
+        getList()
+      }
+    )
+
     const onSelect = (type: string) => {
       forms.checkboxRefs[type].toggle()
     }

+ 1 - 1
src/state.ts

@@ -15,7 +15,7 @@ export const state = reactive({
     TEACHER: 'jmedu-teacher',
     SCHOOL: 'jmedu-school'
   },
-  platformApi: '/api-student' as '/api-student' | '/api-teacher' | '/api-school',
+  platformApi: '/api-teacher' as '/api-student' | '/api-teacher' | '/api-school',
   version: '', // 版本号 例如: 1.0.0
   ossUploadUrl: 'https://ks3-cn-beijing.ksyuncs.com/',
   musicCertStatus: false as boolean, // 是否音乐认证

+ 7 - 7
src/student/music-group/pre-apply/component/apply.tsx

@@ -54,7 +54,7 @@ export default defineComponent({
     })
     const forms = reactive({
       username: null,
-      sex: null,
+      sex: null as any,
       currentGrade: null,
       currentGradeTxt: null, // 年级编号
       currentClass: '', // 班级
@@ -72,6 +72,8 @@ export default defineComponent({
           '/api-student/orchestraRegister/register/' + route.query.id
         )
         const detail = data || {}
+
+        console.log(detail, 'detail')
         state.detail = detail
 
         const grade: any = state.currentGrade.find((item: any) => item.value == detail.currentGrade)
@@ -80,7 +82,7 @@ export default defineComponent({
           (item: any) => item.value == detail.registerSubjectId
         )
         forms.username = detail.username
-        forms.sex = detail.sex
+        forms.sex = detail.sex ? 1 : 0
         forms.currentGrade = detail.currentGrade
         forms.currentGradeTxt = grade.text
         forms.currentClass = detail.currentClass
@@ -162,15 +164,13 @@ export default defineComponent({
       }
     }
 
-    onMounted(() => {
-      studentRegister()
-
-      getSubjects()
-
+    onMounted(async () => {
+      await getSubjects()
       // 判断学年制
       if (props.schoolSystem === 'sixYearSystem') {
         state.currentGrade.push({ text: '六年级', value: 6 })
       }
+      await studentRegister()
     })
     return () => (
       <>

+ 142 - 3
src/student/music-group/pre-apply/component/order.tsx

@@ -1,7 +1,20 @@
 import OEmpty from '@/components/o-empty'
 import { orderStatus } from '@/constant'
 import { moneyFormat } from '@/helpers/utils'
-import { Button, Cell, CellGroup, Grid, GridItem, Image, List } from 'vant'
+import {
+  Button,
+  Cell,
+  CellGroup,
+  Field,
+  Grid,
+  GridItem,
+  Image,
+  List,
+  Popup,
+  Radio,
+  RadioGroup,
+  showToast
+} from 'vant'
 import { defineComponent, onMounted, reactive, ref } from 'vue'
 import { useRoute } from 'vue-router'
 import request from '../../request-music'
@@ -23,7 +36,12 @@ export default defineComponent({
       params: {
         page: 1,
         rows: 20
-      }
+      },
+      resionList: [] as any,
+      refundStatus: false,
+      resion: null,
+      refundSelect: {} as any,
+      checked: null as any
     })
 
     // userPaymentOrder/page
@@ -34,7 +52,8 @@ export default defineComponent({
         const res = await request.post('/api-student/userPaymentOrder/page', {
           data: {
             ...form.params,
-            bizId: route.query.id
+            bizId: route.query.id,
+            goodsQuery: true
           }
         })
         form.listState.loading = false
@@ -61,7 +80,58 @@ export default defineComponent({
       }
     }
 
+    const getDefaultParams = async () => {
+      try {
+        const { data } = await request.get('/api-student/sysParamConfig/queryByParamName', {
+          params: {
+            paramName: 'refund_reason'
+          }
+        })
+        const temp = data.paramValue.split('\n') || []
+        temp.forEach((item: any, index: number) => {
+          form.resionList.push({
+            text: item,
+            value: index + 1
+          })
+        })
+        form.resionList.push({
+          text: '其它原因',
+          value: 999
+        })
+        console.log(form.resionList, 'resionList')
+      } catch {
+        //
+      }
+    }
+
+    // 确认退费
+    const onConfirmRefund = async () => {
+      try {
+        const status = form.checked === 999 && !form.resion
+        console.log(form.checked)
+        if (!form.checked) {
+          showToast('请选择原因')
+          return
+        } else if (status) {
+          showToast('请输入原因')
+          return
+        }
+
+        const refundReason = form.resionList.find((item: any) => item.value === form.checked)
+
+        await request.post('/api-student/userPaymentOrder/refundPayment', {
+          data: {
+            merOrderNo: form.refundSelect.orderNo,
+            refundReason: refundReason.text
+          }
+        })
+      } catch {
+        //
+      }
+    }
+
     onMounted(() => {
+      getDefaultParams()
       getList()
     })
 
@@ -121,6 +191,17 @@ export default defineComponent({
                             </Button>
                           </>
                         )} */}
+                        {/* 订单成功 订单金额大于0 */}
+                        {item.status === 'PAID' && item.paymentCashAmount > 0 && (
+                          <Button
+                            round
+                            plain
+                            color="#AAAAAA"
+                            onClick={() => (form.refundStatus = true)}
+                          >
+                            申请退款
+                          </Button>
+                        )}
                       </div>
                     )
                   }}
@@ -131,6 +212,64 @@ export default defineComponent({
         ) : (
           <OEmpty btnStatus={false} classImgSize="SMALL" tips="暂无订单" />
         )}
+
+        <Popup v-model:show={form.refundStatus} round style={{ width: '90%' }}>
+          <div class={styles.container}>
+            <div class={styles.dialogTitle}>
+              <i></i>
+              申请退款
+            </div>
+
+            <div class={styles.refundContent}>
+              <div class={styles.tips}>
+                您将要发起退款,退款需承担千分之六的手续费,确认退款后款项将原路返还到您的付款账户中。
+              </div>
+
+              <div class={styles.refundTitle}>
+                <span>*</span>请选择您的退款原因
+              </div>
+
+              <RadioGroup v-model={form.checked}>
+                {form.resionList &&
+                  form.resionList.map((item: any) => (
+                    <Cell style="padding: 16px 0;" onClick={() => (form.checked = item.value)}>
+                      {{
+                        icon: () => <Radio name={item.value} />,
+                        title: () => <span style={'padding-left: 6px'}>{item.text}</span>
+                      }}
+                    </Cell>
+                  ))}
+              </RadioGroup>
+              {form.checked === 999 && (
+                <Field
+                  class={styles.phoneName}
+                  v-model={form.resion}
+                  placeholder="请输入原因"
+                  maxlength={15}
+                  type="textarea"
+                  rows={2}
+                />
+              )}
+            </div>
+
+            <div class={['van-hairline--top van-dialog__footer']}>
+              <Button
+                onClick={onConfirmRefund}
+                class={['van-button van-button--default van-button--large van-dialog__cancel']}
+              >
+                确认退款
+              </Button>
+              <Button
+                onClick={() => (form.refundStatus = false)}
+                class={[
+                  'van-button van-button--default van-button--large van-dialog__confirm van-hairline--left'
+                ]}
+              >
+                取消
+              </Button>
+            </div>
+          </div>
+        </Popup>
       </div>
     )
   }

+ 25 - 4
src/student/music-group/pre-apply/component/payment.tsx

@@ -45,7 +45,6 @@ export default defineComponent({
     const paymentOrderUnpaid = async () => {
       try {
         const { data } = await request.get('/api-student/userPaymentOrder/unpaid')
-        console.log(data, 'data')
         // 判断是否有待支付订单
         if (data.id) {
           showConfirmDialog({
@@ -106,7 +105,7 @@ export default defineComponent({
           state.details = details
 
           // 默认选中所有的
-          if (!state.paymentOrderDetails.includes(item.goodsType)) {
+          if (!state.paymentOrderDetails.includes(item.goodsType) && item.goodsType !== 'REPAIR') {
             state.check.push(item.goodsId)
           }
         })
@@ -119,7 +118,6 @@ export default defineComponent({
 
     const onSelect = (type: string) => {
       state.checkboxRefs[type].toggle()
-
       calcPrice()
     }
 
@@ -192,8 +190,10 @@ export default defineComponent({
         calcPrice()
         const params: any = [] // 支付参数
         const details = state.details
+
+        let checkInstruments = false // 是否选择了乐器
         details.forEach((item: any) => {
-          // 是否选中
+          // 是否选中 并且没有购买过
           if (
             state.check.includes(item.goodsId) &&
             !state.paymentOrderDetails.includes(item.goodsType)
@@ -206,7 +206,28 @@ export default defineComponent({
               paymentCouponAmount: 0 // 优惠券金额
             })
           }
+          // 判断是否是乐器
+          if (
+            item.goodsType === 'INSTRUMENTS' &&
+            state.check.includes(item.goodsId) &&
+            !state.paymentOrderDetails.includes(item.goodsType)
+          ) {
+            checkInstruments = true
+          }
         })
+
+        // 为了处理,商品和乐器保养做关联
+        const repaire = state.repaireInfo
+        if (checkInstruments && repaire.goodsId) {
+          params.push({
+            goodsId: repaire.goodsId,
+            goodsNum: 1,
+            goodsType: repaire.goodsType,
+            paymentCashAmount: repaire.currentPrice, // 现金支付金额
+            paymentCouponAmount: 0 // 优惠券金额
+          })
+        }
+
         console.log({
           bizId: route.query.id, // 乐团编号
           orderType: 'ORCHESTRA',

+ 36 - 0
src/student/music-group/pre-apply/index.module.less

@@ -291,3 +291,39 @@
   line-height: 25px;
   padding-bottom: 12px;
 }
+
+.dialogRefund {
+  padding: 20px 0 15px 25px;
+}
+.refundContent {
+  padding: 0 20px 25px;
+  .tips {
+    font-size: 15px;
+    color: #333333;
+    line-height: 21px;
+  }
+}
+.container {
+  :global {
+    .van-button {
+      font-size: 18px;
+      font-weight: 500;
+    }
+  }
+}
+
+.refundTitle {
+  padding-top: 25px;
+  font-size: 16px;
+  font-weight: 600;
+  color: #333333;
+  line-height: 22px;
+  span {
+    color: #f44541;
+  }
+}
+
+.phoneName {
+  background: #f2f2f2;
+  border-radius: 6px;
+}

+ 22 - 8
src/student/music-group/pre-apply/order-detail.tsx

@@ -65,13 +65,18 @@ export default defineComponent({
         // CLOSED: '订单关闭',
         // REFUNDING: '退款中',
         // REFUNDED: '已退款'
-        if (data.status !== 'WAIT_PAY') {
+        if (data.status !== 'WAIT_PAY' && data.status !== 'PAYING') {
           // status
           showConfirmDialog({
             message: '订单处理中,请稍等',
             showCancelButton: false
           }).then(() => {
-            router.back()
+            router.replace({
+              path: '/payment-result',
+              query: {
+                orderNo: state.orderNo
+              }
+            })
           })
         }
       } catch {
@@ -190,7 +195,7 @@ export default defineComponent({
       }
 
       try {
-        await request.post('/api-student/userPaymentOrder/updateReceiveAddress', {
+        const { data } = await request.post('/api-student/userPaymentOrder/updateReceiveAddress', {
           data: {
             orderNo: state.orderNo,
             orderType: 'ORCHESTRA',
@@ -198,12 +203,21 @@ export default defineComponent({
           }
         })
 
-        const pt = state.config.paymentChannel
-        // 判断是否有支付方式
-        if (pt) {
-          beforeSubmit()
+        if (data.status === 'PAID') {
+          router.replace({
+            path: '/payment-result',
+            query: {
+              orderNo: state.orderNo
+            }
+          })
         } else {
-          state.paymentStatus = true
+          const pt = state.config.paymentChannel
+          // 判断是否有支付方式
+          if (pt) {
+            beforeSubmit()
+          } else {
+            state.paymentStatus = true
+          }
         }
       } catch {
         //

+ 2 - 1
src/student/music-group/shop-address/address-operation.tsx

@@ -124,7 +124,7 @@ export default defineComponent({
           <Field label="收货人" placeholder="请输入收货人姓名" v-model={state.name} />
           <Field
             label="手机号"
-            placeholder="请输入收货人手机号"
+            placeholder="请输入收货人手机号"
             v-model={state.phoneNumber}
             maxlength={11}
             formatter={onFormatterInt}
@@ -172,6 +172,7 @@ export default defineComponent({
               console.log(val, 'val')
               const selectedOptions = val.selectedOptions || []
               // 因为有的只
+              state.pcrStr = ''
               if (selectedOptions.length === 2) {
                 selectedOptions.forEach((item: any, index: number) => {
                   state.pcrStr += item.name

+ 114 - 0
src/student/my-orchestra/index.module.less

@@ -0,0 +1,114 @@
+.myOrchestra {
+  :global {
+    .van-nav-bar__right {
+      color: var(--van-primary-color);
+    }
+  }
+
+  .gridContainer {
+    margin: 12px 13px 12px;
+
+    border-radius: 10px;
+    overflow: hidden;
+    // background: #ffffff;
+
+    .title {
+      font-size: 26px;
+      font-weight: bold;
+      color: #333;
+      i {
+        font-style: normal;
+        font-size: 12px;
+        color: #333333;
+      }
+    }
+    .red {
+      color: #f67146;
+    }
+    .name {
+      padding-top: 8px;
+      font-size: 12px;
+      color: #777777;
+    }
+  }
+
+  .gridClass {
+    .img {
+      width: 40px;
+      height: 40px;
+      margin-right: 12px;
+      border-radius: 50%;
+      overflow: hidden;
+    }
+    .teacherName {
+      display: flex;
+      align-items: center;
+      font-size: 16px;
+      font-weight: 600;
+      color: #333333;
+      line-height: 22px;
+      :global {
+        .van-tag {
+          margin-left: 6px;
+        }
+      }
+    }
+    .classCheckbox {
+      display: flex;
+      justify-content: flex-end;
+    }
+    .orchestraName {
+      padding-top: 3px;
+      font-size: 12px;
+      color: #777777;
+      line-height: 17px;
+    }
+    .title {
+      font-size: 24px;
+    }
+
+    .className {
+      padding: 17px 15px 0;
+      font-size: 16px;
+      font-weight: 500;
+      color: #333333;
+      line-height: 22px;
+      .line {
+        display: inline-block;
+        width: 4px;
+        height: 12px;
+        background: #ff8057;
+        border-radius: 3px;
+        margin-right: 6px;
+      }
+    }
+
+    :global {
+      .van-grid-item {
+        &:after {
+          content: ' ';
+          position: absolute;
+          top: 50%;
+          right: 0;
+          margin-top: -10px;
+          width: 1px;
+          height: 20px;
+          background: #eaeaea;
+          border-radius: 1px;
+        }
+
+        &:last-child {
+          &::after {
+            display: none;
+          }
+        }
+      }
+    }
+  }
+
+  // .classCellGroup {
+  //   margin-bottom: 12px;
+  //   border-radius: 10px;
+  //   overflow: hidden;
+  // }
+}

+ 59 - 0
src/student/my-orchestra/index.tsx

@@ -0,0 +1,59 @@
+import OHeader from '@/components/o-header'
+import { Cell, CellGroup, Grid, GridItem, Image, Tag } from 'vant'
+import { defineComponent } from 'vue'
+import { useRouter } from 'vue-router'
+import styles from './index.module.less'
+import iconTeacher from '@common/images/icon_teacher.png'
+
+export default defineComponent({
+  name: 'my-orchestra',
+  setup() {
+    const router = useRouter()
+    return () => (
+      <div class={styles.myOrchestra}>
+        <OHeader
+          rightText="申请退团"
+          onClickRight={() => {
+            console.log('111')
+          }}
+        />
+
+        <div class={[styles.gridContainer, styles.gridClass]}>
+          {[1, 2, 3, 4, 5].map((item: any) => (
+            <CellGroup class={styles.classCellGroup}>
+              <Cell center titleStyle={{ flex: '0 auto' }} valueClass={styles.classCheckbox}>
+                {{
+                  icon: () => <Image src={iconTeacher} class={styles.img} />,
+                  title: () => (
+                    <div class={styles.content}>
+                      <div class={styles.teacherName}>
+                        {item.teacherName} <Tag type="primary">{item.name}</Tag>
+                      </div>
+                      <div class={styles.orchestraName}>{item.orchestraName}</div>
+                    </div>
+                  )
+                }}
+              </Cell>
+              <Grid border={false} columnNum={3}>
+                <GridItem>
+                  <p class={styles.title}>{item.preStudentNum}</p>
+                  <p class={styles.name}>学生人数</p>
+                </GridItem>
+                <GridItem>
+                  <p class={[styles.title]}>
+                    {item.courseScheduleNum - item.completeCourseScheduleNum}
+                  </p>
+                  <p class={styles.name}>剩余课时</p>
+                </GridItem>
+                <GridItem>
+                  <p class={styles.title}>{item.courseScheduleNum}</p>
+                  <p class={styles.name}>总课时</p>
+                </GridItem>
+              </Grid>
+            </CellGroup>
+          ))}
+        </div>
+      </div>
+    )
+  }
+})

+ 6 - 1
src/student/payment-result/index.tsx

@@ -39,6 +39,11 @@ export default defineComponent({
       }
     }
 
+    const onRefund = async () => {
+      // try {
+      // } catch {}
+    }
+
     const formatImg = (type: any) => {
       const template = {
         WAIT_PAY: iconTradeing,
@@ -108,7 +113,7 @@ export default defineComponent({
 
         {state.orders.status === 'REFUNDING' && browser().isApp && (
           <div class={'btnGroup'}>
-            <Button type="primary" round size="large" block>
+            <Button type="primary" round size="large" block onClick={onRefund}>
               撤销退费
             </Button>
           </div>

+ 118 - 27
src/student/trade-record/component/paid-list.tsx

@@ -5,11 +5,15 @@ import {
   CellGroup,
   DatePicker,
   Dialog,
+  Field,
   Icon,
   Image,
   List,
   Picker,
   Popup,
+  Radio,
+  RadioGroup,
+  showToast,
   Sticky
 } from 'vant'
 import { defineComponent, onMounted, reactive } from 'vue'
@@ -21,6 +25,7 @@ import { orderStatus, orderType } from '@/constant'
 import { moneyFormat } from '@/helpers/utils'
 import ODialog from '@/components/o-dialog'
 import { forms } from '@/school/train-planning/create'
+import { useRouter } from 'vue-router'
 
 export default defineComponent({
   name: 'wait_pay',
@@ -31,6 +36,7 @@ export default defineComponent({
     }
   },
   setup(props) {
+    const router = useRouter()
     const form = reactive({
       isClick: false,
       timeShow: false,
@@ -50,7 +56,10 @@ export default defineComponent({
         page: 1,
         rows: 20
       },
-      refundStatus: false
+      refundStatus: false,
+      resion: null,
+      refundSelect: {} as any,
+      checked: null as any
     })
 
     // WAIT_PAY: '待支付',
@@ -117,21 +126,63 @@ export default defineComponent({
             paramName: 'refund_reason'
           }
         })
-
-        form.resionList = data.paramValue.split('\n')
-        form.resionList.push('其它')
+        const temp = data.paramValue.split('\n') || []
+        temp.forEach((item: any, index: number) => {
+          form.resionList.push({
+            text: item,
+            value: index + 1
+          })
+        })
+        form.resionList.push({
+          text: '其它原因',
+          value: 999
+        })
         console.log(form.resionList, 'resionList')
       } catch {
         //
       }
     }
 
+    // 确认退费
+    const onConfirmRefund = async () => {
+      try {
+        const status = form.checked === 999 && !form.resion
+        console.log(form.checked)
+        if (!form.checked) {
+          showToast('请选择原因')
+          return
+        } else if (status) {
+          showToast('请输入原因')
+          return
+        }
+
+        const refundReason = form.resionList.find((item: any) => item.value === form.checked)
+
+        await request.post('/api-student/userPaymentOrder/refundPayment', {
+          data: {
+            merOrderNo: form.refundSelect.orderNo,
+            refundReason: refundReason.text
+          }
+        })
+      } catch {
+        //
+      }
+    }
+
+    const onDetails = (item: any) => {
+      router.push({
+        path: 'payment-result',
+        query: {
+          orderNo: item.orderNo
+        }
+      })
+    }
+
     onMounted(() => {
       getList()
       getDefaultParams()
 
       Object.keys(orderType).forEach((key) => {
-        console.log(key)
         form.typeArray.push({
           text: orderType[key],
           value: key
@@ -166,7 +217,7 @@ export default defineComponent({
             immediateCheck={false}
           >
             {form.list.map((item: any) => (
-              <CellGroup inset class={styles.cellGroup}>
+              <CellGroup inset class={styles.cellGroup} onClick={() => onDetails(item)}>
                 <Cell center titleClass={styles.times}>
                   {{
                     title: () => <span class={styles.times}>{item.createTime}</span>,
@@ -192,7 +243,11 @@ export default defineComponent({
                         <Button
                           block
                           class={styles.refundBtn}
-                          onClick={() => (form.refundStatus = true)}
+                          onClick={(e: any) => {
+                            e.stopPropagation()
+                            form.refundSelect = item
+                            form.refundStatus = true
+                          }}
                         >
                           申请退费
                         </Button>
@@ -231,27 +286,63 @@ export default defineComponent({
           />
         </Popup>
 
-        <Dialog
-          v-model:show={form.refundStatus}
-          message={
-            '您将要发起退款,退款需承担千分之六的手续费,确认退款后款项将原路返还到您的付款账户中。'
-          }
-          messageAlign="left"
-          confirmButtonText="取消"
-          cancelButtonText="确认退款"
-          showCancelButton
-          onConfirm={() => (form.refundStatus = false)}
-          onCancel={() => {}}
-        >
-          {{
-            title: () => (
-              <div class={styles.dialogTitle}>
-                <i></i>
-                申请退款
+        <Popup v-model:show={form.refundStatus} round style={{ width: '90%' }}>
+          <div class={styles.container}>
+            <div class={styles.dialogTitle}>
+              <i></i>
+              申请退款
+            </div>
+
+            <div class={styles.refundContent}>
+              <div class={styles.tips}>
+                您将要发起退款,退款需承担千分之六的手续费,确认退款后款项将原路返还到您的付款账户中。
               </div>
-            )
-          }}
-        </Dialog>
+
+              <div class={styles.refundTitle}>
+                <span>*</span>请选择您的退款原因
+              </div>
+
+              <RadioGroup v-model={form.checked}>
+                {form.resionList &&
+                  form.resionList.map((item: any) => (
+                    <Cell style="padding: 16px 0;" onClick={() => (form.checked = item.value)}>
+                      {{
+                        icon: () => <Radio name={item.value} />,
+                        title: () => <span style={'padding-left: 6px'}>{item.text}</span>
+                      }}
+                    </Cell>
+                  ))}
+              </RadioGroup>
+              {form.checked === 999 && (
+                <Field
+                  class={styles.phoneName}
+                  v-model={form.resion}
+                  placeholder="请输入原因"
+                  maxlength={15}
+                  type="textarea"
+                  rows={2}
+                />
+              )}
+            </div>
+
+            <div class={['van-hairline--top van-dialog__footer']}>
+              <Button
+                onClick={onConfirmRefund}
+                class={['van-button van-button--default van-button--large van-dialog__cancel']}
+              >
+                确认退款
+              </Button>
+              <Button
+                onClick={() => (form.refundStatus = false)}
+                class={[
+                  'van-button van-button--default van-button--large van-dialog__confirm van-hairline--left'
+                ]}
+              >
+                取消
+              </Button>
+            </div>
+          </div>
+        </Popup>
       </>
     )
   }

+ 0 - 1
src/student/trade-record/component/refund-list.tsx

@@ -89,7 +89,6 @@ export default defineComponent({
       getList()
 
       Object.keys(orderType).forEach((key) => {
-        console.log(key)
         form.typeArray.push({
           text: orderType[key],
           value: key

+ 0 - 1
src/student/trade-record/component/wait-pay.tsx

@@ -119,7 +119,6 @@ export default defineComponent({
       getList()
 
       Object.keys(orderType).forEach((key) => {
-        console.log(key)
         form.typeArray.push({
           text: orderType[key],
           value: key

+ 51 - 0
src/student/trade-record/index.module.less

@@ -74,3 +74,54 @@
     }
   }
 }
+
+.dialogTitle {
+  i {
+    display: inline-block;
+    width: 4px;
+    height: 14px;
+    background: #ff8057;
+    border-radius: 2px;
+    margin-right: 6px;
+  }
+
+  text-align: left;
+  font-size: 18px;
+  font-weight: 500;
+  color: #333333;
+  line-height: 25px;
+  padding: 20px 0 15px 25px;
+}
+
+.refundContent {
+  padding: 0 20px 25px;
+  .tips {
+    font-size: 15px;
+    color: #333333;
+    line-height: 21px;
+  }
+}
+.container {
+  :global {
+    .van-button {
+      font-size: 18px;
+      font-weight: 500;
+    }
+  }
+}
+
+.refundTitle {
+  padding-top: 25px;
+  font-size: 16px;
+  font-weight: 600;
+  color: #333333;
+  line-height: 22px;
+  span {
+    color: #f44541;
+  }
+}
+
+.phoneName {
+  background: #f2f2f2;
+  border-radius: 6px;
+}

+ 10 - 2
src/student/trade-record/index.tsx

@@ -10,8 +10,9 @@ import styles from './index.module.less'
 export default defineComponent({
   name: 'trade-record',
   setup() {
+    const tabs = sessionStorage.getItem('tradeRecordTabs')
     const state = reactive({
-      tabValue: 'paid' as 'wait_pay' | 'paid' | 'refund',
+      tabValue: (tabs || 'wait_pay') as 'wait_pay' | 'paid' | 'refund',
       height: 50
     })
     const tabsRef = ref()
@@ -24,7 +25,14 @@ export default defineComponent({
       <div class={styles.tradeRecord}>
         <OSticky position="top">
           <div ref={tabsRef}>
-            <Tabs lineWidth={20} lineHeight={4} v-model:active={state.tabValue}>
+            <Tabs
+              lineWidth={20}
+              lineHeight={4}
+              v-model:active={state.tabValue}
+              onChange={(val: any) => {
+                sessionStorage.setItem('tradeRecordTabs', val)
+              }}
+            >
               <Tab title="待完成" name="wait_pay"></Tab>
               <Tab title="已完成" name="paid"></Tab>
               <Tab title="退费" name="refund"></Tab>

+ 17 - 13
src/views/courseList/index.tsx

@@ -1,28 +1,25 @@
 import request from '@/helpers/request'
 import { state } from '@/state'
-import { Grid, GridItem, Icon } from 'vant'
+import { Empty, Grid, GridItem, Icon } from 'vant'
 import { defineComponent, onMounted, reactive } from 'vue'
 import styles from './index.module.less'
 import iconLook from './image/look.svg'
-import { useRoute } from 'vue-router'
+import { useRoute, useRouter } from 'vue-router'
 export default defineComponent({
   name: 'lessonCourseware',
   setup() {
     const route = useRoute()
+    const router = useRouter()
     const data = reactive({
       list: [] as any
     })
     const getList = async () => {
       try {
-        const res: any = await request.post(state.platformApi + '/lessonCoursewareDetail/page', {
-          data: {
-            lessonCoursewareId: route.query.id ? '1607562917531938817' : '1607562917531938817',
-            page: 1,
-            rows: 1000
-          }
-        })
-        if (Array.isArray(res?.data?.rows)) {
-          data.list = res.data.rows
+        const res: any = await request.post(
+          state.platformApi + '/courseSchedule/myCoursewareDetail/' + route.query.id
+        )
+        if (Array.isArray(res?.data)) {
+          data.list = res.data
         }
       } catch (error) {}
     }
@@ -34,6 +31,12 @@ export default defineComponent({
       if (route.query.code === 'select') {
         console.log('选择课时')
       }
+      router.push({
+        path: '/coursewarePlay',
+        query: {
+          id: item.lessonCoursewareDetailId
+        }
+      })
     }
     return () => (
       <div style={{ paddingTop: '14px' }}>
@@ -52,14 +55,14 @@ export default defineComponent({
                 >
                   {/* <img src={item.coverImg} class={styles.cover} /> */}
                   <div class={styles.title}>
-                    <div>{item.name}</div>
+                    <div>{item.coursewareDetailName}</div>
                     <div>已使用 1 次</div>
                   </div>
                   <div class={styles.num}>
                     查看
                     <Icon name="play-circle-o" />
                   </div>
-                  {item.delFlag && (
+                  {item.unlock && (
                     <div class={styles.look}>
                       <Icon name={iconLook} /> 未解锁
                     </div>
@@ -69,6 +72,7 @@ export default defineComponent({
             )
           })}
         </Grid>
+        {!data.list.length && <Empty description="空空如也" />}
       </div>
     )
   }

+ 25 - 6
src/views/coursewarePlay/index.tsx

@@ -4,17 +4,33 @@ import iconBack from './image/back.svg'
 import styles from './index.module.less'
 import Plyr from 'plyr'
 import 'plyr/dist/plyr.css'
+import request from '@/helpers/request'
+import { state } from '@/state'
+import { useRoute } from 'vue-router'
 
 export default defineComponent({
   name: 'CoursewarePlay',
   setup() {
+    const route = useRoute()
+    const data = reactive({
+      detail: null
+    })
+    const getDetail = async () => {
+      try {
+        const res: any = await request.get(state.platformApi + `/lessonCoursewareDetail/detail/${route.query.id}`)
+        if (Array.isArray(res?.data)) {
+          data.detail = res.data
+        }
+      } catch (error) {}
+    }
     onMounted(() => {
+      getDetail()
       const nodeList = document.querySelectorAll('.player')
       console.log('🚀 ~ nodeList', nodeList)
-    //   const player = Plyr.setup('.player', {
-    //     debug: false,
-    //     ratio: '16:9'
-    //   })
+      //   const player = Plyr.setup('.player', {
+      //     debug: false,
+      //     ratio: '16:9'
+      //   })
       const player = new Plyr('#player1', {
         autoplay: true
       })
@@ -23,9 +39,12 @@ export default defineComponent({
       }, 1000)
       console.log('🚀 ~ player', player)
     })
+    const goback = () => {
+      history.go(-1)
+    }
     return () => (
       <div class={styles.coursewarePlay}>
-        <div class={styles.backBtn}>
+        <div class={styles.backBtn} onClick={() => goback()}>
           <Icon name={iconBack} />
           返回
         </div>
@@ -42,7 +61,7 @@ export default defineComponent({
         <Swipe vertical>
           <SwipeItem>
             <div class={styles.videoItem}>
-              <video class="player" id='player1' autoplay>
+              <video class="player" id="player1" autoplay>
                 <source
                   src="https://daya.ks3-cn-beijing.ksyuncs.com/12/1672210184164.mp4"
                   type="video/mp4"

+ 19 - 9
src/views/lessonCourseware/index.tsx

@@ -4,19 +4,20 @@ import { Empty, Grid, GridItem, Icon } from 'vant'
 import { defineComponent, onMounted, reactive } from 'vue'
 import styles from './index.module.less'
 import iconLook from './image/look.svg'
-import { useRoute } from 'vue-router'
+import { useRoute, useRouter } from 'vue-router'
 export default defineComponent({
   name: 'lessonCourseware',
   setup() {
     const route = useRoute()
+    const router = useRouter()
     const data = reactive({
       list: [] as any
     })
     const getList = async () => {
       try {
         const res: any = await request.post(state.platformApi + '/courseSchedule/myCourseware')
-        if (Array.isArray(res?.data?.rows)) {
-          data.list = res.data.rows
+        if (Array.isArray(res?.data)) {
+          data.list = res.data
         }
       } catch (error) {}
     }
@@ -24,9 +25,16 @@ export default defineComponent({
       getList()
     })
     const handleClick = (item: any) => {
-        if (route.query.code === 'select'){
-            console.log('这里是选择课件')
+      if (route.query.code === 'select') {
+        console.log('这里是选择课件')
+        return
+      }
+      router.push({
+        path: '/courseList',
+        query: {
+          id: item.id
         }
+      })
     }
     return () => (
       <div style={{ paddingTop: '14px' }}>
@@ -36,7 +44,11 @@ export default defineComponent({
               <GridItem>
                 <div
                   class={styles.gridItem}
-                  style={{ background: item.coverImg ? '' : `hsla(${Math.floor(Math.random() * 360)},50%,50%,.8)` }}
+                  style={{
+                    background: item.coverImg
+                      ? ''
+                      : `hsla(${Math.floor(Math.random() * 360)},50%,50%,.8)`
+                  }}
                   onClick={() => handleClick(item)}
                 >
                   <img src={item.coverImg} class={styles.cover} />
@@ -51,10 +63,8 @@ export default defineComponent({
               </GridItem>
             )
           })}
-          {!data.list.length && (
-            <Empty description='空空如也' />
-          )}
         </Grid>
+        {!data.list.length && <Empty description="空空如也" />}
       </div>
     )
   }