XSLu08042 пре 7 часа
родитељ
комит
b87be82ec8

+ 1 - 1
common/request.js

@@ -6,7 +6,7 @@ export default class Request {
 		// var path=uni.getStorageSync('requestPath')
 
 		var path = 'https://storeuserapp.bjyjbao.com'; //正式
-		// var path = "http://ga54cea4.natappfree.cc"
+		// var path = "http://b5a69d43.natappfree.cc"
 		// var path = "http://192.168.10.196:8113"
 		let token="";
 		let type = 0

+ 133 - 0
components/recommendCategory.vue

@@ -0,0 +1,133 @@
+<template>
+	<view class="category-box box">
+		<swiper
+			:indicator-dots="false"
+			:current="current"
+			@change="onSwiperChange"
+			class="swiper"
+		>
+			<swiper-item v-for="(page, pageIndex) in pageList" :key="pageIndex">
+				<view class="category-list">
+					<view class="category-item" v-for="(item, index) in page" :key="index" @click="handleClick(item)">
+						<image :src="item.dictImage" mode="aspectFill"></image>
+						<view>{{ item.dictLabel || '' }}</view>
+					</view>
+				</view>
+			</swiper-item>
+		</swiper>
+		<view v-if="list.length > perPage" class="indicator">
+			<view
+				class="indicator-bar"
+				:class="{ active: pageIndex === current }"
+				v-for="(page, pageIndex) in pageList"
+				:key="pageIndex"
+			></view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: 'recommendCategory',
+		props: {
+			list: {
+				type: Array,
+				default: () => []
+			}
+		},
+		data() {
+			return {
+				current: 0
+			}
+		},
+		computed: {
+			perPage() {
+				return 8
+			},
+			pageList() {
+				const pages = []
+				for (let i = 0; i < this.list.length; i += this.perPage) {
+					pages.push(this.list.slice(i, i + this.perPage))
+				}
+				return pages
+			}
+		},
+		methods: {
+			onSwiperChange(e) {
+				this.current = e.detail.current
+			},
+			handleClick(item) {
+				if (item.dictValue) {
+					uni.navigateTo({
+						url: '/pages_shopping/home/productList?tuiCateId=' + item.dictValue + '&title=' + encodeURIComponent(item.dictLabel || '')
+					})
+				} else if (item.page) {
+					uni.navigateTo({
+						url: item.page
+					})
+				}
+				this.$emit('click', item)
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.box {
+		background: #FFFFFF;
+		border-radius: 16rpx;
+		margin: 24rpx;
+		box-sizing: border-box;
+		padding: 26rpx 0 6rpx 0;
+	}
+
+	.swiper {
+		height: 364rpx;
+	}
+
+	.category-list {
+		display: flex;
+		align-items: center;
+		justify-content: flex-start;
+		flex-wrap: wrap;
+	}
+
+	.category-item {
+		width: 25%;
+		font-family: PingFang SC, PingFang SC;
+		font-weight: 400;
+		font-size: 24rpx;
+		color: #222222;
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		margin-bottom: 20rpx;
+
+		image {
+			width: 104rpx;
+			height: 104rpx;
+			margin-bottom: 26rpx;
+			border-radius: 16rpx;
+		}
+	}
+
+	.indicator {
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		margin-top: 6rpx;
+
+		.indicator-bar {
+			width: 40rpx;
+			height: 4rpx;
+			border-radius: 2rpx;
+			background: rgba(37, 131, 235, 0.3);
+			margin: 0 6rpx;
+			transition: background 0.3s;
+
+			&.active {
+				background: #2583EB;
+			}
+		}
+	}
+</style>

+ 1 - 1
pages.json

@@ -2375,7 +2375,7 @@
 				"pagePath": "pages/shopping/index",
 				"iconPath": "/static/tabbar/store.png",
 				"selectedIconPath": "/static/tabbar/store_select.png",
-				"text": "药品"
+				"text": "商城"
 			},
 			{
 				"pagePath": "pages/user/index",

+ 1 - 1
pages/index/content.vue

@@ -15,7 +15,7 @@
  		}
  	},
 	onLoad(val) {
-		var info=uni.getStorageSync('content');
+		this.content=uni.getStorageSync('content');
 		console.log(this.content)
 	}
  	 

+ 27 - 3
pages/index/index.vue

@@ -56,6 +56,8 @@
 				</view>
 				<view class="modules">
 					<view class="module" v-for="(it,index) in layouts" :key="index">
+						<!-- 推荐分类 -->
+						<recommendCategory :list="tuiCates" v-if="it.id==10&&it.isShow&&tuiCates.length>0" title="推荐分类"></recommendCategory>
 						<!-- 推荐药品 -->
 						<tuiProduct ref="tuiProduct" v-if="it.id==8&&it.isShow"></tuiProduct>
 						<!-- 特色药店 -->
@@ -273,7 +275,8 @@
 </template>
 <script>
 	import tuiProduct from "@/components/tuiProduct.vue"
-	import {getConfigByKey} from '@/api/common'
+	import recommendCategory from "@/components/recommendCategory.vue"
+	import {getConfigByKey,getDicts} from '@/api/common'
 	import {getPackageList} from '@/api/package.js'
 	import {getDoctorArticleList} from '@/api/doctorArticle.js'
 	import {getDoctorList} from '@/api/doctor.js'
@@ -284,7 +287,8 @@
 	import {validList,getCartCount}from '@/api/index.js'
 	export default {
 		components: {
-			tuiProduct
+			tuiProduct,
+			recommendCategory
 		},
 		data() {
 			return {
@@ -316,7 +320,8 @@
 				hosLevelOptions:[],
 				packages:[],
 				storeIndexList: [],
-				qual: {}
+				qual: {},
+				tuiCates: []
 			}
 		},
 		onLoad() {
@@ -361,6 +366,7 @@
 			// this.getPackageList();
 			this.getConfigByKey("his.appShow");
 			this.getQual()
+			this.getTuiCate()
 			this.getStore()
 			var that=this;
 			uni.$emit('refreshMsgCount');
@@ -467,6 +473,24 @@
 					rej => {}
 				);
 			},
+			getTuiCate(){
+				getDicts().then(
+					res => {
+						if(res.code==200){
+							uni.setStorageSync('dicts', JSON.stringify(res));
+							const key = 'storeProductTuiCate'
+							let dict=Array.isArray(key) ? key : res[key];
+							this.tuiCates=dict;
+						}else{
+							uni.showToast({
+								icon:'none',
+								title: "请求失败",
+							});
+						}
+					},
+					rej => {}
+				);
+			},
 			getConfigByKey(key){
 				var that=this;
 				var data={key:key,appId:wx.getAccountInfoSync().miniProgram.appId,}

+ 3 - 3
pages_company/index.vue

@@ -142,9 +142,9 @@
 						else if(res.code==403){
 							uni.setStorageSync('companyUserId',null);
 							uni.setStorageSync('CompanyUserToken',null);
-							uni.navigateBack({
-								delta:-1
-							})			
+							uni.redirectTo({
+								url: '/pages_company/auth/login'
+							}) 		
 						}else{
 							uni.showToast({
 								icon:'none',

+ 7 - 1
pages_company/order/confirmCompanyOrder.vue

@@ -61,6 +61,10 @@
 					</view>
 				</view>
 			</view>
+			<view class="pay-type-title">备注</view>
+			<view class="remarks">
+				<input type="text" v-model="mark" placeholder="备注留言(选填)" class="intxt" maxlength="1000" />
+			</view>
 			<view class="pay-type-title">支付方式</view>
 			<view class="pay-type">
 				<radio-group @change="payTypeChange">
@@ -142,6 +146,7 @@
 				inputTxt:null,
 				editAmount:null,
 				orderKey:null,
+				mark: '',
 				price:{
 					payPrice:0.00,
 					totalPrice:0.00,
@@ -217,7 +222,8 @@
 					const param = {
 						payType:this.payType,
 						userId:uni.getStorageSync('companyUserId'),
-						cateIds: cateIds
+						cateIds: cateIds,
+						mark: this.mark,
 					}
 					cachePayInfo(param).then(res=>{
 						if(res.code==200){

+ 16 - 0
pages_company/storeOrderDetail.vue

@@ -173,6 +173,15 @@
 							<text class="label">支付方式</text>
 							<text class="text" v-if="order.payType==1">全款支付</text>
 							<text class="text" v-if="order.payType==2">先定后付</text>
+							<text class="text" v-if="order.payType==3">货到付款</text>
+						</view>
+						<view   class="item">
+							<text class="label">优惠券抵扣</text>
+							<text class="text" v-if="order.couponId!=null&&order.couponPrice!=null">¥{{order.couponPrice.toFixed(2)}}</text>
+						</view>
+						<view   class="item">
+							<text class="label">活动优惠金额</text>
+							<text class="text" v-if="order.promotionDiscountAmount!=null">-¥{{order.promotionDiscountAmount.toFixed(2)}}</text>
 						</view>
 						<view   class="item">
 							<text class="label">支付金额</text>
@@ -186,6 +195,10 @@
 							<text class="label">支付时间</text>
 							<text class="text">{{order.payTime}}</text>
 						</view>
+						<view class="item" v-if="order.mark">
+							<text class="label">订单备注</text>
+							<text class="text">{{order.mark}}</text>
+						</view>
 						<!-- <view v-if="order.status >1" class="item">
 							<text class="label">发货时间</text>
 							<text class="text"></text>
@@ -615,6 +628,7 @@
 					margin-right: 30upx;
 				}
 				.label{
+					flex-shrink: 0;
 					font-size: 24upx;
 					font-family: PingFang SC;
 					font-weight: 500;
@@ -659,6 +673,7 @@
 				align-items: center;
 				justify-content: space-between;
 				.label{
+					flex-shrink: 0;
 					font-size: 26upx;
 					font-family: PingFang SC;
 					font-weight: 500;
@@ -802,6 +817,7 @@
 					align-items: flex-start;
 					border-bottom: 1px solid #F1F1F1;
 					.label{
+						flex-shrink: 0;
 						width: 160upx;
 						text-align: left;
 						font-size: 30upx;

+ 1 - 0
pages_order/storeOrderDetail.vue

@@ -143,6 +143,7 @@
 							<text class="label">支付方式</text>
 							<text class="text" v-if="order.payType==1">全款支付</text>
 							<text class="text" v-if="order.payType==2">先定后付</text>
+							<text class="text" v-if="order.payType==3">货到付款</text>
 						</view>
 						<view   class="item">
 							<text class="label">订单金额</text>

+ 1 - 1
pages_order/storeOrderRefundApply.vue

@@ -32,7 +32,7 @@
 				 <view class="left"></view>
 				<view class="right">
 					<view  class="btn cancel" v-if="order.status==2 || order.status==3" @click="submit(0)" >仅退款</view>
-					<view  class="btn cancel" v-if="order.status==3||order.status==4" @click="submit(1)"  >退款退货</view>
+					<view  class="btn cancel" v-if="order.status==3||order.status==4" @click="submit(1)"  >退货退款</view>
 				</view>
 				
 			</view>

+ 5 - 2
pages_shopping/api/product.js

@@ -36,8 +36,11 @@ let request = new Request().http
  	 return request('/store/app/product/getGoodsProducts',data,'GET');
  }
  export function getTuiProducts(data) {
- 	 return request('/store/app/product/getTuiProducts',data,'GET');
- }
+  	 return request('/store/app/product/getTuiProducts',data,'GET');
+  }
+ export function getProductsByTuiCateId(data) {
+  	 return request('/store/app/product/getProductsByTuiCateId',data,'GET');
+  }
  export function getStoreProductAttrValueList(data) {
  	 return request('/store/app/product/getStoreProductAttrValueList',data,'GET');
  }

+ 42 - 3
pages_shopping/confirmCreateOrder.vue

@@ -116,6 +116,15 @@
 							mode=""></image>
 					</view>
 				</view>
+				<view class="points">
+					<view class="left">
+						<text class="text">活动优惠金额</text>
+					</view>
+					<view class="right" style="align-items: baseline;">
+						<text class="price-info-unit">¥</text>
+						<text class="price-info-num">{{priceAll.promotionDiscountAmount.toFixed(2)}}</text>
+					</view>
+				</view>
 				<view class="points">
 					<view class="left">
 						<text class="text">合计</text>
@@ -199,7 +208,7 @@
 <script>
 	import {getWeixinOrderTemps} from '@/api/common'
 
-	import { confirm, computed, create,selectCacheAddress,editPayTypeByCombinationId } from '@/api/myStoreOrder.js'
+	import { confirm, computed, create,selectCacheAddress,editPayTypeByCombinationId,selectPayInfo } from '@/api/myStoreOrder.js'
 	import {getMyEnableCouponList} from './api/coupon'
 	import popupBottom from '@/components/px-popup-bottom.vue'
 
@@ -236,7 +245,9 @@
 					totalPostage: 0,
 					usedIntegral: 0,
 					totalPrice: 0.00,
+					promotionDiscountAmount:0.00
 				},
+				markinfo: '',
 				confirmParam: [],
 				dataKey: '',
 				dataPrescribeKey:'',
@@ -314,6 +325,30 @@
 					}
 				})
 			},
+			getPayInfo() {
+				const param = {
+					dataKey: this.payTypeKey,
+					userId: this.form.companyUserId,
+				}
+				return new Promise((resolve) => {
+					selectPayInfo(param).then(res => {
+						if (res.code == 200) {
+							this.payType = res.data.payType;
+							if (res.data.mark) {
+								this.markinfo = res.data.mark;
+								if (this.carts.length > 0) {
+									this.carts.forEach(item => {
+										item.markinfo = res.data.mark;
+									});
+								}
+							}
+						}
+						resolve(res)
+					}).catch(err => {
+						resolve(err)
+					})
+				})
+			},
 			handleAgreement() {
 				this.isAgreement = !this.isAgreement;
 			},
@@ -352,14 +387,17 @@
 				this.form.useIntegral = e ? 1 : 0
 				this.computed()
 			},
-			confirm() {
+			async confirm() {
+				if(this.payTypeKey) {
+					await this.getPayInfo()
+				}
 				if (this.confirmParam && this.confirmParam.length > 0) {
 					confirm(this.confirmParam).then(
 						res => {
 							if (res.code == 200) {
 								this.carts = res.carts.map(item => ({
 									...item,
-									markinfo: ""
+									markinfo: this.markinfo || ""
 								}));
 								this.form.orderKey = res.orderKeys;
 								if (res.address != null) {
@@ -401,6 +439,7 @@
 								totalPostage: 0,
 								usedIntegral: 0,
 								totalPrice: 0.00,
+								promotionDiscountAmount: 0.00,
 							}
 						} else {
 							if (res.code == 501) {

+ 11 - 0
pages_shopping/confirmOrder.vue

@@ -105,6 +105,15 @@
 						<image src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/app/newImages/shopping/arrow4.png" mode=""></image>
 					</view>
 				</view>
+				<view class="points">
+					<view class="left">
+						<text class="text">活动优惠金额</text>
+					</view>
+					<view class="right" style="align-items: baseline;">
+						<text class="price-info-unit">¥</text>
+						<text class="price-info-num">{{priceAll.promotionDiscountAmount.toFixed(2)}}</text>
+					</view>
+				</view>
 				<view class="points">
 					<view class="left">
 						<text class="text">合计</text>
@@ -218,6 +227,7 @@
 					totalPostage:0,
 					usedIntegral:0,
 					totalPrice:0.00,
+					promotionDiscountAmount:0.00
 				},
 				confirmParam: []
 			}
@@ -338,6 +348,7 @@
 								 totalPostage:0,
 								 usedIntegral:0,
 								 totalPrice:0.00,
+								 promotionDiscountAmount:0.00,
 							 }
 						}else{
 							if(res.code==501){

+ 13 - 9
pages_shopping/home/productList.vue

@@ -92,14 +92,14 @@
 
 <script>
 	import medicineItem from '@/components/medicineItem.vue'
-	import {getProducts} from '../api/product.js'
+	import {getProducts, getProductsByTuiCateId} from '../api/product.js'
 	import MescrollMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js";
 	export default {
 		mixins: [MescrollMixin], 
 		components:{
 			medicineItem
 		},
-		data() {
+			data() {
 			return {
 				showType:1,
 				form:{
@@ -133,7 +133,8 @@
 				},
 				// 列表数据
 				dataList: [],
-				storeId: ""
+				storeId: "",
+				tuiCateId: ""
 			};
 		},
 		computed: {
@@ -156,6 +157,12 @@
 			}
 			this.storeId = option.storeId || ""
 			this.form.storeId = this.storeId
+			this.tuiCateId = option.tuiCateId || ""
+			if (option.title) {
+				uni.setNavigationBarTitle({
+					title: decodeURIComponent(option.title)
+				})
+			}
 		},
 		methods:{
 			goSearch(e) {
@@ -220,22 +227,19 @@
 				mescroll.resetUpScroll()
 			},
 			upCallback(page) {
-				//联网加载数据
 				var that = this;
 				this.form.page=page.num;
 				this.form.pageSize=page.size;
-				getProducts(this.form).then(res => {
+				var api = this.tuiCateId ? getProductsByTuiCateId : getProducts;
+				var params = this.tuiCateId ? { ...this.form, tuiCateId: this.tuiCateId } : this.form;
+				api(params).then(res => {
 					if(res.code==200){
-						//设置列表数据
 						if (page.num == 1) {
 							that.dataList = res.data.list; 
-							
 						} else {
 							that.dataList = that.dataList.concat(res.data.list);
-							 
 						}
 						that.mescroll.endBySize(res.data.list.length, res.data.total);
-						
 					}else{
 						uni.showToast({
 							icon:'none',

+ 6 - 6
pages_shopping/registerMerchant.vue

@@ -337,13 +337,13 @@
 						<u-form-item required labelWidth="auto"  borderBottom label="发货联系电话" prop="sendPhone">
 							<u-input border="none" placeholder="请输入发货联系电话" v-model="form.sendPhone"  maxlength="20" />
 						</u-form-item>
-						<u-form-item required labelWidth="auto"  borderBottom label="配送方式" prop="shippingType">
+					<!-- 	<u-form-item required labelWidth="auto"  borderBottom label="配送方式" prop="shippingType">
 							<u-radio-group placement="row" v-model="form.shippingType" >
 								<u-radio activeColor="#2583EB" :customStyle="{marginRight: '8px'}" key="1" label="配送" name="1" > </u-radio>
 								<u-radio activeColor="#2583EB" :customStyle="{marginRight: '8px'}" key="2" label="到店自提" name="2" > </u-radio>
 								<u-radio activeColor="#2583EB" :customStyle="{marginRight: '8px'}" key="3" label="配送、自提" name="3" > </u-radio>
 							 </u-radio-group>
-						</u-form-item>
+						</u-form-item> -->
 						<u-form-item required labelWidth="auto"  borderBottom label="退货联系人" prop="refundConsignee">
 							<u-input border="none" placeholder="请输入退货联系人" v-model="form.refundConsignee"  maxlength="20" />
 						</u-form-item>
@@ -353,12 +353,12 @@
 						<u-form-item required labelWidth="auto"  borderBottom label="退货地址" prop="refundAddress">
 							<u-input border="none" placeholder="请输入退货地址" v-model="form.refundAddress"  maxlength="100" />
 						</u-form-item>
-						<u-form-item required labelWidth="auto"  borderBottom label="佣金类型" prop="brokerageType">
+					<!-- 	<u-form-item required labelWidth="auto"  borderBottom label="佣金类型" prop="brokerageType">
 							<u-radio-group placement="row" v-model="form.brokerageType" >
 								<u-radio activeColor="#2583EB" :customStyle="{marginRight: '8px'}" key="1" label="每盒" name="1" > </u-radio>
 								<u-radio activeColor="#2583EB" :customStyle="{marginRight: '8px'}" key="2" label="总价" name="2" > </u-radio>
 							 </u-radio-group>
-						</u-form-item>
+						</u-form-item> -->
 						<u-form-item required labelWidth="auto"  borderBottom label="登录帐号" prop="account">
 							<u-input border="none" placeholder="请输入登录帐号" v-model="form.account"  maxlength="50" />
 						</u-form-item>
@@ -493,9 +493,9 @@ export default {
 				businessScope: [{required: true, message: '请输入经营范围'}],
 				refundAddress: [{required: true, message: '请输入退货地址'}],
 				refundConsignee: [{required: true, message: '请输入退货联系人'}],
-				brokerageType: [{required: true, message: '请选择佣金类型'}],
+				// brokerageType: [{required: true, message: '请选择佣金类型'}],
 				account: [{required: true, message: '请输入登录帐号'}],
-				shippingType: [{required: true, message: '请选择配送方式'}],
+				// shippingType: [{required: true, message: '请选择配送方式'}],
 				isBusinessLicensePermanent: [{required: true, message: '请选择营业执照是否长期有效'}],
 				isDrugLicensePermanent: [{required: true, message: '请选择药品经营许可证是否长期有效'}],
 				// isMedicalDevice2ExpiryPermanent: [{required: true, message: '请选择2类器械经营备案是否长期有效'}],

+ 192 - 0
pages_store/components/ActivityBanner.vue

@@ -0,0 +1,192 @@
+<template>
+	<view class="activity-banner" v-if="list && list.length > 0">
+		<swiper class="activity-swiper" :style="{height: swiperHeight}" circular autoplay interval="5000" duration="500">
+			<swiper-item v-for="(item, index) in list" :key="item.activityId">
+				<view class="activity-card type-reduction" >
+					<view class="card-left">
+						<view class="type-badge">{{ item.tierTypeLabel }}</view>
+						<view class="activity-title">{{ item.title }}</view>
+						<view class="rule-summary">{{ item.ruleSummary }}</view>
+						<view class="scope-info">
+							<u-icon name="tags" size="12" color="inherit"></u-icon>
+							<text class="scope-text">{{ item.scopeSummary }}</text>
+						</view>
+					</view>
+					<view class="card-right">
+						<view class="stack-info">{{ item.stackableText }}</view>
+						<view class="limit-info">{{ item.limitPerUserText }}</view>
+						<view class="end-time">至{{ formatDate(item.endTime) }}</view>
+					</view>
+					<!-- 装饰背景 -->
+					<view class="decoration-circle"></view>
+				</view>
+			</swiper-item>
+		</swiper>
+	</view>
+</template>
+
+<script>
+	export default {
+		props: {
+			list: {
+				type: Array,
+				default: () => []
+			}
+		},
+		data() {
+			return {
+				swiperHeight: '160rpx'
+			}
+		},
+		watch: {
+			list: {
+				handler(val) {
+					if (val && val.length > 0) {
+						this.updateHeight();
+					}
+				},
+				immediate: true
+			}
+		},
+		methods: {
+			updateHeight() {
+				this.$nextTick(() => {
+					setTimeout(() => {
+						const query = uni.createSelectorQuery().in(this);
+						query.selectAll('.activity-card').boundingClientRect(data => {
+							if (data && data.length > 0) {
+								// 取所有卡片中的最大高度
+								let maxHeight = 0;
+								data.forEach(item => {
+									if (item.height > maxHeight) maxHeight = item.height;
+								});
+								if (maxHeight > 0) {
+									this.swiperHeight = maxHeight + 'px';
+									this.$emit('heightChange');
+								}
+							}
+						}).exec();
+					}, 200);
+				});
+			},
+			formatDate(dateStr) {
+				if (!dateStr) return '';
+				// 简单的日期格式化,只保留月日
+				const date = new Date(dateStr.replace(/-/g, '/'));
+				if (isNaN(date.getTime())) return dateStr;
+				const month = (date.getMonth() + 1).toString().padStart(2, '0');
+				const day = date.getDate().toString().padStart(2, '0');
+				return `${month}-${day}`;
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.activity-banner {
+		padding: 20rpx 32rpx;
+		background: #fff;
+	}
+
+	.activity-swiper {
+		min-height: 160rpx;
+	}
+
+	.activity-card {
+		min-height: 160rpx;
+		height: auto;
+		border-radius: 16rpx;
+		padding: 20rpx 24rpx;
+		display: flex;
+		justify-content: space-between;
+		position: relative;
+		overflow: hidden;
+		color: #fff;
+		
+		&.type-reduction {
+			background: linear-gradient(135deg, #FF7E5F 0%, #FF5C03 100%);
+		}
+		
+		&.type-discount {
+			background: linear-gradient(135deg, #66b2ef 0%, #2583EB 100%);
+		}
+
+		.card-left {
+			flex: 1;
+			display: flex;
+			flex-direction: column;
+			justify-content: space-between;
+			z-index: 1;
+			overflow: hidden;
+			
+			.type-badge {
+				display: inline-block;
+				align-self: flex-start;
+				font-size: 18rpx;
+				padding: 2rpx 12rpx;
+				background: rgba(255, 255, 255, 0.2);
+				border: 1rpx solid rgba(255, 255, 255, 0.4);
+				border-radius: 20rpx;
+				margin-bottom: 8rpx;
+			}
+			
+			.activity-title {
+				font-size: 28rpx;
+				font-weight: bold;
+				line-height: 1.2;
+				margin-bottom: 4rpx;
+			}
+			
+			.rule-summary {
+				font-size: 24rpx;
+				font-weight: 500;
+				margin-bottom: 8rpx;
+			}
+			
+			.scope-info {
+				display: flex;
+				align-items: center;
+				font-size: 20rpx;
+				opacity: 0.9;
+				
+				.scope-text {
+					margin-left: 6rpx;
+				}
+			}
+		}
+
+		.card-right {
+			width: 200rpx;
+			display: flex;
+			flex-direction: column;
+			justify-content: center;
+			align-items: flex-end;
+			text-align: right;
+			z-index: 1;
+			border-left: 1rpx dashed rgba(255, 255, 255, 0.4);
+			padding-left: 16rpx;
+			
+			.stack-info, .limit-info {
+				font-size: 20rpx;
+				margin-bottom: 4rpx;
+			}
+			
+			.end-time {
+				font-size: 18rpx;
+				opacity: 0.8;
+				margin-top: 8rpx;
+			}
+		}
+
+		.decoration-circle {
+			position: absolute;
+			right: -40rpx;
+			bottom: -40rpx;
+			width: 120rpx;
+			height: 120rpx;
+			background: rgba(255, 255, 255, 0.1);
+			border-radius: 50%;
+			z-index: 0;
+		}
+	}
+</style>

+ 47 - 1
pages_store/index.vue

@@ -6,7 +6,19 @@
 				<view class="storebox-r">
 					<view class="x-bc" style="flex: 1;">
 						<view class="" @click="goStoreDetail">
-							<view class="storename">{{item.store.storeName || ''}}</view>
+							<view class="storename">
+								{{item.store.storeName || ''}}
+							</view>
+							<view class="activity-row" v-if="item.store.tierType">
+								<text class="activity-tag" v-if="item.store.tierType == 1">
+									<text class="tag-icon">减</text>
+									满减活动
+								</text>
+								<text class="activity-tag discount" v-else-if="item.store.tierType == 2">
+									<text class="tag-icon">折</text>
+									折扣活动
+								</text>
+							</view>
 							<!-- <view class="storedesc">24小时营业  销售{{item.store.salesCount|| 0}}</view> -->
 						</view>
 						<view class="storebox-btn" @click="navTo(item)">进店</u-icon></view>
@@ -203,6 +215,40 @@
 			font-weight: bold;
 			font-size: 32rpx;
 		}
+		.activity-row {
+			margin-top: 12rpx;
+			display: flex;
+			align-items: center;
+			flex-wrap: wrap;
+		}
+		.activity-tag {
+			display: inline-flex;
+			align-items: center;
+			font-size: 20rpx;
+			color: #FF5C03;
+			background: rgba(255, 92, 3, 0.08);
+			padding-right: 12rpx;
+			border-radius: 4rpx;
+			line-height: 32rpx;
+			height: 32rpx;
+			overflow: hidden;
+			.tag-icon {
+				background: #FF5C03;
+				color: #fff;
+				width: 32rpx;
+				height: 32rpx;
+				text-align: center;
+				margin-right: 8rpx;
+				font-size: 18rpx;
+			}
+			&.discount {
+				color: #2583EB;
+				background: rgba(37, 131, 235, 0.08);
+				.tag-icon {
+					background: #2583EB;
+				}
+			}
+		}
 		.storedesc {
 			margin-top: 12rpx;
 			font-weight: 400;

+ 47 - 1
pages_store/storeDetail.vue

@@ -4,7 +4,19 @@
 			<view class="x-f">
 				<image class="logo" :src="storeInfo.logoUrl" mode="aspectFill"></image>
 				<view class="storebox-r" @click="goStoreDetail">
-					<view class="storename ellipsis2">{{storeInfo.storeName}}</view>
+					<view class="storename ellipsis2">
+						{{storeInfo.storeName}}
+					</view>
+					<view class="activity-row" v-if="storeInfo.tierType">
+						<text class="activity-tag" v-if="storeInfo.tierType == 1">
+							<text class="tag-icon">减</text>
+							满减活动
+						</text>
+						<text class="activity-tag discount" v-else-if="storeInfo.tierType == 2">
+							<text class="tag-icon">折</text>
+							折扣活动
+						</text>
+					</view>
 					<!-- <view class="storedesc">24小时营业  销售{{storeInfo.salesCount|| 0}}</view> -->
 				</view>
 			</view>
@@ -220,6 +232,40 @@
 			font-weight: 500;
 			font-size: 32rpx;
 		}
+		.activity-row {
+			margin-top: 12rpx;
+			display: flex;
+			align-items: center;
+			flex-wrap: wrap;
+		}
+		.activity-tag {
+			display: inline-flex;
+			align-items: center;
+			font-size: 20rpx;
+			color: #FF5C03;
+			background: rgba(255, 92, 3, 0.08);
+			padding-right: 12rpx;
+			border-radius: 4rpx;
+			line-height: 32rpx;
+			height: 32rpx;
+			overflow: hidden;
+			.tag-icon {
+				background: #FF5C03;
+				color: #fff;
+				width: 32rpx;
+				height: 32rpx;
+				text-align: center;
+				margin-right: 8rpx;
+				font-size: 18rpx;
+			}
+			&.discount {
+				color: #2583EB;
+				background: rgba(37, 131, 235, 0.08);
+				.tag-icon {
+					background: #2583EB;
+				}
+			}
+		}
 		.storedesc {
 			margin-top: 12rpx;
 			font-weight: 400;

+ 65 - 11
pages_store/storeIndex.vue

@@ -16,12 +16,25 @@
 				<view class="x-f">
 					<image class="logo" :src="storeInfo.logoUrl" mode="aspectFill"></image>
 					<view class="storebox-r" @click="goStoreDetail">
-						<view class="storename ellipsis2">{{storeInfo.storeName}}</view>
+						<view class="storename ellipsis2">
+							{{storeInfo.storeName}}
+						</view>
+						<view class="activity-row" v-if="storeInfo.tierType">
+							<text class="activity-tag" v-if="storeInfo.tierType == 1">
+								<text class="tag-icon">减</text>
+								满减活动
+							</text>
+							<text class="activity-tag discount" v-else-if="storeInfo.tierType == 2">
+								<text class="tag-icon">折</text>
+								折扣活动
+							</text>
+						</view>
 						<!-- <view class="storedesc">24小时营业  销售{{storeInfo.salesCount|| 0}}</view> -->
 					</view>
 				</view>
 				<!-- <view class="storebox-btn" @click="goStoreDetail">详情</view> -->
 			</view>
+			<ActivityBanner :list="storeInfo.promotionActivities" @heightChange="updateTopHeight"></ActivityBanner>
 			<view class="top-fixed x-ac" style="background-color: #fff;">
 				 <view>
 					 <u-tabs
@@ -87,6 +100,7 @@
 <script>
 	import {getDicts} from '@/api/common.js'
 	import MescrollMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js";
+	import ActivityBanner from './components/ActivityBanner.vue'
 	import tuiStoreProduct from './components/tuiStoreProduct.vue'
 	import qualifications from './components/qualifications.vue'
 	import {getProductCate,storeDetail,getProducts} from '@/api/index.js'
@@ -99,6 +113,7 @@
 	export default {
 		mixins: [MescrollMixin], // 使用mixin
 		components: {
+			ActivityBanner,
 			tuiStoreProduct,
 			qualifications,
 			medicineVerticalItem,
@@ -197,16 +212,7 @@
 			this.$refs.tuiStoreProduct.getProducts(this.storeId)
 		},
 		onShow() {
-			var that=this;
-			setTimeout(function(){
-				let info = uni.createSelectorQuery().select(".top-content");
-		     info.boundingClientRect(function(data) { //data - 各种参数
-		//        	console.log(data.height)  // 获取元素宽度
-					// console.log(uni.upx2px(10)) 
-					that.divHeight="calc(100% - "+data.height+"px)"
-					that.mescrollTop = data.height
-		      }).exec()
-			},500);
+			this.updateTopHeight();
 		},
 		onPageScroll(e) {
 			if (this.isScrollUpdating) return;
@@ -258,6 +264,21 @@
 						console.log(this.storeInfo.doctorList)
 					}
 					this.getElementTop('storeDetailTop');
+					this.updateTopHeight();
+				})
+			},
+			updateTopHeight() {
+				var that = this;
+				this.$nextTick(() => {
+					setTimeout(function() {
+						let info = uni.createSelectorQuery().in(that).select(".top-content");
+						info.boundingClientRect(function(data) {
+							if (data) {
+								that.divHeight = "calc(100% - " + data.height + "px)"
+								that.mescrollTop = data.height
+							}
+						}).exec()
+					}, 200);
 				})
 			},
 			navback() {
@@ -510,6 +531,39 @@
 			font-weight: 500;
 			font-size: 32rpx;
 		}
+		.activity-row {
+			margin-top: 8rpx;
+			display: flex;
+			align-items: center;
+			flex-wrap: wrap;
+		}
+		.activity-tag {
+			display: inline-flex;
+			align-items: center;
+			font-size: 18rpx;
+			color: #FF5C03;
+			background: #fff;
+			padding-right: 8rpx;
+			border-radius: 4rpx;
+			line-height: 28rpx;
+			height: 28rpx;
+			overflow: hidden;
+			.tag-icon {
+				background: #FF5C03;
+				color: #fff;
+				width: 28rpx;
+				height: 28rpx;
+				text-align: center;
+				margin-right: 6rpx;
+				font-size: 16rpx;
+			}
+			&.discount {
+				color: #2583EB;
+				.tag-icon {
+					background: #2583EB;
+				}
+			}
+		}
 		.storedesc {
 			margin-top: 12rpx;
 			font-weight: 400;

+ 16 - 1
pages_user/api/storeAfterSales.js

@@ -21,7 +21,22 @@ let request = new Request().http
  export function addDelivery(data) {
  	 return request('/store/app/storeAfterSales/addDelivery',data,'POST','application/json;charset=UTF-8');
  } 
+
+export function queryLogisticsCompany(data) {
+	 return request('/store/app/logistics/query',data,'GET');
+}
+
+export function refreshLogisticsCompany(data) {
+	 return request('/store/app/logistics/refresh',data,'GET');
+}
+
+export function editDelivery(data) {
+	 return request('/store/app/storeAfterSales/editDelivery',data,'POST','application/json;charset=UTF-8');
+}
+
+export function getErpReturnInfo(data) {
+	 return request('/store/app/storeOrder/getErpReturnInfo',data,'POST','application/json;charset=UTF-8');
+}
  
  
  
- 

+ 47 - 1
pages_user/complaint.vue

@@ -136,7 +136,19 @@
 						<image class="logo" :src="item.store.logoUrl" mode="aspectFill"></image>
 						<view class="storebox-r">
 							<view class="x-bc" style="flex: 1;min-height: 104rpx;">
-								<view class="storename ellipsis">{{item.store.storeName || ''}}</view>
+								<view class="storename ellipsis">
+									{{item.store.storeName || ''}}
+								</view>
+								<view class="activity-row" v-if="item.store.tierType">
+									<text class="activity-tag" v-if="item.store.tierType == 1">
+										<text class="tag-icon">减</text>
+										满减
+									</text>
+									<text class="activity-tag discount" v-else-if="item.store.tierType == 2">
+										<text class="tag-icon">折</text>
+										折扣
+									</text>
+								</view>
 								<view class="storebox-btn" @click="handleClick(item,'store')">选择</u-icon></view>
 							</view>
 						</view>
@@ -585,6 +597,40 @@
 				font-weight: 500;
 				font-size: 32rpx;
 			}
+			.activity-row {
+				margin-top: 8rpx;
+				display: flex;
+				align-items: center;
+				flex-wrap: wrap;
+			}
+			.activity-tag {
+				display: inline-flex;
+				align-items: center;
+				font-size: 18rpx;
+				color: #FF5C03;
+				background: rgba(255, 92, 3, 0.08);
+				padding-right: 8rpx;
+				border-radius: 4rpx;
+				line-height: 28rpx;
+				height: 28rpx;
+				overflow: hidden;
+				.tag-icon {
+					background: #FF5C03;
+					color: #fff;
+					width: 28rpx;
+					height: 28rpx;
+					text-align: center;
+					margin-right: 6rpx;
+					font-size: 16rpx;
+				}
+				&.discount {
+					color: #2583EB;
+					background: rgba(37, 131, 235, 0.08);
+					.tag-icon {
+						background: #2583EB;
+					}
+				}
+			}
 			.storedesc {
 				margin-top: 12rpx;
 				font-weight: 400;

+ 509 - 25
pages_user/shopping/refundOrder.vue

@@ -39,15 +39,26 @@
 					</view>
 				</view>
 			</view>
-			<!-- 申请原因 -->
+			<!-- 申请类型 -->
 			<view class="reason-apply">
+				<view class="title-box">
+					<text class="label">申请类型</text>
+					<view class="radio-group">
+						<label class="radio" @click="changeRefundType(0)">
+							<radio :checked="refundType === 0" color="#2583EB" />仅退款
+						</label>
+						<label class="radio" @click="changeRefundType(1)">
+							<radio :checked="refundType === 1" color="#2583EB" />退货退款
+						</label>
+					</view>
+				</view>
 				<view class="title-box">
 					<text class="label">退款金额</text>
 					 <input class="money" type="text" disabled v-model="refundAmount" placeholder="退款金额" placeholder-class="form-input" />
 				</view>
 				<view class="title-box">
 					<text class="label">申请原因</text>
-					<picker @change="reasonsChange" :value="reasons"  range-key="dictLabel" :range="reasonsList">
+					<picker @change="reasonsChange" :value="reasonIndex"  range-key="dictLabel" :range="filteredReasonsList">
 						<view class="chose-box"  >
 							<text class="text">{{reasons}}</text>
 							<image src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/app/newImages/shopping/arrow_gray.png" mode=""></image>
@@ -57,6 +68,63 @@
 				<view class="textarea-box">
 					<textarea v-model="explains" placeholder="请描述申请售后服务的具体原因" placeholder-class="textarea-place" />
 				</view>
+				<view v-if="isDeliveryReason" class="delivery-box">
+					<view class="logistics-select-container">
+						<view class="search-header">
+							<text class="label">物流公司</text>
+							<view class="search-input-wrapper">
+								<input class="search-input" type="text" v-model="logisticsKeyword" placeholder="搜索物流公司" placeholder-class="search-input-place" @input="onSearchInput" />
+								<image v-if="logisticsKeyword" class="clear-icon" src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/image/close.png" @click="clearSearch"></image>
+							</view>
+							<text class="refresh-btn" :class="{'loading': logisticsLoading}" @click.stop="refreshLogisticsCompanies">{{logisticsLoading?'...':'刷新'}}</text>
+						</view>
+						
+						<view v-if="logisticsKeyword && !deliveryForm.shipper_code" class="results-dropdown">
+							<scroll-view scroll-y class="results-list">
+								<view v-for="(item, index) in logisticsCompanyList" :key="index" class="result-item" @click="selectLogistics(item)">
+									<text class="name">{{item.lcName}}</text>
+								</view>
+								<view v-if="!logisticsLoading && logisticsCompanyList.length === 0" class="empty-results">暂无结果</view>
+								<view v-if="logisticsLoading" class="loading-results">搜索中...</view>
+							</scroll-view>
+						</view>
+
+						<view v-if="deliveryForm.delivery_name && !logisticsKeyword" class="selected-display" @click="reselectLogistics">
+							<text class="name">{{deliveryForm.delivery_name}}</text>
+							<image class="arrow" src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/app/newImages/shopping/arrow_gray.png"></image>
+						</view>
+					</view>
+					
+					<view class="title-box">
+						<text class="label">物流单号</text>
+						<input class="money logistics-input" type="text" v-model="deliveryForm.delivery_sn" placeholder="请输入物流单号" placeholder-class="form-input" />
+					</view>
+
+					<!-- 地址信息展示 -->
+					<view class="address-card" v-if="order">
+						<view class="address-item">
+							<view class="icon-box sender">寄</view>
+							<view class="content-box">
+								<view class="user-info">
+									<text class="name">{{order.realName || '寄件人'}}</text>
+									<text class="phone">{{order.userPhone || '-'}}</text>
+								</view>
+								<view class="address-text">{{order.userAddress || '-'}}</view>
+							</view>
+						</view>
+						
+						<view class="address-item" v-if="deliveryBaseInfo.address">
+							<view class="icon-box recipient">收</view>
+							<view class="content-box">
+								<view class="user-info">
+									<text class="name">{{deliveryBaseInfo.consignee || '-'}}</text>
+									<text class="phone">{{deliveryBaseInfo.phone_number || '-'}}</text>
+								</view>
+								<view class="address-text">{{deliveryBaseInfo.address || '-'}}</view>
+							</view>
+						</view>
+					</view>
+				</view>
 			</view>
 			<!-- 退回方式 -->
 			<!-- <view class="return-method">
@@ -87,10 +155,13 @@
 </template>
 
 <script>
-	import {getDictByKey} from '@/api/common.js'
-	import {applyAfterSales,getMyStoreOrderItemByOrderId} from '../api/storeAfterSales.js'
+	import {applyAfterSales,getMyStoreOrderItemByOrderId,queryLogisticsCompany,refreshLogisticsCompany,editDelivery,getErpReturnInfo} from '../api/storeAfterSales.js'
 	export default {
-		 
+		computed: {
+			isDeliveryReason() {
+				return this.reasonValue === '6';
+			}
+		},
 		data() {
 			return {
 				orderId:null,
@@ -100,9 +171,27 @@
 				type:null,
 				reasonsList:[],
 				reasons:"请选择",
+				reasonIndex:0,
+				reasonValue:null,
 				explains:"",
 				refundAmount:0.00,
-				 
+				refundType: 0, // 0: 仅退款, 1: 退货退款
+				filteredReasonsList: [],
+				logisticsCompanyList:[],
+				logisticsKeyword:'',
+				selectedLogisticsIndex:0,
+				logisticsLoading:false,
+				searchTimer: null,
+				deliveryBaseInfo:{
+					consignee:'',
+					phone_number:'',
+					address:''
+				},
+				deliveryForm:{
+					shipper_code:'',
+					delivery_sn:'',
+					delivery_name:''
+				}
 			}
 		},
 		onLoad(option) {
@@ -111,9 +200,28 @@
 			this.reasonsList=this.$getDict("storeAfterSalesReasons");
 			this.orderId=option.orderId;
 			console.log(this.orderId);
+			// Initialize refundType based on option.type if available, otherwise default to 0
+			this.refundType = option.type !== undefined ? Number(option.type) : 0;
+			this.filterReasons(); // Filter reasons initially
 			this.getMyStoreOrderItemByOrderId()
 		},
 		methods: {
+			changeRefundType(type) {
+				this.refundType = type;
+				this.filterReasons();
+				// Reset selected reason when refund type changes
+				this.reasons = "请选择";
+				this.reasonIndex = 0;
+				this.reasonValue = null;
+				this.resetDeliveryForm();
+			},
+			filterReasons() {
+				if (this.refundType === 0) { // 仅退款类型type0
+					this.filteredReasonsList = this.reasonsList.filter(item => item.dictValue !== '6');
+				} else { // 退货退款类型type1
+					this.filteredReasonsList = this.reasonsList.filter(item => item.dictValue === '6');
+				}
+			},
 			getMyStoreOrderItemByOrderId(){
 				var data={orderId:this.orderId};
 				getMyStoreOrderItemByOrderId(data).then(res => {
@@ -136,10 +244,157 @@
 				});
 			},
 			reasonsChange(e) {
-				console.log(e.detail.value)
-				this.reasons = this.reasonsList[e.detail.value].dictLabel
+				var index = Number(e.detail.value);
+				var current = this.filteredReasonsList[index] || {};
+				this.reasonIndex = index;
+				this.reasons = current.dictLabel || '请选择';
+				this.reasonValue = current.dictValue != null ? current.dictValue.toString() : null;
+				if(this.isDeliveryReason){
+					this.loadLogisticsCompanies();
+					this.loadMerchantDeliveryInfo();
+				}else{
+					this.resetDeliveryForm();
+				}
+			},
+			resetDeliveryForm(){
+				this.selectedLogisticsIndex = 0;
+				this.deliveryForm = {
+					shipper_code:'',
+					delivery_sn:'',
+					delivery_name:''
+				};
+			},
+			loadMerchantDeliveryInfo(){
+				return getErpReturnInfo({orderId:this.orderId}).then(res => {
+					if(res.code==200){
+						this.deliveryBaseInfo = {
+							consignee: res.returnReceiver || '',
+							phone_number: res.returnPhone || '',
+							address: res.returnAddress || ''
+						};
+						return this.deliveryBaseInfo;
+					}
+					uni.showToast({
+						icon:'none',
+						title: res.msg || '获取商家收货信息失败'
+					});
+					return null;
+				});
+			},
+			loadLogisticsCompanies(forceRefresh){
+				if(this.logisticsLoading){
+					return;
+				}
+				if(!forceRefresh&&this.logisticsCompanyList.length>0&&!this.logisticsKeyword){
+					return;
+				}
+				this.logisticsLoading = true;
+				queryLogisticsCompany({keyword:this.logisticsKeyword}).then(res => {
+					if(res.code==0||res.code==200){
+						var list = [];
+						if(Array.isArray(res.data)){
+							list = res.data;
+						}else if(Array.isArray(res.rows)){
+							list = res.rows;
+						}else if(Array.isArray(res.list)){
+							list = res.list;
+						}
+						this.logisticsCompanyList = list;
+					}else{
+						uni.showToast({
+							icon:'none',
+							title: res.msg || '物流公司获取失败'
+						});
+					}
+				}).finally(() => {
+					this.logisticsLoading = false;
+				});
+			},
+			onSearchInput() {
+				if (this.searchTimer) {
+					clearTimeout(this.searchTimer);
+				}
+				this.deliveryForm.shipper_code = ''; // 重置选中状态以显示列表
+				this.searchTimer = setTimeout(() => {
+					this.loadLogisticsCompanies(true);
+				}, 500);
 			},
-			submit(){
+			clearSearch() {
+				this.logisticsKeyword = '';
+				this.logisticsCompanyList = [];
+				this.resetDeliveryForm();
+			},
+			selectLogistics(item) {
+				this.deliveryForm.shipper_code = item.lcId || '';
+				this.deliveryForm.delivery_name = item.lcName || '';
+				this.logisticsKeyword = ''; // 清空搜索词以显示选中状态
+				this.logisticsCompanyList = [];
+			},
+			reselectLogistics() {
+				this.logisticsKeyword = this.deliveryForm.delivery_name;
+				this.deliveryForm.shipper_code = '';
+				this.onSearchInput();
+			},
+			searchLogisticsCompanies(){
+				this.loadLogisticsCompanies(true);
+			},
+			refreshLogisticsCompanies(){
+				refreshLogisticsCompany({}).then(res => {
+					if(res.code==0||res.code==200){
+						this.logisticsCompanyList = [];
+						this.loadLogisticsCompanies(true);
+					}else{
+						uni.showToast({
+							icon:'none',
+							title: res.msg || '刷新失败'
+						});
+					}
+				});
+			},
+			validateDeliveryForm(){
+				if(!this.deliveryForm.shipper_code||!this.deliveryForm.delivery_name){
+					uni.showToast({
+						icon:'none',
+						title: '请选择物流公司'
+					});
+					return false;
+				}
+				if(!this.deliveryForm.delivery_sn){
+					uni.showToast({
+						icon:'none',
+						title: '请输入物流单号'
+					});
+					return false;
+				}
+				return true;
+			},
+			buildDeliveryPayload(){
+				if(!this.deliveryBaseInfo.consignee||!this.deliveryBaseInfo.phone_number||!this.deliveryBaseInfo.address){
+					return null;
+				}
+				return {
+					orderCode:this.orderCode,
+					consignee:this.deliveryBaseInfo.consignee,
+					phone_number:this.deliveryBaseInfo.phone_number,
+					address:this.deliveryBaseInfo.address,
+					shipper_code:this.deliveryForm.shipper_code,
+					delivery_sn:this.deliveryForm.delivery_sn,
+					delivery_name:this.deliveryForm.delivery_name
+				};
+			},
+			handleSubmitSuccess(message){
+				uni.showToast({
+					icon:'success',
+					title: message || '提交成功'
+				});
+				setTimeout(function() {
+					uni.$emit('refreshOrder');
+					uni.navigateBack({
+						delta: 1
+					})
+				}, 500);
+			},
+			async submit(){
 				if(this.reasons=="请选择"){
 					uni.showToast({
 						icon:'none',
@@ -154,35 +409,60 @@
 					});
 					return;
 				}
-				 
+
 				var productIds=this.items.map(item=>item.productId);
 				var products=[];
 				for(var i=0;i<productIds.length;i++){
 					var item={productId:productIds[i]};
 					products.push(item);
 				}
-				var data={refundAmount:this.refundAmount,orderCode:this.orderCode,serviceType:this.type,reasons:this.reasons,explains:this.explains,productList:products};
-				applyAfterSales(data).then(res => {
+				var afterSalesData={refundAmount:this.refundAmount,orderCode:this.orderCode,serviceType:this.refundType,reasons:this.reasons,explains:this.explains,productList:products};
+
+				if (this.isDeliveryReason) {
+					// 如果原因是物流相关(dictValue为6)
+					if (!this.validateDeliveryForm()) {
+						return;
+					}
+
+					// 1. 先获取商家收货地址
+					await this.loadMerchantDeliveryInfo();
+					var deliveryData = this.buildDeliveryPayload();
+					if (!deliveryData) {
+						uni.showToast({
+							icon: 'none',
+							title: '商家收货信息不完整'
+						});
+						return;
+					}
+
+					// 2. 合并参数:售后数据 + 物流数据
+					let finalSubmitData = {
+						...afterSalesData,   // 原售后参数
+						...deliveryData     // 物流信息(已合并)
+					};
+
+					// 3. 只调用一个接口:applyAfterSales
+					var res = await applyAfterSales(finalSubmitData);
+					if (res.code === 200) {
+						this.handleSubmitSuccess('提交成功');
+					} else {
+						uni.showToast({
+							icon: 'none',
+							title: res.msg || '提交失败'
+						});
+					}
+				}else{
+					// 如果不是物流相关,直接调用申请售后接口
+					var res = await applyAfterSales(afterSalesData);
 					if(res.code==200){
-						 uni.showToast({
-						 	icon:'success',
-						 	title:'提交成功'
-						 });
-						 setTimeout(function() {
-							 uni.$emit('refreshOrder');
-							 uni.navigateBack({
-								 delta: 1
-							 })
-						 }, 500);
-						 
+						this.handleSubmitSuccess('提交成功');
 					}else{
 						uni.showToast({
 							icon:'none',
 							title: res.msg
 						});
-						 
 					}
-				});
+				}
 			},
 		}
 	}
@@ -302,6 +582,19 @@
 						font-weight: bold;
 						color: #333333;
 					}
+					.radio-group {
+						display: flex;
+						.radio {
+							display: flex;
+							align-items: center;
+							margin-right: 40upx;
+							font-size: 28upx;
+							color: #333333;
+							radio {
+								transform:scale(0.7);
+							}
+						}
+					}
 					.money{
 						
 						font-size: 24upx;
@@ -345,6 +638,197 @@
 						color: #999999;
 					}
 				}
+				.delivery-box{
+					border-top: 1px solid #F0F0F0;
+					padding-top: 20upx;
+					.logistics-select-container {
+						position: relative;
+						margin-bottom: 20upx;
+						
+						.search-header {
+							display: flex;
+							align-items: center;
+							height: 86upx;
+							border-bottom: 1px solid #F0F0F0;
+							
+							.label {
+								font-size: 30upx;
+								font-family: PingFang SC;
+								font-weight: bold;
+								color: #333333;
+								width: 160upx;
+							}
+							
+							.search-input-wrapper {
+								flex: 1;
+								position: relative;
+								display: flex;
+								align-items: center;
+								
+								.search-input {
+									width: 100%;
+									height: 60upx;
+									font-size: 26upx;
+									color: #333333;
+									text-align: left;
+									padding-right: 50upx;
+								}
+								
+								.clear-icon {
+									position: absolute;
+									right: 10upx;
+									width: 32upx;
+									height: 32upx;
+									z-index: 10;
+								}
+							}
+							
+							.refresh-btn {
+								font-size: 24upx;
+								color: #2583EB;
+								margin-left: 20upx;
+								min-width: 60upx;
+								text-align: center;
+								
+								&.loading {
+									opacity: 0.6;
+								}
+							}
+						}
+						
+						.results-dropdown {
+							position: absolute;
+							top: 86upx;
+							left: 0;
+							right: 0;
+							background: #FFFFFF;
+							box-shadow: 0 4upx 20upx rgba(0,0,0,0.1);
+							border-radius: 8upx;
+							z-index: 100;
+							max-height: 400upx;
+							overflow: hidden;
+							
+							.results-list {
+								max-height: 400upx;
+								
+								.result-item {
+									padding: 24upx 30upx;
+									border-bottom: 1px solid #F8F8F8;
+									
+									&:active {
+										background-color: #F5F5F5;
+									}
+									
+									.name {
+										font-size: 28upx;
+										color: #333333;
+									}
+								}
+								
+								.empty-results, .loading-results {
+									padding: 40upx;
+									text-align: center;
+									font-size: 24upx;
+									color: #999999;
+								}
+							}
+						}
+						
+						.selected-display {
+							display: flex;
+							align-items: center;
+							justify-content: space-between;
+							height: 80upx;
+							background: #F8F8F8;
+							border-radius: 8upx;
+							padding: 0 20upx;
+							margin-top: 10upx;
+							
+							.name {
+								font-size: 28upx;
+								color: #2583EB;
+								font-weight: 500;
+							}
+							
+							.arrow {
+								width: 12upx;
+								height: 20upx;
+							}
+						}
+					}
+					
+					.logistics-input{
+						flex: 1;
+					}
+
+					.address-card {
+						padding: 20upx 0;
+						background: #FFFFFF;
+
+						.address-item {
+							display: flex;
+							align-items: flex-start;
+							padding: 30upx 0;
+							border-bottom: 1upx solid #F5F5F5;
+							&:last-child {
+								border-bottom: none;
+							}
+
+							.icon-box {
+								width: 44upx;
+								height: 44upx;
+								border-radius: 8upx;
+								display: flex;
+								align-items: center;
+								justify-content: center;
+								font-size: 24upx;
+								font-weight: bold;
+								color: #FFFFFF;
+								margin-top: 6upx;
+								flex-shrink: 0;
+
+								&.sender {
+									background: #FF5A1F;
+								}
+
+								&.recipient {
+									background: #FFB400;
+								}
+							}
+
+							.content-box {
+								flex: 1;
+								margin-left: 20upx;
+
+								.user-info {
+									margin-bottom: 12upx;
+									display: flex;
+									align-items: center;
+
+									.name {
+										font-size: 30upx;
+										font-weight: bold;
+										color: #111111;
+										margin-right: 20upx;
+									}
+
+									.phone {
+										font-size: 30upx;
+										font-weight: bold;
+										color: #111111;
+									}
+								}
+
+								.address-text {
+									font-size: 26upx;
+									color: #666666;
+									line-height: 1.4;
+									word-break: break-all;
+								}
+							}
+						}
+					}
+				}
 			}
 			.return-method{
 				background: #FFFFFF;

+ 1 - 1
pages_user/shopping/refundOrderProduct.vue

@@ -43,7 +43,7 @@
 				 <view class="left"></view>
 				<view class="right">
 					<view  class="btn cancel" v-if="order.status==1 || order.status==2" @click="submit(0)" >仅退款</view>
-					<view  class="btn cancel" v-if="order.status==3||order.status==4" @click="submit(1)"  >退款退货</view>
+					<view  class="btn cancel" v-if="order.status==3||order.status==4" @click="submit(1)"  >退货退款</view>
 				</view>
 				
 			</view>

+ 4 - 1
pages_user/shopping/storeOrder.vue

@@ -172,8 +172,11 @@
 				this.mescroll.resetUpScroll()
 			},
 			refund(item) {
+				// uni.navigateTo({
+				// 	url: './refundOrderProduct?orderId='+item.id
+				// })	
 				uni.navigateTo({
-					url: './refundOrderProduct?orderId='+item.id
+					url: '/pages_user/shopping/refundOrder?orderId='+item.id+'&orderCode='+item.orderCode
 				})	
 			},
 			// tab切换

+ 18 - 4
pages_user/shopping/storeOrderDetail.vue

@@ -176,6 +176,7 @@
 							<text class="label">支付方式</text>
 							<text class="text" v-if="order.payType==1">全款支付</text>
 							<text class="text" v-if="order.payType==2">先定后付</text>
+							<text class="text" v-if="order.payType==3">货到付款</text>
 						</view>
 						<view   class="item">
 							<text class="label">订单金额</text>
@@ -191,9 +192,13 @@
 							<text class="text" v-if="order.serviceFee!=null">¥{{order.serviceFee.toFixed(2)}}</text>
 						</view>
 						<view   class="item">
-							<text class="label">优惠金额</text>
+							<text class="label">优惠券抵扣</text>
 							<text class="text" v-if="order.couponPrice!=null">-¥{{order.couponPrice.toFixed(2)}}</text>
 						</view>
+						<view   class="item">
+							<text class="label">活动优惠</text>
+							<text class="text" v-if="order.promotionDiscountAmount!=null">-¥{{order.promotionDiscountAmount.toFixed(2)}}</text>
+						</view>
 						<view   class="item">
 							<text class="label">应付金额</text>
 							<text class="text" v-if="order.payPrice!=null">¥{{order.payPrice.toFixed(2)}}</text>
@@ -210,6 +215,10 @@
 							<text class="label">支付时间</text>
 							<text class="text" v-if="order.payTime!=null">{{order.payTime}}</text>
 						</view>
+						<view class="item" v-if="order.mark">
+							<text class="label">订单备注</text>
+							<text class="text">{{order.mark}}</text>
+						</view>
 						<!-- <view v-if="order.status >1" class="item">
 							<text class="label">发货时间</text>
 							<text class="text"></text>
@@ -252,7 +261,7 @@
 			<view class="btn pay"  v-if="(order.status==0||order.status==1)&&order.isPrescribe==1&&prescribe==null&&prescriptionAuditStatus!=3"  @click="addPrescribe()">开处方</view>
 			<view class="btn cancel"  v-if="isAfterSales==1"  @click="refund()">申请售后</view>
 			<view class="btn pay" v-if="order.status>=2&&order.deliveryId!=null" @click="express()">查看物流</view>
-			<view class="btn pay" v-if="order.status==2&&order.payType!=1&&order.isPayRemain==0&&order.deliverySn=='SF'" @click="payRemain()">支付尾款</view>
+			<!-- <view class="btn pay" v-if="order.status==2&&order.payType!=1&&order.isPayRemain==0&&order.deliverySn=='SF'" @click="payRemain()">支付尾款</view> -->
 			<view class="btn pay" v-if="order.status==2" @click="finish()">确认收货</view>
 			<view v-if="order.status == 3" class="btn pay" @click="showEvaluate('/pages_shopping/evaluateDetail?orderId='+order.id)">去评价</view>
 			<view v-if="order.status == 4" class="btn pay" @click="showEvaluate('/pages_shopping/evaluate?orderId='+order.id)">查看评价</view>
@@ -446,9 +455,12 @@
 			},
 			// 退货
 			refund() {
+				// uni.navigateTo({
+				// 	url: './refundOrderProduct?orderId='+this.orderId
+				// })
 				uni.navigateTo({
-					url: './refundOrderProduct?orderId='+this.orderId
-				})
+					url: '/pages_user/shopping/refundOrder?orderId='+this.orderId+'&orderCode='+this.order.orderCode
+				})	
 			}
 		}
 	}
@@ -704,6 +716,7 @@
 					margin-right: 30upx;
 				}
 				.label{
+					flex-shrink: 0;
 					font-size: 24upx;
 					font-family: PingFang SC;
 					font-weight: 500;
@@ -748,6 +761,7 @@
 				align-items: center;
 				justify-content: space-between;
 				.label{
+					flex-shrink: 0;
 					font-size: 26upx;
 					font-family: PingFang SC;
 					font-weight: 500;