Просмотр исходного кода

基本重构订单功能;部分UI调整

Huanyi 2 дней назад
Родитель
Сommit
126277b9c4

+ 13 - 3
pages/client/index.vue

@@ -2,7 +2,8 @@
     <view class="client-page">
         <erp-nav-bar title="授权客户" :showBack="false" />
 
-        <view class="page-body">
+        <scroll-view scroll-y class="page-body" :show-scrollbar="false" :refresher-enabled="true"
+            :refresher-triggered="refresherTriggered" @refresherrefresh="onPullDownRefresh">
             <!-- 加载中 -->
             <view class="loading-wrap" v-if="isLoading">
                 <text class="loading-text">加载中...</text>
@@ -70,7 +71,7 @@
 
             <!-- 底部安全距离 -->
             <view class="safe-bottom"></view>
-        </view>
+        </scroll-view>
 
         <erp-tab-bar active="client"></erp-tab-bar>
     </view>
@@ -87,6 +88,7 @@ export default {
     data() {
         return {
             isLoading: true,
+            refresherTriggered: false,
             clientList: []
         }
     },
@@ -95,6 +97,12 @@ export default {
         await this.loadClients();
     },
     methods: {
+        onPullDownRefresh() {
+            this.refresherTriggered = true;
+            this.loadClients().finally(() => {
+                this.refresherTriggered = false;
+            });
+        },
         async loadClients() {
             try {
                 const infoRes = await getMyInfo();
@@ -130,14 +138,16 @@ export default {
 <style scoped>
 .client-page {
     width: 100vw;
-    min-height: 100vh;
+    height: 100vh;
     background: #f5f6f8;
     display: flex;
     flex-direction: column;
+    overflow: hidden;
 }
 
 .page-body {
     flex: 1;
+    height: 0;
     padding: 24rpx 32rpx 0;
 }
 

+ 1 - 12
pages/index/index.vue

@@ -52,7 +52,7 @@
 
 				<view class="cube-container">
 					<view class="cube-grid">
-						<view class="cube-card" v-for="(item, index) in cubeProducts" :key="index" @click="goToOrder">
+						<view class="cube-card" v-for="(item, index) in cubeProducts" :key="index">
 							<image :src="item.image" mode="aspectFill" class="cube-bg"></image>
 							<view class="cube-mask"></view>
 							<view class="cube-content">
@@ -60,7 +60,6 @@
 								<view class="cube-line"></view>
 								<text class="cube-desc">{{ item.desc }}</text>
 							</view>
-							<view class="cube-arrow">→</view>
 						</view>
 					</view>
 				</view>
@@ -392,7 +391,6 @@ export default {
 	border-radius: 20rpx;
 	overflow: hidden;
 	background: #eee;
-	transition: 0.3s;
 }
 
 .cube-bg {
@@ -436,15 +434,6 @@ export default {
 	display: block;
 }
 
-.cube-arrow {
-	position: absolute;
-	right: 30rpx;
-	bottom: 30rpx;
-	color: #fff;
-	font-size: 30rpx;
-	opacity: 0.6;
-}
-
 /* 企业实力 */
 .brand-strength {
 	padding: 40rpx;

+ 145 - 42
pages/mine/complaint/index.vue

@@ -2,21 +2,37 @@
 	<view class="complaint-list-root">
 		<erp-nav-bar title="投诉与建议" />
 
-		<scroll-view scroll-y class="list-scroll-view" :show-scrollbar="false" @scrolltolower="onReachEnd">
+		<scroll-view scroll-y class="list-scroll-view" :show-scrollbar="false" @scrolltolower="onReachEnd"
+			:refresher-enabled="true" :refresher-triggered="refresherTriggered" @refresherrefresh="onPullDownRefresh">
 			<view class="list-inner">
 				<view class="complaint-card" v-for="item in displayList" :key="item.id" @click="goDetail(item)">
-					<view class="card-header">
-						<view class="type-badge">{{ item.feedbackTypeLabel }}</view>
-						<view class="status-text" :class="item.status === '1' ? 'done' : 'pending'">
-							{{ item.status === '1' ? '已处理' : '待处理' }}
+					<view class="card-head">
+						<view class="head-left">
+							<view class="type-tag">
+								<view class="tag-dot"></view>
+								<text>{{ item.feedbackTypeLabel }}</text>
+							</view>
+						</view>
+						<view class="head-right" :class="item.status === '1' ? 'done' : 'pending'">
+							<view class="status-dot"></view>
+							<text>{{ item.status === '1' ? '已处理' : '待处理' }}</text>
 						</view>
 					</view>
+
 					<view class="card-content">
 						<text class="content-text">{{ item.content }}</text>
 					</view>
-					<view class="card-footer">
+
+					<view class="card-images" v-if="item.imageUrls && item.imageUrls.length > 0">
+						<view class="img-cell" v-for="(url, idx) in item.imageUrls" :key="idx"
+							@click.stop="previewImage(item.imageUrls, idx)">
+							<image :src="url" mode="aspectFill"></image>
+						</view>
+					</view>
+
+					<view class="card-foot">
 						<text class="time-text">{{ item.createTime }}</text>
-						<view class="arrow-icon"></view>
+						<text class="arrow">›</text>
 					</view>
 				</view>
 
@@ -55,6 +71,7 @@ export default {
 		return {
 			loading: false,
 			noMore: false,
+			refresherTriggered: false,
 			pageNum: 1,
 			displayList: [],
 			typeMap: {}
@@ -87,12 +104,24 @@ export default {
 		goDetail(item) {
 			uni.navigateTo({ url: `/pages/mine/complaint/detail/index?id=${item.id}` });
 		},
+		previewImage(urls, current) {
+			uni.previewImage({ urls, current });
+		},
 		refresh() {
 			this.displayList = [];
 			this.noMore = false;
 			this.pageNum = 1;
 			this.loadData();
 		},
+		onPullDownRefresh() {
+			this.refresherTriggered = true;
+			this.displayList = [];
+			this.noMore = false;
+			this.pageNum = 1;
+			this.loadData().finally(() => {
+				this.refresherTriggered = false;
+			});
+		},
 		onReachEnd() {
 			if (!this.loading && !this.noMore) this.loadData();
 		},
@@ -112,6 +141,7 @@ export default {
 					feedbackType: item.feedbackType,
 					feedbackTypeLabel: this.typeMap[item.feedbackType] || item.feedbackType || '未知类型',
 					content: item.content,
+					imageUrls: item.imageUrls ? item.imageUrls.split(',').filter(u => u) : [],
 					status: item.status || '0',
 					createTime: item.createTime
 				}));
@@ -140,7 +170,7 @@ export default {
 .complaint-list-root {
 	width: 100vw;
 	height: 100vh;
-	background: #f8fafb;
+	background: #F4F6F9;
 	display: flex;
 	flex-direction: column;
 	overflow: hidden;
@@ -158,71 +188,137 @@ export default {
 
 .complaint-card {
 	background: #fff;
-	border-radius: 16rpx;
-	padding: 30rpx;
+	border-radius: 24rpx;
+	padding: 32rpx;
 	margin-bottom: 24rpx;
-	box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.03);
+	box-shadow: 0 2rpx 20rpx rgba(0, 0, 0, 0.03);
+	transition: transform 0.15s ease;
 }
 
-.card-header {
+.complaint-card:active {
+	transform: scale(0.985);
+}
+
+.card-head {
 	display: flex;
 	justify-content: space-between;
 	align-items: center;
 	margin-bottom: 20rpx;
 }
 
-.type-badge {
-	font-size: 26rpx;
-	color: #C1001C;
-	background: rgba(193, 0, 28, 0.06);
-	padding: 6rpx 16rpx;
-	border-radius: 8rpx;
+.head-left {
+	flex-shrink: 0;
 }
 
-.status-text {
-	font-size: 26rpx;
+.type-tag {
+	display: flex;
+	align-items: center;
+	gap: 10rpx;
+	font-size: 24rpx;
+	color: #5A6577;
+	background: #F4F6F9;
+	padding: 8rpx 18rpx;
+	border-radius: 20rpx;
+}
+
+.tag-dot {
+	width: 10rpx;
+	height: 10rpx;
+	background: #C1001C;
+	border-radius: 50%;
+}
+
+.head-right {
+	display: flex;
+	align-items: center;
+	gap: 8rpx;
+	font-size: 24rpx;
+	font-weight: 500;
+}
+
+.head-right .status-dot {
+	width: 12rpx;
+	height: 12rpx;
+	border-radius: 50%;
+}
+
+.head-right.pending {
+	color: #E8900C;
 }
 
-.status-text.pending {
-	color: #ff9800;
+.head-right.pending .status-dot {
+	background: #E8900C;
+	box-shadow: 0 0 0 4rpx rgba(232, 144, 12, 0.12);
 }
 
-.status-text.done {
-	color: #4caf50;
+.head-right.done {
+	color: #34A853;
+}
+
+.head-right.done .status-dot {
+	background: #34A853;
+	box-shadow: 0 0 0 4rpx rgba(52, 168, 83, 0.12);
 }
 
 .card-content {
-	margin-bottom: 20rpx;
+	margin-bottom: 18rpx;
 }
 
 .content-text {
 	font-size: 28rpx;
-	color: #333;
-	line-height: 1.6;
+	color: #1A1A2E;
+	line-height: 1.7;
 	display: -webkit-box;
 	-webkit-line-clamp: 2;
 	-webkit-box-orient: vertical;
 	overflow: hidden;
 }
 
-.card-footer {
+.card-images {
+	display: flex;
+	gap: 12rpx;
+	margin-bottom: 20rpx;
+	overflow-x: auto;
+	padding-bottom: 4rpx;
+}
+
+.card-images::-webkit-scrollbar {
+	display: none;
+}
+
+.img-cell {
+	width: 160rpx;
+	height: 160rpx;
+	border-radius: 12rpx;
+	overflow: hidden;
+	flex-shrink: 0;
+	background: #F5F6F8;
+}
+
+.img-cell image {
+	width: 100%;
+	height: 100%;
+}
+
+.card-foot {
 	display: flex;
 	justify-content: space-between;
 	align-items: center;
+	padding-top: 16rpx;
+	border-top: 1rpx solid #F0F0F3;
 }
 
 .time-text {
 	font-size: 24rpx;
-	color: #bbb;
+	color: #B0B8C5;
 }
 
-.arrow-icon {
-	width: 14rpx;
-	height: 14rpx;
-	border-right: 3rpx solid #ccc;
-	border-top: 3rpx solid #ccc;
-	transform: rotate(45deg);
-	margin-left: 10rpx;
+.arrow {
+	font-size: 36rpx;
+	color: #CBD2DB;
+	font-weight: 300;
+	line-height: 1;
+	margin-right: -4rpx;
 }
 
 .list-status-info {
@@ -271,23 +367,30 @@ export default {
 
 .footer-bar {
 	background: #fff;
-	padding: 30rpx 40rpx calc(30rpx + env(safe-area-inset-bottom));
+	padding: 24rpx 40rpx;
+	padding-bottom: calc(24rpx + env(safe-area-inset-bottom));
 	flex-shrink: 0;
-	border-top: 1rpx solid #f0f0f0;
+	box-shadow: 0 -2rpx 16rpx rgba(0, 0, 0, 0.04);
 }
 
 .submit-btn {
 	width: 100%;
-	height: 96rpx;
+	height: 92rpx;
 	background: #C1001C;
 	color: #fff;
-	border-radius: 48rpx;
+	border-radius: 46rpx;
 	display: flex;
 	align-items: center;
 	justify-content: center;
-	font-size: 32rpx;
-	font-weight: bold;
+	font-size: 30rpx;
+	font-weight: 600;
 	border: none;
+	box-shadow: 0 4rpx 16rpx rgba(193, 0, 28, 0.2);
+	transition: opacity 0.2s;
+}
+
+.submit-btn:active {
+	opacity: 0.9;
 }
 
 .submit-btn::after {

+ 115 - 66
pages/mine/settings/index.vue

@@ -3,7 +3,7 @@
 		<erp-nav-bar title="个人资料设置" />
 
 		<!-- 资料列表 -->
-		<view class="settings-list" :style="{ marginTop: '10px' }">
+		<view class="settings-list">
 			<view class="item-row avatar-row" @click="doChooseImage">
 				<text class="item-label">头像</text>
 				<view class="item-right">
@@ -39,17 +39,25 @@
 		<!-- 授权客户列表 -->
 		<view class="section-card" style="margin-top: 30rpx;">
 			<view class="section-header">
-				<text class="section-title">授权客户</text>
-				<text class="section-desc" v-if="myInfo.authClientList">共 {{ myInfo.authClientList.length }} 个</text>
+				<view class="sh-left">
+					<view class="sh-indicator"></view>
+					<text class="section-title">授权客户</text>
+				</view>
+				<view class="sh-count" v-if="myInfo.authClientList">
+					<text class="count-num">{{ myInfo.authClientList.length }}</text>
+					<text class="count-unit">个</text>
+				</view>
 			</view>
 			<view v-if="myInfo.authClientList && myInfo.authClientList.length > 0" class="client-list">
 				<view class="client-item" v-for="(client, idx) in myInfo.authClientList" :key="idx">
-					<view class="client-index">{{ idx + 1 }}</view>
-					<view class="client-info">
-						<text class="client-name">{{ client.name || '-' }}</text>
-						<view class="client-meta">
-							<text class="client-class">{{ client.clientClass || '-' }}</text>
-							<text class="client-date" v-if="client.enterDate">{{ client.enterDate }}</text>
+					<view class="ci-avatar">
+						<text class="ci-char">{{ (client.name || '-')[0] }}</text>
+					</view>
+					<view class="ci-body">
+						<text class="ci-name">{{ client.name || '-' }}</text>
+						<view class="ci-meta">
+							<text class="ci-tag" v-if="client.clientClass">{{ client.clientClass }}</text>
+							<text class="ci-date" v-if="client.enterDate">{{ client.enterDate }}</text>
 						</view>
 					</view>
 				</view>
@@ -170,26 +178,29 @@ export default {
 .settings-root {
 	width: 100vw;
 	height: 100vh;
-	background: #f8fafb;
+	background: #F4F6F9;
 	display: flex;
 	flex-direction: column;
 }
 
 .settings-list {
 	background: #fff;
-	padding: 0 40rpx;
+	margin: 20rpx 24rpx 0;
+	border-radius: 20rpx;
+	padding: 0 36rpx;
+	box-shadow: 0 2rpx 16rpx rgba(0, 0, 0, 0.02);
 }
 
 .mt-30 {
-	margin-top: 30rpx;
+	margin-top: 24rpx;
 }
 
 .item-row {
 	display: flex;
 	justify-content: space-between;
 	align-items: center;
-	min-height: 110rpx;
-	border-bottom: 2rpx solid #f9f9f9;
+	min-height: 104rpx;
+	border-bottom: 1rpx solid #F0F0F3;
 }
 
 .item-row:last-child {
@@ -197,12 +208,13 @@ export default {
 }
 
 .avatar-row {
-	height: 180rpx;
+	min-height: 140rpx;
 }
 
 .item-label {
-	font-size: 32rpx;
-	color: #333;
+	font-size: 30rpx;
+	color: #1A1A2E;
+	font-weight: 500;
 }
 
 .item-right {
@@ -212,16 +224,16 @@ export default {
 
 .avatar-wrapper {
 	position: relative;
-	width: 110rpx;
-	height: 110rpx;
-	margin-right: 20rpx;
+	width: 96rpx;
+	height: 96rpx;
+	margin-right: 16rpx;
 }
 
 .avatar-img {
-	width: 110rpx;
-	height: 110rpx;
-	border-radius: 50%;
-	background: #eee;
+	width: 96rpx;
+	height: 96rpx;
+	border-radius: 24rpx;
+	background: #F4F6F9;
 }
 
 .avatar-uploading {
@@ -230,7 +242,7 @@ export default {
 	left: 0;
 	width: 100%;
 	height: 100%;
-	border-radius: 50%;
+	border-radius: 24rpx;
 	background: rgba(0, 0, 0, 0.45);
 	display: flex;
 	align-items: center;
@@ -243,80 +255,114 @@ export default {
 }
 
 .item-value {
-	font-size: 30rpx;
-	color: #666;
-	margin-right: 15rpx;
+	font-size: 28rpx;
+	color: #8896A8;
+	margin-right: 12rpx;
 }
 
 .item-value.readonly {
-	color: #aaa;
+	color: #B0B8C5;
 	margin-right: 0;
 }
 
 .icon-more {
 	width: 14rpx;
 	height: 14rpx;
-	border-top: 3rpx solid #ccc;
-	border-right: 3rpx solid #ccc;
+	border-top: 3rpx solid #CBD2DB;
+	border-right: 3rpx solid #CBD2DB;
 	transform: rotate(45deg);
 }
 
 .section-card {
 	background: #fff;
 	border-radius: 24rpx;
-	padding: 30rpx 40rpx;
+	padding: 36rpx;
+	margin: 0 24rpx;
+	box-shadow: 0 2rpx 16rpx rgba(0, 0, 0, 0.02);
 }
 
 .section-header {
 	display: flex;
 	justify-content: space-between;
 	align-items: center;
-	margin-bottom: 24rpx;
+	margin-bottom: 28rpx;
+}
+
+.sh-left {
+	display: flex;
+	align-items: center;
+	gap: 16rpx;
+}
+
+.sh-indicator {
+	width: 6rpx;
+	height: 36rpx;
+	background: linear-gradient(180deg, #C1001C 0%, #E8553D 100%);
+	border-radius: 3rpx;
 }
 
 .section-title {
-	font-size: 32rpx;
-	font-weight: bold;
-	color: #333;
+	font-size: 30rpx;
+	font-weight: 700;
+	color: #1A1A2E;
+}
+
+.sh-count {
+	display: flex;
+	align-items: baseline;
+	background: #F4F6F9;
+	border-radius: 16rpx;
+	padding: 6rpx 20rpx;
+}
+
+.count-num {
+	font-size: 28rpx;
+	font-weight: 700;
+	color: #C1001C;
 }
 
-.section-desc {
-	font-size: 24rpx;
-	color: #999;
+.count-unit {
+	font-size: 22rpx;
+	color: #8896A8;
+	margin-left: 2rpx;
 }
 
 .client-list {
 	display: flex;
 	flex-direction: column;
+	gap: 4rpx;
 }
 
 .client-item {
 	display: flex;
 	align-items: center;
-	padding: 24rpx 0;
-	border-bottom: 1rpx solid #f5f6f7;
+	padding: 22rpx 0;
+	border-bottom: 1rpx solid #F0F0F3;
 }
 
 .client-item:last-child {
 	border-bottom: none;
 }
 
-.client-index {
-	width: 48rpx;
-	height: 48rpx;
-	border-radius: 50%;
-	background: #F5F7FA;
-	color: #666;
-	font-size: 24rpx;
-	font-weight: 600;
+.ci-avatar {
+	width: 76rpx;
+	height: 76rpx;
+	border-radius: 20rpx;
+	background: linear-gradient(135deg, #F9EAEC 0%, #FFF1F2 100%);
 	display: flex;
 	align-items: center;
 	justify-content: center;
-	margin-right: 24rpx;
+	margin-right: 20rpx;
 	flex-shrink: 0;
 }
 
-.client-info {
+.ci-char {
+	font-size: 34rpx;
+	font-weight: 700;
+	color: #C1001C;
+}
+
+.ci-body {
 	flex: 1;
 	display: flex;
 	flex-direction: column;
@@ -324,29 +370,32 @@ export default {
 	min-width: 0;
 }
 
-.client-name {
-	font-size: 28rpx;
-	color: #333;
-	font-weight: 500;
+.ci-name {
+	font-size: 30rpx;
+	color: #1A1A2E;
+	font-weight: 600;
+	overflow: hidden;
+	text-overflow: ellipsis;
+	white-space: nowrap;
 }
 
-.client-meta {
+.ci-meta {
 	display: flex;
 	align-items: center;
-	gap: 16rpx;
+	gap: 14rpx;
 }
 
-.client-class {
-	font-size: 24rpx;
-	color: #C1001C;
-	background: rgba(193, 0, 28, 0.06);
-	padding: 2rpx 12rpx;
-	border-radius: 6rpx;
+.ci-tag {
+	font-size: 22rpx;
+	color: #5A6577;
+	background: #F4F6F9;
+	padding: 4rpx 14rpx;
+	border-radius: 8rpx;
 }
 
-.client-date {
+.ci-date {
 	font-size: 22rpx;
-	color: #999;
+	color: #B0B8C5;
 }
 
 .no-client {
@@ -357,6 +406,6 @@ export default {
 
 .no-client-text {
 	font-size: 26rpx;
-	color: #ccc;
+	color: #B0B8C5;
 }
 </style>

+ 8 - 2
pages/order/add-model/index.vue

@@ -254,6 +254,8 @@ export default {
 			surfaceBreadcrumbs: [],
 			surfacePickerLevel: 1,
 			packagePageNum: 1, packagePageSize: 10, packageHasMore: true, packageLoading: false,
+			placer: '',
+			clientId: '',
 			formData: {
 				type: '', modelId: '', name: '', material: '',
 				surfaceName: '', surfaceId: '', packageMethod: '', packageId: '', length: '',
@@ -261,7 +263,9 @@ export default {
 			}
 		}
 	},
-	async onLoad() {
+	async onLoad(options) {
+		if (options.placer) this.placer = options.placer;
+		if (options.clientId) this.clientId = options.clientId;
 		await this.loadPackageMethods();
 	},
 	methods: {
@@ -533,7 +537,9 @@ export default {
 				length: parseFloat(this.formData.length || 0).toFixed(4),
 				wallThickness: parseFloat(this.formData.wallThickness || 0).toFixed(4),
 				meterWeight: this.formData.meterWeight ? parseFloat(this.formData.meterWeight || 0).toFixed(4) : null,
-				count: parseInt(this.formData.count || 0)
+				count: parseInt(this.formData.count || 0),
+				placer: this.placer || null,
+				clientId: this.clientId || null
 			};
 
 			uni.showLoading({ title: '正在保存...' });

+ 17 - 12
pages/order/index.vue

@@ -310,7 +310,11 @@ export default {
 		async loadOrderItems(showFullLoading = true) {
 			if (showFullLoading) this.isLoading = true;
 			try {
-				const res = await listOrderDetail({ orderId: '' });
+				const res = await listOrderDetail({
+					orderId: '',
+					placer: this.myInfo.id || '',
+					clientId: this.selectedClientId || ''
+				});
 				this.selectedModels = res.data || [];
 			} catch (e) {
 				console.error('加载型号列表失败', e);
@@ -393,8 +397,10 @@ export default {
 		},
 		contactAdmin() { uni.showModal({ title: '联系管理员', content: '管理员电话:138-0000-0000', showCancel: false, confirmColor: '#C1001C' }); },
 		goToAddModel() {
+			const placer = this.myInfo.id || '';
+			const clientId = this.selectedClientId || '';
 			uni.navigateTo({
-				url: '/pages/order/add-model/index'
+				url: `/pages/order/add-model/index?placer=${placer}&clientId=${clientId}`
 			});
 		},
 		editItem(index, item) {
@@ -677,9 +683,10 @@ export default {
 				this.showConfirmPopup = false;
 				const orderId = submitRes.data;
 				uni.showToast({ title: '下单成功', icon: 'success' });
+				const query = `orderId=${orderId}&clientId=${encodeURIComponent(this.confirmClientId || '')}&clientName=${encodeURIComponent(this.confirmClientName || '')}`;
 				setTimeout(() => {
 					uni.navigateTo({
-						url: '/pages/order/success/index?orderId=' + orderId
+						url: '/pages/order/success/index?' + query
 					});
 				}, 1500);
 			} catch (e) {
@@ -892,7 +899,7 @@ export default {
 
 .list-wrapper {
 	padding: 30rpx;
-	padding-bottom: calc(170rpx + env(safe-area-inset-bottom));
+	padding-bottom: 30rpx;
 }
 
 .list-header {
@@ -1075,7 +1082,7 @@ export default {
 .floating-add-btn {
 	position: fixed;
 	right: 40rpx;
-	bottom: calc(260rpx + env(safe-area-inset-bottom) + 40rpx);
+	bottom: calc(150rpx + env(safe-area-inset-bottom));
 	width: 110rpx;
 	height: 110rpx;
 	background: #C1001C;
@@ -1118,14 +1125,13 @@ export default {
 	bottom: 0;
 	left: 0;
 	width: 100%;
-	height: 130rpx;
 	background: #fff;
 	border-top: 1rpx solid #f0f0f0;
 	display: flex;
 	align-items: center;
 	justify-content: space-between;
-	padding: 0 40rpx;
-	padding-bottom: env(safe-area-inset-bottom);
+	padding: 20rpx 40rpx;
+	padding-bottom: calc(20rpx + env(safe-area-inset-bottom));
 	box-sizing: border-box;
 	z-index: 99;
 	box-shadow: 0 -10rpx 40rpx rgba(0, 0, 0, 0.05);
@@ -1257,7 +1263,7 @@ export default {
 }
 
 .bottom-safe-space {
-	height: 100rpx;
+	height: calc(140rpx + env(safe-area-inset-bottom));
 }
 
 /* 加载动画样式 */
@@ -1365,14 +1371,13 @@ export default {
 	bottom: 0;
 	left: 0;
 	width: 100%;
-	height: 110rpx;
 	background: #fff;
 	border-top: 1rpx solid #f0f0f0;
 	display: flex;
 	align-items: center;
 	justify-content: space-between;
-	padding: 0 30rpx;
-	padding-bottom: env(safe-area-inset-bottom);
+	padding: 20rpx 30rpx;
+	padding-bottom: calc(20rpx + env(safe-area-inset-bottom));
 	box-sizing: border-box;
 	z-index: 100;
 	box-shadow: 0 -4rpx 20rpx rgba(0, 0, 0, 0.05);

+ 69 - 7
pages/order/list/index.vue

@@ -1,6 +1,14 @@
 <template>
 	<view class="list-page-container">
-		<erp-nav-bar :title="clientName ? clientName + ' · 订单' : '全部订单'" />
+		<erp-nav-bar title="订单列表" />
+
+		<!-- 当前已选客户 -->
+		<view class="client-strip" v-if="clientName">
+			<view class="cs-accent"></view>
+			<text class="cs-label">当前客户</text>
+			<text class="cs-divider">·</text>
+			<text class="cs-name">{{ clientName }}</text>
+		</view>
 
 		<!-- 2. 分类切换:使用 scroll-view 滚动,彻底释放所有综合状态 -->
 		<scroll-view scroll-x class="tabs-fixed" :show-scrollbar="false" :scroll-with-animation="true"
@@ -19,9 +27,10 @@
 			</view>
 		</scroll-view>
 
-		<!-- 3. 固定高度的滚动区:强制启用滚动,解决不能滑动问题 -->
+		<!-- 3. 固定高度的滚动区 -->
 		<scroll-view scroll-y class="order-scroll-view" :style="{ height: scrollHeight }" @scrolltolower="onReachEnd"
-			:refresher-enabled="false" :show-scrollbar="false">
+			:refresher-enabled="true" :refresher-triggered="refresherTriggered" @refresherrefresh="onPullDownRefresh"
+			:show-scrollbar="false">
 
 			<view class="order-list-inner">
 				<view class="order-card" v-for="(item, index) in displayList" :key="index" @click="goDetail(item)">
@@ -99,6 +108,7 @@ export default {
 			currentTab: 0,
 			loading: false,
 			noMore: false,
+			refresherTriggered: false,
 			pageNum: 1,
 			tabs: ['全部', '待确认', '已确认', '已审核', '已签批', '挤压完成', '生产完成', '已取消'],
 			clientId: '',
@@ -109,8 +119,8 @@ export default {
 	},
 	computed: {
 		scrollHeight() {
-			// 减去状态栏、导航栏、选项卡的高度
-			return `calc(100vh - ${this.statusBarHeight + this.navBarHeight + this.tabBarHeight}px)`;
+			const clientBarH = this.clientName ? 35 : 0;
+			return `calc(100vh - ${this.statusBarHeight + this.navBarHeight + this.tabBarHeight + clientBarH}px)`;
 		}
 	},
 	onLoad(options) {
@@ -126,6 +136,15 @@ export default {
 	methods: {
 		goBack() { uni.navigateBack(); },
 		switchTab(i) { this.currentTab = i; this.refresh(); },
+		onPullDownRefresh() {
+			this.refresherTriggered = true;
+			this.displayList = [];
+			this.noMore = false;
+			this.pageNum = 1;
+			this.loadData().finally(() => {
+				this.refresherTriggered = false;
+			});
+		},
 		refresh() { this.displayList = []; this.noMore = false; this.pageNum = 1; this.loadData(); },
 		onReachEnd() { if (!this.loading && !this.noMore) this.loadData(); },
 		async loadData() {
@@ -169,7 +188,7 @@ export default {
 						time: item.createTime,
 						totalCount: item.totalCount || 0,
 						models: (item.details || []).map(d => ({
-							type: d.modelNum || '未知型号',
+							type: d.modelName || d.modelNum || '未知型号',
 							length: Number(d.length || 0).toFixed(4),
 							surface: d.surfaceName || '无',
 							count: d.count || 0
@@ -290,6 +309,43 @@ export default {
 	width: 100%;
 }
 
+.client-strip {
+	display: flex;
+	align-items: center;
+	padding: 18rpx 32rpx;
+	background: linear-gradient(180deg, rgba(193, 0, 28, 0.03) 0%, transparent 100%);
+}
+
+.cs-accent {
+	width: 8rpx;
+	height: 8rpx;
+	background: #C1001C;
+	border-radius: 50%;
+	margin-right: 14rpx;
+	flex-shrink: 0;
+}
+
+.cs-label {
+	font-size: 26rpx;
+	color: #8896A8;
+	flex-shrink: 0;
+}
+
+.cs-divider {
+	margin: 0 10rpx;
+	font-size: 22rpx;
+	color: #CBD2DB;
+}
+
+.cs-name {
+	font-size: 26rpx;
+	color: #1A1A2E;
+	font-weight: 500;
+	overflow: hidden;
+	text-overflow: ellipsis;
+	white-space: nowrap;
+}
+
 .order-list-inner {
 	padding: 30rpx;
 	padding-bottom: 60rpx;
@@ -374,12 +430,17 @@ export default {
 	font-size: 28rpx;
 	font-weight: bold;
 	color: #333;
-	width: 140rpx;
+	flex: 1;
+	min-width: 0;
+	overflow: hidden;
+	text-overflow: ellipsis;
+	white-space: nowrap;
 }
 
 .m-spec {
 	color: #888;
 	flex: 1;
+	min-width: 0;
 	padding: 0 20rpx;
 	overflow: hidden;
 	text-overflow: ellipsis;
@@ -389,6 +450,7 @@ export default {
 .m-count {
 	color: #555;
 	width: 100rpx;
+	flex-shrink: 0;
 	text-align: right;
 	font-weight: 500;
 }

+ 14 - 25
pages/order/success/index.vue

@@ -7,12 +7,8 @@
 			<text class="status-desc">您的订单已提交,正在等待业务员审核</text>
 
 			<view class="btn-group">
-				<!-- 查看订单:主按钮 -->
 				<button class="primary-btn" @click="viewOrder">查看订单</button>
-				<!-- 再来一单:次按钮 -->
 				<button class="outline-btn" @click="handleReorder">再来一单</button>
-				<!-- 返回下单页面:文字/轻量化链接风格按钮 -->
-				<button class="text-btn" @click="handleReorder">返回下单页面</button>
 			</view>
 		</view>
 	</view>
@@ -24,21 +20,29 @@ export default {
 	components: { ErpNavBar },
 	data() {
 		return {
-			orderId: ''
+			orderId: '',
+			clientId: '',
+			clientName: ''
 		}
 	},
 	onLoad(options) {
 		if (options.orderId) {
 			this.orderId = options.orderId;
 		}
+		if (options.clientId) {
+			this.clientId = decodeURIComponent(options.clientId);
+		}
+		if (options.clientName) {
+			this.clientName = decodeURIComponent(options.clientName);
+		}
 	},
 	methods: {
-		// 将再来一单和返回页面功能合并:通过 reLaunch 自动重置数据
 		handleReorder() {
-			// reLaunch 会重新加载页面,彻底清空原有表单数据
-			uni.reLaunch({
-				url: '/pages/order/index'
-			});
+			let url = '/pages/order/index';
+			if (this.clientId) {
+				url += `?clientId=${this.clientId}&clientName=${encodeURIComponent(this.clientName)}`;
+			}
+			uni.reLaunch({ url });
 		},
 		viewOrder() {
 			if (!this.orderId) {
@@ -129,19 +133,4 @@ export default {
 	justify-content: center;
 	border: 2rpx solid #C1001C;
 }
-
-.text-btn {
-	margin-top: 20rpx;
-	background: transparent;
-	color: #666;
-	font-size: 28rpx;
-	border: none;
-	text-decoration: underline;
-	/* 增加下划线提示可点击 */
-}
-
-.text-btn:active {
-	color: #333;
-	opacity: 0.8;
-}
 </style>