Explorar el Código

Merge branch 'ghm' into v2

MS-IOHQJGHXZHQD\Administrator hace 5 meses
padre
commit
ca00bf373b

+ 16 - 0
src/api/points.js

@@ -70,4 +70,20 @@ export function productOrderCreate(data) {
         url: '/product/order/create',
         data
     });
+}
+//商品支付
+export function productOrderPay(data) {
+    return request({
+        method: 'post',
+        url: '/product/order/pay',
+        data
+    });
+}
+//取消订单
+export function productOrderCancel(data) {
+    return request({
+        method: 'post',
+        url: '/product/order/cancel',
+        data
+    });
 }

+ 31 - 12
src/pages.json

@@ -550,38 +550,57 @@
 				},{
 					"path": "productDetails/index",
 					"style": {
-						"navigationBarTitleText": "商品详情",
-						"navigationStyle": "custom"
+						//"navigationBarTitleText": "商品详情",
+						"navigationStyle": "custom",
+						"app-plus": {
+     						 "titleNView": false // 关闭 App 端导航栏
+    					}
 					}
 				},{
 					"path": "productDetails/addressManagement",
 					"style": {
-						"navigationBarTitleText": "地址管理",
-						"navigationStyle": "custom"
+						//"navigationBarTitleText": "地址管理",
+						"navigationStyle": "custom",
+						"app-plus": {
+     						 "titleNView": false // 关闭 App 端导航栏
+    					}
+						
 					}
 				},{
 					"path": "productDetails/paymentSuccessful",
 					"style": {
-						"navigationBarTitleText": "兑换成功",
-						"navigationStyle": "custom"
+						//"navigationBarTitleText": "兑换成功",
+						"navigationStyle": "custom",
+						"app-plus": {
+     						 "titleNView": false // 关闭 App 端导航栏
+    					}
 					}
 				},{
 					"path": "productDetails/pendingPayment",
 					"style": {
-						"navigationBarTitleText": "待支付",
-						"navigationStyle": "custom"
+						//"navigationBarTitleText": "待支付",
+						"navigationStyle": "custom",
+						"app-plus": {
+     						 "titleNView": false // 关闭 App 端导航栏
+    					}
 					}
 				},{
 					"path": "productDetails/applyRefund",
 					"style": {
-						"navigationBarTitleText": "申请退款",
-						"navigationStyle": "custom"
+						//"navigationBarTitleText": "申请退款",
+						"navigationStyle": "custom",
+						"app-plus": {
+     						 "titleNView": false // 关闭 App 端导航栏
+    					}
 					}
 				},{
 					"path": "productDetails/applyExchange",
 					"style": {
-						"navigationBarTitleText": "申请换货",
-						"navigationStyle": "custom"
+						//"navigationBarTitleText": "申请换货",
+						"navigationStyle": "custom",
+						"app-plus": {
+     						 "titleNView": false // 关闭 App 端导航栏
+    					}
 					}
 				}
 			]

+ 35 - 8
src/pages/address/index.vue

@@ -7,7 +7,8 @@
 			<view class="main-list">
 				<u-radio-group v-model="selected" placement="column" activeColor="#0879FF" @change="onChange">
 					<template v-for="(item, i) in dataList">
-						<view class="mitem" :key="i" v-if="item.type != 2">
+						<view class="mitem" :key="i" v-if="item.type != 2" @click="selectedAddressFun(item)"
+							:style="{ border: selectedAddressId == item.id ? '1px solid rgba(3, 193, 184, 1)' : 'none' }">
 							<view class="info-box" @click="onClick(item)">
 								<view class="item-line atext">
 									<text class="name">{{ item.userName }}</text>
@@ -41,10 +42,7 @@
 
 			<!-- 底部操作栏 -->
 			<view class="footer-bar" slot="bottom">
-				<u-button
-					text="新增地址信息"
-					@click="onAdd"
-				></u-button>
+				<u-button text="新增地址信息" @click="onAdd"></u-button>
 			</view>
 		</z-paging>
 	</view>
@@ -63,19 +61,37 @@ export default {
 			query: {},
 			dataList: [],
 			selected: '',
+			selectedAddressId: null,
 		}
 	},
 	computed: {
-		
+
 	},
 	onLoad(query) {
 		this.query = query;
+		//商品详情页传过来的id
+		if (query.selectedAddressId) {
+			this.selectedAddressId = query.selectedAddressId
+
+		}
 	},
 	onShow() {
 		this.canReset && this.$refs.paging.reload();
 		this.canReset = true;
 	},
 	methods: {
+		//选择地址
+		selectedAddressFun(item) {
+			//只有商品详情页传过来id,才能点击选择
+			if (this.selectedAddressId) {
+				this.selectedAddressId = item.id
+				let pages = getCurrentPages();
+				let prevPage = pages[pages.length - 2];
+				// 传参
+				prevPage.$vm.selectedAddressId = this.selectedAddressId;
+			}
+
+		},
 		// 获取数据
 		queryList(pageNo, pageSize) {
 			let params = {
@@ -171,37 +187,46 @@ export default {
 	display: flex;
 	flex-direction: column;
 }
+
 .main-list {
 	flex: 1;
 	padding: 24rpx;
+
 	.mitem {
 		padding: 20rpx;
 		margin-bottom: 24rpx;
 		background: #FFFFFF;
-		box-shadow: 0 4rpx 16rpx 0 rgba(176,176,176,0.05);;
+		box-shadow: 0 4rpx 16rpx 0 rgba(176, 176, 176, 0.05);
+		;
 		border-radius: 12rpx;
+
 		.item-line {
 			display: flex;
 			align-items: center;
 		}
+
 		.info-box {
 			flex: 1;
+
 			.atext {
 				font-weight: 400;
 				font-size: 30rpx;
 				color: #333;
 			}
+
 			.btext {
 				font-weight: 400;
 				font-size: 28rpx;
 				color: #2F3437;
 				margin-top: 12rpx;
 			}
+
 			.name {
 				font-weight: 500;
 				margin-right: 10rpx;
 			}
 		}
+
 		.actions {
 			font-weight: 400;
 			font-size: 28rpx;
@@ -209,19 +234,21 @@ export default {
 			display: flex;
 			align-items: center;
 			justify-content: space-between;
+
 			.right {
 				gap: 24rpx;
 				display: flex;
 				align-items: center;
 			}
 		}
+
 		.default {
 			font-weight: 400;
 			font-size: 28rpx;
 			color: #F35031;
 			margin-left: 20rpx;
 			padding: 2rpx 12rpx;
-			background: rgba(243,80,49,0.1);
+			background: rgba(243, 80, 49, 0.1);
 			border-radius: 8rpx;
 		}
 	}

+ 1 - 1
src/points/components/product-list/product-list.vue

@@ -235,7 +235,7 @@ export default {
     // 处理兑换
     handleExchange(product) {
       uni.navigateTo({
-        url: '/points/productDetails/index?id=10'
+        url: `/points/productDetails/index?id=19`
       });
       console.log('兑换商品:', product)
     },

+ 18 - 12
src/points/productDetails/applyExchange.vue

@@ -25,7 +25,7 @@
                 </view>
                 <view class="mustInput">
                     <u--form>
-                        <u-form-item required="true" label="申请原因" label-width="58" prop="selectReasonValue">
+                        <u-form-item required label="申请原因" label-width="58" prop="selectReasonValue">
                             <view class="tip">
                                 <view :style="{ color: selectReasonValue ? '#333' : '#999' }">{{
                                     selectReasonValue !== null ? selectReasonValue : '请选择申请原因' }}</view>
@@ -35,9 +35,10 @@
                             </view>
                         </u-form-item>
 
-                        <u-form-item required="true" label="问题描述/凭证" label-width="86" prop="selectReasonValue">
+                        <u-form-item required label="问题描述/凭证" label-width="86" prop="selectReasonValue">
                             <view class="tip">
-                                <view>{{ questionOrDiscribeValue ? questionOrDiscribeValue : '请您务必上传描述和凭证' }}</view>
+                                <view :style="{ color: questionOrDiscribeValue ? '#333' : '#999' }" class="questionOrDiscribeValue">
+                                    {{ questionOrDiscribeValue ? questionOrDiscribeValue : '请您务必上传描述和凭证' }}</view>
                                 <image style="width: 28rpx;height: 28rpx;margin-left: 8rpx;"
                                     @click="selectApplyReasonFun('2')" src="@/static/points/Keyboard_arrow_rifht.png"
                                     mode=""></image>
@@ -84,7 +85,7 @@ export default {
     data() {
         return {
             fileList: [],
-            questionOrDiscribeValue: '',
+            questionOrDiscribeValue: null,
             selectReasonValue: null,
             title: '申请换货',
             isTop: 0,
@@ -122,7 +123,8 @@ export default {
         if (data) {
             //console.log(data,'66666666')
             //decodeURIComponent (data) 
-            if (data.questionOrDiscribeValue && data.questionOrDiscribeValue !== "null") {
+            if (data.questionOrDiscribeValue && data.questionOrDiscribeValue !== "null" && data.questionOrDiscribeValue !== "") {
+                
                 this.questionOrDiscribeValue = data.questionOrDiscribeValue
             }
 
@@ -145,17 +147,13 @@ export default {
         //console.log("滚动距离为:" + e.scrollTop);
         this.isTop = e.scrollTop;
     },
-    onReady() {
-        // 页面加载完成后为表单设置规则
-        this.$refs.uForm.setRules(this.rules);
-    },
 
     methods: {
         //提交
         async goSubmit() {
-            if (this.receivedStatus || this.selectReasonValue || this.fileList.length === 0) {
-                uni.$u.toast('请选择申请原因\n或\n请上传描述/凭证')
-               
+            if (!this.selectReasonValue || !this.questionOrDiscribeValue || this.fileList.length === 0) {
+                uni.$u.toast('请选择申请原因\n或\n请上传描述/凭证')  
+                return
             }
 
 
@@ -270,6 +268,14 @@ export default {
         .u-form-item__body__right {
             flex: none;
         }
+        .questionOrDiscribeValue{
+            width: 400rpx;
+            white-space:nowrap;
+            overflow: hidden;
+            text-overflow: ellipsis;
+            text-align: right;
+
+        }
 
         .title {
             font-weight: 400;

+ 23 - 11
src/points/productDetails/components/selectProduct.vue

@@ -3,9 +3,10 @@
         <image style="width: 35rpx;height: 35rpx;position: absolute;right: 40rpx;top:40rpx" @click="closeSelectProduct"
             src="@/static/points/closeIcon.png" mode=""></image>
         <view class="addressBox">
-            <uni-icons class="icon location icon-cuo" type="location" size="20" @tap=""></uni-icons>
-            <text class="name">张三</text>
-            <text class="address">山西省太原市小店区营盘街道某某小区</text>
+            <image style="width: 40rpx;height: 40rpx;" src="@/static/points/addressIcon.png" mode=""></image>
+
+            <text class="name" v-if="defaultAddress">{{ defaultAddress.userName }}</text>
+            <text class="address" v-if="defaultAddress">{{ defaultAddress.address + defaultAddress.atlasAdd }}</text>
             <image style="width: 28rpx;height: 28rpx;position: absolute;right: 0;" @click="addressSelectFun"
                 src="@/static/points/Keyboard_arrow_rifht.png" mode=""></image>
 
@@ -69,7 +70,7 @@
 
         </view>
         <!--支付方式 -->
-        <u-radio-group class="nodeClass" v-model="selectPayMeth" @change="groupChange">
+        <u-radio-group v-if="selectPayMeth" class="nodeClass" v-model="selectPayMeth">
             <view style="width: 100%;">
                 <view style="display: flex;justify-content: space-between;width: 100%;">
                     <view style="display: flex;">
@@ -123,11 +124,16 @@ export default {
         params: {
             type: Object,
             default: {}
-        }
+        },
+        defaultAddress: {
+            type: Object,
+            default: {}
+        },
+        
     },
     data() {
         return {
-            orderRemarks:'',
+            orderRemarks: '',
             selectPayMeth: '1',
             reasonRefusal: '',
             showPopup: false,
@@ -160,7 +166,9 @@ export default {
 
     methods: {
         //
-        onShowFun(selectedObj) {
+        onShowFun(selectedObj, orderRemarks, selectPayMeth) {
+            if (orderRemarks) this.orderRemarks = orderRemarks
+            if (selectPayMeth) this.selectPayMeth = selectPayMeth
             if (selectedObj) {
                 this.selectedObj = JSON.parse(JSON.stringify(selectedObj))
             } else {
@@ -180,8 +188,8 @@ export default {
         },
         //立即兑换
         redeemNowFun() {
-             this.$emit('redeemNowFun', this.selectedObj ? JSON.parse(JSON.stringify(this.selectedObj)) : null)
-    
+            this.$emit('redeemNowFun', this.selectedObj ? JSON.parse(JSON.stringify(this.selectedObj)) : null, this.selectPayMeth, this.orderRemarks)
+
 
         },
         //点击选规则
@@ -213,12 +221,12 @@ export default {
         },
         //关闭选择商品页
         closeSelectProduct() {
-            this.$emit('closeSelectProduct', this.selectedObj ? JSON.parse(JSON.stringify(this.selectedObj)) : null)
+            this.$emit('closeSelectProduct', this.selectedObj ? JSON.parse(JSON.stringify(this.selectedObj)) : null, this.selectPayMeth, this.orderRemarks)
         },
         //去我的地址页面
         addressSelectFun() {
             uni.navigateTo({
-                url: '/points/productDetails/addressManagement'
+                url:`/pages/address/index?selectedAddressId=${this.defaultAddress.id}`
             });
         }
 
@@ -259,6 +267,10 @@ export default {
             text-align: left;
             font-style: normal;
             text-transform: none;
+            width: 460rpx;
+            white-space: nowrap;
+            overflow: hidden;
+            text-overflow: ellipsis;
         }
     }
 

+ 254 - 88
src/points/productDetails/index.vue

@@ -4,7 +4,7 @@
       <!-- 导航栏  :leftIconColor="!isTop ? '#fff' : '#000'"-->
       <u-navbar :placeholder="true" autoBack>
         <view slot="center">
-          <view class="center" style="background-color: #fff;">商品详情</view>
+          <view class="center navbar-title" style="background-color: #fff;">商品详情</view>
         </view>
       </u-navbar>
       <!-- 主图 -->
@@ -43,30 +43,30 @@
         <!-- 第二行text -->
         <view class="seconedRow">
           <view class="specClass">
-            <view v-if="!selectedObj"
-              style="display: flex;align-items: center;justify-content:space-between;width: 100%;">
-              <view style="color: #666666;">选择</view>
-              <image style="width: 28rpx;height: 28rpx;" @click="selectProductShowFun"
-                src="@/static/points/Keyboard_arrow_rifht.png" mode=""></image>
-            </view>
-            <view v-if="selectedObj"
-              style="display: flex;align-items: center;justify-content: space-between;width: 100%;">
+            <view style="display: flex;align-items: center;justify-content: space-between;width: 100%;">
               <view style="display: flex;align-items: center;">
                 <text style="color: #666666;">规格</text>
-                <ImageItem class="imgClass" :src="$globalData.publicUrl + selectedObj.image" />
+                <ImageItem v-if="selectedObj" class="imgClass" :src="$globalData.publicUrl + selectedObj.image" />
               </view>
-              <view style="display: flex;align-items: center;">
-                <text style="color: #666666;margin-right: 8rpx;">已选:{{ selectedObj.specValueText }}</text>
-                <image style="width: 28rpx;height: 28rpx;" @click="selectProductShowFun"
-                  src="@/static/points/Keyboard_arrow_rifht.png" mode=""></image>
+              <view style="display: flex;align-items: center;position: relative;">
+                <text v-if="selectedObj" style="color: #666666;margin-right: 30rpx;">已选:{{
+                  selectedObj.specValueText }}</text>
+                <text v-else style="color: #999;margin-right: 30rpx;">选择商品</text>
+                <span style="position: absolute;right: 0;top: 1rpx;">
+                  <image style="width: 28rpx;height: 28rpx;" @click="selectProductShowFun"
+                    src="@/static/points/Keyboard_arrow_rifht.png" mode=""></image>
+                </span>
               </view>
             </view>
 
           </view>
           <view class="arriveAddressClass">
             <text style="color: #666666;margin-right: 24rpx;">送至</text>
-            <text>山西省太原市万柏林区</text>
-            <span style="position: absolute;right: 0;">
+            <text v-if="defaultAddress"
+              style="width: 520rpx;white-space:nowrap;overflow: hidden;text-overflow: ellipsis;">
+              {{ defaultAddress.address }}</text>
+            <text v-else style="color: #999;position: absolute;right: 30rpx;">添加收货地址</text>
+            <span style="position: absolute;right: 0;top: 1rpx;">
               <image style="width: 28rpx;height: 28rpx;" @click="addressSelectFun"
                 src="@/static/points/Keyboard_arrow_rifht.png" mode=""></image>
             </span>
@@ -134,9 +134,10 @@
       <u-popup :show="redemptionRulesShowPopup" mode="bottom" @close="redemptionRulesShowPopup = false" round="20">
         <RedemptionRules ref="redemptionRulesRef"></RedemptionRules>
       </u-popup>
-      <u-popup :show="selectProductShowPopup" mode="bottom" round="10">
-        <SelectProduct :params="params" ref="selectProductRef" @redeemNowFun="redeemNowFun"
-          @closeSelectProduct="closeSelectProduct"></SelectProduct>
+      <u-popup :z-index="999" :show="selectProductShowPopup" mode="bottom" round="10">
+        <SelectProduct :params="params" ref="selectProductRef" :defaultAddress="defaultAddress"
+          @redeemNowFun="redeemNowFun" @closeSelectProduct="closeSelectProduct">
+        </SelectProduct>
       </u-popup>
 
     </scroll-view>
@@ -151,7 +152,14 @@
 import ImageItem from "@/components/swiper/components/image.vue";
 import RedemptionRules from "./components/redemptionRules.vue";
 import SelectProduct from "./components/selectProduct.vue";
-import { productGetById, productOrderCreate } from '@/api/points'
+import { productGetById, productOrderCreate, productOrderPay } from '@/api/points'
+import { getAddrList, } from '@/api/address';
+import {
+  getInfo,
+  payoff,
+  pay,
+  getSignature,
+} from '@/api/index.js';
 
 export default {
   components: { ImageItem, RedemptionRules, SelectProduct },
@@ -167,19 +175,35 @@ export default {
         { name: '7天无理由退换', icon: '/static/points/Group2.png', isShow: false },
         { name: '破损包退换', icon: '/static/points/return7.png', isShow: false },
       ],
-      selectedObj: null
+      selectedObj: null,
+      defaultAddress: null,
+      selectPayMeth: null, //1 微信支付 2 余额
+      orderRemarks: null,
+      addressList: [],
+      dBalance: 0.00,
 
 
     }
   },
-  onLoad(id) {
-    if (id) {
-      this.productGetByIdFun(id)
+  onLoad(data) {
+    console.log(data, '66666')
+    if (data.id) {
+      this.productGetByIdFun(data.id)
+      this.getAddrListFun()
+      this.getinfo()
     }
 
   },
   onShow() {
-
+    //选择地址后传回的地址id
+    if (this.selectedAddressId) {
+      if (this.selectedAddressId !== this.defaultAddress.id) {
+        this.defaultAddress = this.addressList.find(item => {
+          if (item.id == this.selectedAddressId)
+            return item
+        });
+      }
+    }
   },
   onPageScroll(e) {
     //console.log("滚动距离为:" + e.scrollTop);
@@ -190,9 +214,36 @@ export default {
     handleContentScroll(e) {
       this.isTop = e.detail.scrollTop > 0
     },
+    //账户余额
+    getinfo() {
+      getInfo().then(res => {
+        if (res.data.code == 200) {
+          console.log(res, 'res6666')
+          this.dBalance = res.data.data.dBalance.toFixed(2)
+        }
+      })
+    },
+    //查询默认地址
+    getAddrListFun() {
+      let params = {
+        current: 1,
+        size: 100,
+        openId: uni.getStorageSync('wx_copenid'),
+      }
+      getAddrList(params).then(res => {
+        if (res.data.code === 200) {
+          this.addressList = res.data.data
+          this.defaultAddress = res.data.data.find(item => {
+            if (item.type == 1)
+              return item
+          });
+        }
+      });
+    },
+
     //查询商品详情
     productGetByIdFun(id) {
-      productGetById({ id: 19 }).then(res => {
+      productGetById({ id: id }).then(res => {
         if (res.data.code === 200) {
           this.params = Object.assign({}, res.data.data)
           //this.selectedObj = this.params.specComboVOList[0]
@@ -215,95 +266,204 @@ export default {
       this.redemptionRulesShowPopup = true
     },
     //立即兑换
-    redeemNowFun(selectedObj) {
+    redeemNowFun(selectedObj, selectPayMeth, orderRemarks) {
       if (selectedObj) this.selectedObj = selectedObj
+      if (selectPayMeth) this.selectPayMeth = selectPayMeth
+      if (orderRemarks) this.orderRemarks = orderRemarks
+
+      // if (this.remainingTime == 0) {
+      // 	uni.showToast({
+      // 		title: '订单已过期',
+      // 		icon: 'none'
+      // 	})
+      // 	return;
+      // 
+      // uni.navigateTo({
+      //   url: '/points/productDetails/pendingPayment'
+      // });
+
       if (this.selectedObj) {
+        if (this.selectPayMeth == null) {
+          uni.showToast({
+            title: '请选择支付方式',
+            icon: 'none'
+          })
+        } else if (this.selectPayMeth == 1) {
+          //微信支付 
+          this.weixinPay()
+        } else if (this.selectPayMeth == 2) {
+          //余额支付
+          this.nowYuyue()
+        }
+
+      } else {
+        this.selectProductShowPopup = true
+        this.$nextTick(() => {
+          this.$refs.selectProductRef.onShowFun(this.selectedObj, this.orderRemarks, this.selectPayMeth)
+        });
+      }
+
+    },
+    //微信支付
+    weixinPay() {
+      let params = {}
+      params.openId = uni.getStorageSync('wx_copenid');//用户openId
+      params.addressId = this.defaultAddress.id;//地址ID
+      params.productId = this.params.id;
+      params.name = this.params.name;
+      params.productMainImage = this.params.productMainImage;
+      params.skuId = this.selectedObj.index; //选中的SKU ID
+      params.specNameValueLis = this.selectedObj.specNameValueList; // SKU列表(规格组合明细)
+      params.quantity = 1; //购买数量
+      params.payType = Number(this.selectPayMeth);//支付方式:1微信支付 2账户余额
+      params.freightAmount = this.params.freight; //运费
+      params.totalAmount = this.selectedObj.originPrice;// 总金额
+      params.payAmount = this.selectedObj.priceMoney;// 支付金额
+      params.pointsUsed = this.selectedObj.pricePoint;// 使用的积分
+      params.buyerRemark = this.orderRemarks;//买家备注信息
+      console.log(params, 'params')
+      productOrderCreate(params).then(res => {
+        return
+        productOrderPay().then(res => {
+
+        })
+
+      })
+      return
+      let url = 'https://test.baoxianzhanggui.com/fragrance/'
+      payoff(params).then(res => {
+        let payConfig = JSON.parse(res.data.data)
+        getSignature(url).then(res => {
+          this.wxconfig = res.data
+          wx.config({
+            beta: true,
+            debug: false,
+            appId: this.wxconfig.appId, // 公众号ID 
+            // appId: uni.getAppBaseInfo().host.appId, // 公众号ID 
+            timestamp: this.wxconfig.timestamp, // 时间戳,自1970年以来的秒数
+            nonceStr: this.wxconfig.nonceStr, // 随机串
+            signature: this.wxconfig.sign, // 微信签名方式
+            jsApiList: ['getBrandWCPayRequest']
+          });
+          var vm = this
+          wx.invoke('getBrandWCPayRequest',
+            // 下面参数内容都是后台返回的
+            {
+              'appId': payConfig.appid, // 公众号名称,由商户传入
+              'timeStamp': payConfig.timeStamp, // 时间戳
+              'nonceStr': payConfig.nonceStr, // 随机串
+              'package': payConfig.package, // 预支付id
+              'signType': payConfig.signType, // 微信签名方式
+              'paySign': payConfig.paySign, // 微信签名
+            },
+            function (res) {
+              // 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
+
+              // JSON.stringify(res);
+              if (res.err_msg == "get_brand_wcpay_request:ok") {
+                uni.navigateTo({
+                  url: '/points/productDetails/paymentSuccessful'
+                });
+              } else if (res.err_msg == "get_brand_wcpay_request:cancel") {
+                uni.showToast({
+                  title: '已取消支付',
+                  icon: 'none'
+                })
+                uni.navigateTo({
+                  url: '/points/productDetails/pendingPayment'
+                });
+
+
+              } else {
+                alert('付款失败');
+              }
+            }
+          )
+        })
+      })
+    },
+    //账号余额支付
+    nowYuyue() {
+      if (parseInt(this.dBalance) < parseInt(this.selectedObj.priceMoney)) {
+        uni.showModal({
+          title: '账户余额不足',
+          content: '请充值',
+          success: function (res) {
+            if (res.confirm) {
+              uni.navigateTo({
+                url: '../../pages/my/pay?name=充值'
+              })
+            } else if (res.cancel) { }
+          }
+        });
+      } else {
         let params = {}
-        ////用户openId
-        params.openId = uni.getStorageSync('wx_copenid');
-        //地址ID
-        params.addressId = '11';
+        params.openId = uni.getStorageSync('wx_copenid');//用户openId
+        params.addressId = this.defaultAddress.id;//地址ID
         params.productId = this.params.id;
         params.name = this.params.name;
         params.productMainImage = this.params.productMainImage;
-        //选中的SKU ID
-        params.skuId = this.selectedObj.index;
-        // SKU列表(规格组合明细)
-        params.specNameValueLis = this.selectedObj.specNameValueList;
-        ////购买数量
-        params.quantity = 1;
-        ////支付方式:1微信支付 2账户余额
-        params.payType = Number(this.$refs.selectProductRef.selectPayMeth);
-        //运费
-        params.freightAmount = this.params.freight;
-        // 总金额
-        params.totalAmount = this.selectedObj.originPrice;
-        // 支付金额
-        params.payAmount = this.selectedObj.priceMoney;
-        // 使用的积分
-        params.pointsUsed = this.selectedObj.pricePoint;
-        //买家备注信息
-        params.buyerRemark = this.$refs.selectProductRef.orderRemarks;
-        uni.navigateTo({
-          url: '/points/productDetails/paymentSuccessful'
-        });
+        params.skuId = this.selectedObj.index; //选中的SKU ID
+        params.specNameValueLis = this.selectedObj.specNameValueList; // SKU列表(规格组合明细)
+        params.quantity = 1; //购买数量
+        params.payType = Number(this.selectPayMeth);//支付方式:1微信支付 2账户余额
+        params.freightAmount = this.params.freight; //运费
+        params.totalAmount = this.selectedObj.originPrice;// 总金额
+        params.payAmount = this.selectedObj.priceMoney;// 支付金额
+        params.pointsUsed = this.selectedObj.pricePoint;// 使用的积分
+        params.buyerRemark = this.orderRemarks;//买家备注信息
         console.log(params, 'params')
-        return
-        
-        
         productOrderCreate(params).then(res => {
-          
-          uni.requestPayment({
-            "provider": "wxpay",
-            "orderInfo": {},
-            success(res) { },
-            fail(e) { }
+          return
+          productOrderPay().then(res => {
+
           })
-          // uni.navigateTo({
-          //   url: '/points/productDetails/paymentSuccessful'
-          // });
+
         })
+        return
+        var data = {
+          cId: this.details.cId,
+          payType: this.selectedPayment,
+          couponReceiveId: this.couponReceiveId,
+          preferential: this.preferential, //优惠金额
+          totalPrice: this.totalPrice, //总金额
+        }
+        payoff(data).then(res => {
+          if (res.data.code == 200) {
+            uni.navigateTo({
+              url: '/points/productDetails/paymentSuccessful'
+            });
+          } else {
+            uni.showToast({
+              icon: 'error',
+              title: res.data.msg,
+            })
+          }
 
-      } else {
-        this.selectProductShowPopup = true
-        this.$nextTick(() => {
-          this.$refs.selectProductRef.onShowFun(this.selectedObj)
-        });
+        })
       }
-
     },
     //打开选择商品页
     selectProductShowFun() {
       this.selectProductShowPopup = true
       this.$nextTick(() => {
-        this.$refs.selectProductRef.onShowFun(this.selectedObj)
+        this.$refs.selectProductRef.onShowFun(this.selectedObj, this.orderRemarks, this.selectPayMeth)
       });
     },
     //关闭选择商品页
-    closeSelectProduct(selectedObj) {
-      if (selectedObj) {
-        this.selectedObj = selectedObj
-      }
+    closeSelectProduct(selectedObj, selectPayMeth, orderRemarks) {
+      if (selectedObj) this.selectedObj = selectedObj
+      if (selectPayMeth) this.selectPayMeth = selectPayMeth
+      if (orderRemarks) this.orderRemarks = orderRemarks
       this.selectProductShowPopup = false
     },
-    //去我的地址页面
+    //去我的地址页面 /points/productDetails/addressManagement
     addressSelectFun() {
       uni.navigateTo({
-        url: '/points/productDetails/addressManagement'
+        url: `/pages/address/index?selectedAddressId=${this.defaultAddress.id}`
       });
     },
 
-    //导航栏返回按钮
-    leftClick() {
-      uni.navigateTo({
-        url: `pages/member/center`
-      })
-      // /let str = uni.$u.queryParams(params);
-      // uni.navigateTo({
-      // 	url: `/packageA/pages/shop/coupon/couponDetail${str}`
-      // });
-    },
-
   }
 }
 </script>
@@ -313,6 +473,11 @@ export default {
 .mainImame {
   height: 456rpx;
 }
+::v-deep .u-popup{
+  .u-transition, .u-fade-enter-to, .u-fade-enter-active{
+    z-index: 999!important;
+  }
+}
 
 .footer-bar {
   .u-button {
@@ -437,6 +602,7 @@ export default {
     .arriveAddressClass {
       margin-top: 32rpx;
       position: relative;
+      display: flex;
     }
 
     .addressTextClass {

+ 238 - 44
src/points/productDetails/pendingPayment.vue

@@ -13,8 +13,8 @@
                 </view>
                 <view class="content">
                     <view class="addressBox">
-                        <image style="width: 45rpx;height: 40rpx;" @click="addressSelectFun"
-                            src="@/static/points/addressIcon.png" mode=""></image>
+                        <image style="width: 45rpx;height: 40rpx;" src="@/static/points/addressIcon.png" mode="">
+                        </image>
                         <view style="margin-left: 16rpx;">
                             <view class="name">
                                 张三 <text>
@@ -60,8 +60,23 @@
                         </view>
                     </view>
                     <view class="weiChect">
-                        <view class="text">微信支付</view>
-                        <view class="text">微信支付</view>
+                        <view style="display: flex;">
+                            <image v-if="payMeth == '1'" style="width: 40rpx;height: 40rpx;"
+                                src="@/static/points/weiXin.png" mode="">
+                            </image>
+                            <image v-if="payMeth == '2'" style="width: 40rpx;height: 40rpx;"
+                                src="@/static/points/yue.png" mode="">
+                            </image>
+                            <view class="text" style="color: #333;margin-left: 16rpx;">{{ payMeth == '1' ? '微信支付' :
+                                '余额支付' }}
+                            </view>
+
+                        </view>
+                        <view>
+                            <u-radio-group v-model="payMeth">
+                                <u-radio activeColor="#03C1B8 " :name=payMeth style="margin: 0;"></u-radio>
+                            </u-radio-group>
+                        </view>
                     </view>
                     <view class="orderInfo">
                         <view class="item">
@@ -89,18 +104,19 @@
             <view class="buttonClass">
                 <u-button v-if="title == '待支付'" :customStyle="{
                     color: '#999',
-                    background: ''
+                    background: '',
+                    border: '2rpx solid rgba(153, 153, 153, 1)'
                 }" @click="cancelOrderFun">取消支付</u-button>
 
                 <u-button v-if="title == '待支付'" :customStyle="{
                     color: '#fff ',
                     background: '#03C1B8'
-                }" @click="checkOrder">去付款</u-button>
+                }" @click="goPay">去付款</u-button>
 
                 <u-button v-if="title == '订单取消'" :customStyle="{
                     color: '#fff ',
                     background: '#03C1B8'
-                }" @click="checkOrder">再次购买</u-button>
+                }" @click="buyAgain">再次购买</u-button>
             </view>
 
         </scroll-view>
@@ -108,14 +124,10 @@
 
         <!-- 取消订单 <u-line></u-line>-->
         <u-popup :show="cancelOrderShowPopup" mode="bottom" round="10">
-            <view class="content">
-
-            </view>
-
             <view class="popup-con">
                 <!-- 标题 -->
                 <view class="popup-text">
-                    <text>取消订单</text>
+                    <text class="title">取消订单</text>
                     <text @click="cancelOrderShowPopup = false">取消</text>
                 </view>
                 <!-- 项目列表 -->
@@ -124,20 +136,8 @@
                     <u-radio-group v-model="selectReason" @change="groupChange">
 
                         <view style="padding: 0 20rpx 24rpx 20rpx;">
-                            <view class="radioBox">
-                                <u-radio activeColor="#03C1B8 " name='1'></u-radio>买错了/不想要
-                            </view>
-                            <view class="radioBox">
-                                <u-radio activeColor="#03C1B8 " name='2'></u-radio> 商品无货
-                            </view>
-                            <view class="radioBox">
-                                <u-radio activeColor="#03C1B8 " name='3'></u-radio> 商品信息填写错误
-                            </view>
-                            <view class="radioBox">
-                                <u-radio activeColor="#03C1B8 " name='4'></u-radio> 地址信息填写错误
-                            </view>
-                            <view class="radioBox">
-                                <u-radio activeColor="#03C1B8 " name='5'></u-radio> 其他原因
+                            <view class="radioBox" v-for="item in selectReasonList">
+                                <u-radio activeColor="#03C1B8 " :name=item.value></u-radio>{{ item.text }}
                             </view>
                         </view>
                     </u-radio-group>
@@ -145,9 +145,10 @@
                 </view>
                 <view class="popupButtonClass">
                     <u-button :customStyle="{
-                        color: '#999',
-                        background: '#eee'
-                    }" @click="cancelOrderSubmit">提交</u-button>
+                        color: selectReason ? '#fff' : '#999',
+                        background: selectReason ? '#03C1B8' : '#eee'
+                    }" @click="cancelOrderSubmit">{{ selectReason ? '提交' : '请先选择原因' }}</u-button>
+
                 </view>
             </view>
 
@@ -164,18 +165,28 @@
 </template>
 
 <script>
-
+import { productOrderCancel, productOrderPay } from '@/api/points'
+import {
+    getInfo, payoff, pay, getSignature,
+} from '@/api/index.js';
 export default {
     components: {},
     data() {
         return {
-            selectReason:'',
+            payMeth: '2',
+            selectReason: '',
+            selectReasonValue: '',
             title: '待支付',
             cancelOrderShowPopup: false,
             orderStatus: '剩余时间 14:59', //超时未支付
-
-
-
+            selectReasonList: [
+                { value: '1', text: '买错了/不想要' },
+                { value: '2', text: '商品无货' },
+                { value: '3', text: '商品信息填写错误' },
+                { value: '4', text: '地址信息填写错误' },
+                { value: '5', text: '其他原因' },
+            ],
+            dBalance: 0.00,
         }
     },
     onLoad(data) {
@@ -188,24 +199,196 @@ export default {
     },
 
     methods: {
+        //去付款
+        goPay() {
+            if (this.payMeth == 1) {
+                //微信支付 
+                this.weixinPay()
+            } else if (this.payMeth == 2) {
+                //余额支付
+                this.nowYuyue()
+            }
+
+        },
+        //微信支付
+        weixinPay() {
+            let params = {}
+            params.openId = uni.getStorageSync('wx_copenid');//用户openId
+            params.addressId = this.defaultAddress.id;//地址ID
+            params.productId = this.params.id;
+            params.name = this.params.name;
+            params.productMainImage = this.params.productMainImage;
+            params.skuId = this.selectedObj.index; //选中的SKU ID
+            params.specNameValueLis = this.selectedObj.specNameValueList; // SKU列表(规格组合明细)
+            params.quantity = 1; //购买数量
+            params.payType = Number(this.selectPayMeth);//支付方式:1微信支付 2账户余额
+            params.freightAmount = this.params.freight; //运费
+            params.totalAmount = this.selectedObj.originPrice;// 总金额
+            params.payAmount = this.selectedObj.priceMoney;// 支付金额
+            params.pointsUsed = this.selectedObj.pricePoint;// 使用的积分
+            params.buyerRemark = this.orderRemarks;//买家备注信息
+            console.log(params, 'params')
+            productOrderCreate(params).then(res => {
+                return
+                productOrderPay().then(res => {
+
+                })
+
+            })
+            return
+            let url = 'https://test.baoxianzhanggui.com/fragrance/'
+            payoff(params).then(res => {
+                let payConfig = JSON.parse(res.data.data)
+                getSignature(url).then(res => {
+                    this.wxconfig = res.data
+                    wx.config({
+                        beta: true,
+                        debug: false,
+                        appId: this.wxconfig.appId, // 公众号ID 
+                        // appId: uni.getAppBaseInfo().host.appId, // 公众号ID 
+                        timestamp: this.wxconfig.timestamp, // 时间戳,自1970年以来的秒数
+                        nonceStr: this.wxconfig.nonceStr, // 随机串
+                        signature: this.wxconfig.sign, // 微信签名方式
+                        jsApiList: ['getBrandWCPayRequest']
+                    });
+                    var vm = this
+                    wx.invoke('getBrandWCPayRequest',
+                        // 下面参数内容都是后台返回的
+                        {
+                            'appId': payConfig.appid, // 公众号名称,由商户传入
+                            'timeStamp': payConfig.timeStamp, // 时间戳
+                            'nonceStr': payConfig.nonceStr, // 随机串
+                            'package': payConfig.package, // 预支付id
+                            'signType': payConfig.signType, // 微信签名方式
+                            'paySign': payConfig.paySign, // 微信签名
+                        },
+                        function (res) {
+                            // 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
+
+                            // JSON.stringify(res);
+                            if (res.err_msg == "get_brand_wcpay_request:ok") {
+                                uni.navigateTo({
+                                    url: '/points/productDetails/paymentSuccessful'
+                                });
+                            } else if (res.err_msg == "get_brand_wcpay_request:cancel") {
+                                uni.showToast({
+                                    title: '已取消支付',
+                                    icon: 'none'
+                                })
+                            } else {
+                                alert('付款失败');
+                            }
+                        }
+                    )
+                })
+            })
+        },
+        //账号余额支付
+        nowYuyue() {
+            if (parseInt(this.dBalance) < parseInt(10)) {
+                uni.showModal({
+                    title: '账户余额不足',
+                    content: '请充值',
+                    success: function (res) {
+                        if (res.confirm) {
+                            uni.navigateTo({
+                                url: 'pages/my/pay?name=充值'
+                            })
+                        } else if (res.cancel) { }
+                    }
+                });
+            } else {
+                let params = {}
+                params.openId = uni.getStorageSync('wx_copenid');//用户openId
+                params.addressId = this.defaultAddress.id;//地址ID
+                params.productId = this.params.id;
+                params.name = this.params.name;
+                params.productMainImage = this.params.productMainImage;
+                params.skuId = this.selectedObj.index; //选中的SKU ID
+                params.specNameValueLis = this.selectedObj.specNameValueList; // SKU列表(规格组合明细)
+                params.quantity = 1; //购买数量
+                params.payType = Number(this.selectPayMeth);//支付方式:1微信支付 2账户余额
+                params.freightAmount = this.params.freight; //运费
+                params.totalAmount = this.selectedObj.originPrice;// 总金额
+                params.payAmount = this.selectedObj.priceMoney;// 支付金额
+                params.pointsUsed = this.selectedObj.pricePoint;// 使用的积分
+                params.buyerRemark = this.orderRemarks;//买家备注信息
+                console.log(params, 'params')
+                productOrderCreate(params).then(res => {
+                    return
+                    productOrderPay().then(res => {
+
+                    })
+
+                })
+                return
+                var data = {
+                    cId: this.details.cId,
+                    payType: this.selectedPayment,
+                    couponReceiveId: this.couponReceiveId,
+                    preferential: this.preferential, //优惠金额
+                    totalPrice: this.totalPrice, //总金额
+                }
+                payoff(data).then(res => {
+                    if (res.data.code == 200) {
+                        uni.navigateTo({
+                            url: '/points/productDetails/paymentSuccessful'
+                        });
+                    } else {
+                        uni.showToast({
+                            icon: 'error',
+                            title: res.data.msg,
+                        })
+                    }
+
+                })
+            }
+        },
+        //查询账户余额
+        getinfo() {
+            getInfo().then(res => {
+                if (res.data.code == 200) {
+                    this.dBalance = res.data.data.dBalance.toFixed(2)
+                }
+            })
+        },
         //取消订单提交按钮
         cancelOrderSubmit() {
             this.cancelOrderShowPopup = false
             this.title = '订单取消'
             this.orderStatus = '您已取消支付'
+            let params = {
+                openId: uni.getStorageSync('wx_copenid'),
+                orderNo: '',
+                cancelReason: this.selectReasonValue,
+            }
+            return
+            productOrderCancel(params).then(res => {
+
+            })
+        },
+        //点击单选按钮
+        groupChange(val) {
+            this.selectReason = val
+            this.selectReasonList.forEach(item => {
+                if (item.value == val) {
+                    this.selectReasonValue = item.text
+                }
+
+            });
         },
         //关闭取消订单选择页
         closeCancelOrderFun() {
             this.cancelOrderShowPopup = false
         },
-        //取消订单
+        //取消订单按钮
         cancelOrderFun() {
             this.cancelOrderShowPopup = true
         },
-        //去我的地址页面
-        addressSelectFun() {
+        //再次购买
+        buyAgain() {
             uni.navigateTo({
-                url: '/points/productDetails/addressManagement'
+                url: `/points/productDetails/index?id=19`
             });
         }
 
@@ -231,6 +414,7 @@ export default {
     align-items: center;
     justify-content: flex-end;
     font-family: PingFang SC, PingFang SC;
+    margin-top: 20rpx;
 
     button {
         width: 168rpx;
@@ -239,7 +423,7 @@ export default {
         height: 56rpx;
         line-height: 40rpx;
         border-radius: 98rpx 98rpx 98rpx 98rpx;
-        border: 2rpx solid #03C1B8;
+
         font-size: 26rpx;
         padding: 0 0 10rpx 0;
         margin: 0 32rpx 0 0;
@@ -267,7 +451,7 @@ export default {
 }
 
 .content {
-    padding: 24rpx 32rpx 0 32rpx;
+    padding: 24rpx 32rpx 30rpx 32rpx;
     font-family: PingFang SC, PingFang SC;
     border-radius: 20rpx 20rpx 0 0;
 
@@ -436,8 +620,7 @@ export default {
         height: 268rpx;
         background: #FFFFFF;
         border-radius: 16rpx 16rpx 16rpx 16rpx;
-        padding: 26rpx 24rpx 2rpx 24rpx;
-        margin-bottom: 30rpx;
+        padding: 26rpx 24rpx 0 24rpx;
 
         .item {
             display: flex;
@@ -474,7 +657,8 @@ export default {
     font-size: 27rpx;
     color: #666666;
     background: #F5F8F8;
-    padding: 15rpx 40rpx 40rpx 40rpx;
+    padding: 40rpx;
+    border-radius: 20rpx 20rpx 0 0;
 
     .popup-text {
         font-weight: bold;
@@ -487,6 +671,15 @@ export default {
         justify-content: space-between;
         position: relative;
 
+        .title {
+            padding-bottom: 10rpx;
+            background-image: url("@/static/points/cancelOrderBg.png");
+            background-size: 100%;
+            background-repeat: no-repeat;
+            background-position: center bottom;
+            /* 水平居中、垂直靠下 */
+        }
+
         text:last-of-type {
             font-weight: 400;
             font-size: 28rpx;
@@ -548,7 +741,8 @@ export default {
         button {
             align-items: center;
             border-radius: 98rpx 98rpx 98rpx 98rpx;
-            font-size: 26rpx;
+            font-size: 32rpx;
+            font-weight: 500;
         }
     }
 }