cartList.js 11 KB

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