cart.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464
  1. // pages/cart/cart.js
  2. var app = getApp();
  3. Page({
  4. /**
  5. * 页面的初始数据
  6. */
  7. data: {
  8. startX: 0, //开始坐标
  9. startY: 0,
  10. userInfo: wx.getStorageSync('userInfo'),
  11. checkAll: false,
  12. loading: false,
  13. load: false,
  14. checkNum: 0,
  15. checkPrice: 0.00,
  16. cartList: []
  17. },
  18. /**
  19. * 生命周期函数--监听页面加载
  20. */
  21. onLoad(options) {},
  22. /**
  23. * 生命周期函数--监听页面初次渲染完成
  24. */
  25. onReady() {
  26. // if (typeof this.getTabBar === 'function' && this.getTabBar()) {
  27. // let userInfo = wx.getStorageSync('userInfo');
  28. // if (userInfo && userInfo.userId) {
  29. // app.globalData.tabbar.list[0].show = false;
  30. // app.globalData.tabbar.list[1].show = true;
  31. // } else {
  32. // app.globalData.tabbar.list[0].show = true;
  33. // }
  34. // this.getTabBar().setData({
  35. // selectIndex: 3,
  36. // tabbar: app.globalData.tabbar
  37. // })
  38. // }
  39. },
  40. /**
  41. * 生命周期函数--监听页面显示
  42. */
  43. onShow() {
  44. let userInfo = wx.getStorageSync('userInfo');
  45. this.setData({
  46. userInfo,
  47. })
  48. this.setData({
  49. checkAll: false,
  50. checkNum: 0,
  51. checkPrice: 0.00,
  52. })
  53. setTimeout(() => {
  54. wx.setNavigationBarTitle({
  55. title: app.globalData.tabbar.list[2].text,
  56. });
  57. }, 500);
  58. if (typeof this.getTabBar === 'function' && this.getTabBar()) {
  59. // if (userInfo && userInfo.userId) {
  60. // app.globalData.tabbar.list[0].show = false;
  61. // app.globalData.tabbar.list[1].show = true;
  62. // } else {
  63. // app.globalData.tabbar.list[0].show = true;
  64. // }
  65. let that = this;
  66. setTimeout(() => {
  67. wx.setNavigationBarTitle({
  68. title: app.globalData.tabbar.list[2].text,
  69. });
  70. that.getTabBar().setData({
  71. selectIndex: 2,
  72. tabbar: app.globalData.tabbar
  73. })
  74. }, 500);
  75. }
  76. if (userInfo && userInfo.userId) {
  77. this.initData();
  78. }
  79. },
  80. async initData() {
  81. this.setData({
  82. loading: !this.data.load
  83. })
  84. let {
  85. data
  86. } = await app.ajax.get({
  87. url: `/admin/bxdusercollection/query?userId=${this.data.userInfo.userId}&virtualInventoryId=${wx.getStorageSync('virtualInventoryId')}`,
  88. });
  89. let cartList = data.data.map(v => {
  90. v.qtyInput = String(v.qty || 1);
  91. v.qtyUpdating = false;
  92. v["picArr"] = v.pic ? v.pic.split(",") : null;
  93. return v;
  94. });
  95. this.setData({
  96. cartList: cartList,
  97. loading: false,
  98. load: true
  99. });
  100. this.switchChange({
  101. currentTarget: {
  102. dataset: {
  103. all: true
  104. }
  105. }
  106. });
  107. },
  108. switchChange(e) {
  109. //console.log(e)
  110. let cartList = this.data.cartList;
  111. const allCHave = cartList.every(item => item.check == true);
  112. let checkAll = null;
  113. if (e.currentTarget.dataset.all) {
  114. if (!allCHave) {
  115. cartList.map(v => {
  116. v.check = true;
  117. });
  118. checkAll = true;
  119. } else {
  120. cartList.map(v => {
  121. v.check = false;
  122. });
  123. checkAll = true;
  124. }
  125. } else {
  126. cartList[e.currentTarget.dataset.index].check = !cartList[e.currentTarget.dataset.index].check;
  127. }
  128. this.setData({
  129. cartList,
  130. checkAll: cartList.every(item => item.check == true),
  131. checkNum: cartList.filter((item => item.check)).length,
  132. checkPrice: cartList.filter((item => item.check)).map(v => {
  133. return {
  134. price: app.currency(v.price).multiply(v.qty).value
  135. }
  136. }).reduce((price, item1) => app.currency(price).add(item1.price).value, 0),
  137. })
  138. },
  139. refreshCheckSummary() {
  140. const checkedList = this.data.cartList.filter(item => item.check);
  141. this.setData({
  142. checkAll: this.data.cartList.length > 0 && this.data.cartList.every(item => item.check === true),
  143. checkNum: checkedList.length,
  144. checkPrice: checkedList.map(item => ({
  145. price: app.currency(item.price).multiply(item.qty).value
  146. })).reduce((price, item) => app.currency(price).add(item.price).value, 0)
  147. });
  148. },
  149. qtyInput(e) {
  150. const index = e.currentTarget.dataset.index;
  151. this.setData({
  152. [`cartList[${index}].qtyInput`]: e.detail.value
  153. });
  154. },
  155. qtyBlur(e) {
  156. this.commitQty(e);
  157. },
  158. qtyConfirm(e) {
  159. this.commitQty(e);
  160. },
  161. commitQty(e) {
  162. const index = e.currentTarget.dataset.index;
  163. const value = e.detail && e.detail.value !== undefined
  164. ? e.detail.value
  165. : this.data.cartList[index].qtyInput;
  166. const target = Number(String(value).trim());
  167. if (!/^\d+$/.test(String(value).trim()) || !Number.isSafeInteger(target) || target < 1) {
  168. wx.showToast({ title: '请输入大于0的整数', icon: 'none' });
  169. this.setData({ [`cartList[${index}].qtyInput`]: String(this.data.cartList[index].qty || 1) });
  170. return;
  171. }
  172. this.updateQty(index, target);
  173. },
  174. async updateQty(index, target) {
  175. const cart = this.data.cartList[index];
  176. if (!cart || cart.qtyUpdating) return;
  177. const oldQty = cart.qty || 1;
  178. if (target === oldQty) {
  179. this.setData({ [`cartList[${index}].qtyInput`]: String(oldQty) });
  180. return;
  181. }
  182. cart.qtyUpdating = true;
  183. this.setData({ cartList: this.data.cartList });
  184. try {
  185. await this.updateSku({ id: cart.id, qty: target });
  186. cart.qty = target;
  187. cart.qtyInput = String(target);
  188. cart.qtyUpdating = false;
  189. this.setData({ cartList: this.data.cartList });
  190. this.refreshCheckSummary();
  191. this.initData();
  192. } catch (e) {
  193. cart.qtyUpdating = false;
  194. cart.qtyInput = String(oldQty);
  195. this.setData({ cartList: this.data.cartList });
  196. }
  197. },
  198. jianNum(e) {
  199. const index = e.currentTarget.dataset.index;
  200. const cart = this.data.cartList[index];
  201. if (!cart || cart.qty <= 1) return;
  202. this.updateQty(index, cart.qty - 1);
  203. },
  204. jiaNum(e) {
  205. const index = e.currentTarget.dataset.index;
  206. const cart = this.data.cartList[index];
  207. if (!cart) return;
  208. this.updateQty(index, (cart.qty || 1) + 1);
  209. },
  210. async nextBtn() {
  211. let role = wx.getStorageSync('roleList').find(v => v.roleCode == 'User' || v.roleCode == 'SZMAdmin');
  212. if (!role) {
  213. wx.showToast({
  214. title: '您无下单权限!',
  215. icon: "error"
  216. })
  217. return;
  218. }
  219. let cartList = this.data.cartList.filter((item => item.check));
  220. if (cartList.length == 0) {
  221. wx.showToast({
  222. title: '请选择商品',
  223. icon: "error"
  224. })
  225. return;
  226. }
  227. let {
  228. data
  229. } = await app.ajax.post({
  230. url: `/admin/bxdorder/bxdPiclimit`,
  231. data: {
  232. orderSaleId: this.data.userInfo.userId
  233. },
  234. });
  235. if (data.data.length) {
  236. await wx.showModal({
  237. title: '提示',
  238. content: `当前下单已被限制, 订单${data.data.map(item => item.orderNumber)}存在反馈图片超时的情况,请尽快前去上传反馈图片`
  239. })
  240. return;
  241. }
  242. let that = this;
  243. wx.navigateTo({
  244. url: '/pages/order/create/create',
  245. success: function (res) {
  246. // 通过eventChannel向被打开页面传送数据
  247. res.eventChannel.emit('acceptDataFromOpenerPage', {
  248. goodsList: cartList,
  249. checkPrice: cartList.map(v => {
  250. return {
  251. price: app.currency(v.price).multiply(v.qty).value
  252. }
  253. }).reduce((price, item1) => app.currency(price).add(item1.price).value, 0),
  254. })
  255. }
  256. })
  257. },
  258. async updateSku(data) {
  259. await app.ajax.post({
  260. url: "/admin/bxdusercollection/updateQtyById",
  261. method: "PUT",
  262. data
  263. });
  264. },
  265. async delBtn() {
  266. let ids = this.data.cartList.filter(v => v.check).map(v => v.id).join(",");
  267. if (!ids) {
  268. return;
  269. }
  270. let that = this;
  271. wx.showModal({
  272. title: "删除提示",
  273. content: `确定删除这些商品吗?`,
  274. async success(res) {
  275. if (res.confirm) {
  276. await app.ajax.post({
  277. url: `/admin/bxdusercollection/removeByIds?ids=${ids}`,
  278. method: "DELETE"
  279. });
  280. wx.showToast({
  281. title: '删除成功'
  282. })
  283. that.setData({
  284. current: 0,
  285. cartList: []
  286. })
  287. setTimeout(async () => {
  288. await that.initData();
  289. }, 1000);
  290. }
  291. }
  292. })
  293. },
  294. async delBtn1(e) {
  295. let ids = e.currentTarget.dataset.item.id;
  296. if (!ids) {
  297. return;
  298. }
  299. let that = this;
  300. wx.showModal({
  301. title: "删除提示",
  302. content: `确定删除这个商品吗?`,
  303. async success(res) {
  304. if (res.confirm) {
  305. await app.ajax.post({
  306. url: `/admin/bxdusercollection/removeByIds?ids=${ids}`,
  307. method: "DELETE"
  308. });
  309. wx.showToast({
  310. title: '删除成功'
  311. })
  312. that.setData({
  313. current: 0,
  314. cartList: []
  315. })
  316. setTimeout(async () => {
  317. await that.initData();
  318. }, 1000);
  319. }
  320. }
  321. })
  322. },
  323. /**
  324. * 生命周期函数--监听页面隐藏
  325. */
  326. onHide() {
  327. // this.setData({
  328. // checkAll: false,
  329. // checkNum: 0,
  330. // checkPrice: 0.00,
  331. // })
  332. },
  333. toLogin() {
  334. wx.navigateTo({
  335. url: '/pages/login/login',
  336. })
  337. },
  338. toGoods(e) {
  339. wx.navigateTo({
  340. url: `/pages/goods/goods?prodId=${e.currentTarget.dataset.item.prodId}`,
  341. })
  342. },
  343. /**
  344. * 生命周期函数--监听页面卸载
  345. */
  346. onUnload() {
  347. },
  348. /**
  349. * 页面相关事件处理函数--监听用户下拉动作
  350. */
  351. onPullDownRefresh() {
  352. },
  353. /**
  354. * 页面上拉触底事件的处理函数
  355. */
  356. onReachBottom() {
  357. },
  358. /**
  359. * 用户点击右上角分享
  360. */
  361. onShareAppMessage() {
  362. },
  363. touchE: function (e) {
  364. // //console.log(e);
  365. var that = this
  366. if (e.changedTouches.length == 1) {
  367. //手指移动结束后触摸点位置的X坐标
  368. var endX = e.changedTouches[0].clientX;
  369. //触摸开始与结束,手指移动的距离
  370. var disX = that.data.startX - endX;
  371. var delBtnWidth = 120;
  372. //如果距离小于删除按钮的1/2,不显示删除按钮
  373. var txtStyle = disX > delBtnWidth / 2 ? "left:-" + delBtnWidth + "rpx" : "left:0rpx";
  374. //获取手指触摸的是哪一项
  375. var index = e.currentTarget.dataset.index;
  376. var list = that.data.cartList;
  377. list[index].txtStyle = txtStyle;
  378. //更新列表的状态
  379. that.setData({
  380. cartList: list
  381. });
  382. }
  383. },
  384. //手指触摸动作开始 记录起点X坐标
  385. touchstart: function (e) {
  386. //开始触摸时 重置所有删除
  387. this.data.cartList.forEach(function (v, i) {
  388. if (v.isTouchMove) //只操作为true的
  389. v.isTouchMove = false;
  390. })
  391. this.setData({
  392. startX: e.changedTouches[0].clientX,
  393. startY: e.changedTouches[0].clientY,
  394. cartList: this.data.cartList
  395. })
  396. },
  397. //滑动事件处理
  398. touchmove: function (e) {
  399. var that = this,
  400. index = e.currentTarget.dataset.index, //当前索引
  401. startX = that.data.startX, //开始X坐标
  402. startY = that.data.startY, //开始Y坐标
  403. touchMoveX = e.changedTouches[0].clientX, //滑动变化坐标
  404. touchMoveY = e.changedTouches[0].clientY, //滑动变化坐标
  405. //获取滑动角度
  406. angle = that.angle({
  407. X: startX,
  408. Y: startY
  409. }, {
  410. X: touchMoveX,
  411. Y: touchMoveY
  412. });
  413. that.data.cartList.forEach(function (v, i) {
  414. v.isTouchMove = false
  415. //滑动超过30度角 return
  416. if (Math.abs(angle) > 30) return;
  417. if (i == index) {
  418. if (touchMoveX > startX) //右滑
  419. v.isTouchMove = false
  420. else //左滑
  421. v.isTouchMove = true
  422. }
  423. })
  424. //更新数据
  425. that.setData({
  426. cartList: that.data.cartList
  427. })
  428. },
  429. /**
  430. * 计算滑动角度
  431. * @param {Object} start 起点坐标
  432. * @param {Object} end 终点坐标
  433. */
  434. angle: function (start, end) {
  435. var _X = end.X - start.X,
  436. _Y = end.Y - start.Y
  437. //返回角度 /Math.atan()返回数字的反正切值
  438. return 360 * Math.atan(_Y / _X) / (2 * Math.PI);
  439. },
  440. })