shoppingcart.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367
  1. // import { models, db, _ } from '../../utils/cloudbase.js'
  2. import { getDB, getModels, getCommand, getTempFileURLs } from '../../utils/cloudbase.js'
  3. Page({
  4. data: {
  5. cartItems: [],
  6. souimg: '',
  7. pageNumber: 1,
  8. pageSize: 10,
  9. hasMore: true, // 是否还有更多数据
  10. isLoading: false, // 防止多次触发
  11. searchText: '', // 输入的搜索内容
  12. },
  13. onShow() {
  14. if (typeof this.getTabBar === 'function' && this.getTabBar()) {
  15. this.getTabBar().setSelected(2); // 比如首页就是 0
  16. }
  17. // 列表数据
  18. this.setData({
  19. pageNumber: 1,
  20. hasMore: true,
  21. cartItems: []
  22. }, () => {
  23. this.getdatalist()
  24. });
  25. },
  26. async onLoad() {
  27. // // 列表数据
  28. // this.setData({
  29. // pageNumber: 1,
  30. // hasMore: true,
  31. // cartItems: []
  32. // }, () => {
  33. // this.getdatalist()
  34. // });
  35. const fileIDs = [
  36. 'cloud://honghgaier-5guiffgcf17a2eea.686f-honghgaier-5guiffgcf17a2eea-1373037829/images/icon/sou.png',
  37. ];
  38. const fileList = await getTempFileURLs(fileIDs)
  39. this.setData({
  40. souimg: fileList[0].tempFileURL,
  41. })
  42. // // 并发下载多个 fileID
  43. // Promise.all(
  44. // fileIDs.map(fileID => wx.cloud.downloadFile({ fileID }))
  45. // ).then(results => {
  46. // // 每个 result 对应一个下载结果
  47. // const tempFilePaths = results.map(r => r.tempFilePath);
  48. // console.log('全部下载成功:', tempFilePaths);
  49. // this.setData({
  50. // souimg: tempFilePaths[0],
  51. // });
  52. // }).catch(err => {
  53. // console.error('有文件下载失败:', err);
  54. // });
  55. },
  56. onReachBottom() {
  57. // 上拉触底事件的处理函数
  58. this.loadMore();
  59. },
  60. loadMore() {
  61. // 加载更多数据的逻辑
  62. console.log('加载更多');
  63. // this.getdatalist(true);
  64. if (this.data.isLoading || !this.data.hasMore) return;
  65. this.setData({ isLoading: true });
  66. this.getdatalist(true);
  67. },
  68. // 模糊搜索
  69. onSearchInput(e) {
  70. const searchText = e.detail.value.trim();
  71. this.setData({
  72. searchText,
  73. pageNumber: 1,
  74. cartItems: [],
  75. hasMore: true
  76. }, () => {
  77. this.getdatalist();
  78. });
  79. },
  80. onSearchConfirm() {
  81. this.setData({
  82. pageNumber: 1,
  83. cartItems: [],
  84. hasMore: true
  85. }, () => {
  86. this.getdatalist();
  87. });
  88. },
  89. // 获取列表数据
  90. async getdatalist(isLoadMore = false) {
  91. const models = await getModels()
  92. if (this.data.isLoading || !this.data.hasMore) return;
  93. this.setData({ isLoading: true });
  94. const { pageNumber, pageSize, searchText } = this.data;
  95. // 获取本地存储的用户信息
  96. const userInfo = wx.getStorageSync('userInfo');
  97. const userId = userInfo && userInfo._id ? userInfo._id : ''; // 根据你的userInfo结构取ID
  98. const cartWhere = {
  99. user_id: userId // 每次必传
  100. };
  101. if (searchText) {
  102. cartWhere.name = { $regex_ci: searchText };
  103. }
  104. try {
  105. const { data } = await models.shopping_cart.list({
  106. filter: {
  107. where: cartWhere
  108. },
  109. pageSize,
  110. pageNumber,
  111. getCount: true, // 开启用来获取总数
  112. // envType: pre 体验环境, prod 正式环境
  113. envType: "prod",
  114. });
  115. // 返回查询到的数据列表 records 和 总数 total
  116. console.log(data);
  117. const collectList = data.records || [];
  118. if (collectList.length === 0) {
  119. this.setData({ hasMore: false, isLoading: false });
  120. return;
  121. }
  122. const fileManagerIds = collectList.map(item => item.merchandise_id);
  123. // 第二步:循环获取每个文件数据(单条查询)
  124. const fileDetailPromises = fileManagerIds.map(id => {
  125. return models.wx_merchandise.list({
  126. filter: {
  127. where: {
  128. _id: id
  129. }
  130. },
  131. envType: "prod"
  132. }).then(res => {
  133. const record = res.data?.records?.[0];
  134. if (!record) {
  135. console.warn(`未找到 _id 为 ${id} 的文件`);
  136. }
  137. return record || null;
  138. })
  139. .catch(err => {
  140. console.error(`获取文件 ${id} 失败`, err);
  141. return null;
  142. });
  143. });
  144. // 第三步:等待所有请求完成
  145. const fileDetails = await Promise.all(fileDetailPromises);
  146. console.log(fileDetails, 'fileDetails');
  147. // 第四步:过滤无效项,并添加 checked 字段
  148. let newFiles = fileDetails
  149. .filter(Boolean)
  150. .map((file, index) => {
  151. const historyRecord = collectList[index];
  152. if (!file) return null;
  153. return {
  154. ...file,
  155. checked: false,
  156. download_history_id: historyRecord._id,
  157. specs_index: Number(historyRecord.specs_index),
  158. num: historyRecord.num
  159. };
  160. })
  161. .filter(Boolean);
  162. // ✅ 如果搜索内容不为空,在本地进行模糊匹配过滤
  163. if (searchText) {
  164. const pattern = new RegExp(searchText, 'i'); // 不区分大小写
  165. newFiles = newFiles.filter(item => pattern.test(item.name));
  166. }
  167. // 循环去查 groupbuy 表
  168. for (let item of newFiles) {
  169. try {
  170. const res = await models.wx_groupbuy_groupbuy.list({
  171. filter: { where: { groupbuy_id: item._id } },
  172. envType: "prod",
  173. });
  174. // 把查到的记录存入 specList,保证是数组
  175. item.specList = res.data.records || [];
  176. } catch (err) {
  177. console.error(`获取 groupbuy 失败,商品ID: ${item._id}`, err);
  178. item.specList = [];
  179. }
  180. }
  181. console.log(newFiles, '+++++++++++++++++++++++++++++');
  182. // 第五步:循环处理 specList 和商品主图
  183. for (let item of newFiles) {
  184. // 处理 groupbuy 里的 detail_images
  185. if (item.specList && item.specList.length > 0) {
  186. for (let i = 0; i < item.specList.length; i++) {
  187. const images = item.specList[i].detail_images || [];
  188. if (images.length > 0) {
  189. const tempFiles = await getTempFileURLs(images);
  190. item.specList[i].detail_images = tempFiles.map(f => f.tempFileURL);
  191. }
  192. }
  193. }
  194. // 处理商品主图 item.img
  195. if (item.img) {
  196. const tempFiles = await getTempFileURLs([item.img]);
  197. item.img = tempFiles[0].tempFileURL;
  198. }
  199. }
  200. this.setData({
  201. cartItems: isLoadMore ? this.data.cartItems.concat(newFiles) : newFiles,
  202. pageNumber: pageNumber + 1,
  203. hasMore: collectList.length === pageSize, // 如果返回的数量小于 pageSize,说明已经到底
  204. isLoading: false
  205. }, () => {
  206. this.updateTotalPrice();
  207. });
  208. } catch (err) {
  209. console.error('获取收藏文件失败:', err);
  210. this.setData({ isLoading: false });
  211. }
  212. },
  213. handleCheckboxChange(e) {
  214. const { value } = e.detail;
  215. const cartItems = this.data.cartItems.map(item => ({
  216. ...item,
  217. checked: value.includes(item.download_history_id)
  218. }));
  219. this.setData({ cartItems });
  220. this.updateTotalPrice();
  221. },
  222. handleAllCheckboxChange(e) {
  223. const { value } = e.detail;
  224. const allChecked = value.includes('all');
  225. const cartItems = this.data.cartItems.map(item => ({
  226. ...item,
  227. checked: allChecked
  228. }));
  229. this.setData({ cartItems, allChecked });
  230. this.updateTotalPrice();
  231. },
  232. updateTotalPrice() {
  233. const totalPrice = this.data.cartItems.reduce((total, item) => {
  234. if (item.checked) {
  235. return total + item.specList[item.specs_index].price * item.num;
  236. }
  237. return total;
  238. }, 0);
  239. this.setData({ totalPrice });
  240. },
  241. // handleCheckout() {
  242. // // 过滤出已选中的商品
  243. // const selectedItems = this.data.cartItems.filter(item => item.checked);
  244. // if (selectedItems.length === 0) {
  245. // wx.showToast({
  246. // title: '请选择要结算的商品',
  247. // icon: 'none'
  248. // });
  249. // return;
  250. // }
  251. // // 将数据存入本地缓存
  252. // wx.setStorageSync('checkoutItems', selectedItems);
  253. // wx.navigateTo({
  254. // url: '/subpackages/submitorder/submitorder'
  255. // });
  256. // },
  257. handleCheckout: async function() {
  258. const models = await getModels()
  259. // 过滤出已选中的商品
  260. const selectedItems = this.data.cartItems.filter(item => item.checked);
  261. if (selectedItems.length === 0) {
  262. wx.showToast({
  263. title: '请选择要结算的商品',
  264. icon: 'none'
  265. });
  266. return;
  267. }
  268. // 1️⃣ 将选中商品存入本地缓存
  269. wx.setStorageSync('checkoutItems', selectedItems);
  270. // 2️⃣ 删除购物车表中已选商品(循环单条删除)
  271. wx.showLoading({ title: '处理中...' });
  272. try {
  273. const deletePromises = selectedItems.map(item => {
  274. return models.shopping_cart.delete({
  275. filter: {
  276. where: {
  277. $and: [
  278. { _id: { $eq: item.download_history_id } }
  279. ]
  280. }
  281. },
  282. envType: 'prod'
  283. });
  284. });
  285. const results = await Promise.all(deletePromises);
  286. console.log('删除结果:', results.map(r => r.data.count));
  287. // 3️⃣ 更新前端页面数据
  288. // const remainingItems = this.data.cartItems.filter(item => !item.checked);
  289. // this.setData({ cartItems: remainingItems });
  290. wx.hideLoading();
  291. // 4️⃣ 跳转结算页
  292. wx.navigateTo({
  293. url: '/subpackages/submitorder/submitorder'
  294. });
  295. } catch (err) {
  296. // console.error('删除失败:', err);
  297. // wx.hideLoading();
  298. // wx.showToast({ title: '删除购物车失败,请重试', icon: 'none' });
  299. // // 即便删除失败,也可以跳转结算页(可选)
  300. // wx.navigateTo({
  301. // url: '/subpackages/submitorder/submitorder'
  302. // });
  303. }
  304. },
  305. // 购买数量
  306. onChange(e) {
  307. const { id } = e.currentTarget.dataset;
  308. const { detail } = e;
  309. const cartItems = this.data.cartItems.map(item => {
  310. if (item.download_history_id === id) {
  311. return { ...item, num: detail };
  312. }
  313. return item;
  314. });
  315. this.setData({ cartItems }, () => {
  316. this.updateTotalPrice();
  317. });
  318. }
  319. });