shop.vue 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. <template>
  2. <view class="shop-cart">
  3. <van-cell :title="defaultAddr === '' ? '默认收货地址' : defaultAddr" is-link link-type="navigateTo"
  4. url="/pages/address/address" />
  5. <view style="height: 25rpx;"></view>
  6. <view class="cards-list">
  7. <view v-for="(item,index) in shopCartInfo" :key="index">
  8. <van-row v-for="(items,index1) in item.shopCartItemDiscounts[0].shopCartItems" :key="items.basketId">
  9. <van-col span="2">
  10. <van-checkbox @click.native="basketClick" @change="onChange" :data-param1="items.basketId"
  11. :value="items.isCheck"></van-checkbox>
  12. </van-col>
  13. <van-col span="22">
  14. <text class="shop-name">{{ item.shopName }}</text>
  15. <van-card :num="items.prodCount" :price="items.price" :desc="items.skuName"
  16. :title="items.prodName" :thumb="items.pic">
  17. <template #footer>
  18. <van-stepper :value="items.prodCount" :data-param1="items" async-change
  19. @change="changeThing" integer />
  20. </template>
  21. </van-card>
  22. </van-col>
  23. </van-row>
  24. <van-divider />
  25. </view>
  26. <van-empty v-if="shopCartInfo <= 0" />
  27. <van-submit-bar :price="totalMoney" button-text="提交订单" @submit="onSubmit">
  28. <van-checkbox :value="checkedAll" @change="allProdSelected">全选</van-checkbox>
  29. <a class="clear-cart" v-if="basketIds.length > 0" @click="clearCart">清空</a>
  30. </van-submit-bar>
  31. </view>
  32. </view>
  33. </template>
  34. <script>
  35. import {
  36. shopCartInfo,
  37. totalPay,
  38. changeItem,
  39. deleteItem
  40. } from '@/api/shop.js'
  41. import {
  42. addressList
  43. } from '@/api/address.js'
  44. export default {
  45. data() {
  46. return {
  47. checkedAll: false,
  48. shopCartInfo: [],
  49. value: 0,
  50. basketIds: [],
  51. totalMoney: 0,
  52. addresslist: [],
  53. defaultAddr: "",
  54. defaultAddrId: 0,
  55. changeItemList: {
  56. basketId: 0,
  57. prodId: 0,
  58. skuId: 0,
  59. shopId: 0,
  60. count: 0,
  61. distributionCardNo: ""
  62. },
  63. confirm: {
  64. basketIds: [],
  65. orderItem: {
  66. prodId: 0,
  67. skuId: 0,
  68. prodCount: 1,
  69. shopId: 0,
  70. distributionCardNo: ""
  71. },
  72. addrId: 0,
  73. userChangeCoupon: 0,
  74. couponIds: []
  75. },
  76. }
  77. },
  78. async onShow() {
  79. this.init();
  80. this.checkedAll = false;
  81. },
  82. methods: {
  83. onChange(event) {
  84. let shop = this.shopCartInfo[0].shopCartItemDiscounts[0].shopCartItems;
  85. setTimeout(() => {
  86. if (this.basketIds.length == shop.length) {
  87. this.checkedAll = true;
  88. } else {
  89. this.checkedAll = false;
  90. }
  91. }, 100)
  92. shop.forEach((obj) => {
  93. if (obj.basketId === event.currentTarget.dataset.param1) {
  94. obj.isCheck = event.detail;
  95. // this.basketIds.push
  96. }
  97. })
  98. },
  99. onSubmit() {
  100. if (this.basketIds.length <= 0) return;
  101. this.confirm.basketIds = this.basketIds
  102. this.confirm.addrId = this.defaultAddrId
  103. uni.setStorageSync("confirm", JSON.stringify(this.confirm))
  104. uni.navigateTo({
  105. url: "/pages/order/order"
  106. })
  107. },
  108. changeThing(event) {
  109. let value = event.detail;
  110. let items = event.currentTarget.dataset.param1;
  111. this.shopCartInfo[0].shopCartItemDiscounts[0].shopCartItems.forEach((obj) => {
  112. if (obj.basketId === items.basketId) {
  113. obj.prodCount = value;
  114. }
  115. })
  116. if (items.prodCount === value) {
  117. return;
  118. }
  119. let count = 1;
  120. if (items.prodCount > value) {
  121. count = -1;
  122. }
  123. this.onStepperChange(items, count, () => {
  124. items.prodCount = value
  125. setTimeout(() => {
  126. if (this.basketIds.includes(items.basketId)) {
  127. totalPay(this.basketIds).then(res => {
  128. this.totalMoney = res.finalMoney * 100
  129. })
  130. }
  131. }, 200)
  132. })
  133. },
  134. async init() {
  135. shopCartInfo({}).then(res => {
  136. this.shopCartInfo = res;
  137. this.shopCartInfo[0].shopCartItemDiscounts[0].shopCartItems.map((obj) => {
  138. obj.isCheck = false;
  139. return obj;
  140. })
  141. this.basketClick();
  142. })
  143. this.addresslist = await addressList()
  144. for (const key in this.addresslist) {
  145. if (Object.hasOwnProperty.call(this.addresslist, key)) {
  146. if (this.addresslist[key].commonAddr === 1) {
  147. const result = this.addresslist[key]
  148. this.defaultAddrId = this.addresslist[key].addrId
  149. this.defaultAddr = result.province + " " + result.city + " " +
  150. result.area + " " + result.addr
  151. }
  152. }
  153. }
  154. },
  155. async basketClick(event) {
  156. if (event) {
  157. let param = event.currentTarget.dataset.param1 || event.basketIds;
  158. this.basketIds.push(param)
  159. this.basketIds = this.removeDuplicates(this.basketIds);
  160. } else {
  161. this.basketIds = []
  162. }
  163. const result = await totalPay(this.basketIds);
  164. this.totalMoney = result.finalMoney * 100;
  165. },
  166. removeDuplicates(arr) {
  167. for (let i = 0; i < arr.length; i++) {
  168. for (let j = i + 1; j < arr.length; j++) {
  169. if (arr[i] === arr[j]) {
  170. arr.splice(j, 1); // 删除相同的元素
  171. arr.splice(i, 1);
  172. i--; // 更新索引,以便继续比较下一个元素
  173. break;
  174. }
  175. }
  176. }
  177. return arr;
  178. },
  179. allProdSelected(event) {
  180. this.checkedAll = event.detail;
  181. let shop = this.shopCartInfo[0].shopCartItemDiscounts[0].shopCartItems;
  182. if (this.checkedAll == true) {
  183. shop.forEach((obj) => {
  184. obj.isCheck = true;
  185. this.basketIds.push(obj.basketId);
  186. })
  187. this.total(this.basketIds);
  188. } else {
  189. shop.forEach((obj) => {
  190. obj.isCheck = false;
  191. })
  192. this.basketIds = [];
  193. this.total(this.basketIds);
  194. }
  195. },
  196. async total(event) {
  197. setTimeout(()=>{
  198. totalPay(event).then(res => {
  199. this.totalMoney = res.finalMoney * 100;
  200. })
  201. },100)
  202. },
  203. clearCart() {
  204. deleteItem(this.basketIds).then(r => {
  205. this.init();
  206. })
  207. },
  208. onStepperChange(items, value, callback) {
  209. this.changeItemList.basketId = items.basketId;
  210. this.changeItemList.prodId = items.prodId;
  211. this.changeItemList.skuId = items.skuId;
  212. this.changeItemList.shopId = items.shopId;
  213. this.changeItemList.count = value;
  214. this.changeItemList.distributionCardNo = "";
  215. changeItem(this.changeItemList).then(res => {
  216. console.log(res, 'eee')
  217. })
  218. callback();
  219. },
  220. }
  221. }
  222. </script>
  223. <style lang='less'>
  224. .shop-cart {
  225. background-color: #fafafa;
  226. height: 100%;
  227. .clear-cart {
  228. margin-left: 1rem;
  229. color: #333;
  230. }
  231. .van-submit-bar {
  232. position: fixed;
  233. bottom: 0;
  234. left: 0;
  235. }
  236. .cards-list {
  237. padding-right: 0.5rem;
  238. padding-left: 0.5rem;
  239. background-color: #fff;
  240. padding-bottom: 100rpx;
  241. .van-row {
  242. .van-col--2 {
  243. margin-top: 6rem;
  244. }
  245. .van-col {
  246. .shop-name {
  247. display: inline-block;
  248. height: 2.5rem;
  249. text-align: left;
  250. width: 100%;
  251. margin-top: 1rem;
  252. font-weight: 600;
  253. }
  254. .van-card {
  255. background-color: #fff;
  256. }
  257. }
  258. }
  259. }
  260. }
  261. </style>