shoppingcart.js 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. import { models, db, _ } from '../../utils/cloudbase.js'
  2. Page({
  3. data: {
  4. cartItems: [],
  5. souimg: '',
  6. pageNumber: 1,
  7. pageSize: 10,
  8. hasMore: true, // 是否还有更多数据
  9. isLoading: false, // 防止多次触发
  10. },
  11. onShow() {
  12. // 列表数据
  13. this.setData({
  14. pageNumber: 1,
  15. hasMore: true,
  16. cartItems: []
  17. }, () => {
  18. this.getdatalist()
  19. });
  20. },
  21. onLoad() {
  22. // // 列表数据
  23. // this.setData({
  24. // pageNumber: 1,
  25. // hasMore: true,
  26. // cartItems: []
  27. // }, () => {
  28. // this.getdatalist()
  29. // });
  30. const fileIDs = [
  31. 'cloud://cloud1-6g98iw7i28b01747.636c-cloud1-6g98iw7i28b01747-1367995226/images/icon/sou.png',
  32. ];
  33. // 并发下载多个 fileID
  34. Promise.all(
  35. fileIDs.map(fileID => wx.cloud.downloadFile({ fileID }))
  36. ).then(results => {
  37. // 每个 result 对应一个下载结果
  38. const tempFilePaths = results.map(r => r.tempFilePath);
  39. console.log('全部下载成功:', tempFilePaths);
  40. this.setData({
  41. souimg: tempFilePaths[0],
  42. });
  43. }).catch(err => {
  44. console.error('有文件下载失败:', err);
  45. });
  46. },
  47. onReachBottom() {
  48. // 上拉触底事件的处理函数
  49. this.loadMore();
  50. },
  51. loadMore() {
  52. // 加载更多数据的逻辑
  53. console.log('加载更多');
  54. this.getdatalist(true);
  55. },
  56. // 获取列表数据
  57. async getdatalist(isLoadMore = false) {
  58. if (this.data.isLoading || !this.data.hasMore) return;
  59. this.setData({ isLoading: true });
  60. const { pageNumber, pageSize } = this.data;
  61. try {
  62. const { data } = await models.shopping_cart.list({
  63. filter: {
  64. where: {}
  65. },
  66. pageSize,
  67. pageNumber,
  68. getCount: true, // 开启用来获取总数
  69. // envType: pre 体验环境, prod 正式环境
  70. envType: "prod",
  71. });
  72. // 返回查询到的数据列表 records 和 总数 total
  73. console.log(data);
  74. const collectList = data.records || [];
  75. if (collectList.length === 0) {
  76. this.setData({ hasMore: false, isLoading: false });
  77. return;
  78. }
  79. const fileManagerIds = collectList.map(item => item.merchandise_id);
  80. // 第二步:循环获取每个文件数据(单条查询)
  81. const fileDetailPromises = fileManagerIds.map(id => {
  82. return models.wx_merchandise.list({
  83. filter: {
  84. where: {
  85. _id: id
  86. }
  87. },
  88. envType: "prod"
  89. }).then(res => {
  90. const record = res.data?.records?.[0];
  91. if (!record) {
  92. console.warn(`未找到 _id 为 ${id} 的文件`);
  93. }
  94. return record || null;
  95. })
  96. .catch(err => {
  97. console.error(`获取文件 ${id} 失败`, err);
  98. return null;
  99. });
  100. });
  101. // 第三步:等待所有请求完成
  102. const fileDetails = await Promise.all(fileDetailPromises);
  103. console.log(fileDetails, 'fileDetails');
  104. // 第四步:过滤无效项,并添加 checked 字段
  105. const newFiles = fileDetails
  106. .filter(Boolean) // 去掉 null 或 undefined
  107. .map((file, index) => {
  108. const historyRecord = collectList[index]; // 获取原 download_history 的记录
  109. if (!file) return null;
  110. return {
  111. ...file,
  112. checked: false,
  113. download_history_id: historyRecord._id,
  114. specs_index: Number(historyRecord.specs_index),
  115. num: historyRecord.num // 关键:存 download_history 的 id
  116. };
  117. });
  118. this.setData({
  119. cartItems: isLoadMore ? this.data.cartItems.concat(newFiles) : newFiles,
  120. pageNumber: pageNumber + 1,
  121. hasMore: collectList.length === pageSize, // 如果返回的数量小于 pageSize,说明已经到底
  122. isLoading: false
  123. }, () => {
  124. this.updateTotalPrice();
  125. });
  126. } catch (err) {
  127. console.error('获取收藏文件失败:', err);
  128. this.setData({ isLoading: false });
  129. }
  130. },
  131. handleCheckboxChange(e) {
  132. const { value } = e.detail;
  133. const cartItems = this.data.cartItems.map(item => ({
  134. ...item,
  135. checked: value.includes(item.download_history_id)
  136. }));
  137. this.setData({ cartItems });
  138. this.updateTotalPrice();
  139. },
  140. handleAllCheckboxChange(e) {
  141. const { value } = e.detail;
  142. const allChecked = value.includes('all');
  143. const cartItems = this.data.cartItems.map(item => ({
  144. ...item,
  145. checked: allChecked
  146. }));
  147. this.setData({ cartItems, allChecked });
  148. this.updateTotalPrice();
  149. },
  150. updateTotalPrice() {
  151. const totalPrice = this.data.cartItems.reduce((total, item) => {
  152. if (item.checked) {
  153. return total + item.price * item.num;
  154. }
  155. return total;
  156. }, 0);
  157. this.setData({ totalPrice });
  158. },
  159. handleCheckout() {
  160. // 过滤出已选中的商品
  161. const selectedItems = this.data.cartItems.filter(item => item.checked);
  162. if (selectedItems.length === 0) {
  163. wx.showToast({
  164. title: '请选择要结算的商品',
  165. icon: 'none'
  166. });
  167. return;
  168. }
  169. // 将数据存入本地缓存
  170. wx.setStorageSync('checkoutItems', selectedItems);
  171. wx.navigateTo({
  172. url: '/subpackages/submitorder/submitorder'
  173. });
  174. },
  175. // 购买数量
  176. onChange(e) {
  177. const { id } = e.currentTarget.dataset;
  178. const { detail } = e;
  179. const cartItems = this.data.cartItems.map(item => {
  180. if (item._id === id) {
  181. return { ...item, num: detail };
  182. }
  183. return item;
  184. });
  185. this.setData({ cartItems }, () => {
  186. this.updateTotalPrice();
  187. });
  188. }
  189. });