goods.js 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. // pages/goods/goods.js
  2. var app = getApp();
  3. Page({
  4. /**
  5. * 页面的初始数据
  6. */
  7. data: {
  8. userInfo: wx.getStorageSync('userInfo'),
  9. virtualInventoryId: null,
  10. goods: {}
  11. },
  12. /**
  13. * 生命周期函数--监听页面加载
  14. */
  15. async onLoad(options) {
  16. this.setData({
  17. userInfo: wx.getStorageSync('userInfo'),
  18. virtualInventoryId: wx.getStorageSync('virtualInventoryId')
  19. });
  20. this.initData(options.prodId);
  21. this.initCartNum();
  22. },
  23. /**
  24. * 生命周期函数--监听页面初次渲染完成
  25. */
  26. onReady() {
  27. },
  28. /**
  29. * 生命周期函数--监听页面显示
  30. */
  31. onShow() {
  32. },
  33. async initData(prodId) {
  34. let {
  35. data
  36. } = await app.ajax.gets(`/admin/bxdprod/browse/${prodId || this.data.goods.prodId}?virtualInventoryId=${this.data.virtualInventoryId}`);
  37. data.data.picArr = data.data.pic ? data.data.pic.split(",") : ['/images/empty.png'];
  38. data.data.skuDesc = data.data.skuDesc || '';
  39. data.data.skuDesc = data.data.skuDesc.replace(/\<img/gi, '<img class="rich-img" ');
  40. const initialQty = Number(data.data.qty);
  41. data.data.qty = Number.isSafeInteger(initialQty) && initialQty > 0 ? initialQty : 1;
  42. data.data.qtyInput = String(data.data.qty);
  43. data.data.qtyBeforeSubmit = data.data.qty;
  44. data.data.qtyDirty = false;
  45. data.data.qtyUpdating = false;
  46. this.setData({
  47. goods: data.data
  48. })
  49. },
  50. async initCartNum() {
  51. let {
  52. data
  53. } = await app.ajax.gets(`/admin/bxdusercollection/queryCartNum?userId=${this.data.userInfo.userId}&virtualInventoryId=${this.data.virtualInventoryId}`);
  54. this.setData({
  55. cartNum: data.data || 0
  56. })
  57. },
  58. restoreGoodsQty(qty) {
  59. const restoreQty = Number(qty) || 1;
  60. this.setData({
  61. 'goods.qty': restoreQty,
  62. 'goods.qtyInput': String(restoreQty),
  63. 'goods.qtyBeforeSubmit': restoreQty,
  64. 'goods.qtyDirty': false
  65. });
  66. },
  67. setGoodsQty(qty) {
  68. const goods = this.data.goods || {};
  69. const currentQty = Number(goods.qty) || 1;
  70. const updateData = {
  71. 'goods.qty': qty,
  72. 'goods.qtyInput': String(qty)
  73. };
  74. if (!goods.qtyDirty) {
  75. updateData['goods.qtyBeforeSubmit'] = currentQty;
  76. updateData['goods.qtyDirty'] = true;
  77. }
  78. this.setData(updateData);
  79. },
  80. qtyInput(e) {
  81. const goods = this.data.goods || {};
  82. const updateData = {
  83. 'goods.qtyInput': e.detail.value
  84. };
  85. if (!goods.qtyDirty) {
  86. updateData['goods.qtyBeforeSubmit'] = Number(goods.qty) || 1;
  87. updateData['goods.qtyDirty'] = true;
  88. }
  89. this.setData(updateData);
  90. },
  91. qtyBlur(e) {
  92. this.commitQty(e);
  93. },
  94. qtyConfirm(e) {
  95. this.commitQty(e);
  96. },
  97. commitQty(e) {
  98. const goods = this.data.goods || {};
  99. const currentQty = Number(goods.qty) || 1;
  100. const rawValue = e && e.detail && e.detail.value !== undefined
  101. ? e.detail.value
  102. : goods.qtyInput;
  103. const text = String(rawValue == null ? '' : rawValue).trim();
  104. const target = Number(text);
  105. if (!/^\d+$/.test(text) || !Number.isSafeInteger(target) || target < 1) {
  106. wx.showToast({ title: '请输入大于0的整数', icon: 'none' });
  107. this.restoreGoodsQty(currentQty);
  108. return false;
  109. }
  110. const limitQty = Number(goods.limitQty);
  111. if (Number.isFinite(limitQty) && limitQty > 0 && target > limitQty) {
  112. wx.showToast({ title: '加购数量不能大于限购数量:' + limitQty, icon: 'none' });
  113. this.restoreGoodsQty(currentQty);
  114. return false;
  115. }
  116. const usableStocks = Number(goods.usableStocksTotal);
  117. if (Number.isFinite(usableStocks) && usableStocks >= 0 && target > usableStocks) {
  118. wx.showToast({ title: '加购数量不能大于可供库存:' + usableStocks, icon: 'none' });
  119. this.restoreGoodsQty(currentQty);
  120. return false;
  121. }
  122. this.setData({
  123. 'goods.qty': target,
  124. 'goods.qtyInput': String(target)
  125. });
  126. return true;
  127. },
  128. async updateSku() {
  129. if (this.data.goods.qtyUpdating) return;
  130. const previousQty = Number(this.data.goods.qtyBeforeSubmit || this.data.goods.qty) || 1;
  131. if (!this.commitQty()) return;
  132. this.setData({
  133. 'goods.qtyUpdating': true
  134. });
  135. try {
  136. let {
  137. data
  138. } = await app.ajax.post({
  139. url: `/admin/bxdorder/bxdPiclimit`,
  140. data: {
  141. orderSaleId: this.data.userInfo.userId
  142. },
  143. });
  144. if (data.data.length) {
  145. this.restoreGoodsQty(previousQty);
  146. await wx.showModal({
  147. title: '提示',
  148. content: `当前下单已被限制, 订单${data.data.map(item => item.orderNumber)}存在反馈图片超时的情况,请尽快前去上传反馈图片`
  149. })
  150. return;
  151. }
  152. let goods = this.data.goods;
  153. await app.ajax.post({
  154. url: '/admin/bxdusercollection/add',
  155. method: "POST",
  156. data: {
  157. id: goods.collectionId,
  158. qty: goods.qty,
  159. modelId: goods.modelId,
  160. skuCode: goods.skuCode,
  161. virtualInventoryId: wx.getStorageSync('virtualInventoryId'),
  162. }
  163. });
  164. if (!goods.collectionId) {
  165. await this.initData(goods.prodId);
  166. } else {
  167. this.setData({
  168. 'goods.qtyBeforeSubmit': goods.qty,
  169. 'goods.qtyDirty': false
  170. });
  171. }
  172. await this.initCartNum();
  173. wx.showToast({
  174. title: '加入购物车成功',
  175. })
  176. } catch (e) {
  177. this.restoreGoodsQty(previousQty);
  178. } finally {
  179. this.setData({
  180. 'goods.qtyUpdating': false
  181. });
  182. }
  183. },
  184. jianNum() {
  185. const goods = this.data.goods || {};
  186. if (goods.qtyUpdating) return;
  187. const currentQty = Number(goods.qty) || 1;
  188. if (currentQty <= 1) return;
  189. this.setGoodsQty(currentQty - 1);
  190. // await this.updateSku({
  191. // id: goods.collectionId,
  192. // qty: goods.qty
  193. // });
  194. // await this.initData();
  195. },
  196. jiaNum() {
  197. const goods = this.data.goods || {};
  198. if (goods.qtyUpdating) return;
  199. const currentQty = Number(goods.qty) || 1;
  200. const limitQty = Number(goods.limitQty);
  201. const usableStocks = Number(goods.usableStocksTotal);
  202. if (Number.isFinite(limitQty) && limitQty > 0 && currentQty + 1 > limitQty) return;
  203. if (Number.isFinite(usableStocks) && currentQty + 1 > usableStocks) return;
  204. this.setGoodsQty(currentQty + 1);
  205. // await this.updateSku({
  206. // id: goods.id,
  207. // qty: goods.qty
  208. // });
  209. // await this.initData();
  210. },
  211. /**
  212. * 生命周期函数--监听页面隐藏
  213. */
  214. onHide() {
  215. },
  216. /**
  217. * 生命周期函数--监听页面卸载
  218. */
  219. onUnload() {
  220. },
  221. /**
  222. * 页面相关事件处理函数--监听用户下拉动作
  223. */
  224. onPullDownRefresh() {
  225. },
  226. /**
  227. * 页面上拉触底事件的处理函数
  228. */
  229. onReachBottom() {
  230. },
  231. /**
  232. * 用户点击右上角分享
  233. */
  234. onShareAppMessage() {
  235. }
  236. })