| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533 |
- import Toast from 'tdesign-miniprogram/toast/index';
- import { fetchSettleDetail } from '../../../services/order/orderConfirm';
- import { commitPay, wechatPayOrder } from './pay';
- import { getAddressPromise } from '../../../services/address/list';
- const stripeImg = `https://tdesign.gtimg.com/miniprogram/template/retail/order/stripe.png`;
- Page({
- data: {
- placeholder: '备注信息',
- stripeImg,
- loading: false,
- settleDetailData: {
- storeGoodsList: [], //正常下单商品列表
- outOfStockGoodsList: [], //库存不足商品
- abnormalDeliveryGoodsList: [], // 不能正常配送商品
- inValidGoodsList: [], // 失效或者库存不足
- limitGoodsList: [], //限购商品
- couponList: [], //门店优惠券信息
- }, // 获取结算页详情 data
- orderCardList: [], // 仅用于商品卡片展示
- couponsShow: false, // 显示优惠券的弹框
- invoiceData: {
- email: '', // 发票发送邮箱
- buyerTaxNo: '', // 税号
- invoiceType: null, // 开票类型 1:增值税专用发票; 2:增值税普通发票; 3:增值税电子发票;4:增值税卷式发票;5:区块链电子发票。
- buyerPhone: '', //手机号
- buyerName: '', //个人或公司名称
- titleType: '', // 发票抬头 1-公司 2-个人
- contentType: '', //发票内容 1-明细 2-类别
- },
- goodsRequestList: [],
- userAddressReq: null,
- popupShow: false, // 不在配送范围 失效 库存不足 商品展示弹框
- notesPosition: 'center',
- storeInfoList: [],
- storeNoteIndex: 0, //当前填写备注门店index
- promotionGoodsList: [], //当前门店商品列表(优惠券)
- couponList: [], //当前门店所选优惠券
- submitCouponList: [], //所有门店所选优惠券
- currentStoreId: null, //当前优惠券storeId
- userAddress: null,
- },
- payLock: false,
- noteInfo: [],
- tempNoteInfo: [],
- onLoad(options) {
- this.setData({
- loading: true,
- });
- this.handleOptionsParams(options);
- },
- onShow() {
- const invoiceData = wx.getStorageSync('invoiceData');
- if (invoiceData) {
- //处理发票
- this.invoiceData = invoiceData;
- this.setData({
- invoiceData,
- });
- wx.removeStorageSync('invoiceData');
- }
- },
- init() {
- this.setData({
- loading: true,
- });
- const { goodsRequestList } = this;
- this.handleOptionsParams({ goodsRequestList });
- },
- // 处理不同情况下跳转到结算页时需要的参数
- handleOptionsParams(options, couponList) {
- let { goodsRequestList } = this; // 商品列表
- let { userAddressReq } = this; // 收货地址
- const storeInfoList = []; // 门店列表
- // 如果是从地址选择页面返回,则使用地址显选择页面新选择的地址去获取结算数据
- if (options.userAddressReq) {
- userAddressReq = options.userAddressReq;
- }
- if (options.type === 'cart') {
- // 从购物车跳转过来时,获取传入的商品列表数据
- const goodsRequestListJson = wx.getStorageSync('order.goodsRequestList');
- goodsRequestList = JSON.parse(goodsRequestListJson);
- } else if (typeof options.goodsRequestList === 'string') {
- goodsRequestList = JSON.parse(options.goodsRequestList);
- }
- //获取结算页请求数据列表
- const storeMap = {};
- goodsRequestList.forEach((goods) => {
- if (!storeMap[goods.storeId]) {
- storeInfoList.push({
- storeId: goods.storeId,
- storeName: goods.storeName,
- });
- storeMap[goods.storeId] = true;
- }
- });
- this.goodsRequestList = goodsRequestList;
- this.storeInfoList = storeInfoList;
- const params = {
- goodsRequestList,
- storeInfoList,
- userAddressReq,
- couponList,
- };
- fetchSettleDetail(params).then(
- (res) => {
- this.setData({
- loading: false,
- });
- this.initData(res.data);
- },
- () => {
- //接口异常处理
- this.handleError();
- },
- );
- },
- initData(resData) {
- // 转换商品卡片显示数据
- const data = this.handleResToGoodsCard(resData);
- this.userAddressReq = resData.userAddress;
- if (resData.userAddress) {
- this.setData({ userAddress: resData.userAddress });
- }
- this.setData({ settleDetailData: data });
- this.isInvalidOrder(data);
- },
- isInvalidOrder(data) {
- // 失效 不在配送范围 限购的商品 提示弹窗
- if (
- (data.limitGoodsList && data.limitGoodsList.length > 0) ||
- (data.abnormalDeliveryGoodsList && data.abnormalDeliveryGoodsList.length > 0) ||
- (data.inValidGoodsList && data.inValidGoodsList.length > 0)
- ) {
- this.setData({ popupShow: true });
- return true;
- }
- this.setData({ popupShow: false });
- if (data.settleType === 0) {
- return true;
- }
- return false;
- },
- handleError() {
- Toast({
- context: this,
- selector: '#t-toast',
- message: '结算异常, 请稍后重试',
- duration: 2000,
- icon: '',
- });
- setTimeout(() => {
- wx.navigateBack();
- }, 1500);
- this.setData({
- loading: false,
- });
- },
- getRequestGoodsList(storeGoodsList) {
- const filterStoreGoodsList = [];
- storeGoodsList &&
- storeGoodsList.forEach((store) => {
- const { storeName } = store;
- store.skuDetailVos &&
- store.skuDetailVos.forEach((goods) => {
- const data = goods;
- data.storeName = storeName;
- filterStoreGoodsList.push(data);
- });
- });
- return filterStoreGoodsList;
- },
- handleGoodsRequest(goods, isOutStock = false) {
- const { reminderStock, quantity, storeId, uid, saasId, spuId, goodsName, skuId, storeName, roomId } = goods;
- const resQuantity = isOutStock ? reminderStock : quantity;
- return {
- quantity: resQuantity,
- storeId,
- uid,
- saasId,
- spuId,
- goodsName,
- skuId,
- storeName,
- roomId,
- };
- },
- handleResToGoodsCard(data) {
- // 转换数据 符合 goods-card展示
- const orderCardList = []; // 订单卡片列表
- const storeInfoList = [];
- const submitCouponList = []; //使用优惠券列表;
- data.storeGoodsList &&
- data.storeGoodsList.forEach((ele) => {
- const orderCard = {
- id: ele.storeId,
- storeName: ele.storeName,
- status: 0,
- statusDesc: '',
- amount: ele.storeTotalPayAmount,
- goodsList: [],
- }; // 订单卡片
- ele.skuDetailVos.forEach((item, index) => {
- orderCard.goodsList.push({
- id: index,
- thumb: item.image,
- title: item.goodsName,
- specs: item.skuSpecLst.map((s) => s.specValue), // 规格列表 string[]
- price: item.tagPrice || item.settlePrice || '0', // 优先取限时活动价
- settlePrice: item.settlePrice,
- titlePrefixTags: item.tagText ? [{ text: item.tagText }] : [],
- num: item.quantity,
- skuId: item.skuId,
- spuId: item.spuId,
- storeId: item.storeId,
- });
- });
- storeInfoList.push({
- storeId: ele.storeId,
- storeName: ele.storeName,
- remark: '',
- });
- submitCouponList.push({
- storeId: ele.storeId,
- couponList: ele.couponList || [],
- });
- this.noteInfo.push('');
- this.tempNoteInfo.push('');
- orderCardList.push(orderCard);
- });
- this.setData({ orderCardList, storeInfoList, submitCouponList });
- return data;
- },
- onGotoAddress() {
- /** 获取一个Promise */
- getAddressPromise()
- .then((address) => {
- this.handleOptionsParams({
- userAddressReq: { ...address, checked: true },
- });
- })
- .catch(() => {});
- const { userAddressReq } = this; // 收货地址
- let id = '';
- if (userAddressReq?.id) {
- id = `&id=${userAddressReq.id}`;
- }
- wx.navigateTo({
- url: `/pages/user/address/list/index?selectMode=1&isOrderSure=1${id}`,
- });
- },
- onNotes(e) {
- const { storenoteindex: storeNoteIndex } = e.currentTarget.dataset;
- // 添加备注信息
- this.setData({
- dialogShow: true,
- storeNoteIndex,
- });
- },
- onInput(e) {
- const { storeNoteIndex } = this.data;
- this.noteInfo[storeNoteIndex] = e.detail.value;
- },
- onBlur() {
- this.setData({
- notesPosition: 'center',
- });
- },
- onFocus() {
- this.setData({
- notesPosition: 'self',
- });
- },
- onTap() {
- this.setData({
- placeholder: '',
- });
- },
- onNoteConfirm() {
- // 备注信息 确认按钮
- const { storeInfoList, storeNoteIndex } = this.data;
- this.tempNoteInfo[storeNoteIndex] = this.noteInfo[storeNoteIndex];
- storeInfoList[storeNoteIndex].remark = this.noteInfo[storeNoteIndex];
- this.setData({
- dialogShow: false,
- storeInfoList,
- });
- },
- onNoteCancel() {
- // 备注信息 取消按钮
- const { storeNoteIndex } = this.data;
- this.noteInfo[storeNoteIndex] = this.tempNoteInfo[storeNoteIndex];
- this.setData({
- dialogShow: false,
- });
- },
- onSureCommit() {
- // 商品库存不足继续结算
- const { settleDetailData } = this.data;
- const { outOfStockGoodsList, storeGoodsList, inValidGoodsList } = settleDetailData;
- if ((outOfStockGoodsList && outOfStockGoodsList.length > 0) || (inValidGoodsList && storeGoodsList)) {
- // 合并正常商品 和 库存 不足商品继续支付
- // 过滤不必要的参数
- const filterOutGoodsList = [];
- outOfStockGoodsList &&
- outOfStockGoodsList.forEach((outOfStockGoods) => {
- const { storeName } = outOfStockGoods;
- outOfStockGoods.unSettlementGoods.forEach((ele) => {
- const data = ele;
- data.quantity = ele.reminderStock;
- data.storeName = storeName;
- filterOutGoodsList.push(data);
- });
- });
- const filterStoreGoodsList = this.getRequestGoodsList(storeGoodsList);
- const goodsRequestList = filterOutGoodsList.concat(filterStoreGoodsList);
- this.handleOptionsParams({ goodsRequestList });
- }
- },
- // 提交订单
- submitOrder() {
- const { settleDetailData, userAddressReq, invoiceData, storeInfoList, submitCouponList } = this.data;
- const { goodsRequestList } = this;
- if (!userAddressReq && !settleDetailData.userAddress) {
- Toast({
- context: this,
- selector: '#t-toast',
- message: '请添加收货地址',
- duration: 2000,
- icon: 'help-circle',
- });
- return;
- }
- if (this.payLock || !settleDetailData.settleType || !settleDetailData.totalAmount) {
- return;
- }
- this.payLock = true;
- const resSubmitCouponList = this.handleCouponList(submitCouponList);
- const params = {
- userAddressReq: settleDetailData.userAddress || userAddressReq,
- goodsRequestList: goodsRequestList,
- userName: settleDetailData.userAddress.name || userAddressReq.name,
- totalAmount: settleDetailData.totalPayAmount, //取优惠后的结算金额
- invoiceRequest: null,
- storeInfoList,
- couponList: resSubmitCouponList,
- };
- if (invoiceData && invoiceData.email) {
- params.invoiceRequest = invoiceData;
- }
- commitPay(params).then(
- (res) => {
- this.payLock = false;
- const { data } = res;
- // 提交出现 失效 不在配送范围 限购的商品 提示弹窗
- if (this.isInvalidOrder(data)) {
- return;
- }
- if (res.code === 'Success') {
- this.handlePay(data, settleDetailData);
- } else {
- Toast({
- context: this,
- selector: '#t-toast',
- message: res.msg || '提交订单超时,请稍后重试',
- duration: 2000,
- icon: '',
- });
- setTimeout(() => {
- // 提交支付失败 返回购物车
- wx.navigateBack();
- }, 2000);
- }
- },
- (err) => {
- this.payLock = false;
- if (err.code === 'CONTAINS_INSUFFICIENT_GOODS' || err.code === 'TOTAL_AMOUNT_DIFFERENT') {
- Toast({
- context: this,
- selector: '#t-toast',
- message: err.msg || '支付异常',
- duration: 2000,
- icon: '',
- });
- this.init();
- } else if (err.code === 'ORDER_PAY_FAIL') {
- Toast({
- context: this,
- selector: '#t-toast',
- message: '支付失败',
- duration: 2000,
- icon: 'close-circle',
- });
- setTimeout(() => {
- wx.redirectTo({ url: '/pages/order/order-list/index' });
- });
- } else if (err.code === 'ILLEGAL_CONFIG_PARAM') {
- Toast({
- context: this,
- selector: '#t-toast',
- message: '支付失败,微信支付商户号设置有误,请商家重新检查支付设置。',
- duration: 2000,
- icon: 'close-circle',
- });
- setTimeout(() => {
- wx.redirectTo({ url: '/pages/order/order-list/index' });
- });
- } else {
- Toast({
- context: this,
- selector: '#t-toast',
- message: err.msg || '提交支付超时,请稍后重试',
- duration: 2000,
- icon: '',
- });
- setTimeout(() => {
- // 提交支付失败 返回购物车
- wx.navigateBack();
- }, 2000);
- }
- },
- );
- },
- // 处理支付
- handlePay(data, settleDetailData) {
- const { channel, payInfo, tradeNo, interactId, transactionId } = data;
- const { totalAmount, totalPayAmount } = settleDetailData;
- const payOrderInfo = {
- payInfo: payInfo,
- orderId: tradeNo,
- orderAmt: totalAmount,
- payAmt: totalPayAmount,
- interactId: interactId,
- tradeNo: tradeNo,
- transactionId: transactionId,
- };
- if (channel === 'wechat') {
- wechatPayOrder(payOrderInfo);
- }
- },
- hide() {
- // 隐藏 popup
- this.setData({
- 'settleDetailData.abnormalDeliveryGoodsList': [],
- });
- },
- onReceipt() {
- // 跳转 开发票
- const invoiceData = this.invoiceData || {};
- wx.navigateTo({
- url: `/pages/order/receipt/index?invoiceData=${JSON.stringify(invoiceData)}`,
- });
- },
- onCoupons(e) {
- const { submitCouponList, currentStoreId } = this.data;
- const { goodsRequestList } = this;
- const { selectedList } = e.detail;
- const tempSubmitCouponList = submitCouponList.map((storeCoupon) => {
- return {
- couponList: storeCoupon.storeId === currentStoreId ? selectedList : storeCoupon.couponList,
- };
- });
- const resSubmitCouponList = this.handleCouponList(tempSubmitCouponList);
- //确定选择优惠券
- this.handleOptionsParams({ goodsRequestList }, resSubmitCouponList);
- this.setData({ couponsShow: false });
- },
- onOpenCoupons(e) {
- const { storeid } = e.currentTarget.dataset;
- this.setData({
- couponsShow: true,
- currentStoreId: storeid,
- });
- },
- handleCouponList(storeCouponList) {
- //处理门店优惠券 转换成接口需要
- if (!storeCouponList) return [];
- const resSubmitCouponList = [];
- storeCouponList.forEach((ele) => {
- resSubmitCouponList.push(...ele.couponList);
- });
- return resSubmitCouponList;
- },
- onGoodsNumChange(e) {
- const {
- detail: { value },
- currentTarget: {
- dataset: { goods },
- },
- } = e;
- const index = this.goodsRequestList.findIndex(
- ({ storeId, spuId, skuId }) => goods.storeId === storeId && goods.spuId === spuId && goods.skuId === skuId,
- );
- if (index >= 0) {
- // eslint-disable-next-line no-confusing-arrow
- const goodsRequestList = this.goodsRequestList.map((item, i) =>
- i === index ? { ...item, quantity: value } : item,
- );
- this.handleOptionsParams({ goodsRequestList });
- }
- },
- onPopupChange() {
- this.setData({
- popupShow: !this.data.popupShow,
- });
- },
- });
|