Przeglądaj źródła

refactor:预约订支付

zhanghui 2 lat temu
rodzic
commit
a687a4699a

+ 2 - 1
.idea/inspectionProfiles/Project_Default.xml

@@ -4,7 +4,7 @@
     <inspection_tool class="HtmlUnknownTag" enabled="true" level="WARNING" enabled_by_default="true">
       <option name="myValues">
         <value>
-          <list size="17">
+          <list size="18">
             <item index="0" class="java.lang.String" itemvalue="nobr" />
             <item index="1" class="java.lang.String" itemvalue="noembed" />
             <item index="2" class="java.lang.String" itemvalue="comment" />
@@ -22,6 +22,7 @@
             <item index="14" class="java.lang.String" itemvalue="u-tabs" />
             <item index="15" class="java.lang.String" itemvalue="view" />
             <item index="16" class="java.lang.String" itemvalue="u-datetime-picker" />
+            <item index="17" class="java.lang.String" itemvalue="uni-popup" />
           </list>
         </value>
       </option>

+ 25 - 25
App.vue

@@ -5,31 +5,31 @@
 <script>
 	export default {
 		onLaunch: function() {
-            // let that = this;
-            // wx.login({
-            //     success(re) {
-            //         that.$api.wxAuthLogin({code:re.code}).then(res=>{
-            //             uni.setStorageSync('userInfo',res.data.data.userInfo)
-            //             uni.setStorageSync('accessToken',res.data.data.access_token)
-            //             uni.setStorageSync('phoneIsBind',res.data.data.phoneIsBind)
-            //
-            //             if (res.data.data.phoneIsBind){
-            //                 // uni.switchTab({
-            //                 //     url: '/pages/index/index',
-            //                 // })
-            //                 uni.navigateTo({
-            //                     url: '/loginPages/bindAccount/index',
-            //                 })
-            //             }else {
-            //                 uni.navigateTo({
-            //                     url: '/loginPages/bindAccount/index',
-            //                 })
-            //             }
-            //
-            //         })
-            //
-            //     },
-            // })
+            let that = this;
+            wx.login({
+                success(re) {
+                    that.$api.wxAuthLogin({code:re.code}).then(res=>{
+                        uni.setStorageSync('userInfo',res.data.data.userInfo)
+                        uni.setStorageSync('accessToken',res.data.data.access_token)
+                        uni.setStorageSync('phoneIsBind',res.data.data.phoneIsBind)
+
+                        if (res.data.data.phoneIsBind){
+                            uni.switchTab({
+                                url: '/pages/index/index',
+                            })
+                            // uni.navigateTo({
+                            //     url: '/loginPages/bindAccount/index',
+                            // })
+                        }else {
+                            uni.navigateTo({
+                                url: '/loginPages/bindAccount/index',
+                            })
+                        }
+
+                    })
+
+                },
+            })
 			console.log('App Launch')
 		},
 		onShow: function() {

+ 78 - 0
orderPages/bookService/index.rpx.scss

@@ -12,6 +12,7 @@
   height: 212rpx;
   position: fixed;
   bottom: 0;
+  z-index: 5;
 }
 
 .groupItem{
@@ -103,3 +104,80 @@
 .marginTop{
   margin-top: 24rpx;
 }
+.payView{
+  height: 638rpx;
+  background: #FFFFFF;
+  box-shadow: 0rpx -4rpx 8rpx 0rpx rgba(0,0,0,0.03);
+  border-radius: 24rpx 24rpx 0rpx 0rpx;
+  padding: 24rpx 32rpx;
+}
+.payType{
+  font-size: 32rpx;
+  font-family: PingFangSC-Medium, PingFang SC;
+  font-weight: bord;
+  color: #111111;
+  line-height: 48rpx;
+}
+.x{
+  width: 35rpx;
+  height: 35rpx;
+  border-radius: 18rpx;
+}
+.payTitle{
+  font-size: 24rpx;
+  font-family: PingFangSC-Regular, PingFang SC;
+  font-weight: 400;
+  color: #666666;
+  line-height: 40rpx;
+  margin-top: 8rpx;
+}
+.payItem{
+  background: #FAFAFA;
+  border-radius: 20rpx;
+  padding: 34rpx 32rpx;
+  margin-top: 32rpx;
+}
+.payName{
+  margin-left: 24rpx;
+}
+.balance{
+  font-size: 24rpx;
+  font-family: PingFangSC-Regular, PingFang SC;
+  font-weight: 400;
+  color: #999999;
+  line-height: 40rpx;
+}
+.commitBtn{
+  width: 686rpx;
+  height: 108rpx;
+  background: #FFE05C;
+  border-radius: 60rpx;
+  margin-top: 32rpx;
+
+  font-size: 32rpx;
+  font-family: PingFangSC-Medium, PingFang SC;
+  font-weight: bold;
+  color: #111111;
+  line-height: 108rpx;
+  text-align: center;
+}
+.passwordView{
+    background: #FFFFFF;
+  width: 686rpx;
+  height: 400rpx;
+  border-radius: 20rpx;
+  padding: 34rpx 0;
+}
+
+.h-tab-bar{
+  margin-top: 80rpx;
+}
+.h-operate-btn{
+  width: 550rpx;
+  height: 80rpx;
+  border-radius: 40rpx;
+  background: #FFE05C;
+  line-height: 80rpx;
+  text-align: center;
+  margin-top: 80rpx;
+}

+ 319 - 32
orderPages/bookService/index.vue

@@ -15,14 +15,13 @@
                 <view class="groupItemKey">
                     <text>服务类别</text>
                 </view>
-                <picker  @change="bindPickerChange" mode='selector'  range-key="typeName" :value="index" :range="storeServiceList">
+                <picker  @change="bindPickerChange" mode='selector'  range-key="typeName" :value="storeServiceIndex" :range="storeServiceList">
                     <view class="flex-row justify-between groupItemContent">
-                        <text>{{storeServiceList[index].typeName || '请选择服务类别' }}</text>
+                        <text>{{storeServiceList[storeServiceIndex].typeName || '请选择服务类别' }}</text>
                         <u-icon name="arrow-right" color="#666" size="18"></u-icon>
                     </view>
                 </picker>
             </view>
-
         </view>
 
 
@@ -41,9 +40,9 @@
                 <view class="groupItemKey">
                     <text>服务日期</text>
                 </view>
-                <picker  @change="bindPickerChange" mode='selector'  range-key="typeName" :value="index" :range="storeServiceList">
+                <picker  @change="bindPickerChange1" mode='selector'  range-key="label" :value="periodDateIndex" :range="periodDateList">
                     <view class="flex-row justify-between groupItemContent">
-                        <text>{{storeServiceList[index].typeName || '请选择服务日期' }}</text>
+                        <text>{{periodDateList[periodDateIndex].label || '请选择服务日期' }}</text>
                         <u-icon name="arrow-right" color="#666" size="18"></u-icon>
                     </view>
                 </picker>
@@ -54,9 +53,9 @@
                 <view class="groupItemKey">
                     <text>服务时段</text>
                 </view>
-                <picker  @change="bindPickerChange" mode='selector'  range-key="typeName" :value="index" :range="storeServiceList">
+                <picker  @change="bindPickerChange2" mode='selector'  range-key="label" :value="periodTimeIndex" :range="periodTimeList">
                     <view class="flex-row justify-between groupItemContent">
-                        <text>{{storeServiceList[index].typeName || '服务时段' }}</text>
+                        <text>{{periodTimeList[periodTimeIndex].label || '服务时段' }}</text>
                         <u-icon name="arrow-right" color="#666" size="18"></u-icon>
                     </view>
                 </picker>
@@ -66,12 +65,10 @@
                 <view class="groupItemKey">
                     <text>服务人员</text>
                 </view>
-                <picker  @change="bindPickerChange" mode='selector'  range-key="typeName" :value="index" :range="storeServiceList">
-                    <view class="flex-row justify-between groupItemContent">
-                        <text>{{storeServiceList[index].typeName || '请选择服务人员' }}</text>
-                        <u-icon name="arrow-right" color="#666" size="18"></u-icon>
-                    </view>
-                </picker>
+                <view class="flex-row justify-between groupItemContent" @click="chooseServiceTeacher">
+                    <text>{{serviceTeacher.title || '请选择服务人员' }}</text>
+                    <u-icon name="arrow-right" color="#666" size="18"></u-icon>
+                </view>
             </view>
 
 
@@ -81,7 +78,7 @@
                 <text>服务定制</text>
             </view>
             <view class="textareaView">
-                <textarea placeholder-style="color:#999999;fontSize:28rpx" placeholder="如有其它特殊需求,请在此输入您的需求"/>
+                <textarea v-model="remark" placeholder-style="color:#999999;fontSize:28rpx" placeholder="如有其它特殊需求,请在此输入您的需求"/>
             </view>
         </view>
 
@@ -94,14 +91,88 @@
             <view class="btn flex-row justify-between">
                 <view>
                     <text class="title">待支付</text>
-                    <text class="num">¥120</text>
+                    <text class="num">¥{{price}}</text>
                 </view>
-                <view class="btnRight">
+                <view class="btnRight" @click="commitOrder">
                     <text>提交</text>
                 </view>
             </view>
         </view>
 
+        <uni-popup ref="passwordPopup">
+            <view class="passwordView flex-col">
+                <view class="h-pay-title flex-row justify-center">
+                    <text>请输入交易密码</text>
+                </view>
+                <view class="h-tab-bar flex-row justify-center">
+                    <u-code-input  v-model="password" mode="box" dot></u-code-input>
+                </view>
+                <view class="flex-row justify-center">
+                    <view class="h-operate-btn flex-row justify-center" @click="balancePay">
+                        <text>确定</text>
+                    </view>
+                </view>
+
+            </view>
+        </uni-popup>
+
+        <uni-popup ref="popup" type="bottom">
+
+            <view class=" payView">
+                <view class="flex-row justify-between">
+                    <text class="payType">请选择支付方式</text>
+                    <image class="x" src="/static/common/ox.png" @click="closePayPopup"></image>
+                </view>
+                <view class="payTitle">
+                    <text>选择微信支付或余额支付</text>
+                </view>
+
+
+                <view class="payItem flex-row justify-between" @click="payItem(1)">
+                    <view class="flex-row">
+                        <u-icon name="/static/me/u701.png" color="#38db38" size="36"></u-icon>
+                        <view class="payName flex-col justify-center">
+                            <text>余额支付</text>
+                            <text class="balance">可以余额¥{{userInfo.balance || 0}}</text>
+                        </view>
+                    </view>
+
+                    <view class="flex-col justify-center">
+                        <view v-if="curServiceTab === 1" >
+                            <u-icon name="checkmark-circle-fill" color="#38db38" size="25"></u-icon>
+                        </view>
+                        <view v-else>
+                            <u-icon name="/static/order/ud9.png" color="green" size="25"></u-icon>
+                        </view>
+                    </view>
+
+                </view>
+
+                <view class="payItem flex-row justify-between" @click="payItem(2)">
+                    <view class="flex-row">
+                        <u-icon name="weixin-circle-fill" color="#38db38" size="36"></u-icon>
+                        <view class="payName flex-col justify-center">
+                            <text>微信支付</text>
+                        </view>
+                    </view>
+                    <view class="flex-col justify-center">
+                        <view v-if="curServiceTab === 2" >
+                            <u-icon name="checkmark-circle-fill" color="#38db38" size="25"></u-icon>
+                        </view>
+                        <view v-else>
+                            <u-icon name="/static/order/ud9.png" color="green" size="25"></u-icon>
+                        </view>
+                    </view>
+                </view>
+
+                <view class="commitBtn" @click="commonGeneralOrder">
+                    <text>确定</text>
+                </view>
+
+            </view>
+
+        </uni-popup>
+
     </view>
 </template>
 
@@ -111,47 +182,249 @@ export default {
 
     data() {
         return {
+            password:'',
+            remark:'',
+            userInfo:{},
+            curServiceTab:1,
+            //服务门店
             store:{},
+            //服务对象
             serviceObject:{},
+            //服务技师
+            serviceTeacher:{},
+            //服务类型
             storeServiceList:[],
-            index:0
+            storeServiceIndex:0,
+            //服务时间
+            periodDateList:[],
+            periodDateIndex:0,
+            //服务时段
+            periodTimeList:[],
+            periodTimeIndex:0,
+            //预约费用
+            price:'0.01',
+            //订单编号
+            orderNo:''
+
         }
     },
     onLoad() {
         this.listServiceObject()
+        this.store = uni.getStorageSync('storeInfo')
+        this.userInfo = uni.getStorageSync('userInfo')
+        // this.storeAllServiceList()
+        this.category()
+        this.selectDate()
     },
 
     onShow(){
         // 服务对象
         uni.$off()
         uni.$on('selectedServiceObject', this.selectedServiceObject);
+        uni.$on('selectedServiceTeacher', this.selectedServiceTeacher);
 
-        this.store = uni.getStorageSync('storeInfo')
-        // this.storeAllServiceList()
-        this.category()
     },
 
     methods: {
 
-        // 查询服务对接信息列表
-        listServiceObject(){
-            this.$api.listServiceObject(this.reqParm).then((res)=>{
-                console.log('++++++++++listServiceObject+++++++++++',res)
-                this.getImgUrlByOssId(res.data.data[0]);
+        payItem(num){
+            if (this.userInfo.balance < this.price){
+                return
+            }
+            this.curServiceTab = num
+        },
+
+        //提交订单
+        commitOrder(){
+
+            if (!this.serviceTeacher.id){
+                uni.$u.toast('请选择服务人员')
+                return
+            }
+            if (this.price > 0){
+                this.$refs.popup.open()
+                if (this.userInfo.balance < this.price){
+                    this.curServiceTab=2
+                }
+            }else {
+                this.commonGeneralOrder()
+            }
+
+        },
+
+        closePayPopup(){
+            this.$refs.popup.close()
+        },
+
+        wechatPay(){
+            let that = this;
+            // 发起微信支付
+            this.$api.wechatPay({
+                orderNo:this.orderNo
+            }).then((res)=>{
+                var param = res;
+                uni.requestPayment({
+                    appId: param.appid,
+                    timeStamp: param.timestamp+"",
+                    nonceStr: param.noncestr,
+                    package: "prepay_id="+param.prepayid,
+                    signType: "RSA",
+                    paySign: param.sign,
+                    success: res => {
+                        uni.showToast({
+                            title: '支付成功!'
+                        });
+                        uni.switchTab({
+                            url:'/pages/order/index'
+                        })
+                    },
+                    fail: res => {
+                        console.log(res)
+                        uni.showModal({
+                            content: '支付失败',
+                            showCancel: false
+                        });
+                        uni.switchTab({
+                            url:'/pages/order/index'
+                        })
+                    }
+                });
             }).catch(() =>{
                 uni.showToast({
                     title: "操作失败"
                 })
             });
         },
-        // 获取图片
-        getImgUrlByOssId(data){
-            if (data.facePhoto){
-                this.$api.getImgUrlByOssId({ossId:item.facePhoto}).then(res=>{
-                    console.log('+++++++++++++getImgUrlByOssId+++++++++++++++',res)
+
+        //余额支付
+        balancePay(){
+
+            let that = this;
+            if(this.password.length< 6 ){
+                uni.showToast({
+                    title: "交易密码不能小于6位"
+                })
+                return ;
+            }
+            this.$refs.passwordPopup.close()
+            // 用户信息
+            this.$api.balancePay({
+                orderNo: this.orderNo,
+                password: this.password
+            }).then((res)=>{
+                uni.switchTab({
+                    url:'/pages/order/index'
                 })
+                this.getUserInfo()
+            }).catch(() =>{
+                uni.showToast({
+                    title: "操作失败"
+                })
+            });
+
+        },
+
+        getUserInfo(){
+            this.$api.getUserInfo().then(res=>{
+                console.log('++++++++++++获取用户信息++++++++++++++++++',res)
+                uni.setStorageSync('userInfo',res.data.data)
+                this.userInfo = res.data.data
+            })
+
+        },
+
+        commonGeneralOrder(){
+            this.$refs.popup.close()
+          this.$api.commonGeneralOrder({
+              orderType: 1,
+              serviceObjectId: this.serviceObject.id,
+              serviceAttribute: 2,
+              serviceStoreId: this.store.storeId,
+              serviceTypeId:this.storeServiceList[this.storeServiceIndex].id,
+              serviceDate:this.periodDateList[this.periodDateIndex].label,
+              serviceUserId:this.serviceTeacher.id,
+              serviceStartTime:this.periodTimeList[this.periodTimeIndex].label,
+              timeRangeId:this.serviceTeacher.id,
+              remark:this.remark
+          }).then(res=>{
+              this.orderNo=res.data.data.orderNo
+              if (res.data.data.subOrderNo === null){
+                    uni.switchTab({
+                        url:'/pages/order/index'
+                    })
+              }else{
+                  if (this.curServiceTab === 1){
+                      //开启余额支付密码框
+                    this.$refs.passwordPopup.open()
+
+                  }
+                  if (this.curServiceTab === 2){
+                      //调微信支付
+                      this.wechatPay()
+                  }
+              }
+
+          })
+        },
+
+
+
+
+        //获取预约费用
+        getAppointmentPrice(){
+            this.$api.getAppointmentPrice({
+                auth: true,
+                storeId: this.store.storeId,
+                date: this.periodDateList[this.periodDateIndex].label,
+                timeRangeId: this.periodTimeList[this.periodTimeIndex].value,
+                servicePersonId:  this.serviceTeacher.id,
+                serviceProjectId:this.storeServiceList[this.storeServiceIndex].id
+            }).then(res=>{
+                this.price= res.data.data.price
+            })
+        },
+
+        //选择服务人员
+        chooseServiceTeacher(){
+
+            if (this.periodDateList.length <=0 || this.periodTimeList.length<=0){
+                uni.$u.toast('请选择服务时间')
             }
-            this.serviceObject = data
+            uni.navigateTo({
+                url: '/orderPages/serviceTeacher/index?organization='+this.store.storeId + '&schedulingDate=' +this.periodDateList[this.periodTimeIndex].label + '&periodId='+this.periodTimeList[this.periodTimeIndex].value
+            })
+        },
+
+        //获取排班日期
+        selectDate(){
+            console.log(this.store)
+            this.$api.selectDate({
+                organization:this.store.storeId
+            }).then(res =>{
+                this.periodDateList = res.data.data
+                this.selectPeriodByDate(res.data.data[0].label)
+            })
+        },
+
+        //获取门店排班时段
+        selectPeriodByDate(date){
+            this.$api.selectPeriodByDate({
+                organization:this.store.storeId,
+                schedulingDate:date
+            }).then(res =>{
+                this.periodTimeList = res.data.data
+            })
+        },
+
+        // 查询服务对像信息列表
+        listServiceObject(){
+            this.$api.listServiceObject(this.reqParm).then((res)=>{
+                this.serviceObject = res.data.data[0]
+            }).catch((err) =>{
+                uni.showToast({
+                    title: "操作失败"
+                })
+            });
         },
 
         getServiceObject(){
@@ -163,8 +436,22 @@ export default {
             this.serviceObject = e
         },
 
+        selectedServiceTeacher(e){
+            this.serviceTeacher = e
+            this.getAppointmentPrice()
+        },
+
         bindPickerChange(e){
-            this.index= e.detail.value
+            this.storeServiceIndex= e.detail.value
+            console.log(e)
+        },
+        bindPickerChange1(e){
+            this.periodDateIndex= e.detail.value
+            this.selectPeriodByDate(this.periodDateList[e.detail.value].label)
+            console.log(e)
+        },
+        bindPickerChange2(e){
+            this.periodTimeIndex= e.detail.value
             console.log(e)
         },
 

+ 16 - 12
orderPages/serviceTeacher/index.vue

@@ -55,33 +55,37 @@
 		methods: {
 			// 查询服务工作人员列表
 			serviceWorkPersonList() {
-				serviceWorkPersonList({
-					data: this.reqParm
-				}).then((res) => {
-					this.workPersonList = res.rows;
-				}).catch(() => {
+				this.$api.serviceWorkPersonList(this.reqParm).then((res) => {
+					console.log(res)
+					this.workPersonList = res.data.rows;
+					this.getImgUrlByOssId(res.data.rows)
+				}).catch((err) => {
+					console.log('+++++++++++++err++++++++++++++',err)
 					uni.showToast({
 						title: "操作失败"
 					})
 				});
 			},
 			// 获取图片
-			async getImgUrlByOssId(data) {
+			getImgUrlByOssId(data){
 				for (let i = 0; i < data.length; i++) {
-					const item = data[i];
-					let url = await this.$getImgUrlByOssId(item.facePhoto);
-					item.imgUrl = url;
+					if (data[i].facePhoto){
+						this.$api.getImgUrlByOssId(data[i].facePhoto).then(res=>{
+							data[i].imgUrl = res.data.data[0].url.replace(/^http:/, "https:")
+						});
+					}
 				}
-				this.serviceObjectList = data
-				return data;
+
 			},
+
 			// 选择服务老师
 			chooseServiceTeacher(item) {
+				console.log('+++++++++++++chooseServiceTeacher++++++++++++++',item)
 				// 选择完成后返回上一页
 				uni.navigateBack({
 					delta: 1,
 				});
-				uni.$emit('selectedDataFromChild', item);
+				uni.$emit('selectedServiceTeacher', item);
 			}
 		},
 	};

BIN
static/common/ox.png