Browse Source

添加充值记录

lex 2 years ago
parent
commit
12f7f216df

+ 8 - 0
src/router/routes-teacher.ts

@@ -157,6 +157,14 @@ export default [
         meta: {
           title: '排课'
         }
+      },
+      {
+        path: '/rechargeRecord',
+        name: 'rechargeRecord',
+        component: () => import('@/teacher/piano-room/recharge-record'),
+        meta: {
+          title: '充值记录'
+        }
       }
     ]
   },

+ 6 - 1
src/student/trade/list/index.tsx

@@ -303,7 +303,12 @@ export default defineComponent({
           />
         )}
 
-        <Popup show={this.timeStatus} position="bottom" round closeOnPopstate>
+        <Popup
+          v-model:show={this.timeStatus}
+          position="bottom"
+          round
+          closeOnPopstate
+        >
           <DatetimePicker
             type="year-month"
             v-model={this.currentDate}

+ 5 - 5
src/student/trade/tradeOrder.ts

@@ -31,7 +31,7 @@ export const formatOrderDetail = async (item: any) => {
           })
           tempList = {
             orderType: item.goodType,
-            goodsName: item.goodName,
+            goodName: item.goodName,
             courseGroupId: live.courseGroupId,
             courseGroupName: live.courseGroupName,
             coursePrice: live.coursePrice,
@@ -61,7 +61,7 @@ export const formatOrderDetail = async (item: any) => {
         const { lessonGroup, detailList } = res
         tempList = {
           orderType: item.goodType,
-          goodsName: item.goodName,
+          goodName: item.goodName,
           courseGroupId: lessonGroup.id,
           courseGroupName: lessonGroup.lessonName,
           coursePrice: lessonGroup.lessonPrice,
@@ -81,7 +81,7 @@ export const formatOrderDetail = async (item: any) => {
           const res = await getVipDetail(item.id)
           tempList = {
             orderType: item.goodType,
-            goodsName: item.goodName,
+            goodName: item.goodName,
             id: res.id,
             title: memberType[res.period] || '',
             price: res.salePrice,
@@ -99,7 +99,7 @@ export const formatOrderDetail = async (item: any) => {
           const res = await getMusicDetail(item.bizId)
           tempList = {
             orderType: item.goodType,
-            goodsName: item.goodName,
+            goodName: item.goodName,
             ...res
           }
         } catch (e: any) {
@@ -109,7 +109,7 @@ export const formatOrderDetail = async (item: any) => {
       break
   }
   tempList.orderType = type
-  tempList.goodsName = item.goodsName
+  tempList.goodName = item.goodName
   orderStatus.orderObject.orderList.push(tempList)
 }
 // 获取视频课详情

+ 6 - 1
src/teacher/piano-room/account-recharge-timer/index.tsx

@@ -63,7 +63,12 @@ export default defineComponent({
   render() {
     return (
       <div style={{ overflow: 'hidden' }}>
-        <ColHeader />
+        <ColHeader
+          rightText="充值记录"
+          onClickRight={() => {
+            this.$router.push('/rechargeRecord')
+          }}
+        />
 
         <div class={styles.lastMin}>
           <img src={getAssetsHomeFile('icon_music_account.png')} />

+ 1 - 0
src/teacher/piano-room/class-arrangement/index.tsx

@@ -218,6 +218,7 @@ export default defineComponent({
         )
         if (code === 200) {
           confirmShow.value = false
+          Toast('排课成功')
         }
       } catch (error) {}
     }

+ 65 - 0
src/teacher/piano-room/recharge-record/index.module.less

@@ -0,0 +1,65 @@
+.tradeList {
+  .searchTime,
+  .searchType {
+    color: #1a1a1a;
+    font-size: 14px;
+  }
+  :global {
+    .iconfont-down {
+      margin-left: 4px;
+      // transform: scale(0.8);
+    }
+
+    .van-cell-group {
+      overflow: hidden;
+      border-radius: 10px;
+      margin-bottom: 12px;
+    }
+  }
+
+  .list {
+    padding: 0 14px;
+  }
+
+  .tradeLogo {
+    width: 35px;
+    height: 35px;
+    border-radius: 50%;
+    margin-right: 10px;
+    overflow: hidden;
+  }
+
+  .tradeType {
+    color: var(--van-primary);
+  }
+
+  .title,
+  .content {
+    padding-top: 1px;
+    display: flex;
+    justify-content: space-between;
+    flex-direction: column;
+    line-height: 18px;
+    color: #333333;
+    font-size: 14px;
+  }
+  .desc,
+  .num {
+    padding-top: 3px;
+    font-size: 13px;
+    color: #999999;
+  }
+}
+
+.btnList {
+  display: flex;
+  align-items: center;
+  justify-content: flex-end;
+  padding-bottom: var(--van-cell-vertical-padding);
+  padding-right: var(--van-cell-horizontal-padding);
+  :global {
+    .van-button + .van-button {
+      margin-left: 10px;
+    }
+  }
+}

+ 304 - 0
src/teacher/piano-room/recharge-record/index.tsx

@@ -0,0 +1,304 @@
+import { defineComponent, PropType } from 'vue'
+import styles from './index.module.less'
+import {
+  ActionSheet,
+  Cell,
+  CellGroup,
+  DatetimePicker,
+  Icon,
+  Popup,
+  Sticky,
+  Image,
+  List,
+  Button,
+  Dialog,
+  Toast
+} from 'vant'
+import { formatterDate } from '@/helpers/utils'
+import { goodsType, orderType, returnType } from '@/constant'
+
+import request from '@/helpers/request'
+import dayjs from 'dayjs'
+import ColResult from '@/components/col-result'
+import { tradeOrder } from '../tradeOrder'
+import ColHeader from '@/components/col-header'
+
+export default defineComponent({
+  name: 'list',
+  data() {
+    return {
+      timeStatus: false,
+      currentDate: new Date(),
+      typeStatus: false,
+      // 订单状态 WAIT_PAY 待支付 PAYING 支付中 PAID 已付款 CLOSE 已关闭 FAIL 支付失败 (多选用,分割)
+      actions: [
+        { name: '全部' },
+        { name: '待支付', status: 'WAIT_PAY' },
+        { name: '支付中', status: 'PAYING' },
+        { name: '已付款', status: 'PAID' },
+        { name: '已关闭', status: 'CLOSE' },
+        { name: '支付失败', status: 'FAIL' }
+      ],
+      list: [],
+      dataShow: true, // 判断是否有数据
+      loading: false,
+      finished: false,
+      searchName: '全部',
+      params: {
+        status: '',
+        page: 1,
+        rows: 20
+      }
+    }
+  },
+  methods: {
+    async getList() {
+      if (this.loading) return
+      this.loading = true
+      try {
+        const params = {
+          ...this.params,
+          searchDate: dayjs(this.currentDate).format('YYYY-MM')
+        }
+
+        const { code, data } = await request.post(
+          '/api-teacher/userOrder/page',
+          {
+            data: {
+              ...params
+            }
+          }
+        )
+        if (code === 200) {
+          const result = data || {}
+          this.list = this.list.concat(result.rows || [])
+          this.finished = result.pageNo >= result.totalPage
+          this.params.page = result.pageNo + 1
+          this.dataShow = this.list.length > 0
+        }
+      } catch {
+        this.dataShow = false
+        this.finished = true
+      }
+      this.loading = false
+    },
+    onDetail(item: any) {
+      this.$router.push({
+        path: '/tradeDetail',
+        query: {
+          orderNo: item.orderNo,
+          path: 'tradeRecord'
+        }
+      })
+    },
+    onConfirm(date: Date) {
+      this.currentDate = date
+      this.timeStatus = false
+      this.onSearch()
+    },
+    onSelect(item: any) {
+      this.params.status = item.status
+      this.searchName = item.name
+      this.onSearch()
+    },
+    onSearch() {
+      this.dataShow = true
+      this.loading = false
+      this.finished = false
+      this.list = []
+      this.params.page = 1
+      this.getList()
+    },
+    async onCancelPay(item: any) {
+      Dialog.confirm({
+        message: '是否取消订单?',
+        confirmButtonText: '确定',
+        confirmButtonColor: 'var(--van-primary)',
+        cancelButtonText: '取消'
+      }).then(async () => {
+        try {
+          await request.post('/api-teacher/userOrder/orderCancel', {
+            data: {
+              orderNo: item.orderNo
+            }
+          })
+          this.onSearch()
+        } catch {}
+      })
+    },
+    async onPay(item: any) {
+      try {
+        const res = await request.get(
+          `/api-teacher/userOrder/detailByOrderNo/${item.orderNo}`
+        )
+        const result = res.data
+        tradeOrder(result, () => {
+          this.$router.push({
+            path: '/orderDetail',
+            query: {
+              orderType: result.orderType
+            }
+          })
+        })
+      } catch {}
+    }
+  },
+  render() {
+    return (
+      <div class={styles.tradeList}>
+        <Sticky position="top">
+          <ColHeader isFixed={false} />
+          <Cell
+            center
+            style={{ backgroundColor: '#F7F8F9' }}
+            v-slots={{
+              title: () => (
+                <div
+                  class={styles.searchTime}
+                  onClick={() => {
+                    this.timeStatus = true
+                  }}
+                >
+                  <span>
+                    {(this as any).$filters.dateFormat(
+                      this.currentDate,
+                      'YYYY-MM'
+                    )}
+                  </span>
+                  <Icon
+                    classPrefix="iconfont"
+                    name="down"
+                    size={12}
+                    color="var(--van-primary)"
+                  />
+                </div>
+              ),
+              value: () => {
+                return (
+                  <div
+                    class={styles.searchType}
+                    onClick={() => {
+                      this.typeStatus = true
+                    }}
+                  >
+                    <span>{this.searchName}</span>
+                    <Icon
+                      classPrefix="iconfont"
+                      name="down"
+                      size={12}
+                      color="var(--van-primary)"
+                    />
+                  </div>
+                )
+              }
+            }}
+          ></Cell>
+        </Sticky>
+        {this.dataShow ? (
+          <List
+            loading={this.loading}
+            finished={this.finished}
+            finishedText=" "
+            class={[styles.list]}
+            onLoad={this.getList}
+          >
+            {this.list.map((item: any) => (
+              <CellGroup
+                border={false}
+                onClick={() => {
+                  this.onDetail(item)
+                }}
+              >
+                <Cell
+                  title={dayjs(item.createTime).format('YYYY-MM-DD HH:mm')}
+                  value={orderType[item.status]}
+                  valueClass={styles.tradeType}
+                />
+                <Cell
+                  border={false}
+                  v-slots={{
+                    title: () => (
+                      <div class={styles.title}>
+                        <span>{item.orderName}</span>
+                        <span class={styles.desc}>
+                          {goodsType[item.orderType]}
+                        </span>
+                      </div>
+                    ),
+                    default: () => (
+                      <div class={styles.content}>
+                        <span class={styles.price}>
+                          ¥
+                          {(this as any).$filters.moneyFormat(item.actualPrice)}
+                        </span>
+                      </div>
+                    )
+                  }}
+                />
+                {item.status === 'PAYING' || item.status === 'WAIT_PAY' ? (
+                  <div class={styles.btnList}>
+                    <Button
+                      size="small"
+                      round
+                      onClick={(e: any) => {
+                        e.stopPropagation()
+                        this.onCancelPay(item)
+                      }}
+                    >
+                      取消订单
+                    </Button>
+                    <Button
+                      size="small"
+                      round
+                      type="primary"
+                      onClick={(e: any) => {
+                        e.stopPropagation()
+                        this.onPay(item)
+                      }}
+                    >
+                      继续支付
+                    </Button>
+                  </div>
+                ) : null}
+              </CellGroup>
+            ))}
+          </List>
+        ) : (
+          <ColResult
+            btnStatus={false}
+            classImgSize="SMALL"
+            tips={'暂无购买记录'}
+          />
+        )}
+
+        <Popup
+          v-model:show={this.timeStatus}
+          position="bottom"
+          round
+          closeOnPopstate
+        >
+          <DatetimePicker
+            type="year-month"
+            v-model={this.currentDate}
+            formatter={formatterDate}
+            onCancel={() => {
+              this.timeStatus = false
+            }}
+            onConfirm={this.onConfirm}
+          />
+        </Popup>
+
+        <ActionSheet
+          v-model:show={this.typeStatus}
+          actions={this.actions}
+          closeOnClickAction
+          cancelText="取消"
+          onSelect={this.onSelect}
+          onCancel={() => {
+            this.typeStatus = false
+          }}
+        />
+      </div>
+    )
+  }
+})

+ 70 - 0
src/teacher/piano-room/tradeOrder.ts

@@ -0,0 +1,70 @@
+import { memberType } from '@/constant'
+import request from '@/helpers/request'
+import { orderStatus } from '@/views/order-detail/orderStatus'
+import dayjs from 'dayjs'
+// LIVE: '直播课',
+// PRACTICE: '陪练课',
+// VIDEO: '视频课',
+// VIP: '开通会员',
+// MUSIC: '单曲点播'
+export const formatOrderDetail = async (item: any) => {
+  const type = item.goodType
+  let tempList: any = {}
+
+  switch (type) {
+    case 'PINAO_ROOM':
+      {
+        try {
+          const res = await getPinaoDetail(item.bizId)
+          console.log('res', res)
+          tempList = {
+            orderType: item.goodType,
+            goodsName: item.goodName,
+            ...res
+          }
+        } catch (e: any) {
+          throw new Error(e.message)
+        }
+      }
+      break
+  }
+  tempList.orderType = type
+  tempList.goodName = item.goodName
+  orderStatus.orderObject.orderList.push(tempList)
+}
+
+// 获取时长详情失败
+export const getPinaoDetail = async (id: any) => {
+  try {
+    const res = await request.get(`/api-teacher/pianoRoomSettings/detail/${id}`)
+    return res.data
+  } catch {
+    throw new Error('获取时长详情失败')
+  }
+}
+
+export const tradeOrder = (result: any, callBack?: any) => {
+  const {
+    orderNo,
+    actualPrice,
+    orderDesc,
+    orderName,
+    orderType,
+    orderDetailList
+  } = result
+  orderStatus.orderObject.orderType = orderType
+  orderStatus.orderObject.orderName = orderName
+  orderStatus.orderObject.orderDesc = orderDesc
+  orderStatus.orderObject.actualPrice = actualPrice
+  orderStatus.orderObject.orderNo = orderNo
+  orderStatus.orderObject.actualPrice = actualPrice
+  orderStatus.orderObject.orderList = []
+  try {
+    orderDetailList.forEach(async (item: any) => {
+      await formatOrderDetail(item)
+    })
+    callBack && callBack()
+  } catch {
+    //
+  }
+}

+ 1 - 1
src/views/cart/cart-confirm/index.tsx

@@ -98,7 +98,7 @@ export default defineComponent({
         )
         if (code === 200) {
           if (data.order.status === 1) {
-            router.push({
+            router.replace({
               path: `/shopTrade`,
               query: {
                 orderNo: data?.order.orderSn,

+ 1 - 1
src/views/order-detail/index.tsx

@@ -151,7 +151,7 @@ export default defineComponent({
         const result = res.data || {}
 
         if (result.status == 'PAID') {
-          this.$router.push({
+          this.$router.replace({
             path: '/tradeDetail',
             query: {
               orderNo: result.orderNo