Pārlūkot izejas kodu

Merge branch 'vue3_tmp' of https://gitee.com/huizhizao/yudao-mall-uniapp into master-vue3

# Conflicts:
#	pages/index/index.vue
YunaiV 1 gadu atpakaļ
vecāks
revīzija
4854cee7ca

+ 42 - 37
App.vue

@@ -1,41 +1,46 @@
 <script setup>
-  import { onLaunch, onShow, onError } from '@dcloudio/uni-app';
-  import { ShoproInit } from './sheep';
-
-  onLaunch(() => {
-    // 隐藏原生导航栏 使用自定义底部导航
-    uni.hideTabBar();
-
-    // 加载Shopro底层依赖
-    ShoproInit();
-  });
-
-  onError((err) => {
-    console.log('AppOnError:', err);
-  });
-
-  onShow((options) => {
-    // #ifdef APP-PLUS
-    // 获取urlSchemes参数
-    const args = plus.runtime.arguments;
-    if (args) {
-    }
-
-    // 获取剪贴板 
-    uni.getClipboardData({
-      success: (res) => { },
-    });
-    // #endif
-
-    // #ifdef MP-WEIXIN
-    // 确认收货回调结果
-    console.log(options,'options');
-    // #endif
-
-
-  });
+	import {
+		onLaunch,
+		onShow,
+		onError
+	} from '@dcloudio/uni-app';
+	import {
+		ShoproInit
+	} from './sheep';
+
+	onLaunch(() => {
+		// 隐藏原生导航栏 使用自定义底部导航
+		uni.hideTabBar();
+
+		// 加载Shopro底层依赖
+		ShoproInit();
+	});
+
+	onError((err) => {
+		console.log('AppOnError:', err);
+	});
+
+	onShow((options) => {
+		// #ifdef APP-PLUS 
+		// 获取urlSchemes参数
+		const args = plus.runtime.arguments;
+		if (args) {}
+
+		// 获取剪贴板 
+		uni.getClipboardData({
+			success: (res) => {},
+		});
+		// #endif
+
+		// #ifdef MP-WEIXIN
+		// 确认收货回调结果
+		console.log(options, 'options');
+		// #endif
+
+
+	});
 </script>
 
 <style lang="scss">
-  @import '@/sheep/scss/index.scss';
-</style>
+	@import '@/sheep/scss/index.scss';
+</style>

+ 239 - 220
pages/coupon/list.vue

@@ -1,242 +1,261 @@
 <!-- 优惠券中心  -->
 <template>
-  <s-layout title="优惠券" :bgStyle="{ color: '#f2f2f2' }">
-    <su-sticky bgColor="#fff">
-      <su-tabs
-        :list="tabMaps"
-        :scrollable="false"
-        @change="onTabsChange"
-        :current="state.currentTab"
-      ></su-tabs>
-    </su-sticky>
-    <s-empty
-      v-if="state.pagination.total === 0"
-      icon="/static/coupon-empty.png"
-      text="暂无优惠券"
-    ></s-empty>
-    <template v-if="state.currentTab == '0'">
-      <view v-for="item in state.pagination.data" :key="item.id">
-        <s-coupon-list
-          :data="item"
-          @tap="
-            sheep.$router.go('/pages/coupon/detail', {
-              id: item.id,
-            })
-          "
-        >
-          <template #default>
-            <button
-              class="ss-reset-button card-btn ss-flex ss-row-center ss-col-center"
-              :class="item.get_status != 'can_get' ? 'border-btn' : ''"
-              @click.stop="getBuy(item.id)"
-              :disabled="item.get_status != 'can_get'"
-            >
-              {{ item.get_status_text }}
-            </button>
-          </template>
-        </s-coupon-list>
-      </view>
-    </template>
-    <template v-else>
-      <view v-for="item in state.pagination.data" :key="item.id">
-        <s-coupon-list
-          :data="item"
-          type="user"
-          @tap="
-            sheep.$router.go('/pages/coupon/detail', {
-              id: item.coupon_id,
-              user_coupon_id: item.id,
-            })
-          "
-        >
-          <template #default>
-            <button
-              class="ss-reset-button card-btn ss-flex ss-row-center ss-col-center"
-              :class="
+	<s-layout title="优惠券" :bgStyle="{ color: '#f2f2f2' }">
+		<su-sticky bgColor="#fff">
+			<su-tabs :list="tabMaps" :scrollable="false" @change="onTabsChange" :current="state.currentTab"></su-tabs>
+		</su-sticky>
+		<s-empty v-if="state.pagination.total === 0" icon="/static/coupon-empty.png" text="暂无优惠券"></s-empty>
+		<template v-if="state.currentTab == '0'">
+			<view v-for="item in state.pagination.list" :key="item.id">
+				<s-coupon-list :data="item">
+					<!-- 	@tap="
+					  sheep.$router.go('/pages/coupon/detail', {
+					    id: item.id,
+					  })
+					" -->
+					<template #default>
+						<button class="ss-reset-button card-btn ss-flex ss-row-center ss-col-center"
+							:class="item.get_status != 'can_get' ? 'border-btn' : ''" @click.stop="getBuy(item.id)"
+							:disabled="item.get_status != 'can_get'">
+							<!-- {{ item.status_text }} -->
+							{{item.status_text|| '立即使用' }}
+						</button>
+					</template>
+				</s-coupon-list>
+			</view>
+		</template>
+		<template v-else>
+			<view v-for="item in state.pagination.list" :key="item.id">
+				<s-coupon-list :data="item" type="user">
+					<!-- 	@tap="
+					            sheep.$router.go('/pages/coupon/detail', {
+					              id: item.id,
+					            })
+					          " -->
+					<template #default>
+						<button class="ss-reset-button card-btn ss-flex ss-row-center ss-col-center" :class="
                 item.status == 'can_get' || item.status == 'can_use'
                   ? ''
                   : item.status == 'used' || item.status == 'expired'
                   ? 'disabled-btn'
                   : 'border-btn'
-              "
-              :disabled="item.status != 'can_get' && item.status != 'can_use'"
-              @click.stop="
+              " :disabled="item.status != 'can_get' && item.status != 'can_use'" @click.stop="
                 sheep.$router.go('/pages/coupon/detail', {
                   id: item.coupon_id,
                   user_coupon_id: item.id,
                 })
-              "
-            >
-              {{ item.status_text }}
-            </button>
-          </template>
-        </s-coupon-list>
-      </view>
-    </template>
+              ">
+							<!-- {{ item.status_text }} -->
+							{{item.status_text|| '立即使用' }}
+						</button>
+					</template>
+				</s-coupon-list>
+			</view>
+		</template>
 
-    <uni-load-more
-      v-if="state.pagination.total > 0"
-      :status="state.loadStatus"
-      :content-text="{
+		<!-- <uni-load-more v-if="state.pagination.total > 0" :status="state.loadStatus" :content-text="{
         contentdown: '上拉加载更多',
-      }"
-      @tap="loadmore"
-    />
-  </s-layout>
+      }" @tap="loadmore" /> -->
+	</s-layout>
 </template>
 
 <script setup>
-  import sheep from '@/sheep';
-  import { onLoad, onReachBottom } from '@dcloudio/uni-app';
-  import { computed, reactive } from 'vue';
-  import _ from 'lodash';
+	import sheep from '@/sheep';
+	import {
+		onLoad,
+		onReachBottom
+	} from '@dcloudio/uni-app';
+	import {
+		computed,
+		reactive
+	} from 'vue';
+	import _ from 'lodash';
 
-  const pagination = {
-    data: [],
-    current_page: 1,
-    total: 1,
-    last_page: 1,
-  };
-  // 数据
-  const state = reactive({
-    currentTab: 0,
-    pagination: {
-      data: [],
-      current_page: 1,
-      total: 1,
-      last_page: 1,
-    },
-    loadStatus: '',
-    type: '',
-  });
+	const pagination = {
+		data: [],
+		current_page: 1,
+		total: 1,
+		last_page: 1,
+	};
+	// 数据
+	const state = reactive({
+		currentTab: 0,
+		pagination: {
+			data: [],
+			current_page: 1,
+			total: 1,
+			last_page: 1,
+		},
+		loadStatus: '',
+		type: '1',
+	});
 
-  const tabMaps = [
-    {
-      name: '领券中心',
-      value: 'all',
-    },
-    {
-      name: '已领取',
-      value: 'geted',
-    },
-    {
-      name: '已使用',
-      value: 'used',
-    },
-    {
-      name: '已失效',
-      value: 'expired',
-    },
-  ];
-  function onTabsChange(e) {
-    state.pagination = pagination
-    state.currentTab = e.index;
-    state.type = e.value;
-    if (state.currentTab == 0) {
-      getData();
-    } else {
-      getCoupon();
-    }
-  }
-  async function getData(page = 1, list_rows = 5) {
-    state.loadStatus = 'loading';
-    const res = await sheep.$api.coupon.list({ list_rows, page });
-    if (res.error === 0) {
-      let couponlist = _.concat(state.pagination.data, res.data.data);
-      state.pagination = {
-        ...res.data,
-        data: couponlist,
-      };
-      if (state.pagination.current_page < state.pagination.last_page) {
-        state.loadStatus = 'more';
-      } else {
-        state.loadStatus = 'noMore';
-      }
-    }
-  }
+	const tabMaps = [
+		// {
+		//   name: '领券中心',
+		//   value: 'all',
+		// },
+		{
+			name: '已领取',
+			value: '1',
+		},
+		{
+			name: '已使用',
+			value: '2',
+		},
+		{
+			name: '已失效',
+			value: '3',
+		},
+	];
 
-  async function getCoupon(page = 1, list_rows = 5) {
-    state.loadStatus = 'loading';
-    let res = await sheep.$api.coupon.userCoupon({
-      type: state.type,
-      list_rows,
-      page,
-    });
-    if (res.error === 0) {
-      if (page >= 2) {
-        let couponlist = _.concat(state.pagination.data, res.data.data);
-        state.pagination = {
-          ...res.data,
-          data: couponlist,
-        };
-      } else {
-        state.pagination = res.data;
-      }
-      if (state.pagination.current_page < state.pagination.last_page) {
-        state.loadStatus = 'more';
-      } else {
-        state.loadStatus = 'noMore';
-      }
-    }
-  }
-  async function getBuy(id) {
-    const { error, msg } = await sheep.$api.coupon.get(id);
-    if (error === 0) {
-      uni.showToast({
-        title: msg,
-      });
-      setTimeout(() => {
-        state.pagination = pagination
-        getData();
-      }, 1000);
-    }
-  }
+	function onTabsChange(e) {
+		state.pagination = pagination
+		state.currentTab = e.index;
+		state.type = e.value;
+		// if (state.currentTab == 0) {
+		// 	getData();
+		// } else {
+		getCoupon();
+		// }
+	}
+	async function getData(page = 1, list_rows = 5) {
+		state.loadStatus = 'loading';
+		const res = await sheep.$api.coupon.list({
+			list_rows,
+			page
+		});
+		if (res.error === 0) {
+			let couponlist = _.concat(state.pagination.data, res.data.data);
+			state.pagination = {
+				...res.data,
+				data: couponlist,
+			};
+			if (state.pagination.current_page < state.pagination.last_page) {
+				state.loadStatus = 'more';
+			} else {
+				state.loadStatus = 'noMore';
+			}
+		}
+	}
 
-  // 加载更多
-  function loadmore() {
-    if (state.loadStatus !== 'noMore') {
-      if (state.currentTab == 0) {
-        getData(state.pagination.current_page + 1);
-      } else {
-        getCoupon(state.pagination.current_page + 1);
-      }
-    }
-  }
-  onLoad((Option) => {
-    if (Option.type === 'all' || !Option.type) {
-      getData();
-    } else {
-      state.type = Option.type;
-      Option.type === 'geted'
-        ? (state.currentTab = 1)
-        : Option.type === 'used'
-        ? (state.currentTab = 2)
-        : (state.currentTab = 3);
-      getCoupon();
-    }
-  });
-  onReachBottom(() => {
-    loadmore();
-  });
+	async function getCoupon(page = 1, list_rows = 5) {
+		state.loadStatus = 'loading';
+		let res = await sheep.$api.coupon.userCoupon({
+			status: state.type,
+			pageSize: list_rows,
+			pageNo: page
+		});
+		if (res.code === 0) {
+			// 拦截修改数据
+			let obj = {
+				1: '可用',
+				2: '已用',
+				3: '过期'
+			}
+			res.data.list = res.data.list.map(item => {
+				return {
+					...item,
+					enough: (item.usePrice / 100).toFixed(2),
+					amount: (item.discountPrice / 100).toFixed(2),
+					use_start_time: sheep.$helper.timeFormat(item.validStartTime, 'yyyy-mm-dd hh:MM:ss'),
+					use_end_time: sheep.$helper.timeFormat(item.validEndTime, 'yyyy-mm-dd hh:MM:ss'),
+					status_text: obj[item.status]
+				}
+			});
+			if (page >= 2) {
+				let couponlist = _.concat(state.pagination.data, res.data.list);
+
+				state.pagination = {
+					...res.data,
+					data: couponlist,
+				};
+				console.log(state.pagination, '拿到的优惠券数据');
+			} else {
+				state.pagination = res.data;
+				console.log(state.pagination, '拿到的优惠券数据');
+			}
+			// if (state.pagination.current_page < state.pagination.last_page) {
+			// 	state.loadStatus = 'more';
+			// } else {
+			// 	state.loadStatus = 'noMore';
+			// }
+		}
+	}
+	async function getBuy(id) {
+		const {
+			error,
+			msg
+		} = await sheep.$api.coupon.get(id);
+		if (error === 0) {
+			uni.showToast({
+				title: msg,
+			});
+			setTimeout(() => {
+				state.pagination = pagination
+				getData();
+			}, 1000);
+		}
+	}
+
+	// 加载更多
+	function loadmore() {
+		if (state.loadStatus !== 'noMore') {
+			if (state.currentTab == 0) {
+				getData(state.pagination.current_page + 1);
+			} else {
+				getCoupon(state.pagination.current_page + 1);
+			}
+		}
+	}
+	onLoad((Option) => {
+		// if (Option.type === 'all' || !Option.type) {
+		// 	getData();
+		// } else {
+		// state.type = Option.type;
+		// Option.type === 'geted' ?
+		// 	() :
+		// 	Option.type === 'used' ?
+		// 	(state.currentTab = 1 && state.type = 2) :
+		// 	(state.currentTab = 2 && state.type = 3);
+
+		if (Option.type == 'geted') {
+			state.currentTab = 0
+			state.type = 1
+		} else if (Option.type == 'used') {
+			state.currentTab = 1
+			state.type = 2
+		} else {
+			state.currentTab = 2
+			state.type = 3
+		}
+		getCoupon();
+		// }
+	});
+	onReachBottom(() => {
+		loadmore();
+	});
 </script>
 <style lang="scss" scoped>
-  .card-btn {
-    // width: 144rpx;
-    padding: 0 16rpx;
-    height: 50rpx;
-    border-radius: 40rpx;
-    background: linear-gradient(90deg, var(--ui-BG-Main), var(--ui-BG-Main-gradient));
-    color: #ffffff;
-    font-size: 24rpx;
-    font-weight: 400;
-  }
-  .border-btn {
-    background: linear-gradient(90deg, var(--ui-BG-Main-opacity-4), var(--ui-BG-Main-light));
-    color: #fff !important;
-  }
-  .disabled-btn {
-    background: #cccccc;
-    background-color: #cccccc !important;
-    color: #fff !important;
-  }
-</style>
+	.card-btn {
+		// width: 144rpx;
+		padding: 0 16rpx;
+		height: 50rpx;
+		border-radius: 40rpx;
+		background: linear-gradient(90deg, var(--ui-BG-Main), var(--ui-BG-Main-gradient));
+		color: #ffffff;
+		font-size: 24rpx;
+		font-weight: 400;
+	}
+
+	.border-btn {
+		background: linear-gradient(90deg, var(--ui-BG-Main-opacity-4), var(--ui-BG-Main-light));
+		color: #fff !important;
+	}
+
+	.disabled-btn {
+		background: #cccccc;
+		background-color: #cccccc !important;
+		color: #fff !important;
+	}
+</style>

+ 201 - 149
pages/goods/comment/add.vue

@@ -1,157 +1,209 @@
 <!-- 评价  -->
 <template>
-  <s-layout title="评价">
-    <view>
-      <view v-for="(item, index) in state.orderInfo.items" :key="item.id">
-        <view v-if="item.btns.includes('comment')">
-          <view class="commont-from-wrap">
-            <!-- 评价商品 -->
-            <s-goods-item
-              :img="item.goods_image"
-              :title="item.goods_title"
-              :skuText="item.goods_sku_text"
-              :price="item.goods_price"
-              :num="item.goods_num"
-            ></s-goods-item>
-          </view>
-
-          <view class="form-item">
-            <!-- 评分 -->
-            <view class="star-box ss-flex ss-col-center">
-              <view class="star-title ss-m-r-40">
-                {{ rateMap[state.commentList[index].level] }}
-              </view>
-              <uni-rate v-model="state.commentList[index].level" />
-            </view>
-            <!-- 评价 -->
-            <view class="area-box">
-              <uni-easyinput
-                :inputBorder="false"
-                type="textarea"
-                maxlength="120"
-                autoHeight
-                v-model="state.commentList[index].content"
-                placeholder="宝贝满足你的期待吗?说说你的使用心得,分享给想买的他们吧~"
-              ></uni-easyinput>
-
-              <view class="img-box">
-                <s-uploader
-                  v-model:url="state.commentList[index].images"
-                  fileMediatype="image"
-                  limit="9"
-                  mode="grid"
-                  :imageStyles="{ width: '168rpx', height: '168rpx' }"
-                />
-              </view>
-            </view>
-          </view>
-        </view>
-      </view>
-    </view>
-
-    <su-fixed bottom placeholder>
-      <view class="foot_box ss-flex ss-row-center ss-col-center">
-        <button class="ss-reset-button post-btn ui-BG-Main-Gradient ui-Shadow-Main" @tap="onSubmit">
-          发布
-        </button>
-      </view>
-    </su-fixed>
-  </s-layout>
+	<s-layout title="评价">
+		<view>
+			<view v-for="(item, index) in state.orderInfo.items" :key="item.id">
+				<view v-if="item.btns.includes('comment')">
+					<view class="commont-from-wrap">
+						<!-- 评价商品 -->
+						<s-goods-item :img="item.goods_image" :title="item.goods_title" :skuText="item.goods_sku_text"
+							:price="item.goods_price" :num="item.goods_num"></s-goods-item>
+					</view>
+
+					<view class="form-item">
+						<!-- 评分 -->
+						<view class="star-box ss-flex ss-col-center">
+							<view class="star-title ss-m-r-40">
+								<!-- {{ rateMap[state.commentList[index].level] }} -->
+								商品质量
+							</view>
+							<uni-rate v-model="state.commentList[index].level" />
+						</view>
+						<view class="star-box ss-flex ss-col-center">
+							<view class="star-title ss-m-r-40">
+								<!-- {{ rateMap[state.commentList[index].level] }} -->
+								服务态度
+							</view>
+							<uni-rate v-model="state.commentList[index].level2" />
+						</view>
+						<!-- 评价 -->
+						<view class="area-box">
+							<uni-easyinput :inputBorder="false" type="textarea" maxlength="120" autoHeight
+								v-model="state.commentList[index].content"
+								placeholder="宝贝满足你的期待吗?说说你的使用心得,分享给想买的他们吧~"></uni-easyinput>
+
+							<view class="img-box">
+								<s-uploader v-model:url="state.commentList[index].images" fileMediatype="image"
+									limit="9" mode="grid" :imageStyles="{ width: '168rpx', height: '168rpx' }" />
+							</view>
+						</view>
+					</view>
+				</view>
+			</view>
+		</view>
+
+		<su-fixed bottom placeholder>
+			<view class="foot_box ss-flex ss-row-center ss-col-center">
+				<button class="ss-reset-button post-btn ui-BG-Main-Gradient ui-Shadow-Main" @tap="onSubmit">
+					发布
+				</button>
+			</view>
+		</su-fixed>
+	</s-layout>
 </template>
 
 <script setup>
-  import sheep from '@/sheep';
-  import { onLoad } from '@dcloudio/uni-app';
-  import { computed, reactive } from 'vue';
-
-  const state = reactive({
-    orderInfo: {},
-    commentList: [],
-  });
-
-  const rateMap = {
-    1: '糟糕',
-    2: '差评',
-    3: '一般',
-    4: '良好',
-    5: '好评',
-  };
-
-  async function onSubmit() {
-    const { error } = await sheep.$api.order.comment(state.orderInfo.id, {
-      comments: state.commentList,
-    });
-    if (error === 0) {
-      sheep.$router.back();
-    }
-  }
-
-  onLoad(async (options) => {
-    let id = '';
-    if (options.orderSN) {
-      id = options.orderSN;
-    }
-    if (options.id) {
-      id = options.id;
-    }
-
-    const { data, error } = await sheep.$api.order.detail(id);
-    if (error === 0) {
-      if (data.btns.includes('comment')) {
-        state.orderInfo = data;
-        state.orderInfo.items.forEach((item) => {
-          if (item.btns.includes('comment')) {
-            state.commentList.push({
-              item_id: item.id,
-              level: 5,
-              content: '',
-              images: [],
-            });
-          }
-        });
-        return;
-      }
-    }
-    sheep.$helper.toast('无待评价订单');
-  });
+	import sheep from '@/sheep';
+	import {
+		onLoad
+	} from '@dcloudio/uni-app';
+	import {
+		computed,
+		reactive
+	} from 'vue';
+
+	const state = reactive({
+		orderInfo: {},
+		commentList: [],
+		orderId: null
+	});
+
+	const rateMap = {
+		1: '糟糕',
+		2: '差评',
+		3: '一般',
+		4: '良好',
+		5: '好评',
+	};
+
+	async function onSubmit() {
+		// 对接商品评价
+		// console.log(state.orderInfo);
+		// return;
+		let obj = {
+			anonymous: false,
+			benefitScores: state.commentList[0].level2,
+			content: state.commentList[0].content,
+			descriptionScores: state.commentList[0].level,
+			orderItemId: state.commentList[0].item_id,
+			picUrls: 'https://t7.baidu.com/it/u=2531125946,3055766435&fm=193&f=GIF'
+		}
+		const {
+			code
+		} = await sheep.$api.order.comment(obj);
+		if (code === 0) {
+			sheep.$router.back();
+		}
+	}
+
+	onLoad(async (options) => {
+		let id = '';
+		if (options.orderSN) {
+			id = options.orderSN;
+		}
+		if (options.id) {
+			id = options.id;
+		}
+		if (options.orderId) {
+			state.orderId = options.orderId
+		}
+
+		const res = await sheep.$api.order.detail(id);
+		if (res.code === 0) {
+			let obj = {
+				10: ['待发货', '等待买家付款', ["apply_refund"]],
+				30: ['待评价', '等待买家评价', ["express", "comment"]]
+			}
+
+			res.data.status_text = obj[res.data.status][0];
+			res.data.status_desc = obj[res.data.status][1];
+			res.data.btns = obj[res.data.status][2];
+			res.data.address = {
+				province_name: res.data.receiverAreaName.split(' ')[0],
+				district_name: res.data.receiverAreaName.split(' ')[2],
+				city_name: res.data.receiverAreaName.split(' ')[1],
+				address: res.data.receiverDetailAddress,
+				consignee: res.data.receiverName,
+				mobile: res.data.receiverMobile,
+			}
+			res.data.pay_fee = res.data.payPrice / 100
+			res.data.create_time = sheep.$helper.timeFormat(res.data.createTime, 'yyyy-mm-dd hh:MM:ss')
+			res.data.order_sn = res.data.no
+			res.data.id = res.data.id
+			res.data.goods_amount = res.data.totalPrice / 100
+			res.data.dispatch_amount = res.data.deliveryPrice / 100
+			res.data.pay_types_text = res.data.payChannelName.split(',')
+			res.data.items = res.data.items.map(ite => {
+				return {
+					...ite,
+					btns: obj[res.data.status][2],
+					goods_title: ite.spuName,
+					goods_num: ite.count,
+					goods_price: ite.price / 100,
+					goods_image: ite.picUrl,
+					goods_sku_text: ite.properties.reduce((it0, it1) => it0 + it1.valueName + ' ', '')
+				}
+			})
+			if (res.data.btns.includes('comment')) {
+				state.orderInfo = res.data;
+				state.orderInfo.items.forEach((item) => {
+					if (item.btns.includes('comment')) {
+						state.commentList.push({
+							item_id: item.id,
+							level: 5,
+							content: '',
+							images: [],
+						});
+					}
+				});
+				console.log(state.orderInfo.items, '循环')
+				return;
+			}
+		}
+		sheep.$helper.toast('无待评价订单');
+	});
 </script>
 
 <style lang="scss" scoped>
-  // 评价商品
-  .goods-card {
-    margin: 10rpx 0;
-    padding: 20rpx;
-    background: #fff;
-  }
-
-  // 评论,选择图片
-  .form-item {
-    background: #fff;
-    .star-box {
-      height: 100rpx;
-      padding: 0 25rpx;
-    }
-    .star-title {
-      font-weight: 600;
-    }
-  }
-  .area-box {
-    width: 690rpx;
-    min-height: 306rpx;
-    background: rgba(249, 250, 251, 1);
-    border-radius: 20rpx;
-    padding: 28rpx;
-    margin: auto;
-
-    .img-box {
-      margin-top: 20rpx;
-    }
-  }
-  .post-btn {
-    width: 690rpx;
-    line-height: 80rpx;
-    border-radius: 40rpx;
-    color: rgba(#fff, 0.9);
-    margin-bottom: 20rpx;
-  }
-</style>
+	// 评价商品
+	.goods-card {
+		margin: 10rpx 0;
+		padding: 20rpx;
+		background: #fff;
+	}
+
+	// 评论,选择图片
+	.form-item {
+		background: #fff;
+
+		.star-box {
+			height: 100rpx;
+			padding: 0 25rpx;
+		}
+
+		.star-title {
+			font-weight: 600;
+		}
+	}
+
+	.area-box {
+		width: 690rpx;
+		min-height: 306rpx;
+		background: rgba(249, 250, 251, 1);
+		border-radius: 20rpx;
+		padding: 28rpx;
+		margin: auto;
+
+		.img-box {
+			margin-top: 20rpx;
+		}
+	}
+
+	.post-btn {
+		width: 690rpx;
+		line-height: 80rpx;
+		border-radius: 40rpx;
+		color: rgba(#fff, 0.9);
+		margin-bottom: 20rpx;
+	}
+</style>

+ 393 - 410
pages/goods/index.vue

@@ -1,417 +1,400 @@
 <template>
-  <view>
-    <s-layout :onShareAppMessage="shareInfo" navbar="goods">
-      <!-- 标题栏 -->
-      <detailNavbar />
-
-      <!-- 骨架屏 -->
-      <detailSkeleton v-if="state.skeletonLoading" />
-      <!-- 下架/售罄提醒 -->
-      <s-empty
-        v-else-if="state.goodsInfo === null"
-        text="商品不存在或已下架"
-        icon="/static/soldout-empty.png"
-        showAction
-        actionText="再逛逛"
-        actionUrl="/pages/goods/list"
-      />
-      <block v-else>
-        <view class="detail-swiper-selector">
-          <!-- 商品轮播图  -->
-          <su-swiper
-            class="ss-m-b-14"
-            isPreview
-            :list="state.goodsSwiper"
-            dotStyle="tag"
-            imageMode="widthFix"
-            dotCur="bg-mask-40"
-            :seizeHeight="750"
-          />
-
-          <!-- 价格+标题 -->
-          <view class="title-card detail-card ss-p-y-40 ss-p-x-20">
-            <view class="ss-flex ss-row-between ss-col-center ss-m-b-26">
-              <view class="price-box ss-flex ss-col-bottom">
-                <view class="price-text ss-m-r-16">
-                  {{ state.selectedSkuPrice.price || formatPrice(state.goodsInfo.price) }}
-                </view>
-                <view class="origin-price-text" v-if="state.goodsInfo.original_price > 0">
-                  {{ state.selectedSkuPrice.original_price || state.goodsInfo.original_price }}
-                </view>
-              </view>
-              <view class="sales-text">
-                {{ formatSales(state.goodsInfo.sales_show_type, state.goodsInfo.sales) }}
-              </view>
-            </view>
-            <view class="discounts-box ss-flex ss-row-between ss-m-b-28">
-              <div class="tag-content">
-                <view class="tag-box ss-flex">
-                  <view
-                    class="tag ss-m-r-10"
-                    v-for="promos in state.goodsInfo.promos"
-                    :key="promos.id"
-                    @tap="onActivity"
-                  >
-                    {{ promos.title }}
-                  </view>
-                </view>
-              </div>
-
-              <view
-                class="get-coupon-box ss-flex ss-col-center ss-m-l-20"
-                @tap="state.showModel = true"
-                v-if="state.couponInfo.length"
-              >
-                <view class="discounts-title ss-m-r-8">领券</view>
-                <text class="cicon-forward"></text>
-              </view>
-            </view>
-            <view class="title-text ss-line-2 ss-m-b-6">{{ state.goodsInfo.title }}</view>
-            <view class="subtitle-text ss-line-1">{{ state.goodsInfo.subtitle }}</view>
-          </view>
-
-          <!-- 功能卡片 -->
-          <view class="detail-cell-card detail-card ss-flex-col">
-            <detail-cell-sku
-              v-model="state.selectedSkuPrice.goods_sku_text"
-              :skus="state.goodsInfo.skus"
-              @tap="state.showSelectSku = true"
-            />
-            <detail-cell-service v-if="state.goodsInfo.service" v-model="state.goodsInfo.service" />
-            <detail-cell-params v-if="state.goodsInfo.params" v-model="state.goodsInfo.params" />
-          </view>
-
-          <!-- 规格与数量弹框 -->
-          <s-select-sku
-            :goodsInfo="state.goodsInfo"
-            :show="state.showSelectSku"
-            @addCart="onAddCart"
-            @buy="onBuy"
-            @change="onSkuChange"
-            @close="state.showSelectSku = false"
-          />
-        </view>
-
-        <!-- 评价 -->
-        <detail-comment-card class="detail-comment-selector" :goodsId="state.goodsId" />
-        <!-- 详情 -->
-        <detail-content-card class="detail-content-selector" :content="state.goodsInfo.description" />
-
-        <!-- 活动跳转 -->
-        <detail-activity-tip
-          v-if="state.goodsInfo.activities"
-          :data="state.goodsInfo"
-        ></detail-activity-tip>
-
-        <!-- 详情tabbar -->
-        <detail-tabbar v-model="state.goodsInfo">
-          <!-- TODO: 缺货中 已售罄 判断 设计-->
-          <view class="buy-box ss-flex ss-col-center ss-p-r-20" v-if="state.goodsInfo.stock > 0">
-            <button
-              class="ss-reset-button add-btn ui-Shadow-Main"
-              @tap="state.showSelectSku = true"
-            >
-              加入购物车
-            </button>
-            <button
-              class="ss-reset-button buy-btn ui-Shadow-Main"
-              @tap="state.showSelectSku = true"
-            >
-              立即购买
-            </button>
-          </view>
-          <view class="buy-box ss-flex ss-col-center ss-p-r-20" v-else>
-            <button class="ss-reset-button disabled-btn" disabled> 已售罄 </button>
-          </view>
-        </detail-tabbar>
-        <s-coupon-get
-          v-model="state.couponInfo"
-          :show="state.showModel"
-          @close="state.showModel = false"
-          @get="onGet"
-        />
-        <s-activity-pop
-          v-model="state.activityInfo"
-          :show="state.showActivityModel"
-          @close="state.showActivityModel = false"
-        />
-      </block>
-    </s-layout>
-  </view>
+	<view>
+		<s-layout :onShareAppMessage="shareInfo" navbar="goods">
+			<!-- 标题栏 -->
+			<detailNavbar />
+
+			<!-- 骨架屏 -->
+			<detailSkeleton v-if="state.skeletonLoading" />
+			<!-- 下架/售罄提醒 -->
+			<s-empty v-else-if="state.goodsInfo === null" text="商品不存在或已下架" icon="/static/soldout-empty.png" showAction
+				actionText="再逛逛" actionUrl="/pages/goods/list" />
+			<block v-else>
+				<view class="detail-swiper-selector">
+					<!-- 商品轮播图  -->
+					<su-swiper class="ss-m-b-14" isPreview :list="state.goodsSwiper" dotStyle="tag" imageMode="widthFix"
+						dotCur="bg-mask-40" :seizeHeight="750" />
+
+					<!-- 价格+标题 -->
+					<view class="title-card detail-card ss-p-y-40 ss-p-x-20">
+						<view class="ss-flex ss-row-between ss-col-center ss-m-b-26">
+							<view class="price-box ss-flex ss-col-bottom">
+								<view class="price-text ss-m-r-16">
+									{{ state.selectedSkuPrice.price || formatPrice(state.goodsInfo.price) }}
+								</view>
+								<view class="origin-price-text" v-if="state.goodsInfo.original_price > 0">
+									{{ state.selectedSkuPrice.original_price || state.goodsInfo.original_price }}
+								</view>
+							</view>
+							<view class="sales-text">
+								{{ formatSales(state.goodsInfo.sales_show_type, state.goodsInfo.sales) }}
+							</view>
+						</view>
+						<view class="discounts-box ss-flex ss-row-between ss-m-b-28">
+							<div class="tag-content">
+								<view class="tag-box ss-flex">
+									<view class="tag ss-m-r-10" v-for="promos in state.goodsInfo.promos"
+										:key="promos.id" @tap="onActivity">
+										{{ promos.title }}
+									</view>
+								</view>
+							</div>
+
+							<view class="get-coupon-box ss-flex ss-col-center ss-m-l-20" @tap="state.showModel = true"
+								v-if="state.couponInfo.length">
+								<view class="discounts-title ss-m-r-8">领券</view>
+								<text class="cicon-forward"></text>
+							</view>
+						</view>
+						<view class="title-text ss-line-2 ss-m-b-6">{{ state.goodsInfo.title }}</view>
+						<view class="subtitle-text ss-line-1">{{ state.goodsInfo.subtitle }}</view>
+					</view>
+
+					<!-- 功能卡片 -->
+					<view class="detail-cell-card detail-card ss-flex-col">
+						<detail-cell-sku v-model="state.selectedSkuPrice.goods_sku_text" :skus="state.goodsInfo.skus"
+							@tap="state.showSelectSku = true" />
+						<detail-cell-service v-if="state.goodsInfo.service" v-model="state.goodsInfo.service" />
+						<detail-cell-params v-if="state.goodsInfo.params" v-model="state.goodsInfo.params" />
+					</view>
+
+					<!-- 规格与数量弹框 -->
+					<s-select-sku :goodsInfo="state.goodsInfo" :show="state.showSelectSku" @addCart="onAddCart"
+						@buy="onBuy" @change="onSkuChange" @close="state.showSelectSku = false" />
+				</view>
+
+				<!-- 评价 -->
+				<detail-comment-card class="detail-comment-selector" :goodsId="state.goodsId" />
+				<!-- 详情 -->
+				<detail-content-card class="detail-content-selector" :content="state.goodsInfo.description" />
+
+				<!-- 活动跳转 -->
+				<detail-activity-tip v-if="state.goodsInfo.activities" :data="state.goodsInfo"></detail-activity-tip>
+
+				<!-- 详情tabbar -->
+				<detail-tabbar v-model="state.goodsInfo">
+					<!-- TODO: 缺货中 已售罄 判断 设计-->
+					<view class="buy-box ss-flex ss-col-center ss-p-r-20" v-if="state.goodsInfo.stock > 0">
+						<button class="ss-reset-button add-btn ui-Shadow-Main" @tap="state.showSelectSku = true">
+							加入购物车
+						</button>
+						<button class="ss-reset-button buy-btn ui-Shadow-Main" @tap="state.showSelectSku = true">
+							立即购买
+						</button>
+					</view>
+					<view class="buy-box ss-flex ss-col-center ss-p-r-20" v-else>
+						<button class="ss-reset-button disabled-btn" disabled> 已售罄 </button>
+					</view>
+				</detail-tabbar>
+				<s-coupon-get v-model="state.couponInfo" :show="state.showModel" @close="state.showModel = false"
+					@get="onGet" />
+				<s-activity-pop v-model="state.activityInfo" :show="state.showActivityModel"
+					@close="state.showActivityModel = false" />
+			</block>
+		</s-layout>
+	</view>
 </template>
 
 <script setup>
-  import { reactive, computed } from 'vue';
-  import { onLoad, onPageScroll } from '@dcloudio/uni-app';
-  import sheep from '@/sheep';
-  import { formatSales, formatGoodsSwiper, formatPrice } from '@/sheep/hooks/useGoods';
-  import detailNavbar from './components/detail/detail-navbar.vue';
-  import detailCellSku from './components/detail/detail-cell-sku.vue';
-  import detailCellService from './components/detail/detail-cell-service.vue';
-  import detailCellParams from './components/detail/detail-cell-params.vue';
-  import detailTabbar from './components/detail/detail-tabbar.vue';
-  import detailSkeleton from './components/detail/detail-skeleton.vue';
-  import detailCommentCard from './components/detail/detail-comment-card.vue';
-  import detailContentCard from './components/detail/detail-content-card.vue';
-  import detailActivityTip from './components/detail/detail-activity-tip.vue';
-  import { isEmpty } from 'lodash';
-
-  // import detailActivityTip from './components/detail/detail-activity-tip.vue';
-  // import detailTab from './components/detail/detail-tab.vue';
-  // import detailCoupon from './components/detail/detail-coupon.vue';
-  onPageScroll(() => {});
-
-  const state = reactive({
-    goodsId: 0,
-    skeletonLoading: true,
-    goodsInfo: {},
-    showSelectSku: false,
-    goodsSwiper: [],
-    selectedSkuPrice: {},
-    showModel: false,
-    total: 0,
-    couponInfo: [],
-    showActivityModel: false,
-    activityInfo: [],
-  });
-
-  // 规格变更
-  function onSkuChange(e) {
-    state.selectedSkuPrice = e;
-  }
-
-  // 添加购物车
-  function onAddCart(e) {
-    sheep.$store('cart').add(e);
-  }
-
-  // 立即购买
-  function onBuy(e) {
-    sheep.$router.go('/pages/order/confirm', {
-      data: JSON.stringify({
-        order_type: 'goods',
-        goods_list: [
-          {
-            goods_id: e.goods_id,
-            goods_num: e.goods_num,
-            goods_sku_price_id: e.id,
-          },
-        ],
-      }),
-    });
-  }
-  //营销活动
-  function onActivity() {
-    state.activityInfo = state.goodsInfo.promos;
-    state.showActivityModel = true;
-  }
-
-  //立即领取
-  async function onGet(id) {
-    const { error, msg } = await sheep.$api.coupon.get(id);
-    if (error === 0) {
-      uni.showToast({
-        title: msg,
-      });
-      setTimeout(() => {
-        getCoupon();
-      }, 1000);
-    }
-  }
-
-  const shareInfo = computed(() => {
-    if (isEmpty(state.goodsInfo)) return {};
-    return sheep.$platform.share.getShareInfo(
-      {
-        title: state.goodsInfo.title,
-        image: sheep.$url.cdn(state.goodsInfo.image),
-        desc: state.goodsInfo.subtitle,
-        params: {
-          page: '2',
-          query: state.goodsInfo.id,
-        },
-      },
-      {
-        type: 'goods', // 商品海报
-        title: state.goodsInfo.title, // 商品标题
-        image: sheep.$url.cdn(state.goodsInfo.image), // 商品主图
-        price: state.goodsInfo.price[0], // 商品价格
-        original_price: state.goodsInfo.original_price, // 商品原价
-      },
-    );
-  });
-
-  onLoad(async (options) => {
-	  console.log('页面被访问')
-    // 非法参数
-    if (!options.id) {
-      state.goodsInfo = null;
-      return;
-    }
-    state.goodsId = options.id;
-    // 加载商品信息
-    sheep.$api.goods.detail(state.goodsId).then((res) => {
-		console.log(res)
-      state.skeletonLoading = false;
-      if (res.code === 0) {
-		  // 在此处对数据做出转换
-		res.data.sales=res.data.salesCount
-		res.data.original_price=res.data.marketPrice/100
-		res.data.subtitle=res.data.introduction
-		res.data.title=res.data.name
-		res.data.price=[res.data.price/100]
-        state.goodsInfo = res.data;
-        state.goodsSwiper = formatGoodsSwiper(state.goodsInfo.sliderPicUrls);
-      } else {
-        // 未找到商品
-        state.goodsInfo = null;
-      }
-    });
-    const { error, data } = await sheep.$api.coupon.listByGoods(state.goodsId);
-    if (error === 0) {
-      state.couponInfo = data;
-    }
-  });
+	import {
+		reactive,
+		computed
+	} from 'vue';
+	import {
+		onLoad,
+		onPageScroll
+	} from '@dcloudio/uni-app';
+	import sheep from '@/sheep';
+	import {
+		formatSales,
+		formatGoodsSwiper,
+		formatPrice
+	} from '@/sheep/hooks/useGoods';
+	import detailNavbar from './components/detail/detail-navbar.vue';
+	import detailCellSku from './components/detail/detail-cell-sku.vue';
+	import detailCellService from './components/detail/detail-cell-service.vue';
+	import detailCellParams from './components/detail/detail-cell-params.vue';
+	import detailTabbar from './components/detail/detail-tabbar.vue';
+	import detailSkeleton from './components/detail/detail-skeleton.vue';
+	import detailCommentCard from './components/detail/detail-comment-card.vue';
+	import detailContentCard from './components/detail/detail-content-card.vue';
+	import detailActivityTip from './components/detail/detail-activity-tip.vue';
+	import {
+		isEmpty
+	} from 'lodash';
+
+	// import detailActivityTip from './components/detail/detail-activity-tip.vue';
+	// import detailTab from './components/detail/detail-tab.vue';
+	// import detailCoupon from './components/detail/detail-coupon.vue';
+	onPageScroll(() => {});
+
+	const state = reactive({
+		goodsId: 0,
+		skeletonLoading: true,
+		goodsInfo: {},
+		showSelectSku: false,
+		goodsSwiper: [],
+		selectedSkuPrice: {},
+		showModel: false,
+		total: 0,
+		couponInfo: [],
+		showActivityModel: false,
+		activityInfo: [],
+	});
+
+	// 规格变更
+	function onSkuChange(e) {
+		state.selectedSkuPrice = e;
+	}
+
+	// 添加购物车
+	function onAddCart(e) {
+		sheep.$store('cart').add(e);
+	}
+
+	// 立即购买
+	function onBuy(e) {
+		sheep.$router.go('/pages/order/confirm', {
+			data: JSON.stringify({
+				order_type: 'goods',
+				goods_list: [{
+					goods_id: e.goods_id,
+					goods_num: e.goods_num,
+					goods_sku_price_id: e.id,
+				}, ],
+			}),
+		});
+	}
+	//营销活动
+	function onActivity() {
+		state.activityInfo = state.goodsInfo.promos;
+		state.showActivityModel = true;
+	}
+
+	//立即领取
+	async function onGet(id) {
+		const {
+			error,
+			msg
+		} = await sheep.$api.coupon.get(id);
+		if (error === 0) {
+			uni.showToast({
+				title: msg,
+			});
+			setTimeout(() => {
+				getCoupon();
+			}, 1000);
+		}
+	}
+
+	const shareInfo = computed(() => {
+		if (isEmpty(state.goodsInfo)) return {};
+		return sheep.$platform.share.getShareInfo({
+			title: state.goodsInfo.title,
+			image: sheep.$url.cdn(state.goodsInfo.image),
+			desc: state.goodsInfo.subtitle,
+			params: {
+				page: '2',
+				query: state.goodsInfo.id,
+			},
+		}, {
+			type: 'goods', // 商品海报
+			title: state.goodsInfo.title, // 商品标题
+			image: sheep.$url.cdn(state.goodsInfo.image), // 商品主图
+			price: state.goodsInfo.price[0], // 商品价格
+			original_price: state.goodsInfo.original_price, // 商品原价
+		}, );
+	});
+
+	onLoad(async (options) => {
+		console.log('页面被访问')
+		// 非法参数
+		if (!options.id) {
+			state.goodsInfo = null;
+			return;
+		}
+		state.goodsId = options.id;
+		// 加载商品信息
+		sheep.$api.goods.detail(state.goodsId).then((res) => {
+			// 处理数据适配
+			// let arr = [];
+			// res.skus = res.data.skus.map(item => {
+			// 	arr = [...arr, ...item.properties];
+			// 	item.children = item.properties;
+			// 	item.goods_id = res.data.id;
+			// 	item.name = item.children[0].propertyName;
+			// 	return item;
+			// })
+			// console.log(arr, '合并');
+			// console.log(res.data, '替换后订单数据');
+			state.skeletonLoading = false;
+			if (res.code === 0) {
+				// 在此处对数据做出转换
+				res.data.sales = res.data.salesCount
+				res.data.original_price = res.data.marketPrice / 100
+				res.data.subtitle = res.data.introduction
+				res.data.title = res.data.name
+				res.data.price = [res.data.price / 100]
+				state.goodsInfo = res.data;
+				state.goodsSwiper = formatGoodsSwiper(state.goodsInfo.sliderPicUrls);
+			} else {
+				// 未找到商品
+				state.goodsInfo = null;
+			}
+		});
+		const {
+			error,
+			data
+		} = await sheep.$api.coupon.listByGoods(state.goodsId);
+		if (error === 0) {
+			state.couponInfo = data;
+		}
+	});
 </script>
 
 <style lang="scss" scoped>
-  .detail-card {
-    background-color: #ffff;
-    margin: 14rpx 20rpx;
-    border-radius: 10rpx;
-    overflow: hidden;
-  }
-
-  // 价格标题卡片
-  .title-card {
-    .price-box {
-      .price-text {
-        font-size: 42rpx;
-        font-weight: 500;
-        color: #ff3000;
-        line-height: 30rpx;
-        font-family: OPPOSANS;
-
-        &::before {
-          content: '¥';
-          font-size: 30rpx;
-        }
-      }
-
-      .origin-price-text {
-        font-size: 26rpx;
-        font-weight: 400;
-        text-decoration: line-through;
-        color: $gray-c;
-        font-family: OPPOSANS;
-
-        &::before {
-          content: '¥';
-        }
-      }
-    }
-
-    .sales-text {
-      font-size: 26rpx;
-      font-weight: 500;
-      color: $gray-c;
-    }
-
-    .discounts-box {
-      .tag-content {
-        flex: 1;
-        min-width: 0;
-        white-space: nowrap;
-      }
-      .tag-box {
-        overflow: hidden;
-        text-overflow: ellipsis;
-      }
-      .tag {
-        flex-shrink: 0;
-        padding: 4rpx 10rpx;
-        font-size: 24rpx;
-        font-weight: 500;
-        border-radius: 4rpx;
-        color: var(--ui-BG-Main);
-        background: var(--ui-BG-Main-tag);
-      }
-
-      .discounts-title {
-        font-size: 24rpx;
-        font-weight: 500;
-        color: var(--ui-BG-Main);
-        line-height: normal;
-      }
-
-      .cicon-forward {
-        color: var(--ui-BG-Main);
-        font-size: 24rpx;
-        line-height: normal;
-        margin-top: 4rpx;
-      }
-    }
-
-    .title-text {
-      font-size: 30rpx;
-      font-weight: bold;
-      line-height: 42rpx;
-    }
-
-    .subtitle-text {
-      font-size: 26rpx;
-      font-weight: 400;
-      color: $dark-9;
-      line-height: 42rpx;
-    }
-  }
-
-  // 购买
-  .buy-box {
-    .add-btn {
-      width: 214rpx;
-      height: 72rpx;
-      font-weight: 500;
-      font-size: 28rpx;
-      border-radius: 40rpx 0 0 40rpx;
-      background-color: var(--ui-BG-Main-light);
-      color: var(--ui-BG-Main);
-    }
-
-    .buy-btn {
-      width: 214rpx;
-      height: 72rpx;
-      font-weight: 500;
-      font-size: 28rpx;
-
-      border-radius: 0 40rpx 40rpx 0;
-      background: linear-gradient(90deg, var(--ui-BG-Main), var(--ui-BG-Main-gradient));
-      color: $white;
-    }
-    .disabled-btn {
-      width: 428rpx;
-      height: 72rpx;
-      border-radius: 40rpx;
-      background: #999999;
-      color: $white;
-    }
-  }
-
-  .model-box {
-    height: 60vh;
-    .model-content {
-      height: 56vh;
-    }
-    .title {
-      font-size: 36rpx;
-      font-weight: bold;
-      color: #333333;
-    }
-
-    .subtitle {
-      font-size: 26rpx;
-      font-weight: 500;
-      color: #333333;
-    }
-  }
-</style>
+	.detail-card {
+		background-color: #ffff;
+		margin: 14rpx 20rpx;
+		border-radius: 10rpx;
+		overflow: hidden;
+	}
+
+	// 价格标题卡片
+	.title-card {
+		.price-box {
+			.price-text {
+				font-size: 42rpx;
+				font-weight: 500;
+				color: #ff3000;
+				line-height: 30rpx;
+				font-family: OPPOSANS;
+
+				&::before {
+					content: '¥';
+					font-size: 30rpx;
+				}
+			}
+
+			.origin-price-text {
+				font-size: 26rpx;
+				font-weight: 400;
+				text-decoration: line-through;
+				color: $gray-c;
+				font-family: OPPOSANS;
+
+				&::before {
+					content: '¥';
+				}
+			}
+		}
+
+		.sales-text {
+			font-size: 26rpx;
+			font-weight: 500;
+			color: $gray-c;
+		}
+
+		.discounts-box {
+			.tag-content {
+				flex: 1;
+				min-width: 0;
+				white-space: nowrap;
+			}
+
+			.tag-box {
+				overflow: hidden;
+				text-overflow: ellipsis;
+			}
+
+			.tag {
+				flex-shrink: 0;
+				padding: 4rpx 10rpx;
+				font-size: 24rpx;
+				font-weight: 500;
+				border-radius: 4rpx;
+				color: var(--ui-BG-Main);
+				background: var(--ui-BG-Main-tag);
+			}
+
+			.discounts-title {
+				font-size: 24rpx;
+				font-weight: 500;
+				color: var(--ui-BG-Main);
+				line-height: normal;
+			}
+
+			.cicon-forward {
+				color: var(--ui-BG-Main);
+				font-size: 24rpx;
+				line-height: normal;
+				margin-top: 4rpx;
+			}
+		}
+
+		.title-text {
+			font-size: 30rpx;
+			font-weight: bold;
+			line-height: 42rpx;
+		}
+
+		.subtitle-text {
+			font-size: 26rpx;
+			font-weight: 400;
+			color: $dark-9;
+			line-height: 42rpx;
+		}
+	}
+
+	// 购买
+	.buy-box {
+		.add-btn {
+			width: 214rpx;
+			height: 72rpx;
+			font-weight: 500;
+			font-size: 28rpx;
+			border-radius: 40rpx 0 0 40rpx;
+			background-color: var(--ui-BG-Main-light);
+			color: var(--ui-BG-Main);
+		}
+
+		.buy-btn {
+			width: 214rpx;
+			height: 72rpx;
+			font-weight: 500;
+			font-size: 28rpx;
+
+			border-radius: 0 40rpx 40rpx 0;
+			background: linear-gradient(90deg, var(--ui-BG-Main), var(--ui-BG-Main-gradient));
+			color: $white;
+		}
+
+		.disabled-btn {
+			width: 428rpx;
+			height: 72rpx;
+			border-radius: 40rpx;
+			background: #999999;
+			color: $white;
+		}
+	}
+
+	.model-box {
+		height: 60vh;
+
+		.model-content {
+			height: 56vh;
+		}
+
+		.title {
+			font-size: 36rpx;
+			font-weight: bold;
+			color: #333333;
+		}
+
+		.subtitle {
+			font-size: 26rpx;
+			font-weight: 500;
+			color: #333333;
+		}
+	}
+</style>

+ 183 - 190
pages/index/cart.vue

@@ -1,207 +1,200 @@
 <template>
-  <s-layout title="购物车" tabbar="/pages/index/cart" :bgStyle="{ color: '#fff' }">
-    <s-empty
-      v-if="state.list.length === 0"
-      text="购物车空空如也,快去逛逛吧~"
-      icon="/static/cart-empty.png"
-    />
+	<s-layout title="购物车" tabbar="/pages/index/cart" :bgStyle="{ color: '#fff' }">
+		<s-empty v-if="state.list.length === 0" text="购物车空空如也,快去逛逛吧~" icon="/static/cart-empty.png" />
 
-    <!-- 头部 -->
-    <view class="cart-box ss-flex ss-flex-col ss-row-between" v-if="state.list.length">
-      <view class="cart-header ss-flex ss-col-center ss-row-between ss-p-x-30">
-        <view class="header-left ss-flex ss-col-center ss-font-26">
-          共
-          <text class="goods-number ui-TC-Main ss-flex">{{ state.list.length }}</text>
-          件商品
-        </view>
-        <view class="header-right">
-          <button v-if="state.editMode" class="ss-reset-button" @tap="state.editMode = false">
-            取消
-          </button>
-          <button v-else class="ss-reset-button ui-TC-Main" @tap="state.editMode = true">
-            编辑
-          </button>
-        </view>
-      </view>
-      <!-- 内容 -->
-      <view class="cart-content ss-flex-1 ss-p-x-30 ss-m-b-40">
-        <view class="goods-box ss-r-10 ss-m-b-14" v-for="item in state.list" :key="item.id">
-          <view class="ss-flex ss-col-center">
-            <label class="check-box ss-flex ss-col-center ss-p-l-10" @tap="onSelectSingle(item.id)">
-              <radio
-                :checked="state.selectedIds.includes(item.id)"
-                color="var(--ui-BG-Main)"
-                style="transform: scale(0.8)"
-                @tap.stop="onSelectSingle(item.id)"
-              />
-            </label>
-            <s-goods-item
-              :title="item.spu.name"
-              :img="item.spu.picUrl || item.goods.image"
-              :price="item.sku.price/100"
-              :skuText="item.sku.properties.length>1? item.sku.properties.reduce((items2,items)=>items2.valueName+' '+items.valueName):item.sku.properties[0].valueName"
-              priceColor="#FF3000"
-              :titleWidth="400"
-            >
-              <template v-if="!state.editMode" v-slot:tool>
-                <su-number-box
-                  :min="0"
-                  :max="item.sku.stock"
-                  :step="1"
-                  v-model="item.count"
-                  @change="onNumberChange($event, item)"
-                ></su-number-box>
-              </template>
-            </s-goods-item>
-          </view>
-        </view>
-      </view>
-      <!-- 底部 -->
-      <su-fixed bottom :val="48" placeholder v-if="state.list.length > 0" :isInset="false">
-        <view class="cart-footer ss-flex ss-col-center ss-row-between ss-p-x-30 border-bottom">
-          <view class="footer-left ss-flex ss-col-center">
-            <label class="check-box ss-flex ss-col-center ss-p-r-30" @tap="onSelectAll">
-              <radio
-                :checked="state.isAllSelected"
-                color="var(--ui-BG-Main)"
-                style="transform: scale(0.8)"
-                @tap.stop="onSelectAll"
-              />
-              <view class="ss-m-l-8"> 全选 </view>
-            </label>
-            <text>合计:</text>
-            <view class="text-price price-text">
-              {{ state.totalPriceSelected }}
-            </view>
-          </view>
-          <view class="footer-right">
-            <button
-              v-if="state.editMode"
-              class="ss-reset-button ui-BG-Main-Gradient pay-btn ui-Shadow-Main"
-              @tap="onDelete"
-            >
-              删除
-            </button>
-            <button
-              v-else
-              class="ss-reset-button ui-BG-Main-Gradient pay-btn ui-Shadow-Main"
-              @tap="onConfirm"
-            >
-              去结算
-              {{ state.selectedIds?.length ? `(${state.selectedIds.length})` : '' }}
-            </button>
-          </view>
-        </view>
-      </su-fixed>
-    </view>
-  </s-layout>
+		<!-- 头部 -->
+		<view class="cart-box ss-flex ss-flex-col ss-row-between" v-if="state.list.length">
+			<view class="cart-header ss-flex ss-col-center ss-row-between ss-p-x-30">
+				<view class="header-left ss-flex ss-col-center ss-font-26">
+					共
+					<text class="goods-number ui-TC-Main ss-flex">{{ state.list.length }}</text>
+					件商品
+				</view>
+				<view class="header-right">
+					<button v-if="state.editMode" class="ss-reset-button" @tap="state.editMode = false">
+						取消
+					</button>
+					<button v-else class="ss-reset-button ui-TC-Main" @tap="state.editMode = true">
+						编辑
+					</button>
+				</view>
+			</view>
+			<!-- 内容 -->
+			<view class="cart-content ss-flex-1 ss-p-x-30 ss-m-b-40">
+				<view class="goods-box ss-r-10 ss-m-b-14" v-for="item in state.list" :key="item.id">
+					<view class="ss-flex ss-col-center">
+						<label class="check-box ss-flex ss-col-center ss-p-l-10" @tap="onSelectSingle(item.id)">
+							<radio :checked="state.selectedIds.includes(item.id)" color="var(--ui-BG-Main)"
+								style="transform: scale(0.8)" @tap.stop="onSelectSingle(item.id)" />
+						</label>
+						<s-goods-item :title="item.spu.name" :img="item.spu.picUrl || item.goods.image"
+							:price="item.sku.price/100"
+							:skuText="item.sku.properties.length>1? item.sku.properties.reduce((items2,items)=>items2.valueName+' '+items.valueName):item.sku.properties[0].valueName"
+							priceColor="#FF3000" :titleWidth="400">
+							<template v-if="!state.editMode" v-slot:tool>
+								<su-number-box :min="0" :max="item.sku.stock" :step="1" v-model="item.count"
+									@change="onNumberChange($event, item)"></su-number-box>
+							</template>
+						</s-goods-item>
+					</view>
+				</view>
+			</view>
+			<!-- 底部 -->
+			<su-fixed bottom :val="48" placeholder v-if="state.list.length > 0" :isInset="false">
+				<view class="cart-footer ss-flex ss-col-center ss-row-between ss-p-x-30 border-bottom">
+					<view class="footer-left ss-flex ss-col-center">
+						<label class="check-box ss-flex ss-col-center ss-p-r-30" @tap="onSelectAll">
+							<radio :checked="state.isAllSelected" color="var(--ui-BG-Main)"
+								style="transform: scale(0.8)" @tap.stop="onSelectAll" />
+							<view class="ss-m-l-8"> 全选 </view>
+						</label>
+						<text>合计:</text>
+						<view class="text-price price-text">
+							{{ state.totalPriceSelected }}
+						</view>
+					</view>
+					<view class="footer-right">
+						<button v-if="state.editMode" class="ss-reset-button ui-BG-Main-Gradient pay-btn ui-Shadow-Main"
+							@tap="onDelete">
+							删除
+						</button>
+						<button v-else class="ss-reset-button ui-BG-Main-Gradient pay-btn ui-Shadow-Main"
+							@tap="onConfirm">
+							去结算
+							{{ state.selectedIds?.length ? `(${state.selectedIds.length})` : '' }}
+						</button>
+					</view>
+				</view>
+			</su-fixed>
+		</view>
+	</s-layout>
 </template>
 
 <script setup>
-  import sheep from '@/sheep';
-  import { computed, reactive, unref } from 'vue';
+	import sheep from '@/sheep';
+	import {
+		computed,
+		reactive,
+		unref
+	} from 'vue';
 
-  const sys_navBar = sheep.$platform.navbar;
-  const cart = sheep.$store('cart');
+	const sys_navBar = sheep.$platform.navbar;
+	const cart = sheep.$store('cart');
 
-  const state = reactive({
-    editMode: false,
-    list: computed(() => cart.list),
-    selectedList: [],
-    selectedIds: computed(() => cart.selectedIds),
-    isAllSelected: computed(() => cart.isAllSelected),
-    totalPriceSelected: computed(() => cart.totalPriceSelected),
-  });
-  // 单选选中
-  function onSelectSingle(id) {
-	  console.log('单选')
-    cart.selectSingle(id);
-  }
-  // 全选
-  function onSelectAll() {
-    cart.selectAll(!state.isAllSelected);
-  }
+	const state = reactive({
+		editMode: false,
+		list: computed(() => cart.list),
+		selectedList: [],
+		selectedIds: computed(() => cart.selectedIds),
+		isAllSelected: computed(() => cart.isAllSelected),
+		totalPriceSelected: computed(() => cart.totalPriceSelected),
+	});
+	// 单选选中
+	function onSelectSingle(id) {
+		console.log('单选')
+		cart.selectSingle(id);
+	}
+	// 全选
+	function onSelectAll() {
+		cart.selectAll(!state.isAllSelected);
+	}
 
-  // 结算
-  function onConfirm() {
-    let goods_list = [];
-    state.selectedList = state.list.filter((item) => state.selectedIds.includes(item.id));
-    state.selectedList.map((item) => {
-      goods_list.push({
-        goods_id: item.goods_id,
-        goods_num: item.goods_num,
-        goods_sku_price_id: item.goods_sku_price_id,
-      });
-    });
-    if (goods_list.length === 0) {
-      sheep.$helper.toast('请选择商品');
-      return;
-    }
-    sheep.$router.go('/pages/order/confirm', {
-      data: JSON.stringify({
-        order_type: 'goods',
-        goods_list,
-        from: 'cart',
-      }),
-    });
-  }
+	// 结算
+	function onConfirm() {
+		let items = []
+		let goods_list = [];
+		state.selectedList = state.list.filter((item) => state.selectedIds.includes(item.id));
+		state.selectedList.map((item) => {
+			console.log(item, '便利');
+			// 此处前端做出修改
+			items.push({
+				skuId: item.sku.id,
+				count: item.count,
+				cartId: item.id,
+			})
+			goods_list.push({
+				// goods_id: item.goods_id,
+				goods_id: item.spu.id,
+				// goods_num: item.goods_num,
+				goods_num: item.count,
+				// 商品价格id真没有
+				// goods_sku_price_id: item.goods_sku_price_id,
+			});
+		});
+		// return;
+		if (goods_list.length === 0) {
+			sheep.$helper.toast('请选择商品');
+			return;
+		}
+		sheep.$router.go('/pages/order/confirm', {
+			data: JSON.stringify({
+				// order_type: 'goods',
+				// goods_list,
+				items,
+				// from: 'cart',
+				deliveryType: 1,
+				pointStatus: false,
+			}),
+		});
+	}
 
-  function onNumberChange(e, cartItem) {
-    if (e === 0) {
-      cart.delete(cartItem.id);
-      return;
-    }
-    if(cartItem.goods_num === e) return;
-    cartItem.goods_num = e;
-    cart.update({
-      goods_id: cartItem.id,
-      goods_num: e,
-      goods_sku_price_id: cartItem.goods_sku_price_id,
-    });
-  }
-  async function onDelete() {
-    cart.delete(state.selectedIds);
-  }
+	function onNumberChange(e, cartItem) {
+		if (e === 0) {
+			cart.delete(cartItem.id);
+			return;
+		}
+		if (cartItem.goods_num === e) return;
+		cartItem.goods_num = e;
+		cart.update({
+			goods_id: cartItem.id,
+			goods_num: e,
+			goods_sku_price_id: cartItem.goods_sku_price_id,
+		});
+	}
+	async function onDelete() {
+		cart.delete(state.selectedIds);
+	}
 </script>
 
 <style lang="scss" scoped>
-  :deep(.ui-fixed) {
-    height: 72rpx;
-  }
+	:deep(.ui-fixed) {
+		height: 72rpx;
+	}
 
-  .cart-box {
-    width: 100%;
+	.cart-box {
+		width: 100%;
 
-    .cart-header {
-      height: 70rpx;
-      background-color: #f6f6f6;
-      width: 100%;
-      position: fixed;
-      left: 0;
-      top: v-bind('sys_navBar') rpx;
-      z-index: 1000;
-      box-sizing: border-box;
-    }
+		.cart-header {
+			height: 70rpx;
+			background-color: #f6f6f6;
+			width: 100%;
+			position: fixed;
+			left: 0;
+			top: v-bind('sys_navBar') rpx;
+			z-index: 1000;
+			box-sizing: border-box;
+		}
 
-    .cart-footer {
-      height: 100rpx;
-      background-color: #fff;
+		.cart-footer {
+			height: 100rpx;
+			background-color: #fff;
 
-      .pay-btn {
-        width: 180rpx;
-        height: 70rpx;
-        font-size: 28rpx;
-        line-height: 28rpx;
-        font-weight: 500;
-        border-radius: 40rpx;
-      }
-    }
+			.pay-btn {
+				width: 180rpx;
+				height: 70rpx;
+				font-size: 28rpx;
+				line-height: 28rpx;
+				font-weight: 500;
+				border-radius: 40rpx;
+			}
+		}
 
-    .cart-content {
-      margin-top: 70rpx;
-      .goods-box {
-        background-color: #fff;
-      }
-    }
-  }
-</style>
+		.cart-content {
+			margin-top: 70rpx;
+
+			.goods-box {
+				background-color: #fff;
+			}
+		}
+	}
+</style>

+ 1 - 1
pages/index/index.vue

@@ -89,4 +89,4 @@
 	onPageScroll(() => {});
 </script>
 
-<style></style>
+<style></style>

+ 341 - 343
pages/order/aftersale/detail.vue

@@ -1,357 +1,355 @@
 <!-- 售后详情 -->
 <template>
-  <s-layout title="售后详情" :navbar="!isEmpty(state.info) && state.loading ? 'inner' : 'normal'">
-    <view class="content_box" v-if="!isEmpty(state.info) && state.loading">
-      <!-- 步骤条 -->
-      <view
-        class="steps-box ss-flex"
-        :style="[
+	<s-layout title="售后详情" :navbar="!isEmpty(state.info) && state.loading ? 'inner' : 'normal'">
+		<view class="content_box" v-if="!isEmpty(state.info) && state.loading">
+			<!-- 步骤条 -->
+			<!-- 这个没找到替换方案 -->
+			<view class="steps-box ss-flex" :style="[
           {
             marginTop: '-' + Number(statusBarHeight + 88) + 'rpx',
             paddingTop: Number(statusBarHeight + 88) + 'rpx',
           },
-        ]"
-      >
-        <!-- <uni-steps :options="state.list" :active="state.active" active-color="#fff" /> -->
-        <view class="ss-flex">
-          <view class="steps-item" v-for="(item, index) in state.list" :key="index">
-            <view class="ss-flex">
-              <text
-                class="sicon-circleclose"
-                v-if="
+        ]">
+				<!-- <uni-steps :options="state.list" :active="state.active" active-color="#fff" /> -->
+				<view class="ss-flex">
+					<view class="steps-item" v-for="(item, index) in state.list" :key="index">
+						<view class="ss-flex">
+							<text class="sicon-circleclose" v-if="
                   (state.list.length - 1 == index && state.info.aftersale_status === -2) ||
                   (state.list.length - 1 == index && state.info.aftersale_status === -1)
-                "
-              ></text>
-              <text
-                class="sicon-circlecheck"
-                v-else
-                :class="state.active >= index ? 'activity-color' : 'info-color'"
-              ></text>
-
-              <view
-                v-if="state.list.length - 1 != index"
-                class="line"
-                :class="state.active >= index ? 'activity-bg' : 'info-bg'"
-              ></view>
-            </view>
-            <view
-              class="steps-item-title"
-              :class="state.active >= index ? 'activity-color' : 'info-color'"
-              >{{ item.title }}</view
-            >
-          </view>
-        </view>
-      </view>
-
-      <!-- 服务状态 -->
-      <view
-        class="status-box ss-flex ss-col-center ss-row-between ss-m-x-20"
-        @tap="sheep.$router.go('/pages/order/aftersale/log', { id: state.aftersaleId })"
-      >
-        <view class="">
-          <view class="status-text">{{ state.info.aftersale_status_desc }}</view>
-          <view class="status-time">{{ state.info.update_time }}</view>
-        </view>
-        <text class="ss-iconfont _icon-forward" style="color: #666"></text>
-      </view>
-
-      <!-- 退款金额 -->
-      <view class="aftersale-money ss-flex ss-col-center ss-row-between">
-        <view class="aftersale-money--title">退款总额</view>
-        <view class="aftersale-money--num">¥{{ state.info.refund_fee }}</view>
-      </view>
-      <!-- 服务商品 -->
-      <view class="order-shop">
-        <s-goods-item
-          :title="state.info.goods_title"
-          :price="state.info.goods_price"
-          :img="state.info.goods_image"
-          priceColor="#333333"
-          :titleWidth="480"
-          :skuText="state.info.goods_sku_text"
-          :num="state.info.goods_num"
-        ></s-goods-item>
-      </view>
-
-      <!-- 服务内容 -->
-      <view class="aftersale-content">
-        <view class="aftersale-item ss-flex ss-col-center">
-          <view class="item-title">服务单号:</view>
-          <view class="item-content ss-m-r-16">{{ state.info.aftersale_sn }}</view>
-          <button class="ss-reset-button copy-btn" @tap="onCopy">复制</button>
-        </view>
-        <view class="aftersale-item ss-flex ss-col-center">
-          <view class="item-title">申请时间:</view>
-          <view class="item-content">{{ state.info.create_time }}</view>
-        </view>
-        <view class="aftersale-item ss-flex ss-col-center">
-          <view class="item-title">售后类型:</view>
-          <view class="item-content">{{ state.info.type_text }}</view>
-        </view>
-        <view class="aftersale-item ss-flex ss-col-center">
-          <view class="item-title">申请原因:</view>
-          <view class="item-content">{{ state.info.reason }}</view>
-        </view>
-        <view class="aftersale-item ss-flex ss-col-center">
-          <view class="item-title">相关描述:</view>
-          <view class="item-content">{{ state.info.content }}</view>
-        </view>
-      </view>
-    </view>
-    <s-empty
-      v-if="isEmpty(state.info) && state.loading"
-      icon="/static/order-empty.png"
-      text="暂无该订单售后详情"
-    />
-    <su-fixed bottom placeholder bg="bg-white" v-if="!isEmpty(state.info)">
-      <view class="foot_box">
-        <button
-          class="ss-reset-button btn"
-          v-if="state.info.btns?.includes('cancel')"
-          @tap="onApply(state.info.id)"
-          >取消申请</button
-        >
-        <!-- <button
-          class="ss-reset-button btn"
-          v-if="state.info.btns?.includes('delete')"
-          @tap="onDelete(state.info.id)"
-          >删除</button
-        > -->
-        <button class="ss-reset-button contcat-btn btn" @tap="sheep.$router.go('/pages/chat/index')"
-          >联系客服</button
-        >
-      </view>
-    </su-fixed>
-  </s-layout>
+                "></text>
+							<text class="sicon-circlecheck" v-else
+								:class="state.active >= index ? 'activity-color' : 'info-color'"></text>
+
+							<view v-if="state.list.length - 1 != index" class="line"
+								:class="state.active >= index ? 'activity-bg' : 'info-bg'"></view>
+						</view>
+						<view class="steps-item-title" :class="state.active >= index ? 'activity-color' : 'info-color'">
+							{{ item.title }}
+						</view>
+					</view>
+				</view>
+			</view>
+
+			<!-- 服务状态 -->
+			<!-- 			<view class="status-box ss-flex ss-col-center ss-row-between ss-m-x-20"
+				@tap="sheep.$router.go('/pages/order/aftersale/log', { id: state.aftersaleId })">
+				<view class="">
+					<view class="status-text">{{ state.info.aftersale_status_desc }}</view>
+					<view class="status-time">{{ state.info.update_time }}</view>
+				</view>
+				<text class="ss-iconfont _icon-forward" style="color: #666"></text>
+			</view> -->
+
+			<!-- 退款金额 -->
+			<view class="aftersale-money ss-flex ss-col-center ss-row-between">
+				<view class="aftersale-money--title">退款总额</view>
+				<view class="aftersale-money--num">¥{{ state.info.refundPrice/100 }}</view>
+			</view>
+			<!-- 服务商品 -->
+			<view class="order-shop">
+				<!-- 		<s-goods-item :title="state.info.goods_title" :price="state.info.goods_price"
+					:img="state.info.goods_image" priceColor="#333333" :titleWidth="480"
+					:skuText="state.info.goods_sku_text" :num="state.info.goods_num"></s-goods-item> -->
+				<s-goods-item :img=" state.info.picUrl" :title=" state.info.spuName" priceColor="#333333"
+					:titleWidth="480" :skuText=" state.info.properties.reduce((a,b)=>a+b.valueName+' ','')"
+					:price=" state.info.refundPrice/100" :num=" state.info.count"></s-goods-item>
+			</view>
+
+			<!-- 服务内容 -->
+			<view class="aftersale-content">
+				<view class="aftersale-item ss-flex ss-col-center">
+					<view class="item-title">服务单号:</view>
+					<view class="item-content ss-m-r-16">{{ state.info.no }}</view>
+					<button class="ss-reset-button copy-btn" @tap="onCopy">复制</button>
+				</view>
+				<view class="aftersale-item ss-flex ss-col-center">
+					<view class="item-title">申请时间:</view>
+					<view class="item-content">
+						{{ sheep.$helper.timeFormat(state.info.createTime, 'yyyy-mm-dd hh:MM:ss') }}
+					</view>
+				</view>
+				<view class="aftersale-item ss-flex ss-col-center">
+					<view class="item-title">售后类型:</view>
+					<view class="item-content">{{ status2[state.info.way] }}</view>
+				</view>
+				<view class="aftersale-item ss-flex ss-col-center">
+					<view class="item-title">申请原因:</view>
+					<view class="item-content">{{ state.info.applyReason }}</view>
+				</view>
+				<view class="aftersale-item ss-flex ss-col-center">
+					<view class="item-title">相关描述:</view>
+					<view class="item-content">{{ state.info.applyDescription }}</view>
+				</view>
+			</view>
+		</view>
+		<s-empty v-if="isEmpty(state.info) && state.loading" icon="/static/order-empty.png" text="暂无该订单售后详情" />
+		<!-- 		<su-fixed bottom placeholder bg="bg-white" v-if="!isEmpty(state.info)">
+			<view class="foot_box">
+				<button class="ss-reset-button btn" v-if="state.info.btns?.includes('cancel')"
+					@tap="onApply(state.info.id)">取消申请</button>
+				<button class="ss-reset-button btn" v-if="state.info.btns?.includes('delete')"
+					@tap="onDelete(state.info.id)">删除</button>
+				<button class="ss-reset-button contcat-btn btn"
+					@tap="sheep.$router.go('/pages/chat/index')">联系客服</button>
+			</view>
+		</su-fixed> -->
+	</s-layout>
 </template>
 
 <script setup>
-  import sheep from '@/sheep';
-  import { onLoad } from '@dcloudio/uni-app';
-  import { reactive } from 'vue';
-  import { isEmpty } from 'lodash';
-
-  const statusBarHeight = sheep.$platform.device.statusBarHeight * 2;
-  const headerBg = sheep.$url.css('/static/img/shop/order/order_bg.png');
-  const state = reactive({
-    active: 0,
-    aftersaleId: 0,
-    info: {},
-    list: [
-      {
-        title: '提交申请',
-      },
-      {
-        title: '处理中',
-      },
-    ],
-    loading: false,
-  });
-
-  function onApply(orderId) {
-    uni.showModal({
-      title: '提示',
-      content: '确定要取消此申请吗?',
-      success: async function (res) {
-        if (res.confirm) {
-          const { error } = await sheep.$api.order.aftersale.cancel(orderId);
-          if (error === 0) {
-            getDetail(state.aftersaleId);
-          }
-        }
-      },
-    });
-  }
-
-  function onDelete(orderId) {
-    uni.showModal({
-      title: '提示',
-      content: '确定要删除吗?',
-      success: async function (res) {
-        if (res.confirm) {
-          const { error } = await sheep.$api.order.aftersale.delete(orderId);
-          if (error === 0) {
-            sheep.$router.back();
-          }
-        }
-      },
-    });
-  }
-  const onCopy = () => {
-    sheep.$helper.copyText(state.info.aftersale_sn);
-  };
-  async function getDetail(id) {
-    const { error, data } = await sheep.$api.order.aftersale.detail(id);
-    state.loading = true;
-    if (error === 0) {
-      state.info = data;
-      if (state.info.aftersale_status === -2 || state.info.aftersale_status === -1) {
-        state.list.push({ title: state.info.aftersale_status_text });
-        state.active = 2;
-      } else {
-        state.list.push({ title: '完成' });
-        state.active = state.info.aftersale_status;
-      }
-    } else {
-      state.info = null;
-    }
-  }
-  onLoad((options) => {
-    state.aftersaleId = options.id;
-    getDetail(options.id);
-  });
+	import sheep from '@/sheep';
+	import {
+		onLoad
+	} from '@dcloudio/uni-app';
+	import {
+		reactive
+	} from 'vue';
+	import {
+		isEmpty
+	} from 'lodash';
+
+	const statusBarHeight = sheep.$platform.device.statusBarHeight * 2;
+	const headerBg = sheep.$url.css('/static/img/shop/order/order_bg.png');
+	const state = reactive({
+		active: 0,
+		aftersaleId: 0,
+		info: {},
+		list: [{
+				title: '提交申请',
+			},
+			{
+				title: '处理中',
+			},
+		],
+		loading: false,
+	});
+
+	const status2 = {
+		10: '仅退款',
+		20: '退货退款'
+	}
+
+	function onApply(orderId) {
+		uni.showModal({
+			title: '提示',
+			content: '确定要取消此申请吗?',
+			success: async function(res) {
+				if (res.confirm) {
+					const {
+						error
+					} = await sheep.$api.order.aftersale.cancel(orderId);
+					if (error === 0) {
+						getDetail(state.aftersaleId);
+					}
+				}
+			},
+		});
+	}
+
+	function onDelete(orderId) {
+		uni.showModal({
+			title: '提示',
+			content: '确定要删除吗?',
+			success: async function(res) {
+				if (res.confirm) {
+					const {
+						error
+					} = await sheep.$api.order.aftersale.delete(orderId);
+					if (error === 0) {
+						sheep.$router.back();
+					}
+				}
+			},
+		});
+	}
+	const onCopy = () => {
+		sheep.$helper.copyText(state.info.aftersale_sn);
+	};
+	async function getDetail(id) {
+		const {
+			code,
+			data
+		} = await sheep.$api.order.aftersale.detail(id);
+		state.loading = true;
+		if (code === 0) {
+			state.info = data;
+			if (state.info.aftersale_status === -2 || state.info.aftersale_status === -1) {
+				state.list.push({
+					title: state.info.aftersale_status_text
+				});
+				state.active = 2;
+			} else {
+				state.list.push({
+					title: '完成'
+				});
+				state.active = state.info.aftersale_status;
+			}
+		} else {
+			state.info = null;
+		}
+	}
+	onLoad((options) => {
+		state.aftersaleId = options.id;
+		getDetail(options.id);
+	});
 </script>
 
 <style lang="scss" scoped>
-  // 步骤条
-  .steps-box {
-    width: 100%;
-    height: 190rpx;
-    background: v-bind(headerBg) no-repeat,
-      linear-gradient(90deg, var(--ui-BG-Main), var(--ui-BG-Main-gradient));
-    background-size: 750rpx 100%;
-    padding-left: 72rpx;
-
-    .steps-item {
-      .sicon-circleclose {
-        font-size: 24rpx;
-        color: #fff;
-      }
-      .sicon-circlecheck {
-        font-size: 24rpx;
-      }
-      .steps-item-title {
-        font-size: 24rpx;
-        font-weight: 400;
-        margin-top: 16rpx;
-        margin-left: -36rpx;
-        width: 100rpx;
-        text-align: center;
-      }
-    }
-  }
-  .activity-color {
-    color: #fff;
-  }
-  .info-color {
-    color: rgba(#fff, 0.4);
-  }
-  .activity-bg {
-    background: #fff;
-  }
-  .info-bg {
-    background: rgba(#fff, 0.4);
-  }
-
-  .line {
-    width: 270rpx;
-    height: 4rpx;
-  }
-
-  // 服务状态
-  .status-box {
-    position: relative;
-    z-index: 3;
-    background-color: #fff;
-    border-radius: 20rpx 20rpx 0px 0px;
-    padding: 20rpx;
-    margin-top: -20rpx;
-
-    .status-text {
-      font-size: 28rpx;
-
-      font-weight: 500;
-      color: rgba(51, 51, 51, 1);
-      margin-bottom: 20rpx;
-    }
-
-    .status-time {
-      font-size: 24rpx;
-
-      font-weight: 400;
-      color: rgba(153, 153, 153, 1);
-    }
-  }
-
-  // 退款金额
-  .aftersale-money {
-    background-color: #fff;
-    height: 98rpx;
-    padding: 0 20rpx;
-    margin: 20rpx;
-
-    .aftersale-money--title {
-      font-size: 28rpx;
-
-      font-weight: 500;
-      color: rgba(51, 51, 51, 1);
-    }
-
-    .aftersale-money--num {
-      font-size: 28rpx;
-      font-family: OPPOSANS;
-      font-weight: 500;
-      color: #ff3000;
-    }
-  }
-
-  // order-shop
-  .order-shop {
-    padding: 20rpx;
-    background-color: #fff;
-    margin: 0 20rpx 20rpx 20rpx;
-  }
-
-  // 服务内容
-  .aftersale-content {
-    background-color: #fff;
-    padding: 20rpx;
-    margin: 0 20rpx;
-
-    .aftersale-item {
-      height: 60rpx;
-
-      .copy-btn {
-        background: #eeeeee;
-        color: #333;
-        border-radius: 20rpx;
-        width: 75rpx;
-        height: 40rpx;
-        font-size: 22rpx;
-      }
-
-      .item-title {
-        color: #999;
-        font-size: 28rpx;
-      }
-
-      .item-content {
-        color: #333;
-        font-size: 28rpx;
-      }
-    }
-  }
-
-  // 底部功能
-  .foot_box {
-    height: 100rpx;
-    background-color: #fff;
-    display: flex;
-    align-items: center;
-    justify-content: flex-end;
-
-    .btn {
-      width: 160rpx;
-      line-height: 60rpx;
-      background: rgba(238, 238, 238, 1);
-      border-radius: 30rpx;
-      padding: 0;
-      margin-right: 20rpx;
-      font-size: 26rpx;
-
-      font-weight: 400;
-      color: rgba(51, 51, 51, 1);
-    }
-  }
-</style>
+	// 步骤条
+	.steps-box {
+		width: 100%;
+		height: 190rpx;
+		background: v-bind(headerBg) no-repeat,
+			linear-gradient(90deg, var(--ui-BG-Main), var(--ui-BG-Main-gradient));
+		background-size: 750rpx 100%;
+		padding-left: 72rpx;
+
+		.steps-item {
+			.sicon-circleclose {
+				font-size: 24rpx;
+				color: #fff;
+			}
+
+			.sicon-circlecheck {
+				font-size: 24rpx;
+			}
+
+			.steps-item-title {
+				font-size: 24rpx;
+				font-weight: 400;
+				margin-top: 16rpx;
+				margin-left: -36rpx;
+				width: 100rpx;
+				text-align: center;
+			}
+		}
+	}
+
+	.activity-color {
+		color: #fff;
+	}
+
+	.info-color {
+		color: rgba(#fff, 0.4);
+	}
+
+	.activity-bg {
+		background: #fff;
+	}
+
+	.info-bg {
+		background: rgba(#fff, 0.4);
+	}
+
+	.line {
+		width: 270rpx;
+		height: 4rpx;
+	}
+
+	// 服务状态
+	.status-box {
+		position: relative;
+		z-index: 3;
+		background-color: #fff;
+		border-radius: 20rpx 20rpx 0px 0px;
+		padding: 20rpx;
+		margin-top: -20rpx;
+
+		.status-text {
+			font-size: 28rpx;
+
+			font-weight: 500;
+			color: rgba(51, 51, 51, 1);
+			margin-bottom: 20rpx;
+		}
+
+		.status-time {
+			font-size: 24rpx;
+
+			font-weight: 400;
+			color: rgba(153, 153, 153, 1);
+		}
+	}
+
+	// 退款金额
+	.aftersale-money {
+		background-color: #fff;
+		height: 98rpx;
+		padding: 0 20rpx;
+		margin: 20rpx;
+
+		.aftersale-money--title {
+			font-size: 28rpx;
+
+			font-weight: 500;
+			color: rgba(51, 51, 51, 1);
+		}
+
+		.aftersale-money--num {
+			font-size: 28rpx;
+			font-family: OPPOSANS;
+			font-weight: 500;
+			color: #ff3000;
+		}
+	}
+
+	// order-shop
+	.order-shop {
+		padding: 20rpx;
+		background-color: #fff;
+		margin: 0 20rpx 20rpx 20rpx;
+	}
+
+	// 服务内容
+	.aftersale-content {
+		background-color: #fff;
+		padding: 20rpx;
+		margin: 0 20rpx;
+
+		.aftersale-item {
+			height: 60rpx;
+
+			.copy-btn {
+				background: #eeeeee;
+				color: #333;
+				border-radius: 20rpx;
+				width: 75rpx;
+				height: 40rpx;
+				font-size: 22rpx;
+			}
+
+			.item-title {
+				color: #999;
+				font-size: 28rpx;
+			}
+
+			.item-content {
+				color: #333;
+				font-size: 28rpx;
+			}
+		}
+	}
+
+	// 底部功能
+	.foot_box {
+		height: 100rpx;
+		background-color: #fff;
+		display: flex;
+		align-items: center;
+		justify-content: flex-end;
+
+		.btn {
+			width: 160rpx;
+			line-height: 60rpx;
+			background: rgba(238, 238, 238, 1);
+			border-radius: 30rpx;
+			padding: 0;
+			margin-right: 20rpx;
+			font-size: 26rpx;
+
+			font-weight: 400;
+			color: rgba(51, 51, 51, 1);
+		}
+	}
+</style>

+ 229 - 226
pages/order/aftersale/list.vue

@@ -1,235 +1,238 @@
 <!-- 售后列表 -->
 <template>
-  <s-layout title="售后列表">
-    <!-- tab -->
-    <su-sticky bgColor="#fff">
-      <su-tabs
-        :list="tabMaps"
-        :scrollable="false"
-        @change="onTabsChange"
-        :current="state.currentTab"
-      ></su-tabs>
-    </su-sticky>
-    <s-empty v-if="state.pagination.total === 0" icon="/static/data-empty.png" text="暂无数据">
-    </s-empty>
-    <!-- 列表 -->
-    <view v-if="state.pagination.total > 0">
-      <view
-        class="list-box ss-m-y-20"
-        v-for="order in state.pagination.data"
-        :key="order.id"
-        @tap="sheep.$router.go('/pages/order/aftersale/detail', { id: order.id })"
-      >
-        <view class="order-head ss-flex ss-col-center ss-row-between">
-          <text class="no">服务单号:{{ order.aftersale_sn }}</text>
-          <text class="state">{{ order.aftersale_status_text }}</text>
-        </view>
-        <s-goods-item
-          :img="order.goods_image"
-          :title="order.goods_title"
-          :skuText="order.goods_sku_text"
-          :price="order.goods_price"
-          :num="order.goods_num"
-        ></s-goods-item>
-        <view class="apply-box ss-flex ss-col-center ss-row-between border-bottom ss-p-x-20">
-          <view class="ss-flex ss-col-center">
-            <view class="title ss-m-r-20">{{ order.type_text }}</view>
-            <view class="value">{{ order.aftersale_status_desc }}</view>
-          </view>
-          <text class="_icon-forward"></text>
-        </view>
-        <view class="tool-btn-box ss-flex ss-col-center ss-row-right ss-p-r-20">
-          <view>
-            <button
-              class="ss-reset-button tool-btn"
-              @tap.stop="onApply(order.id)"
-              v-if="order.btns.includes('cancel')"
-              >取消申请</button
-            >
-          </view>
-          <view>
-            <button
-              class="ss-reset-button tool-btn"
-              @tap.stop="onDelete(order.id)"
-              v-if="order.btns.includes('delete')"
-              >删除</button
-            >
-          </view>
-        </view>
-      </view>
-    </view>
-    <uni-load-more
-      v-if="state.pagination.total > 0"
-      :status="state.loadStatus"
-      :content-text="{
+	<s-layout title="售后列表">
+		<!-- tab -->
+		<su-sticky bgColor="#fff">
+			<su-tabs :list="tabMaps" :scrollable="false" @change="onTabsChange" :current="state.currentTab"></su-tabs>
+		</su-sticky>
+		<s-empty v-if="state.pagination.total === 0" icon="/static/data-empty.png" text="暂无数据">
+		</s-empty>
+		<!-- 列表 -->
+		<view v-if="state.pagination.total > 0">
+			<view class="list-box ss-m-y-20" v-for="order in state.pagination.data" :key="order.id"
+				@tap="sheep.$router.go('/pages/order/aftersale/detail', { id: order.id })">
+				<view class="order-head ss-flex ss-col-center ss-row-between">
+					<text class="no">服务单号:{{ order.no }}</text>
+					<text class="state">{{ status[order.status] }}</text>
+				</view>
+				<s-goods-item :img="order.picUrl" :title="order.spuName"
+					:skuText="order.properties.reduce((a,b)=>a+b.valueName+' ','')" :price="order.refundPrice/100"
+					:num="order.count"></s-goods-item>
+				<view class="apply-box ss-flex ss-col-center ss-row-between border-bottom ss-p-x-20">
+					<view class="ss-flex ss-col-center">
+						<!-- 此处需修改 -->
+						<view class="title ss-m-r-20">{{ status2[order.way] }}</view>
+						<!-- <view class="value">{{ order.aftersale_status_desc }}</view> -->
+						<view class="value">{{ order.applyReason }}</view>
+					</view>
+					<text class="_icon-forward"></text>
+				</view>
+				<!-- 				<view class="tool-btn-box ss-flex ss-col-center ss-row-right ss-p-r-20">
+					<view>
+						<button class="ss-reset-button tool-btn" @tap.stop="onApply(order.id)"
+							v-if="order.btns.includes('cancel')">取消申请</button>
+					</view>
+					<view>
+						<button class="ss-reset-button tool-btn" @tap.stop="onDelete(order.id)"
+							v-if="order.btns.includes('delete')">删除</button>
+					</view>
+				</view> -->
+			</view>
+		</view>
+		<uni-load-more v-if="state.pagination.total > 0" :status="state.loadStatus" :content-text="{
         contentdown: '上拉加载更多',
-      }"
-      @tap="loadmore"
-    />
-  </s-layout>
+      }" @tap="loadmore" />
+	</s-layout>
 </template>
 
 <script setup>
-  import sheep from '@/sheep';
-  import { onLoad, onReachBottom } from '@dcloudio/uni-app';
-  import { computed, reactive } from 'vue';
-  import _ from 'lodash';
-
-  const pagination = {
-    data: [],
-    current_page: 1,
-    total: 1,
-    last_page: 1,
-  };
-  const state = reactive({
-    currentTab: 0,
-    showApply: false,
-    pagination: {
-      data: [],
-      current_page: 1,
-      total: 1,
-      last_page: 1,
-    },
-    loadStatus: '',
-  });
-
-  const tabMaps = [
-    {
-      name: '全部',
-      value: 'all',
-    },
-    {
-      name: '申请中',
-      value: 'nooper',
-    },
-    {
-      name: '处理中',
-      value: 'ing',
-    },
-    {
-      name: '已完成',
-      value: 'completed',
-    },
-    {
-      name: '已拒绝',
-      value: 'refuse',
-    },
-  ];
-  // 切换选项卡
-  function onTabsChange(e) {
-    state.pagination = pagination
-    state.currentTab = e.index;
-    getOrderList();
-  }
-
-  // 获取售后列表
-  async function getOrderList(page = 1, list_rows = 5) {
-    state.loadStatus = 'loading';
-    let res = await sheep.$api.order.aftersale.list({
-      type: tabMaps[state.currentTab].value,
-      list_rows,
-      page,
-    });
-    if (res.error === 0) {
-        let orderList = _.concat(state.pagination.data, res.data.data);
-        state.pagination = {
-          ...res.data,
-          data: orderList,
-        };
-
-      if (state.pagination.current_page < state.pagination.last_page) {
-        state.loadStatus = 'more';
-      } else {
-        state.loadStatus = 'noMore';
-      }
-    }
-  }
-
-  function onApply(orderId) {
-    uni.showModal({
-      title: '提示',
-      content: '确定要取消此申请吗?',
-      success: async function (res) {
-        if (res.confirm) {
-          const { error } = await sheep.$api.order.aftersale.cancel(orderId);
-          if (error === 0) {
-            state.pagination = pagination
-            getOrderList();
-          }
-        }
-      },
-    });
-  }
-
-  function onDelete(orderId) {
-    uni.showModal({
-      title: '提示',
-      content: '确定要删除吗?',
-      success: async function (res) {
-        if (res.confirm) {
-          const { error } = await sheep.$api.order.aftersale.delete(orderId);
-          if (error === 0) {
-            state.pagination = pagination
-            getOrderList();
-          }
-        }
-      },
-    });
-  }
-
-  onLoad(async (options) => {
-    if (options.type) {
-      state.currentTab = options.type;
-    }
-    getOrderList();
-  });
-
-  // 加载更多
-  function loadmore() {
-    if (state.loadStatus !== 'noMore') {
-      getOrderList(state.pagination.current_page + 1);
-    }
-  }
-
-  // 上拉加载更多
-  onReachBottom(() => {
-    loadmore();
-  });
+	import sheep from '@/sheep';
+	import {
+		onLoad,
+		onReachBottom
+	} from '@dcloudio/uni-app';
+	import {
+		computed,
+		reactive
+	} from 'vue';
+	import _ from 'lodash';
+
+	const pagination = {
+		data: [],
+		current_page: 1,
+		total: 1,
+		last_page: 1,
+	};
+	const state = reactive({
+		currentTab: 0,
+		showApply: false,
+		pagination: {
+			data: [],
+			current_page: 1,
+			total: 1,
+			last_page: 1,
+		},
+		loadStatus: '',
+	});
+	// 字典需要登录 尚未接入 先用固定值代替
+	const status = {
+		10: '申请售后',
+		20: '商品待退货',
+		30: '商家待收货',
+		40: '等待退款',
+		50: '退款成功',
+		61: '买家取消',
+		62: '商家拒绝',
+		63: '商家拒收货'
+	}
+	const status2 = {
+		10: '仅退款',
+		20: '退货退款'
+	}
+	const tabMaps = [{
+			name: '全部',
+			value: 'all',
+		},
+		// {
+		//   name: '申请中',
+		//   value: 'nooper',
+		// },
+		// {
+		//   name: '处理中',
+		//   value: 'ing',
+		// },
+		// {
+		//   name: '已完成',
+		//   value: 'completed',
+		// },
+		// {
+		//   name: '已拒绝',
+		//   value: 'refuse',
+		// },
+	];
+	// 切换选项卡
+	function onTabsChange(e) {
+		state.pagination = pagination
+		state.currentTab = e.index;
+		getOrderList();
+	}
+
+	// 获取售后列表
+	async function getOrderList(page = 1, list_rows = 5) {
+		pagination.current_page = page;
+		state.loadStatus = 'loading';
+		let res = await sheep.$api.order.aftersale.list({
+			// type: tabMaps[state.currentTab].value,
+			pageSize: list_rows,
+			pageNo: page,
+		});
+		console.log(res, '未处理前售后列表数据')
+		if (res.code === 0) {
+			let orderList = _.concat(state.pagination.data, res.data.list);
+
+			state.pagination = {
+				total: res.data.total,
+				...res.data,
+				data: orderList,
+			};
+			console.log(state.pagination, '售后订单数据')
+			// if (state.pagination.current_page < state.pagination.last_page) {
+			state.loadStatus = 'more';
+			// } else {
+			// state.loadStatus = 'noMore';
+			// }
+		}
+	}
+
+	function onApply(orderId) {
+		uni.showModal({
+			title: '提示',
+			content: '确定要取消此申请吗?',
+			success: async function(res) {
+				if (res.confirm) {
+					const {
+						error
+					} = await sheep.$api.order.aftersale.cancel(orderId);
+					if (error === 0) {
+						state.pagination = pagination
+						getOrderList();
+					}
+				}
+			},
+		});
+	}
+
+	function onDelete(orderId) {
+		uni.showModal({
+			title: '提示',
+			content: '确定要删除吗?',
+			success: async function(res) {
+				if (res.confirm) {
+					const {
+						error
+					} = await sheep.$api.order.aftersale.delete(orderId);
+					if (error === 0) {
+						state.pagination = pagination
+						getOrderList();
+					}
+				}
+			},
+		});
+	}
+
+	onLoad(async (options) => {
+		if (options.type) {
+			state.currentTab = options.type;
+		}
+		getOrderList();
+	});
+
+	// 加载更多
+	function loadmore() {
+		// if (state.loadStatus !== 'noMore') {
+		getOrderList(pagination.current_page + 1);
+		// }
+	}
+
+	// 上拉加载更多
+	onReachBottom(() => {
+		loadmore();
+	});
 </script>
 
 <style lang="scss" scoped>
-  .list-box {
-    background-color: #fff;
-
-    .order-head {
-      padding: 0 25rpx;
-      height: 77rpx;
-    }
-
-    .apply-box {
-      height: 82rpx;
-
-      .title {
-        font-size: 24rpx;
-      }
-
-      .value {
-        font-size: 22rpx;
-        color: $dark-6;
-      }
-    }
-
-    .tool-btn-box {
-      height: 100rpx;
-
-      .tool-btn {
-        width: 160rpx;
-        height: 60rpx;
-        background: #f6f6f6;
-        border-radius: 30rpx;
-        font-size: 26rpx;
-        font-weight: 400;
-      }
-    }
-  }
-</style>
+	.list-box {
+		background-color: #fff;
+
+		.order-head {
+			padding: 0 25rpx;
+			height: 77rpx;
+		}
+
+		.apply-box {
+			height: 82rpx;
+
+			.title {
+				font-size: 24rpx;
+			}
+
+			.value {
+				font-size: 22rpx;
+				color: $dark-6;
+			}
+		}
+
+		.tool-btn-box {
+			height: 100rpx;
+
+			.tool-btn {
+				width: 160rpx;
+				height: 60rpx;
+				background: #f6f6f6;
+				border-radius: 30rpx;
+				font-size: 26rpx;
+				font-weight: 400;
+			}
+		}
+	}
+</style>

+ 404 - 409
pages/order/confirm.vue

@@ -1,419 +1,414 @@
 <template>
-  <s-layout title="确认订单">
-    <view
-      class="bg-white address-box ss-m-b-14 ss-r-b-10"
-      @tap="onSelectAddress"
-      v-if="state.orderInfo.need_address === 1"
-    >
-      <s-address-item :item="state.addressInfo" :hasBorderBottom="false">
-        <view class="ss-rest-button"><text class="_icon-forward"></text></view>
-      </s-address-item>
-    </view>
-    <view class="order-card-box ss-m-b-14">
-      <s-goods-item
-        v-for="item in state.orderInfo.goods_list"
-        :key="item.goods_id"
-        :img="item.current_sku_price.image || item.goods.image"
-        :title="item.goods.title"
-        :skuText="item.current_sku_price?.goods_sku_text"
-        :price="item.current_sku_price.price"
-        :num="item.goods_num"
-        marginBottom="10"
-      >
-        <template #top>
-          <view class="order-item ss-flex ss-col-center ss-row-between ss-p-x-20 bg-white">
-            <view class="item-title">配送方式</view>
-            <view class="ss-flex ss-col-center">
-              <text class="item-value">{{ item.dispatch_type_text }}</text>
-            </view>
-          </view>
-        </template>
-      </s-goods-item>
-
-      <view class="order-item ss-flex ss-col-center ss-row-between ss-p-x-20 bg-white ss-r-10">
-        <view class="item-title">订单备注</view>
-        <view class="ss-flex ss-col-center">
-          <uni-easyinput
-            maxlength="20"
-            placeholder="建议留言前先与商家沟通"
-            v-model="state.orderPayload.remark"
-            :inputBorder="false"
-            :clearable="false"
-          ></uni-easyinput>
-        </view>
-      </view>
-    </view>
-    <!-- 合计 -->
-    <view class="bg-white total-card-box ss-p-20 ss-m-b-14 ss-r-10">
-      <view class="total-box-content border-bottom">
-        <view class="order-item ss-flex ss-col-center ss-row-between">
-          <view class="item-title">商品金额</view>
-          <view class="ss-flex ss-col-center">
-            <text class="item-value ss-m-r-24">¥{{ state.orderInfo.goods_amount }}</text>
-          </view>
-        </view>
-        <view
-          class="order-item ss-flex ss-col-center ss-row-between"
-          v-if="state.orderPayload.order_type === 'score'"
-        >
-          <view class="item-title">扣除积分</view>
-          <view class="ss-flex ss-col-center">
-            <image
-              :src="sheep.$url.static('/static/img/shop/goods/score1.svg')"
-              class="score-img"
-            ></image>
-            <text class="item-value ss-m-r-24">{{ state.orderInfo.score_amount }}</text>
-          </view>
-        </view>
-        <view class="order-item ss-flex ss-col-center ss-row-between">
-          <view class="item-title">运费</view>
-          <view class="ss-flex ss-col-center">
-            <text class="item-value ss-m-r-24">+¥{{ state.orderInfo.dispatch_amount }}</text>
-          </view>
-        </view>
-        <view
-          class="order-item ss-flex ss-col-center ss-row-between"
-          v-if="state.orderPayload.order_type != 'score'"
-        >
-          <!-- <view v-if="state.orderInfo.coupon_discount_fee > 0" class="order-item ss-flex ss-col-center ss-row-between"> -->
-          <view class="item-title">优惠券</view>
-          <view class="ss-flex ss-col-center" @tap="state.showCoupon = true">
-            <text class="item-value text-red" v-if="state.orderPayload.coupon_id"
-              >-¥{{ state.orderInfo.coupon_discount_fee }}</text
-            >
-            <text
-              class="item-value"
-              :class="state.couponInfo.can_use?.length > 0 ? 'text-red' : 'text-disabled'"
-              v-else
-              >{{
+	<s-layout title="确认订单">
+		<!-- v-if="state.orderInfo.need_address === 1" -->
+		<!-- 这个判断先删除 -->
+		<view class="bg-white address-box ss-m-b-14 ss-r-b-10" @tap="onSelectAddress">
+			<s-address-item :item="state.addressInfo" :hasBorderBottom="false">
+				<view class="ss-rest-button"><text class="_icon-forward"></text></view>
+			</s-address-item>
+		</view>
+		<view class="order-card-box ss-m-b-14">
+			<s-goods-item v-for="item in state.orderInfo.goods_list" :key="item.goods_id"
+				:img="item.current_sku_price.image || item.goods.image" :title="item.goods.title"
+				:skuText="item.current_sku_price?.goods_sku_text" :price="item.current_sku_price.price"
+				:num="item.goods_num" marginBottom="10">
+				<template #top>
+					<view class="order-item ss-flex ss-col-center ss-row-between ss-p-x-20 bg-white">
+						<view class="item-title">配送方式</view>
+						<view class="ss-flex ss-col-center">
+							<text class="item-value">{{ item.dispatch_type_text }}</text>
+						</view>
+					</view>
+				</template>
+			</s-goods-item>
+
+			<view class="order-item ss-flex ss-col-center ss-row-between ss-p-x-20 bg-white ss-r-10">
+				<view class="item-title">订单备注</view>
+				<view class="ss-flex ss-col-center">
+					<uni-easyinput maxlength="20" placeholder="建议留言前先与商家沟通" v-model="state.orderPayload.remark"
+						:inputBorder="false" :clearable="false"></uni-easyinput>
+				</view>
+			</view>
+		</view>
+		<!-- 合计 -->
+		<view class="bg-white total-card-box ss-p-20 ss-m-b-14 ss-r-10">
+			<view class="total-box-content border-bottom">
+				<view class="order-item ss-flex ss-col-center ss-row-between">
+					<view class="item-title">商品金额</view>
+					<view class="ss-flex ss-col-center">
+						<text class="item-value ss-m-r-24">¥{{ state.orderInfo.goods_amount }}</text>
+					</view>
+				</view>
+				<view class="order-item ss-flex ss-col-center ss-row-between"
+					v-if="state.orderPayload.order_type === 'score'">
+					<view class="item-title">扣除积分</view>
+					<view class="ss-flex ss-col-center">
+						<image :src="sheep.$url.static('/static/img/shop/goods/score1.svg')" class="score-img"></image>
+						<text class="item-value ss-m-r-24">{{ state.orderInfo.score_amount }}</text>
+					</view>
+				</view>
+				<view class="order-item ss-flex ss-col-center ss-row-between">
+					<view class="item-title">运费</view>
+					<view class="ss-flex ss-col-center">
+						<text class="item-value ss-m-r-24">+¥{{ state.orderInfo.dispatch_amount }}</text>
+					</view>
+				</view>
+				<view class="order-item ss-flex ss-col-center ss-row-between"
+					v-if="state.orderPayload.order_type != 'score'">
+					<!-- <view v-if="state.orderInfo.coupon_discount_fee > 0" class="order-item ss-flex ss-col-center ss-row-between"> -->
+					<view class="item-title">优惠券</view>
+					<view class="ss-flex ss-col-center" @tap="state.showCoupon = true">
+						<text class="item-value text-red"
+							v-if="state.orderPayload.coupon_id">-¥{{ state.orderInfo.coupon_discount_fee }}</text>
+						<text class="item-value"
+							:class="state.couponInfo.can_use?.length > 0 ? 'text-red' : 'text-disabled'" v-else>{{
                 state.couponInfo.can_use?.length > 0
                   ? state.couponInfo.can_use?.length + '张可用'
                   : '暂无可用优惠券'
-              }}</text
-            >
-
-            <text class="_icon-forward item-icon"></text>
-          </view>
-        </view>
-        <view
-          class="order-item ss-flex ss-col-center ss-row-between"
-          v-if="state.orderInfo.promo_infos?.length"
-        >
-          <!-- <view v-if="state.orderInfo.promo_discount_fee > 0" class="order-item ss-flex ss-col-center ss-row-between"> -->
-          <view class="item-title">活动优惠</view>
-          <view class="ss-flex ss-col-center" @tap="state.showDiscount = true">
-            <text class="item-value text-red"> -¥{{ state.orderInfo.promo_discount_fee }} </text>
-            <text class="_icon-forward item-icon"></text>
-          </view>
-        </view>
-      </view>
-      <view class="total-box-footer ss-font-28 ss-flex ss-row-right ss-col-center ss-m-r-28">
-        <view class="total-num ss-m-r-20">共{{ state.totalNumber }}件</view>
-        <view>合计:</view>
-        <view class="total-num text-red"> ¥{{ state.orderInfo.pay_fee }} </view>
-        <view class="ss-flex" v-if="state.orderPayload.order_type === 'score'">
-          <view class="total-num ss-font-30 text-red ss-m-l-4"> + </view>
-          <image
-            :src="sheep.$url.static('/static/img/shop/goods/score1.svg')"
-            class="score-img"
-          ></image>
-          <view class="total-num ss-font-30 text-red">{{ state.orderInfo.score_amount }}</view>
-        </view>
-      </view>
-    </view>
-    <!-- 发票 -->
-    <view class="bg-white ss-p-20 ss-r-20">
-      <view class="order-item ss-flex ss-col-center ss-row-between">
-        <view class="item-title">发票申请</view>
-        <view class="ss-flex ss-col-center" @tap="onSelectInvoice">
-          <text class="item-value">{{ state.invoiceInfo.name || '无需开具发票' }}</text>
-          <text class="_icon-forward item-icon"></text>
-        </view>
-      </view>
-    </view>
-    <!-- 选择优惠券弹框 -->
-    <s-coupon-select
-      v-model="state.couponInfo"
-      :show="state.showCoupon"
-      @confirm="onSelectCoupon"
-      @close="state.showCoupon = false"
-    />
-    <!-- 满额折扣弹框  -->
-    <s-discount-list
-      v-model="state.orderInfo"
-      :show="state.showDiscount"
-      @close="state.showDiscount = false"
-    />
-    <!-- 底部 -->
-    <su-fixed bottom :opacity="false" bg="bg-white" placeholder :noFixed="false" :index="200">
-      <view class="footer-box border-top ss-flex ss-row-between ss-p-x-20 ss-col-center">
-        <view class="total-box-footer ss-flex ss-col-center">
-          <view class="total-num ss-font-30 text-red"> ¥{{ state.orderInfo.pay_fee }} </view>
-          <view v-if="state.orderPayload.order_type === 'score'" class="ss-flex">
-            <view class="total-num ss-font-30 text-red ss-m-l-4">+</view>
-            <image
-              :src="sheep.$url.static('/static/img/shop/goods/score1.svg')"
-              class="score-img"
-            ></image>
-            <view class="total-num ss-font-30 text-red">{{ state.orderInfo.score_amount }}</view>
-          </view>
-        </view>
-
-        <button
-          class="ss-reset-button ui-BG-Main-Gradient ss-r-40 submit-btn ui-Shadow-Main"
-          @tap="onConfirm"
-        >
-          {{ exchangeNow ? '立即兑换' : '提交订单' }}
-        </button>
-      </view>
-    </su-fixed>
-  </s-layout>
+              }}</text>
+
+						<text class="_icon-forward item-icon"></text>
+					</view>
+				</view>
+				<view class="order-item ss-flex ss-col-center ss-row-between"
+					v-if="state.orderInfo.promo_infos?.length">
+					<!-- <view v-if="state.orderInfo.promo_discount_fee > 0" class="order-item ss-flex ss-col-center ss-row-between"> -->
+					<view class="item-title">活动优惠</view>
+					<view class="ss-flex ss-col-center" @tap="state.showDiscount = true">
+						<text class="item-value text-red"> -¥{{ state.orderInfo.promo_discount_fee }} </text>
+						<text class="_icon-forward item-icon"></text>
+					</view>
+				</view>
+			</view>
+			<view class="total-box-footer ss-font-28 ss-flex ss-row-right ss-col-center ss-m-r-28">
+				<view class="total-num ss-m-r-20">共{{ state.totalNumber }}件</view>
+				<view>合计:</view>
+				<view class="total-num text-red"> ¥{{ state.orderInfo.pay_fee }} </view>
+				<view class="ss-flex" v-if="state.orderPayload.order_type === 'score'">
+					<view class="total-num ss-font-30 text-red ss-m-l-4"> + </view>
+					<image :src="sheep.$url.static('/static/img/shop/goods/score1.svg')" class="score-img"></image>
+					<view class="total-num ss-font-30 text-red">{{ state.orderInfo.score_amount }}</view>
+				</view>
+			</view>
+		</view>
+		<!-- 发票 -->
+		<view class="bg-white ss-p-20 ss-r-20">
+			<view class="order-item ss-flex ss-col-center ss-row-between">
+				<view class="item-title">发票申请</view>
+				<view class="ss-flex ss-col-center" @tap="onSelectInvoice">
+					<text class="item-value">{{ state.invoiceInfo.name || '无需开具发票' }}</text>
+					<text class="_icon-forward item-icon"></text>
+				</view>
+			</view>
+		</view>
+		<!-- 选择优惠券弹框 -->
+		<s-coupon-select v-model="state.couponInfo" :show="state.showCoupon" @confirm="onSelectCoupon"
+			@close="state.showCoupon = false" />
+		<!-- 满额折扣弹框  -->
+		<s-discount-list v-model="state.orderInfo" :show="state.showDiscount" @close="state.showDiscount = false" />
+		<!-- 底部 -->
+		<su-fixed bottom :opacity="false" bg="bg-white" placeholder :noFixed="false" :index="200">
+			<view class="footer-box border-top ss-flex ss-row-between ss-p-x-20 ss-col-center">
+				<view class="total-box-footer ss-flex ss-col-center">
+					<view class="total-num ss-font-30 text-red"> ¥{{ state.orderInfo.pay_fee }} </view>
+					<view v-if="state.orderPayload.order_type === 'score'" class="ss-flex">
+						<view class="total-num ss-font-30 text-red ss-m-l-4">+</view>
+						<image :src="sheep.$url.static('/static/img/shop/goods/score1.svg')" class="score-img"></image>
+						<view class="total-num ss-font-30 text-red">{{ state.orderInfo.score_amount }}</view>
+					</view>
+				</view>
+
+				<button class="ss-reset-button ui-BG-Main-Gradient ss-r-40 submit-btn ui-Shadow-Main" @tap="onConfirm">
+					{{ exchangeNow ? '立即兑换' : '提交订单' }}
+				</button>
+			</view>
+		</su-fixed>
+	</s-layout>
 </template>
 
 <script setup>
-  import { reactive, computed } from 'vue';
-  import { onLoad, onPageScroll, onShow } from '@dcloudio/uni-app';
-  import sheep from '@/sheep';
-  import { isEmpty } from 'lodash';
-
-  const state = reactive({
-    orderPayload: {},
-    orderInfo: {},
-    addressInfo: {},
-    invoiceInfo: {},
-    totalNumber: 0,
-    showCoupon: false,
-    couponInfo: [],
-    showDiscount: false,
-  });
-
-  // 立即兑换(立即兑换无需跳转收银台)
-  const exchangeNow = computed(
-    () => state.orderPayload.order_type === 'score' && state.orderInfo.pay_fee == 0,
-  );
-
-  // 选择地址
-  function onSelectAddress() {
-    uni.$once('SELECT_ADDRESS', (e) => {
-      changeConsignee(e.addressInfo);
-    });
-    sheep.$router.go('/pages/user/address/list');
-  }
-
-  // 更改收货人地址&计算订单信息
-  async function changeConsignee(addressInfo = {}) {
-    if (isEmpty(addressInfo)) {
-      const { error, data } = await sheep.$api.user.address.default();
-      if (error === 0 && !isEmpty(data)) {
-        addressInfo = data;
-      }
-    }
-    if (!isEmpty(addressInfo)) {
-      state.addressInfo = addressInfo;
-      state.orderPayload.address_id = state.addressInfo.id;
-    }
-    getOrderInfo();
-  }
-
-  // 选择优惠券
-  async function onSelectCoupon(e) {
-    state.orderPayload.coupon_id = e || 0;
-    getOrderInfo();
-    state.showCoupon = false;
-  }
-
-  // 选择发票信息
-  function onSelectInvoice() {
-    uni.$once('SELECT_INVOICE', (e) => {
-      state.invoiceInfo = e.invoiceInfo;
-      state.orderPayload.invoice_id = e.invoiceInfo.id || 0;
-    });
-    sheep.$router.go('/pages/user/invoice/list');
-  }
-
-  // 提交订单/立即兑换
-  function onConfirm() {
-    if (!state.orderPayload.address_id && state.orderInfo.need_address === 1) {
-      sheep.$helper.toast('请选择收货地址');
-      return;
-    }
-
-    if (exchangeNow.value) {
-      uni.showModal({
-        title: '提示',
-        content: '确定使用积分立即兑换?',
-        cancelText: '再想想',
-        success: async function (res) {
-          if (res.confirm) {
-            submitOrder();
-          }
-        },
-      });
-    } else {
-      submitOrder();
-    }
-  }
-
-  // 创建订单&跳转
-  async function submitOrder() {
-    const { error, data } = await sheep.$api.order.create(state.orderPayload);
-    if (error === 0) {
-      // 更新购物车列表
-      if (state.orderPayload.from === 'cart') {
-        sheep.$store('cart').getList();
-      }
-      if (exchangeNow.value) {
-        sheep.$router.redirect('/pages/pay/result', {
-          orderSN: data.order_sn,
-        });
-      } else {
-        sheep.$router.redirect('/pages/pay/index', {
-          orderSN: data.order_sn,
-        });
-      }
-    }
-  }
-
-  // 检查库存&计算订单价格
-  async function getOrderInfo() {
-    let { error, data } = await sheep.$api.order.calc(state.orderPayload);
-    if (error === 0) {
-      state.totalNumber = 0;
-      state.orderInfo = data;
-      state.orderInfo.goods_list.forEach((item) => {
-        state.totalNumber += item.goods_num;
-      });
-    }
-  }
-
-  // 获取可用优惠券
-  async function getCoupons() {
-    const { error, data } = await sheep.$api.order.coupons(state.orderPayload);
-    if (error === 0) {
-      state.couponInfo = data;
-    }
-  }
-
-  onLoad(async (options) => {
-    if (options.data) {
-      state.orderPayload = JSON.parse(options.data);
-      changeConsignee();
-      if (state.orderPayload.order_type !== 'score') {
-        getCoupons();
-      }
-    }
-  });
+	import {
+		reactive,
+		computed
+	} from 'vue';
+	import {
+		onLoad,
+		onPageScroll,
+		onShow
+	} from '@dcloudio/uni-app';
+	import sheep from '@/sheep';
+	import {
+		isEmpty
+	} from 'lodash';
+
+	const state = reactive({
+		orderPayload: {},
+		orderInfo: {},
+		addressInfo: {},
+		invoiceInfo: {},
+		totalNumber: 0,
+		showCoupon: false,
+		couponInfo: [],
+		showDiscount: false,
+	});
+
+	// 立即兑换(立即兑换无需跳转收银台)
+	const exchangeNow = computed(
+		() => state.orderPayload.order_type === 'score' && state.orderInfo.pay_fee == 0,
+	);
+
+	// 选择地址
+	function onSelectAddress() {
+		uni.$once('SELECT_ADDRESS', (e) => {
+			changeConsignee(e.addressInfo);
+		});
+		sheep.$router.go('/pages/user/address/list');
+	}
+
+	// 更改收货人地址&计算订单信息
+	async function changeConsignee(addressInfo = {}) {
+		if (isEmpty(addressInfo)) {
+			const {
+				code,
+				data
+			} = await sheep.$api.user.address.default();
+			console.log(data, '默认收货地址');
+			if (code === 0 && !isEmpty(data)) {
+				console.log('执行赋值')
+				addressInfo = data;
+			}
+		}
+		if (!isEmpty(addressInfo)) {
+			state.addressInfo = addressInfo;
+			state.orderPayload.address_id = state.addressInfo.id;
+		}
+		getOrderInfo();
+	}
+
+	// 选择优惠券
+	async function onSelectCoupon(e) {
+		state.orderPayload.coupon_id = e || 0;
+		getOrderInfo();
+		state.showCoupon = false;
+	}
+
+	// 选择发票信息
+	function onSelectInvoice() {
+		uni.$once('SELECT_INVOICE', (e) => {
+			state.invoiceInfo = e.invoiceInfo;
+			state.orderPayload.invoice_id = e.invoiceInfo.id || 0;
+		});
+		sheep.$router.go('/pages/user/invoice/list');
+	}
+
+	// 提交订单/立即兑换
+	function onConfirm() {
+		if (!state.orderPayload.address_id && state.orderInfo.need_address === 1) {
+			sheep.$helper.toast('请选择收货地址');
+			return;
+		}
+
+		if (exchangeNow.value) {
+			uni.showModal({
+				title: '提示',
+				content: '确定使用积分立即兑换?',
+				cancelText: '再想想',
+				success: async function(res) {
+					if (res.confirm) {
+						submitOrder();
+					}
+				},
+			});
+		} else {
+			submitOrder();
+		}
+	}
+
+	// 创建订单&跳转
+	async function submitOrder() {
+		const {
+			error,
+			data
+		} = await sheep.$api.order.create(state.orderPayload);
+		if (error === 0) {
+			// 更新购物车列表
+			if (state.orderPayload.from === 'cart') {
+				sheep.$store('cart').getList();
+			}
+			if (exchangeNow.value) {
+				sheep.$router.redirect('/pages/pay/result', {
+					orderSN: data.order_sn,
+				});
+			} else {
+				sheep.$router.redirect('/pages/pay/index', {
+					orderSN: data.order_sn,
+				});
+			}
+		}
+	}
+
+	// 检查库存&计算订单价格
+	async function getOrderInfo() {
+		console.log(state.orderPayload, '计算价格传参')
+		// let {code, data} = await sheep.$api.order.calc(state.orderPayload);
+		// let data = await sheep.$api.order.calc(state.orderPayload);
+		console.log(state.orderPayload.items)
+		let data = await sheep.$api.order.calc({
+			deliveryType: 1,
+			pointStatus: false,
+			items: state.orderPayload.items
+		});
+		console.log(data, '修改后的获取订单详细数据')
+		return;
+		if (error === 0) {
+			state.totalNumber = 0;
+			state.orderInfo = data;
+			state.orderInfo.goods_list.forEach((item) => {
+				state.totalNumber += item.goods_num;
+			});
+		}
+	}
+
+	// 获取可用优惠券
+	async function getCoupons() {
+		const {
+			error,
+			data
+		} = await sheep.$api.order.coupons(state.orderPayload);
+		if (error === 0) {
+			state.couponInfo = data;
+		}
+	}
+
+	onLoad(async (options) => {
+		console.log(options)
+		if (options.data) {
+			state.orderPayload = JSON.parse(options.data);
+			changeConsignee();
+			if (state.orderPayload.order_type !== 'score') {
+				getCoupons();
+			}
+		}
+	});
 </script>
 
 <style lang="scss" scoped>
-  :deep() {
-    .uni-input-wrapper {
-      width: 320rpx;
-    }
-
-    .uni-easyinput__content-input {
-      font-size: 28rpx;
-      height: 72rpx;
-      text-align: right !important;
-      padding-right: 0 !important;
-
-      .uni-input-input {
-        font-weight: 500;
-        color: #333333;
-        font-size: 26rpx;
-        height: 32rpx;
-        margin-top: 4rpx;
-      }
-    }
-    .uni-easyinput__content {
-      display: flex !important;
-      align-items: center !important;
-      justify-content: right !important;
-    }
-  }
-  .score-img {
-    width: 36rpx;
-    height: 36rpx;
-    margin: 0 4rpx;
-  }
-  .order-item {
-    height: 80rpx;
-
-    .item-title {
-      font-size: 28rpx;
-      font-weight: 400;
-    }
-
-    .item-value {
-      font-size: 28rpx;
-      font-weight: 500;
-      font-family: OPPOSANS;
-    }
-    .text-disabled {
-      color: #bbbbbb;
-    }
-
-    .item-icon {
-      color: $dark-9;
-    }
-
-    .remark-input {
-      text-align: right;
-    }
-
-    .item-placeholder {
-      color: $dark-9;
-      font-size: 26rpx;
-      text-align: right;
-    }
-  }
-
-  .total-box-footer {
-    height: 90rpx;
-
-    .total-num {
-      color: #333333;
-      font-family: OPPOSANS;
-    }
-  }
-
-  .footer-box {
-    height: 100rpx;
-
-    .submit-btn {
-      width: 240rpx;
-      height: 70rpx;
-      font-size: 28rpx;
-      font-weight: 500;
-
-      .goto-pay-text {
-        line-height: 28rpx;
-      }
-    }
-
-    .cancel-btn {
-      width: 240rpx;
-      height: 80rpx;
-      font-size: 26rpx;
-      background-color: #e5e5e5;
-      color: $dark-9;
-    }
-  }
-  .title {
-    font-size: 36rpx;
-    font-weight: bold;
-    color: #333333;
-  }
-  .subtitle {
-    font-size: 28rpx;
-    color: #999999;
-  }
-  .cicon-checkbox {
-    font-size: 36rpx;
-    color: var(--ui-BG-Main);
-  }
-  .cicon-box {
-    font-size: 36rpx;
-    color: #999999;
-  }
-</style>
+	:deep() {
+		.uni-input-wrapper {
+			width: 320rpx;
+		}
+
+		.uni-easyinput__content-input {
+			font-size: 28rpx;
+			height: 72rpx;
+			text-align: right !important;
+			padding-right: 0 !important;
+
+			.uni-input-input {
+				font-weight: 500;
+				color: #333333;
+				font-size: 26rpx;
+				height: 32rpx;
+				margin-top: 4rpx;
+			}
+		}
+
+		.uni-easyinput__content {
+			display: flex !important;
+			align-items: center !important;
+			justify-content: right !important;
+		}
+	}
+
+	.score-img {
+		width: 36rpx;
+		height: 36rpx;
+		margin: 0 4rpx;
+	}
+
+	.order-item {
+		height: 80rpx;
+
+		.item-title {
+			font-size: 28rpx;
+			font-weight: 400;
+		}
+
+		.item-value {
+			font-size: 28rpx;
+			font-weight: 500;
+			font-family: OPPOSANS;
+		}
+
+		.text-disabled {
+			color: #bbbbbb;
+		}
+
+		.item-icon {
+			color: $dark-9;
+		}
+
+		.remark-input {
+			text-align: right;
+		}
+
+		.item-placeholder {
+			color: $dark-9;
+			font-size: 26rpx;
+			text-align: right;
+		}
+	}
+
+	.total-box-footer {
+		height: 90rpx;
+
+		.total-num {
+			color: #333333;
+			font-family: OPPOSANS;
+		}
+	}
+
+	.footer-box {
+		height: 100rpx;
+
+		.submit-btn {
+			width: 240rpx;
+			height: 70rpx;
+			font-size: 28rpx;
+			font-weight: 500;
+
+			.goto-pay-text {
+				line-height: 28rpx;
+			}
+		}
+
+		.cancel-btn {
+			width: 240rpx;
+			height: 80rpx;
+			font-size: 26rpx;
+			background-color: #e5e5e5;
+			color: $dark-9;
+		}
+	}
+
+	.title {
+		font-size: 36rpx;
+		font-weight: bold;
+		color: #333333;
+	}
+
+	.subtitle {
+		font-size: 28rpx;
+		color: #999999;
+	}
+
+	.cicon-checkbox {
+		font-size: 36rpx;
+		color: var(--ui-BG-Main);
+	}
+
+	.cicon-box {
+		font-size: 36rpx;
+		color: #999999;
+	}
+</style>

+ 652 - 686
pages/order/detail.vue

@@ -1,726 +1,692 @@
 <!-- 订单详情 -->
 <template>
-  <s-layout title="订单详情" class="index-wrap" navbar="inner">
-    <!-- 订单状态 -->
-    <view
-      class="state-box ss-flex-col ss-col-center ss-row-right"
-      :style="[
+	<s-layout title="订单详情" class="index-wrap" navbar="inner">
+		<!-- 订单状态 -->
+		<view class="state-box ss-flex-col ss-col-center ss-row-right" :style="[
         {
           marginTop: '-' + Number(statusBarHeight + 88) + 'rpx',
           paddingTop: Number(statusBarHeight + 88) + 'rpx',
         },
-      ]"
-    >
-      <view class="ss-flex ss-m-t-32 ss-m-b-20">
-        <image
-          v-if="
+      ]">
+			<view class="ss-flex ss-m-t-32 ss-m-b-20">
+				<image v-if="
             state.orderInfo.status_code == 'unpaid' ||
             state.orderInfo.status_code == 'nosend' ||
             state.orderInfo.status_code == 'nocomment'
-          "
-          class="state-img"
-          :src="sheep.$url.static('/static/img/shop/order/order_loading.png')"
-        >
-        </image>
-        <image
-          v-if="
+          " class="state-img" :src="sheep.$url.static('/static/img/shop/order/order_loading.png')">
+				</image>
+				<image v-if="
             state.orderInfo.status_code == 'completed' ||
             state.orderInfo.status_code == 'refund_agree'
-          "
-          class="state-img"
-          :src="sheep.$url.static('/static/img/shop/order/order_success.png')"
-        >
-        </image>
-        <image
-          v-if="state.orderInfo.status_code == 'cancel' || state.orderInfo.status_code == 'closed'"
-          class="state-img"
-          :src="sheep.$url.static('/static/img/shop/order/order_close.png')"
-        >
-        </image>
-        <image
-          v-if="state.orderInfo.status_code == 'noget'"
-          class="state-img"
-          :src="sheep.$url.static('/static/img/shop/order/order_express.png')"
-        >
-        </image>
-        <view class="ss-font-30">{{ state.orderInfo.status_text }}</view>
-      </view>
-      <view class="ss-font-26 ss-m-x-20 ss-m-b-70">{{ state.orderInfo.status_desc }}</view>
-    </view>
-
-    <!-- 收货地址 -->
-    <view class="order-address-box" v-if="state.orderInfo.address">
-      <view class="ss-flex ss-col-center">
-        <text class="address-username">
-          {{ state.orderInfo.address.consignee }}
-        </text>
-        <text class="address-phone">{{ state.orderInfo.address.mobile }}</text>
-      </view>
-      <view class="address-detail">{{ addressText }}</view>
-    </view>
-
-    <view class="detail-goods" :style="[{ marginTop: state.orderInfo.address ? '0' : '-40rpx' }]">
-      <!-- 订单信息 -->
-      <view class="order-list" v-for="item in state.orderInfo.items" :key="item.goods_id">
-        <view class="order-card">
-          <s-goods-item
-            @tap="onGoodsDetail(item.goods_id)"
-            :img="item.goods_image"
-            :title="item.goods_title"
-            :skuText="item.goods_sku_text"
-            :price="item.goods_price"
-            :score="state.orderInfo.score_amount"
-            :num="item.goods_num"
-          >
-            <template #top>
-              <view class="order-item ss-flex ss-col-center ss-row-between ss-p-x-20 bg-white">
-                <view class="item-title">配送方式</view>
-                <view class="ss-flex ss-col-center">
-                  <text class="item-value ss-m-r-20">{{ item.dispatch_type_text }}</text>
-                  <button
-                    class="ss-reset-button copy-btn"
-                    @tap="onDetail(item)"
-                    v-if="
+          " class="state-img" :src="sheep.$url.static('/static/img/shop/order/order_success.png')">
+				</image>
+				<image v-if="state.orderInfo.status_code == 'cancel' || state.orderInfo.status_code == 'closed'"
+					class="state-img" :src="sheep.$url.static('/static/img/shop/order/order_close.png')">
+				</image>
+				<image v-if="state.orderInfo.status_code == 'noget'" class="state-img"
+					:src="sheep.$url.static('/static/img/shop/order/order_express.png')">
+				</image>
+				<view class="ss-font-30">{{ state.orderInfo.status_text }}</view>
+			</view>
+			<view class="ss-font-26 ss-m-x-20 ss-m-b-70">{{ state.orderInfo.status_desc }}</view>
+		</view>
+
+		<!-- 收货地址 -->
+		<view class="order-address-box" v-if="state.orderInfo.address">
+			<view class="ss-flex ss-col-center">
+				<text class="address-username">
+					{{ state.orderInfo.address.consignee }}
+				</text>
+				<text class="address-phone">{{ state.orderInfo.address.mobile }}</text>
+			</view>
+			<view class="address-detail">{{ addressText }}</view>
+		</view>
+
+		<view class="detail-goods" :style="[{ marginTop: state.orderInfo.address ? '0' : '-40rpx' }]">
+			<!-- 订单信息 -->
+			<view class="order-list" v-for="item in state.orderInfo.items" :key="item.goods_id">
+				<view class="order-card">
+					<s-goods-item @tap="onGoodsDetail(item.goods_id)" :img="item.goods_image" :title="item.goods_title"
+						:skuText="item.goods_sku_text" :price="item.goods_price" :score="state.orderInfo.score_amount"
+						:num="item.goods_num">
+						<!-- 						<template #top>
+							<view class="order-item ss-flex ss-col-center ss-row-between ss-p-x-20 bg-white">
+								<view class="item-title">配送方式</view>
+								<view class="ss-flex ss-col-center">
+									<text class="item-value ss-m-r-20">{{ item.dispatch_type_text }}</text>
+									<button class="ss-reset-button copy-btn" @tap="onDetail(item)" v-if="
                       (item.dispatch_type === 'autosend' || item.dispatch_type === 'custom') &&
                       item.dispatch_status !== 0
-                    "
-                    >详情</button
-                  >
-                </view>
-              </view>
-            </template>
-            <template #tool>
-              <view class="ss-flex">
-                <button
-                  class="ss-reset-button apply-btn"
-                  v-if="item.btns.includes('aftersale')"
-                  @tap.stop="
+                    ">详情</button>
+								</view>
+							</view>
+						</template>
+						<template #tool>
+							<view class="ss-flex">
+								<button class="ss-reset-button apply-btn" v-if="item.btns.includes('aftersale')"
+									@tap.stop="
                     sheep.$router.go('/pages/order/aftersale/apply', {
                       item: JSON.stringify(item),
                     })
-                  "
-                >
-                  申请售后
-                </button>
-                <button
-                  class="ss-reset-button apply-btn"
-                  v-if="item.btns.includes('re_aftersale')"
-                  @tap.stop="
+                  ">
+									申请售后
+								</button>
+								<button class="ss-reset-button apply-btn" v-if="item.btns.includes('re_aftersale')"
+									@tap.stop="
                     sheep.$router.go('/pages/order/aftersale/apply', {
                       item: JSON.stringify(item),
                     })
-                  "
-                >
-                  重新售后
-                </button>
-
-                <button
-                  class="ss-reset-button apply-btn"
-                  v-if="item.btns.includes('aftersale_info')"
-                  @tap.stop="
+                  ">
+									重新售后
+								</button>
+
+								<button class="ss-reset-button apply-btn" v-if="item.btns.includes('aftersale_info')"
+									@tap.stop="
                     sheep.$router.go('/pages/order/aftersale/detail', {
                       id: item.ext.aftersale_id,
                     })
-                  "
-                >
-                  售后详情
-                </button>
-                <button
-                  class="ss-reset-button apply-btn"
-                  v-if="item.btns.includes('buy_again')"
-                  @tap.stop="
+                  ">
+									售后详情
+								</button>
+								<button class="ss-reset-button apply-btn" v-if="item.btns.includes('buy_again')"
+									@tap.stop="
                     sheep.$router.go('/pages/goods/index', {
                       id: item.goods_id,
                     })
-                  "
-                >
-                  再次购买
-                </button>
-              </view>
-            </template>
-            <template #priceSuffix>
-              <button class="ss-reset-button tag-btn" v-if="item.status_text">
-                {{ item.status_text }}
-              </button>
-            </template>
-          </s-goods-item>
-        </view>
-      </view>
-    </view>
-    <!-- 订单信息  -->
-    <view class="notice-box">
-      <view class="notice-box__content">
-        <view class="notice-item--center">
-          <view class="ss-flex ss-flex-1">
-            <text class="title">订单编号:</text>
-            <text class="detail">{{ state.orderInfo.order_sn }}</text>
-          </view>
-          <button class="ss-reset-button copy-btn" @tap="onCopy">复制</button>
-        </view>
-        <view class="notice-item">
-          <text class="title">下单时间:</text>
-          <text class="detail">{{ state.orderInfo.create_time }}</text>
-        </view>
-        <view class="notice-item" v-if="state.orderInfo.paid_time">
-          <text class="title">支付时间:</text>
-          <text class="detail">{{ state.orderInfo.paid_time || '-' }}</text>
-        </view>
-        <view class="notice-item">
-          <text class="title">支付方式:</text>
-          <text class="detail">{{ state.orderInfo.pay_types_text?.join(',') || '-' }}</text>
-        </view>
-      </view>
-    </view>
-    <!--  价格信息  -->
-    <view class="order-price-box">
-      <view class="notice-item ss-flex ss-row-between">
-        <text class="title">商品总额</text>
-        <view class="ss-flex">
-          <text class="detail" v-if="Number(state.orderInfo.goods_amount) > 0"
-            >¥{{ state.orderInfo.goods_amount }}</text
-          >
-          <view
-            v-if="state.orderInfo.score_amount && Number(state.orderInfo.goods_amount) > 0"
-            class="detail"
-            >+</view
-          >
-          <view class="price-text ss-flex ss-col-center" v-if="state.orderInfo.score_amount">
-            <image
-              :src="sheep.$url.static('/static/img/shop/goods/score1.svg')"
-              class="score-img"
-            ></image>
-            <view class="detail">{{ state.orderInfo.score_amount }}</view>
-          </view>
-        </view>
-      </view>
-      <view class="notice-item ss-flex ss-row-between">
-        <text class="title">运费</text>
-        <text class="detail">¥{{ state.orderInfo.dispatch_amount }}</text>
-      </view>
-      <view
-        class="notice-item ss-flex ss-row-between"
-        v-if="state.orderInfo.total_discount_fee > 0"
-      >
-        <text class="title">优惠金额</text>
-        <text class="detail">¥{{ state.orderInfo.total_discount_fee }}</text>
-      </view>
-      <view class="notice-item all-rpice-item ss-flex ss-m-t-20">
-        <text class="title">{{
+                  ">
+									再次购买
+								</button>
+							</view>
+						</template>
+						<template #priceSuffix>
+							<button class="ss-reset-button tag-btn" v-if="item.status_text">
+								{{ item.status_text }}
+							</button>
+						</template> -->
+					</s-goods-item>
+				</view>
+			</view>
+		</view>
+		<!-- 订单信息  -->
+		<view class="notice-box">
+			<view class="notice-box__content">
+				<view class="notice-item--center">
+					<view class="ss-flex ss-flex-1">
+						<text class="title">订单编号:</text>
+						<text class="detail">{{ state.orderInfo.order_sn }}</text>
+					</view>
+					<button class="ss-reset-button copy-btn" @tap="onCopy">复制</button>
+				</view>
+				<view class="notice-item">
+					<text class="title">下单时间:</text>
+					<text class="detail">{{ state.orderInfo.create_time }}</text>
+				</view>
+				<view class="notice-item" v-if="state.orderInfo.paid_time">
+					<text class="title">支付时间:</text>
+					<text class="detail">{{ state.orderInfo.paid_time || '-' }}</text>
+				</view>
+				<view class="notice-item">
+					<text class="title">支付方式:</text>
+					<text class="detail">{{ state.orderInfo.pay_types_text?.join(',') || '-' }}</text>
+				</view>
+			</view>
+		</view>
+		<!--  价格信息  -->
+		<view class="order-price-box">
+			<view class="notice-item ss-flex ss-row-between">
+				<text class="title">商品总额</text>
+				<view class="ss-flex">
+					<text class="detail"
+						v-if="Number(state.orderInfo.goods_amount) > 0">¥{{ state.orderInfo.goods_amount }}</text>
+					<view v-if="state.orderInfo.score_amount && Number(state.orderInfo.goods_amount) > 0"
+						class="detail">+</view>
+					<view class="price-text ss-flex ss-col-center" v-if="state.orderInfo.score_amount">
+						<image :src="sheep.$url.static('/static/img/shop/goods/score1.svg')" class="score-img"></image>
+						<view class="detail">{{ state.orderInfo.score_amount }}</view>
+					</view>
+				</view>
+			</view>
+			<view class="notice-item ss-flex ss-row-between">
+				<text class="title">运费</text>
+				<text class="detail">¥{{ state.orderInfo.dispatch_amount }}</text>
+			</view>
+			<view class="notice-item ss-flex ss-row-between" v-if="state.orderInfo.total_discount_fee > 0">
+				<text class="title">优惠金额</text>
+				<text class="detail">¥{{ state.orderInfo.total_discount_fee }}</text>
+			</view>
+			<view class="notice-item all-rpice-item ss-flex ss-m-t-20">
+				<text class="title">{{
           ['paid', 'completed'].includes(state.orderInfo.status) ? '已付款' : '需付款'
         }}</text>
-        <text class="detail all-price" v-if="Number(state.orderInfo.pay_fee) > 0"
-          >¥{{ state.orderInfo.pay_fee }}</text
-        >
-        <view
-          v-if="
+				<text class="detail all-price"
+					v-if="Number(state.orderInfo.pay_fee) > 0">¥{{ state.orderInfo.pay_fee }}</text>
+				<view v-if="
             state.orderInfo.score_amount &&
             Number(state.orderInfo.pay_fee) > 0 &&
             ['paid', 'completed'].includes(state.orderInfo.status)
-          "
-          class="detail all-price"
-          >+</view
-        >
-        <view
-          class="price-text ss-flex ss-col-center"
-          v-if="
+          " class="detail all-price">+</view>
+				<view class="price-text ss-flex ss-col-center" v-if="
             state.orderInfo.score_amount && ['paid', 'completed'].includes(state.orderInfo.status)
-          "
-        >
-          <image
-            :src="sheep.$url.static('/static/img/shop/goods/score1.svg')"
-            class="score-img"
-          ></image>
-          <view class="detail all-price">{{ state.orderInfo.score_amount }}</view>
-        </view>
-      </view>
-      <view class="notice-item all-rpice-item ss-flex ss-m-t-20" v-if="refundFee > 0">
-        <text class="title">已退款</text>
-        <text class="detail all-price">¥{{ refundFee.toFixed(2) }}</text>
-      </view>
-    </view>
-
-    <!-- 底部按钮 -->
-    <!-- TODO: 查看物流、等待成团、评价完后返回页面没刷新页面 -->
-    <su-fixed bottom placeholder bg="bg-white" v-if="state.orderInfo.btns?.length">
-      <view class="footer-box ss-flex ss-col-center ss-row-right">
-        <button
-          class="ss-reset-button cancel-btn"
-          v-if="state.orderInfo.btns?.includes('cancel')"
-          @tap="onCancel(state.orderInfo.id)"
-          >取消订单</button
-        >
-        <button
-          class="ss-reset-button pay-btn ui-BG-Main-Gradient"
-          v-if="state.orderInfo.btns?.includes('pay')"
-          @tap="onPay(state.orderInfo.order_sn)"
-          >继续支付</button
-        >
-        <button
-          class="ss-reset-button cancel-btn"
-          v-if="state.orderInfo.btns?.includes('apply_refund')"
-          @tap="onRefund(state.orderInfo.id)"
-          >申请退款</button
-        >
-        <button
-          class="ss-reset-button cancel-btn"
-          v-if="state.orderInfo.btns?.includes('groupon')"
-          @tap="
+          ">
+					<image :src="sheep.$url.static('/static/img/shop/goods/score1.svg')" class="score-img"></image>
+					<view class="detail all-price">{{ state.orderInfo.score_amount }}</view>
+				</view>
+			</view>
+			<view class="notice-item all-rpice-item ss-flex ss-m-t-20" v-if="refundFee > 0">
+				<text class="title">已退款</text>
+				<text class="detail all-price">¥{{ refundFee.toFixed(2) }}</text>
+			</view>
+		</view>
+
+		<!-- 底部按钮 -->
+		<!-- TODO: 查看物流、等待成团、评价完后返回页面没刷新页面 -->
+		<su-fixed bottom placeholder bg="bg-white" v-if="state.orderInfo.btns?.length">
+			<view class="footer-box ss-flex ss-col-center ss-row-right">
+				<button class="ss-reset-button cancel-btn" v-if="state.orderInfo.btns?.includes('cancel')"
+					@tap="onCancel(state.orderInfo.id)">取消订单</button>
+				<button class="ss-reset-button pay-btn ui-BG-Main-Gradient" v-if="state.orderInfo.btns?.includes('pay')"
+					@tap="onPay(state.orderInfo.order_sn)">继续支付</button>
+				<button class="ss-reset-button cancel-btn" v-if="state.orderInfo.btns?.includes('apply_refund')"
+					@tap="onRefund(state.orderInfo.id)">申请退款</button>
+				<button class="ss-reset-button cancel-btn" v-if="state.orderInfo.btns?.includes('groupon')" @tap="
             sheep.$router.go('/pages/activity/groupon/detail', {
               id: state.orderInfo.ext.groupon_id,
             })
-          "
-        >
-          {{ state.orderInfo.status_code === 'groupon_ing' ? '邀请拼团' : '拼团详情' }}
-        </button>
-        <button
-          class="ss-reset-button cancel-btn"
-          v-if="state.orderInfo.btns?.includes('express')"
-          @tap="onExpress(state.orderInfo.id)"
-          >查看物流</button
-        >
-        <button
-          class="ss-reset-button cancel-btn"
-          v-if="state.orderInfo.btns?.includes('confirm')"
-          @tap="onConfirm(state.orderInfo.id)"
-          >确认收货</button
-        >
-        <button
-          class="ss-reset-button cancel-btn"
-          v-if="state.orderInfo.btns?.includes('comment')"
-          @tap="onComment(state.orderInfo.order_sn)"
-          >评价晒单</button
-        >
-        <button
-          v-if="state.orderInfo.btns?.includes('invoice')"
-          class="ss-reset-button cancel-btn"
-          @tap.stop="onOrderInvoice(state.orderInfo.invoice?.id)"
-        >
-          查看发票
-        </button>
-        <button
-          v-if="state.orderInfo.btns?.includes('re_apply_refund')"
-          class="ss-reset-button cancel-btn"
-          @tap.stop="onRefund(state.orderInfo.id)"
-        >
-          重新退款
-        </button>
-      </view>
-    </su-fixed>
-  </s-layout>
+          ">
+					{{ state.orderInfo.status_code === 'groupon_ing' ? '邀请拼团' : '拼团详情' }}
+				</button>
+				<button class="ss-reset-button cancel-btn" v-if="state.orderInfo.btns?.includes('express')"
+					@tap="onExpress(state.orderInfo.id)">查看物流</button>
+				<button class="ss-reset-button cancel-btn" v-if="state.orderInfo.btns?.includes('confirm')"
+					@tap="onConfirm(state.orderInfo.id)">确认收货</button>
+				<button class="ss-reset-button cancel-btn" v-if="state.orderInfo.btns?.includes('comment')"
+					@tap="onComment(state.orderInfo.id,state.orderInfo)">评价晒单</button>
+				<button v-if="state.orderInfo.btns?.includes('invoice')" class="ss-reset-button cancel-btn"
+					@tap.stop="onOrderInvoice(state.orderInfo.invoice?.id)">
+					查看发票
+				</button>
+				<button v-if="state.orderInfo.btns?.includes('re_apply_refund')" class="ss-reset-button cancel-btn"
+					@tap.stop="onRefund(state.orderInfo.id)">
+					重新退款
+				</button>
+			</view>
+		</su-fixed>
+	</s-layout>
 </template>
 
 <script setup>
-  import sheep from '@/sheep';
-  import { onLoad } from '@dcloudio/uni-app';
-  import { computed, reactive } from 'vue';
-  import { isEmpty } from 'lodash';
-
-  const statusBarHeight = sheep.$platform.device.statusBarHeight * 2;
-  const headerBg = sheep.$url.css('/static/img/shop/order/order_bg.png');
-  const tradeManaged = computed(() => sheep.$store('app').has_wechat_trade_managed);
-
-  const state = reactive({
-    orderInfo: {},
-    merchantTradeNo: '', // 商户订单号
-    comeinType: '', // 进入订单详情的来源类型
-  });
-
-  const addressText = computed(() => {
-    let data = state.orderInfo.address;
-    if (data) {
-      return `${data.province_name} ${data.city_name} ${data.district_name} ${data.address}`;
-    }
-    return '';
-  });
-
-  // 复制
-  const onCopy = () => {
-    sheep.$helper.copyText(state.orderInfo.order_sn);
-  };
-  //退款总额
-  const refundFee = computed(() => {
-    let refundFee = 0;
-    state.orderInfo.items?.forEach((i) => {
-      refundFee += Number(i.refund_fee);
-    });
-    return refundFee;
-  });
-  // 去支付
-  function onPay(orderSN) {
-    sheep.$router.go('/pages/pay/index', {
-      orderSN,
-    });
-  }
-
-  function onGoodsDetail(id) {
-    sheep.$router.go('/pages/goods/index', { id });
-  }
-
-  // 取消订单
-  async function onCancel(orderId) {
-    uni.showModal({
-      title: '提示',
-      content: '确定要取消订单吗?',
-      success: async function (res) {
-        if (res.confirm) {
-          const { error, data } = await sheep.$api.order.cancel(orderId);
-          if (error === 0) {
-            getOrderDetail(data.order_sn);
-          }
-        }
-      },
-    });
-  }
-
-  // 申请退款
-  async function onRefund(orderId) {
-    uni.showModal({
-      title: '提示',
-      content: '确定要申请退款吗?',
-      success: async function (res) {
-        if (res.confirm) {
-          const { error, data } = await sheep.$api.order.applyRefund(orderId);
-          if (error === 0) {
-            getOrderDetail(data.order_sn);
-          }
-        }
-      },
-    });
-  }
-
-  // 查看物流
-  async function onExpress(orderId) {
-    sheep.$router.go('/pages/order/express/list', {
-      orderId,
-    });
-  }
-
-  //确认收货
-  async function onConfirm(orderId, ignore = false) {
-    // 需开启确认收货组件
-    // todo:
-    // 1.怎么检测是否开启了发货组件功能?如果没有开启的话就不能在这里return出去
-    // 2.如果开启了走mpConfirm方法,需要在App.vue的show方法中拿到确认收货结果
-    let isOpenBusinessView = true;
-    if (
-      sheep.$platform.name === 'WechatMiniProgram' &&
-      !isEmpty(state.orderInfo.wechat_extra_data) &&
-      isOpenBusinessView &&
-      !ignore
-    ) {
-      mpConfirm(orderId);
-      return;
-    }
-
-    // 正常的确认收货流程
-    const { error, data } = await sheep.$api.order.confirm(orderId);
-    if (error === 0) {
-      getOrderDetail(data.order_sn);
-    }
-  }
-
-  // #ifdef MP-WEIXIN
-  // 小程序确认收货组件
-  function mpConfirm(orderId) {
-    if (!wx.openBusinessView) {
-      sheep.$helper.toast(`请升级微信版本`);
-      return;
-    }
-    wx.openBusinessView({
-      businessType: 'weappOrderConfirm',
-      extraData: {
-        merchant_trade_no: state.orderInfo.wechat_extra_data.merchant_trade_no,
-        transaction_id: state.orderInfo.wechat_extra_data.transaction_id,
-      },
-      success(response) {
-        console.log('success:', response);
-        if (response.errMsg === 'openBusinessView:ok') {
-          if (response.extraData.status === 'success') {
-            onConfirm(orderId, true);
-          }
-        }
-      },
-      fail(error) {
-        console.log('error:', error);
-      },
-      complete(result) {
-        console.log('result:', result);
-      },
-    });
-  }
-  // #endif
-
-  // 查看发票
-  function onOrderInvoice(invoiceId) {
-    sheep.$router.go('/pages/order/invoice', {
-      invoiceId,
-    });
-  }
-
-  // 配送方式详情
-  function onDetail(item) {
-    sheep.$router.go('/pages/order/dispatch/content', {
-      id: item.order_id,
-      item_id: item.id,
-    });
-  }
-
-  // 评价
-  function onComment(orderSN) {
-    uni.$once('SELECT_INVOICE', (e) => {
-      state.invoiceInfo = e.invoiceInfo;
-    });
-    sheep.$router.go('/pages/goods/comment/add', {
-      orderSN,
-    });
-  }
-  async function getOrderDetail(id) {
-    let res = {};
-    if (state.comeinType === 'wechat') {
-      res = await sheep.$api.order.detail(id, {
-        merchant_trade_no: state.merchantTradeNo,
-      });
-    } else {
-      res = await sheep.$api.order.detail(id);
-    }
-    if (res.error === 0) {
-      state.orderInfo = res.data;
-    } else {
-      sheep.$router.back();
-    }
-  }
-
-  onLoad(async (options) => {
-    let id = 0;
-    if (options.orderSN) {
-      id = options.orderSN;
-    }
-    if (options.id) {
-      id = options.id;
-    }
-    state.comeinType = options.comein_type;
-    if (state.comeinType === 'wechat') {
-      state.merchantTradeNo = options.merchant_trade_no;
-    }
-    getOrderDetail(id);
-  });
+	import sheep from '@/sheep';
+	import {
+		onLoad
+	} from '@dcloudio/uni-app';
+	import {
+		computed,
+		reactive
+	} from 'vue';
+	import {
+		isEmpty
+	} from 'lodash';
+
+	const statusBarHeight = sheep.$platform.device.statusBarHeight * 2;
+	const headerBg = sheep.$url.css('/static/img/shop/order/order_bg.png');
+	const tradeManaged = computed(() => sheep.$store('app').has_wechat_trade_managed);
+
+	const state = reactive({
+		orderInfo: {},
+		merchantTradeNo: '', // 商户订单号
+		comeinType: '', // 进入订单详情的来源类型
+	});
+
+	const addressText = computed(() => {
+		let data = state.orderInfo.address;
+		if (data) {
+			return `${data.province_name} ${data.city_name} ${data.district_name} ${data.address}`;
+		}
+		return '';
+	});
+
+	// 复制
+	const onCopy = () => {
+		sheep.$helper.copyText(state.orderInfo.order_sn);
+	};
+	//退款总额
+	const refundFee = computed(() => {
+		let refundFee = 0;
+		state.orderInfo.items?.forEach((i) => {
+			refundFee += Number(i.refund_fee);
+		});
+		return refundFee;
+	});
+	// 去支付
+	function onPay(orderSN) {
+		sheep.$router.go('/pages/pay/index', {
+			orderSN,
+		});
+	}
+
+	function onGoodsDetail(id) {
+		sheep.$router.go('/pages/goods/index', {
+			id
+		});
+	}
+
+	// 取消订单
+	async function onCancel(orderId) {
+		uni.showModal({
+			title: '提示',
+			content: '确定要取消订单吗?',
+			success: async function(res) {
+				if (res.confirm) {
+					const {
+						error,
+						data
+					} = await sheep.$api.order.cancel(orderId);
+					if (error === 0) {
+						getOrderDetail(data.order_sn);
+					}
+				}
+			},
+		});
+	}
+
+	// 申请退款
+	async function onRefund(orderId) {
+		uni.showModal({
+			title: '提示',
+			content: '确定要申请退款吗?',
+			success: async function(res) {
+				if (res.confirm) {
+					const {
+						error,
+						data
+					} = await sheep.$api.order.applyRefund(orderId);
+					if (error === 0) {
+						getOrderDetail(data.order_sn);
+					}
+				}
+			},
+		});
+	}
+
+	// 查看物流
+	async function onExpress(orderId) {
+		sheep.$router.go('/pages/order/express/list', {
+			orderId,
+		});
+	}
+
+	//确认收货
+	async function onConfirm(orderId, ignore = false) {
+		// 需开启确认收货组件
+		// todo:
+		// 1.怎么检测是否开启了发货组件功能?如果没有开启的话就不能在这里return出去
+		// 2.如果开启了走mpConfirm方法,需要在App.vue的show方法中拿到确认收货结果
+		let isOpenBusinessView = true;
+		if (
+			sheep.$platform.name === 'WechatMiniProgram' &&
+			!isEmpty(state.orderInfo.wechat_extra_data) &&
+			isOpenBusinessView &&
+			!ignore
+		) {
+			mpConfirm(orderId);
+			return;
+		}
+
+		// 正常的确认收货流程
+		const {
+			error,
+			data
+		} = await sheep.$api.order.confirm(orderId);
+		if (error === 0) {
+			getOrderDetail(data.order_sn);
+		}
+	}
+
+	// #ifdef MP-WEIXIN
+	// 小程序确认收货组件
+	function mpConfirm(orderId) {
+		if (!wx.openBusinessView) {
+			sheep.$helper.toast(`请升级微信版本`);
+			return;
+		}
+		wx.openBusinessView({
+			businessType: 'weappOrderConfirm',
+			extraData: {
+				merchant_trade_no: state.orderInfo.wechat_extra_data.merchant_trade_no,
+				transaction_id: state.orderInfo.wechat_extra_data.transaction_id,
+			},
+			success(response) {
+				console.log('success:', response);
+				if (response.errMsg === 'openBusinessView:ok') {
+					if (response.extraData.status === 'success') {
+						onConfirm(orderId, true);
+					}
+				}
+			},
+			fail(error) {
+				console.log('error:', error);
+			},
+			complete(result) {
+				console.log('result:', result);
+			},
+		});
+	}
+	// #endif
+
+	// 查看发票
+	function onOrderInvoice(invoiceId) {
+		sheep.$router.go('/pages/order/invoice', {
+			invoiceId,
+		});
+	}
+
+	// 配送方式详情
+	function onDetail(item) {
+		sheep.$router.go('/pages/order/dispatch/content', {
+			id: item.order_id,
+			item_id: item.id,
+		});
+	}
+
+	// 评价
+	function onComment(orderSN, orderId) {
+		console.log(orderId);
+		// return;
+		uni.$once('SELECT_INVOICE', (e) => {
+			state.invoiceInfo = e.invoiceInfo;
+		});
+		sheep.$router.go('/pages/goods/comment/add', {
+			orderSN,
+			orderId
+		});
+	}
+	async function getOrderDetail(id) {
+		// 对详情数据进行适配
+		let res = {};
+		if (state.comeinType === 'wechat') {
+			res = await sheep.$api.order.detail(id, {
+				merchant_trade_no: state.merchantTradeNo,
+			});
+		} else {
+			res = await sheep.$api.order.detail(id);
+		}
+		console.log(res, '我的订单详情数据');
+		if (res.code === 0) {
+			let obj = {
+				10: ['待发货', '等待买家付款', ["apply_refund"]],
+				30: ['待评价', '等待买家评价', ["express", "comment"]]
+			}
+			res.data.status_text = obj[res.data.status][0];
+			res.data.status_desc = obj[res.data.status][1];
+			res.data.btns = obj[res.data.status][2];
+			res.data.address = {
+				province_name: res.data.receiverAreaName.split(' ')[0],
+				district_name: res.data.receiverAreaName.split(' ')[2],
+				city_name: res.data.receiverAreaName.split(' ')[1],
+				address: res.data.receiverDetailAddress,
+				consignee: res.data.receiverName,
+				mobile: res.data.receiverMobile,
+			}
+			res.data.pay_fee = res.data.payPrice / 100
+			res.data.create_time = sheep.$helper.timeFormat(res.data.createTime, 'yyyy-mm-dd hh:MM:ss')
+			res.data.order_sn = res.data.no
+			res.data.goods_amount = res.data.totalPrice / 100
+			res.data.dispatch_amount = res.data.deliveryPrice / 100
+			res.data.pay_types_text = res.data.payChannelName.split(',')
+			res.data.items = res.data.items.map(ite => {
+
+				return {
+					...ite,
+					goods_title: ite.spuName,
+					goods_num: ite.count,
+					goods_price: ite.price / 100,
+					goods_image: ite.picUrl,
+					goods_sku_text: ite.properties.reduce((it0, it1) => it0 + it1.valueName + ' ', '')
+				}
+			})
+			state.orderInfo = res.data;
+			console.log(state.orderInfo, '修改后数据')
+		} else {
+			sheep.$router.back();
+		}
+	}
+
+	onLoad(async (options) => {
+		let id = 0;
+		if (options.orderSN) {
+			id = options.orderSN;
+		}
+		if (options.id) {
+			id = options.id;
+		}
+		state.comeinType = options.comein_type;
+		if (state.comeinType === 'wechat') {
+			state.merchantTradeNo = options.merchant_trade_no;
+		}
+		getOrderDetail(id);
+	});
 </script>
 
 <style lang="scss" scoped>
-  .score-img {
-    width: 36rpx;
-    height: 36rpx;
-    margin: 0 4rpx;
-  }
-  .apply-btn {
-    width: 140rpx;
-    height: 50rpx;
-    border-radius: 25rpx;
-    font-size: 24rpx;
-    border: 2rpx solid #dcdcdc;
-    line-height: normal;
-    margin-left: 16rpx;
-  }
-  .state-box {
-    color: rgba(#fff, 0.9);
-    width: 100%;
-    background: v-bind(headerBg) no-repeat,
-      linear-gradient(90deg, var(--ui-BG-Main), var(--ui-BG-Main-gradient));
-    background-size: 750rpx 100%;
-    box-sizing: border-box;
-    .state-img {
-      width: 60rpx;
-      height: 60rpx;
-      margin-right: 20rpx;
-    }
-  }
-
-  .order-address-box {
-    background-color: #fff;
-    border-radius: 10rpx;
-    margin: -50rpx 20rpx 16rpx 20rpx;
-    padding: 44rpx 34rpx 42rpx 20rpx;
-    font-size: 30rpx;
-    box-sizing: border-box;
-    font-weight: 500;
-    color: rgba(51, 51, 51, 1);
-
-    .address-username {
-      margin-right: 20rpx;
-    }
-
-    .address-detail {
-      font-size: 26rpx;
-      font-weight: 500;
-      color: rgba(153, 153, 153, 1);
-      margin-top: 20rpx;
-    }
-  }
-
-  .detail-goods {
-    border-radius: 10rpx;
-    margin: 0 20rpx 20rpx 20rpx;
-
-    .order-list {
-      margin-bottom: 20rpx;
-      background-color: #fff;
-
-      .order-card {
-        padding: 20rpx 0;
-
-        .order-sku {
-          font-size: 24rpx;
-
-          font-weight: 400;
-          color: rgba(153, 153, 153, 1);
-          width: 450rpx;
-          margin-bottom: 20rpx;
-
-          .order-num {
-            margin-right: 10rpx;
-          }
-        }
-        .tag-btn {
-          margin-left: 16rpx;
-          font-size: 24rpx;
-          height: 36rpx;
-          color: var(--ui-BG-Main);
-          border: 2rpx solid var(--ui-BG-Main);
-          border-radius: 14rpx;
-          padding: 0 4rpx;
-        }
-      }
-    }
-  }
-
-  // 订单信息。
-  .notice-box {
-    background: #fff;
-    border-radius: 10rpx;
-    margin: 0 20rpx 20rpx 20rpx;
-
-    .notice-box__head {
-      font-size: 30rpx;
-
-      font-weight: 500;
-      color: rgba(51, 51, 51, 1);
-      line-height: 80rpx;
-      border-bottom: 1rpx solid #dfdfdf;
-      padding: 0 25rpx;
-    }
-
-    .notice-box__content {
-      padding: 20rpx;
-
-      .self-pickup-box {
-        width: 100%;
-
-        .self-pickup--img {
-          width: 200rpx;
-          height: 200rpx;
-          margin: 40rpx 0;
-        }
-      }
-    }
-
-    .notice-item,
-    .notice-item--center {
-      display: flex;
-      align-items: center;
-      line-height: normal;
-      margin-bottom: 24rpx;
-
-      .title {
-        font-size: 28rpx;
-        color: #999;
-      }
-
-      .detail {
-        font-size: 28rpx;
-        color: #333;
-        flex: 1;
-      }
-    }
-  }
-  .copy-btn {
-    width: 100rpx;
-    line-height: 50rpx;
-    border-radius: 25rpx;
-    padding: 0;
-    background: rgba(238, 238, 238, 1);
-    font-size: 22rpx;
-    font-weight: 400;
-    color: rgba(51, 51, 51, 1);
-  }
-
-  // 订单价格信息
-  .order-price-box {
-    background-color: #fff;
-    border-radius: 10rpx;
-    padding: 20rpx;
-    margin: 0 20rpx 20rpx 20rpx;
-
-    .notice-item {
-      line-height: 70rpx;
-
-      .title {
-        font-size: 28rpx;
-        color: #999;
-      }
-
-      .detail {
-        font-size: 28rpx;
-        color: #333;
-        font-family: OPPOSANS;
-      }
-    }
-
-    .all-rpice-item {
-      justify-content: flex-end;
-      align-items: center;
-
-      .title {
-        font-size: 26rpx;
-        font-weight: 500;
-        color: #333333;
-        line-height: normal;
-      }
-
-      .all-price {
-        font-size: 26rpx;
-        font-family: OPPOSANS;
-        line-height: normal;
-        color: $red;
-      }
-    }
-  }
-
-  // 底部
-  .footer-box {
-    height: 100rpx;
-    width: 100%;
-    box-sizing: border-box;
-    border-radius: 10rpx;
-    padding-right: 20rpx;
-
-    .cancel-btn {
-      width: 160rpx;
-      height: 60rpx;
-      background: #eeeeee;
-      border-radius: 30rpx;
-      margin-right: 20rpx;
-      font-size: 26rpx;
-      font-weight: 400;
-      color: #333333;
-    }
-
-    .pay-btn {
-      width: 160rpx;
-      height: 60rpx;
-      font-size: 26rpx;
-      border-radius: 30rpx;
-      font-weight: 500;
-      color: #fff;
-    }
-  }
-</style>
+	.score-img {
+		width: 36rpx;
+		height: 36rpx;
+		margin: 0 4rpx;
+	}
+
+	.apply-btn {
+		width: 140rpx;
+		height: 50rpx;
+		border-radius: 25rpx;
+		font-size: 24rpx;
+		border: 2rpx solid #dcdcdc;
+		line-height: normal;
+		margin-left: 16rpx;
+	}
+
+	.state-box {
+		color: rgba(#fff, 0.9);
+		width: 100%;
+		background: v-bind(headerBg) no-repeat,
+			linear-gradient(90deg, var(--ui-BG-Main), var(--ui-BG-Main-gradient));
+		background-size: 750rpx 100%;
+		box-sizing: border-box;
+
+		.state-img {
+			width: 60rpx;
+			height: 60rpx;
+			margin-right: 20rpx;
+		}
+	}
+
+	.order-address-box {
+		background-color: #fff;
+		border-radius: 10rpx;
+		margin: -50rpx 20rpx 16rpx 20rpx;
+		padding: 44rpx 34rpx 42rpx 20rpx;
+		font-size: 30rpx;
+		box-sizing: border-box;
+		font-weight: 500;
+		color: rgba(51, 51, 51, 1);
+
+		.address-username {
+			margin-right: 20rpx;
+		}
+
+		.address-detail {
+			font-size: 26rpx;
+			font-weight: 500;
+			color: rgba(153, 153, 153, 1);
+			margin-top: 20rpx;
+		}
+	}
+
+	.detail-goods {
+		border-radius: 10rpx;
+		margin: 0 20rpx 20rpx 20rpx;
+
+		.order-list {
+			margin-bottom: 20rpx;
+			background-color: #fff;
+
+			.order-card {
+				padding: 20rpx 0;
+
+				.order-sku {
+					font-size: 24rpx;
+
+					font-weight: 400;
+					color: rgba(153, 153, 153, 1);
+					width: 450rpx;
+					margin-bottom: 20rpx;
+
+					.order-num {
+						margin-right: 10rpx;
+					}
+				}
+
+				.tag-btn {
+					margin-left: 16rpx;
+					font-size: 24rpx;
+					height: 36rpx;
+					color: var(--ui-BG-Main);
+					border: 2rpx solid var(--ui-BG-Main);
+					border-radius: 14rpx;
+					padding: 0 4rpx;
+				}
+			}
+		}
+	}
+
+	// 订单信息。
+	.notice-box {
+		background: #fff;
+		border-radius: 10rpx;
+		margin: 0 20rpx 20rpx 20rpx;
+
+		.notice-box__head {
+			font-size: 30rpx;
+
+			font-weight: 500;
+			color: rgba(51, 51, 51, 1);
+			line-height: 80rpx;
+			border-bottom: 1rpx solid #dfdfdf;
+			padding: 0 25rpx;
+		}
+
+		.notice-box__content {
+			padding: 20rpx;
+
+			.self-pickup-box {
+				width: 100%;
+
+				.self-pickup--img {
+					width: 200rpx;
+					height: 200rpx;
+					margin: 40rpx 0;
+				}
+			}
+		}
+
+		.notice-item,
+		.notice-item--center {
+			display: flex;
+			align-items: center;
+			line-height: normal;
+			margin-bottom: 24rpx;
+
+			.title {
+				font-size: 28rpx;
+				color: #999;
+			}
+
+			.detail {
+				font-size: 28rpx;
+				color: #333;
+				flex: 1;
+			}
+		}
+	}
+
+	.copy-btn {
+		width: 100rpx;
+		line-height: 50rpx;
+		border-radius: 25rpx;
+		padding: 0;
+		background: rgba(238, 238, 238, 1);
+		font-size: 22rpx;
+		font-weight: 400;
+		color: rgba(51, 51, 51, 1);
+	}
+
+	// 订单价格信息
+	.order-price-box {
+		background-color: #fff;
+		border-radius: 10rpx;
+		padding: 20rpx;
+		margin: 0 20rpx 20rpx 20rpx;
+
+		.notice-item {
+			line-height: 70rpx;
+
+			.title {
+				font-size: 28rpx;
+				color: #999;
+			}
+
+			.detail {
+				font-size: 28rpx;
+				color: #333;
+				font-family: OPPOSANS;
+			}
+		}
+
+		.all-rpice-item {
+			justify-content: flex-end;
+			align-items: center;
+
+			.title {
+				font-size: 26rpx;
+				font-weight: 500;
+				color: #333333;
+				line-height: normal;
+			}
+
+			.all-price {
+				font-size: 26rpx;
+				font-family: OPPOSANS;
+				line-height: normal;
+				color: $red;
+			}
+		}
+	}
+
+	// 底部
+	.footer-box {
+		height: 100rpx;
+		width: 100%;
+		box-sizing: border-box;
+		border-radius: 10rpx;
+		padding-right: 20rpx;
+
+		.cancel-btn {
+			width: 160rpx;
+			height: 60rpx;
+			background: #eeeeee;
+			border-radius: 30rpx;
+			margin-right: 20rpx;
+			font-size: 26rpx;
+			font-weight: 400;
+			color: #333333;
+		}
+
+		.pay-btn {
+			width: 160rpx;
+			height: 60rpx;
+			font-size: 26rpx;
+			border-radius: 30rpx;
+			font-weight: 500;
+			color: #fff;
+		}
+	}
+</style>

+ 7 - 6
pages/order/list.vue

@@ -7,7 +7,7 @@
 		<s-empty v-if="state.pagination.total === 0" icon="/static/order-empty.png" text="暂无订单"></s-empty>
 		<view v-if="state.pagination.total > 0">
 			<view class="bg-white order-list-card-box ss-r-10 ss-m-t-14 ss-m-20" v-for="order in state.pagination.data"
-				:key="order.id" @tap="onOrderDetail(order.no)">
+				:key="order.id" @tap="onOrderDetail(order.id)">
 				<view class="order-card-header ss-flex ss-col-center ss-row-between ss-p-x-20">
 					<view class="order-no">订单号:{{ order.no }}</view>
 					<view class="order-state ss-font-26" :class="formatOrderColor(order.status_code)">{{
@@ -15,7 +15,8 @@
           }}</view>
 				</view>
 				<view class="border-bottom" v-for="item in order.items" :key="item.id">
-					<s-goods-item :img="item.picUrl" :title="item.spuName" :skuText="item.properties.length>1? item.properties.reduce((items2,items)=>items2.valueName+' '+items.valueName):item.properties[0].valueName"
+					<s-goods-item :img="item.picUrl" :title="item.spuName"
+						:skuText="item.properties.length>1? item.properties.reduce((items2,items)=>items2.valueName+' '+items.valueName):item.properties[0].valueName"
 						:price="item.price/100" :score="order.score_amount" :num="item.count">
 						<template #tool>
 							<view class="ss-flex">
@@ -61,7 +62,7 @@
 						<view class="discounts-title">优惠:¥</view>
 						<view class="discounts-money">{{ order.total_discount_fee }}</view>
 					</view> -->
-				<!-- 	<view class="ss-flex ss-col-center ss-m-r-8">
+					<!-- 	<view class="ss-flex ss-col-center ss-m-r-8">
 						<view class="discounts-title">运费:¥</view>
 						<view class="discounts-money">{{ order.dispatch_amount }}</view>
 					</view> -->
@@ -96,7 +97,7 @@
             </template>
           </su-popover> -->
 					<view class="ss-flex ss-col-center">
-		<!-- 				<button v-if="order.btns.includes('groupon')" class="tool-btn ss-reset-button"
+						<!-- 				<button v-if="order.btns.includes('groupon')" class="tool-btn ss-reset-button"
 							@tap.stop="onOrderGroupon(order)">
 							{{ order.status_code === 'groupon_ing' ? '邀请拼团' : '拼团详情' }}
 						</button>
@@ -402,7 +403,7 @@
 			status: tabMaps[state.currentTab].value,
 			pageSize: list_rows,
 			pageNo: page,
-			commentStatus: tabMaps[state.currentTab].value==30?false:null
+			commentStatus: tabMaps[state.currentTab].value == 30 ? false : null
 		});
 		state.error = res.code;
 		if (res.code === 0) {
@@ -430,7 +431,7 @@
 	// 加载更多
 	function loadmore() {
 		if (state.loadStatus !== 'noMore') {
-			getOrderList(parseInt((state.pagination.data.length/5)+1));
+			getOrderList(parseInt((state.pagination.data.length / 5) + 1));
 		}
 	}
 

+ 133 - 139
pages/user/address/list.vue

@@ -1,153 +1,147 @@
 <template>
-  <s-layout title="收货地址" :bgStyle="{ color: '#FFF' }">
-    <view v-if="state.list.length">
-      <s-address-item
-        hasBorderBottom
-        v-for="item in state.list"
-        :key="item.id"
-        :item="item"
-        @tap="onSelect(item)"
-      >
-      </s-address-item>
-    </view>
+	<s-layout title="收货地址" :bgStyle="{ color: '#FFF' }">
+		<view v-if="state.list.length">
+			<s-address-item hasBorderBottom v-for="item in state.list" :key="item.id" :item="item"
+				@tap="onSelect(item)">
+			</s-address-item>
+		</view>
 
-    <su-fixed bottom placeholder>
-      <view class="footer-box ss-flex ss-row-between ss-p-20">
-        <!-- 微信小程序和微信H5 -->
-        <button
-          v-if="['WechatMiniProgram', 'WechatOfficialAccount'].includes(sheep.$platform.name)"
-          @tap="importWechatAddress"
-          class="border ss-reset-button sync-wxaddress ss-m-20 ss-flex ss-row-center ss-col-center"
-        >
-          <text class="cicon-weixin ss-p-r-10" style="color: #09bb07; font-size: 40rpx"></text>
-          导入微信地址
-        </button>
-        <button
-          class="add-btn ss-reset-button ui-Shadow-Main"
-          @tap="sheep.$router.go('/pages/user/address/edit')"
-        >
-          新增收货地址
-        </button>
-      </view>
-    </su-fixed>
-    <s-empty
-      v-if="state.list.length === 0 && !state.loading"
-      text="暂无收货地址"
-      icon="/static/data-empty.png"
-    />
-  </s-layout>
+		<su-fixed bottom placeholder>
+			<view class="footer-box ss-flex ss-row-between ss-p-20">
+				<!-- 微信小程序和微信H5 -->
+				<button v-if="['WechatMiniProgram', 'WechatOfficialAccount'].includes(sheep.$platform.name)"
+					@tap="importWechatAddress"
+					class="border ss-reset-button sync-wxaddress ss-m-20 ss-flex ss-row-center ss-col-center">
+					<text class="cicon-weixin ss-p-r-10" style="color: #09bb07; font-size: 40rpx"></text>
+					导入微信地址
+				</button>
+				<button class="add-btn ss-reset-button ui-Shadow-Main"
+					@tap="sheep.$router.go('/pages/user/address/edit')">
+					新增收货地址
+				</button>
+			</view>
+		</su-fixed>
+		<s-empty v-if="state.list.length === 0 && !state.loading" text="暂无收货地址" icon="/static/data-empty.png" />
+	</s-layout>
 </template>
 
 <script setup>
-  import { reactive, onBeforeMount } from 'vue';
-  import { onShow } from '@dcloudio/uni-app';
-  import sheep from '@/sheep';
-  import { isEmpty } from 'lodash';
+	import {
+		reactive,
+		onBeforeMount
+	} from 'vue';
+	import {
+		onShow
+	} from '@dcloudio/uni-app';
+	import sheep from '@/sheep';
+	import {
+		isEmpty
+	} from 'lodash';
 
-  const state = reactive({
-    list: [],
-    loading: true,
-  });
+	const state = reactive({
+		list: [],
+		loading: true,
+	});
 
-  // 选择收货地址
-  const onSelect = (addressInfo) => {
-    uni.$emit('SELECT_ADDRESS', {
-      addressInfo,
-    });
-    sheep.$router.back();
-  };
+	// 选择收货地址
+	const onSelect = (addressInfo) => {
+		uni.$emit('SELECT_ADDRESS', {
+			addressInfo,
+		});
+		sheep.$router.back();
+	};
 
-  // 导入微信地址
-  function importWechatAddress() {
-    let wechatAddress = {};
-    // #ifdef MP
-    uni.chooseAddress({
-      success: (res) => {
-        wechatAddress = {
-          consignee: res.userName,
-          mobile: res.telNumber,
-          province_name: res.provinceName,
-          city_name: res.cityName,
-          district_name: res.countyName,
-          address: res.detailInfo,
-          region: '',
-          is_default: false,
-        };
-        if (!isEmpty(wechatAddress)) {
-          sheep.$router.go('/pages/user/address/edit', {
-            data: JSON.stringify(wechatAddress),
-          });
-        }
-      },
-      fail: (err) => {
-        console.log('%cuni.chooseAddress,调用失败', 'color:green;background:yellow');
-      },
-    });
-    // #endif
-    // #ifdef H5
-    sheep.$platform.useProvider('wechat').jssdk.openAddress({
-      success: (res) => {
-        wechatAddress = {
-          consignee: res.userName,
-          mobile: res.telNumber,
-          province_name: res.provinceName,
-          city_name: res.cityName,
-          district_name: res.countryName,
-          address: res.detailInfo,
-          region: '',
-          is_default: false,
-        };
-        if (!isEmpty(wechatAddress)) {
-          sheep.$router.go('/pages/user/address/edit', {
-            data: JSON.stringify(wechatAddress),
-          });
-        }
-      },
-    });
-    // #endif
-  }
+	// 导入微信地址
+	function importWechatAddress() {
+		let wechatAddress = {};
+		// #ifdef MP
+		uni.chooseAddress({
+			success: (res) => {
+				wechatAddress = {
+					consignee: res.userName,
+					mobile: res.telNumber,
+					province_name: res.provinceName,
+					city_name: res.cityName,
+					district_name: res.countyName,
+					address: res.detailInfo,
+					region: '',
+					is_default: false,
+				};
+				if (!isEmpty(wechatAddress)) {
+					sheep.$router.go('/pages/user/address/edit', {
+						data: JSON.stringify(wechatAddress),
+					});
+				}
+			},
+			fail: (err) => {
+				console.log('%cuni.chooseAddress,调用失败', 'color:green;background:yellow');
+			},
+		});
+		// #endif
+		// #ifdef H5
+		sheep.$platform.useProvider('wechat').jssdk.openAddress({
+			success: (res) => {
+				wechatAddress = {
+					consignee: res.userName,
+					mobile: res.telNumber,
+					province_name: res.provinceName,
+					city_name: res.cityName,
+					district_name: res.countryName,
+					address: res.detailInfo,
+					region: '',
+					is_default: false,
+				};
+				if (!isEmpty(wechatAddress)) {
+					sheep.$router.go('/pages/user/address/edit', {
+						data: JSON.stringify(wechatAddress),
+					});
+				}
+			},
+		});
+		// #endif
+	}
 
-  onShow(async () => {
-    state.list = (await sheep.$api.user.address.list()).data;
-    state.loading = false;
-  });
+	onShow(async () => {
+		state.list = (await sheep.$api.user.address.list()).data;
+		state.loading = false;
+	});
 
-  onBeforeMount(() => {
-    if (!!uni.getStorageSync('areaData')) {
-      return;
-    }
-    // 提前加载省市区数据
-    sheep.$api.data.area().then((res) => {
-      if (res.error === 0) {
-        uni.setStorageSync('areaData', res.data);
-      }
-    });
-  });
+	onBeforeMount(() => {
+		if (!!uni.getStorageSync('areaData')) {
+			return;
+		}
+		// 提前加载省市区数据
+		sheep.$api.data.area().then((res) => {
+			if (res.error === 0) {
+				uni.setStorageSync('areaData', res.data);
+			}
+		});
+	});
 </script>
 
 <style lang="scss" scoped>
-  .footer-box {
-    .add-btn {
-      flex: 1;
-      background: linear-gradient(90deg, var(--ui-BG-Main), var(--ui-BG-Main-gradient));
-      border-radius: 80rpx;
-      font-size: 30rpx;
-      font-weight: 500;
-      line-height: 80rpx;
-      color: $white;
-      position: relative;
-      z-index: 1;
-    }
+	.footer-box {
+		.add-btn {
+			flex: 1;
+			background: linear-gradient(90deg, var(--ui-BG-Main), var(--ui-BG-Main-gradient));
+			border-radius: 80rpx;
+			font-size: 30rpx;
+			font-weight: 500;
+			line-height: 80rpx;
+			color: $white;
+			position: relative;
+			z-index: 1;
+		}
 
-    .sync-wxaddress {
-      flex: 1;
-      line-height: 80rpx;
-      background: $white;
-      border-radius: 80rpx;
-      font-size: 30rpx;
-      font-weight: 500;
-      color: $dark-6;
-      margin-right: 18rpx;
-    }
-  }
-</style>
+		.sync-wxaddress {
+			flex: 1;
+			line-height: 80rpx;
+			background: $white;
+			border-radius: 80rpx;
+			font-size: 30rpx;
+			font-weight: 500;
+			color: $dark-6;
+			margin-right: 18rpx;
+		}
+	}
+</style>

+ 7 - 6
pages/user/wallet/money.vue

@@ -20,7 +20,7 @@
 		<su-sticky>
 			<!-- 统计 -->
 			<view class="filter-box ss-p-x-30 ss-flex ss-col-center ss-row-between">
-<!-- 				<uni-datetime-picker v-model="state.data" type="daterange" @change="onChangeTime" :end="state.today">
+				<!-- 				<uni-datetime-picker v-model="state.data" type="daterange" @change="onChangeTime" :end="state.today">
 					<button class="ss-reset-button date-btn">
 						<text>{{ dateFilterText }}</text>
 						<text class="cicon-drop-down ss-seldate-icon"></text>
@@ -28,9 +28,9 @@
 				</uni-datetime-picker> -->
 
 				<view class="total-box">
-					 <!-- state.pagination.income.toFixed(2) -->
-					<view class="ss-m-b-10">总收入¥{{ }}</view>
-					<view>总支出¥{{  }}</view>
+					<!-- state.pagination.income.toFixed(2) -->
+					<!-- 		<view class="ss-m-b-10">总收入¥{{ }}</view>
+					<view>总支出¥{{  }}</view> -->
 					<!-- (-state.pagination.expense).toFixed(2) -->
 				</view>
 			</view>
@@ -45,7 +45,8 @@
 						<!-- <text class="title ss-line-1">{{ item.event_text }}{{ item.memo ? '-' + item.memo : '' }}</text> -->
 						<text class="title ss-line-1">{{ item.title }}</text>
 						<view class="money">
-							<text v-if="(item.amount >= 0||item.price>=0)" class="add">+{{ item.amount||item.price }}</text>
+							<text v-if="(item.amount >= 0||item.price>=0)"
+								class="add">+{{ item.amount||item.price }}</text>
 							<text v-else class="minus">{{ item.price }}</text>
 						</view>
 					</view>
@@ -133,7 +134,7 @@
 				income: res.data.income,
 				expense: res.data.expense,
 			};
-			console.log('交易数据',state.pagination)
+			console.log('交易数据', state.pagination)
 			if (state.pagination.current_page < state.pagination.last_page) {
 				state.loadStatus = 'more';
 			} else {

+ 266 - 268
pages/user/wallet/score.vue

@@ -1,281 +1,279 @@
 <!-- 页面  -->
 <template>
-  <s-layout class="wallet-wrap" title="我的积分" navbar="inner">
-    <view
-      class="header-box ss-flex ss-flex-col ss-row-center ss-col-center"
-      :style="[
+	<s-layout class="wallet-wrap" title="我的积分" navbar="inner">
+		<view class="header-box ss-flex ss-flex-col ss-row-center ss-col-center" :style="[
         {
           marginTop: '-' + Number(statusBarHeight + 88) + 'rpx',
           paddingTop: Number(statusBarHeight + 88) + 'rpx',
         },
-      ]"
-    >
-      <view class="header-bg"><view class="bg"></view></view>
-      <view class="score-box ss-flex-col ss-row-center ss-col-center">
-        <view class="ss-m-b-30">
-          <text class="all-title ss-m-r-8">当前积分</text>
-          <!-- <text class="cicon-help-o"></text> -->
-        </view>
-        <text class="all-num">{{ userInfo.score || 0 }}</text>
-      </view>
-    </view>
-    <!-- tab -->
-    <su-sticky :customNavHeight="sys_navBar">
-      <!-- 统计 -->
-      <view class="filter-box ss-p-x-30 ss-flex ss-col-center ss-row-between">
-        <uni-datetime-picker v-model="state.data" type="daterange" @change="onChangeTime" :end="state.today">
-          <button class="ss-reset-button date-btn">
-            <text>{{ dateFilterText }}</text>
-            <text class="cicon-drop-down ss-seldate-icon"></text>
-          </button>
-        </uni-datetime-picker>
-
-        <view class="total-box">
-          <view class="ss-m-b-10">总收入¥{{ state.pagination.income }}</view>
-          <view>总支出¥{{ -state.pagination.expense }}</view>
-        </view>
-      </view>
-      <su-tabs
-        :list="tabMaps"
-        @change="onChange"
-        :scrollable="false"
-        :current="state.currentTab"
-      ></su-tabs>
-    </su-sticky>
-    <!-- list -->
-    <view class="list-box">
-      <view v-if="state.pagination.total > 0">
-        <view
-          class="list-item ss-flex ss-col-center ss-row-between"
-          v-for="item in state.pagination.data"
-          :key="item.id"
-        >
-          <view class="ss-flex-col">
-            <view class="name">{{ item.event_text }}{{ item.memo ? '-' + item.memo : '' }}</view>
-            <view class="time">{{ item.create_time }}</view>
-          </view>
-          <view class="add" v-if="item.amount > 0">+{{ parseInt(item.amount) }}</view>
-          <view class="minus" v-else>{{ parseInt(item.amount) }}</view>
-        </view>
-      </view>
-      <s-empty v-else text="暂无数据" icon="/static/data-empty.png" />
-    </view>
-
-    <uni-load-more
-      v-if="state.pagination.total > 0"
-      :status="state.loadStatus"
-      :content-text="{
+      ]">
+			<view class="header-bg">
+				<view class="bg"></view>
+			</view>
+			<view class="score-box ss-flex-col ss-row-center ss-col-center">
+				<view class="ss-m-b-30">
+					<text class="all-title ss-m-r-8">当前积分</text>
+					<!-- <text class="cicon-help-o"></text> -->
+				</view>
+				<text class="all-num">{{ userInfo.point || 0 }}</text>
+			</view>
+		</view>
+		<!-- tab -->
+		<su-sticky :customNavHeight="sys_navBar">
+			<!-- 统计 -->
+			<!-- 			<view class="filter-box ss-p-x-30 ss-flex ss-col-center ss-row-between">
+				<uni-datetime-picker v-model="state.data" type="daterange" @change="onChangeTime" :end="state.today">
+					<button class="ss-reset-button date-btn">
+						<text>{{ dateFilterText }}</text>
+						<text class="cicon-drop-down ss-seldate-icon"></text>
+					</button>
+				</uni-datetime-picker>
+
+				<view class="total-box">
+					<view class="ss-m-b-10">总收入¥{{ state.pagination.income }}</view>
+					<view>总支出¥{{ -state.pagination.expense }}</view>
+				</view>
+			</view> -->
+			<su-tabs :list="tabMaps" @change="onChange" :scrollable="false" :current="state.currentTab"></su-tabs>
+		</su-sticky>
+		<!-- list -->
+		<view class="list-box">
+			<view v-if="state.pagination.total > 0">
+				<view class="list-item ss-flex ss-col-center ss-row-between" v-for="item in state.pagination.data"
+					:key="item.id">
+					<view class="ss-flex-col">
+						<view class="name">{{ item.title }}{{ item.description ? '-' + item.description : '' }}</view>
+						<view class="time">{{ sheep.$helper.timeFormat(item.createTime, 'yyyy-mm-dd hh:MM:ss')}}</view>
+					</view>
+					<view class="add" v-if="item.point > 0">+{{ parseInt(item.point) }}</view>
+					<view class="minus" v-else>{{ parseInt(item.point) }}</view>
+				</view>
+			</view>
+			<s-empty v-else text="暂无数据" icon="/static/data-empty.png" />
+		</view>
+
+		<uni-load-more v-if="state.pagination.total > 0" :status="state.loadStatus" :content-text="{
         contentdown: '上拉加载更多',
-      }"
-      @tap="onLoadMore"
-    />
-  </s-layout>
+      }" @tap="onLoadMore" />
+	</s-layout>
 </template>
 
 <script setup>
-  import sheep from '@/sheep';
-  import { onLoad, onReachBottom } from '@dcloudio/uni-app';
-  import { computed, reactive } from 'vue';
-  import _ from 'lodash';
-  import dayjs from 'dayjs';
-  import { onPageScroll } from '@dcloudio/uni-app';
-  onPageScroll(() => {});
-
-  const statusBarHeight = sheep.$platform.device.statusBarHeight * 2;
-  const userInfo = computed(() => sheep.$store('user').userInfo);
-  const sys_navBar = sheep.$platform.navbar;
-
-  const pagination = {
-    data: [],
-    current_page: 1,
-    total: 1,
-    last_page: 1,
-    expense: 0,
-    income: 0,
-  };
-
-  const state = reactive({
-    currentTab: 0,
-    pagination,
-    loadStatus: '',
-    date: [],
-    today:'',
-  });
-
-  const tabMaps = [
-    {
-      name: '全部',
-      value: 'all',
-    },
-
-    {
-      name: '收入',
-      value: 'income',
-    },
-    {
-      name: '支出',
-      value: 'expense',
-    },
-  ];
-
-  const dateFilterText = computed(() => {
-    if (state.date[0] === state.date[1]) {
-      return state.date[0];
-    } else {
-      return state.date.join('~');
-    }
-  });
-
-  async function getLogList(page = 1, list_rows = 8) {
-    state.loadStatus = 'loading';
-    let res = await sheep.$api.user.wallet.log({
-      type: 'score',
-      list_rows,
-      page,
-      tab: tabMaps[state.currentTab].value,
-      date: appendTimeHMS(state.date),
-    });
-    if (res.error === 0) {
-      let list = _.concat(state.pagination.data, res.data.list.data);
-      state.pagination = {
-        ...res.data.list,
-        data: list,
-        income: res.data.income,
-        expense: res.data.expense,
-      };
-      if (state.pagination.current_page < state.pagination.last_page) {
-        state.loadStatus = 'more';
-      } else {
-        state.loadStatus = 'noMore';
-      }
-    }
-  }
-  onLoad(async (options) => {
-    state.today = dayjs().format('YYYY-MM-DD');
-    state.date = [state.today, state.today];
-    getLogList();
-  });
-
-  function onChange(e) {
-    state.pagination = pagination;
-    state.currentTab = e.index;
-    getLogList();
-  }
-  function onChangeTime(e) {
-    state.date[0] = e[0];
-    state.date[1] = e[e.length - 1];
-    state.pagination = pagination;
-    getLogList();
-  }
-
-  function appendTimeHMS(arr) {
-    return [arr[0] + ' 00:00:00', arr[1] + ' 23:59:59'];
-  }
-
-  function onLoadMore() {
-    if (state.loadStatus !== 'noMore') {
-      getLogList(state.pagination.current_page + 1);
-    }
-  }
-  onReachBottom(() => {
-    onLoadMore();
-  });
+	import sheep from '@/sheep';
+	import {
+		onLoad,
+		onReachBottom
+	} from '@dcloudio/uni-app';
+	import {
+		computed,
+		reactive
+	} from 'vue';
+	import _ from 'lodash';
+	import dayjs from 'dayjs';
+	import {
+		onPageScroll
+	} from '@dcloudio/uni-app';
+	onPageScroll(() => {});
+
+	const statusBarHeight = sheep.$platform.device.statusBarHeight * 2;
+	const userInfo = computed(() => sheep.$store('user').userInfo);
+	const sys_navBar = sheep.$platform.navbar;
+
+	const pagination = {
+		data: [],
+		current_page: 1,
+		total: 1,
+		last_page: 1,
+		expense: 0,
+		income: 0,
+	};
+
+	const state = reactive({
+		currentTab: 0,
+		pagination,
+		loadStatus: '',
+		date: [],
+		today: '',
+	});
+
+	const tabMaps = [{
+			name: '全部',
+			value: 'all',
+		},
+
+		// {
+		// 	name: '收入',
+		// 	value: 'income',
+		// },
+		// {
+		// 	name: '支出',
+		// 	value: 'expense',
+		// },
+	];
+
+	const dateFilterText = computed(() => {
+		if (state.date[0] === state.date[1]) {
+			return state.date[0];
+		} else {
+			return state.date.join('~');
+		}
+	});
+
+	async function getLogList(page = 1, list_rows = 8) {
+		pagination.current_page = page;
+		state.loadStatus = 'loading';
+		let res = await sheep.$api.user.wallet.log2({
+			// type: 'score',
+			pageSize: list_rows,
+			pageNo: page,
+			// tab: tabMaps[state.currentTab].value,
+			// date: appendTimeHMS(state.date),
+		});
+		console.log(res, '优惠券列表')
+		if (res.code === 0) {
+			let list = _.concat(state.pagination.data, res.data.list);
+			console.log(list, '处理后数据')
+			state.pagination = {
+				total: res.data.total,
+				...res.data.list,
+				data: list,
+				// income: res.data.income,
+				// expense: res.data.expense,
+			};
+			// if (state.pagination.current_page < state.pagination.last_page) {
+			state.loadStatus = 'more';
+			// } else {
+			// 	state.loadStatus = 'noMore';
+			// }
+		}
+	}
+	onLoad(async (options) => {
+		state.today = dayjs().format('YYYY-MM-DD');
+		state.date = [state.today, state.today];
+		getLogList();
+	});
+
+	function onChange(e) {
+		state.pagination = pagination;
+		state.currentTab = e.index;
+		getLogList();
+	}
+
+	function onChangeTime(e) {
+		state.date[0] = e[0];
+		state.date[1] = e[e.length - 1];
+		state.pagination = pagination;
+		getLogList();
+	}
+
+	function appendTimeHMS(arr) {
+		return [arr[0] + ' 00:00:00', arr[1] + ' 23:59:59'];
+	}
+
+	function onLoadMore() {
+		// if (state.loadStatus !== 'noMore') {
+		getLogList(pagination.current_page + 1);
+		// }
+	}
+	onReachBottom(() => {
+		onLoadMore();
+	});
 </script>
 
 <style lang="scss" scoped>
-  .header-box {
-    width: 100%;
-    background: linear-gradient(180deg, var(--ui-BG-Main) 0%, var(--ui-BG-Main-gradient) 100%)
-      no-repeat;
-    background-size: 750rpx 100%;
-    padding: 0 0 120rpx 0;
-    box-sizing: border-box;
-
-    .score-box {
-      height: 100%;
-
-      .all-num {
-        font-size: 50rpx;
-        font-weight: bold;
-        color: #fff;
-        font-family: OPPOSANS;
-      }
-
-      .all-title {
-        font-size: 26rpx;
-        font-weight: 500;
-        color: #fff;
-      }
-
-      .cicon-help-o {
-        color: #fff;
-        font-size: 28rpx;
-      }
-    }
-  }
-  // 筛选
-  .filter-box {
-    height: 114rpx;
-    background-color: $bg-page;
-
-    .total-box {
-      font-size: 24rpx;
-      font-weight: 500;
-      color: $dark-9;
-    }
-
-    .date-btn {
-      background-color: $white;
-      line-height: 54rpx;
-      border-radius: 27rpx;
-      padding: 0 20rpx;
-      font-size: 24rpx;
-      font-weight: 500;
-      color: $dark-6;
-
-      .ss-seldate-icon {
-        font-size: 50rpx;
-        color: $dark-9;
-      }
-    }
-  }
-
-  .list-box {
-    .list-item {
-      background: #fff;
-      border-bottom: 1rpx solid #dfdfdf;
-      padding: 30rpx;
-
-      .name {
-        font-size: 28rpx;
-
-        font-weight: 500;
-        color: rgba(102, 102, 102, 1);
-        line-height: 28rpx;
-        margin-bottom: 20rpx;
-      }
-
-      .time {
-        font-size: 24rpx;
-
-        font-weight: 500;
-        color: rgba(196, 196, 196, 1);
-        line-height: 24px;
-      }
-
-      .add {
-        font-size: 30rpx;
-
-        font-weight: 500;
-        color: #e6b873;
-      }
-
-      .minus {
-        font-size: 30rpx;
-
-        font-weight: 500;
-        color: $dark-3;
-      }
-    }
-  }
-</style>
+	.header-box {
+		width: 100%;
+		background: linear-gradient(180deg, var(--ui-BG-Main) 0%, var(--ui-BG-Main-gradient) 100%) no-repeat;
+		background-size: 750rpx 100%;
+		padding: 0 0 120rpx 0;
+		box-sizing: border-box;
+
+		.score-box {
+			height: 100%;
+
+			.all-num {
+				font-size: 50rpx;
+				font-weight: bold;
+				color: #fff;
+				font-family: OPPOSANS;
+			}
+
+			.all-title {
+				font-size: 26rpx;
+				font-weight: 500;
+				color: #fff;
+			}
+
+			.cicon-help-o {
+				color: #fff;
+				font-size: 28rpx;
+			}
+		}
+	}
+
+	// 筛选
+	.filter-box {
+		height: 114rpx;
+		background-color: $bg-page;
+
+		.total-box {
+			font-size: 24rpx;
+			font-weight: 500;
+			color: $dark-9;
+		}
+
+		.date-btn {
+			background-color: $white;
+			line-height: 54rpx;
+			border-radius: 27rpx;
+			padding: 0 20rpx;
+			font-size: 24rpx;
+			font-weight: 500;
+			color: $dark-6;
+
+			.ss-seldate-icon {
+				font-size: 50rpx;
+				color: $dark-9;
+			}
+		}
+	}
+
+	.list-box {
+		.list-item {
+			background: #fff;
+			border-bottom: 1rpx solid #dfdfdf;
+			padding: 30rpx;
+
+			.name {
+				font-size: 28rpx;
+
+				font-weight: 500;
+				color: rgba(102, 102, 102, 1);
+				line-height: 28rpx;
+				margin-bottom: 20rpx;
+			}
+
+			.time {
+				font-size: 24rpx;
+
+				font-weight: 500;
+				color: rgba(196, 196, 196, 1);
+				line-height: 24px;
+			}
+
+			.add {
+				font-size: 30rpx;
+
+				font-weight: 500;
+				color: #e6b873;
+			}
+
+			.minus {
+				font-size: 30rpx;
+
+				font-weight: 500;
+				color: $dark-3;
+			}
+		}
+	}
+</style>

+ 38 - 38
sheep/api/cart.js

@@ -2,41 +2,41 @@ import request from '@/sheep/request';
 import request2 from '@/sheep/request2';
 
 export default {
-  list: (data) =>
-    request2({
-      url: 'trade/cart/list',
-      method: 'GET',
-      custom: {
-        showLoading: false,
-        auth: true,
-      },
-    }),
-  append: (data) =>
-    request({
-      url: 'cart',
-      method: 'POST',
-      custom: {
-        showSuccess: true,
-        successMsg: '已添加到购物车~',
-      },
-      data: {
-        ...data,
-        type: 'inc',
-      },
-    }),
-  // 删除购物车
-  delete: (ids) =>
-    request2({
-      url: 'trade/cart/delete?ids=' + ids,
-      method: 'DELETE',
-    }),
-  update: (data) =>
-    request2({
-      url: 'trade/cart/update-count',
-      method: 'PUT',
-      data: {
-        ...data,
-        type: 'cover',
-      },
-    }),
-};
+	list: (data) =>
+		request2({
+			url: 'trade/cart/list',
+			method: 'GET',
+			custom: {
+				showLoading: false,
+				auth: true,
+			},
+		}),
+	append: (data) =>
+		request({
+			url: 'cart',
+			method: 'POST',
+			custom: {
+				showSuccess: true,
+				successMsg: '已添加到购物车~',
+			},
+			data: {
+				...data,
+				type: 'inc',
+			},
+		}),
+	// 删除购物车
+	delete: (ids) =>
+		request2({
+			url: 'trade/cart/delete?ids=' + ids,
+			method: 'DELETE',
+		}),
+	update: (data) =>
+		request2({
+			url: 'trade/cart/update-count',
+			method: 'PUT',
+			data: {
+				...data,
+				type: 'cover',
+			},
+		}),
+};

+ 42 - 35
sheep/api/coupon.js

@@ -1,38 +1,45 @@
 import request from '@/sheep/request';
+import request2 from '@/sheep/request2';
 
 export default {
-  // 我的拼团
-  list: (params) =>
-    request({
-      url: 'coupon',
-      method: 'GET',
-      params,
-      custom: {
-        showLoading: false,
-      },
-    }),
-  userCoupon: (params) =>
-    request({
-      url: 'user/coupon',
-      method: 'GET',
-      params,
-    }),
-  detail: (id, user_coupon_id) =>
-    request({
-      url: 'coupon/' + id,
-      method: 'GET',
-      params: {
-        user_coupon_id,
-      },
-    }),
-  get: (id) =>
-    request({
-      url: 'coupon/get/' + id,
-      method: 'POST',
-    }),
-  listByGoods: (id) =>
-    request({
-      url: 'coupon/listByGoods/' + id,
-      method: 'GET',
-    }),
-};
+	// 我的拼团
+	list: (params) =>
+		request({
+			url: 'coupon',
+			method: 'GET',
+			params,
+			custom: {
+				showLoading: false,
+			},
+		}),
+	userCoupon: (params) =>
+		request2({
+			url: 'promotion/coupon/page',
+			method: 'GET',
+			params,
+		}),
+	// userCoupon: (params) =>
+	//   request({
+	//     url: 'user/coupon',
+	//     method: 'GET',
+	//     params,
+	//   }),
+	detail: (id, user_coupon_id) =>
+		request({
+			url: 'coupon/' + id,
+			method: 'GET',
+			params: {
+				user_coupon_id,
+			},
+		}),
+	get: (id) =>
+		request({
+			url: 'coupon/get/' + id,
+			method: 'POST',
+		}),
+	listByGoods: (id) =>
+		request({
+			url: 'coupon/listByGoods/' + id,
+			method: 'GET',
+		}),
+};

+ 188 - 145
sheep/api/order.js

@@ -2,148 +2,191 @@ import request from '@/sheep/request';
 import request2 from '@/sheep/request2';
 
 export default {
-  // 订单详情
-  detail: (id,params) =>
-    request({
-      url: 'order/order/' + id,
-      method: 'GET',
-      params,
-    }),
-  // 发票详情
-  invoice: (id) =>
-    request({
-      url: 'order/invoice/' + id,
-      method: 'GET',
-    }),
-  // 获取支付结果
-  payResult: (id) =>
-    request({
-      url: 'order/order/' + id,
-      method: 'GET',
-      custom: {
-        showLoading: false,
-      },
-    }),
-  itemDetail: (id,itemId) =>
-    request({
-      url: 'order/order/itemDetail/'+ id + '/' + itemId,
-      method: 'GET',
-      custom: {
-        showLoading: false,
-      },
-    }),
-  // 订单列表
-  list: (params) =>
-    request2({
-      url: 'trade/order/page',
-      method: 'GET',
-      params,
-      custom: {
-        showLoading: false,
-      },
-    }),
-  // list: (params) =>
-  //   request({
-  //     url: 'order/order',
-  //     method: 'GET',
-  //     params,
-  //     custom: {
-  //       showLoading: false,
-  //     },
-  //   }),
-  // 计算订单信息
-  calc: (data) =>
-    request({
-      url: 'order/order/calc',
-      method: 'POST',
-      data,
-    }),
-  // 创建订单
-  create: (data) =>
-    request({
-      url: 'order/order/create',
-      method: 'POST',
-      data,
-    }),
-  //订单可用优惠券
-  coupons: (data) =>
-    request({
-      url: 'order/order/coupons',
-      method: 'POST',
-      data,
-    }),
-  // 确认收货
-  confirm: (id) =>
-    request({
-      url: 'order/order/confirm/' + id,
-      method: 'PUT',
-    }),
-  // 评价订单
-  comment: (id, data) =>
-    request({
-      url: 'order/order/comment/' + id,
-      method: 'POST',
-      data,
-    }),
-  // 申请退款
-  applyRefund: (id) =>
-    request({
-      url: 'order/order/applyRefund/' + id,
-      method: 'PUT',
-    }),
-  // 取消订单
-  cancel: (id) =>
-    request({
-      url: 'order/order/cancel/' + id,
-      method: 'PUT',
-    }),
-  // 删除订单
-  delete: (id) =>
-    request({
-      url: 'order/order/' + id,
-      method: 'DELETE',
-    }),
-  // 售后
-  aftersale: {
-    // 申请售后
-    apply: (data) =>
-      request({
-        url: 'order/aftersale',
-        method: 'POST',
-        data,
-      }),
-    list: (params) =>
-      request({
-        url: 'order/aftersale',
-        method: 'GET',
-        params,
-        custom: {
-          showLoading: false,
-        },
-      }),
-    //取消售后
-    cancel: (id) =>
-      request({
-        url: 'order/aftersale/cancel/' + id,
-        method: 'PUT',
-      }),
-    //删除售后单
-    delete: (id) =>
-      request({
-        url: 'order/aftersale/' + id,
-        method: 'DELETE',
-      }),
-    // 售后详情
-    detail: (id) =>
-      request({
-        url: 'order/aftersale/' + id,
-        method: 'GET',
-      }),
-  },
-  //订单包裹
-  express: (id, orderId) =>
-    request({
-      url: 'order/express/' + id + `${orderId ? '/' + orderId : ''}`,
-      method: 'GET',
-    }),
-};
+	// 订单详情
+	detail: (id, params) =>
+		request2({
+			url: 'trade/order/get-detail?id=' + id,
+			method: 'GET',
+			params,
+		}),
+	// detail: (id, params) =>
+	// 	request({
+	// 		url: 'order/order/' + id,
+	// 		method: 'GET',
+	// 		params,
+	// 	}),
+	// 发票详情
+	invoice: (id) =>
+		request({
+			url: 'order/invoice/' + id,
+			method: 'GET',
+		}),
+	// 获取支付结果
+	payResult: (id) =>
+		request({
+			url: 'order/order/' + id,
+			method: 'GET',
+			custom: {
+				showLoading: false,
+			},
+		}),
+	itemDetail: (id, itemId) =>
+		request({
+			url: 'order/order/itemDetail/' + id + '/' + itemId,
+			method: 'GET',
+			custom: {
+				showLoading: false,
+			},
+		}),
+	// 订单列表
+	list: (params) =>
+		request2({
+			url: 'trade/order/page',
+			method: 'GET',
+			params,
+			custom: {
+				showLoading: false,
+			},
+		}),
+	// list: (params) =>
+	//   request({
+	//     url: 'order/order',
+	//     method: 'GET',
+	//     params,
+	//     custom: {
+	//       showLoading: false,
+	//     },
+	//   }),
+	// 计算订单信息
+	calc: (data) => {
+		const data2 = {
+			...data,
+		}
+		// 解决 SpringMVC 接受 List<Item> 参数的问题
+		delete data2.items
+		for (let i = 0; i < data.items.length; i++) {
+			// data2['items[' + i + '' + '].skuId'] = data.items[i].skuId + '';
+			// data2['items[' + i + '' + '].count'] = data.items[i].count + '';
+			// data2['items[' + i + '' + '].cartId'] = data.items[i].cartId + '';
+			data2['items' + `%5B${i}%5D` + '.skuId'] = data.items[i].skuId + '';
+			data2['items' + `%5B${i}%5D` + '.count'] = data.items[i].count + '';
+			data2['items' + `%5B${i}%5D` + '.cartId'] = data.items[i].cartId + '';
+		}
+		console.log(data2, '对比数据')
+		return request2({
+			url: 'trade/order/settlement',
+			method: 'GET',
+			// data,
+			params: data2
+		})
+	},
+	// calc: (data) =>
+	//   request({
+	//     url: 'order/order/calc',
+	//     method: 'POST',
+	//     data,
+	//   }),
+	// 创建订单
+	create: (data) =>
+		request({
+			url: 'order/order/create',
+			method: 'POST',
+			data,
+		}),
+	//订单可用优惠券
+	coupons: (data) =>
+		request({
+			url: 'order/order/coupons',
+			method: 'POST',
+			data,
+		}),
+	// 确认收货
+	confirm: (id) =>
+		request({
+			url: 'order/order/confirm/' + id,
+			method: 'PUT',
+		}),
+	// 评价订单
+	comment: (data) =>
+		request2({
+			url: 'trade/order/item/create-comment',
+			method: 'POST',
+			data,
+		}),
+	// comment: (id, data) =>
+	// 	request({
+	// 		url: 'order/order/comment/' + id,
+	// 		method: 'POST',
+	// 		data,
+	// 	}),
+	// 申请退款
+	applyRefund: (id) =>
+		request({
+			url: 'order/order/applyRefund/' + id,
+			method: 'PUT',
+		}),
+	// 取消订单
+	cancel: (id) =>
+		request({
+			url: 'order/order/cancel/' + id,
+			method: 'PUT',
+		}),
+	// 删除订单
+	delete: (id) =>
+		request({
+			url: 'order/order/' + id,
+			method: 'DELETE',
+		}),
+	// 售后
+	aftersale: {
+		// 申请售后
+		apply: (data) =>
+			request({
+				url: 'order/aftersale',
+				method: 'POST',
+				data,
+			}),
+		list: (params) =>
+			request2({
+				url: 'trade/after-sale/page',
+				method: 'GET',
+				params,
+				custom: {
+					showLoading: false,
+				},
+			}),
+		// list: (params) =>
+		// 	request({
+		// 		url: 'order/aftersale',
+		// 		method: 'GET',
+		// 		params,
+		// 		custom: {
+		// 			showLoading: false,
+		// 		},
+		// 	}),
+		//取消售后
+		cancel: (id) =>
+			request({
+				url: 'order/aftersale/cancel/' + id,
+				method: 'PUT',
+			}),
+		//删除售后单
+		delete: (id) =>
+			request({
+				url: 'order/aftersale/' + id,
+				method: 'DELETE',
+			}),
+		// 售后详情
+		detail: (id) =>
+			request2({
+				url: 'trade/after-sale/get?id=' + id,
+				method: 'GET',
+			}),
+	},
+	//订单包裹
+	express: (id, orderId) =>
+		request({
+			url: 'order/express/' + id + `${orderId ? '/' + orderId : ''}`,
+			method: 'GET',
+		}),
+};

+ 37 - 11
sheep/api/user.js

@@ -3,6 +3,15 @@ import request2 from '@/sheep/request2';
 import $platform from '@/sheep/platform';
 
 export default {
+	getUnused: () =>
+		request2({
+			url: 'promotion/coupon/get-unused-count',
+			method: 'GET',
+			custom: {
+				showLoading: false,
+				auth: true,
+			},
+		}),
 	profile: () =>
 		request2({
 			url: 'member/user/get',
@@ -187,9 +196,17 @@ export default {
 		}),
 
 	address: {
+		// default: () =>
+		// 	request({
+		// 		url: 'user/address/default',
+		// 		method: 'GET',
+		// 		custom: {
+		// 			showError: false,
+		// 		},
+		// 	}),
 		default: () =>
-			request({
-				url: 'user/address/default',
+			request2({
+				url: 'member/address/get-default',
 				method: 'GET',
 				custom: {
 					showError: false,
@@ -225,7 +242,7 @@ export default {
 		//       showSuccess: true,
 		//     },
 		//   }),
-		update: ( data) =>
+		update: (data) =>
 			request2({
 				url: 'member/address/update',
 				method: 'PUT',
@@ -325,7 +342,7 @@ export default {
 				url: 'product/favorite/delete-list',
 				method: 'DELETE',
 				data: {
-					spuIds: id.split(',').map(item=>item*1),
+					spuIds: id.split(',').map(item => item * 1),
 					// spuIds: id.split(',').join(','),
 				},
 				custom: {
@@ -367,18 +384,27 @@ export default {
 	wallet: {
 		log: (params) =>
 			request2({
+				// url: 'member/point/record/page',
 				url: 'pay/wallet-transaction/page',
 				method: 'GET',
 				params,
 				custom: {},
 			}),
-			// log: (params) =>
-			// request({
-			// 	url: '/user/api/walletLog',
-			// 	method: 'GET',
-			// 	params,
-			// 	custom: {},
-			// }),
+		log2: (params) =>
+			request2({
+				url: 'member/point/record/page',
+				// url: 'pay/wallet-transaction/page',
+				method: 'GET',
+				params,
+				custom: {},
+			}),
+		// log: (params) =>
+		// request({
+		// 	url: '/user/api/walletLog',
+		// 	method: 'GET',
+		// 	params,
+		// 	custom: {},
+		// }),
 	},
 	account: {
 		info: (params) =>

+ 70 - 72
sheep/components/s-coupon-card/s-coupon-card.vue

@@ -1,80 +1,78 @@
 <template>
-  <view class="ss-coupon-menu-wrap ss-flex ss-col-center">
-    <view
-      class="menu-item ss-flex-col ss-row-center ss-col-center"
-      v-for="item in props.list"
-      :key="item.title"
-      @tap="sheep.$router.go(item.path, { type: item.type })"
-      :class="item.type === 'all' ? 'menu-wallet' : 'ss-flex-1'"
-    >
-      <image class="item-icon" :src="sheep.$url.static(item.icon)" mode="aspectFit"></image>
-      <view class="menu-title ss-m-t-28">{{ item.title }}</view>
-    </view>
-  </view>
+	<view class="ss-coupon-menu-wrap ss-flex ss-col-center">
+		<view class="menu-item ss-flex-col ss-row-center ss-col-center" v-for="item in props.list" :key="item.title"
+			@tap="sheep.$router.go(item.path, { type: item.type })"
+			:class="item.type === 'all' ? 'menu-wallet' : 'ss-flex-1'">
+			<image class="item-icon" :src="sheep.$url.static(item.icon)" mode="aspectFit"></image>
+			<view class="menu-title ss-m-t-28">{{ item.title }}</view>
+		</view>
+	</view>
 </template>
 
 <script setup>
-  /**
-   * 装修组件 - 优惠券菜单
-   */
-  import sheep from '@/sheep';
+	/**
+	 * 装修组件 - 优惠券菜单
+	 */
+	import sheep from '@/sheep';
 
-  // 接收参数
-  const props = defineProps({
-    list: {
-      type: Array,
-      default() {
-        return [
-          {
-            title: '已领取',
-            value: '0',
-            icon: '/static/img/shop/order/nouse_coupon.png',
-            path: '/pages/coupon/list',
-            type: 'geted',
-          },
-          {
-            title: '已使用',
-            value: '0',
-            icon: '/static/img/shop/order/useend_coupon.png',
-            path: '/pages/coupon/list',
-            type: 'used',
-          },
-          {
-            title: '已失效',
-            value: '0',
-            icon: '/static/img/shop/order/out_coupon.png',
-            path: '/pages/coupon/list',
-            type: 'expired',
-          },
-          {
-            title: '领券中心',
-            value: '0',
-            icon: '/static/img/shop/order/all_coupon.png',
-            path: '/pages/coupon/list',
-            type: 'all',
-          },
-        ];
-      },
-    },
-  });
+	// 接收参数
+	const props = defineProps({
+		list: {
+			type: Array,
+			default () {
+				return [{
+						title: '已领取',
+						value: '0',
+						icon: '/static/img/shop/order/nouse_coupon.png',
+						path: '/pages/coupon/list',
+						type: 'geted',
+					},
+					{
+						title: '已使用',
+						value: '0',
+						icon: '/static/img/shop/order/useend_coupon.png',
+						path: '/pages/coupon/list',
+						type: 'used',
+					},
+					{
+						title: '已失效',
+						value: '0',
+						icon: '/static/img/shop/order/out_coupon.png',
+						path: '/pages/coupon/list',
+						type: 'expired',
+					},
+					// {
+					//   title: '领券中心',
+					//   value: '0',
+					//   icon: '/static/img/shop/order/all_coupon.png',
+					//   path: '/pages/coupon/list',
+					//   type: 'all',
+					// },
+				];
+			},
+		},
+	});
 </script>
 
 <style lang="scss" scoped>
-  .ss-coupon-menu-wrap {
-    .menu-item {
-      height: 160rpx;
-      .menu-title {
-        font-size: 24rpx;
-        line-height: 24rpx;
-        color: #333333;
-      }
-      .item-icon {
-        width: 44rpx;
-        height: 44rpx;
-      }
-    }
-    .menu-wallet {
-      width: 144rpx;
-    }
-  }
-</style>
+	.ss-coupon-menu-wrap {
+		.menu-item {
+			height: 160rpx;
+
+			.menu-title {
+				font-size: 24rpx;
+				line-height: 24rpx;
+				color: #333333;
+			}
+
+			.item-icon {
+				width: 44rpx;
+				height: 44rpx;
+			}
+		}
+
+		.menu-wallet {
+			width: 144rpx;
+		}
+	}
+</style>

+ 168 - 165
sheep/components/s-coupon-list/s-coupon-list.vue

@@ -1,192 +1,195 @@
 <template>
-  <view class="ss-m-20" :style="{ opacity: disabled ? '0.5' : '1' }">
-    <view class="content">
-      <view
+	<view class="ss-m-20" :style="{ opacity: disabled ? '0.5' : '1' }">
+		<view class="content">
+			<!--      <view
         class="tag ss-flex ss-row-center"
         :class="
           data.status == 'expired' || data.status == 'used' ? 'disabled-bg-color' : 'info-bg-color'
         "
         >{{ data.type_text }}</view
-      >
-      <view class="title ss-m-x-30 ss-p-t-18">
-        <view class="ss-flex ss-row-between">
-          <view
-            class="value-text ss-flex-1 ss-m-r-10"
-            :class="
+      > -->
+			<view class="title ss-m-x-30 ss-p-t-18">
+				<view class="ss-flex ss-row-between">
+					<view class="value-text ss-flex-1 ss-m-r-10" :class="
               data.status == 'expired' || data.status == 'used' ? 'disabled-color' : 'info-color'
-            "
-            >{{ data.name }}</view
-          >
-          <view>
-            <view
-              class="ss-flex ss-col-bottom"
-              :class="
+            ">{{ data.name }}</view>
+					<view>
+						<view class="ss-flex ss-col-bottom" :class="
                 data.status != 'expired' && data.status != 'used' ? 'price-text' : 'disabled-color'
-              "
-            >
-              <view class="value-reduce ss-m-b-10" v-if="data.type === 'reduce'">¥</view>
-              <view class="value-price">{{ data.amount }}</view>
-              <view class="value-discount ss-m-b-10 ss-m-l-4" v-if="data.type === 'discount'"
-                >折</view
-              >
-            </view>
-          </view>
-        </view>
-        <view class="ss-flex ss-row-between ss-m-t-16">
-          <view
-            class="sellby-text"
-            :class="
+              ">
+							<view class="value-reduce ss-m-b-10" v-if="data.type === 'reduce'">¥</view>
+							<view class="value-price">{{ data.amount }}</view>
+							<view class="value-discount ss-m-b-10 ss-m-l-4" v-if="data.type === 'discount'">折</view>
+						</view>
+					</view>
+				</view>
+				<view class="ss-flex ss-row-between ss-m-t-16">
+					<view class="sellby-text" :class="
               data.status == 'expired' || data.status == 'used'
                 ? 'disabled-color'
                 : 'subtitle-color'
-            "
-          >
-            {{
+            ">
+						{{'有效期:' + data.use_start_time.substring(0, 11) }}至
+						{{ data.use_end_time.substring(0, 11)  }}
+						<!-- 				{{
               type === 'user'
                 ? '有效期:' + data.use_start_time.substring(0, 11)
                 : '领取时间:' + data.get_start_time.substring(0, 11)
             }}至
-            {{
+						{{
               type === 'user'
                 ? data.use_end_time.substring(0, 11)
                 : data.get_end_time.substring(0, 11)
-            }}
-          </view>
-          <view
-            class="value-enough"
-            :class="
+            }} -->
+					</view>
+					<view class="value-enough" :class="
               data.status == 'expired' || data.status == 'used'
                 ? 'disabled-color'
                 : 'subtitle-color'
-            "
-            >满{{ data.enough }}可用</view
-          >
-        </view>
-      </view>
-    </view>
-
-    <view class="desc ss-flex ss-row-between">
-      <view>
-        <view class="desc-title">
-          {{ data.description }}
-        </view>
-        <view>
-          <slot name="reason">
-          </slot>
-        </view>
-      </view>
-      <view>
-        <slot></slot>
-      </view>
-    </view>
-  </view>
+            ">满{{ data.enough }}可用</view>
+				</view>
+			</view>
+		</view>
+
+		<view class="desc ss-flex ss-row-between">
+			<view>
+				<view class="desc-title">
+					{{ data.description }}
+				</view>
+				<view>
+					<slot name="reason">
+					</slot>
+				</view>
+			</view>
+			<view>
+				<slot></slot>
+			</view>
+		</view>
+	</view>
 </template>
 
 <script setup>
-  import { reactive } from 'vue';
-  import sheep from '@/sheep';
-  const state = reactive({
-    stateMap: {
-      0: '立即领取',
-      1: '去使用',
-    },
-  });
-  // 接受参数
-  const props = defineProps({
-    data: {
-      type: Object,
-      default: {},
-    },
-    disabled: {
-      type: Boolean,
-      default: false,
-    },
-    type: {
-      type: String,
-      default: 'coupon',
-    },
-  });
+	import {
+		reactive
+	} from 'vue';
+	import sheep from '@/sheep';
+	const state = reactive({
+		stateMap: {
+			0: '立即领取',
+			1: '去使用',
+		},
+	});
+	// 接受参数
+	const props = defineProps({
+		data: {
+			type: Object,
+			default: {},
+		},
+		disabled: {
+			type: Boolean,
+			default: false,
+		},
+		type: {
+			type: String,
+			default: 'coupon',
+		},
+	});
 </script>
 
 <style lang="scss" scoped>
-  .info-bg-color {
-    background: linear-gradient(90deg, var(--ui-BG-Main), var(--ui-BG-Main-gradient));
-  }
-  .disabled-bg-color {
-    background: #999;
-  }
-  .info-color {
-    color: #333;
-  }
-  .subtitle-color {
-    color: #666;
-  }
-  .disabled-color {
-    color: #999;
-  }
-  .content {
-    width: 100%;
-    background: #fff;
-    border-radius: 20rpx 20rpx 0 0;
-    -webkit-mask: radial-gradient(circle at 12rpx 100%, #0000 12rpx, red 0) -12rpx;
-    box-shadow: 0px 0px 8px rgba(0, 0, 0, 0.04);
-
-    .tag {
-      width: 100rpx;
-
-      color: #fff;
-      height: 40rpx;
-      font-size: 24rpx;
-      border-radius: 20rpx 0 20rpx 0;
-    }
-    .title {
-      padding-bottom: 22rpx;
-      border-bottom: 2rpx dashed #d3d3d3;
-      .value-text {
-        font-size: 32rpx;
-        font-weight: 600;
-      }
-      .sellby-text {
-        font-size: 24rpx;
-        font-weight: 400;
-      }
-      .value-price {
-        font-size: 64rpx;
-        font-weight: 500;
-        line-height: normal;
-        font-family: OPPOSANS;
-      }
-      .value-reduce {
-        line-height: normal;
-        font-size: 32rpx;
-      }
-      .value-discount {
-        line-height: normal;
-        font-size: 28rpx;
-      }
-      .value-enough {
-        font-size: 24rpx;
-        font-weight: 400;
-        font-family: OPPOSANS;
-      }
-    }
-  }
-  .desc {
-    width: 100%;
-    background: #fff;
-    -webkit-mask: radial-gradient(circle at 12rpx 0%, #0000 12rpx, red 0) -12rpx;
-    box-shadow: rgba(#000, 0.1);
-    box-sizing: border-box;
-    padding: 24rpx 30rpx;
-    box-shadow: 0px 0px 8px rgba(0, 0, 0, 0.04);
-    border-radius: 0 0 20rpx 20rpx;
-    .desc-title {
-      font-size: 24rpx;
-      color: #999;
-      font-weight: 400;
-    }
-  }
-  .price-text {
-    color: #ff0000;
-  }
-</style>
+	.info-bg-color {
+		background: linear-gradient(90deg, var(--ui-BG-Main), var(--ui-BG-Main-gradient));
+	}
+
+	.disabled-bg-color {
+		background: #999;
+	}
+
+	.info-color {
+		color: #333;
+	}
+
+	.subtitle-color {
+		color: #666;
+	}
+
+	.disabled-color {
+		color: #999;
+	}
+
+	.content {
+		width: 100%;
+		background: #fff;
+		border-radius: 20rpx 20rpx 0 0;
+		-webkit-mask: radial-gradient(circle at 12rpx 100%, #0000 12rpx, red 0) -12rpx;
+		box-shadow: 0px 0px 8px rgba(0, 0, 0, 0.04);
+
+		.tag {
+			width: 100rpx;
+
+			color: #fff;
+			height: 40rpx;
+			font-size: 24rpx;
+			border-radius: 20rpx 0 20rpx 0;
+		}
+
+		.title {
+			padding-bottom: 22rpx;
+			border-bottom: 2rpx dashed #d3d3d3;
+
+			.value-text {
+				font-size: 32rpx;
+				font-weight: 600;
+			}
+
+			.sellby-text {
+				font-size: 24rpx;
+				font-weight: 400;
+			}
+
+			.value-price {
+				font-size: 64rpx;
+				font-weight: 500;
+				line-height: normal;
+				font-family: OPPOSANS;
+			}
+
+			.value-reduce {
+				line-height: normal;
+				font-size: 32rpx;
+			}
+
+			.value-discount {
+				line-height: normal;
+				font-size: 28rpx;
+			}
+
+			.value-enough {
+				font-size: 24rpx;
+				font-weight: 400;
+				font-family: OPPOSANS;
+			}
+		}
+	}
+
+	.desc {
+		width: 100%;
+		background: #fff;
+		-webkit-mask: radial-gradient(circle at 12rpx 0%, #0000 12rpx, red 0) -12rpx;
+		box-shadow: rgba(#000, 0.1);
+		box-sizing: border-box;
+		padding: 24rpx 30rpx;
+		box-shadow: 0px 0px 8px rgba(0, 0, 0, 0.04);
+		border-radius: 0 0 20rpx 20rpx;
+
+		.desc-title {
+			font-size: 24rpx;
+			color: #999;
+			font-weight: 400;
+		}
+	}
+
+	.price-text {
+		color: #ff0000;
+	}
+</style>

+ 441 - 459
sheep/components/s-select-sku/s-select-sku.vue

@@ -1,476 +1,458 @@
 <template>
-  <!-- 规格弹窗 -->
-  <su-popup :show="show" round="10" @close="emits('close')">
-    <view class="ss-modal-box bg-white ss-flex-col">
-      <view class="modal-header ss-flex ss-col-center">
-        <view class="header-left ss-m-r-30">
-          <image
-            class="sku-image"
-            :src="sheep.$url.cdn(state.selectedSkuPrice.image || goodsInfo.image)"
-            mode="aspectFill"
-          ></image>
-        </view>
-        <view class="header-right ss-flex-col ss-row-between ss-flex-1">
-          <view class="goods-title ss-line-2">{{ goodsInfo.title }}</view>
-          <view class="header-right-bottom ss-flex ss-col-center ss-row-between">
-            <view class="ss-flex">
-              <view v-if="goodsPrice.price > 0" class="price-text">
-                {{ goodsPrice.price }}
-              </view>
-              <view class="ss-flex">
-                <view
-                  v-if="goodsPrice.price > 0 && goodsPrice.score > 0"
-                  class="score-text ss-m-l-4"
-                  >+
-                </view>
-                <image
-                  v-if="goodsPrice.score > 0"
-                  :src="sheep.$url.static('/static/img/shop/goods/score1.svg')"
-                  class="score-img"
-                >
-                </image>
-                <view v-if="goodsPrice.score > 0" class="score-text">
-                  {{ goodsPrice.score }}
-                </view>
-              </view>
-            </view>
-
-            <view class="stock-text ss-m-l-20">
-              {{
+	<!-- 规格弹窗 -->
+	<su-popup :show="show" round="10" @close="emits('close')">
+		<view class="ss-modal-box bg-white ss-flex-col">
+			<view class="modal-header ss-flex ss-col-center">
+				<view class="header-left ss-m-r-30">
+					<image class="sku-image" :src="sheep.$url.cdn(state.selectedSkuPrice.image || goodsInfo.image)"
+						mode="aspectFill"></image>
+				</view>
+				<view class="header-right ss-flex-col ss-row-between ss-flex-1">
+					<view class="goods-title ss-line-2">{{ goodsInfo.title }}</view>
+					<view class="header-right-bottom ss-flex ss-col-center ss-row-between">
+						<view class="ss-flex">
+							<view v-if="goodsPrice.price > 0" class="price-text">
+								{{ goodsPrice.price }}
+							</view>
+							<view class="ss-flex">
+								<view v-if="goodsPrice.price > 0 && goodsPrice.score > 0" class="score-text ss-m-l-4">+
+								</view>
+								<image v-if="goodsPrice.score > 0"
+									:src="sheep.$url.static('/static/img/shop/goods/score1.svg')" class="score-img">
+								</image>
+								<view v-if="goodsPrice.score > 0" class="score-text">
+									{{ goodsPrice.score }}
+								</view>
+							</view>
+						</view>
+
+						<view class="stock-text ss-m-l-20">
+							{{
                 state.selectedSkuPrice.stock
                   ? formatStock(goodsInfo.stock_show_type, state.selectedSkuPrice.stock)
                   : formatStock(goodsInfo.stock_show_type, goodsInfo.stock)
               }}
-            </view>
-          </view>
-        </view>
-      </view>
-      <view class="modal-content ss-flex-1">
-        <scroll-view scroll-y="true" class="modal-content-scroll" @touchmove.stop>
-          <view class="sku-item ss-m-b-20" v-for="sku1 in goodsInfo.skus" :key="sku1.id">
-            <view class="label-text ss-m-b-20">{{ sku1.name }}</view>
-            <view class="ss-flex ss-col-center ss-flex-wrap">
-              <button
-                class="ss-reset-button spec-btn"
-                v-for="sku2 in sku1.children"
-                :class="[
+						</view>
+					</view>
+				</view>
+			</view>
+			<view class="modal-content ss-flex-1">
+				<scroll-view scroll-y="true" class="modal-content-scroll" @touchmove.stop>
+					<view class="sku-item ss-m-b-20" v-for="sku1 in goodsInfo.skus" :key="sku1.id">
+						<view class="label-text ss-m-b-20">{{ sku1.name }}</view>
+						<view class="ss-flex ss-col-center ss-flex-wrap">
+							<button class="ss-reset-button spec-btn" v-for="sku2 in sku1.children" :class="[
                   {
                     'ui-BG-Main-Gradient': state.currentSkuArray[sku2.parent_id] == sku2.id,
                   },
                   {
                     'disabled-btn': sku2.disabled == true,
                   },
-                ]"
-                :key="sku2.id"
-                :disabled="sku2.disabled == true"
-                @tap="onSelectSku(sku2.parent_id, sku2.id)"
-              >
-                {{ sku2.name }}
-              </button>
-            </view>
-          </view>
-          <view class="buy-num-box ss-flex ss-col-center ss-row-between ss-m-b-40">
-            <view class="label-text">购买数量</view>
-            <su-number-box
-              :min="1"
-              :max="state.selectedSkuPrice.stock"
-              :step="1"
-              v-model="state.selectedSkuPrice.goods_num"
-              @change="onNumberChange($event)"
-            ></su-number-box>
-          </view>
-        </scroll-view>
-      </view>
-      <view class="modal-footer border-top">
-        <view
-          class="buy-box ss-flex ss-col-center ss-flex ss-col-center ss-row-center"
-          v-if="isScore"
-        >
-          <button class="ss-reset-button score-btn ui-Shadow-Main" @tap="onBuy">立即兑换</button>
-        </view>
-        <view class="buy-box ss-flex ss-col-center ss-flex ss-col-center ss-row-center" v-else>
-          <button class="ss-reset-button add-btn ui-Shadow-Main" @tap="onAddCart"
-            >加入购物车</button
-          >
-          <button class="ss-reset-button buy-btn ui-Shadow-Main" @tap="onBuy">立即购买</button>
-        </view>
-      </view>
-    </view>
-  </su-popup>
+                ]" :key="sku2.id" :disabled="sku2.disabled == true" @tap="onSelectSku(sku2.parent_id, sku2.id)">
+								{{ sku2.name }}
+							</button>
+						</view>
+					</view>
+					<view class="buy-num-box ss-flex ss-col-center ss-row-between ss-m-b-40">
+						<view class="label-text">购买数量</view>
+						<su-number-box :min="1" :max="state.selectedSkuPrice.stock" :step="1"
+							v-model="state.selectedSkuPrice.goods_num" @change="onNumberChange($event)"></su-number-box>
+					</view>
+				</scroll-view>
+			</view>
+			<view class="modal-footer border-top">
+				<view class="buy-box ss-flex ss-col-center ss-flex ss-col-center ss-row-center" v-if="isScore">
+					<button class="ss-reset-button score-btn ui-Shadow-Main" @tap="onBuy">立即兑换</button>
+				</view>
+				<view class="buy-box ss-flex ss-col-center ss-flex ss-col-center ss-row-center" v-else>
+					<button class="ss-reset-button add-btn ui-Shadow-Main" @tap="onAddCart">加入购物车</button>
+					<button class="ss-reset-button buy-btn ui-Shadow-Main" @tap="onBuy">立即购买</button>
+				</view>
+			</view>
+		</view>
+	</su-popup>
 </template>
 
 <script setup>
-  import { computed, reactive, watch } from 'vue';
-  import sheep from '@/sheep';
-  import { formatStock, formatPrice } from '@/sheep/hooks/useGoods';
-  import { isEmpty } from 'lodash';
-
-  const emits = defineEmits(['change', 'addCart', 'buy', 'close']);
-  const props = defineProps({
-    goodsInfo: {
-      type: Object,
-      default() {},
-    },
-    show: {
-      type: Boolean,
-      default: false,
-    },
-    isScore: {
-      type: Boolean,
-      default: false,
-    },
-  });
-
-  const state = reactive({
-    selectedSkuPrice: {},
-    currentSkuArray: [],
-  });
-  //输入框改变数量
-  function onNumberChange(e) {
-    if (e === 0) return;
-    if (state.selectedSkuPrice.goods_num === e) return;
-    state.selectedSkuPrice.goods_num = e;
-  }
-  // 默认单规格
-  if (!props.goodsInfo.is_sku) {
-    state.selectedSkuPrice = props.goodsInfo.sku_prices[0];
-  }
-
-  const skuList = props.goodsInfo.skus;
-
-  // 可选规格
-  const skuPrices = computed(() => {
-    let skuPrices = props.goodsInfo.sku_prices;
-    if (props.goodsInfo.is_sku) {
-      skuPrices.forEach((item) => {
-        item.goods_sku_id_arr = item.goods_sku_ids.split(',');
-      });
-    }
-    return skuPrices;
-  });
-
-  watch(
-    () => state.selectedSkuPrice,
-    (newVal) => {
-      emits('change', newVal);
-    },
-    {
-      immediate: true, // 立即执行
-      deep: true, // 深度监听
-    },
-  );
-
-  const goodsPrice = computed(() => {
-    let price, score;
-    if (isEmpty(state.selectedSkuPrice)) {
-      price = props.goodsInfo.price[0];
-      score = props.goodsInfo.score || 0;
-    } else {
-      price = state.selectedSkuPrice.price;
-      score = state.selectedSkuPrice.score || 0;
-    }
-    return {
-      price,
-      score,
-    };
-  });
-
-  function onAddCart() {
-    if (state.selectedSkuPrice.goods_id) {
-      if (state.selectedSkuPrice.stock <= 0) {
-        sheep.$helper.toast('库存不足');
-      } else {
-        emits('addCart', state.selectedSkuPrice);
-      }
-    } else {
-      sheep.$helper.toast('请选择规格');
-    }
-  }
-
-  function onBuy() {
-    if (state.selectedSkuPrice.goods_id) {
-      if (state.selectedSkuPrice.stock <= 0) {
-        sheep.$helper.toast('库存不足');
-      } else {
-        emits('buy', state.selectedSkuPrice);
-      }
-    } else {
-      sheep.$helper.toast('请选择规格');
-    }
-  }
-  // 改变禁用状态
-  function changeDisabled(isChecked = false, pid = 0, skuId = 0) {
-    let newPrice = []; // 所有可以选择的 skuPrice
-
-    if (isChecked) {
-      // 选中规格
-      // 当前点击选中规格下的 所有可用 skuPrice
-      for (let price of skuPrices.value) {
-        if (price.stock <= 0) {
-          // this.goodsNum 不判断是否大于当前选择数量,在 uni-number-box 判断,并且 取 stock 和 goods_num 的小值
-          continue;
-        }
-        if (price.goods_sku_id_arr.indexOf(skuId.toString()) >= 0) {
-          newPrice.push(price);
-        }
-      }
-    } else {
-      // 取消选中
-      // 当前所选规格下,所有可以选择的 skuPrice
-      newPrice = getCanUseSkuPrice();
-    }
-
-    // 所有存在并且有库存未选择的规格项 的 子项 id
-    let noChooseSkuIds = [];
-    for (let price of newPrice) {
-      noChooseSkuIds = noChooseSkuIds.concat(price.goods_sku_id_arr);
-    }
-
-    // 去重
-    noChooseSkuIds = Array.from(new Set(noChooseSkuIds));
-
-    if (isChecked) {
-      // 去除当前选中的规格项
-      let index = noChooseSkuIds.indexOf(skuId.toString());
-      noChooseSkuIds.splice(index, 1);
-    } else {
-      // 循环去除当前已选择的规格项
-      state.currentSkuArray.forEach((sku) => {
-        if (sku.toString() != '') {
-          // sku 为空是反选 填充的
-          let index = noChooseSkuIds.indexOf(sku.toString());
-          if (index >= 0) {
-            // sku 存在于 noChooseSkuIds
-            noChooseSkuIds.splice(index, 1);
-          }
-        }
-      });
-    }
-
-    // 当前已选择的规格大类
-    let chooseSkuKey = [];
-    if (!isChecked) {
-      // 当前已选择的规格大类
-      state.currentSkuArray.forEach((sku, key) => {
-        if (sku != '') {
-          // sku 为空是反选 填充的
-          chooseSkuKey.push(key);
-        }
-      });
-    } else {
-      // 当前点击选择的规格大类
-      chooseSkuKey = [pid];
-    }
-
-    for (let i in skuList) {
-      // 当前点击的规格,或者取消选择时候 已选中的规格 不进行处理
-      if (chooseSkuKey.indexOf(skuList[i]['id']) >= 0) {
-        continue;
-      }
-
-      for (let j in skuList[i]['children']) {
-        // 如果当前规格项 id 不存在于有库存的规格项中,则禁用
-        if (noChooseSkuIds.indexOf(skuList[i]['children'][j]['id'].toString()) >= 0) {
-          skuList[i]['children'][j]['disabled'] = false;
-        } else {
-          skuList[i]['children'][j]['disabled'] = true;
-        }
-      }
-    }
-  }
-  // 当前所选规格下,获取所有有库存的 skuPrice
-  function getCanUseSkuPrice() {
-    let newPrice = [];
-
-    for (let price of skuPrices.value) {
-      if (price.stock <= 0) {
-        // || price.stock < this.goodsNum		不判断是否大于当前选择数量,在 uni-number-box 判断,并且 取 stock 和 goods_num 的小值
-        continue;
-      }
-      var isOk = true;
-
-      state.currentSkuArray.forEach((sku) => {
-        // sku 不为空,并且,这个 条 skuPrice 没有被选中,则排除
-        if (sku.toString() != '' && price.goods_sku_id_arr.indexOf(sku.toString()) < 0) {
-          isOk = false;
-        }
-      });
-
-      if (isOk) {
-        newPrice.push(price);
-      }
-    }
-
-    return newPrice;
-  }
-  // 选择规格
-  function onSelectSku(pid, skuId) {
-    // 清空已选择
-    let isChecked = true; // 选中 or 取消选中
-    if (state.currentSkuArray[pid] != undefined && state.currentSkuArray[pid] == skuId) {
-      // 点击已被选中的,删除并填充 ''
-      isChecked = false;
-      state.currentSkuArray.splice(pid, 1, '');
-    } else {
-      // 选中
-      state.currentSkuArray[pid] = skuId;
-    }
-
-    let chooseSkuId = []; // 选中的规格大类
-    state.currentSkuArray.forEach((sku) => {
-      if (sku != '') {
-        // sku 为空是反选 填充的
-        chooseSkuId.push(sku);
-      }
-    });
-
-    // 当前所选规格下,所有可以选择的 skuPric
-    let newPrice = getCanUseSkuPrice();
-
-    // 判断所有规格大类是否选择完成
-    if (chooseSkuId.length == skuList.length && newPrice.length) {
-      newPrice[0].goods_num = state.selectedSkuPrice.goods_num || 1;
-      state.selectedSkuPrice = newPrice[0];
-    } else {
-      state.selectedSkuPrice = {};
-    }
-
-    // 改变规格项禁用状态
-    changeDisabled(isChecked, pid, skuId);
-  }
-
-  changeDisabled(false);
+	import {
+		computed,
+		reactive,
+		watch
+	} from 'vue';
+	import sheep from '@/sheep';
+	import {
+		formatStock,
+		formatPrice
+	} from '@/sheep/hooks/useGoods';
+	import {
+		isEmpty
+	} from 'lodash';
+
+	const emits = defineEmits(['change', 'addCart', 'buy', 'close']);
+	const props = defineProps({
+		goodsInfo: {
+			type: Object,
+			default () {},
+		},
+		show: {
+			type: Boolean,
+			default: false,
+		},
+		isScore: {
+			type: Boolean,
+			default: false,
+		},
+	});
+
+	const state = reactive({
+		selectedSkuPrice: {},
+		currentSkuArray: [],
+	});
+	//输入框改变数量
+	function onNumberChange(e) {
+		if (e === 0) return;
+		if (state.selectedSkuPrice.goods_num === e) return;
+		state.selectedSkuPrice.goods_num = e;
+	}
+	// 默认单规格
+	if (!props.goodsInfo.is_sku) {
+		state.selectedSkuPrice = props.goodsInfo.sku_prices[0];
+	}
+
+	const skuList = props.goodsInfo.skus;
+
+	// 可选规格
+	const skuPrices = computed(() => {
+		let skuPrices = props.goodsInfo.sku_prices;
+		if (props.goodsInfo.is_sku) {
+			skuPrices.forEach((item) => {
+				item.goods_sku_id_arr = item.goods_sku_ids.split(',');
+			});
+		}
+		return skuPrices;
+	});
+
+	watch(
+		() => state.selectedSkuPrice,
+		(newVal) => {
+			emits('change', newVal);
+		}, {
+			immediate: true, // 立即执行
+			deep: true, // 深度监听
+		},
+	);
+
+	const goodsPrice = computed(() => {
+		let price, score;
+		if (isEmpty(state.selectedSkuPrice)) {
+			price = props.goodsInfo.price[0];
+			score = props.goodsInfo.score || 0;
+		} else {
+			price = state.selectedSkuPrice.price;
+			score = state.selectedSkuPrice.score || 0;
+		}
+		return {
+			price,
+			score,
+		};
+	});
+
+	function onAddCart() {
+		if (state.selectedSkuPrice.goods_id) {
+			if (state.selectedSkuPrice.stock <= 0) {
+				sheep.$helper.toast('库存不足');
+			} else {
+				emits('addCart', state.selectedSkuPrice);
+			}
+		} else {
+			sheep.$helper.toast('请选择规格');
+		}
+	}
+
+	function onBuy() {
+		if (state.selectedSkuPrice.goods_id) {
+			if (state.selectedSkuPrice.stock <= 0) {
+				sheep.$helper.toast('库存不足');
+			} else {
+				emits('buy', state.selectedSkuPrice);
+			}
+		} else {
+			sheep.$helper.toast('请选择规格');
+		}
+	}
+	// 改变禁用状态
+	function changeDisabled(isChecked = false, pid = 0, skuId = 0) {
+		let newPrice = []; // 所有可以选择的 skuPrice
+
+		if (isChecked) {
+			// 选中规格
+			// 当前点击选中规格下的 所有可用 skuPrice
+			for (let price of skuPrices.value) {
+				if (price.stock <= 0) {
+					// this.goodsNum 不判断是否大于当前选择数量,在 uni-number-box 判断,并且 取 stock 和 goods_num 的小值
+					continue;
+				}
+				if (price.goods_sku_id_arr.indexOf(skuId.toString()) >= 0) {
+					newPrice.push(price);
+				}
+			}
+		} else {
+			// 取消选中
+			// 当前所选规格下,所有可以选择的 skuPrice
+			newPrice = getCanUseSkuPrice();
+		}
+
+		// 所有存在并且有库存未选择的规格项 的 子项 id
+		let noChooseSkuIds = [];
+		for (let price of newPrice) {
+			noChooseSkuIds = noChooseSkuIds.concat(price.goods_sku_id_arr);
+		}
+
+		// 去重
+		noChooseSkuIds = Array.from(new Set(noChooseSkuIds));
+
+		if (isChecked) {
+			// 去除当前选中的规格项
+			let index = noChooseSkuIds.indexOf(skuId.toString());
+			noChooseSkuIds.splice(index, 1);
+		} else {
+			// 循环去除当前已选择的规格项
+			state.currentSkuArray.forEach((sku) => {
+				if (sku.toString() != '') {
+					// sku 为空是反选 填充的
+					let index = noChooseSkuIds.indexOf(sku.toString());
+					if (index >= 0) {
+						// sku 存在于 noChooseSkuIds
+						noChooseSkuIds.splice(index, 1);
+					}
+				}
+			});
+		}
+
+		// 当前已选择的规格大类
+		let chooseSkuKey = [];
+		if (!isChecked) {
+			// 当前已选择的规格大类
+			state.currentSkuArray.forEach((sku, key) => {
+				if (sku != '') {
+					// sku 为空是反选 填充的
+					chooseSkuKey.push(key);
+				}
+			});
+		} else {
+			// 当前点击选择的规格大类
+			chooseSkuKey = [pid];
+		}
+
+		for (let i in skuList) {
+			// 当前点击的规格,或者取消选择时候 已选中的规格 不进行处理
+			if (chooseSkuKey.indexOf(skuList[i]['id']) >= 0) {
+				continue;
+			}
+
+			for (let j in skuList[i]['children']) {
+				// 如果当前规格项 id 不存在于有库存的规格项中,则禁用
+				if (noChooseSkuIds.indexOf(skuList[i]['children'][j]['id'].toString()) >= 0) {
+					skuList[i]['children'][j]['disabled'] = false;
+				} else {
+					skuList[i]['children'][j]['disabled'] = true;
+				}
+			}
+		}
+	}
+	// 当前所选规格下,获取所有有库存的 skuPrice
+	function getCanUseSkuPrice() {
+		let newPrice = [];
+
+		for (let price of skuPrices.value) {
+			if (price.stock <= 0) {
+				// || price.stock < this.goodsNum		不判断是否大于当前选择数量,在 uni-number-box 判断,并且 取 stock 和 goods_num 的小值
+				continue;
+			}
+			var isOk = true;
+
+			state.currentSkuArray.forEach((sku) => {
+				// sku 不为空,并且,这个 条 skuPrice 没有被选中,则排除
+				if (sku.toString() != '' && price.goods_sku_id_arr.indexOf(sku.toString()) < 0) {
+					isOk = false;
+				}
+			});
+
+			if (isOk) {
+				newPrice.push(price);
+			}
+		}
+
+		return newPrice;
+	}
+	// 选择规格
+	function onSelectSku(pid, skuId) {
+		// 清空已选择
+		let isChecked = true; // 选中 or 取消选中
+		if (state.currentSkuArray[pid] != undefined && state.currentSkuArray[pid] == skuId) {
+			// 点击已被选中的,删除并填充 ''
+			isChecked = false;
+			state.currentSkuArray.splice(pid, 1, '');
+		} else {
+			// 选中
+			state.currentSkuArray[pid] = skuId;
+		}
+
+		let chooseSkuId = []; // 选中的规格大类
+		state.currentSkuArray.forEach((sku) => {
+			if (sku != '') {
+				// sku 为空是反选 填充的
+				chooseSkuId.push(sku);
+			}
+		});
+
+		// 当前所选规格下,所有可以选择的 skuPric
+		let newPrice = getCanUseSkuPrice();
+
+		// 判断所有规格大类是否选择完成
+		if (chooseSkuId.length == skuList.length && newPrice.length) {
+			newPrice[0].goods_num = state.selectedSkuPrice.goods_num || 1;
+			state.selectedSkuPrice = newPrice[0];
+		} else {
+			state.selectedSkuPrice = {};
+		}
+
+		// 改变规格项禁用状态
+		changeDisabled(isChecked, pid, skuId);
+	}
+
+	changeDisabled(false);
 </script>
 
 <style lang="scss" scoped>
-  // 购买
-  .buy-box {
-    padding: 10rpx 0;
-
-    .add-btn {
-      width: 356rpx;
-      height: 80rpx;
-      border-radius: 40rpx 0 0 40rpx;
-      background-color: var(--ui-BG-Main-light);
-      color: var(--ui-BG-Main);
-    }
-
-    .buy-btn {
-      width: 356rpx;
-      height: 80rpx;
-      border-radius: 0 40rpx 40rpx 0;
-      background: linear-gradient(90deg, var(--ui-BG-Main), var(--ui-BG-Main-gradient));
-      color: #fff;
-    }
-
-    .score-btn {
-      width: 100%;
-      margin: 0 20rpx;
-      height: 80rpx;
-      border-radius: 40rpx;
-      background: linear-gradient(90deg, var(--ui-BG-Main), var(--ui-BG-Main-gradient));
-      color: #fff;
-    }
-  }
-
-  .ss-modal-box {
-    border-radius: 30rpx 30rpx 0 0;
-    max-height: 1000rpx;
-
-    .modal-header {
-      position: relative;
-      padding: 80rpx 20rpx 40rpx;
-
-      .sku-image {
-        width: 160rpx;
-        height: 160rpx;
-        border-radius: 10rpx;
-      }
-
-      .header-right {
-        height: 160rpx;
-      }
-
-      .close-icon {
-        position: absolute;
-        top: 10rpx;
-        right: 20rpx;
-        font-size: 46rpx;
-        opacity: 0.2;
-      }
-
-      .goods-title {
-        font-size: 28rpx;
-        font-weight: 500;
-        line-height: 42rpx;
-      }
-
-      .score-img {
-        width: 36rpx;
-        height: 36rpx;
-        margin: 0 4rpx;
-      }
-
-      .score-text {
-        font-size: 30rpx;
-        font-weight: 500;
-        color: $red;
-        font-family: OPPOSANS;
-      }
-
-      .price-text {
-        font-size: 30rpx;
-        font-weight: 500;
-        color: $red;
-        font-family: OPPOSANS;
-
-        &::before {
-          content: '¥';
-          font-size: 30rpx;
-          font-weight: 500;
-          color: $red;
-        }
-      }
-
-      .stock-text {
-        font-size: 26rpx;
-        color: #999999;
-      }
-    }
-
-    .modal-content {
-      padding: 0 20rpx;
-
-      .modal-content-scroll {
-        max-height: 600rpx;
-
-        .label-text {
-          font-size: 26rpx;
-          font-weight: 500;
-        }
-
-        .buy-num-box {
-          height: 100rpx;
-        }
-
-        .spec-btn {
-          height: 60rpx;
-          min-width: 100rpx;
-          padding: 0 30rpx;
-          background: #f4f4f4;
-          border-radius: 30rpx;
-          color: #434343;
-          font-size: 26rpx;
-          margin-right: 10rpx;
-          margin-bottom: 10rpx;
-        }
-
-        .disabled-btn {
-          font-weight: 400;
-          color: #c6c6c6;
-          background: #f8f8f8;
-        }
-      }
-    }
-  }
-</style>
+	// 购买
+	.buy-box {
+		padding: 10rpx 0;
+
+		.add-btn {
+			width: 356rpx;
+			height: 80rpx;
+			border-radius: 40rpx 0 0 40rpx;
+			background-color: var(--ui-BG-Main-light);
+			color: var(--ui-BG-Main);
+		}
+
+		.buy-btn {
+			width: 356rpx;
+			height: 80rpx;
+			border-radius: 0 40rpx 40rpx 0;
+			background: linear-gradient(90deg, var(--ui-BG-Main), var(--ui-BG-Main-gradient));
+			color: #fff;
+		}
+
+		.score-btn {
+			width: 100%;
+			margin: 0 20rpx;
+			height: 80rpx;
+			border-radius: 40rpx;
+			background: linear-gradient(90deg, var(--ui-BG-Main), var(--ui-BG-Main-gradient));
+			color: #fff;
+		}
+	}
+
+	.ss-modal-box {
+		border-radius: 30rpx 30rpx 0 0;
+		max-height: 1000rpx;
+
+		.modal-header {
+			position: relative;
+			padding: 80rpx 20rpx 40rpx;
+
+			.sku-image {
+				width: 160rpx;
+				height: 160rpx;
+				border-radius: 10rpx;
+			}
+
+			.header-right {
+				height: 160rpx;
+			}
+
+			.close-icon {
+				position: absolute;
+				top: 10rpx;
+				right: 20rpx;
+				font-size: 46rpx;
+				opacity: 0.2;
+			}
+
+			.goods-title {
+				font-size: 28rpx;
+				font-weight: 500;
+				line-height: 42rpx;
+			}
+
+			.score-img {
+				width: 36rpx;
+				height: 36rpx;
+				margin: 0 4rpx;
+			}
+
+			.score-text {
+				font-size: 30rpx;
+				font-weight: 500;
+				color: $red;
+				font-family: OPPOSANS;
+			}
+
+			.price-text {
+				font-size: 30rpx;
+				font-weight: 500;
+				color: $red;
+				font-family: OPPOSANS;
+
+				&::before {
+					content: '¥';
+					font-size: 30rpx;
+					font-weight: 500;
+					color: $red;
+				}
+			}
+
+			.stock-text {
+				font-size: 26rpx;
+				color: #999999;
+			}
+		}
+
+		.modal-content {
+			padding: 0 20rpx;
+
+			.modal-content-scroll {
+				max-height: 600rpx;
+
+				.label-text {
+					font-size: 26rpx;
+					font-weight: 500;
+				}
+
+				.buy-num-box {
+					height: 100rpx;
+				}
+
+				.spec-btn {
+					height: 60rpx;
+					min-width: 100rpx;
+					padding: 0 30rpx;
+					background: #f4f4f4;
+					border-radius: 30rpx;
+					color: #434343;
+					font-size: 26rpx;
+					margin-right: 10rpx;
+					margin-bottom: 10rpx;
+				}
+
+				.disabled-btn {
+					font-weight: 400;
+					color: #c6c6c6;
+					background: #f8f8f8;
+				}
+			}
+		}
+	}
+</style>

+ 148 - 145
sheep/components/s-user-card/s-user-card.vue

@@ -1,34 +1,31 @@
 <!-- 页面 -->
 <template>
-  <view class="ss-user-info-wrap ss-p-t-50">
-    <view class="ss-flex ss-col-center ss-row-between ss-m-b-20">
-      <view class="left-box ss-flex ss-col-center ss-m-l-36">
-        <view class="avatar-box ss-m-r-24">
-          <image
-            class="avatar-img"
-            :src="
+	<view class="ss-user-info-wrap ss-p-t-50">
+		<view class="ss-flex ss-col-center ss-row-between ss-m-b-20">
+			<view class="left-box ss-flex ss-col-center ss-m-l-36">
+				<view class="avatar-box ss-m-r-24">
+					<image class="avatar-img" :src="
               isLogin
                 ? sheep.$url.cdn(userInfo.avatar)
                 : sheep.$url.static('/static/img/shop/default_avatar.png')
-            "
-            mode="aspectFill"
-            @tap="sheep.$router.go('/pages/user/info')"
-          ></image>
-        </view>
-        <view>
-          <view class="nickname-box ss-flex ss-col-center">
-            <view class="nick-name ss-m-r-20">{{ userInfo?.nickname || nickname }}</view>
-          </view>
-        </view>
-      </view>
-      <view class="right-box ss-m-r-52">
-        <button class="ss-reset-button" @tap="showShareModal">
-          <text class="sicon-qrcode"></text>
-        </button>
-      </view>
-    </view>
+            " mode="aspectFill" @tap="sheep.$router.go('/pages/user/info')"></image>
+				</view>
+				<view>
+					<view class="nickname-box ss-flex ss-col-center">
+						<view class="nick-name ss-m-r-20">{{ userInfo?.nickname || nickname }}</view>
+					</view>
+				</view>
+			</view>
+			<view class="right-box ss-m-r-52">
+				<button class="ss-reset-button" @tap="showShareModal">
+					<text class="sicon-qrcode"></text>
+				</button>
+			</view>
+		</view>
 
-    <view
+
+		<!-- 提示绑定手机号 先隐藏 yudao 需要再修改 -->
+		<!--    <view
       class="bind-mobile-box ss-flex ss-row-between ss-col-center"
       v-if="isLogin && !userInfo.verification?.mobile"
     >
@@ -37,129 +34,135 @@
         <view class="mobile-title ss-m-l-20"> 点击绑定手机号确保账户安全 </view>
       </view>
       <button class="ss-reset-button bind-btn" @tap="onBind">去绑定</button>
-    </view>
-  </view>
+    </view> -->
+	</view>
 </template>
 
 <script setup>
-  /**
-   * 用户卡片
-   *
-   * @property {Number} leftSpace 									- 容器左间距
-   * @property {Number} rightSpace 									- 容器右间距
-   *
-   * @property {String} avatar 					- 头像
-   * @property {String} nickname 					- 昵称
-   * @property {String} vip		  				- 等级
-   * @property {String} collectNum 				- 收藏数
-   * @property {String} likeNum 					- 点赞数
-   *
-   *
-   */
-  import { computed, reactive } from 'vue';
-  import sheep from '@/sheep';
-  import { showShareModal, showAuthModal } from '@/sheep/hooks/useModal';
-
-  // 用户信息
-  const userInfo = computed(() => sheep.$store('user').userInfo);
-  console.log('用户信息',userInfo)
-
-  // 是否登录
-  const isLogin = computed(() => sheep.$store('user').isLogin);
-  // 接收参数
-  const props = defineProps({
-    background: {
-      type: String,
-      default: '',
-    },
-    // 头像
-    avatar: {
-      type: String,
-      default: '',
-    },
-    nickname: {
-      type: String,
-      default: '请先登录',
-    },
-    vip: {
-      type: [String, Number],
-      default: '1',
-    },
-    collectNum: {
-      type: [String, Number],
-      default: '1',
-    },
-    likeNum: {
-      type: [String, Number],
-      default: '1',
-    },
-  });
-
-  function onBind() {
-    showAuthModal('changeMobile');
-  }
+	/**
+	 * 用户卡片
+	 *
+	 * @property {Number} leftSpace 									- 容器左间距
+	 * @property {Number} rightSpace 									- 容器右间距
+	 *
+	 * @property {String} avatar 					- 头像
+	 * @property {String} nickname 					- 昵称
+	 * @property {String} vip		  				- 等级
+	 * @property {String} collectNum 				- 收藏数
+	 * @property {String} likeNum 					- 点赞数
+	 *
+	 *
+	 */
+	import {
+		computed,
+		reactive
+	} from 'vue';
+	import sheep from '@/sheep';
+	import {
+		showShareModal,
+		showAuthModal
+	} from '@/sheep/hooks/useModal';
+
+	// 用户信息
+	const userInfo = computed(() => sheep.$store('user').userInfo);
+	console.log('用户信息', userInfo)
+
+	// 是否登录
+	const isLogin = computed(() => sheep.$store('user').isLogin);
+	// 接收参数
+	const props = defineProps({
+		background: {
+			type: String,
+			default: '',
+		},
+		// 头像
+		avatar: {
+			type: String,
+			default: '',
+		},
+		nickname: {
+			type: String,
+			default: '请先登录',
+		},
+		vip: {
+			type: [String, Number],
+			default: '1',
+		},
+		collectNum: {
+			type: [String, Number],
+			default: '1',
+		},
+		likeNum: {
+			type: [String, Number],
+			default: '1',
+		},
+	});
+
+	function onBind() {
+		showAuthModal('changeMobile');
+	}
 </script>
 
 <style lang="scss" scoped>
-  .ss-user-info-wrap {
-    box-sizing: border-box;
-
-    .avatar-box {
-      width: 100rpx;
-      height: 100rpx;
-      border-radius: 50%;
-      overflow: hidden;
-
-      .avatar-img {
-        width: 100%;
-        height: 100%;
-      }
-    }
-
-    .nick-name {
-      font-size: 34rpx;
-      font-weight: 400;
-      color: #333333;
-      line-height: normal;
-    }
-
-    .vip-img {
-      width: 30rpx;
-      height: 30rpx;
-    }
-
-    .sicon-qrcode {
-      font-size: 40rpx;
-    }
-  }
-
-  .bind-mobile-box {
-    width: 100%;
-    height: 84rpx;
-    padding: 0 34rpx 0 44rpx;
-    box-sizing: border-box;
-    background: #ffffff;
-    box-shadow: 0px -8rpx 9rpx 0px rgba(#e0e0e0, 0.3);
-
-    .cicon-mobile-o {
-      font-size: 30rpx;
-      color: #ff690d;
-    }
-
-    .mobile-title {
-      font-size: 24rpx;
-      font-weight: 500;
-      color: #ff690d;
-    }
-
-    .bind-btn {
-      width: 100rpx;
-      height: 50rpx;
-      background: #ff6100;
-      border-radius: 25rpx;
-      font-size: 24rpx;
-      font-weight: 500;
-      color: #ffffff;
-    }
-  }
-</style>
+	.ss-user-info-wrap {
+		box-sizing: border-box;
+
+		.avatar-box {
+			width: 100rpx;
+			height: 100rpx;
+			border-radius: 50%;
+			overflow: hidden;
+
+			.avatar-img {
+				width: 100%;
+				height: 100%;
+			}
+		}
+
+		.nick-name {
+			font-size: 34rpx;
+			font-weight: 400;
+			color: #333333;
+			line-height: normal;
+		}
+
+		.vip-img {
+			width: 30rpx;
+			height: 30rpx;
+		}
+
+		.sicon-qrcode {
+			font-size: 40rpx;
+		}
+	}
+
+	.bind-mobile-box {
+		width: 100%;
+		height: 84rpx;
+		padding: 0 34rpx 0 44rpx;
+		box-sizing: border-box;
+		background: #ffffff;
+		box-shadow: 0px -8rpx 9rpx 0px rgba(#e0e0e0, 0.3);
+
+		.cicon-mobile-o {
+			font-size: 30rpx;
+			color: #ff690d;
+		}
+
+		.mobile-title {
+			font-size: 24rpx;
+			font-weight: 500;
+			color: #ff690d;
+		}
+
+		.bind-btn {
+			width: 100rpx;
+			height: 50rpx;
+			background: #ff6100;
+			border-radius: 25rpx;
+			font-size: 24rpx;
+			font-weight: 500;
+			color: #ffffff;
+		}
+	}
+</style>

+ 87 - 41
sheep/components/s-wallet-card/s-wallet-card.vue

@@ -1,4 +1,16 @@
 <template>
+<<<<<<< HEAD
+	<view class="ss-wallet-menu-wrap ss-flex ss-col-center">
+		<view class="menu-item ss-flex-1 ss-flex-col ss-row-center ss-col-center"
+			@tap="sheep.$router.go('/pages/user/wallet/money')">
+			<view class="value-box ss-flex ss-col-bottom">
+				<view class="value-text ss-line-1">{{ userInfo.money }}</view>
+				<view class="unit-text ss-m-l-6">元</view>
+			</view>
+			<view class="menu-title ss-m-t-28">账户余额</view>
+		</view>
+		<!-- <view class="menu-item ss-flex-1 ss-flex-col ss-row-center ss-col-center"
+=======
   <view class="ss-wallet-menu-wrap ss-flex ss-col-center">
     <view
       class="menu-item ss-flex-1 ss-flex-col ss-row-center ss-col-center"
@@ -11,6 +23,7 @@
       <view class="menu-title ss-m-t-28">账户余额</view>
     </view>
     <!-- <view class="menu-item ss-flex-1 ss-flex-col ss-row-center ss-col-center"
+>>>>>>> 6251ffa9944516e995002e7f11539aef3e1d50de
 			@tap="sheep.$router.go('/pages/user/wallet/commission')">
 			<view class="value-box ss-flex ss-col-bottom">
 				<view class="value-text">{{ userInfo?.commission || '0.00' }}</view>
@@ -18,6 +31,34 @@
 			</view>
 			<view class="menu-title ss-m-t-28">佣金</view>
 		</view> -->
+<<<<<<< HEAD
+		<view class="menu-item ss-flex-1 ss-flex-col ss-row-center ss-col-center"
+			@tap="sheep.$router.go('/pages/user/wallet/score')">
+			<view class="value-box ss-flex ss-col-bottom">
+				<view class="value-text">{{ userInfo.point }}</view>
+				<view class="unit-text ss-m-l-6">个</view>
+			</view>
+			<view class="menu-title ss-m-t-28">积分</view>
+		</view>
+		<view class="menu-item ss-flex-1 ss-flex-col ss-row-center ss-col-center" @tap="
+        sheep.$router.go('/pages/coupon/list', {
+          type: 'geted',
+        })
+      ">
+			<view class="value-box ss-flex ss-col-bottom">
+				<view class="value-text">{{ numData.coupons_num }}</view>
+				<view class="unit-text ss-m-l-6">张</view>
+			</view>
+			<view class="menu-title ss-m-t-28">优惠券</view>
+		</view>
+		<view class="menu-item ss-flex-col ss-row-center ss-col-center menu-wallet"
+			@tap="sheep.$router.go('/pages/user/wallet/money')">
+			<image class="item-icon" :src="sheep.$url.static('/static/img/shop/user/wallet_icon.png')" mode="aspectFit">
+			</image>
+			<view class="menu-title ss-m-t-30">我的钱包</view>
+		</view>
+	</view>
+=======
     <view
       class="menu-item ss-flex-1 ss-flex-col ss-row-center ss-col-center"
       @tap="sheep.$router.go('/pages/user/wallet/score')"
@@ -55,56 +96,61 @@
       <view class="menu-title ss-m-t-30">我的钱包</view>
     </view>
   </view>
+>>>>>>> 6251ffa9944516e995002e7f11539aef3e1d50de
 </template>
 
 <script setup>
-  /**
-   * 装修组件 - 订单菜单组
-   */
-  import { computed, ref } from 'vue';
-  import sheep from '@/sheep';
+	/**
+	 * 装修组件 - 订单菜单组
+	 */
+	import {
+		computed,
+		ref
+	} from 'vue';
+	import sheep from '@/sheep';
 
-  const userInfo = computed(() => sheep.$store('user').userInfo);
-  const numData = computed(() => sheep.$store('user').numData);
+	const userInfo = computed(() => sheep.$store('user').userInfo);
+	const numData = computed(() => sheep.$store('user').numData);
 </script>
 
 <style lang="scss" scoped>
-  .ss-wallet-menu-wrap {
-    .menu-wallet {
-      width: 144rpx;
-    }
-    .menu-item {
-      height: 160rpx;
+	.ss-wallet-menu-wrap {
+		.menu-wallet {
+			width: 144rpx;
+		}
+
+		.menu-item {
+			height: 160rpx;
 
-      .menu-title {
-        font-size: 24rpx;
-        line-height: 24rpx;
-        color: #333333;
-      }
+			.menu-title {
+				font-size: 24rpx;
+				line-height: 24rpx;
+				color: #333333;
+			}
 
-      .item-icon {
-        width: 44rpx;
-        height: 44rpx;
-      }
+			.item-icon {
+				width: 44rpx;
+				height: 44rpx;
+			}
 
-      .value-box {
-        height: 50rpx;
-        text-align: center;
+			.value-box {
+				height: 50rpx;
+				text-align: center;
 
-        .value-text {
-          font-size: 28rpx;
-          color: #000000;
-          line-height: 28rpx;
-          vertical-align: text-bottom;
-          font-family: OPPOSANS;
-        }
+				.value-text {
+					font-size: 28rpx;
+					color: #000000;
+					line-height: 28rpx;
+					vertical-align: text-bottom;
+					font-family: OPPOSANS;
+				}
 
-        .unit-text {
-          font-size: 24rpx;
-          color: #343434;
-          line-height: 24rpx;
-        }
-      }
-    }
-  }
-</style>
+				.unit-text {
+					font-size: 24rpx;
+					color: #343434;
+					line-height: 24rpx;
+				}
+			}
+		}
+	}
+</style>

+ 175 - 170
sheep/request/index.js

@@ -4,213 +4,218 @@
  */
 
 import Request from 'luch-request';
-import { baseUrl, apiPath } from '@/sheep/config';
+import {
+	baseUrl,
+	apiPath
+} from '@/sheep/config';
 import $store from '@/sheep/store';
 import $platform from '@/sheep/platform';
-import { showAuthModal } from '@/sheep/hooks/useModal';
+import {
+	showAuthModal
+} from '@/sheep/hooks/useModal';
 
 const options = {
-  // 显示操作成功消息 默认不显示
-  showSuccess: false,
-  // 成功提醒 默认使用后端返回值
-  successMsg: '',
-  // 显示失败消息 默认显示
-  showError: true,
-  // 失败提醒 默认使用后端返回信息
-  errorMsg: '',
-  // 显示请求时loading模态框 默认显示
-  showLoading: true,
-  // loading提醒文字
-  loadingMsg: '加载中',
-  // 需要授权才能请求 默认放开
-  auth: false,
-  // ...
+	// 显示操作成功消息 默认不显示
+	showSuccess: false,
+	// 成功提醒 默认使用后端返回值
+	successMsg: '',
+	// 显示失败消息 默认显示
+	showError: true,
+	// 失败提醒 默认使用后端返回信息
+	errorMsg: '',
+	// 显示请求时loading模态框 默认显示
+	showLoading: true,
+	// loading提醒文字
+	loadingMsg: '加载中',
+	// 需要授权才能请求 默认放开
+	auth: false,
+	// ...
 };
 
 // Loading全局实例
 let LoadingInstance = {
-  target: null,
-  count: 0,
+	target: null,
+	count: 0,
 };
 
 /**
  * 关闭loading
  */
 function closeLoading() {
-  if (LoadingInstance.count > 0) LoadingInstance.count--;
-  if (LoadingInstance.count === 0) uni.hideLoading();
+	if (LoadingInstance.count > 0) LoadingInstance.count--;
+	if (LoadingInstance.count === 0) uni.hideLoading();
 }
 
 /**
  * @description 请求基础配置 可直接使用访问自定义请求
  */
 const http = new Request({
-  baseURL: baseUrl,
-  timeout: 8000,
-  method: 'GET',
-  header: {
-    Accept: 'text/json',
-    'Content-Type': 'application/json;charset=UTF-8',
-    platform: $platform.name,
-  },
-  // #ifdef APP-PLUS
-  sslVerify: false,
-  // #endif
-  // #ifdef H5
-  // 跨域请求时是否携带凭证(cookies)仅H5支持(HBuilderX 2.6.15+)
-  withCredentials: false,
-  // #endif
-  custom: options,
+	baseURL: baseUrl,
+	timeout: 8000,
+	method: 'GET',
+	header: {
+		Accept: 'text/json',
+		'Content-Type': 'application/json;charset=UTF-8',
+		platform: $platform.name,
+	},
+	// #ifdef APP-PLUS
+	sslVerify: false,
+	// #endif
+	// #ifdef H5
+	// 跨域请求时是否携带凭证(cookies)仅H5支持(HBuilderX 2.6.15+)
+	withCredentials: false,
+	// #endif
+	custom: options,
 });
 
 /**
  * @description 请求拦截器
  */
 http.interceptors.request.use(
-  (config) => {
-    if (config.custom.auth && !$store('user').isLogin) {
-      showAuthModal();
-      return Promise.reject();
-    }
-    if (config.custom.showLoading) {
-      LoadingInstance.count++;
-      LoadingInstance.count === 1 &&
-        uni.showLoading({
-          title: config.custom.loadingMsg,
-          mask: true,
-          fail: () => {
-            uni.hideLoading();
-          },
-        });
-    }
-    const token = uni.getStorageSync('token');
-    if (token) config.header['Authorization'] = token;
-    // TODO 芋艿:特殊处理
-    if (config.url.indexOf('/app-api/') !== -1) {
-      config.header['Accept'] = '*/*'
-      config.header['tenant-id'] = '1';
-      config.header['Authorization'] = 'Bearer test247';
-    }
-    return config;
-  },
-  (error) => {
-    return Promise.reject(error);
-  },
+	(config) => {
+		if (config.custom.auth && !$store('user').isLogin) {
+			showAuthModal();
+			return Promise.reject();
+		}
+		if (config.custom.showLoading) {
+			LoadingInstance.count++;
+			LoadingInstance.count === 1 &&
+				uni.showLoading({
+					title: config.custom.loadingMsg,
+					mask: true,
+					fail: () => {
+						uni.hideLoading();
+					},
+				});
+		}
+		const token = uni.getStorageSync('token');
+		if (token) config.header['Authorization'] = token;
+		// TODO 芋艿:特殊处理
+		if (config.url.indexOf('/app-api/') !== -1) {
+			config.header['Accept'] = '*/*'
+			config.header['tenant-id'] = '1';
+			config.header['Authorization'] = 'Bearer test247';
+		}
+		return config;
+	},
+	(error) => {
+		return Promise.reject(error);
+	},
 );
 
 /**
  * @description 响应拦截器
  */
 http.interceptors.response.use(
-  (response) => {
-    // 自动设置登陆令牌
-    if (response.header.authorization || response.header.Authorization) {
-      $store('user').setToken(response.header.authorization || response.header.Authorization);
-    }
+	(response) => {
+		// 自动设置登陆令牌
+		if (response.header.authorization || response.header.Authorization) {
+			$store('user').setToken(response.header.authorization || response.header.Authorization);
+		}
 
-    response.config.custom.showLoading && closeLoading();
-    if (response.data.error !== 0) {
-      if (response.config.custom.showError)
-        uni.showToast({
-          title: response.data.msg || '服务器开小差啦,请稍后再试~',
-          icon: 'none',
-          mask: true,
-        });
-      return Promise.resolve(response.data);
-    }
-    if (
-      response.data.error === 0 &&
-      response.data.msg !== '' &&
-      response.config.custom.showSuccess
-    ) {
-      uni.showToast({
-        title: response.config.custom.successMsg || response.data.msg,
-        icon: 'none',
-      });
-    }
-    return Promise.resolve(response.data);
-  },
-  (error) => {
-    const userStore = $store('user');
-    const isLogin = userStore.isLogin;
-    let errorMessage = '网络请求出错';
-    if (error !== undefined) {
-      switch (error.statusCode) {
-        case 400:
-          errorMessage = '请求错误';
-          break;
-        case 401:
-          if (isLogin) {
-            errorMessage = '您的登陆已过期';
-          } else {
-            errorMessage = '请先登录';
-          }
-          userStore.logout(true);
-          showAuthModal();
-          break;
-        case 403:
-          errorMessage = '拒绝访问';
-          break;
-        case 404:
-          errorMessage = '请求出错';
-          break;
-        case 408:
-          errorMessage = '请求超时';
-          break;
-        case 429:
-          errorMessage = '请求频繁, 请稍后再访问';
-          break;
-        case 500:
-          errorMessage = '服务器开小差啦,请稍后再试~';
-          break;
-        case 501:
-          errorMessage = '服务未实现';
-          break;
-        case 502:
-          errorMessage = '网络错误';
-          break;
-        case 503:
-          errorMessage = '服务不可用';
-          break;
-        case 504:
-          errorMessage = '网络超时';
-          break;
-        case 505:
-          errorMessage = 'HTTP版本不受支持';
-          break;
-      }
-      if (error.errMsg.includes('timeout')) errorMessage = '请求超时';
-      // #ifdef H5
-      if (error.errMsg.includes('Network'))
-        errorMessage = window.navigator.onLine ? '服务器异常' : '请检查您的网络连接';
-      // #endif
-    }
+		response.config.custom.showLoading && closeLoading();
+		if (response.data.error !== 0) {
+			if (response.config.custom.showError)
+				uni.showToast({
+					title: response.data.msg || '服务器开小差啦,请稍后再试~',
+					icon: 'none',
+					mask: true,
+				});
+			return Promise.resolve(response.data);
+		}
+		if (
+			response.data.error === 0 &&
+			response.data.msg !== '' &&
+			response.config.custom.showSuccess
+		) {
+			uni.showToast({
+				title: response.config.custom.successMsg || response.data.msg,
+				icon: 'none',
+			});
+		}
+		return Promise.resolve(response.data);
+	},
+	(error) => {
+		const userStore = $store('user');
+		const isLogin = userStore.isLogin;
+		let errorMessage = '网络请求出错';
+		if (error !== undefined) {
+			switch (error.statusCode) {
+				case 400:
+					errorMessage = '请求错误';
+					break;
+				case 401:
+					if (isLogin) {
+						errorMessage = '您的登陆已过期';
+					} else {
+						errorMessage = '请先登录';
+					}
+					userStore.logout(true);
+					showAuthModal();
+					break;
+				case 403:
+					errorMessage = '拒绝访问';
+					break;
+				case 404:
+					errorMessage = '请求出错';
+					break;
+				case 408:
+					errorMessage = '请求超时';
+					break;
+				case 429:
+					errorMessage = '请求频繁, 请稍后再访问';
+					break;
+				case 500:
+					errorMessage = '服务器开小差啦,请稍后再试~';
+					break;
+				case 501:
+					errorMessage = '服务未实现';
+					break;
+				case 502:
+					errorMessage = '网络错误';
+					break;
+				case 503:
+					errorMessage = '服务不可用';
+					break;
+				case 504:
+					errorMessage = '网络超时';
+					break;
+				case 505:
+					errorMessage = 'HTTP版本不受支持';
+					break;
+			}
+			if (error.errMsg.includes('timeout')) errorMessage = '请求超时';
+			// #ifdef H5
+			if (error.errMsg.includes('Network'))
+				errorMessage = window.navigator.onLine ? '服务器异常' : '请检查您的网络连接';
+			// #endif
+		}
 
-    if (error && error.config) {
-      if (error.config.custom.showError === false) {
-        uni.showToast({
-          title: error.data?.msg || errorMessage,
-          icon: 'none',
-          mask: true,
-        });
-      }
-      error.config.custom.showLoading && closeLoading();
-    }
+		if (error && error.config) {
+			if (error.config.custom.showError === false) {
+				uni.showToast({
+					title: error.data?.msg || errorMessage,
+					icon: 'none',
+					mask: true,
+				});
+			}
+			error.config.custom.showLoading && closeLoading();
+		}
 
-    return false;
-  },
+		return false;
+	},
 );
 
 const request = (config) => {
-  if (config.url[0] !== '/') {
-    config.url = apiPath + config.url;
-  }
-  // TODO 芋艿:额外拼接
-  if (config.url.indexOf('/app-api/') >= 0) {
-    config.url = 'http://api-dashboard.yudao.iocoder.cn' + config.url; // 调用【云端】
-    // config.url = 'http://127.0.0.1:48080' + config.url; // 调用【本地】
-  }
-  return http.middleware(config);
+	if (config.url[0] !== '/') {
+		config.url = apiPath + config.url;
+	}
+	// TODO 芋艿:额外拼接
+	if (config.url.indexOf('/app-api/') >= 0) {
+		config.url = 'http://api-dashboard.yudao.iocoder.cn' + config.url; // 调用【云端】
+		// config.url = 'http://127.0.0.1:48080' + config.url; // 调用【本地】
+	}
+	return http.middleware(config);
 };
 
-export default request;
+export default request;

+ 177 - 151
sheep/store/user.js

@@ -1,168 +1,194 @@
-import { defineStore } from 'pinia';
+import {
+	defineStore
+} from 'pinia';
 import userApi from '@/sheep/api/user';
 import commissionApi from '@/sheep/api/commission';
 import $share from '@/sheep/platform/share';
-import { isEmpty, cloneDeep, clone } from 'lodash';
+import {
+	isEmpty,
+	cloneDeep,
+	clone
+} from 'lodash';
 import cart from './cart';
 import app from './app';
-import { showAuthModal } from '@/sheep/hooks/useModal';
+import {
+	showAuthModal
+} from '@/sheep/hooks/useModal';
 
 // 默认用户信息
 const defaultUserInfo = {
-  avatar: '', // 头像
-  nickname: '', // 昵称
-  gender: 0, // 性别
-  mobile: '', // 手机号
-  money: '--', // 余额
-  commission: '--', // 佣金
-  score: '--', // 积分
-  verification: {}, // 认证字段
+	avatar: '', // 头像
+	nickname: '', // 昵称
+	gender: 0, // 性别
+	mobile: '', // 手机号
+	money: '--', // 余额
+	commission: '--', // 佣金
+	score: '--', // 积分
+	verification: {}, // 认证字段
 };
 
 // 默认订单、优惠券等其他资产信息
 const defaultNumData = {
-  coupons_num: '--',
-  order_num: {
-    aftersale: 0,
-    nocomment: 0,
-    noget: 0,
-    nosend: 0,
-    unpaid: 0,
-  },
+	coupons_num: '--',
+	order_num: {
+		aftersale: 0,
+		nocomment: 0,
+		noget: 0,
+		nosend: 0,
+		unpaid: 0,
+	},
 };
 
 const user = defineStore({
-  id: 'user',
-  state: () => ({
-    userInfo: clone(defaultUserInfo), // 用户信息
-    isLogin: !!uni.getStorageSync('token'), // 登录状态
-    numData: cloneDeep(defaultNumData), // 用户其他数据
-    agentInfo: {}, // 分销商信息
-    lastUpdateTime: 0, // 上次更新时间
-  }),
-
-  actions: {
-    // 获取个人信息
-    async getInfo() {
-      const { code, data } = await userApi.profile();
-	  // 为了兼容 获取用户余额 可能还会用到其他参数
-      const { code:code2, data:data2 } = await userApi.balance();
-      if (code !== 0||code2!=0) return;
-	  data.money=data2.balance/100;
-      this.userInfo = data;
-
-      return Promise.resolve(data);
-    },
-
-    // 获取分销商信息
-    async getAgentInfo() {
-      const res = await commissionApi.agent();
-      if (res.error === 0) {
-        this.agentInfo = res.data;
-      }
-      return Promise.resolve(res);
-    },
-
-    // 获取订单、优惠券等其他资产信息
-    async getNumData() {
-      const { code, data } = await userApi.data();
-      const data2 = await userApi.data2();
-      if (code === 0&&data2.code===0) {
-		  console.log('订单数据',data);
-        this.numData = {order_num:{
-			noget:data.deliveredCount,
-			unpaid:data.unpaidCount,
-			nocomment:data.uncommentedCount,
-			aftersale:data2.data
-		}};
-      }
-    },
-
-    // 添加分享记录
-    async addShareLog(params) {
-      const { error } = await userApi.addShareLog(params);
-      if (error === 0) uni.removeStorageSync('shareLog');
-    },
-
-    // 设置token
-    setToken(token = '') {
-      if (token === '') {
-        this.isLogin = false;
-        uni.removeStorageSync('token');
-      } else {
-        this.isLogin = true;
-        uni.setStorageSync('token', token);
-        this.loginAfter();
-      }
-      return this.isLogin;
-    },
-
-    // 更新用户相关信息 (手动限流 5秒之内不刷新)
-    async updateUserData() {
-      if (!this.isLogin) {
-        this.resetUserData();
-        return;
-      }
-      const nowTime = new Date().getTime();
-      if (this.lastUpdateTime + 5000 > nowTime) return;
-      await this.getInfo();
-      this.getNumData();
-      this.lastUpdateTime = nowTime;
-      return this.userInfo;
-    },
-
-    // 重置用户默认数据
-    resetUserData() {
-      this.setToken();
-      this.userInfo = clone(defaultUserInfo);
-      this.numData = cloneDeep(defaultNumData);
-      this.agentInfo = {};
-      cart().emptyList();
-    },
-
-    // 登录后
-    async loginAfter() {
-      await this.updateUserData();
-      cart().getList();
-      // 登录后设置全局分享参数
-      $share.getShareInfo();
-      // 提醒绑定手机号
-      if (app().platform.bind_mobile && !this.userInfo.verification?.mobile) {
-        showAuthModal('changeMobile');
-      }
-
-      // 添加分享记录
-      const shareLog = uni.getStorageSync('shareLog');
-      if (!isEmpty(shareLog)) {
-        this.addShareLog({
-          ...shareLog,
-        });
-      }
-    },
-
-    // 登出
-    async logout(force = false) {
-      if (!force) {
-        const { error } = await userApi.logout();
-        if (error === 0) {
-          this.resetUserData();
-        }
-      }
-      if (force) {
-        this.resetUserData();
-      }
-
-      return !this.isLogin;
-    },
-  },
-  persist: {
-    enabled: true,
-    strategies: [
-      {
-        key: 'user-store',
-      },
-    ],
-  },
+	id: 'user',
+	state: () => ({
+		userInfo: clone(defaultUserInfo), // 用户信息
+		isLogin: !!uni.getStorageSync('token'), // 登录状态
+		numData: cloneDeep(defaultNumData), // 用户其他数据
+		agentInfo: {}, // 分销商信息
+		lastUpdateTime: 0, // 上次更新时间
+	}),
+
+	actions: {
+		// 获取个人信息
+		async getInfo() {
+			const {
+				code,
+				data
+			} = await userApi.profile();
+
+			// 为了兼容 获取用户余额 可能还会用到其他参数
+			// 优惠券数量,积分数量 应该在这里	
+			const {
+				code: code2,
+				data: data2
+			} = await userApi.balance();
+			if (code !== 0 || code2 != 0) return;
+			data.money = data2.balance / 100;
+			this.userInfo = data;
+			console.log(data2, '信息')
+			return Promise.resolve(data);
+		},
+
+		// 获取分销商信息
+		async getAgentInfo() {
+			const res = await commissionApi.agent();
+			if (res.error === 0) {
+				this.agentInfo = res.data;
+			}
+			return Promise.resolve(res);
+		},
+
+		// 获取订单、优惠券等其他资产信息
+		async getNumData() {
+			const {
+				code,
+				data
+			} = await userApi.data();
+			const data2 = await userApi.data2();
+			let data3 = await userApi.getUnused();
+			console.log(data3.data, '优惠券')
+			if (code === 0 && data2.code === 0) {
+				console.log('订单数据', data);
+				this.numData = {
+					coupons_num: data3.data,
+					order_num: {
+						noget: data.deliveredCount,
+						unpaid: data.unpaidCount,
+						nocomment: data.uncommentedCount,
+						aftersale: data2.data
+					}
+				};
+			}
+		},
+
+		// 添加分享记录
+		async addShareLog(params) {
+			const {
+				error
+			} = await userApi.addShareLog(params);
+			if (error === 0) uni.removeStorageSync('shareLog');
+		},
+
+		// 设置token
+		setToken(token = '') {
+			if (token === '') {
+				this.isLogin = false;
+				uni.removeStorageSync('token');
+			} else {
+				this.isLogin = true;
+				uni.setStorageSync('token', token);
+				this.loginAfter();
+			}
+			return this.isLogin;
+		},
+
+		// 更新用户相关信息 (手动限流 5秒之内不刷新)
+		async updateUserData() {
+			if (!this.isLogin) {
+				this.resetUserData();
+				return;
+			}
+			const nowTime = new Date().getTime();
+			if (this.lastUpdateTime + 5000 > nowTime) return;
+			await this.getInfo();
+			this.getNumData();
+			this.lastUpdateTime = nowTime;
+			return this.userInfo;
+		},
+
+		// 重置用户默认数据
+		resetUserData() {
+			this.setToken();
+			this.userInfo = clone(defaultUserInfo);
+			this.numData = cloneDeep(defaultNumData);
+			this.agentInfo = {};
+			cart().emptyList();
+		},
+
+		// 登录后
+		async loginAfter() {
+			await this.updateUserData();
+			cart().getList();
+			// 登录后设置全局分享参数
+			$share.getShareInfo();
+			// 提醒绑定手机号
+			// if (app().platform.bind_mobile && !this.userInfo.verification?.mobile) {
+			// 	showAuthModal('changeMobile');
+			// }
+
+			// 添加分享记录
+			const shareLog = uni.getStorageSync('shareLog');
+			if (!isEmpty(shareLog)) {
+				this.addShareLog({
+					...shareLog,
+				});
+			}
+		},
+
+		// 登出
+		async logout(force = false) {
+			if (!force) {
+				const {
+					error
+				} = await userApi.logout();
+				if (error === 0) {
+					this.resetUserData();
+				}
+			}
+			if (force) {
+				this.resetUserData();
+			}
+
+			return !this.isLogin;
+		},
+	},
+	persist: {
+		enabled: true,
+		strategies: [{
+			key: 'user-store',
+		}, ],
+	},
 });
 
-export default user;
+export default user;