Kaynağa Gözat

feat: debug scan api

wangyuan 2 yıl önce
ebeveyn
işleme
8f4bf489ca

+ 4 - 1
api/appointment.js

@@ -5,6 +5,7 @@ const appointmentListURL = '/appointment/list' // 我的预约列表
 const cancelAppointmentURL = '/cancel/appointment' // 取消预约
 const submitAppointmentURL = '/submit/appointment' // 提交预约
 const getResetNumberURL = '/get/rest/number' // 区域剩余可用预约次数
+const getAccountNmberURL = '/get/account/number' // 查询账户剩余可使用的次数
 
 export const appointmentList =  (data) => wxRequest(appointmentListURL, data)
 
@@ -12,4 +13,6 @@ export const cancelAppointment =  (data) => wxRequest(cancelAppointmentURL, data
 
 export const submitAppointment =  (data) => wxRequest(submitAppointmentURL, data)
 
-export const getResetNumber =  (data) => wxRequest(getResetNumberURL, data)
+export const getResetNumber =  (data) => wxRequest(getResetNumberURL, data)
+
+export const getAccountNmber =  (data) => wxRequest(getAccountNmberURL, data)

+ 7 - 0
api/charge.js

@@ -0,0 +1,7 @@
+// 充值相关 api
+import { wxRequest } from './request'
+
+// 实体卡充值
+const userEntityRechargeURL = '/user/entity/recharge'
+
+export const userEntityRecharge =  (data) => wxRequest(userEntityRechargeURL, data)

+ 3 - 1
app.json

@@ -21,7 +21,9 @@
     "pages/myRecord/myRecord",
     "pages/scan/scan"
   ],
-  "requiredPrivateInfos": ["chooseAddress"],
+  "requiredPrivateInfos": [
+    "chooseAddress"
+  ],
   "usingComponents": {
     "van-icon": "@vant/weapp/icon/index",
     "van-overlay": "@vant/weapp/overlay/index",

+ 71 - 19
pages/appointment/appointment.js

@@ -1,6 +1,6 @@
 // pages/appointment/appointment.js
 const app = getApp()
-import { submitAppointment, getResetNumber } from '../../api/appointment'
+import { submitAppointment, getResetNumber, getAccountNmber } from '../../api/appointment'
 Page({
 
   /**
@@ -8,6 +8,7 @@ Page({
    */
   data: {
     hasAddress: false,
+    accountNumber: 0,
     addressId: '',
     address: '',
     province: '',
@@ -32,6 +33,54 @@ Page({
     this.initCalendar()
   },
 
+  /**
+   * 生命周期函数--监听页面显示
+   */
+  onShow() {
+    this.getAccountNmberFn() 
+    if (app.globalData.navigateBackParams.address) {
+      this.setData({
+        hasAddress: true,
+        address: app.globalData.navigateBackParams.address,
+        contactName: app.globalData.navigateBackParams.contactName,
+        contactPhone: app.globalData.navigateBackParams.contactPhone,
+        addressId: app.globalData.navigateBackParams.addressId,
+        province: app.globalData.navigateBackParams.province,
+        city: app.globalData.navigateBackParams.city,
+        county: app.globalData.navigateBackParams.county
+      })
+    }
+  },
+  onPullDownRefresh () {
+    wx.vibrateShort({
+      type: 'medium'
+    })
+    this.getAccountNmberFn(true)
+  },
+  // 查询账户剩余可使用的次数
+  getAccountNmberFn (pullDownRefresh = false) {
+    var that = this
+    wx.showLoading({
+      title: '加载中...',
+      mask: true
+    })
+    getAccountNmber({}).then(res => {
+      wx.hideLoading()
+      if (pullDownRefresh) {
+        wx.stopPullDownRefresh()
+      }
+      that.setData({
+        accountNumber: res.data
+      })
+    }).catch(e => {
+      wx.hideLoading()
+      wx.showModal({
+        content: e,
+        confirmColor: '#333',
+        showCancel: false
+      })
+    })
+  },
   // 初始化日历
   async initCalendar () {
     var that = this
@@ -161,23 +210,7 @@ Page({
       })
     }
   },
-  /**
-   * 生命周期函数--监听页面显示
-   */
-  onShow() {
-    if (app.globalData.navigateBackParams.address) {
-      this.setData({
-        hasAddress: true,
-        address: app.globalData.navigateBackParams.address,
-        contactName: app.globalData.navigateBackParams.contactName,
-        contactPhone: app.globalData.navigateBackParams.contactPhone,
-        addressId: app.globalData.navigateBackParams.addressId,
-        province: app.globalData.navigateBackParams.province,
-        city: app.globalData.navigateBackParams.city,
-        county: app.globalData.navigateBackParams.county
-      })
-    }
-  },
+
   /**
    * 选择地址
    */
@@ -210,7 +243,26 @@ Page({
   handleCharge () {},
   // 确定 先查询 区域的剩余预约次数
   handleConfirm () {
-    if (!this.data.hasAddress) {
+    if (this.data.accountNumber == 0) {
+      wx.showModal({
+        content: '您当前的检测次数为0,先充值次数',
+        cancelColor: '#666',
+        cancelText: '卡激活',
+        confirmText: '去充值',
+        confirmColor: '#333',
+        success (res) {
+          if (res.confirm) {
+            wx.navigateTo({
+              url: '/pages/buy/buy?form=appointment',
+            })
+          } else if (res.cancel) {
+            wx.navigateTo({
+              url: '/pages/scan/scan?form=appointment',
+            })
+          }
+        }
+      })
+    } else if (!this.data.hasAddress) {
       wx.showToast({
         title: '请选择地址',
         icon: 'error',

+ 2 - 1
pages/appointment/appointment.json

@@ -1,3 +1,4 @@
 {
-  "navigationBarTitleText": "预约时间"
+  "navigationBarTitleText": "预约时间",
+  "enablePullDownRefresh": true
 }

+ 1 - 1
pages/appointment/appointment.wxml

@@ -9,7 +9,7 @@
           <view class="ac-name">测试用户</view>
         </view>
         <view class="ac-right ac-item ittflex-jcs">
-          <text class="ac-count">100</text>
+          <text class="ac-count">{{accountNumber}}</text>
           <text class="ac-unit">次</text>
         </view>
       </view>

+ 87 - 3
pages/index/index.js

@@ -1,5 +1,6 @@
 // pages/index/index.js
 import { homePage } from '../../api/index'
+import { userEntityRecharge } from '../../api/charge'
 Page({
 
   /**
@@ -8,7 +9,13 @@ Page({
   data: {
     locationStr: '定位地址…',
     useNumber: 0, // 剩余预约次数
-    documentVos: [] // 档案信息
+    documentVos: [], // 档案信息
+    cardNo: '',
+    cardSecret: '',
+    scanTimer: null,
+    scanOverShow: false,
+    scanResMsg: '',
+    scanSuccess: true
   },
 
   /**
@@ -18,6 +25,9 @@ Page({
     this.initIndexData()
   },
   onPullDownRefresh () {
+    wx.vibrateShort({
+      type: 'medium'
+    })
     this.initIndexData(true)
   },
   // 获取首页信息
@@ -84,12 +94,86 @@ Page({
     })
   },
   handleScanCode () {
+    var that = this
     wx.scanCode({
       onlyFromCamera: true,
-      scanType: ['barCode','qrCode','datamatrix','pdf417'],
+      scanType: ['barCode','qrCode'],
       success (res) {
-        console.log(res);
+        wx.vibrateShort({
+          type: 'medium',
+        })
+        var response = res.result
+        if (response.indexOf('|') !== -1) {
+          var code = response.split('|')[0]
+          var password = response.split('|')[1]
+          that.setData({
+            cardNo: code,
+            cardSecret: password
+          })
+          var scantime = setTimeout(() => {
+            that.userEntityRechargeFn()
+          }, 500);
+          that.setData({
+            scanTimer: scantime
+          })
+        } else {
+          wx.showModal({
+            content: '请扫描正确的二维码',
+            confirmColor: '#333',
+            showCancel: false
+          })
+        }
       }
     })
+  },
+  // 重新扫描
+  handleRescan () {
+    this.setData({
+      scanOverShow: false,
+      scanResMsg: '',
+      scanSuccess: true
+    })
+    this.handleScanCode()
+  },
+  // 实体卡充值
+  userEntityRechargeFn () {
+    var that = this
+    clearTimeout(that.data.scanTimer)
+    wx.showLoading({
+      title: '充值中...',
+      mask: true
+    })
+    var data = {
+      cardNo: that.data.cardNo,
+      cardSecret: that.data.cardSecret
+    }
+    userEntityRecharge(data).then(res => {
+      wx.hideLoading()
+      console.log(res);
+      this.setData({
+        scanOverShow: true,
+        scanResMsg: res.msg,
+        scanSuccess: true
+      })
+    }).catch(e => {
+      wx.hideLoading()
+      this.setData({
+        scanOverShow: true,
+        scanResMsg: e,
+        scanSuccess: false
+      })
+    })
+  },
+  onClickHide () {
+    this.setData({
+      scanOverShow: false
+    })
+  },
+  noop () {},
+  //  去预约
+  handleAppointment () {
+    wx.navigateTo({
+      url: '/pages/appointment/appointment?form=index',
+    })
   }
 })

+ 1 - 4
pages/index/index.json

@@ -1,7 +1,4 @@
 {
   "navigationBarTitleText": "首页",
-  "enablePullDownRefresh": true,
-  "usingComponents": {
-    "van-button": "@vant/weapp/button/index"
-  }
+  "enablePullDownRefresh": true
 }

+ 16 - 0
pages/index/index.wxml

@@ -69,4 +69,20 @@
   <view class="index-banner">
     <image class="index-img" src="../../imaes/index.jpg"></image>
   </view>
+  <van-overlay show="{{ scanOverShow }}" bind:click="onClickHide">
+    <view class="wrapper ittflex">
+      <view class="modal" catch:tap="noop">
+        <view class="status-icon">
+          <image class="status-img" src="{{scanSuccess ? '../../imaes/chenggong@2x.png' : '../../imaes/shibai@2x.png'}}"></image>
+        </view>
+        <view class="status-text">
+          <text class="scan-msg">{{scanResMsg}}</text>
+        </view>
+        <view class="actions ittflex">
+          <view class="status-btn itt-btn success-btn" wx:if="{{scanSuccess}}" bindtap="handleAppointment">立即去预约</view>
+          <view class="status-btn itt-btn rescan-btn" bindtap="handleRescan" wx:else>重新扫描</view>
+        </view>
+      </view>
+    </view>
+  </van-overlay>
 </view>

+ 48 - 0
pages/index/index.wxss

@@ -231,4 +231,52 @@
 .index-img {
   width: 100%;
   height: 100%;
+}
+.wrapper {
+  height: 100%;
+  align-items: flex-start;
+}
+.modal {
+  width: 558rpx;
+  min-height: 522rpx;
+  background-color: #fff;
+  border-radius: 20rpx;
+  margin-top: 300rpx;
+  padding-bottom: 20rpx;
+}
+.status-icon {
+  width: 100%;
+  height: auto;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  margin-top: 90rpx;
+}
+.status-img {
+  width: 144rpx;
+  height: 144rpx;
+}
+.status-text {
+  font-size: 26rpx;
+  font-weight: 400;
+  color: #333333;
+  text-align: center;
+  margin-top: 40rpx;
+}
+.scan-msg {
+  display: inline-block;
+  width: 518rpx;
+  margin: 0 auto;
+}
+.actions {
+  width: 100%;
+  margin-top: 80rpx;
+}
+.status-btn {
+  width: 210rpx;
+  height: 68rpx;
+  border-radius: 10px;
+  font-size: 26rpx;
+  font-weight: 400;
+  color: #FFFFFF;
 }

+ 64 - 16
pages/scan/scan.js

@@ -1,5 +1,6 @@
 // pages/scan/scan.js
 const app = getApp()
+import { userEntityRecharge } from '../../api/charge'
 Page({
 
   /**
@@ -7,37 +8,84 @@ Page({
    */
   data: {
     scanFunctionUse: true,
-    show: false,
+    scanOverShow: false,
     scanTimer: null,
-    rescanTimer: null
+    scanSuccess: true,
+    cardNo: '',
+    cardSecret: ''
   },
   // 用户不允许使用摄像头时触发
   error () {
     console.log('eooro');
     app.globalData.auth.camera = false
+  },
+   // 重新扫码
+  handleRescan () {
+    this.setData({
+      scanOverShow: false,
+      scanFunctionUse: true
+    })
   },
   // 在扫码识别成功时触发,仅在 mode="scanCode" 时生效
   handlescancode (e) {
-    if (this.data.scanFunctionUse) {
-      this.setData({
-        scanFunctionUse: false,
-        show: true
+    var that = this
+    if (that.data.scanFunctionUse) {
+      that.setData({
+        scanFunctionUse: false
       })
-      console.log('扫码识别成功');
+      var response = e.detail.result
+      if (response.indexOf('|') !== -1) {
+        var code = response.split('|')[0]
+        var password = response.split('|')[1]
+        that.setData({
+          cardNo: code,
+          cardSecret: password
+        })
+        that.userEntityRechargeFn()
+      } else {
+        wx.showModal({
+          content: '请扫描正确的二维码',
+          confirmColor: '#333',
+          showCancel: false,
+          success (res) {
+            if (res.confirm) {
+              that.setData({
+                scanFunctionUse: true
+              })
+            }
+          }
+        })
+      }
     }
   },
-  // 重新扫码
-  handleRescan () {
-    this.setData({
-      show: false
+  // 实体卡充值
+  userEntityRechargeFn () {
+    var that = this
+    wx.showLoading({
+      title: '充值中...',
+      mask: true
     })
-    this.data.rescanTimer = setTimeout(() => {
+    var data = {
+      cardNo: that.data.cardNo,
+      cardSecret: that.data.cardSecret
+    }
+    userEntityRecharge(data).then(res => {
+      wx.hideLoading()
       this.setData({
-        scanFunctionUse: true
+        scanOverShow: true,
+        scanResMsg: res.msg,
+        scanSuccess: true
       })
-      clearTimeout(this.data.rescanTimer)
-    }, 800);
+    }).catch(e => {
+      wx.hideLoading()
+      this.setData({
+        scanOverShow: true,
+        scanResMsg: e,
+        scanSuccess: false
+      })
+    })
   },
+
   /**
    * 生命周期函数--监听页面加载
    */
@@ -89,7 +137,7 @@ Page({
    */
   onHide() {
     this.setData({
-      show: false,
+      scanOverShow: false,
       scanFunctionUse: true
     })
   },

+ 5 - 8
pages/scan/scan.wxml

@@ -3,21 +3,18 @@
   <view class="scan-item">
     <camera mode="scanCode" device-position="back" flash="off" binderror="error" bindscancode="handlescancode" style="width: 100%; height: 100%;"></camera>
   </view>
-  <van-overlay show="{{ show }}">
+  <van-overlay show="{{ scanOverShow }}">
     <view class="wrapper ittflex">
       <view class="modal">
         <view class="status-icon">
-          <image class="status-img" src="../../imaes/chenggong@2x.png"></image>
-          <!-- <image class="status-img" src="../../imaes/shibai@2x.png"></image> -->
+          <image class="status-img" src="{{scanSuccess ? '../../imaes/chenggong@2x.png' : '../../imaes/shibai@2x.png'}}"></image>
         </view>
         <view class="status-text">
-          <text>当前激活的是一次体验卡,体验次数+1</text>
-          <!-- <text>当前激活的是一次套餐卡,体验次数+X</text>
-          <text>该二维码已过期/该二维码不存在</text> -->
+          <text class="scan-msg">{{scanResMsg}}</text>
         </view>
         <view class="actions ittflex">
-          <!-- <view class="status-btn itt-btn success-btn">立即去预约</view> -->
-          <view class="status-btn itt-btn rescan-btn" bindtap="handleRescan">重新扫描</view>
+          <view class="status-btn itt-btn success-btn" wx:if="{{scanSuccess}}" bindtap="handleAppointment">立即去预约</view>
+          <view class="status-btn itt-btn rescan-btn" bindtap="handleRescan" wx:else>重新扫描</view>
         </view>
       </view>
     </view>

+ 10 - 2
pages/scan/scan.wxss

@@ -6,16 +6,19 @@
 .scan-item {
   width: 100%;
   height: 900rpx;
-  background-color: #f66;
+  background-color: var(--maincolor);
 }
 .wrapper {
   height: 100%;
+  align-items: flex-start;
 }
 .modal {
   width: 558rpx;
-  height: 522rpx;
+  min-height: 522rpx;
   background-color: #fff;
   border-radius: 20rpx;
+  margin-top: 300rpx;
+  padding-bottom: 20rpx;
 }
 .status-icon {
   width: 100%;
@@ -36,6 +39,11 @@
   text-align: center;
   margin-top: 40rpx;
 }
+.scan-msg {
+  display: inline-block;
+  width: 518rpx;
+  margin: 0 auto;
+}
 .actions {
   width: 100%;
   margin-top: 80rpx;