|
|
@@ -43,6 +43,12 @@ Page({
|
|
|
data.data.picArr = data.data.pic ? data.data.pic.split(",") : ['/images/empty.png'];
|
|
|
data.data.skuDesc = data.data.skuDesc || '';
|
|
|
data.data.skuDesc = data.data.skuDesc.replace(/\<img/gi, '<img class="rich-img" ');
|
|
|
+ const initialQty = Number(data.data.qty);
|
|
|
+ data.data.qty = Number.isSafeInteger(initialQty) && initialQty > 0 ? initialQty : 1;
|
|
|
+ data.data.qtyInput = String(data.data.qty);
|
|
|
+ data.data.qtyBeforeSubmit = data.data.qty;
|
|
|
+ data.data.qtyDirty = false;
|
|
|
+ data.data.qtyUpdating = false;
|
|
|
this.setData({
|
|
|
goods: data.data
|
|
|
})
|
|
|
@@ -55,7 +61,84 @@ Page({
|
|
|
cartNum: data.data || 0
|
|
|
})
|
|
|
},
|
|
|
+ restoreGoodsQty(qty) {
|
|
|
+ const restoreQty = Number(qty) || 1;
|
|
|
+ this.setData({
|
|
|
+ 'goods.qty': restoreQty,
|
|
|
+ 'goods.qtyInput': String(restoreQty),
|
|
|
+ 'goods.qtyBeforeSubmit': restoreQty,
|
|
|
+ 'goods.qtyDirty': false
|
|
|
+ });
|
|
|
+ },
|
|
|
+ setGoodsQty(qty) {
|
|
|
+ const goods = this.data.goods || {};
|
|
|
+ const currentQty = Number(goods.qty) || 1;
|
|
|
+ const updateData = {
|
|
|
+ 'goods.qty': qty,
|
|
|
+ 'goods.qtyInput': String(qty)
|
|
|
+ };
|
|
|
+ if (!goods.qtyDirty) {
|
|
|
+ updateData['goods.qtyBeforeSubmit'] = currentQty;
|
|
|
+ updateData['goods.qtyDirty'] = true;
|
|
|
+ }
|
|
|
+ this.setData(updateData);
|
|
|
+ },
|
|
|
+ qtyInput(e) {
|
|
|
+ const goods = this.data.goods || {};
|
|
|
+ const updateData = {
|
|
|
+ 'goods.qtyInput': e.detail.value
|
|
|
+ };
|
|
|
+ if (!goods.qtyDirty) {
|
|
|
+ updateData['goods.qtyBeforeSubmit'] = Number(goods.qty) || 1;
|
|
|
+ updateData['goods.qtyDirty'] = true;
|
|
|
+ }
|
|
|
+ this.setData(updateData);
|
|
|
+ },
|
|
|
+ qtyBlur(e) {
|
|
|
+ this.commitQty(e);
|
|
|
+ },
|
|
|
+ qtyConfirm(e) {
|
|
|
+ this.commitQty(e);
|
|
|
+ },
|
|
|
+ commitQty(e) {
|
|
|
+ const goods = this.data.goods || {};
|
|
|
+ const currentQty = Number(goods.qty) || 1;
|
|
|
+ const rawValue = e && e.detail && e.detail.value !== undefined
|
|
|
+ ? e.detail.value
|
|
|
+ : goods.qtyInput;
|
|
|
+ const text = String(rawValue == null ? '' : rawValue).trim();
|
|
|
+ const target = Number(text);
|
|
|
+ if (!/^\d+$/.test(text) || !Number.isSafeInteger(target) || target < 1) {
|
|
|
+ wx.showToast({ title: '请输入大于0的整数', icon: 'none' });
|
|
|
+ this.restoreGoodsQty(currentQty);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ const limitQty = Number(goods.limitQty);
|
|
|
+ if (Number.isFinite(limitQty) && limitQty > 0 && target > limitQty) {
|
|
|
+ wx.showToast({ title: '加购数量不能大于限购数量:' + limitQty, icon: 'none' });
|
|
|
+ this.restoreGoodsQty(currentQty);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ const usableStocks = Number(goods.usableStocksTotal);
|
|
|
+ if (Number.isFinite(usableStocks) && usableStocks >= 0 && target > usableStocks) {
|
|
|
+ wx.showToast({ title: '加购数量不能大于可供库存:' + usableStocks, icon: 'none' });
|
|
|
+ this.restoreGoodsQty(currentQty);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ this.setData({
|
|
|
+ 'goods.qty': target,
|
|
|
+ 'goods.qtyInput': String(target)
|
|
|
+ });
|
|
|
+ return true;
|
|
|
+ },
|
|
|
async updateSku() {
|
|
|
+ if (this.data.goods.qtyUpdating) return;
|
|
|
+ const previousQty = Number(this.data.goods.qtyBeforeSubmit || this.data.goods.qty) || 1;
|
|
|
+ if (!this.commitQty()) return;
|
|
|
+ this.setData({
|
|
|
+ 'goods.qtyUpdating': true
|
|
|
+ });
|
|
|
+ try {
|
|
|
let {
|
|
|
data
|
|
|
} = await app.ajax.post({
|
|
|
@@ -67,6 +150,7 @@ Page({
|
|
|
|
|
|
|
|
|
if (data.data.length) {
|
|
|
+ this.restoreGoodsQty(previousQty);
|
|
|
await wx.showModal({
|
|
|
title: '提示',
|
|
|
content: `当前下单已被限制, 订单${data.data.map(item => item.orderNumber)}存在反馈图片超时的情况,请尽快前去上传反馈图片`
|
|
|
@@ -88,36 +172,46 @@ Page({
|
|
|
});
|
|
|
if (!goods.collectionId) {
|
|
|
await this.initData(goods.prodId);
|
|
|
+ } else {
|
|
|
+ this.setData({
|
|
|
+ 'goods.qtyBeforeSubmit': goods.qty,
|
|
|
+ 'goods.qtyDirty': false
|
|
|
+ });
|
|
|
}
|
|
|
await this.initCartNum();
|
|
|
|
|
|
wx.showToast({
|
|
|
title: '加入购物车成功',
|
|
|
})
|
|
|
- },
|
|
|
- async jianNum() {
|
|
|
- let goods = this.data.goods;
|
|
|
- if (goods.qty <= 1) return;
|
|
|
- goods.qty = (goods.qty || 1) - 1;
|
|
|
- if (goods.qty == 0) {
|
|
|
- return;
|
|
|
+ } catch (e) {
|
|
|
+ this.restoreGoodsQty(previousQty);
|
|
|
+ } finally {
|
|
|
+ this.setData({
|
|
|
+ 'goods.qtyUpdating': false
|
|
|
+ });
|
|
|
}
|
|
|
- this.setData({
|
|
|
- goods
|
|
|
- })
|
|
|
+ },
|
|
|
+ jianNum() {
|
|
|
+ const goods = this.data.goods || {};
|
|
|
+ if (goods.qtyUpdating) return;
|
|
|
+ const currentQty = Number(goods.qty) || 1;
|
|
|
+ if (currentQty <= 1) return;
|
|
|
+ this.setGoodsQty(currentQty - 1);
|
|
|
// await this.updateSku({
|
|
|
// id: goods.collectionId,
|
|
|
// qty: goods.qty
|
|
|
// });
|
|
|
// await this.initData();
|
|
|
},
|
|
|
- async jiaNum() {
|
|
|
- let goods = this.data.goods;
|
|
|
- if (goods.limitQty && goods.qty >= goods.limitQty) return;
|
|
|
- goods.qty = (goods.qty || 1) + 1;
|
|
|
- this.setData({
|
|
|
- goods
|
|
|
- })
|
|
|
+ jiaNum() {
|
|
|
+ const goods = this.data.goods || {};
|
|
|
+ if (goods.qtyUpdating) return;
|
|
|
+ const currentQty = Number(goods.qty) || 1;
|
|
|
+ const limitQty = Number(goods.limitQty);
|
|
|
+ const usableStocks = Number(goods.usableStocksTotal);
|
|
|
+ if (Number.isFinite(limitQty) && limitQty > 0 && currentQty + 1 > limitQty) return;
|
|
|
+ if (Number.isFinite(usableStocks) && currentQty + 1 > usableStocks) return;
|
|
|
+ this.setGoodsQty(currentQty + 1);
|
|
|
// await this.updateSku({
|
|
|
// id: goods.id,
|
|
|
// qty: goods.qty
|
|
|
@@ -159,4 +253,4 @@ Page({
|
|
|
onShareAppMessage() {
|
|
|
|
|
|
}
|
|
|
-})
|
|
|
+})
|