XSLu08042 2 dagar sedan
förälder
incheckning
320e8831e6

+ 2 - 2
common/request.js

@@ -6,8 +6,8 @@ export default class Request {
 		// var path=uni.getStorageSync('requestPath')
 
 		var path = 'https://storeuserapp.bjyjbao.com'; //正式
-		// var path = "https://userapp.bjyjbao.com/prod-api"
-		// var path = "http://p4d899e5.natappfree.cc"
+		// var path = "https://3ce64c10ba0e.ngrok-free.app"
+		// var path = "http://w4579365.natappfree.cc"
 		// var path = "http://192.168.10.126:8113"
 		let token="";
 		let type = 0

+ 1 - 1
components/medicineItem.vue

@@ -13,7 +13,7 @@
 			</view>
 			<view class="medicine-r">
 				<view class="desc ellipsis">包装规格:{{ item.prescribeSpec || '--' }}</view>
-				<view class="desc ellipsis">批准文号:{{ item.batchNumber || '--' }}</view>
+				<view class="desc ellipsis">批准文号:{{ item.drugRegCertNo || '--' }}</view>
 				<view class="desc ellipsis">生产厂家:{{ item.mah || '--' }}</view>
 				<!-- <view class="desc"><text style="color: #2583EB;margin: 0 10rpx;">{{item.storeCount||0}}</text> 商家销售 </view> -->
 				<view class="price-box x-bc">

+ 14 - 10
components/storeDetail.vue

@@ -33,9 +33,11 @@
 				<view class="label mb20">营业执照</view>
 				<view class="label mb20" v-if="storeInfo.businessCode">营业执照上传编码 {{storeInfo.businessCode}}</view>
 				<view class="val x-f">
-					<u-image v-if="storeInfo.businessLicense" shape="square" lazyLoad :src="storeInfo.businessLicense"
-						width="600rpx" height="auto" mode="widthFix" radius="6"
-						@click="previewImage('businessLicense')"></u-image>
+					<template v-if="storeInfo.businessLicense">
+						<u-image v-for="(img,i) in storeInfo.businessLicense.split(',')" shape="square" lazyLoad :src="img"
+							width="600rpx" height="auto" mode="widthFix" radius="6"
+							@click="previewImage('businessLicense')"></u-image>
+					</template>
 					<view v-else>暂未上传</view>
 				</view>
 			</view>
@@ -71,17 +73,19 @@
 			</view>
 			
 			<view class="storeInfo-item mb20" v-if="storeInfo.foodLicense">
-				<view class="label mb20">食品经营许可证</view>
-				<view class="label mb20" v-if="storeInfo.foodCode">食品经营许可证上传编码 {{storeInfo.foodCode}}</view>
+				<view class="label mb20">食品经营许可证/备案凭证</view>
+				<view class="label mb20" v-if="storeInfo.foodCode">食品经营许可证/备案凭证编码 {{storeInfo.foodCode}}</view>
 				<view class="val x-f">
-					<u-image v-if="storeInfo.foodLicense" shape="square" lazyLoad :src="storeInfo.foodLicense"
-						width="600rpx" height="auto" mode="widthFix" radius="6"
-						@click="previewImage('foodLicense')"></u-image>
+					<template v-if="storeInfo.foodLicense">
+						<u-image shape="square" lazyLoad v-for="(img,i) in storeInfo.foodLicense.split(',')" :key="i" :src="img"
+							width="600rpx" height="auto" mode="widthFix" radius="6"
+							@click="previewImage('foodLicense')"></u-image>
+					</template>
 					<view v-else>暂未上传</view>
 				</view>
 			</view>
 			
-			<view class="storeInfo-item mb20" v-if="storeInfo.medicalLicense">
+			<!-- <view class="storeInfo-item mb20" v-if="storeInfo.medicalLicense">
 				<view class="label mb20">医疗机构执业许可证</view>
 				<view class="label mb20" v-if="storeInfo.medicalCode">医疗机构执业许可证上传编码 {{storeInfo.medicalCode}}</view>
 				<view class="val x-f">
@@ -90,7 +94,7 @@
 						@click="previewImage('medicalLicense')"></u-image>
 					<view v-else>暂未上传</view>
 				</view>
-			</view>
+			</view> -->
 			<view class="storeInfo-item mb20" v-if="storeInfo.drugLicense">
 				<view class="label mb20">药品经营许可证</view>
 				<view class="label mb20" v-if="storeInfo.drugCode">药品经营许可证编码 {{storeInfo.drugCode}}</view>

+ 3 - 0
pages/shopping/index.vue

@@ -348,6 +348,9 @@
 					font-weight: 500;
 					color: #333333;
 					position: relative;
+					overflow: hidden;
+					white-space: nowrap;
+					text-overflow: ellipsis;
 					&.active{
 						color: #2583EB;
 						&::after{

+ 2 - 2
pages/user/index.vue

@@ -112,10 +112,10 @@
 							<image class="min-image" src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/app/image/userimg/address_management.png"></image>
 							<view class="title">地址管理</view>
 						</view>
-						<view class="menu"  @click="loginNavTo('/pages_user/healthRecords/index')">
+						<!-- <view class="menu"  @click="loginNavTo('/pages_user/healthRecords/index')">
 							<image class="min-image" src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/app/image/userimg/health_records.png"></image>
 							<view class="title">健康档案</view>
-						</view>
+						</view> -->
 						<!-- <view class="menu"  @click="loginNavTo('/pages_user/tongue/tongueList')">
 							<image class="min-image" src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/image/icon_company_3.png"></image>
 							<view class="title">舌苔报告</view>

+ 5 - 0
pages_company/storeOrderList.vue

@@ -90,6 +90,11 @@
 					{name:"已完成",id:"4"}
 				],
 				mescroll:null,
+				downOption: {
+					//下拉刷新
+					use: true,
+					auto: false // 不自动加载 (mixin已处理第一个tab触发downCallback)
+				},
 				// 上拉加载的配置
 				upOption: {
 					onScroll:false,

+ 1 - 1
pages_order/prescribeDetails.vue

@@ -247,7 +247,7 @@
 					return
 				}
 				uni.navigateTo({
-				 	url: '/pages/index/webview?url='+encodeURIComponent(this.prescribe.jumpUrl)
+				 	url: '/pages/index/webview?type=prescribe&url='+encodeURIComponent(this.prescribe.jumpUrl)
 				})
 			}
 		}

+ 6 - 1
pages_order/prescribeList.vue

@@ -68,6 +68,11 @@
 					 
 				],
 				mescroll:null,
+				downOption: {
+					//下拉刷新
+					use: true,
+					auto: false // 不自动加载 (mixin已处理第一个tab触发downCallback)
+				},
 				// 上拉加载的配置
 				upOption: {
 					onScroll:false,
@@ -154,7 +159,7 @@
 					return
 				}
 				uni.navigateTo({
-				 	url: '/pages/index/webview?url='+encodeURIComponent(item.jumpUrl)
+				 	url: '/pages/index/webview?type=prescribe&url='+encodeURIComponent(item.jumpUrl)
 				})
 			}
 		}

+ 5 - 0
pages_order/storeOrderList.vue

@@ -100,6 +100,11 @@
 					{name:"已完成",id:"4"}
 				],
 				mescroll:null,
+				downOption: {
+					//下拉刷新
+					use: true,
+					auto: false // 不自动加载 (mixin已处理第一个tab触发downCallback)
+				},
 				// 上拉加载的配置
 				upOption: {
 					onScroll:false,

+ 5 - 0
pages_order/storeOrderRefundList.vue

@@ -81,6 +81,11 @@
 				],
 				status: 0,
 				mescroll:null,
+				downOption: {
+					//下拉刷新
+					use: true,
+					auto: false // 不自动加载 (mixin已处理第一个tab触发downCallback)
+				},
 				// 上拉加载的配置
 				upOption: {
 					onScroll:true,

+ 4 - 0
pages_shopping/api/shopping.js

@@ -8,4 +8,8 @@ let request = new Request().http
  
  export function storeList(data) {
  	 return request('/store/app/store/list',data,'GET');
+ }
+ 
+ export function businessLicenseCheck(data) {
+ 	 return request('/store/app/storeInfoCheck/businessLicenseCheck',data,'GET');
  }

+ 26 - 1
pages_shopping/cart.vue

@@ -179,16 +179,32 @@
 				if(item.cartNum < 1) {
 					item.cartNum = 1
 				}
+				console.log("item.cartNum==",item.cartNum)
+				// if (item.cartNum>item.stock) {
+				//   uni.showToast({
+				//     title: "已经是最多啦!",
+				//     icon: "none",
+				//     duration: 2000
+				//   });
+				//   item.cartNum=item.stock;
+				//   return
+				// }
 				if(item.cartNum>=item.stock){
 					item.cartNum=item.stock;
 				}
 				this.changeCartNum(item)
 			},
 			changeCartNum(item){
-				let data = {number:item.cartNum,id:item.id};
+				let data = {number:item.cartNum,id:item.id,type: 1};
 				cartNum(data).then(
 					res => {
 						if(res.code==200){
+							if(item.cartNum < 1) {
+								item.cartNum = 1
+							}
+							if(item.cartNum>=item.stock){
+								item.cartNum=item.stock;
+							}
 							uni.showToast({
 								icon:'none',
 								title: "操作成功",
@@ -249,6 +265,15 @@
 			addNum(item) {
 				console.log(item)
 				item.cartNum++
+				// if (item.cartNum>item.stock) {
+				//   uni.showToast({
+				//     title: "已经是最多啦!",
+				//     icon: "none",
+				//     duration: 2000
+				//   });
+				//   item.cartNum=item.stock;
+				//   return
+				// }
 				if(item.cartNum>=item.stock){
 					item.cartNum=item.stock;
 				}

+ 4 - 1
pages_shopping/confirmOrder.vue

@@ -128,7 +128,7 @@
 			</view> -->
 			<view class="agreement">
 				<label>
-					<checkbox :checked="isAgreement" color="#2583EB" style="transform:scale(0.7)" @click="handleAgreement()" />药品属于特殊特殊商品除药品质量问题外,一经售出,不得退换
+					<checkbox :checked="isAgreement" color="#2583EB" style="transform:scale(0.7)" @click="handleAgreement()" />药品属于特殊商品除药品质量问题外,一经售出,不得退换
 				</label>
 			</view>
 		</view>
@@ -253,6 +253,9 @@
 			})
 			this.getWeixinOrderTemps();
 		},
+		onUnload() {
+			uni.$off('updateAddress')
+		},
 		methods: {
 			handleAgreement() {
 				this.isAgreement = !this.isAgreement;

+ 41 - 12
pages_shopping/evaluateDetail.vue

@@ -135,9 +135,9 @@
 					const result = await this.uploadFilePromise(lists[i].url)
 					let item = this[`fileList${event.name}`][fileListLen]
 					this[`fileList${event.name}`].splice(fileListLen, 1, Object.assign(item, {
-						status: 'success',
-						message: '',
-						url: result
+						status: result.status,
+						message: result.status == 'failed' ? '上传失败' : '',
+						url: result.url
 					}))
 					fileListLen++
 				}
@@ -145,21 +145,48 @@
 			uploadFilePromise(url) {
 				return new Promise((resolve, reject) => {
 					let a = uni.uploadFile({
-						url: uni.getStorageSync('requestPath')+'/app/common/uploadOSS', // 仅为示例,非真实的接口地址
+						url: uni.getStorageSync('requestPath') +'/app/common/uploadOSS', // 仅为示例,非真实的接口地址
 						filePath: url,
 						name: 'file',
-						formData: {
-							user: 'test'
-						},
 						success: (res) => {
-							setTimeout(() => {
-								console.log(JSON.parse(res.data).url)
-								resolve(JSON.parse(res.data).url)
-							}, 1000)
+							if(res.statusCode == 200&&JSON.parse(res.data).code == 200) {
+								resolve({
+									url:JSON.parse(res.data).url,
+									status: 'success'
+								})
+							} else {
+								resolve({
+									url:url,
+									status: 'failed'
+								})
+							}
+						},
+						fail: (res) => {
+							resolve({
+								url:url,
+								status: 'failed'
+							})
 						}
 					});
 				})
 			},
+			getSuccessUrls(list) {
+			  if (!list || list.length === 0) return '';
+			
+			  const hasUploading = list.some(v => v.status === 'uploading');
+			  const hasFailed = list.some(v => v.status === 'failed');
+			
+			  if (hasUploading) {
+			    uni.showToast({ title: '请等待图片上传完成', icon: 'none' });
+			    return 'failed';
+			  }
+			  if (hasFailed) {
+			    uni.showToast({ title: '请检查是否有图片上传失败', icon: 'none' });
+			    return 'failed';
+			  }
+			
+			  return list.filter(v => v.status === 'success').map(v => v.url).join(',');
+			},
 			// 删除图片
 			deletePic(event) {
 				this[`fileList${event.name}`].splice(event.index, 1)
@@ -168,7 +195,9 @@
 			submit() {
 				this.$refs.form.validate().then(res => {
 					if(res) {
-						const imgUrls = this.fileList1.map(item => item.url).join(',')
+						const imgUrls = this.getSuccessUrls(this.fileList1);
+						if (imgUrls === 'failed') return;
+						
 						const params = {
 							orderId: this.orderId,
 							rating: this.form.rating,

+ 5 - 0
pages_shopping/home/productList.vue

@@ -111,6 +111,11 @@
 					storeId: ""
 				},
 				mescroll:null,
+				downOption: {
+					//下拉刷新
+					use: true,
+					auto: false // 不自动加载 (mixin已处理第一个tab触发downCallback)
+				},
 				// 上拉加载的配置
 				upOption: {
 					onScroll:true,

+ 17 - 7
pages_shopping/prescribe.vue

@@ -406,11 +406,6 @@
 				})
 			},
 			submit(){
-				// let url = 'https://ehospital-m-test.sq580.com/#/preDemand?id=5459&thirdPlatform=0'
-				// uni.navigateTo({
-				// 	url: '/pages/index/webview?url='+encodeURIComponent(url)
-				// })
-				// return
 				console.log('this.isAgreement==',this.isAgreement)
 				if (!this.isAgreement) {
 					uni.showToast({
@@ -442,6 +437,9 @@
 				// 	historyIllness:this.historyIllness,
 				// 	recordPic:this.imgList.toString()
 				// }
+				// const products = JSON.parse(this.order.itemJson)
+				// console.log("products=",products)
+				// let answerMedicine = this.order
 				if(this.activeDise.length==0) {
 					uni.showToast({
 						icon:'none',
@@ -449,10 +447,22 @@
 					});
 					return
 				}
+				let products = JSON.parse(this.order.itemJson)
+				let answerMedicine = products.map(it=>({
+					medicineId:it.productId,
+					number: it.num
+				}))
+				if(!answerMedicine||answerMedicine.length==0) {
+					uni.showToast({
+						icon:'none',
+						title: "用药信息选择不正确"
+					});
+					return
+				}
 				const beforeAiDataList = [
 				  { answer: this.activeDise.join(','), subjectId: 1, title: '症状' },
 				  {
-				    answerMedicine: JSON.stringify([{ medicineId: '92', number: 1 }]),
+				    answerMedicine: JSON.stringify(answerMedicine),
 				    subjectId: 2,
 				    title: '居民用药信息选择'
 				  },
@@ -481,7 +491,7 @@
 						uni.hideLoading()
 				 		if(res.code==200){
 							uni.redirectTo({
-								url: '/pages/index/webview?url='+encodeURIComponent(res.data)
+								url: '/pages/index/webview?type=prescribe&url='+encodeURIComponent(res.data)
 							})
 				 			//  uni.showToast({
 				 			//  	icon:'success',

+ 15 - 8
pages_shopping/productDetails.vue

@@ -54,7 +54,7 @@
 			</view>
 			<view class="other-box-item">
 				<view class="label">批准文号</view>
-				<view class="text">{{product.batchNumber||'--'}}</view>
+				<view class="text">{{product.drugRegCertNo||'--'}}</view>
 			</view>
 			<view class="other-box-item">
 				<view class="label">生产厂家</view>
@@ -64,10 +64,10 @@
 				<view class="label">商品条码</view>
 				<view class="text">{{product.barCode||'--'}}</view>
 			</view>
-			<view class="other-box-item">
+		<!-- 	<view class="other-box-item">
 				<view class="label">功能主治</view>
 				<view class="text">{{product.indications||'--'}}</view>
-			</view>
+			</view> -->
 			<!-- <view class="other-box-item" v-if="product.sales">
 				<view class="label">已售</view>
 				<view class="text">{{$formatSalesNum(product.sales)}}</view>
@@ -146,7 +146,11 @@
 			<view class="inner">
 				<view v-html="product.description" style="font-size:0"></view>
 			</view>
-		<!-- 	<view class="other-box" style="margin: 0;padding: 24rpx 0;">
+			<view class="other-box" style="margin: 0;padding: 24rpx 0;" v-if="product.productType !=2||isView==1">
+				<view class="other-box-item" v-if="product.indications">
+					<view class="label" style="margin-right: 16rpx;">【功能主治】</view>
+					<view class="text">{{product.indications}}</view>
+				</view>
 				<view class="other-box-item" v-if="product.dosage">
 					<view class="label" style="margin-right: 16rpx;">【用法用量】</view>
 					<view class="text">{{product.dosage}}</view>
@@ -163,7 +167,7 @@
 					<view class="label" style="margin-right: 16rpx;">【注意事项】</view>
 					<view class="text">{{product.precautions}}</view>
 				</view>
-			</view> -->
+			</view>
 		</view>
 		<view class="storebox" v-if="chooseStore.storeId">
 			<view class="x-bc">
@@ -317,7 +321,8 @@
 				evaluate: [],
 				show: false,
 				isView: 0,
-				storeInfo: {}
+				storeInfo: {},
+				stockNum: 0
 			};
 		},
 		computed: {
@@ -477,7 +482,8 @@
 					isBuy: isBuy,
 					cartNum: this.specNum,
 					productId: this.productValueSelect.productId,
-					attrValueId: this.productValueSelect.id
+					attrValueId: this.productValueSelect.id,
+					type: 1
 				};
 				addCart(data).then(
 					res => {
@@ -521,6 +527,7 @@
 					res => {
 						this.loadding = false
 						if (res.code == 200) {
+							this.stockNum = res.num || 0;
 							this.product = res.product;
 							if (this.product.productType == 1) {
 								this.buyText = "立即购买"
@@ -630,7 +637,7 @@
 					}
 				}
 				var selectVal = values.sort().join(",");
-				console.log(selectVal)
+				console.log('selectVal',selectVal,this.values)
 				var valueSelect = this.values.filter((item) => {
 					return item.sku == selectVal;
 				})

+ 235 - 48
pages_shopping/registerMerchant.vue

@@ -52,6 +52,7 @@
 							<u-input border="none" placeholder="请输入统一社会信用代码" v-model="form.unifiedSocialCreditCode"  maxlength="60" />
 						</u-form-item> -->
 						<u-form-item required labelWidth="auto"  borderBottom label="营业执照" prop="businessLicense">
+							<view style="color: red;">{{errMsg}}</view>
 							<u-upload
 								:fileList="fileList2"
 								@afterRead="afterRead"
@@ -92,7 +93,8 @@
 							</u-form-item>
 						</template>
 						<u-form-item required labelWidth="auto" borderBottom label="经营范围" prop="businessScope">
-							<u-input border="none" placeholder="请输入经营范围" v-model="form.businessScope"  maxlength="1000" />
+							<u--textarea v-model="form.businessScope" placeholder="请输入经营范围" maxlength="2000"></u--textarea>
+							<!-- <u-input border="none" placeholder="请输入经营范围" v-model="form.businessScope"  maxlength="1000" /> -->
 						</u-form-item>
 						<u-form-item required labelWidth="auto"  borderBottom label="药品经营许可证" prop="drugLicense">
 							<u-upload
@@ -132,6 +134,17 @@
 								</picker>
 							</u-form-item>
 						</template>
+						<u-form-item required labelWidth="auto" borderBottom label="药品经营许可证经营范围" prop="drugLicenseBusinessScope">
+							<u--textarea v-model="form.drugLicenseBusinessScope" placeholder="请输入药品经营许可证经营范围" maxlength="2000"></u--textarea>
+						</u-form-item>
+						<u-form-item required labelWidth="auto"  borderBottom label="药品经营许可证范围是否包含" prop="drugScopeHasFrozen">
+							<u-radio-group placement="row" v-model="form.drugScopeHasFrozen" >
+								<u-radio activeColor="#2583EB" :customStyle="{marginRight: '16px'}" key="0" label="否 " name="0" > </u-radio>
+								<u-radio activeColor="#2583EB" :customStyle="{marginRight: '16px'}" key="1" label="冷冻" name="1" > </u-radio>
+								<u-radio activeColor="#2583EB" :customStyle="{marginRight: '16px'}" key="2" label="冷藏" name="2" > </u-radio>
+								<u-radio activeColor="#2583EB" :customStyle="{marginRight: '16px'}" key="3" label="冷冻、冷藏" name="3" > </u-radio>
+							 </u-radio-group>
+						</u-form-item>
 						<u-form-item  labelWidth="auto"  borderBottom label="2类器械经营备案" prop="medicalDevice2">
 							<u-upload
 								:fileList="fileList4"
@@ -168,6 +181,9 @@
 								</picker>
 							</u-form-item>
 						</template>
+						<u-form-item labelWidth="auto" borderBottom label="2类医疗器械经营许可证营业范围" prop="medicalDevice2BusinessScope">
+							<u--textarea v-model="form.medicalDevice2BusinessScope" placeholder="请输入2类医疗器械经营许可证营业范围" maxlength="2000"></u--textarea>
+						</u-form-item>
 						<!-- <u-form-item labelWidth="auto"  borderBottom label="1类器械生产备案" prop="medicalDevice1">
 							<u-upload
 								:fileList="fileList5"
@@ -240,26 +256,29 @@
 								</picker>
 							</u-form-item>
 						</template>
-						<u-form-item labelWidth="auto"  borderBottom label="食品经营许可证" prop="foodLicense">
+						<u-form-item labelWidth="auto" borderBottom label="3类医疗器械经营许可证营业范围" prop="medicalDevice3BusinessScope">
+							<u--textarea v-model="form.medicalDevice3BusinessScope" placeholder="请输入3类医疗器械经营许可证营业范围" maxlength="2000"></u--textarea>
+						</u-form-item>
+						<u-form-item labelWidth="auto"  borderBottom label="食品经营许可证/备案凭证" prop="foodLicense">
 							<u-upload
 								:fileList="fileList7"
 								@afterRead="afterRead"
 								@delete="deletePic"
 								name="7"
-								:maxCount="1"
+								:maxCount="3"
 							></u-upload>
 						</u-form-item>
-						<u-form-item labelWidth="auto" borderBottom label="食品经营许可证编码" prop="foodCode">
-							<u-input border="none" placeholder="请输入食品经营许可证编码" v-model="form.foodCode"  maxlength="100" />
+						<u-form-item labelWidth="auto" borderBottom label="食品经营许可证/备案凭证编码" prop="foodCode">
+							<u-input border="none" placeholder="请输入食品经营许可证/备案凭证编码" v-model="form.foodCode"  maxlength="100" />
 						</u-form-item>
-						<!-- <u-form-item labelWidth="auto"  borderBottom label="食品经营许可证是否长期有效" prop="isFoodLicenseExpiryPermanent">
+						<u-form-item labelWidth="auto"  borderBottom label="食品经营许可证/备案凭证是否长期有效" prop="isFoodLicenseExpiryPermanent">
 							<u-radio-group placement="row" v-model="form.isFoodLicenseExpiryPermanent" >
 								<u-radio activeColor="#2583EB" :customStyle="{marginRight: '8px'}" key="1" label="是" :name="1" > </u-radio>
 								<u-radio activeColor="#2583EB" :customStyle="{marginRight: '8px'}" key="0" label="否" :name="0" > </u-radio>
 							 </u-radio-group>
-						</u-form-item> -->
+						</u-form-item>
 						<template v-if="form.isFoodLicenseExpiryPermanent==0">
-							<u-form-item labelWidth="auto"  borderBottom label="食品经营许可证有效期开始时间" prop="foodLicenseExpiryStart">
+							<u-form-item labelWidth="auto"  borderBottom label="食品经营许可证/备案凭证有效期开始时间" prop="foodLicenseExpiryStart">
 								<picker :value="form.foodLicenseExpiryStart" mode="date" fields="day" @change="pickerChange($event,'foodLicenseExpiryStart')">
 									<view class="x-f" style="justify-content: space-between;">
 										<u-input disabled disabledColor="#ffffff" border="none" placeholder="请选择开始时间" v-model="form.foodLicenseExpiryStart" />
@@ -267,7 +286,7 @@
 									</view>
 								</picker>
 							</u-form-item>
-							<u-form-item labelWidth="auto"  borderBottom label="食品经营许可证有效期结束时间" prop="foodLicenseExpiryEnd">
+							<u-form-item labelWidth="auto"  borderBottom label="食品经营许可证/备案凭证有效期结束时间" prop="foodLicenseExpiryEnd">
 								<picker :value="form.foodLicenseExpiryEnd" mode="date" fields="day" @change="pickerChange($event,'foodLicenseExpiryEnd')">
 									<view class="x-f" style="justify-content: space-between;">
 										<u-input disabled disabledColor="#ffffff" border="none" placeholder="请选择结束时间" v-model="form.foodLicenseExpiryEnd" />
@@ -276,6 +295,9 @@
 								</picker>
 							</u-form-item>
 						</template>
+						<u-form-item labelWidth="auto" borderBottom label="食品经营范围" prop="foodLicenseBusinessScope">
+							<u--textarea v-model="form.foodLicenseBusinessScope" placeholder="请输入食品经营范围" maxlength="2000"></u--textarea>
+						</u-form-item>
 						<!-- <u-form-item labelWidth="auto"  borderBottom label="医疗机构执业许可证" prop="medicalLicense">
 							<u-upload
 								:fileList="fileList8"
@@ -358,7 +380,7 @@
 
 <script>
 import {getDictByKey,getHospitalList,getDepartmentList,sendSmsCode,uploadOSS,getCitys} from '@/api/common.js'
-import {storeAdd} from './api/shopping.js'
+import {storeAdd,businessLicenseCheck} from './api/shopping.js'
 
 export default {
  	data() {
@@ -389,7 +411,7 @@ export default {
 				isMedicalDevice1ExpiryPermanent: 1,
 				isMedicalDevice2ExpiryPermanent: 1,
 				isMedicalDevice3ExpiryPermanent: 0,
-				isFoodLicenseExpiryPermanent: 0,
+				isFoodLicenseExpiryPermanent: 1,
 				isMedicalLicenseExpiryPermanent: 1,
 				storeName:'',
 				fullName:'',
@@ -435,7 +457,12 @@ export default {
 				medicalDevice2Code: '',
 				medicalDevice1Code: '',
 				drugCode: '',
-				businessCode: ''
+				businessCode: '',
+				medicalDevice2BusinessScope: '',
+				medicalDevice3BusinessScope:'',
+				drugLicenseBusinessScope: '',
+				drugScopeHasFrozen: 0,
+				foodLicenseBusinessScope:''
 			},
 			rules: {
 				logoUrl: [{required: true, message: '请上传企业LOGO'}],
@@ -451,7 +478,9 @@ export default {
 				businessLicenseExpireStart: [],
 				businessLicenseExpireEnd: [],
 				drugLicense: [{required: true, message: '请上传药品经营许可证'}],
+				drugLicenseBusinessScope: [{required: true, message: '请输入药品经营许可证经营范围'}],
 				drugCode: [{required: true, message: '请输入药品经营许可证编码'}],
+				drugScopeHasFrozen: [{required: true, message: '药品经营许可证范围是否包含'}],
 				// drugLicenseExpiryStart: [{required: true, message: '请选择药品经营许可证编号有效期'}],
 				// medicalDevice2: [{required: true, message: '请上传2类医疗器械备案'}],
 				// medicalDevice2Code: [{required: true, message: '请输入2类医疗器械备案编码'}],
@@ -479,7 +508,8 @@ export default {
 			medicalDevice1Expiry:'',
 			medicalDevice3Expiry:'',
 			foodLicenseExpiry:'',
-			medicalLicenseExpiry:''
+			medicalLicenseExpiry:'',
+			errMsg:'',
  		}
  	},
 	onLoad(options) {
@@ -680,27 +710,58 @@ export default {
 				const result = await this.uploadFilePromise(lists[i].url)
 				let item = this[`fileList${event.name}`][fileListLen]
 				this[`fileList${event.name}`].splice(fileListLen, 1, Object.assign(item, {
-					status: 'success',
-					message: '',
-					url: result
+					status: result.status,
+					message: result.status == 'failed' ? '上传失败' : '',
+					url: result.url
 				}))
 				fileListLen++
+				if(event.name==2&&result.status=='success') {
+					this.form.businessLicense = this.fileList2[0].url
+					this.businessLicenseCheck()
+				}
 			}
 		},
+		getSuccessUrls(list) {
+		  if (!list || list.length === 0) return '';
+		
+		  const hasUploading = list.some(v => v.status === 'uploading');
+		  const hasFailed = list.some(v => v.status === 'failed');
+		
+		  if (hasUploading) {
+		    uni.showToast({ title: '请等待图片上传完成', icon: 'none' });
+		    return 'failed';
+		  }
+		  if (hasFailed) {
+		    uni.showToast({ title: '请检查是否有图片上传失败', icon: 'none' });
+		    return 'failed';
+		  }
+		
+		  return list.filter(v => v.status === 'success').map(v => v.url).join(',');
+		},
 		uploadFilePromise(url) {
 			return new Promise((resolve, reject) => {
 				let a = uni.uploadFile({
-					url: uni.getStorageSync('requestPath')+'/app/common/uploadOSS',  
+					url: uni.getStorageSync('requestPath') +'/app/common/uploadOSS', // 仅为示例,非真实的接口地址
 					filePath: url,
 					name: 'file',
-					formData: {
-						user: 'test'
-					},
 					success: (res) => {
-						setTimeout(() => {
-							console.log(JSON.parse(res.data).url)
-							resolve(JSON.parse(res.data).url)
-						}, 1000)
+						if(res.statusCode == 200&&JSON.parse(res.data).code == 200) {
+							resolve({
+								url:JSON.parse(res.data).url,
+								status: 'success'
+							})
+						} else {
+							resolve({
+								url:url,
+								status: 'failed'
+							})
+						}
+					},
+					fail: (res) => {
+						resolve({
+							url:url,
+							status: 'failed'
+						})
 					}
 				});
 			})
@@ -733,30 +794,39 @@ export default {
 		},
  		submit(){
  			var that=this;
-			if(this.fileList1.length>0){
-				this.form.logoUrl=this.fileList1[0].url
-			}
-			if(this.fileList2.length>0){
-				this.form.businessLicense=this.fileList2[0].url
-			}
-			if(this.fileList3.length>0){
-				this.form.drugLicense=this.fileList3[0].url
-			}
-			if(this.fileList4.length>0){
-				this.form.medicalDevice2=this.fileList4[0].url
-			}
-			if(this.fileList5.length>0){
-				this.form.medicalDevice1=this.fileList5[0].url
-			}
-			if(this.fileList6.length>0){
-				this.form.medicalDevice3=this.fileList6[0].url
-			}
-			if(this.fileList7.length>0){
-				this.form.foodLicense=this.fileList7[0].url
-			}
-			if(this.fileList8.length>0){
-				this.form.medicalLicense=this.fileList8[0].url
-			}
+
+			const logoUrl = this.getSuccessUrls(this.fileList1);
+			if (logoUrl === 'failed') return;
+			this.form.logoUrl = logoUrl;
+			
+			const businessLicense = this.getSuccessUrls(this.fileList2);
+			if (businessLicense === 'failed') return;
+			this.form.businessLicense = businessLicense;
+			
+			const drugLicense = this.getSuccessUrls(this.fileList3);
+			if (drugLicense === 'failed') return;
+			this.form.drugLicense = drugLicense;
+			
+			const medicalDevice2 = this.getSuccessUrls(this.fileList4);
+			if (medicalDevice2 === 'failed') return;
+			this.form.medicalDevice2 = medicalDevice2;
+			
+			const medicalDevice1 = this.getSuccessUrls(this.fileList5);
+			if (medicalDevice1 === 'failed') return;
+			this.form.medicalDevice1 = medicalDevice1;
+
+			const medicalDevice3 = this.getSuccessUrls(this.fileList6);
+			if (medicalDevice3 === 'failed') return;
+			this.form.medicalDevice3 = medicalDevice3;
+
+			const foodLicense = this.getSuccessUrls(this.fileList7);
+			if (foodLicense === 'failed') return;
+			this.form.foodLicense = foodLicense;
+			
+			const medicalLicense = this.getSuccessUrls(this.fileList8);
+			if (medicalLicense === 'failed') return;
+			this.form.medicalLicense = medicalLicense;
+
 			console.log(this.form)
 			if(this.form.isBusinessLicensePermanent == 0&&!this.form.businessLicenseExpireStart) {
 				uni.showToast({
@@ -800,6 +870,56 @@ export default {
 				})
 				return
 			}
+			if(this.form.isFoodLicenseExpiryPermanent == 0&&!this.form.foodLicenseExpiryStart) {
+				uni.showToast({
+					title: '请选择食品经营许可证/备案凭证有效期开始时间',
+					icon: 'none'
+				})
+				return
+			}
+			if(this.form.isFoodLicenseExpiryPermanent == 0&&!this.form.foodLicenseExpiryEnd) {
+				uni.showToast({
+					title: '请选择食品经营许可证/备案凭证有效期结束时间',
+					icon: 'none'
+				})
+				return
+			}
+			const err = this.checkDateRanges([
+				{
+					start: this.form.businessLicenseExpireStart,
+					end: this.form.businessLicenseExpireEnd,
+					msg: '营业执照有效期' ,
+					require: this.form.isBusinessLicensePermanent == 0,
+				},
+				{ 
+					start: this.form.drugLicenseExpiryStart,
+					end: this.form.drugLicenseExpiryEnd,
+					msg: '药品经营许可证编号有效期' ,
+					require: this.form.isDrugLicensePermanent == 0,
+				},
+				{
+					start: this.form.medicalDevice2ExpiryStart,
+					end: this.form.medicalDevice2ExpiryEnd,
+					msg: '2类器械经营备案有效期',
+					require: this.form.isMedicalDevice2ExpiryPermanent == 0,
+				},{
+					start: this.form.medicalDevice3ExpiryStart,
+					end: this.form.medicalDevice3ExpiryEnd,
+					msg: '3类器械经营许可证有效期' ,
+					require: false,
+				},
+				{
+					start: this.form.foodLicenseExpiryStart,
+					end: this.form.foodLicenseExpiryEnd,
+					msg: '食品经营许可证/备案凭证有效期' ,
+					require: this.form.isFoodLicenseExpiryPermanent == 0,
+				}
+			]);
+			
+			if (err) {
+			  uni.showToast({ title: err, icon: 'none' });
+			  return;
+			}
 			// if(this.form.isMedicalLicenseExpiryPermanent == 0&&!this.form.medicalLicenseExpiryStart) {
 			// 	uni.showToast({
 			// 		title: '请选择医疗机构执业许可证有效期开始时间',
@@ -821,6 +941,73 @@ export default {
 				}
 			})
  		},
+		checkDateRanges(list = []) {
+			for (const { start, end, msg = '有效期', require = true, afterToday = true } of list) {
+				// 1. require=false 且任一为空 → 跳过
+				if (!require && (!start || !end)) continue;
+			
+				// 2. require=true 时缺值 → 报错
+				if (!start || !end) return `${msg} 请选择完整时间`;
+			
+				// 3. 常规区间校验
+				if (start > end) return `${msg} 开始时间不能大于结束时间`;
+			
+				if (afterToday) {
+				  // 今天 00:00:00.000
+				  const todayZero = new Date();
+				  todayZero.setHours(0, 0, 0, 0);
+				
+				  // 明天 00:00:00.000
+				  const tomorrowZero = new Date(todayZero);
+				  tomorrowZero.setDate(todayZero.getDate() + 1);
+				
+				  // 结束日期 00:00:00.000
+				  const endZero = new Date(end);
+				  endZero.setHours(0, 0, 0, 0);
+				
+				  // 结束日期 < 明天零点 → 不合法
+				  if (endZero < tomorrowZero) return `${msg} 结束时间必须大于今天`;
+				}
+			}
+			return '';
+		},
+		businessLicenseCheck() {
+			businessLicenseCheck({imageUrl:this.form.businessLicense}).then(res=>{
+				if(res.code==200) {
+					if(res.data.flag) {
+						this.errMsg = ''
+						this.form.enterpriseAddress = res.data.address;
+						this.form.legalPersonName = res.data.person;
+						this.form.businessScope = res.data.businessStr;
+						this.form.businessCode = res.data.regNum;
+					} else {
+						this.fileList2 = ''
+						this.form.businessLicense = ''
+						this.errMsg = '请上传正确且清晰的营业执照'
+						uni.showToast({
+							title: '请上传正确且清晰的营业执照',
+							icon: 'none'
+						})
+					}
+				} else {
+					this.errMsg = ''
+					this.fileList2 = ''
+					this.form.businessLicense = ''
+					uni.showToast({
+						title: res.msg,
+						icon: 'none'
+					})
+				}
+			}).catch((err)=>{
+				this.errMsg = ''
+				this.fileList2 = ''
+				this.form.businessLicense = ''
+				uni.showToast({
+					title: err,
+					icon: 'none'
+				})
+			})
+		}
  	}
 }
  

+ 0 - 2
pages_store/api/product.js

@@ -1,2 +0,0 @@
-import Request from '@/common/request.js';
-let request = new Request().http

+ 3 - 3
pages_store/components/storeDetail.vue

@@ -90,7 +90,7 @@
 				</view>
 			</view>
 			<view class="storeInfo-item mb20" v-if="storeInfo.foodLicense">
-				<view class="label mb20">食品经营许可证</view>
+				<view class="label mb20">食品经营许可证/备案凭证</view>
 				<view class="val x-f">
 					<u-image
 						v-if="storeInfo.foodLicense"
@@ -106,7 +106,7 @@
 					<view v-else>暂未上传</view>
 				</view>
 			</view>
-			<view class="storeInfo-item mb20" v-if="storeInfo.medicalLicense">
+			<!-- <view class="storeInfo-item mb20" v-if="storeInfo.medicalLicense">
 				<view class="label mb20">医疗机构执业许可证</view>
 				<view class="val x-f">
 					<u-image
@@ -122,7 +122,7 @@
 					></u-image>
 					<view v-else>暂未上传</view>
 				</view>
-			</view>
+			</view> -->
 		</view>
 	</view>
 </template>

+ 5 - 0
pages_store/components/tuiStoreProduct.vue

@@ -52,6 +52,11 @@
 					storeId: ""
 				},
 				mescroll:null,
+				downOption: {
+					//下拉刷新
+					use: true,
+					auto: false // 不自动加载 (mixin已处理第一个tab触发downCallback)
+				},
 				// 上拉加载的配置
 				upOption: {
 					onScroll:true,

+ 3 - 3
pages_store/storeDetail.vue

@@ -99,7 +99,7 @@
 				</view>
 			</view>
 			<view class="storeInfo-item mb20" v-if="storeInfo.foodLicense">
-				<view class="label mb20">食品经营许可证</view>
+				<view class="label mb20">食品经营许可证/备案凭证</view>
 				<view class="val x-f">
 					<u-image
 						v-if="storeInfo.foodLicense"
@@ -115,7 +115,7 @@
 					<view v-else>暂未上传</view>
 				</view>
 			</view>
-			<view class="storeInfo-item mb20" v-if="storeInfo.medicalLicense">
+			<!-- <view class="storeInfo-item mb20" v-if="storeInfo.medicalLicense">
 				<view class="label mb20">医疗机构执业许可证</view>
 				<view class="val x-f">
 					<u-image
@@ -131,7 +131,7 @@
 					></u-image>
 					<view v-else>暂未上传</view>
 				</view>
-			</view>
+			</view> -->
 		</view>
 	</view>
 </template>

+ 3 - 0
pages_store/storeIndex.vue

@@ -580,6 +580,9 @@
 					font-weight: 500;
 					color: #333333;
 					position: relative;
+					overflow: hidden;
+					white-space: nowrap;
+					text-overflow: ellipsis;
 					&.active{
 						color: #2583EB;
 						&::after{

+ 42 - 14
pages_user/complaint.vue

@@ -339,9 +339,10 @@
 				);
 			},
 			submit() {
-				if (this.fileList1.length > 0) {
-					this.formdata.images = this.fileList1.map(item=>item.url).join(',')
-				}
+				const images = this.getSuccessUrls(this.fileList1);
+				if (images === 'failed') return;
+				this.formdata.images = images;
+				
 				if(this.formdata.complaintType == 2&&!this.formdata.images) {
 					uni.showToast({
 						title: '请上传凭证',
@@ -433,27 +434,54 @@
 					const result = await this.uploadFilePromise(lists[i].url)
 					let item = this[`fileList${event.name}`][fileListLen]
 					this[`fileList${event.name}`].splice(fileListLen, 1, Object.assign(item, {
-						status: 'success',
-						message: '',
-						url: result
+						status: result.status,
+						message: result.status == 'failed' ? '上传失败' : '',
+						url: result.url
 					}))
 					fileListLen++
 				}
 			},
+			getSuccessUrls(list) {
+			  if (!list || list.length === 0) return '';
+			
+			  const hasUploading = list.some(v => v.status === 'uploading');
+			  const hasFailed = list.some(v => v.status === 'failed');
+			
+			  if (hasUploading) {
+			    uni.showToast({ title: '请等待图片上传完成', icon: 'none' });
+			    return 'failed';
+			  }
+			  if (hasFailed) {
+			    uni.showToast({ title: '请检查是否有图片上传失败', icon: 'none' });
+			    return 'failed';
+			  }
+			
+			  return list.filter(v => v.status === 'success').map(v => v.url).join(',');
+			},
 			uploadFilePromise(url) {
 				return new Promise((resolve, reject) => {
 					let a = uni.uploadFile({
-						url: uni.getStorageSync('requestPath') + '/app/common/uploadOSS',
+						url: uni.getStorageSync('requestPath') +'/app/common/uploadOSS', // 仅为示例,非真实的接口地址
 						filePath: url,
 						name: 'file',
-						formData: {
-							user: 'test'
-						},
 						success: (res) => {
-							setTimeout(() => {
-								console.log(JSON.parse(res.data).url)
-								resolve(JSON.parse(res.data).url)
-							}, 1000)
+							if(res.statusCode == 200&&JSON.parse(res.data).code == 200) {
+								resolve({
+									url:JSON.parse(res.data).url,
+									status: 'success'
+								})
+							} else {
+								resolve({
+									url:url,
+									status: 'failed'
+								})
+							}
+						},
+						fail: (res) => {
+							resolve({
+								url:url,
+								status: 'failed'
+							})
 						}
 					});
 				})

+ 3 - 1
pages_user/complaintList.vue

@@ -21,8 +21,10 @@
 </template>
 
 <script>
+	import MescrollMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js";
 	import {storeComplaintList} from "@/api/user.js"
 	export default {
+		mixins: [MescrollMixin], 
 		data() {
 			return {
 				mescroll:null,
@@ -50,7 +52,7 @@
 			}
 		},
 		onShow() {
-			this.mescroll.resetUpScroll()
+			this.mescroll&&this.mescroll.resetUpScroll()
 		},
 		methods: {
 			showDetail(item) {

+ 46 - 19
pages_user/complaintListDetail.vue

@@ -3,15 +3,15 @@
 		<view class="imgs">
 			<image v-for="(img,i) in images" :key="i" :src="img" mode="aspectFill" @click="previewImage(i,images)"></image>
 		</view>
-		<viwe class="con">
+		<view class="con">
 			<view class="title">
-				<text class="tag" :style="{backgroundColor: info.isProcessCompleted==1? '#eee': info.isHandlePlatform==0&&info.isHandleStore==0 ? 'red':'#2583EB', color: item.isProcessCompleted==1? '#666':'#fff'}">
+				<text class="tag" :style="{backgroundColor: info.isProcessCompleted==1? '#eee': info.isHandlePlatform==0&&info.isHandleStore==0 ? 'red':'#2583EB', color: info.isProcessCompleted==1? '#666':'#fff'}">
 					{{info.isProcessCompleted==1? '已结束':info.isHandlePlatform==0&&info.isHandleStore==0 ? '待处理':'已处理'}}
 				</text>{{info.title}}</view>
 			<view>{{info.content}}</view>
 			<view style="margin-top: 24rpx;color:#999999">时间:{{info.createTime || '--'}}</view>
-		</viwe>
-		<viwe class="con" v-show="msgList&&msgList.length>0">
+		</view>
+		<view class="con" v-show="msgList&&msgList.length>0">
 			<view class="msg">
 				<view v-for="(msg,i) in msgList" :key="i" :class="msg.sendType !=1?'storemsg':''" style="margin-bottom: 24rpx;">
 					<view class="lable">{{msg.sendType ==2?'商家回复:':msg.sendType ==3?'平台回复:':msg.sendType ==1?'我:':''}}</view>
@@ -29,7 +29,7 @@
 				<view class="val">问题问题问题问题问题问题问题问题问题问题</view>
 				<view class="val x-f" style="margin-top: 10rpx;font-size: 28rpx;color:#999999;"><text style="margin-right: 16rpx;">2022-12-22 12:33</text></view>
 			</view> -->
-		</viwe>
+		</view>
 		<view class="chatbox" v-if="info.isProcessCompleted!=1">
 			<u-icon name="chat" color="#999" size="48rpx"@click="open"></u-icon>
 		</view>
@@ -118,9 +118,9 @@
 				})
 			},
 			send() {
-				if (this.fileList1.length > 0) {
-					this.replyImages = this.fileList1.map(item=>item.url).join(',')
-				}
+				const replyImages = this.getSuccessUrls(this.fileList1);
+				if (replyImages === 'failed') return;
+				this.replyImages = replyImages;
 				if(!this.content) {
 					uni.showToast({
 						title: '请输入回复内容',
@@ -164,9 +164,9 @@
 					const result = await this.uploadFilePromise(lists[i].url)
 					let item = this[`fileList${event.name}`][fileListLen]
 					this[`fileList${event.name}`].splice(fileListLen, 1, Object.assign(item, {
-						status: 'success',
-						message: '',
-						url: result
+						status: result.status,
+						message: result.status == 'failed' ? '上传失败' : '',
+						url: result.url
 					}))
 					fileListLen++
 				}
@@ -174,21 +174,48 @@
 			uploadFilePromise(url) {
 				return new Promise((resolve, reject) => {
 					let a = uni.uploadFile({
-						url: uni.getStorageSync('requestPath') + '/app/common/uploadOSS',
+						url: uni.getStorageSync('requestPath') +'/app/common/uploadOSS', // 仅为示例,非真实的接口地址
 						filePath: url,
 						name: 'file',
-						formData: {
-							user: 'test'
-						},
 						success: (res) => {
-							setTimeout(() => {
-								console.log(JSON.parse(res.data).url)
-								resolve(JSON.parse(res.data).url)
-							}, 1000)
+							if(res.statusCode == 200&&JSON.parse(res.data).code == 200) {
+								resolve({
+									url:JSON.parse(res.data).url,
+									status: 'success'
+								})
+							} else {
+								resolve({
+									url:url,
+									status: 'failed'
+								})
+							}
+						},
+						fail: (res) => {
+							resolve({
+								url:url,
+								status: 'failed'
+							})
 						}
 					});
 				})
 			},
+			getSuccessUrls(list) {
+			  if (!list || list.length === 0) return '';
+			
+			  const hasUploading = list.some(v => v.status === 'uploading');
+			  const hasFailed = list.some(v => v.status === 'failed');
+			
+			  if (hasUploading) {
+			    uni.showToast({ title: '请等待图片上传完成', icon: 'none' });
+			    return 'failed';
+			  }
+			  if (hasFailed) {
+			    uni.showToast({ title: '请检查是否有图片上传失败', icon: 'none' });
+			    return 'failed';
+			  }
+			
+			  return list.filter(v => v.status === 'success').map(v => v.url).join(',');
+			},
 		}
 	}
 </script>

+ 5 - 0
pages_user/integralOrderList.vue

@@ -91,6 +91,11 @@
 				{name:"已取消",id:"-1"}
 			],
 			mescroll:null,
+			downOption: {
+				//下拉刷新
+				use: true,
+				auto: false // 不自动加载 (mixin已处理第一个tab触发downCallback)
+			},
 			// 上拉加载的配置
 			upOption: {
 				onScroll:false,

+ 50 - 19
pages_user/registerDoctor.vue

@@ -159,10 +159,10 @@
 								></u-upload>
 							</u-form-item>
 						</template>
-						<u-form-item labelWidth="180rpx"  borderBottom label="执业证编号" prop="practiseCode">
-							<u-input border="none" placeholder="请输入执业证编号" v-model="form.practiseCode" />
+						<u-form-item labelWidth="180rpx"  borderBottom label="注册证书编号" prop="practiseCode">
+							<u-input border="none" placeholder="请输入注册证书编号" v-model="form.practiseCode" />
 						</u-form-item>
-						<u-form-item labelWidth="180rpx" borderBottom label="执业证书" prop="certificateImages">
+						<u-form-item labelWidth="180rpx" borderBottom label="注册证书" prop="certificateImages">
 							<u-upload
 								:fileList="fileList4"
 								@afterRead="afterRead"
@@ -170,7 +170,6 @@
 								name="4"
 								:maxCount="3"
 							></u-upload>
-							<view style="color: red;" v-if="form.doctorType==2">第一张证照上传注册证</view>
 						</u-form-item>
 						<u-form-item labelWidth="180rpx" borderBottom label="联系电话" prop="mobile">
 							<u-input  border="none"  placeholder="请输入联系电话" v-model="form.mobile" />
@@ -294,7 +293,7 @@ export default {
 				practiseCode : [
 					{ 
 						required: true, 
-						message: '请输入执业证编号',
+						message: '请输入注册证书编号',
 						trigger: ['change','blur'],
 					}
 				]
@@ -483,27 +482,54 @@ export default {
 				const result = await this.uploadFilePromise(lists[i].url)
 				let item = this[`fileList${event.name}`][fileListLen]
 				this[`fileList${event.name}`].splice(fileListLen, 1, Object.assign(item, {
-					status: 'success',
-					message: '',
-					url: result
+					status: result.status,
+					message: result.status == 'failed' ? '上传失败' : '',
+					url: result.url
 				}))
 				fileListLen++
 			}
 		},
+		getSuccessUrls(list) {
+		  if (!list || list.length === 0) return '';
+		
+		  const hasUploading = list.some(v => v.status === 'uploading');
+		  const hasFailed = list.some(v => v.status === 'failed');
+		
+		  if (hasUploading) {
+		    uni.showToast({ title: '请等待图片上传完成', icon: 'none' });
+		    return 'failed';
+		  }
+		  if (hasFailed) {
+		    uni.showToast({ title: '请检查是否有图片上传失败', icon: 'none' });
+		    return 'failed';
+		  }
+		
+		  return list.filter(v => v.status === 'success').map(v => v.url).join(',');
+		},
 		uploadFilePromise(url) {
 			return new Promise((resolve, reject) => {
 				let a = uni.uploadFile({
-					url: uni.getStorageSync('requestPath')+'/app/common/uploadOSS',  
+					url: uni.getStorageSync('requestPath') +'/app/common/uploadOSS', // 仅为示例,非真实的接口地址
 					filePath: url,
 					name: 'file',
-					formData: {
-						user: 'test'
-					},
 					success: (res) => {
-						setTimeout(() => {
-							// console.log(JSON.parse(res.data).url)
-							resolve(JSON.parse(res.data).url)
-						}, 1000)
+						if(res.statusCode == 200&&JSON.parse(res.data).code == 200) {
+							resolve({
+								url:JSON.parse(res.data).url,
+								status: 'success'
+							})
+						} else {
+							resolve({
+								url:url,
+								status: 'failed'
+							})
+						}
+					},
+					fail: (res) => {
+						resolve({
+							url:url,
+							status: 'failed'
+						})
 					}
 				});
 			})
@@ -536,9 +562,14 @@ export default {
 		},
  		submit(){
  			var that=this;
-			if(this.fileList1.length>0){
-				this.form.avatar=this.fileList1[0].url
-			}
+	
+			const avatar = this.getSuccessUrls(this.fileList1);
+			if (avatar === 'failed') return;
+			this.form.avatar = avatar;
+			
+			const fileList2 = this.getSuccessUrls(this.fileList2);
+			if (fileList2 === 'failed') return;
+			
 			
 			if(this.fileList2.length>0){
 				var images=[]

+ 5 - 0
pages_user/shopping/refundOrderList.vue

@@ -103,6 +103,11 @@
 				],
 				status: 0,
 				mescroll:null,
+				downOption: {
+					//下拉刷新
+					use: true,
+					auto: false // 不自动加载 (mixin已处理第一个tab触发downCallback)
+				},
 				// 上拉加载的配置
 				upOption: {
 					onScroll:true,

+ 7 - 2
pages_user/shopping/storeOrder.vue

@@ -19,7 +19,7 @@
 			</view>
 			<view class="search-cont">
 				<view class="inner">
-					<image class="icon-search" src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/app/newImages/shopping/search.png" mode=""></image>
+					<image class="icon-search" src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/image/icon_search.png" mode=""></image>
 					<input type="text" value="" placeholder="输入订单号" confirm-type="搜索" @confirm="goSearch"   placeholder-style="font-size:28rpx;color:#BBBBBB;font-family: PingFang SC;" />
 				</view>
 			</view>
@@ -127,6 +127,11 @@
 					{name:"已评价",value:"4"}
 				],
 				mescroll:null,
+				downOption: {
+					//下拉刷新
+					use: true,
+					auto: false // 不自动加载 (mixin已处理第一个tab触发downCallback)
+				},
 				// 上拉加载的配置
 				upOption: {
 					onScroll:true,
@@ -275,7 +280,7 @@
 							})
 						} else if(res.data.status == 1) {
 							uni.navigateTo({
-							 	url: '/pages/index/webview?url='+encodeURIComponent(res.data.jumpLink)
+							 	url: '/pages/index/webview?type=prescribe&url='+encodeURIComponent(res.data.jumpLink)
 							})
 						} else if(res.data.status == 2) {
 							uni.navigateTo({

+ 2 - 2
pages_user/shopping/storeOrderDetail.vue

@@ -302,7 +302,7 @@
 							})
 						} else if(res.data.status == 1) {
 							uni.navigateTo({
-							 	url: '/pages/index/webview?url='+encodeURIComponent(res.data.jumpLink)
+							 	url: '/pages/index/webview?type=prescribe&url='+encodeURIComponent(res.data.jumpLink)
 							})
 						} else if(res.data.status == 2) {
 							uni.navigateTo({
@@ -340,7 +340,7 @@
 					}else{
 						uni.showToast({
 							icon:'none',
-							title: "请求失败",
+							title: res.msg,
 						});
 						 
 					}

+ 5 - 0
pages_user/tongue/tongueList.vue

@@ -23,6 +23,11 @@
 		data() {
 			return {
 				mescroll:null,
+				downOption: {
+					//下拉刷新
+					use: true,
+					auto: false // 不自动加载 (mixin已处理第一个tab触发downCallback)
+				},
 				// 上拉加载的配置
 				upOption: {
 					onScroll:false,