You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1021 lines
26 KiB
JavaScript

9 months ago
const app = getApp();
const loginApi = require('../../../utils/loginApi.js');
const cartUtils = require('../../../utils/cartUtils.js');
const cartNum = require('../../../utils/cartNum.js');
const cartOrder = require('../../../utils/cartOrder.js');
const card = require('../../../utils/card.js');
const des = require('../../../utils/des.js');
const md5 = require('../../../utils/md5.js');
Page({
/**
* 页面的初始数据
*/
data: {
hide: true,
showPayPwdInput: false, //是否展示密码输入层
pwdVal: '', //输入的密码
payFocus: true, //文本框焦点
cartHeight: 0,
ip: "123.12.12.123",
taktTime: 2000, // 查询间隔时间(毫秒)
executeCount: 30, // 查询次数
repeadCount: 2, // 重查次数
iPhoneX: wx.getStorageSync("model"),
addressInfo: {}, // 收货地址信息
address: "选择收货地址", //
showCart: false, // 是否展示购物车数据
cartList: [], // 购物车商品
cartTotal: {}, // 购物车汇总
boxFee: 0.00, // 餐盒费
deliverFee: 0.00, // 配送费
mobileFocus: false,
mobileStatus: false,
mobile: wx.getStorageSync("vipMobile"),
description: "",
dinewayIndex: 0, // 就餐方式index
dinewayList: [],
paywayIndex: 0, // 支付方式index
paywayList: [{
name: "会员卡支付",
sign: "02",
color: "#000",
icon: "icon-huiyuanqia"
},
{
name: "微信支付",
sign: "05",
color: "green",
icon: "icon-weixinzhifu6"
}
],
store: {},
memberInfo: {},
payOrder: {},
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function(options) {
var that = this;
this.data.dinewayIndex = app.busMode
var store = wx.getStorageSync("store");
console.log(store);
if (store.storeBusModes) {
var busArr = store.storeBusModes.split(',');
for (var i = 0; i < busArr.length; i++) {
that.data.dinewayList.push(cartUtils.getStoreBusMode(i));
}
}
that.setData({
store: store,
takeMethod: that.data.dinewayIndex,
dinewayList: that.data.dinewayList
});
// 初始化购物车utils
cartNum.init(app, cartUtils);
// 获取页面信息
wx.getSystemInfo({
success: function(res) {
var cartHeight = res.windowHeight * 0.7;
that.setData({
cartHeight: cartHeight
});
}
});
},
/**
* 刷新地址
*/
updateDisSelectAddress: function(message) {
var tempAddress = JSON.parse(message);
this.data.addressInfo = tempAddress;
var address = "";
if (tempAddress.receiveAddress.length > 0) {
address = address + tempAddress.receiveAddress;
}
if (tempAddress.name.length > 0) {
address = address + " " + tempAddress.name;
}
if (tempAddress.receiveMobile.length > 0) {
address = address + " " + tempAddress.receiveMobile;
}
this.setData({
address: address
})
},
/***
* 支付
*/
bindGopay: function() {
var that = this;
that.setData({
pwdVal: "",
})
var payType = this.data.paywayList[this.data.paywayIndex];
var sign = payType.sign;
if (sign == "02") { // 会员支付
if (this.data.mobile == "") {
app.msg.showMsg("提示", "请您先获取手机号");
return;
}
var order = cartUtils.getStoreCartMap();
var totalMemberCash = order.totalMemberCash;
var cardAmcount = app.cardInfo.availableAmount;
if (totalMemberCash <= cardAmcount) {
that.createOrderInfo();
} else {
wx.showModal({
title: '提示',
content: '会员卡余额不足,请充值',
showCancel: true,
success: function(res) {
if (res.confirm) {
wx.navigateTo({
url: '../../card/recharge',
})
}
},
})
}
} else { // 微信支付
this.createOrderInfo();
}
},
// 创建订单
createOrderInfo: function() {
var that = this;
var store = cartUtils.getStore();
if (undefined == store) {
app.msg.showMsg("提示", "门店信息不存在");
return;
}
var order = cartUtils.getStoreCartMap();
if (undefined == order || undefined == order.dishes || order.dishes.length == 0) {
wx.showModal({
title: "提示",
content: "购物车没有商品,快去选购商品吧",
success: function(res) {
if (res.confirm) {
wx.navigateBack({
});
}
}
});
return;
}
// 组装订单数据
order = that.processOrder(order, store);
// 校验订单参数
var result = that.checkOrder(order);
if (!result.flag) {
if (result.msg != "") {
wx.showModal({
title: '提示',
showCancel: false,
content: result.msg,
success: function(res) {
if (res.confirm) {
if(result.url){
wx.navigateTo({
url: result.url,
});
}
if (app.utils.isNotBlank(result.sign)) {
that.setData({
mobileFocus: true
});
}
}
}
})
}
return;
}
var params = {
"method": "liteappdc.order.create",
"storeId": store.id,
"wid": app.wid,
"userId": app.userId,
"openId": app.openId,
"orderInfoJson": encodeURIComponent(JSON.stringify(order))
}
var ignores = [];
ignores.push("wid");
ignores.push("userId");
ignores.push("openId");
ignores.push("orderInfoJson");
app.jsapi.api(app.globalData.appKey, app.globalData.appSecret, app.globalData.serverUrl).ajax(params, ignores,
function(json) {
wx.hideLoading();
var result = json.data;
if (result.status == 1) {
var tOrder = result.data.order;
that.data.payOrder = tOrder;
var payMap = that.data.paywayList[that.data.paywayIndex];
var sign = payMap.sign;
if (sign == "02") {
if (order.totalMemberCash == parseFloat(tOrder.receiveAmount).toFixed(2)) {
var cardInfo = app.cardInfo;
var isNoPwd = cardInfo.isNoPwd; // 是否免密
var npAmount = cardInfo.npAmount; // 免密金额
var receiveAmount = tOrder.receiveAmount; // 付款金额
if (isNoPwd == 0) { // 不免密
that.showInputLayer();
} else {
if (receiveAmount > npAmount) {
that.showInputLayer(); // 不免密
} else {
that.cardPay();
}
}
} else {
app.msg.showMsg("提示", "下单失败请重试");
}
} else {
// 微信统一下单
if (order.totalCash == parseFloat(tOrder.receiveAmount).toFixed(2)) {
that.unifiedorder(tOrder.receiveAmount, tOrder.orderNo, tOrder.outTradeNo, store.id);
} else {
app.msg.showMsg("提示", "下单失败请重试");
}
}
} else {
app.msg.showMsg("提示", result.message);
}
},
function(error) {
app.msg.showMsg("提示", "网络中断,获取门店失败");
}
);
},
/**
* 会员卡支付
*/
cardPay: function() {
var that = this;
var store = cartUtils.getStore();
var subject = this.data.store.name;
var totalAmount = card.cardMoney(this.data.payOrder.amount);
var realAmount = card.cardMoney(this.data.payOrder.receiveAmount);
var payCardAmount = card.cardMoney(this.data.payOrder.receiveAmount);
var discountAmount = card.cardMoney(this.data.payOrder.discountAmount);
var params = {
'subject': subject,
'body': '微信小程序点餐消费',
"mobile": this.data.mobile,
"totalAmount": totalAmount,
"realAmount": realAmount,
"payCardAmount": payCardAmount,
"discountAmount": discountAmount,
// "couponTotalAmount":0,
'payMode': "02",
'shopNo': store.no,
'posNo': store.posNo,
"workerNo": store.workerNo
}
params.tradeNo = card.getTradeNo(); // 订单单号
var cardInfo = app.cardInfo;
var pays = card.getPays(realAmount);
var isNoPwd = 0;
var passwd = "";
if (that.data.pwdVal) { // 非免密支付
isNoPwd = 0;
passwd = des.stringToHexForDES(that.data.pwdVal);
} else {
var content = params.tradeNo + realAmount;
isNoPwd = 1;
passwd = md5.md5(content);
}
var cardPayInfo = {
"cardNo": cardInfo.cardNo,
"amount": realAmount,
"isNoPwd": isNoPwd,
"passwd": passwd
}
params.cardPayInfo = JSON.stringify(cardPayInfo);
var date = new Date();
var saleDate = app.utils.getFormatTime(date, 1);
params.batchNo = '01';
params.serialNo = '01';
params.saleDate = saleDate;
params.pointFlag = 2;
params.pointValue = 0;
params.pointAmount = realAmount;
params.sourceSign = app.sourceSign;
params.method = 'jw.mobile.trade.pay';
var ignores = ['batchNo', 'serialNo', 'subject', 'body', 'cardPayInfo', 'pays', 'coupons'];
that.setData({
hide: false,
msg: "处理中..."
});
console.log(params);
app.jsapi.memberApi(app.globalData.appMemberKey, app.globalData.appMemberSecret, app.globalData.serverMemberUrl).ajax(params, ignores,
function(json) {
console.log("会员卡支付", json);
var result = json.data;
if (result.status == 1) { //
var data = result.data;
var storeId = that.data.store.id;
var tradeVoucherNo = data.tradeVoucherNo;
var tradeNo = that.data.payOrder.outTradeNo;
that.uploadOrder(storeId, tradeVoucherNo, tradeNo);
} else {
that.setData({
hide: true,
msg: "处理中..."
});
wx.showModal({
title: "提示",
content: result.errMessage,
showCancel: false
});
}
},
function(error) {
that.setData({
hide: true,
msg: "处理中..."
});
wx.showModal({
title: "提示",
content: "网络连接失败",
showCancel: false
});
}
);
},
/**
* 微信支付统一下单
*/
unifiedorder: function(amount, orderNo, tradeNo, storeId) {
var that = this;
var appid = app.globalData.appid;
var openId = app.openId;
var params = {
"method": "liteappdc.pay.unifiedorder",
"storeId": storeId,
"operatorType": "custom",
"sourceSign": app.globalData.sourceSign,
"amount": amount,
"workerNo": "",
"posNo": "",
"appid": appid,
"openId": openId,
"ip": that.data.ip,
"orderNo": orderNo,
"tradeNo": tradeNo,
}
// 忽略签名参数
var ignores = [];
ignores.push("operatorType");
ignores.push("sourceSign");
ignores.push("accountId");
ignores.push("amount");
ignores.push("workerNo");
ignores.push("posNo");
ignores.push("appid");
ignores.push("openId");
ignores.push("ip");
ignores.push("orderNo");
ignores.push("tradeNo");
wx.showLoading({
title: '支付中...',
});
app.jsapi.api(app.globalData.appKey, app.globalData.appSecret, app.globalData.serverUrl).ajax(params, ignores,
function(json) {
wx.hideLoading();
var result = json.data;
if (result.status == 1) {
// 拉起小程序支付
that.payRequest(result.data, amount, tradeNo);
// 统一下单成功 启动定时器查询支付结果
that.timerQeuryPayResult(storeId, appid, orderNo, tradeNo, amount);
} else {
app.msg.showMsg("提示", result.message);
}
},
function(error) {
wx.hideLoading();
app.msg.showMsg("提示", "网络中断,操作失败");
}
);
},
/**
* 拉起微信支付
*/
payRequest: function(param, amount, tradeNo) {
var that = this;
wx.requestPayment({
'timeStamp': param.timeStamp,
'nonceStr': param.nonceStr,
'package': param.package,
'signType': param.signType,
'paySign': param.paySign,
complete: function(res) {
if (res.errMsg != "requestPayment:ok") {
wx.showModal({
title: '提示',
content: '支付遇到了错误或者您主动放弃了支付',
showCancel: false
});
// 支付失败 关闭定时器
if (that.data.interval) {
clearInterval(that.data.interval);
}
that.setData({
executeCount: 30
});
}
}
})
},
/**
* 定时器-查询支付结果
* 查询一分钟 30
*/
timerQeuryPayResult: function(storeId, appid, orderNo, tradeNo, amount) {
var that = this;
var executeCount = that.data.executeCount;
var interval = that.data.interval;
interval = setInterval(function() {
executeCount = that.data.executeCount;
if (executeCount < 0) {
// 查询次数用完 关闭并重置定时器
clearInterval(interval);
that.setData({
executeCount: 30
});
// 再此发起查询
var repeadCount = that.data.repeadCount;
if (repeadCount > 0) {
wx.showModal({
title: '提示',
content: '未查询到微信支付成功信息,是否再查询一次',
confirmText: "再查一次",
success: function() {
repeadCount = that.data.repeadCount - 1;
that.setData({
repeadCount: repeadCount
});
}
});
} else {
app.utils.alertErrorMsg("提示", "支付失败,请联系管理员");
}
} else {
executeCount -= 1;
that.setData({
executeCount: executeCount
});
// 查询微信支付结果
that.queryPayResult(storeId, appid, orderNo, tradeNo);
}
}, that.data.taktTime) //循环时间 这里是1秒
that.setData({
interval: interval
});
},
/**
* 查询支付结果
*/
queryPayResult: function(storeId, appid, orderNo, tradeNo) {
var that = this;
var params = {
"method": "liteAppdc.pay.orderquery",
"storeId": storeId,
"appid": appid,
"tradeNo": tradeNo
}
// 忽略签名参数
var ignores = [];
ignores.push("appid");
ignores.push("tradeNo");
app.jsapi.api(app.globalData.appKey, app.globalData.appSecret, app.globalData.serverUrl).ajax(params, ignores,
function(json) {
var result = json.data;
if (result.status == 1) {
var payResult = result.data;
// 支付成功
if (payResult.status == 1) {
// 关闭定时器,重置查询次数
clearInterval(that.data.interval);
that.setData({
executeCount: 30
});
/*** 通过微信异步通知来上传订单 这里不再主动发起上传 ***/
var prepayId = payResult.prepayId;
// 支付成功-上传订单
that.uploadOrder(storeId, prepayId, tradeNo);
}
} else {
console.log("查询订单支付结果异常:" + payResult.message);
}
},
function(error) {
clearInterval(that.data.interval);
that.setData({
executeCount: 30
});
wx.showModal({
title: '提示',
content: "网络中断,操作失败"
});
}
);
},
/**
* 上传订单
*/
uploadOrder: function(storeId, prepayId, tradeNo) {
var that = this;
var params = {
"method": "liteAppdc.salesOrder.create",
"storeId": storeId,
"prepayId": prepayId,
"tradeNo": tradeNo
}
// 不签名参数
var ignores = [];
ignores.push("prepayId");
ignores.push("tradeNo");
app.jsapi.api(app.globalData.appKey, app.globalData.appSecret, app.globalData.serverUrl).ajax(params, ignores,
function(json) {
that.setData({
hide: true,
msg: "处理中..."
});
var result = json.data;
if (result.status == 1) {
// 清除购物车商品
cartUtils.clearStoreCartMap();
// // 跳转到订单详情
// wx.redirectTo({
// url: '../detail/detail?orderNo=' + orderNo + "&storeId=" + storeId,
// });
// 跳转到订单详情
wx.redirectTo({
url: '../detail/detail?orderNo=' + result.data.orderNo + "&storeId=" + result.data.storeId,
});
} else {
app.msg.showMsg("提示", "订单信息异常,请取消下单。");
}
},
function(error) {
that.setData({
hide: true,
msg: "处理中..."
});
app.msg.showMsg("提示", "网络中断,获取品类失败");
}
);
},
// 校验订单信息
checkOrder: function(order) {
var that = this;
var flag = true;
var sign = "";
var msg = "";
// 支付方式
if (app.utils.isBlank(order.paymode)) {
flag = false;
msg = "请选择支付方式";
return {
flag: flag,
msg: msg
};
}
// 就餐方式
if (app.utils.isBlank(order.busMode)) {
flag = false;
msg = "请选择就餐方式";
return {
flag: flag,
msg: msg
};
}
// 如果是堂食,桌号不能为空
if (order.busMode == 0) {
if (undefined == order.tableNo || order.tableNo.length == 0) {
// 打开桌号列表
flag = false;
msg = "";
that.bindGoTables();
return {
flag: flag,
msg: msg
};
}
}
// 校验手机号
if (app.utils.isBlank(order.mobile)) {
flag = false;
sign: "mobile";
msg = "请输入手机号码以便为您提供更好的服务 ";
return {
flag: flag,
sign: sign,
msg: msg
};
}
if (order.busMode == 2) {
if (order.receiveAddress.length == 0) {
flag = false;
return {
url:'../address/address',
flag: flag,
sign: "提示",
msg: "请选择收货地址, 以便及时给您送餐",
};
}
}
// 校验user信息
if (app.utils.isBlank(order.memberId)) {
flag = false;
msg = "未能获取用户信息";
return {
flag: flag,
msg: msg
};
}
return {
flag: flag,
msg: msg
};
},
// 组装订单数据
processOrder: function(order, store) {
var that = this;
order.storeId = store.id;
order.storeNo = store.no;
order.storeName = store.name;
order.posNo = store.posNo;
order.workerNo = store.workerNo;
// 支付方式 05:微信支付 02:会员卡支付
var paywayIndex = that.data.paywayIndex;
var paywayList = that.data.paywayList;
var payway = paywayList[paywayIndex];
order.paymode = payway.sign;
// 就餐方式 0:堂食 1:外带 2:外卖
var dinewayIndex = that.data.dinewayIndex;
var dinewayList = that.data.dinewayList;
var dineway = dinewayList[dinewayIndex];
if(dineway.sign == undefined){
dineway.sign = 0;
}
order.busMode = dineway.sign;
order.takeMethod = "";
order.takeTime = "";
order.address = "";
/* 桌号 */
if (order.busMode != 2) {
order.tableId = app.table.tableId;
order.tableNo = app.table.tableNo;
order.tableName = app.table.tableName;
} else {
order.tableId = "";
order.tableNo = "";
order.tableName = "";
}
order.mobile = undefined == that.data.mobile ? "" : that.data.mobile;
order.cardNo = ""; // 会员卡号
order.memberId = app.userId;
order.description = that.data.description;
var receiveName = "";
var receiveMobile = "";
var receiveAddress = "";
var boxFee = 0.00;
var distributionFee = 0.00;
if (dinewayIndex == 1) { // 外带
boxFee = that.data.boxFee;
} else if (dinewayIndex == 2) { // 外卖
if (that.data.addressInfo.receiveMobile) {
receiveName = that.data.addressInfo.name;
receiveMobile = that.data.addressInfo.receiveMobile;
receiveAddress = that.data.addressInfo.receiveAddress;
}
boxFee = that.data.boxFee;
distributionFee = that.data.deliverFee;
}
order.receiveName = receiveName;
order.receiveMobile = receiveMobile;
order.receiveAddress = receiveAddress;
order.boxFee = boxFee;
order.distributionFee = distributionFee;
// 重新计算商品的总价和会员价
cartOrder.getTotal(order);
return order;
},
/**
* 刷新商品数量和购物车信息
*/
refreshCartData: function() {
var cartTotal = cartUtils.getCartTotal();
var cartList = cartUtils.getDishListByCart();
if (cartList.length == 0) {
this.setData({
showCart: false
});
}
this.setData({
cartTotal: cartTotal,
cartList: cartList
});
// 计算额外的费用
this.getExtraCost();
},
/**
* 修改购物车商品数量
*/
bindChangeNum: function(e) {
var that = this;
var sign = e.currentTarget.dataset.sign;
var uniqueId = e.currentTarget.dataset.uniqueid;
switch (sign) {
case "2":
cartNum.addNumberByCart(uniqueId);
break;
case "3":
cartNum.decNumberByCart(uniqueId);
break;
default:
console.log("error");
break;
}
//更新购物车
that.refreshCartData();
},
/**
* 打开/关闭购物车
*/
showCartList: function(e) {
// 获取购物车商品列表
var dishList = cartUtils.getDishListByCart();
this.setData({
cartList: dishList
});
if (this.data.cartList.length > 0) {
this.setData({
showCart: !this.data.showCart
});
}
},
/**
* 选择就餐方式
*/
binddineway: function(e) {
var index = e.currentTarget.dataset.index;
this.setData({
dinewayIndex: index,
takeMethod: index,
});
this.getExtraCost();
},
/**
* 计算额外的费用
*/
getExtraCost: function() {
var index = this.data.dinewayIndex;
var order = cartUtils.getStoreCartMap();
this.data.boxFee = cartOrder.getBoxFee(order);
this.data.deliverFee = cartOrder.getDeliverFee(this.data.store);
var extraCost = "";
if (index == 1) { // 外带
extraCost = "餐盒费:¥ " + this.data.boxFee;
} else if (index == 2) { // 外卖
extraCost = "餐盒费:" + this.data.boxFee + " + " + "配送费:" + this.data.deliverFee;
}
this.setData({
dinewayIndex: index,
takeMethod: index,
extraCost: extraCost,
});
},
/**
* 选择支付方式
*/
bindpayway: function(e) {
var index = e.currentTarget.dataset.index;
this.setData({
paywayIndex: index
});
},
/**
* 选择桌号
*/
bindGoTables: function() {
var erpStoreId = this.data.store.storeId;
var tableId = app.table.tableId;
var tableNo = app.table.tableNo;
wx.navigateTo({
url: '../table/table?erpStoreId=' + erpStoreId + "&tableId=" + tableId + "&tableNo=" + tableNo,
})
},
/**
* 手机号
*/
inputMobile: function(e) {
var value = e.detail.value;
this.setData({
mobile: value
});
return value;
},
/**
* 选择送餐地址
*/
selectSendAddress: function() {
wx.navigateTo({
url: '../address/address',
})
},
/**
* 备注
*/
inputDescription: function(e) {
var value = e.detail.value;
this.setData({
description: value
});
return value;
},
/**
* 获取手机号
*/
getPhoneNumber: function(e) {
var that = this;
if (e.detail.errMsg == 'getPhoneNumber:ok') {
var iv = e.detail.iv;
var encryptedData = e.detail.encryptedData;
card.wx_getPhoneNumber(iv, encryptedData, function(json) {
var result = json.data;
if (result.status == '1') {
var data = result.data.data;
var purePhoneNumber = data.purePhoneNumber; //没有区号的手机号
var phoneNumber = data.phoneNumber; // 用户绑定的手机号(国外手机号会有区号)
var countryCode = data.countryCode; //区号
that.setData({
mobile: purePhoneNumber,
mobileStatus: true
});
wx.hideLoading();
wx.setStorageSync("mobile", purePhoneNumber);
that.updateUserMobile(purePhoneNumber);
}
}, function(err) {
});
}
},
/**
* 更改/记录用户的手机号
*/
updateUserMobile: function(purePhoneNumber) {
wx.request({
url: app.globalData.serverUrlExtend,
method: "POST",
header: {
'content-type': 'application/x-www-form-urlencoded'
},
data: {
"type": "wxdcedituser",
"tenantId": app.tenantId,
"wid": app.wid,
"userId": app.userId,
"mobile": purePhoneNumber,
},
complete: function(res) {
console.log("更改用户手机号码result:");
}
})
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function() {
var that = this;
// 刷新购物车商品列表
that.refreshCartData();
// 获取ip
wx.request({
url: 'http://ip-api.com/json',
success: function(e) {
var ip = e.data.query;
ip = app.utils.isNotBlank(ip) ? ip : "123.12.12.123";
that.setData({
ip: ip
});
}
});
this.setData({
table: app.table
});
},
/**
* 显示支付密码输入层
*/
showInputLayer: function() {
this.setData({
showPayPwdInput: true,
payFocus: true
});
},
/**
* 隐藏支付密码输入层
*/
hidePayLayer: function() {
var val = this.data.pwdVal;
this.setData({
showPayPwdInput: false,
payFocus: false,
pwdVal: val
});
// 会员创建订单
if (val) {
this.cardPay();
}
},
/**
* 获取焦点
*/
getFocus: function() {
this.setData({
payFocus: true
});
},
/**
* 输入密码监听
*/
inputPwd: function(e) {
this.setData({
pwdVal: e.detail.value
});
if (e.detail.value.length >= 6) {
this.hidePayLayer();
}
}
})