Quellcode durchsuchen

Merge branches 'developerA' and 'developerB' of git.caimei365.com:caimei-repository/caimei-applets-caimei into developerA

# Conflicts:
#	components/cm-module/listTemplate/immediatelyList.vue
#	pages/search/search.vue
jun.li@caimei365.com vor 5 Jahren
Ursprung
Commit
752da3460b
62 geänderte Dateien mit 5681 neuen und 725 gelöschten Zeilen
  1. 1 0
      App.vue
  2. 1 1
      api/use.js
  3. 2 1
      api/utils.js
  4. 1 2
      common/config/caimeiApi.js
  5. 58 1
      common/css/common.scss
  6. 17 1
      common/css/iconfont.scss
  7. 7 10
      components/cm-custom/custom-d.vue
  8. 1 1
      components/cm-module/creatOrder/invoiceTent.vue
  9. 1 1
      components/cm-module/creatOrder/sellerFreight.vue
  10. 1 1
      components/cm-module/creatOrder/sellerInvoice.vue
  11. 511 502
      components/cm-module/listTemplate/immediatelyList.vue
  12. 1 2
      components/cm-module/modelAlert/shareAlert.vue
  13. 181 0
      components/cm-module/modelAlert/supplierShareAlert.vue
  14. 7 0
      components/cm-module/orderDetails/goodsList.vue
  15. 199 0
      components/cm-module/orderDetails/supplierDetaileButton.vue
  16. 127 0
      components/cm-module/orderDetails/supplierRecorgButton.vue
  17. 1 1
      components/cm-module/popupGoods/popupGoods.vue
  18. 1 0
      components/cm-module/productDetails/cm-attributes.vue
  19. 103 0
      components/cm-module/productDetails/cm-parameter.vue
  20. 0 16
      components/cm-module/productDetails/cm-price.vue
  21. 84 0
      components/cm-module/productDetails/cm-service.vue
  22. 80 43
      components/cm-module/productDetails/supplierDetails.vue
  23. 1 0
      main.js
  24. 65 1
      pages.json
  25. 3 1
      pages/authorization/authorization.vue
  26. 66 23
      pages/goods/cart.vue
  27. 129 38
      pages/goods/product.vue
  28. 44 0
      pages/goods/supplier.vue
  29. 4 0
      pages/search/search-order.vue
  30. 25 9
      pages/search/search.vue
  31. 70 24
      pages/tabBar/cart/cart.vue
  32. 8 2
      pages/tabBar/home/home.vue
  33. 1 1
      pages/tabBar/user/user.vue
  34. 2 4
      pages/user/address/address.vue
  35. 1 2
      pages/user/order/create-order.vue
  36. 4 0
      pages/user/order/order-list.vue
  37. 29 18
      pages/user/regularPurchase/regularPurchase.vue
  38. 20 6
      seller/pages/cart/buyagain.vue
  39. 76 7
      seller/pages/cart/cart.vue
  40. 16 3
      seller/pages/cart/immediately.vue
  41. 0 1
      seller/pages/club/allClub-list.vue
  42. 0 1
      seller/pages/club/club-list.vue
  43. 0 1
      seller/pages/club/list.vue
  44. 13 0
      services/ajax.env.js
  45. 67 0
      services/ajax.service.js
  46. 10 0
      services/common.service.js
  47. 18 0
      services/index.js
  48. 75 0
      services/locate.service.js
  49. 16 0
      services/photo.service.js
  50. 57 0
      services/shop.service.js
  51. 36 0
      services/upload.service.js
  52. 17 0
      services/user.service.js
  53. 1 0
      store/index.js
  54. 587 0
      supplier/pages/deliver/add-logistics.vue
  55. 533 0
      supplier/pages/deliver/deliver-goods.vue
  56. 479 0
      supplier/pages/deliver/deliver-record.vue
  57. 98 0
      supplier/pages/deliver/logistics-list.vue
  58. 371 0
      supplier/pages/login/bind-operator.vue
  59. 130 0
      supplier/pages/login/share-info.vue
  60. 146 0
      supplier/pages/login/share-login.vue
  61. 486 0
      supplier/pages/order/order-details.vue
  62. 592 0
      supplier/pages/order/order-service-details.vue

+ 1 - 0
App.vue

@@ -33,6 +33,7 @@
 					console.log(e.platform)
 					if (e.platform == 'android') {
 						Vue.prototype.platformClass = 'left'
+						self.$store.dispatch('setVariableFun',false)
 					} else {
 						Vue.prototype.platformClass = 'center'
 						self.$store.dispatch('setIsIphoneFun',true)

+ 1 - 1
api/use.js

@@ -270,7 +270,7 @@ export function userInfoLogin(params) {
 			if(res.code == 0 || res.code == 4){
 				resolve(res)
 			}else if(res.code == -6){
-				resolve(res)
+				reject(res)
 			}else{
 				reject(res)
 			}

+ 2 - 1
api/utils.js

@@ -39,6 +39,7 @@ export function queryProtocol() {
 }
 /**
  *获取图形验证码
+ * platformType:小程序 2  WWW 0  CRM 1 
  */
 export function getImageCode() {
 	return new Promise(function(resolve,reject) {
@@ -163,7 +164,7 @@ export function uploadFileImage() {
 			success: (res) => {
 				const tempFilePaths = res.tempFilePaths;
 				const uploadTask = uni.uploadFile({
-					url : requestUrl+'/formData/MultiPictareaddData',
+					url : 'https://spi-b.caimei365.com/formData/MultiPictareaddData',
 					filePath: tempFilePaths[0],
 					name: 'file',
 					header: {

+ 1 - 2
common/config/caimeiApi.js

@@ -201,8 +201,7 @@ const caimeiApi = {
 			url:url
 		})
 	},
-	isNumber:function(value){
-	//验证是否为数字
+	isNumber:function(value){//验证是否为数字
 	    var patrn = /^(-)?\d+(\.\d+)?$/;
 	    if (patrn.exec(value) == null || value == "") {
 	         return false

+ 58 - 1
common/css/common.scss

@@ -300,4 +300,61 @@ button::after{
 .uni-badge-error {
 	color: #fff;
 	background-color: #dd524d;
-}
+}
+/* 加入购物模态层*/
+	@keyframes showPopup {
+		0% {
+			opacity: 0;
+		}
+		100% {
+			opacity: 1;
+		}
+	}
+	@keyframes hidePopup {
+		0% {
+			opacity: 1;
+		}
+		100% {
+			opacity: 0;
+		}
+	}
+	@keyframes showLayer {
+		0% {
+			transform: translateY(0);
+		}
+		100% {
+			transform: translateY(-100%);
+		}
+	}
+	@keyframes hideLayer {
+		0% {
+			transform: translateY(-100%);
+		}
+		100% {
+			transform: translateY(0);
+		}
+	}
+	@keyframes showAmnation {
+		0% {
+			top: -12rpx;
+			opacity: 0;
+		}
+		50% {
+			top: -60rpx;
+			opacity: 1;
+		}
+		100% {
+			top: -100rpx;
+			opacity: 0;
+		}
+	}
+	@keyframes hideAmnation {
+		0% {
+			top: -100rpx;
+			opacity: 0;
+		}
+		100% {
+			top: -12rpx;
+			opacity: 0;
+		}
+	}

+ 17 - 1
common/css/iconfont.scss

@@ -4,7 +4,7 @@
 	font-family: iconfont;
 	font-weight: normal;
 	font-style: normal;
-	src: url('https://at.alicdn.com/t/font_1519039_1ayob1mwcnv.ttf') format('truetype');
+	src: url('https://at.alicdn.com/t/font_1519039_mkxy06756m.ttf') format('truetype');
 }
 .iconfont {
 	font-family: "iconfont" !important;
@@ -13,6 +13,22 @@
 	-webkit-font-smoothing: antialiased;
 	-moz-osx-font-smoothing: grayscale;
 }
+.icon-xingxing:before {
+  content: "\e870";
+}
+
+.icon-icon-cross-squre:before {
+  content: "\e668";
+}
+
+.icon-saomafukuan-:before {
+  content: "\e645";
+}
+
+.icon-icon-test:before {
+  content: "\e604";
+}
+
 .icon-xiangxia1:before {
   content: "\e771";
 }

+ 7 - 10
components/cm-custom/custom-d.vue

@@ -1,14 +1,13 @@
 <template name="headerNavbar">
-	<!-- 自定义导航栏 -->
+	<!-- 发货记录自定义导航栏 -->
 	<view class='navbar-wrap' :style="{height:navbarHeight+'px',paddingTop:statusBarHeight+'px'}"> 
 	  	<view class="navbar-text" :style="{lineHeight:(navbarHeight - statusBarHeight)+'px;',fontSize:fontSizeSetting+'px;'}">
 	    	{{navbarData.title ? navbarData.title : " "}}
 	  	</view>
-	  	<view class="navbar-icon" v-if="navbarData.showCapsule ? navbarData.showCapsule : true" 
-			  :style="{width:headerBtnPosi.width+'px;',lineHeight:(navbarBtn.height)+'px',top:navbarBtn.top + statusBarHeight+'px;',left:navbarBtn.right+'px;',height:(navbarBtn.height)+'px;'}">
-			  <text v-if='haveBack' @click="_goBack" class="iconfont icon-shangyibu" :style="{width:headerBtnPosi.width/2+'px',height:navbarBtn.height+'px'}"></text>
-	      	  <text  v-if='haveBack' class="iconfont icon-vertical_line" :style="{borderColor:navbarData.borderColor ? navbarData.borderColor : 'rgba(0,0,0,0.4)'}"></text>
-			  <text @click="_goHome" class="iconfont icon-shouye" :style="{width:headerBtnPosi.width/2+'px',height:navbarBtn.height+'px'}"></text>
+	  	<view class="navbar-icon" :style="{width:headerBtnPosi.width+'px',lineHeight:(navbarBtn.height)+'px',top:navbarBtn.top + statusBarHeight+'px',left:navbarBtn.right+'px',height:(navbarBtn.height)+'px'}">
+			  <text @click="_goBack" class="iconfont icon-shangyibu" :style="{width:headerBtnPosi.width/2+'px',height:navbarBtn.height+'px'}"></text>
+	      	  <text class="iconfont icon-vertical_line" :style="{borderColor:navbarData.borderColor ? navbarData.borderColor : 'rgba(0,0,0,0.4)'}"></text>
+			  <text @click="_goDetails" class="iconfont icon-shouye" :style="{width:headerBtnPosi.width/2+'px',height:navbarBtn.height+'px'}"></text>
 	  	</view>
 	</view>
 </template>
@@ -91,10 +90,8 @@
 		        	delta: this.page
 		      	});
 		    },
-		    _goHome: function () {
-		      	uni.switchTab({
-		        	url: '/pages/tabBar/home/home'
-		      	})
+		    _goDetails: function () {
+		      this.$emit('pageDetails')
 		    }
 		},
 		onShow(){

+ 1 - 1
components/cm-module/creatOrder/invoiceTent.vue

@@ -546,7 +546,7 @@
 			width: 702rpx;
 			padding: 24rpx 24rpx 65rpx 24rpx;
 			height: 920rpx;
-			border-radius: 40rpx 40rpx 0 0;
+			border-radius: 20rpx 20rpx 0 0;
 			background-color: #fff;
 			display: flex;
 			flex-wrap: wrap;

+ 1 - 1
components/cm-module/creatOrder/sellerFreight.vue

@@ -372,7 +372,7 @@
 			width: 702rpx;
 			padding: 24rpx 24rpx 36rpx 24rpx;
 			height: 400rpx;
-			border-radius: 40rpx 40rpx 0 0;
+			border-radius: 20rpx 20rpx 0 0;
 			background-color: #fff;
 			display: flex;
 			flex-wrap: wrap;

+ 1 - 1
components/cm-module/creatOrder/sellerInvoice.vue

@@ -546,7 +546,7 @@
 			width: 702rpx;
 			padding: 24rpx 24rpx 65rpx 24rpx;
 			height: 920rpx;
-			border-radius: 40rpx 40rpx 0 0;
+			border-radius: 20rpx 20rpx 0 0;
 			background-color: #fff;
 			display: flex;
 			flex-wrap: wrap;

Datei-Diff unterdrückt, da er zu groß ist
+ 511 - 502
components/cm-module/listTemplate/immediatelyList.vue


+ 1 - 2
components/cm-module/modelAlert/shareAlert.vue

@@ -50,8 +50,7 @@
 			hideConfirm(){
 				this.$parent.isShareModal = false
 			},
-			//点击事件
-			btnConfirm(code){
+			btnConfirm(code){//点击事件
 				this.$emit('btnConfirm')
 			}
 		}

+ 181 - 0
components/cm-module/modelAlert/supplierShareAlert.vue

@@ -0,0 +1,181 @@
+<template name="alert">
+	<view class="alert spec" :class="specClass">
+		<!-- 运费弹窗说明 -->
+		<view class="freight-alert"  @click.stop="hideConfirm">
+			<view class="content clearfix">
+				<view class="text-content">
+					<view class="text-t">分享码</view>
+					<view class="text-c">{{shareCode}} <text class="clipboard" @click.stop="clipboard(shareCode)">复制</text></view>
+					<view class="text-h1">有效期为72小时。如果对方不是您公司的运营人员,需要输入该分享码才能查看本订单</view>
+				</view>
+				<view class="text-btn">
+					<!-- #ifdef MP-WEIXIN -->
+					<button class="btn" open-type="share" @click="btnConfirm(shareCode)">去分享</button>
+					<!-- #endif -->
+					<view class="btn-none" @click.stop="hideConfirm(shareCode)">取消</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	const thorui = require("@/components/clipboard/clipboard.thorui.js")
+	import { queryOrderShareCode } from "@/api/order.js" 
+	export default{
+		name:'alert',
+		props:{
+			shopOrderID:{
+				type:Number
+			}
+		},
+		data() {
+			return{
+				shareCode:'',
+			}
+		},
+		created() {
+			this.getShareCode(this.shopOrderID)
+		},
+		onLoad(){
+			
+		},
+		methods:{
+			getShareCode(data){
+				this.ShopService.ShopOrderShareCode({shopOrderId:data}).then(response =>{
+					this.shareCode = response.data
+					this.$parent.shareCode = this.shareCode;
+				}).catch(error =>{
+					this.$parent.isShareModal = false;
+					this.$util.modal('提示',error.msg,'确定','',false,() =>{})
+				})
+			},
+			clipboard(data) {
+				thorui.getClipboardData(data, (res) => {
+					// #ifdef H5
+					if (res) {
+						this.$util.msg("复制成功",2000);
+					} else {
+						this.$util.msg("复制失败",2000);
+					}
+					// #endif
+				})
+			},
+			hideConfirm(){
+				this.$parent.isShareModal = false
+			},
+			btnConfirm(code){//点击事件
+				this.$emit('btnConfirm')
+			}
+		},
+		onShow(){
+	
+		}
+	}
+</script>
+
+<style lang="scss">
+	/*弹窗*/
+	.model-warp.none{
+		display: none;
+	}
+	.model-warp.show{
+		display: block;
+	}
+	.freight-alert{
+		width: 100%;
+		height: 100%;
+		background: rgba(0,0,0,.5);
+		position: fixed;
+		top: 0;
+		left: 0;
+		z-index: 8888;
+		transition: all 0.4s;
+		&.none{
+			display: none;			
+		}
+		&.show{
+			display: block;
+		}
+		.content{
+			width: 492rpx;
+			height: 666rpx;
+			position: absolute;
+			background: url(https://img.caimei365.com/group1/M00/03/95/Cmis2F76nVaAPs9JAAHGoKa8KvY492.png) no-repeat;
+			background-size: cover;
+			left: 0;
+			right: 0;
+			bottom: 0;
+			top: 0;
+			margin: auto;
+			padding:0 24rpx 20rpx 24rpx;
+			border-radius: 12rpx;
+			.text-content{
+				width: 100%;
+				height: auto;
+				margin-top: 210rpx;
+				.text-t{
+					font-size: $font-size-28;
+					color: $text-color;
+					text-align: center;
+					line-height: 44rpx;
+				}
+				.text-c{
+					font-size: $font-size-44;
+					color: #16E17C;
+					text-align: center;
+					line-height: 80rpx;
+					position: relative;
+					.clipboard{
+						width: 84rpx;
+						height: 36rpx;
+						background: #EFEFEF;
+						text-align: center;
+						font-size: $font-size-24;
+						color: #999999;
+						border-radius: 4rpx;
+						line-height: 36rpx;
+						display: inline-block;
+						position: absolute;
+						top: 29%;
+						right: 18%;
+					}
+				}
+				.text-h1{
+					line-height: 40rpx;
+					font-size: $font-size-28;
+					color: $text-color;
+					text-align: justify;
+				}
+			}
+			.text-btn{
+				width: 100%;
+				height: auto;
+				margin-top: 40rpx;
+				.btn{
+					width: 100%;
+					height: 88rpx;
+					float: left;
+					background: $btn-confirm;
+					line-height: 88rpx;
+					font-size: $font-size-28;
+					text-align: center;
+					color: #FFFFFF;
+					border-radius: 14rpx;
+					padding: 0;
+				}
+				.btn-none{
+					width: 100%;
+					height: 88rpx;
+					float: left;
+					line-height: 88rpx;
+					font-size: $font-size-28;
+					text-align: center;
+					color: #666666;
+					padding: 0;
+				}
+			}
+		}
+	}
+	
+</style>

+ 7 - 0
components/cm-module/orderDetails/goodsList.vue

@@ -19,6 +19,9 @@
 								<view class="view-num">单价:¥{{pros.price.toFixed(2)}}</view>
 								<view class="view-num">数量(赠品):{{pros.num}}({{pros.presentNum}})</view>
 							</view>
+							<view class="product-view" v-if="pros.returnedNum>0 || pros.actualCancelNum>0">
+								<view class="view-num">已退货/已取消:{{pros.returnedNum}}/{{pros.actualCancelNum}}</view>
+							</view>
 							<view class="product-view">
 								<view class="view-num">税率:{{pros.taxRate}}%</view>
 								<view class="view-num">折扣:{{pros.discount == null ? '0' : pros.discount}}%</view>
@@ -109,6 +112,10 @@
 					}
 				}
 				.title-text{
+					width: 630rpx;
+					overflow: hidden;
+					text-overflow:ellipsis;
+					white-space: nowrap;
 					float: left;
 					margin-left: 16rpx;
 					font-size: $font-size-28;

+ 199 - 0
components/cm-module/orderDetails/supplierDetaileButton.vue

@@ -0,0 +1,199 @@
+<template name="button">
+	<view class="button-template" :style="{paddingBottom :isIphoneX ? '68rpx' : '0rpx'}">
+		<!-- 底部按钮 -->
+		<view class="btn btn-color" @click.stop="onShareCode">
+			<view class="tips" v-if="shareCode">分享码:{{shareCode}}</view>
+			分享订单
+		</view>	
+		<view class="btn btn-color" @click.stop="btnConfirm('record')">发货记录</view>
+		<view class="btn btn-color" v-if="btnState.isDeliver"  @click.stop="btnConfirm('deliver')">发货</view>
+	</view>
+</template>
+
+<script>
+	export default{
+		name:"button",
+		props:{
+			status:{
+				type:Number
+			},
+			shareCode:{
+				type:String,
+				default: ''
+			}
+		},
+		watch:{
+			status:{
+				handler:function(val){
+					this.initData(val)
+				},
+				deep:true//对象内部的属性监听,也叫深度监听
+			}
+		},
+		data() {
+			return{
+				btnState:this.initStatus(),
+				isIphoneX:this.$store.state.isIphoneX,
+				mapStateArr:[
+					{label:'isDeliver',val:[1,2],status: true},
+				]
+			}
+		},
+		created(){
+			this.initData(this.status)
+		},
+		computed: {
+
+		},
+		methods:{
+			initData(resVal) {
+				/**
+				 * @分享按钮统一显示
+				 * @按钮根据状态显示
+				 * @(1,2)显示[发货]按钮
+				 */
+				this.btnState = this.initStatus()
+				this.mapStateArr.forEach(el => {
+					el.val.forEach(value => {
+						if(resVal === value){
+							this.btnState[el.label] = el.status
+							//console.log(this.btnState[el.label]);
+						}
+					})
+				})
+			},
+			initStatus(){
+				let btnState= {
+						isQuery: false,
+						isDelete: false,
+						isCancel: false,
+						isConfirm: false,
+					}
+				return 	btnState
+			},
+			getShareCode(code){
+				this.shareCode = code
+			},
+			onShareCode(){
+				this.$parent.isShareModal = true
+				this.$emit('shareConfirm')
+			},
+			btnConfirm(type){
+				this.$emit('buttonConfirm',type)
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.button-template{
+		width: 702rpx;
+		padding:0 24rpx;
+		height: auto;
+		background-color: #FFF;
+		-webkit-box-shadow: 0px 3px 10px rgba(51, 51, 51, 0.5);
+		box-shadow: 0px 3px 10px rgba(51, 51, 51, 0.5);
+		padding-bottom: 24rpx;
+		z-index: 999;
+		.share-code{
+			width: 200rpx;
+			height:  64rpx;
+			line-height: 64rpx;
+			color: #2A45FF;
+			text-align: left;
+			position: absolute;
+			font-size: $font-size-28;
+			font-weight: bold;
+			left: 24rpx;
+			top: 24rpx;
+		}
+		.btn{
+			width: 160rpx;
+			height:  64rpx;
+			margin:22rpx;
+			line-height: 64rpx;
+			font-size:$font-size-26;
+			color: #FFFFFF;
+			text-align: center;
+			border-radius: 10rpx;
+			float: right;
+		}
+		.btn-color{
+			background: $btn-confirm;
+			margin: 22rpx 0 22rpx 22rpx;
+			.tips{
+				width: 160rpx;
+				height: 34rpx;
+				padding: 10rpx 10rpx;
+				background:linear-gradient(45deg,rgba(0,0,0,1) 0%,rgba(87,87,87,1) 100%);
+				box-shadow:0px 2px 4px 0px rgba(0,0,0,0.2);
+				border-radius: 8rpx;
+				position: absolute;
+				color: #FFFFFF;
+				line-height: 34rpx;
+				font-size: $font-size-24;
+				text-align: left;
+				right: 24rpx;
+				top: -45rpx;
+				&:before{
+					content: "";
+					width: 25rpx;
+					height: 25rpx;
+					background:linear-gradient(45deg,rgba(0,0,0,1) 0%,rgba(87,87,87,1) 100%);
+					position: absolute;
+					bottom: -8rpx;
+					right: 30rpx;
+					z-index: -1;
+					transform:rotate(45deg);
+				}
+			}
+		}
+		.btn-cancel{
+			background:#FFFFFF;
+			color: #999999;
+			float: left;
+			margin: 22rpx 0;
+			text-align: left;
+		}
+		.btn-delete{
+			background:linear-gradient(315deg,rgba(255,163,3,1) 0%,rgba(255,53,1,1) 100%);
+		}
+		.btn-query{
+			background:linear-gradient(135deg,rgba(255,212,129,1) 0%,rgba(198,129,0,1) 100%);
+		}
+		.btn-confirm{
+			background:linear-gradient(315deg,rgba(231,0,0,1) 0%,rgba(255,104,1,1) 100%);
+		}
+		.btn-share{
+			background:linear-gradient(315deg,rgba(0,212,150,1) 0%,rgba(126,243,174,1) 100%);
+			margin-right: 0;
+			position: relative;
+			.tips{
+				width: 160rpx;
+				height: 34rpx;
+				padding: 10rpx 10rpx;
+				background:linear-gradient(45deg,rgba(0,0,0,1) 0%,rgba(87,87,87,1) 100%);
+				box-shadow:0px 2px 4px 0px rgba(0,0,0,0.2);
+				border-radius: 8rpx;
+				position: absolute;
+				color: #FFFFFF;
+				line-height: 34rpx;
+				font-size: $font-size-24;
+				text-align: left;
+				right: 0;
+				top: -65rpx;
+				&:before{
+					content: "";
+					width: 25rpx;
+					height: 25rpx;
+					background:linear-gradient(45deg,rgba(0,0,0,1) 0%,rgba(87,87,87,1) 100%);
+					position: absolute;
+					bottom: -8rpx;
+					right: 30rpx;
+					z-index: -1;
+					transform:rotate(45deg);
+				}
+			}
+		}
+	}
+</style>

+ 127 - 0
components/cm-module/orderDetails/supplierRecorgButton.vue

@@ -0,0 +1,127 @@
+<template name="button">
+	<view class="button-template">
+		<!-- 底部按钮 -->
+		<view class="button-content">
+			<view class="btn btn-color" v-if="hanldData.mailer == '1'" @click.stop="btnConfirm('cancel',hanldData)">撤销发货</view>
+			<view class="btn btn-color" @click.stop="btnConfirm('add',hanldData)">添加物流</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default{
+		name:"button",
+		props:{
+			hanldData: {
+				type:Object
+			}
+		},
+		data() {
+			return{
+
+			}
+		},
+		created(){
+			
+		},
+		computed: {
+			
+		},
+		methods:{
+			btnConfirm(type,hanldData){
+				let data = { hanldType:type,hanldData:hanldData }
+				this.$emit('buttonConfirm',data)
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.button-template{
+		width: 100%;
+		height: auto;
+		float: left;
+		background: #FFFFFF;
+		.button-content{
+			width: 702rpx;
+			padding: 0 24rpx;
+			height: auto;
+			float: left;
+			position: relative;
+			.share-code{
+				width: 200rpx;
+				height:  64rpx;
+				line-height: 64rpx;
+				color: #2A45FF;
+				text-align: left;
+				position: absolute;
+				font-size: $font-size-28;
+				font-weight: bold;
+				left: 24rpx;
+				top: 24rpx;
+			}
+			.btn{
+				width: 160rpx;
+				height:  64rpx;
+				margin:22rpx;
+				line-height: 64rpx;
+				font-size:$font-size-26;
+				color: #FFFFFF;
+				text-align: center;
+				border-radius: 10rpx;
+				float: right;
+			}
+			.btn-color{
+				background: $btn-confirm;
+				margin: 22rpx 0 22rpx 22rpx;
+			}
+			.btn-cancel{
+				background:#FFFFFF;
+				color: #999999;
+				float: left;
+				margin: 22rpx 0;
+				text-align: left;
+			}
+			.btn-delete{
+				background:linear-gradient(315deg,rgba(255,163,3,1) 0%,rgba(255,53,1,1) 100%);
+			}
+			.btn-query{
+				background:linear-gradient(135deg,rgba(255,212,129,1) 0%,rgba(198,129,0,1) 100%);
+			}
+			.btn-confirm{
+				background:linear-gradient(315deg,rgba(231,0,0,1) 0%,rgba(255,104,1,1) 100%);
+			}
+			.btn-share{
+				background:linear-gradient(315deg,rgba(0,212,150,1) 0%,rgba(126,243,174,1) 100%);
+				margin-right: 0;
+				position: relative;
+				.tips{
+					width: 160rpx;
+					height: 34rpx;
+					padding: 10rpx 10rpx;
+					background:linear-gradient(45deg,rgba(0,0,0,1) 0%,rgba(87,87,87,1) 100%);
+					box-shadow:0px 2px 4px 0px rgba(0,0,0,0.2);
+					border-radius: 8rpx;
+					position: absolute;
+					color: #FFFFFF;
+					line-height: 34rpx;
+					font-size: $font-size-24;
+					text-align: left;
+					right: 0;
+					top: -65rpx;
+					&:before{
+						content: "";
+						width: 25rpx;
+						height: 25rpx;
+						background:linear-gradient(45deg,rgba(0,0,0,1) 0%,rgba(87,87,87,1) 100%);
+						position: absolute;
+						bottom: -8rpx;
+						right: 30rpx;
+						z-index: -1;
+						transform:rotate(45deg);
+					}
+				}
+			}
+		}
+	}
+</style>

+ 1 - 1
components/cm-module/popupGoods/popupGoods.vue

@@ -157,7 +157,7 @@
 		width: 702rpx;
 		padding: 24rpx 24rpx 10rpx 24rpx;
 		height: 236rpx;
-		border-radius: 30rpx 30rpx 0 0;
+		border-radius: 20rpx 20rpx 0 0;
 		background-color: #fff;
 		display: flex;
 		flex-wrap: wrap;

+ 1 - 0
components/cm-module/productDetails/cm-attributes.vue

@@ -18,6 +18,7 @@
 			</view>
 			<view class="info-viewT" :class="goodsData.isNoneDisabled ? 'none' : ''" v-if="product.productCode!=''&&product.productCode!=null">
 				<view class="info-viewL tui-skeleton-fillet">商品编码:<text>{{product.productCode}}</text></view>
+				<view class="info-viewR tui-skeleton-fillet">库存:<text>{{product.stock}}</text></view>
 			</view>
 		</view>
 		<view class="wrap-seve" :class="goodsData.isNoneDisabled ? 'none' : ''">

+ 103 - 0
components/cm-module/productDetails/cm-parameter.vue

@@ -0,0 +1,103 @@
+<template name="cm-parameter">
+	<!-- 相关参数 -->
+	<view class="cm-parameter">
+		<view class="cm-parameter-main clearfix">
+			<view class="item-tabody clearfix" v-for="(item, index) in product.parametersList" :key="index" >
+				<view class="item-td">{{item.paramsName}}</view>
+				<view class="item-tr">{{item.paramsContent}}</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default{
+		name:'cm-parameter',
+		props:{
+			product:{
+				type:Object,
+			}
+		},
+		data() {
+			return{
+				data:[]
+			}
+		},
+		created() {
+			
+		},
+		methods:{
+			
+		},
+		
+	}
+</script>
+
+<style lang="scss">
+	.cm-parameter{
+		width: 702rpx;
+		height: auto;
+		background: #FFF;
+		margin: 0 auto;
+		padding: 24rpx 0;
+		.cm-parameter-main{
+			display: flex;
+			flex: 1;
+			flex-direction: column;
+			background-color: #FFFFFF;
+			border: 1px solid #EFEFEF;
+			border-radius: 4rpx;
+			.item-tabody{
+				width: 100%;
+				height: auto;
+				border-bottom: 1px solid #EFEFEF;
+				font-size: $font-size-24;
+				display: flex;
+				flex-wrap: wrap;
+				.item-td{
+					width: 238rpx;
+					float: left;
+					border-right: 1px solid #EFEFEF;
+					color: #999999;
+					padding:20rpx;
+					display: flex;
+					flex: 3;
+					flex-direction: column;
+				}
+				.item-tr{
+					width: 462rpx;
+					float: left;
+					color: $text-color;
+					padding:20rpx;
+					display: flex;
+					flex: 7;
+					flex-direction: column;
+				}
+				&:last-child{
+					border-bottom: none;
+				}
+			}
+		}
+	}
+</style>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+ 0 - 16
components/cm-module/productDetails/cm-price.vue

@@ -15,10 +15,6 @@
 					<view class="p-minBuy">起订量:<text class="min-text">{{minBuyNumber}}</text></view>
 				</view>
 				<view class="wrap-ladder" v-else>
-					<view class="ladder-text">
-						<text class="ladder-h1">说明:</text>
-						<text class="ladder-p">本商品有以下优惠购物方案</text>
-					</view>
 					<view class="ladder-main tui-skeleton-fillet">
 						<view class="ladder-left">
 							<view class="ladder-b">起订量:</view>
@@ -55,10 +51,6 @@
 					<view class="p-minBuy">起订量:<text class="min-text">{{minBuyNumber}}</text></view>
 				</view>
 				<view class="wrap-ladder" v-else>
-					<view class="ladder-text">
-						<text class="ladder-h1">说明:</text>
-						<text class="ladder-p">本商品有以下优惠购物方案</text>
-					</view>
 					<view class="ladder-main tui-skeleton-fillet">
 						<view class="ladder-left">
 							<view class="ladder-b">起订量:</view>
@@ -91,10 +83,6 @@
 					<view class="p-minBuy">起订量:<text class="min-text">{{minBuyNumber}}</text></view>
 				</view>
 				<view class="wrap-ladder" v-else>
-					<view class="ladder-text">
-						<text class="ladder-h1">说明:</text>
-						<text class="ladder-p">本商品有以下优惠购物方案</text>
-					</view>
 					<view class="ladder-main tui-skeleton-fillet">
 						<view class="ladder-left">
 							<view class="ladder-b">起订量:</view>
@@ -120,7 +108,6 @@
 		props:{
 			product:{
 				type:Object,
-				default: {}
 			},
 			userIdentity: {
 				type: Number,
@@ -128,15 +115,12 @@
 			},
 			ladderPriceList:{
 				type: Array,
-				default:[]
 			},
 			retailPrice:{
 				type:String,
-				default:0.00
 			},
 			smallMoney:{
 				type:String,
-				default:0.00
 			},
 			minBuyNumber:{
 				type: Number,

+ 84 - 0
components/cm-module/productDetails/cm-service.vue

@@ -0,0 +1,84 @@
+<template name="cm-service">
+	<!-- 服务项目 -->
+	<view class="cm-service">
+		<view class="cm-service-text" v-show="product.orderInfo">
+			<view class="cm-service-title">订购方案</view>
+			<view class="cm-service-p" v-html="product.orderInfo"></view>
+		</view>
+		<view class="cm-service-text" v-show="product.serviceInfo">
+			<view class="cm-service-title">服务详情</view>
+			<view class="cm-service-p" v-html="product.serviceInfo"></view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default{
+		name:'cm-service',
+		props:{
+			product:{
+				type:Object,
+			}
+		},
+		data() {
+			return{
+				
+			}
+		},
+		created() {
+			
+		},
+		methods:{
+		},
+		
+	}
+</script>
+
+<style lang="scss">	
+	.cm-service{
+		width: 702rpx;
+		height: auto;
+		background: #FFF;
+		margin: 0 auto;
+		padding: 24rpx 0;
+		.cm-service-text{
+			width: 100%;
+			height: auto;
+			margin-bottom: 24rpx;
+			.cm-service-title{
+				font-size: $font-size-28;
+				color: #333;
+				text-align: left;
+				line-height: 44rpx;
+				margin-bottom: 8rpx;
+			}
+			.cm-service-p{
+				font-size: $font-size-28;
+				color: #999;
+				text-align: justify;
+				line-height: 44rpx;
+			}
+		}
+	}
+</style>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+ 80 - 43
components/cm-module/productDetails/supplierDetails.vue

@@ -11,15 +11,21 @@
 		</view>
 		<view class="sup-msg massage-t">
 			<view class="sup-h1">
-				<text class="line">基本信息</text>
+				<text class="line">公司基本信息</text>
 			</view>
 			<view class="sup-title">
 				<text class="tit-l">公司名称:</text>
 				<text >{{shop.name}}</text>
 			</view>
+			<view class="sup-stars">
+				<text class="tit-l">满意度:</text>
+				<view class="p-stars">
+					<uni-stars :stars="6" :iconClass="iconClass" :iconColor="iconColor" :fontSize="44" :widthInfo="180"></uni-stars>
+				</view>
+			</view>
 			<view class="sup-conte">
 				<view class="conte-l">
-					<text class="tit-l">经营品项:</text>
+					<text class="tit-l">经营范围:</text>
 				</view>
 				<view class="conte-r" v-if="shop.businessScopeArray.length>0">
 					<text class="age" v-for="(item,idx) in shop.businessScopeArray" :key="idx">{{item}}</text>
@@ -39,7 +45,7 @@
 		</view>
 		<view class="sup-msg massage-t">
 			<view class="sup-h1">
-				<text class="line">主打系列产品介绍</text>
+				<text class="line">主打系列产品说明</text>
 			</view>
 			<view class="sup-p" :class="[shop.productDesc == null ? 'center' : '']">
 				{{shop.productDesc == null ? '暂无内容' : shop.productDesc}}
@@ -50,7 +56,7 @@
 				<text class="line">营业执照</text>
 			</view>
 			<view class="sup-img">
-				<image :src="shop.businessLicenseImage" mode=""></image>
+				<image :src="shop.businessLicenseImage" mode="aspectFill" @click="previewImg(shop.businessLicenseImage)"></image>
 			</view>
 		</view>
 		<view class="sup-msg massage-t" v-if="shop.medicalPracticeLicenseImg1!=null">
@@ -58,21 +64,34 @@
 				<text class="line">公司资质</text>
 			</view>
 			<view class="sup-imgList clearfix">
-				<view class="img"><image :src="shop.medicalPracticeLicenseImg1" mode=""></image></view>
-				<view class="img"><image :src="shop.medicalPracticeLicenseImg2" mode=""></image></view>
-				<view class="img"><image :src="shop.medicalPracticeLicenseImg3" mode=""></image></view>
+				<view class="img"><image :src="shop.medicalPracticeLicenseImg1" mode="" @click="previewImg(shop.medicalPracticeLicenseImg1)"></image></view>
+				<view class="img"><image :src="shop.medicalPracticeLicenseImg2" mode="" @click="previewImg(shop.medicalPracticeLicenseImg2)"></image></view>
+				<view class="img"><image :src="shop.medicalPracticeLicenseImg3" mode="" @click="previewImg(shop.medicalPracticeLicenseImg3)"></image></view>
+			</view>
+		</view>
+		<view class="sup-msg massage-t" v-if="shop.authorizationCertificateImage!=null">
+			<view class="sup-h1">
+				<text class="line">授权牌照</text>
+			</view>
+			<view class="sup-img">
+				<image :src="shop.authorizationCertificateImage" mode="aspectFill" @click="previewImg(shop.authorizationCertificateImage)"></image>
 			</view>
 		</view>
 	</view>
 </template>
 
 <script>
+	import uniStars from '@/components/uni-stars/uni-stars.vue'
 	export default{
 		name:'supplier',
+		components:{
+			uniStars
+		},
 		props:['shop'],
 		data() {
 			return{
-				
+				iconClass:'icon-xingxing',
+				iconColor:'#FF9100'
 			}
 		},
 		created() {
@@ -82,7 +101,14 @@
 
 		},
 		methods:{
-			
+			previewImg(url){
+				let mentuzArray = []
+				mentuzArray.push(url)
+				uni.previewImage({
+					urls: mentuzArray,
+					current: 0
+				});
+			}
 		},
 		onShow(){
 	
@@ -92,38 +118,30 @@
 
 <style lang="scss">	
 .supplier{
-	background: #F7F7F7;
+	background: #FFFFFF;
 	width: 100%;
 	.sup-msg{
 		width: 100%;
 		padding: 24rpx 0;				
 		.sup-h1{
-			height: 42rpx;
-			line-height: 42rpx;
+			height: 80rpx;
+			line-height: 80rpx;
 			font-size: $font-size-30;
 			color: $text-color;
-			text-align: center;
-			font-weight: bold;
+			text-align: left;
+			border-bottom: 1px solid #EFEFEF;
 			.line{
 				position: relative;
+				padding-left: 15rpx;
 				&:after{
 					content: '';
-					width: 96rpx;
-					height: 2rpx;
-					background: #EAEAEA;
+					width: 6rpx;
+					height: 28rpx;
+					background: #FFA347;
 					position: absolute;
-					left: -130rpx;
-					top: 50%;
+					left: 0;
+					top: 6rpx;
 				}						
-				&:before{
-					content: '';
-					width: 96rpx;
-					height: 2rpx;
-					background: #EAEAEA;
-					position: absolute;
-					right: -130rpx;
-					top: 50%;
-				}
 			}
 		}
 	}
@@ -132,7 +150,6 @@
 		width: 702rpx;
 		padding: 28rpx 24rpx 24rpx 24rpx;
 		display: flex;
-		margin-bottom: 24rpx;
 		background: #FFFFFF;
 		.header-img{
 			width: 216rpx;
@@ -144,10 +161,11 @@
 		}
 		.header-txt{
 			width:460rpx;
+			display: flex;
+			align-items: center;
 			text{
-				display: inline-block;
-				padding-top: 82rpx;
-				height: 80rpx;
+				display: flex;
+				flex: 1;
 				margin-left: 26rpx;
 				line-height: 40rpx;
 				-o-text-overflow: ellipsis;
@@ -166,9 +184,8 @@
 	}
 	.massage-t{
 		width: 702rpx;
-		padding:24rpx;
+		padding:0 24rpx;
 		height: auto;
-		margin-bottom: 24rpx;
 		background: #FFFFFF;
 		.sup-title{
 			width: 100%;
@@ -181,17 +198,35 @@
 			color: $text-color;
 			.tit-l{
 				width: 142rpx;
-				margin-right:20rpx;
 				display: inline-block;
 			}
 		}
+		.sup-stars{
+			width: 100%;
+			height: 40rpx;
+			margin-top: 24rpx;
+			text-align: left;
+			display: inline-block;						
+			line-height: 40rpx;
+			font-size: $font-size-28;
+			color: $text-color;
+			.tit-l{
+				width: 114rpx;
+				display: inline-block;
+				text-align: right;
+				float: left;
+			}
+			.p-stars{
+				float: left;
+				margin-left: 22rpx;
+			}
+		}
 		.sup-conte{
 			width: 100%;
 			margin-top: 24rpx;
 			display: flex;
 			.conte-l{
 				width: 142rpx;
-				margin-right:20rpx;
 				.tit-l{
 					text-align: left;
 					display: inline-block;						
@@ -205,13 +240,13 @@
 				.age{
 					display: inline-block;
 					padding: 0 20rpx;
-					background: #F8C499;
-					height: 40rpx;
-					line-height: 40rpx;
+					background: #FFF6E6;
+					height: 42rpx;
+					line-height: 42rpx;
 					text-align: center;
 					font-size: $font-size-24;
-					color: $text-color;
-					border-radius: 20rpx;
+					color: #666666;
+					border-radius: 6rpx;
 					margin-right: 24rpx;
 					margin-bottom: 24rpx;
 				}
@@ -226,8 +261,8 @@
 			padding: 24rpx 0;
 			line-height: 40rpx;
 			text-align: left;
-			font-size: $font-size-24;
-			color: $text-color;
+			font-size: $font-size-28;
+			color: #666666;
 			text-indent: 20rpx;
 			&.center{
 				text-align: center;
@@ -240,6 +275,7 @@
 			image{
 				width: 100%;
 				height: 100%;
+				display: block;
 			}
 		}
 		.sup-imgList{
@@ -258,6 +294,7 @@
 				image{
 					width: 100%;
 					height: 100%;
+					display: block;
 				}
 			}
 		}

+ 1 - 0
main.js

@@ -1,6 +1,7 @@
 import Vue from 'vue'
 import store from './store'
 import App from './App'
+import './services/index.js'
 import * as Api from '@/common/config/caimeiApi.js'
 import * as Regs from '@/common/config/common.js'
 import { msg, modal,json,prePage } from'./utils/util'

+ 65 - 1
pages.json

@@ -71,6 +71,11 @@
 				"navigationBarTitleText": "商品详情",
 				"navigationStyle":"custom"
 			}
+		},{
+			"path": "pages/goods/supplier",
+			"style": {
+				"navigationBarTitleText": "供应商信息"
+			}
 		},{
 			"path": "pages/goods/cart",
 			"style": {
@@ -408,7 +413,66 @@
 					}
 				}
 			]	
-		}			
+		},
+		{
+			"root": "supplier",
+			"pages": [
+				{
+					"path": "pages/login/bind-operator",
+					"style": {
+						"navigationBarTitleText": "绑定微信"
+					}
+				},{
+					"path": "pages/login/share-login",
+					"style": {
+						"navigationBarTitleText": "查看订单"
+					}
+				},{
+					"path": "pages/login/share-info",
+					"style": {
+						"navigationBarTitleText": "订单详情",
+						"navigationStyle":"custom"
+					}
+				},{
+					"path": "pages/order/order-details",
+					"style": {
+						"navigationBarTitleText": "订单详情",
+						"enablePullDownRefresh":true,
+						"navigationStyle":"custom"
+					}
+				},{
+					"path": "pages/order/order-service-details",
+					"style": {
+						"navigationBarTitleText": "订单详情",
+						"navigationStyle":"custom",
+						"enablePullDownRefresh":true
+					}
+				},{
+					"path": "pages/deliver/add-logistics",
+					"style": {
+						"navigationBarTitleText": "录入物流信息"
+					}
+				},{
+					"path": "pages/deliver/deliver-goods",
+					"style": {
+						"navigationBarTitleText": "发货",
+						"enablePullDownRefresh":true
+					}
+				},{
+					"path": "pages/deliver/deliver-record",
+					"style": {
+						"navigationBarTitleText": "发货记录",
+						"enablePullDownRefresh":true,
+						"navigationStyle":"custom"
+					}
+				},{
+					"path": "pages/deliver/logistics-list",
+					"style": {
+						"navigationBarTitleText": "物流公司"
+					}
+				}
+			]	
+		}	
 	],
 	"tabBar": {
 		"height":"80",

+ 3 - 1
pages/authorization/authorization.vue

@@ -37,7 +37,9 @@
 		},
 		onLoad(e) {
 			this.authorizeType = e.type
-			console.log(e)
+			if(this.authorizeType == '4'){
+				this.nvabarData.haveBack = false
+			}
 		},
 		computed: {
 			...mapState(['hasLogin','userInfo'])

+ 66 - 23
pages/goods/cart.vue

@@ -40,9 +40,11 @@
 													{{pros.retailPrice?pros.retailPrice.toFixed(2):''}}
 												</view>
 												<view class="count" v-if="pros.validFlag == '2'"  :class="[isshowDelbtn ? 'none':'show']">
+													<text class="count-tips" v-if="pros.productCount<pros.minBuyNumber">起订量:{{pros.minBuyNumber}}</text>
+													<text class="count-tips step" v-if="pros.isStep">购买量必须为起订量的整数倍</text>
 													<view class="number-box">
 														<view  class="iconfont icon-jianhao" :class="[pros.validFlag == '3'?'disabled':'']" @click="changeCountSub(item,pros)"></view>
-														<input class="btn-input" type="number" maxlength='4' v-model="pros.productCount" @blur="changeNnmber($event,item,pros)">
+														<input class="btn-input" type="number" maxlength='4' v-model="pros.productCount" @blur="changeNnmber($event,item,pros)" @focus="changeInput(pros)">
 														<view  class="iconfont icon-jiahao"  :class="[pros.validFlag == '3'?'disabled':'']" @click="changeCountAdd(item,pros)"></view>
 													</view>
 												</view>
@@ -162,6 +164,7 @@
 				skeletonShow:true,
 				isshowDelbtn:false,
 				isDisabled: false, // 供应商/店铺全选是否禁用状态
+				isNoConfim:false,
 				isEmpty:false,//显示空购物车
 				scrollHeight: 'auto',
 				nomoreText: '上拉显示更多',
@@ -235,7 +238,15 @@
 								invalidLength = 0;
 							item.productsList.forEach(pros => {
 								pros.shopID = item.shopID;
+								pros.isStep = false
 								if(pros.validFlag == '3' ) {invalidLength++;}
+								if(pros.step === 2){
+									if(pros.productCount % pros.minBuyNumber != 0){
+										pros.productCount = pros.minBuyNumber
+										this.totalShopPeice()
+										this.updateShoppogNum(pros)
+									}
+								}
 							})
 							item.isDisabled = invalidLength === productsListLength;
 						})
@@ -267,6 +278,23 @@
 					let resultsData = response.data.pageDate
 					this.hasNextPage = resultsData.hasNextPage;
 					this.goodsList = this.goodsList.concat(resultsData.results)
+					this.goodsList.forEach((item,index) => {
+						let productsListLength = item.productsList.length,
+							invalidLength = 0;
+						item.productsList.forEach(pros => {
+							pros.shopID = item.shopID;
+							pros.isStep = false
+							if(pros.validFlag == '3' ) {invalidLength++;}
+							if(pros.step === 2){
+								if(pros.productCount % pros.minBuyNumber != 0){
+									pros.productCount = pros.minBuyNumber
+									this.totalShopPeice()
+									this.updateShoppogNum(pros)
+								}
+							}
+						})
+						item.isDisabled = invalidLength === productsListLength;
+					})
 					this.pullFlag = false;// 防上拉暴滑
 					setTimeout(()=>{this.pullFlag = true;},500)
 					if(this.hasNextPage){
@@ -442,14 +470,14 @@
 			    })
 			},		
 			changeCountAdd(item,pros){//商品数量加加
-				if(pros.productCount>=pros.stock){
-					pros.productCount= pros.stock
-					this.isStock =true
-					return
+				if(pros.step === 2){
+					pros.productCount += pros.minBuyNumber
+					this.processActivityPrice(pros)
+					this.isStock = false
 				}else{
 					pros.productCount++
 					this.processActivityPrice(pros)
-					this.isStock =false
+					this.isStock = false
 				}
 				this.updateShoppogNum(pros)
 				this.totalShopPeice();
@@ -460,12 +488,19 @@
 					this.$util.msg(`该商品最小起订量为${pros.minBuyNumber}`,2000);
 					return
 				}else{
-					pros.productCount--
+					if(pros.step === 2){
+						pros.productCount -= pros.minBuyNumber
+					}else{
+						pros.productCount--
+					}
 					this.processActivityPrice(pros)
 				}
 				this.updateShoppogNum(pros)
 				this.totalShopPeice();
 			},
+			changeInput(pros){//输入商品数量更新
+				pros.isStep = false
+			},
 			changeNnmber(e,item,pros){//输入商品数量更新
 				let _value = e.detail.value;
 				if(!this.$api.isNumber(_value)){
@@ -473,7 +508,11 @@
 				}else if(_value < pros.minBuyNumber){	
 					this.$util.msg(`该商品最小起订量为${pros.minBuyNumber}`,2000);
 					pros.productCount = pros.minBuyNumber
+				}else if(_value % pros.minBuyNumber != 0){
+					pros.isStep = true
+					pros.productCount = pros.minBuyNumber
 				}else{
+					pros.isStep = false
 					pros.productCount = e.detail.value
 					this.processActivityPrice(pros)
 				}
@@ -528,23 +567,22 @@
 					if(this.isNoConfim){
 						this.$util.modal('','有商品的购买量没达到最小起订量,请修改数量后再次提交结算','去修改','',false,() =>{})
 						return;
-					}else{
-						let productID = '';
-						this.goodsList.forEach(el=>{//获取勾选的商品ID拼接字符串逗号隔开,最后一个逗号去掉
-							el.productsList.forEach(pros=>{
-								if(pros.productsChecked){
-								   productID += pros.productID+','
-								}
-							})
-						})
-						let cartPramsData={
-								allPrice:this.allPrice,
-								allCount:this.allCount,
-								productID:productID.substring(0,productID.lastIndexOf(',')),
-								productCount:''
-						    }
-						this.$api.navigateTo(`/pages/user/order/create-order?data=${JSON.stringify({data:cartPramsData})}`)
 					}
+					let productID = '';
+					this.goodsList.forEach(el=>{//获取勾选的商品ID拼接字符串逗号隔开,最后一个逗号去掉
+						el.productsList.forEach(pros=>{
+							if(pros.productsChecked){
+							   productID += pros.productID+','
+							}
+						})
+					})
+					let cartPramsData={
+							allPrice:this.allPrice,
+							allCount:this.allCount,
+							productID:productID.substring(0,productID.lastIndexOf(',')),
+							productCount:''
+						}
+					this.$api.navigateTo(`/pages/user/order/create-order?data=${JSON.stringify({data:cartPramsData})}`)
 				}
 			},
 			showDelManager(){//显示删除商品管理
@@ -808,6 +846,11 @@
 				padding: 10rpx;
 			}
 			.text{
+				display: block;
+				overflow: hidden;
+				text-overflow:ellipsis;
+				white-space: nowrap;
+				text-align: right;
 				margin-left: 37rpx;
 				font-size: $font-size-28;
 				color: $text-color;

+ 129 - 38
pages/goods/product.vue

@@ -59,34 +59,55 @@
 					</view>
 				</view>			
 			</view>
+			<view class="product-supplier" @click="goSupplier">
+				<text class="title">供应商信息</text>
+				<text class="name">{{shop.name}}</text>
+				<text class="iconfont icon-xiayibu"></text>
+			</view>
 			<view class="product-details">
 				<!-- 头部 -->
-				<view  v-if="goodsData.isNoneDisabled" class="navbar" :class="navbarFiexd"
-					 :style="{top:headerBtnPosi.bottom + (headerBtnPosi.bottom - headerBtnPosi.height - systeminfo.statusBarHeight) +'px'}">
-					<view class="nav-item tui-skeleton-fillet" v-for="(item,index) in  disabledTabNavList" :key="index" :class="{ current: tabCurrentIndex === index+2 }" @click="tabClick(index+2)">
+				<view  v-if="goodsData.isNoneDisabled" class="navbar" :class="navbarFiexd" :style="{top:headerBtnPosi.bottom + (headerBtnPosi.bottom - headerBtnPosi.height - systeminfo.statusBarHeight) +'px'}">
+					<view class="nav-item tui-skeleton-fillet" v-for="(item,index) in  disabledTabNavList" :key="index" :class="{ current: tabCurrentIndex === index }" @click="tabClick(index+2)">
 						<text class="line"></text>
 						<text>{{item.name}}</text>
 					</view>					
 				</view>
-				<view v-else class="navbar" :class="navbarFiexd" 
-					 :style="{top:headerBtnPosi.bottom + (headerBtnPosi.bottom - headerBtnPosi.height - systeminfo.statusBarHeight) +'px'}">
-					<view class="nav-item tui-skeleton-fillet" v-for="(item,index) in  tabNavList" :key="index" :class="{ current: tabCurrentIndex === index }" @click="tabClick(index)">
+				<view v-else class="navbar" :class="navbarFiexd" :style="{top:headerBtnPosi.bottom + (headerBtnPosi.bottom - headerBtnPosi.height - systeminfo.statusBarHeight) +'px'}">
+					<view class="nav-item tui-skeleton-fillet" :class="{ current: tabCurrentIndex === 0 }" @click="tabClick(0)">
+						<text>商品详情</text>
 						<text class="line"></text>
-						<text>{{item.name}}</text>
-					</view>					
+					</view>
+					<view class="nav-item tui-skeleton-fillet" 
+						  :class="{ current: tabCurrentIndex === 1 }" 
+						  @click="tabClick(1)" 
+						  v-if="product.parametersList != ''">
+							<text>相关参数</text>
+							<text class="line"></text>
+					</view>	
+					<view class="nav-item tui-skeleton-fillet" 
+					      :class="{ current: tabCurrentIndex === 2 }" 
+						  @click="tabClick(2)" 
+						  v-if="product.productDetail.orderInfo || product.productDetail.serviceInfo">
+							<text>服务项目</text>
+							<text class="line"></text>
+					</view>	
+					<view class="nav-item tui-skeleton-fillet" :class="{ current: tabCurrentIndex === 3 }" @click="tabClick(3)">
+						<text>相关推荐</text>
+						<text class="line"></text>
+					</view>	
 				</view>
-				<!-- 商品详情,供应商详情展示,相关推荐,评价-->
+				<!-- 商品详情,相关参数,服务项目,相关推荐-->
 				<view class="content tui-banner tui-skeleton-rect" v-if="tabCurrentIndex === 0">
 					<parser :html="html" :img-mode="widthFix"></parser>
 				</view>
-				<view class="content sup" v-if="tabCurrentIndex === 1">
-					<supplier-details :shop="shop"></supplier-details>
+				<view class="content param"  v-if="tabCurrentIndex === 1">
+					<cm-parameter :product="product" v-if="isRarameter"></cm-parameter>
 				</view>
-				<view class="content hot" v-if="tabCurrentIndex === 2">
-					<recommend :query-productid="product.productID" v-if="isRecommend"></recommend>
+				<view class="content service" v-if="tabCurrentIndex === 2">
+					<cm-service :product="product.productDetail" v-if="isService"></cm-service>
 				</view>
 				<view class="content hot" v-if="tabCurrentIndex === 3">
-					<evaluate :query-productid ="product.productID" v-if="isEvaluate"></evaluate>
+					<recommend :query-productid="product.productID" v-if="isRecommend"></recommend>
 				</view>
 			</view>
 			<!-- 底部按钮 -->
@@ -134,12 +155,15 @@
 			<view class="popup spec" :class="specClass"  @touchmove.stop.prevent="discard" @tap="hideSpec">
 				<!-- 遮罩层 -->
 				<view class="mask"></view>
-				<view class="layer" @tap.stop="discard" :style="{paddingBottom :isIphoneX ? '68rpx' : '36rpx',bottom:isIphoneX ?'-332rpx' : '-294rpx'}">
+				<view class="layer" @tap.stop="discard" :style="{paddingBottom :isIphoneX ? '68rpx' : '36rpx',bottom:isIphoneX ?'-352rpx' : '-296rpx'}">
 					<view class="content">
 						<view class="layer-smimg">
 							<image :src="product.mainImage" mode=""></image>
 						</view>
 						<view class="layer-nunbox">
+							<view class="layer-nunbox-t" v-if="product.step === 2">
+								<view class="text">*该商品只能以起订量的整数倍购买</view>
+							</view>
 							<view class="layer-nunbox-t">
 								<view class="layer-nunbox-text">数量:</view>
 								<view class="number-box">
@@ -172,9 +196,9 @@
 	import uniStars from '@/components/uni-stars/uni-stars.vue'
 	import parser from "@/components/jyf-Parser/index" //富文本处理
 	import tuiSkeleton from "@/components/tui-skeleton/tui-skeleton"
-	import supplierDetails from "@/components/cm-module/productDetails/supplierDetails" //供应商详情
-	import recommend from "@/components/cm-module/productDetails/recommend" //供应商详情
-	import evaluate from "@/components/cm-module/productDetails/evaluate" //供应商详情
+	import recommend from "@/components/cm-module/productDetails/recommend" //相关推荐
+	import cmParameter from "@/components/cm-module/productDetails/cm-parameter" //相关参数
+	import cmService from "@/components/cm-module/productDetails/cm-service" //服务项目
 	import wxLogin from "@/common/config/wxLogin.js"
 	import { queryProductDetils } from "@/api/product.js" 
 	import { shoppingAddCart } from "@/api/cart.js" 
@@ -184,17 +208,16 @@
 			customP,
 			parser,
 			tuiSkeleton,
-			supplierDetails,
 			recommend,
-			evaluate,
 			cmPrice,
-			cmAttributes
+			cmAttributes,
+			cmParameter,
+			cmService
 		},
 		data(){
 			return{			
 				html:'<div style="text-align: center;color:#333333;">暂无内容</div>',
-				tabNavList:[{name:'商品详情'},{name:'供应商信息'},{name:'相关推荐'},{name:'评价'}],
-				disabledTabNavList:[{name:'相关推荐'},{name:'评价'}],
+				disabledTabNavList:[{name:'相关推荐'}],
 				mode:'round',
 				specClass: '',//规格弹窗css类,控制开关动画
 				isBtnType:'',
@@ -206,6 +229,8 @@
 				ladderPriceFlag:'',
 				ladderPriceList:'',
 				isRecommend:false,
+				isRarameter:true,
+				isService:false,
 				isEvaluate:false,
 				isAnimation:false,
 				skeletonShow:true,
@@ -223,6 +248,7 @@
 				productImage:[],
 				retailPrice:0,
 				buyRetailPrice:0,
+				buyRetailPriceStep:1,
 				stock:0,
 				number:0,
 				minBuyNumber:0,
@@ -271,6 +297,7 @@
 					this.ladderPriceFlag = this.product.ladderPriceFlag;
 					this.html = this.product.productDetail == null ? this.html : this.$api.adaptRichTextImg(this.product.productDetail.detailInfo)
 					this.stock = this.product.stock
+					this.buyRetailPriceStep = this.product.step
 					this.number = this.product.minBuyNumber
 					this.minBuyNumber = this.product.minBuyNumber
 					//处理商品图片列表
@@ -340,16 +367,18 @@
 			},
 			tabClick(index) {//商品详情&&供应商信息tab切换
 				this.tabCurrentIndex = index;
-				if(this.tabCurrentIndex == 2){
-					this.isRecommend = true
-				}
-				if(this.tabCurrentIndex == 3){
-					this.isEvaluate = true
+				switch(this.tabCurrentIndex){
+					case 1:
+						this.isRarameter = true
+						break;
+					case 2:
+						this.isService = true
+						break;
+					case 3:
+						this.isRecommend = true
+						break;
 				}
 			},
-			changeTab(e) {
-				this.tabCurrentIndex = e.target.current;
-			},
 			handleContact(e){//跳转小程序客服
 
 			},
@@ -380,7 +409,11 @@
 				})
 			},	
 			changeCountAdd(){//popup弹窗数量增加按钮
-				this.number++
+				if(this.buyRetailPriceStep == 2){
+					this.number+=this.minBuyNumber
+				}else{
+					this.number++
+				}
 				this.processActivityPrice()
 			},
 			changeCountSub(){//popup弹窗数量减按钮
@@ -390,7 +423,11 @@
 					this.$util.msg(`该商品最小起订量为${this.minBuyNumber}`,2000);
 					return
 				}else{
-					this.number--
+					if(this.buyRetailPriceStep == 2){
+						this.number-=this.minBuyNumber
+					}else{
+						this.number--
+					}
 					this.processActivityPrice()
 					this.isQuantity =false
 				}
@@ -402,10 +439,13 @@
 				}else if(_value < this.minBuyNumber){	
 					this.$util.msg(`该商品最小起订量为${this.minBuyNumber}`,2000);
 					this.number = this.minBuyNumber
+				}else if( _value % this.minBuyNumber !=0 ){
+					this.$util.msg(`购买量必须为起订量的整数倍`,2000);
+					this.number = this.minBuyNumber
 				}else{
 					this.number = e.detail.value
-					this.processActivityPrice()
 				}
+				this.processActivityPrice()
 			},
 			processActivityPrice(){//单独处理活动价格和阶梯价格
 				if(this.ladderPriceFlag == '0' && this.product.actStatus == 0){
@@ -486,6 +526,10 @@
 			getOptionFn(e){
 				this.isShareType = e.type
 			},
+			goSupplier(){
+				this.$api.setStorage('supplierInfo',this.shop)
+				this.$api.navigateTo('/pages/goods/supplier')
+			},
 			discard(){
 				//丢弃
 			}
@@ -868,6 +912,47 @@
 			}
 		}
 	}
+	.product-supplier{
+		width: 702rpx;
+		height: 88rpx;
+		padding: 0 24rpx;
+		background-color: #FFFFFF;
+		margin-bottom: 24rpx;
+		position: relative;
+		display: flex;
+		.title{
+			display: flex;
+			flex: 2;
+			line-height: 88rpx;
+			display: inline-block;
+			float: left;
+			font-size: $font-size-28;
+			color: $text-color;
+		}
+		.name{
+			display: flex;
+			flex: 2;
+			line-height: 88rpx;
+			display: inline-block;
+			float: left;
+			font-size: $font-size-24;
+			color: #D0D0D0;
+			float: right;
+			padding-right: 48rpx;
+			overflow: hidden;
+			text-overflow:ellipsis;
+			white-space: nowrap;
+			text-align: right;
+		}
+		.icon-xiayibu{
+			line-height: 88rpx;
+			display: inline-block;
+			position: absolute;
+			width: 48rpx;
+			top: 0;
+			right: 0;
+		}
+	}
 	.product-details {
 		height: 100%;
 		background: #FFFFFF;
@@ -1131,8 +1216,8 @@
 			bottom: -294rpx;
 			width: 702rpx;
 			padding: 24rpx 24rpx 36rpx 24rpx;
-			height: 236rpx;
-			border-radius: 30rpx 30rpx 0 0;
+			height: 260rpx;
+			border-radius: 20rpx 20rpx 0 0;
 			background-color: #fff;
 			display: flex;
 			flex-wrap: wrap;
@@ -1143,6 +1228,7 @@
 			.btn {
 				width: 100%;
 				height: 88rpx;
+				margin-top: 20rpx;
 				.button {
 					width: 100%;
 					height: 88rpx;
@@ -1208,14 +1294,19 @@
 			justify-content: space-between;
 			align-items: center;
 			width: 536rpx;
-			height: 88rpx;
-			padding: 13rpx 0 0 0;
+			height: auto;
 			float: left;
 			.layer-nunbox-t{
 				width: 100%;
 				height:44rpx;
 				position:relative;
 				display: flex;
+				margin-bottom: 10rpx;
+				.text{
+					font-size: $font-size-24;
+					line-height: 48rpx;
+					color: #999999;
+				}
 				.layer-nunbox-text{
 					line-height: 44rpx;
 					font-size: $font-size-28;

+ 44 - 0
pages/goods/supplier.vue

@@ -0,0 +1,44 @@
+<template>
+	<view class="container all-type-list-wrapper">
+		<supplier-details :shop="shopInfo" v-if="isLoading"></supplier-details>
+	</view>
+</template>
+
+<script>
+	import supplierDetails from "@/components/cm-module/productDetails/supplierDetails" //供应商详情
+	export default{
+		components:{
+			supplierDetails
+		},
+		data(){
+			return{
+				shopInfo:{},
+				isLoading:false
+			}
+		},		
+		onLoad(option) {
+			
+		},
+		methods:{
+			
+		},
+		onShow() {
+			this.$api.getComStorage('supplierInfo').then((resolve) =>{
+				this.shopInfo = resolve
+				this.isLoading = true
+			}).catch(reject =>{
+				console.log('异常处理=========>',reject)
+			})
+		}
+	}
+</script>
+
+<style lang="scss">
+	page {
+		background: $sub-bg-color;
+		.all-type-list-wrapper {
+			display: flex;
+			flex-direction: column;
+		}
+	}
+</style>

+ 4 - 0
pages/search/search-order.vue

@@ -720,6 +720,10 @@
 			}
 		}
 		.title-text{
+			width: 630rpx;
+			overflow: hidden;
+			text-overflow:ellipsis;
+			white-space: nowrap;
 			float: left;
 			margin-left: 16rpx;
 			font-size: $font-size-28;

+ 25 - 9
pages/search/search.vue

@@ -3,8 +3,8 @@
 		<view class="search-main">
 			<view class="search-input">
 				<text class="iconfont icon-iconfonticonfontsousuo1"></text>
-				<input maxlength="20" focus type="text" value="" confirm-type="search" @focus="onFocus" @input="onShowClose" @confirm="subMitSearch()" placeholder="请输入商品关键词" v-model.trim="searchInputVal"/>
-				<text class="iconfont icon-shanchu1" v-if="isShowClose" @click="delInputText()"></text>
+				<input maxlength="20" :focus="isFocus" type="text" value="" confirm-type="search" @focus="onFocus" @input="onShowClose" @confirm="subMitSearch()" placeholder="请输入商品关键词" v-model.trim="searchInputVal"/>
+				<text class="iconfont icon-shanchu1" v-if="isShowClose" @click.stop="delInputText()"></text>
 			</view>
 			<view class="search-btn" @click="subMitSearch()">搜索</view>
 		</view>
@@ -110,6 +110,7 @@
 				serachRecordList:[],//历史搜索记录
 				isShowWrapper:false,
 				isModallayer:false,
+				isFocus:false,
 				priceLoading:true,
 				windowHeight: '',
 				showEmpty: false,
@@ -127,6 +128,7 @@
 			}
 		},
 		onLoad() {
+			this.isFocus = true
 			this.initGetSerachRecord()			
 		},
 		computed: {
@@ -156,6 +158,7 @@
 					this.listData =[]
 					this.setSearchHistoryAdd()
 					this.getListFromServer()
+					this.isFocus = false
 				}
 			},
 			scrolltolower() {
@@ -171,12 +174,19 @@
 				if(loadMore) {
 					this.pageNum += 1;
 				}
-				let params = {identity:this.identity,keyword:this.searchInputVal,pageNum:this.pageNum,pageSize:this.pageSize,sortField:'',sortType:''}
+				let params = {
+						identity:this.identity,
+						keyword:this.searchInputVal,
+						pageNum:this.pageNum,
+						pageSize:this.pageSize,
+						sortField:'',
+						sortType:'',
+					}
 				queryNewSearchProduct(params).then(response =>{
 					this.isShowWrapper = true
 					const resData = JSON.parse(response.data);
 					const resList = resData.items;
-					console.log(resData)
+					// console.log(resData)
 					if(resList && resList.length > 0){
 						this.totalPage = resData.total;
 						this.showEmpty = false;
@@ -247,7 +257,7 @@
 					this.$util.msg(error.msg,2000)
 				})
 			},
-			onShowClose () {//输入框失去焦点时触发
+			onShowClose () {//输入框输入时触发
 				this.inputEmpty(this.searchInputVal)
 			},
 			onFocus () { //输入框获取焦点时触发
@@ -280,8 +290,10 @@
 				this.isShowWrapper = false
 				if(val != ''){
 					this.isShowClose = true
+					this.isFocus = true
 				}else{					
 					this.isShowClose = false
+					this.isFocus = true
 				}
 			},
 			isInterceptHtmlFn(text){
@@ -336,6 +348,8 @@
 			background: #F0F0F0;
 			float: left;
 			.icon-iconfonticonfontsousuo1{
+				display: block;
+				width: 68rpx;
 				font-size: 36rpx;
 				color: #8A8A8A;
 				position: absolute;
@@ -343,13 +357,15 @@
 				z-index: 10;
 			}
 			.icon-shanchu1{
+				display: block;
+				width: 68rpx;
 				font-size: 36rpx;
-				color: #8A8A8A;
+				text-align: center;
+				color: #999;
 				position: absolute;
-				right: 24rpx;
+				right: 0;
 				top: 0;
-				padding: 0 10rpx;
-				z-index: 10;
+				z-index: 60;
 			}
 			input{
 				width: 448rpx;

+ 70 - 24
pages/tabBar/cart/cart.vue

@@ -40,9 +40,10 @@
 												</view>
 												<view class="count" v-if="pros.validFlag == '2'"  :class="[isshowDelbtn ? 'none':'show']">
 													<text class="count-tips" v-if="pros.productCount<pros.minBuyNumber">起订量:{{pros.minBuyNumber}}</text>
+													<text class="count-tips step" v-if="pros.isStep">购买量必须为起订量的整数倍</text>
 													<view class="number-box">
 														<view  class="iconfont icon-jianhao" :class="[pros.validFlag == '3'?'disabled':'']" @click="changeCountSub(item,pros)"></view>
-														<input class="btn-input" type="number" maxlength='4' v-model="pros.productCount" @blur="changeNnmber($event,item,pros)">
+														<input class="btn-input" type="number" maxlength='4' v-model="pros.productCount" @blur="changeNnmber($event,item,pros)" @focus="changeInput(pros)">
 														<view  class="iconfont icon-jiahao"  :class="[pros.validFlag == '3'?'disabled':'']" @click="changeCountAdd(item,pros)"></view>
 													</view>
 												</view>
@@ -227,7 +228,15 @@
 								invalidLength = 0;
 							item.productsList.forEach(pros => {
 								pros.shopID = item.shopID;
+								pros.isStep = false
 								if(pros.validFlag == '3' ) {invalidLength++;}
+								if(pros.step === 2){ 
+									if(pros.productCount % pros.minBuyNumber != 0){
+										pros.productCount = pros.minBuyNumber
+										this.totalShopPeice()
+										this.updateShoppogNum(pros)
+									}
+								}
 							})
 							item.isDisabled = invalidLength === productsListLength;
 						})
@@ -259,6 +268,23 @@
 					let resultsData = response.data.pageDate
 					this.hasNextPage = resultsData.hasNextPage;
 					this.goodsList = this.goodsList.concat(resultsData.results)
+					this.goodsList.forEach((item,index) => {
+						let productsListLength = item.productsList.length,
+							invalidLength = 0;
+						item.productsList.forEach(pros => {
+							pros.shopID = item.shopID;
+							pros.isStep = false
+							if(pros.validFlag == '3' ) {invalidLength++;}
+							if(pros.step === 2){ 
+								if(pros.productCount % pros.minBuyNumber != 0){
+									pros.productCount = pros.minBuyNumber
+									this.totalShopPeice()
+									this.updateShoppogNum(pros)
+								}
+							}
+						})
+						item.isDisabled = invalidLength === productsListLength;
+					})
 					this.pullFlag = false;// 防上拉暴滑
 					setTimeout(()=>{this.pullFlag = true;},500)
 					if(this.hasNextPage){
@@ -434,14 +460,15 @@
 			    })
 			},		
 			changeCountAdd(item,pros){//商品数量加加
-				if(pros.productCount>=pros.stock){
-					pros.productCount= pros.stock
-					this.isStock =true
-					return
+				if(pros.step === 2){
+					pros.isStep = false
+					pros.productCount += pros.minBuyNumber
+					this.processActivityPrice(pros)
+					this.isStock = false
 				}else{
 					pros.productCount++
 					this.processActivityPrice(pros)
-					this.isStock =false
+					this.isStock = false
 				}
 				this.updateShoppogNum(pros)
 				this.totalShopPeice();
@@ -452,20 +479,33 @@
 					this.$util.msg(`该商品最小起订量为${pros.minBuyNumber}`,2000);
 					return
 				}else{
-					pros.productCount--
+					if(pros.step === 2){
+						pros.isStep = false
+						pros.productCount -= pros.minBuyNumber
+					}else{
+						pros.productCount--
+					}
 					this.processActivityPrice(pros)
 				}
 				this.updateShoppogNum(pros)
 				this.totalShopPeice();
 			},
+			changeInput(pros){//输入商品数量更新
+				pros.isStep = false
+			},
 			changeNnmber(e,item,pros){//输入商品数量更新
-				let _value = e.detail.value;
+				
+				let _value = Number(e.detail.value);
 				if(!this.$api.isNumber(_value)){
 					pros.productCount = pros.minBuyNumber
 				}else if(_value < pros.minBuyNumber){	
 					this.$util.msg(`该商品最小起订量为${pros.minBuyNumber}`,2000);
 					pros.productCount = pros.minBuyNumber
+				}else if(_value % pros.minBuyNumber != 0){
+					pros.isStep = true
+					pros.productCount = pros.minBuyNumber
 				}else{
+					pros.isStep = false
 					pros.productCount = e.detail.value
 					this.processActivityPrice(pros)
 				}
@@ -520,23 +560,22 @@
 					if(this.isNoConfim){
 						this.$util.modal('','有商品的购买量没达到最小起订量,请修改数量后再次提交结算','去修改','',false,() =>{})
 						return;
-					}else{
-						let productID = '';
-						this.goodsList.forEach(el=>{//获取勾选的商品ID拼接字符串逗号隔开,最后一个逗号去掉
-							el.productsList.forEach(pros=>{
-								if(pros.productsChecked){
-								   productID += pros.productID+','
-								}
-							})
-						})
-						let cartPramsData={
-								allPrice:this.allPrice,
-								allCount:this.allCount,
-								productID:productID.substring(0,productID.lastIndexOf(',')),
-								productCount:''
-						    }
-						this.$api.navigateTo(`/pages/user/order/create-order?data=${JSON.stringify({data:cartPramsData})}`)
 					}
+					let productID = '';
+					this.goodsList.forEach(el=>{//获取勾选的商品ID拼接字符串逗号隔开,最后一个逗号去掉
+						el.productsList.forEach(pros=>{
+							if(pros.productsChecked){
+							   productID += pros.productID+','
+							}
+						})
+					})
+					let cartPramsData={
+							allPrice:this.allPrice,
+							allCount:this.allCount,
+							productID:productID.substring(0,productID.lastIndexOf(',')),
+							productCount:''
+						}
+					this.$api.navigateTo(`/pages/user/order/create-order?data=${JSON.stringify({data:cartPramsData})}`)
 				}
 			},
 			showDelManager(){//显示删除商品管理
@@ -800,6 +839,10 @@
 				padding: 10rpx;
 			}
 			.text{
+				display: block;
+				overflow: hidden;
+				text-overflow:ellipsis;
+				white-space: nowrap;
 				margin-left: 37rpx;
 				font-size: $font-size-28;
 				color: $text-color;
@@ -940,6 +983,9 @@
 						top:-60rpx;
 						left: -5rpx; 
 						z-index: 5;
+						&.step{
+							left:-217rpx
+						}
 						&::before{
 							content: "";
 							position: absolute;

+ 8 - 2
pages/tabBar/home/home.vue

@@ -209,8 +209,7 @@
 			}
 		},
 		onLoad() {
-			this.getHomeInformation()
-			this.getOrganizeProducts()
+			
 		},
 		computed: {
 			...mapState(['hasLogin','userInfo','isWxAuthorize'])
@@ -240,6 +239,8 @@
 							uni.setStorageSync('sessionid','JSESSIONID='+error.data)
 							this.$store.commit('updateStatus',error.data)
 						})
+						this.getHomeInformation()
+						this.getOrganizeProducts()
 					})
 				})
 			},		
@@ -300,6 +301,8 @@
 			},
 			showTost(){
 				this.$util.msg("正在开发中,敬请期待~",2000)
+				// this.$api.navigateTo(`/supplier/pages/login/share-info?scene=scene`)
+				// this.$api.navigateTo(`/seller/pages/login/login`)
 				// uni.navigateToMiniProgram({
 				// 	appId: 'wx5a5cda32926f55ac',
 				// 	path: '/pages/tabBar/home/home',
@@ -358,6 +361,9 @@
 			authorize.getSetting().then(res =>{// console.log('是否已授权',res);//0:为取消授权 1:为已授权 2:为未操作
 				if(res == 1){
 					this.getWxAuthorize()
+				}else{
+					this.getHomeInformation()
+					this.getOrganizeProducts()
 				}
 			})			
 		}

+ 1 - 1
pages/tabBar/user/user.vue

@@ -408,7 +408,7 @@
 					margin-top: 17rpx;
 				}
 				.u-h1{
-					width: 400rpx;
+					width: 300rpx;
 					float: left;
 					font-size: $font-size-34;
 					color: #FFFFFF;

+ 2 - 4
pages/user/address/address.vue

@@ -117,8 +117,7 @@
 					this.$util.msg(error.msg,2000)
 				})
 			},
-			//选择地址
-			checkAddress(item){
+			checkAddress(item){//选择地址
 				//是否需要返回地址(从订单确认页跳过来选收货地址)
 				if(!this.isSelect){return ;}
 				uni.setStorageSync('selectAddress',item)
@@ -132,8 +131,7 @@
 					url: `/pages/user/address/addressManage?type=${type}&data=${JSON.stringify(item)}`
 				})
 			},
-			//删除收货地址
-			deleteAddress(id){
+			deleteAddress(id){//删除收货地址
 				this.$util.modal('','确定要删除该地址?','确定','取消',true,() =>{
 					deleteNewAddress({addressID:id,userID:this.userID}).then(response =>{
 						this.$util.msg('删除成功',2000,true,'success')

+ 1 - 2
pages/user/order/create-order.vue

@@ -293,8 +293,7 @@
 						payInfo:this.payInfo,	//订单信息
 						orderInvoice:this.invoiceData
 					}
-					console.log(param)
-					debugger
+					// console.log(param)
 				this.modalLayer = true;	
 				createOrderSubmit({'params':JSON.stringify(param)}).then(response =>{
 					if(response.code === 1){

+ 4 - 0
pages/user/order/order-list.vue

@@ -613,6 +613,10 @@
 			}
 		}
 		.title-text{
+			width: 630rpx;
+			overflow: hidden;
+			text-overflow:ellipsis;
+			white-space: nowrap;
 			float: left;
 			margin-left: 16rpx;
 			font-size: $font-size-28;

+ 29 - 18
pages/user/regularPurchase/regularPurchase.vue

@@ -57,7 +57,8 @@
 				isStock:false,
 				minBuyNumber:0,
 				number:0,
-				buyRetailPrice:0
+				buyRetailPrice:0,
+				buyRetailPriceStep:1,
 			}
 		},
 		onLoad() {
@@ -65,10 +66,11 @@
 		},
 		methods:{
 			hanldOperationConfim(data){//显示选择数量确认弹窗
-				this.specClass = 'show';
+				this.specClass = 'show'
 				this.handleData = data
 				this.minBuyNumber = data.minBuyNumber
-				this.buyRetailPrice = data.retailPrice;
+				this.buyRetailPrice = data.retailPrice
+				this.buyRetailPriceStep = data.step
 				if(this.handleData.ladderPriceFlag == '1'){
 					this.number = data.maxBuyNumber
 				}else{
@@ -82,14 +84,12 @@
 				}, 200);
 			},
 			changeCountAdd(){//popup弹窗数量增加按钮
-				this.number++
-				if(this.handleData.ladderPriceFlag == '1'){
-					this.handleData.ladderPriceList.forEach((item,index)=>{
-						if(this.number>=item.buyNum){
-							this.buyRetailPrice = item.buyPrice
-						}
-					})
+				if(this.buyRetailPriceStep == 2){
+					this.number += this.minBuyNumber
+				}else{
+					this.number++
 				}
+				this.calculatPerice()
 			},
 			changeCountSub(){//popup弹窗数量减按钮
 				if(this.number<=this.minBuyNumber){
@@ -98,14 +98,12 @@
 					this.$util.msg(`该商品最小起订量为${this.minBuyNumber}`,2000);
 					return
 				}else{
-					this.number--
-					if(this.handleData.ladderPriceFlag == '1'){
-						this.handleData.ladderPriceList.forEach((item,index)=>{
-							if(this.number>=item.buyNum){
-								this.buyRetailPrice = item.buyPrice
-							}
-						})
+					if(this.buyRetailPriceStep == 2){
+						this.number-=this.minBuyNumber
+					}else{
+						this.number--
 					}
+					this.calculatPerice()
 					this.isQuantity =false
 				}
 			 },
@@ -116,8 +114,21 @@
 				}else if(_value < this.minBuyNumber){	
 					this.$util.msg(`该商品最小起订量为${this.minBuyNumber}`,2000);
 					this.number = this.minBuyNumber
+				}else if( _value % this.minBuyNumber !=0 ){
+					this.$util.msg(`购买量必须为起订量的整数倍`,2000);
+					this.number = this.minBuyNumber
 				}else{
 					this.number = e.detail.value
+					this.calculatPerice()
+				}
+			},
+			calculatPerice(){//判断是否为阶梯价然后做计算价格处理
+				if(this.handleData.ladderPriceFlag == '1'){
+					this.handleData.ladderPriceList.forEach((item,index)=>{
+						if(this.number>=item.buyNum){
+							this.buyRetailPrice = item.buyPrice
+						}
+					})
 				}
 			},
 			toConfirmation(){//跳转确认订单页面
@@ -243,7 +254,7 @@
 			width: 702rpx;
 			padding: 24rpx 24rpx 36rpx 24rpx;
 			height: 236rpx;
-			border-radius: 30rpx 30rpx 0 0;
+			border-radius: 20rpx 20rpx 0 0;
 			background-color: #fff;
 			display: flex;
 			flex-wrap: wrap;

+ 20 - 6
seller/pages/cart/buyagain.vue

@@ -8,7 +8,7 @@
 		<view class="popup spec" :class="specClass"  @touchmove.stop.prevent="discard" @tap="hideSpec">
 			<!-- 遮罩层 -->
 			<view class="mask"></view>
-			<view class="layer" @tap.stop="discard" :style="{paddingBottom :isIphoneX ? '68rpx' : '36rpx',bottom:isIphoneX ?'-370rpx' : '-360rpx'}">
+			<view class="layer" @tap.stop="discard" :style="{paddingBottom :isIphoneX ? '68rpx' : '36rpx',bottom:isIphoneX ?'-352rpx' : '-320rpx'}">
 				<view class="content">
 					<view class="layer-smimg">
 						<image :src="handleData.mainImage" mode=""></image>
@@ -61,7 +61,8 @@
 				isStock:false,
 				minBuyNumber:0,
 				number:0,
-				buyRetailPrice:0
+				buyRetailPrice:0,
+				buyRetailPriceStep:1,
 			}
 		},
 		onLoad() {
@@ -74,10 +75,12 @@
 				})
 			},
 			hanldOperationConfim(data){//显示选择数量确认弹窗
+				console.log(data)
 				this.specClass = 'show';
 				this.handleData = data
 				this.minBuyNumber = data.minBuyNumber
 				this.buyRetailPrice = data.retailPrice;
+				this.buyRetailPriceStep = data.step
 				if(this.handleData.ladderPriceFlag == '1'){
 					this.number = data.maxBuyNumber
 				}else{
@@ -91,7 +94,11 @@
 				}, 200);
 			},
 			changeCountAdd(){//popup弹窗数量增加按钮
-				this.number++
+				if(this.buyRetailPriceStep == 2){
+					this.number += this.minBuyNumber
+				}else{
+					this.number++
+				}
 				this.calculatPerice()
 			},
 			changeCountSub(){//popup弹窗数量减按钮
@@ -101,7 +108,11 @@
 					this.$util.msg(`该商品最小起订量为${this.minBuyNumber}`,2000);
 					return
 				}else{
-					this.number--
+					if(this.buyRetailPriceStep == 2){
+						this.number-=this.minBuyNumber
+					}else{
+						this.number--
+					}
 					this.calculatPerice()
 					this.isQuantity =false
 				}
@@ -113,6 +124,9 @@
 				}else if(_value < this.minBuyNumber){	
 					this.$util.msg(`该商品最小起订量为${this.minBuyNumber}`,2000);
 					this.number = this.minBuyNumber
+				}else if( _value % this.minBuyNumber !=0 ){
+					this.$util.msg(`购买量必须为起订量的整数倍`,2000);
+					this.number = this.minBuyNumber
 				}else{
 					this.number = e.detail.value
 					this.calculatPerice()
@@ -248,8 +262,8 @@
 			bottom: -294rpx;
 			width: 702rpx;
 			padding: 24rpx 24rpx 36rpx 24rpx;
-			height: 236rpx;
-			border-radius: 30rpx 30rpx 0 0;
+			height: 260rpx;
+			border-radius: 20rpx 20rpx 0 0;
 			background-color: #fff;
 			display: flex;
 			flex-wrap: wrap;

+ 76 - 7
seller/pages/cart/cart.vue

@@ -42,6 +42,7 @@
 														{{pros.retailPrice ? pros.retailPrice.toFixed(2) : ''}}
 												</view>
 												<view class="count" :class="[isshowDelbtn ? 'none':'show']">
+													<text class="count-tips step" v-if="pros.isStep">购买量必须为起订量的整数倍</text>
 													<view class="number-box">
 														<view  class="iconfont icon-jianhao"  @click="changeCountSub(item,pros)"></view>
 														<input class="btn-input" type="number" maxlength='6' v-model="pros.productCount" @blur="changeNnmber($event,item,pros)">
@@ -187,10 +188,17 @@
 						this.hasNextPage = resultsData.hasNextPage;
 						this.goodsList = resultsData.results;
 						this.goodsList.forEach((item,index) => {
-							let productsListLength = item.productsList.length,
-								invalidLength = 0;
+							let productsListLength = item.productsList.length,invalidLength = 0;
 							item.productsList.forEach(pros => {
 								pros.shopID = item.shopID;
+								pros.isStep = false
+								if(pros.step === 2){
+									if(pros.productCount % pros.minBuyNumber != 0){
+										pros.productCount = pros.minBuyNumber
+										this.totalShopPeice()
+										this.updateShoppogNum(pros)
+									}
+								}
 							})
 						})
 						this.pullFlag = false;
@@ -221,6 +229,20 @@
 					let resultsData = response.data.pageDate
 					this.hasNextPage = resultsData.hasNextPage;
 					this.goodsList = this.goodsList.concat(resultsData.results)
+					this.goodsList.forEach((item,index) => {
+						let productsListLength = item.productsList.length,invalidLength = 0;
+						item.productsList.forEach(pros => {
+							pros.shopID = item.shopID;
+							pros.isStep = false
+							if(pros.step === 2){
+								if(pros.productCount % pros.minBuyNumber != 0){
+									pros.productCount = pros.minBuyNumber
+									this.totalShopPeice()
+									this.updateShoppogNum(pros)
+								}
+							}
+						})
+					})
 					this.pullFlag = false;// 防上拉暴滑
 					setTimeout(()=>{this.pullFlag = true;},500)
 					if(this.hasNextPage){
@@ -351,9 +373,16 @@
 			    })
 			},		
 			changeCountAdd(item,pros){//商品数量加加
-				pros.productCount++
-				this.processActivityPrice(pros)
-				this.isStock =false
+				if(pros.step === 2){
+					pros.isStep = false
+					pros.productCount += pros.minBuyNumber
+					this.processActivityPrice(pros)
+					this.isStock = false
+				}else{
+					pros.productCount++
+					this.processActivityPrice(pros)
+					this.isStock = false
+				}
 				this.updateShoppogNum(pros)
 				this.totalShopPeice();
 			},
@@ -363,7 +392,12 @@
 					this.$util.msg(`该商品最小起订量为${pros.minBuyNumber}`,2000);
 					return
 				}else{
-					pros.productCount--
+					if(pros.step === 2){
+						pros.isStep = false
+						pros.productCount -= pros.minBuyNumber
+					}else{
+						pros.productCount--
+					}
 					this.processActivityPrice(pros)
 				}
 				this.updateShoppogNum(pros)
@@ -376,7 +410,11 @@
 				}else if(_value < pros.minBuyNumber){	
 					this.$util.msg(`该商品最小起订量为${pros.minBuyNumber}`,2000);
 					pros.productCount = pros.minBuyNumber
+				}else if(_value % pros.minBuyNumber != 0){
+					pros.isStep = true
+					pros.productCount = pros.minBuyNumber
 				}else{
+					pros.isStep = false
 					pros.productCount = e.detail.value
 					this.processActivityPrice(pros)
 				}
@@ -740,6 +778,37 @@
 					&.none{
 						display: none;
 					}
+					.count-tips{
+						width: auto;
+						display: inline-block;
+						padding: 0 15rpx;
+						line-height: 44rpx;
+						height: 44rpx;
+						border-radius: 22rpx;
+						background: $btn-confirm;
+						font-size: $font-size-24;
+						text-align: center;
+						color: #FFFFFF;
+						position: absolute;
+						top:-60rpx;
+						left: -5rpx; 
+						z-index: 5;
+						&.step{
+							left:-217rpx
+						}
+						&::before{
+							content: "";
+							position: absolute;
+							bottom: -30rpx;
+							right: 15rpx;
+							z-index:1;
+							width: 0; 
+							height: 0;
+							border-width: 18rpx;
+							border-style: solid;
+							border-color:$color-system transparent transparent transparent;
+						}
+					}
 					.number-box{
 						display: flex;
 						justify-content: center;
@@ -876,7 +945,7 @@
 		}
 		.footer-del{
 			width: 400rpx;
-			height: 100%;
+			height: 110rpx;
 			position: absolute;
 			padding-left: 200rpx;
 			background: #FFFFFF;

+ 16 - 3
seller/pages/cart/immediately.vue

@@ -122,6 +122,7 @@
 				productTotalAmount:0,
 				buyNumRangeShow:'',//起订量范围
 				buyPrice:'',//起订量范围价格
+				buyRetailPriceStep:1,
 			}
 		},
 		onLoad() {
@@ -158,6 +159,7 @@
 					this.number = data.minBuyNumber
 					this.minBuyNumber = data.minBuyNumber
 					this.buyRetailPrice = Number(data.price);
+					this.buyRetailPriceStep = data.step
 					this.specClass = 'show';
 					if(this.handleData.ladderPriceFlag == '1'){
 						querySearchProductLadderPrice({productId:this.handleData.pid}).then(response=>{
@@ -192,7 +194,11 @@
 				}, 200);
 			},
 			changeCountAdd(){//popup弹窗数量增加按钮
-				this.number++
+				if(this.buyRetailPriceStep == 2){
+					this.number += this.minBuyNumber
+				}else{
+					this.number++
+				}
 				this.calculatPerice()
 			},
 			changeCountSub(){//popup弹窗数量减按钮
@@ -202,7 +208,11 @@
 					this.$util.msg(`该商品最小起订量为${this.minBuyNumber}`,2000);
 					return
 				}else{
-					this.number--
+					if(this.buyRetailPriceStep == 2){
+						this.number-=this.minBuyNumber
+					}else{
+						this.number--
+					}
 					this.calculatPerice()
 					this.isQuantity =false
 				}
@@ -214,6 +224,9 @@
 				}else if(_value < this.minBuyNumber){	
 					this.$util.msg(`该商品最小起订量为${this.minBuyNumber}`,2000);
 					this.number = this.minBuyNumber
+				}else if( _value % this.minBuyNumber !=0 ){
+					this.$util.msg(`购买量必须为起订量的整数倍`,2000);
+					this.number = this.minBuyNumber
 				}else{
 					this.number = e.detail.value
 					this.calculatPerice()
@@ -455,7 +468,7 @@
 			width: 702rpx;
 			padding: 24rpx 24rpx 36rpx 24rpx;
 			// height: 236rpx;
-			border-radius: 30rpx 30rpx 0 0;
+			border-radius: 20rpx 20rpx 0 0;
 			background-color: #fff;
 			display: flex;
 			flex-wrap: wrap;

+ 0 - 1
seller/pages/club/allClub-list.vue

@@ -223,7 +223,6 @@
 	page,.container{
 		/* padding-bottom: 120upx; */
 		background: #F7F7F7;
-		border-top: 1px solid #EBEBEB;
 	}
 	.container{
 		position: relative;

+ 0 - 1
seller/pages/club/club-list.vue

@@ -202,7 +202,6 @@
 	page,.container{
 		/* padding-bottom: 120upx; */
 		background: #F7F7F7;
-		border-top: 1px solid #EBEBEB;
 	}
 	.container{
 		position: relative;

+ 0 - 1
seller/pages/club/list.vue

@@ -278,7 +278,6 @@
 	page,.container{
 		/* padding-bottom: 120upx; */
 		background: #F7F7F7;
-		border-top: 1px solid #EBEBEB;
 	}
 	.container{
 		position: relative;

+ 13 - 0
services/ajax.env.js

@@ -0,0 +1,13 @@
+let URL_CONFIG = ""
+if(process.env.NODE_ENV === 'development'){
+    // 开发环境
+	// URL_CONFIG = 'http://192.168.1.24:8008'	 //俊俊联调地址
+	// URL_CONFIG = 'http://192.168.1.22:8008'	 //裴裴联调地址
+	// URL_CONFIG = 'http://192.168.1.26:8008'	 //超超联调地址
+    // URL_CONFIG = 'https://spi-b.caimei365.com'	 //采美测试地址
+	URL_CONFIG = 'https://spi.caimei365.com'
+}else{
+    // 生产环境
+    URL_CONFIG = 'https://spi.caimei365.com'
+}
+export default URL_CONFIG

+ 67 - 0
services/ajax.service.js

@@ -0,0 +1,67 @@
+/**
+ * ajax请求相关的服务
+ */
+import baseUrl from './ajax.env'
+import { msg } from '@/utils/util'
+
+class AjaxService {
+	constructor() {
+		this.name = 'AjaxService'
+	}
+	getBaseUrl (url = '') {
+		return url.indexOf('://') > -1 ? url : baseUrl + url
+	}
+	getHeaders({ header = {} }) {
+		const REV_TOKEN_ENV = uni.getStorageSync('token') ? uni.getStorageSync('token') : 'X-token';
+		const REV_COOKIE_ENV = uni.getStorageSync('sessionid') ? uni.getStorageSync('sessionid') : 'sessionid';
+		header['Accept'] = 'application/json'
+		header['Content-Type'] = 'application/x-www-form-urlencoded'
+		header['X-Token'] = REV_TOKEN_ENV
+		header['cookie'] = REV_COOKIE_ENV
+		return header
+	}
+	request(options = {}) {
+		let header = this.getHeaders(options)
+		if (options.header) {
+			header = Object.assign(header, options.header)
+		}
+		let url = this.getBaseUrl(options.url)
+		let {
+			isLoading = true
+		} = options
+		if (isLoading) {
+			wx.showLoading({ title: '加载中' })
+		}
+		const requestPromise = new Promise((resolve, reject) => {
+			uni.request({
+				url: url,
+				method: options.method || 'POST',
+				data: options.data || {},
+				header,
+				success: res => {
+					if (isLoading) wx.hideLoading();
+					if (res.data.code === 0) {
+						resolve(res.data)
+					} else {
+						reject(res.data)
+					}
+				},
+				fail: error => {
+					reject(error)
+					// msg(error)
+					wx.hideLoading()
+				}
+			})
+		})
+		return requestPromise
+	}
+	get(options) {
+		options.method = 'GET'
+		return this.request(options)
+	}
+	post(options) {
+		options.method = 'POST'
+		return this.request(options)
+	}
+}
+export default new AjaxService()

+ 10 - 0
services/common.service.js

@@ -0,0 +1,10 @@
+/**
+ * 这是所有模块公用业务逻辑的服务
+ */
+export default class CommonService {
+	constructor(AjaxService) {
+		Object.assign(this, { AjaxService })
+		this.name = 'CommonService'
+	}
+	
+}

+ 18 - 0
services/index.js

@@ -0,0 +1,18 @@
+import ajaxService from './ajax.service.js'
+import CommonService from './common.service'
+import LocateService from './locate.service'
+import UserService from './user.service'
+import ShopService from './shop.service'
+import PhotoService from './photo.service'
+import Vue from 'vue'
+let commonService = new CommonService(ajaxService)
+let locateService = new LocateService(ajaxService)
+let userService = new UserService(ajaxService)
+let shopService = new ShopService(ajaxService)
+let photoService = new PhotoService(ajaxService)
+Vue.prototype.AjaxService = ajaxService
+Vue.prototype.CommonService = commonService
+Vue.prototype.LocateService = locateService
+Vue.prototype.UserService = userService
+Vue.prototype.ShopService = shopService
+Vue.prototype.PhotoService = photoService

+ 75 - 0
services/locate.service.js

@@ -0,0 +1,75 @@
+/**
+ * 定位相关的业务服务
+ */
+// import { qqMapKey } from '@/utils/config.js'
+// const QQMapWX = require('@/static/base/js/qqmap-wx-jssdk.min.js')
+// const qqmapsdk = new QQMapWX({
+//   coord_type: 5,
+//   key: qqMapKey
+// })
+
+export default class LocateService {
+	constructor(AjaxService) {
+		Object.assign(this, { AjaxService })
+		this.name = 'LocateService'
+	}
+	/* 获取当前的地理位置 */
+	getGeoLocation() {
+		return new Promise(function(reslove, reject) {
+			wx.getLocation({
+				type: 'gcj02',
+				success: function(res) {
+					reslove(res)
+				},
+				fail: function(err) {
+					reject(err)
+				},
+				complete: function(res) {}
+			})
+		})
+	}
+
+	/* 获取城市名 */
+	getCityName(lat, lon) {
+		return new Promise(function(reslove, reject) {
+			qqmapsdk.reverseGeocoder({
+				location: {
+					latitude: lat,
+					longitude: lon
+				},
+				success: function(res) {
+					const {
+						ad_info: addressInfo,
+						location,
+						formatted_addresses: formattedAddress = {},
+						address
+					} = res.result || {}
+
+					let locationInfo = {
+						cityName: addressInfo.city,
+						location: location,
+						address: formattedAddress.recommend || address
+					}
+					console.log("locationInfo: " + locationInfo);
+					reslove(locationInfo)
+				},
+				fail: function(err) {
+					reject(err)
+				}
+			})
+		})
+	}
+
+	/* 获取当前定位 */
+	async getLocationByLocate () {
+		// 获取地理位置
+		let locationInfo = await this.getGeoLocation()
+		const { latitude, longitude } = locationInfo || {}
+		// 获取城市名
+		let cityInfo = await this.getCityName(latitude, longitude)
+		const { location = {}, cityName, address } = cityInfo
+		console.log(location);
+		console.log(cityName);
+		console.log(address);
+	}
+}

+ 16 - 0
services/photo.service.js

@@ -0,0 +1,16 @@
+/**
+ * 随手拍模块公用业务逻辑的服务
+ */
+export default class PhotoService {
+	constructor(AjaxService) {
+		Object.assign(this, { AjaxService })
+		this.name = 'PhotoService'
+	}
+	/* api公用定义 */
+	riskAdd (data = {}, isLoading = false) {
+		return this.AjaxService.post({ url: `weixin/api/risk/add`, data, isLoading })
+	}
+	riskEdit (data = {}, isLoading = false) {
+		return this.AjaxService.post({ url: `weixin/api/risk/edit`, data, isLoading })
+	}
+}

+ 57 - 0
services/shop.service.js

@@ -0,0 +1,57 @@
+/**
+ * 这是与购物有关的业务逻辑的服务
+ */
+export default class ShopService {
+	constructor(AjaxService) {
+		Object.assign(this, { AjaxService })
+		this.name = 'ShopService'
+	}
+	/* 小程序发货-权限控制 */
+	MiniShipments (data = {}) {
+		return this.AjaxService.post({ url:'/supplier/miniShipments', data, isLoading: true })
+	}
+	/* 小程序发货-查询供应商子订单详情 */
+	GetShopOrderDetails (data = {}) {
+		return this.AjaxService.get({ url:'/supplier/shopOrderDetails', data, isLoading: true })
+	}
+	/* 小程序发货-绑供应商运营人员 */
+	BindShopOperator (data = {}) {
+		return this.AjaxService.post({ url:'/supplier/shopBindingWx', data, isLoading: true })
+	}
+	/* 小程序发货-供应商订单详情获取订单分享码 */
+	ShopOrderShareCode (data = {}) {
+		return this.AjaxService.post({ url:'/supplier/shopShareShipments', data, isLoading: false })
+	}
+	/* 小程序发货-供应商订单发货商品查询 */
+	ShopOrderShipmentsInfo (data = {}) {
+		return this.AjaxService.get({ url:'/supplier/shipmentsInfo', data, isLoading: true })
+	}
+	/* 小程序发货-物流公司查询 */
+	GetLogisticsCompany (data = {}) {
+		return this.AjaxService.get({ url:'/supplier/logisticsCompany', data, isLoading: true })
+	}
+	/* 小程序发货-查看发货记录物流信息 */
+	GetLogisticsInfo (data = {}) {
+		return this.AjaxService.get({ url:'/supplier/logisticsInfo', data, isLoading: true })
+	}
+	/* 小程序发货-查看发货记录-添加物流 */
+	ShopAddLogisticsInfo (data = {}) {
+		return this.AjaxService.post({ url:'/supplier/addLogisticsInfo', data, isLoading: true })
+	}
+	/* 小程序发货-扫码获取物流公司信息 */
+	GetExpressInformation (data = {}) {
+		return this.AjaxService.get({ url:'/supplier/scanLogistics', data, isLoading: false })
+	}
+	/* 小程序发货-确认发货 */
+	ShopAddLogistics (data = {}) {
+		return this.AjaxService.post({ url:'/supplier/addLogistics', data, isLoading: true })
+	}
+	/* 小程序发货-发货记录 */
+	ShopShipmentsRecord (data = {}) {
+		return this.AjaxService.get({ url:'/supplier/shipmentsRecord', data, isLoading: true })
+	}
+	/* 小程序发货-撤销发货 */
+	ShopCancelShipment (data = {}) {
+		return this.AjaxService.post({ url:'/supplier/cancelShipment', data, isLoading: true })
+	}
+}

+ 36 - 0
services/upload.service.js

@@ -0,0 +1,36 @@
+/**
+ *上传图片
+ */
+import requestUrl from './ajax.env.js'
+
+export function uploadFileImage(url) {
+	return new Promise(function(resolve,reject) {
+		uni.chooseImage({
+			count: 1, //默认1
+			sizeType: ['original','compressed'], //可以指定是原图还是压缩图,默认二者都有
+			sourceType: ['album'], //从相册选择
+			success: (res) => {
+				const tempFilePaths = res.tempFilePaths;
+				console.log(tempFilePaths)
+				const uploadTask = uni.uploadFile({
+					url : requestUrl+url,
+					filePath: tempFilePaths[0],
+					name: 'file',
+					header: {
+					    "Content-Type": "multipart/form-data",
+					},
+					formData: {
+						'user': 'test'
+					},
+					success: function (res) {
+						console.log(res)
+						resolve(res);
+					},
+					error : function(e){
+						reject(res)
+					}
+				})
+			}
+		});
+	});
+}

+ 17 - 0
services/user.service.js

@@ -0,0 +1,17 @@
+/**
+ * 这是用户业务逻辑的服务
+ */
+export default class UserService {
+	constructor(AjaxService) {
+		Object.assign(this, { AjaxService })
+		this.name = 'UserService'
+	}
+	/* 初始化查询用户是否为正常用户 */ 
+	appSelectLoginUser (data = {}) {
+		return this.AjaxService.post({ url:'', data, isLoading: true })
+	}
+	/*  微信获取用户手机号登录 */
+	LoginUsers (data = {}) {
+		return this.AjaxService.post({ url:'', data, isLoading: true })
+	}
+}

+ 1 - 0
store/index.js

@@ -70,6 +70,7 @@ const store = new Vuex.Store({
 		setChangeVar(state,variable){
 			//获取设备信息是否为IphoneX
 			state.isIphoneX = variable;
+			console.log(state.isIphoneX);
 		},
 		setIsIphone(state,variable){
 			//获取设备信息是否为IphoneX

+ 587 - 0
supplier/pages/deliver/add-logistics.vue

@@ -0,0 +1,587 @@
+<template>
+	<view class="container logistics" :style="{paddingBottom :isIphoneX ? (236+68)+'rpx' : '236rpx'}" v-if="isChange">
+		<view class="logistics-list" v-for="(item,index) in logisticsList" :key="index">
+			<view class="item-title">
+				<view class="title-left">物流{{index+1}}</view>
+				<view class="title-right" v-if="(index+1) > 1" @click="deleteLogistItemFn(item,index)">
+					<text class="iconfont icon-shanchu" ></text>删除
+				</view>
+			</view>
+			<view class="item-main">
+				<view class="item-main-cell" @click.stop="pageNavigateTo(index)">
+					<input class="input" type="text" v-model="item.label" placeholder="物流公司" disabled="true">
+					<text class="iconfont icon-xiayibu"></text>
+				</view>
+				<view class="item-main-cell">
+					<input class="input" type="text" v-model="item.number" placeholder="物流单号">
+				</view>
+				<view class="item-main-cell none" @click.stop="AddScanCode(item)" >
+					<text class="iconfont icon-icon-test" ></text><text>扫码录入</text>
+				</view>
+			</view>
+		</view>
+		<view class="logistics-btn">
+			<view class="btn add-btn" @click="addListFn">添加物流</view>
+		</view>
+		<view class="logistics-btn-fiexd" :style="{paddingBottom :isIphoneX ? '68rpx' : '34rpx'}">
+			<view class="btn-tips" @click.stop="showShowRemarksFn">
+				<text class="iconfont icon-xiangxiajiantou" v-if="isShowRemarks"></text>
+				<text class="iconfont icon-xiangshangjiantou" v-else></text>
+				添加备注
+			</view>
+			<view class="logistics-remarks" :class="specClass" v-show="isShowRemarks">
+				<view class="label">拍照备注</view>
+				<view class="remarks-photo clearfix">
+					<view class="photo-item" v-for="(item, index) in photoLists" :key="index">
+						<image :src="item" mode="aspectFill" @click.stop="previewImg(index)"></image>
+						<text class="iconfont icon-iconfontguanbi" @click.stop="deletePhotoFn(index)"></text>
+					</view>
+					<view class="photo-item add" @click.stop="uploadPhotoFn" v-if="photoLists.length<10 || photoLists.length == 0">
+						<text class="iconfont icon-jiahao"></text>
+					</view>
+				</view>
+				<view class="label">文字备注</view>
+				<view class="remarks-textarea">
+					<textarea class="textarea" v-model="info.note" value="" placeholder="文字备注,200字以内" maxlength="200" @input="conInput"/>
+					<text class="limit-text"><text class="red">{{min}}</text>/{{max}}</text>
+				</view>
+				<view class="remarks-tips">请备注快递单、发货现场和货物的照片,最多10张</view>
+			</view>
+			<view class="btn confim-btn" @click="confirmDeliverFn">确认发货</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import { mapState,mapMutations } from 'vuex'
+	import authorize from '@/common/config/authorize.js' 
+	import { uploadFileImage } from "@/api/utils.js"
+	var isPreviewImg;
+	export default{
+		data() {
+			return{
+				logisticsBatchId:'',
+				isIphoneX:this.$store.state.isIphoneX,
+				isChange:true,
+				isShowRemarks:false,
+				specClass:'',
+				photoLists:[],
+				checkLogicsIndex:0,
+				selectID:0,
+				addLogisticsType:'',
+				info:{
+					image:'',
+					note:'',
+					shopOrderId:''
+				},//备注信息
+				record:[],//子订单商品信息
+				logisticsList:[{
+					label:'',
+					number:'',
+					value:'',
+				}],
+				min:0,
+				max:200
+			}
+		},
+		watch: {
+			logisticsList: {
+				handler: function (el) {//监听对象的变换使用 function,箭头函数容易出现this指向不正确
+					this.logisticsList = el
+				},
+				deep: true
+			}
+		},
+		onLoad(option) {
+			if(option.type == 'add'){
+				this.addLogisticsType = option.type
+				this.info.shopOrderId = option.shopOrderId;
+				this.record = JSON.parse(option.data)
+			}else{
+				let queryData = JSON.parse(option.data);
+				this.addLogisticsType = option.type
+				this.logisticsBatchId = queryData.logisticsBatchId
+				this.info.shopOrderId = option.shopOrderId;
+				this.initGetLogisticsInfo()
+			}
+		},
+		methods:{
+			...mapMutations(['login']),
+			initGetLogisticsInfo(){
+				this.ShopService.GetLogisticsInfo({ logisticsBatchId : this.logisticsBatchId, shopOrderId:this.info.shopOrderId }).then(response =>{
+					const data = response.data.logisticsBatch
+					if(data.remarkImages!=null){
+						this.photoLists = data.remarkImages
+					}else{
+						this.photoLists =[]
+					}
+					this.info.note = data.remark
+				}).catch(error =>{
+					this.$util.msg(error.msg,2000);
+				})
+			},
+			AddScanCode(item){
+				let self = this;
+				uni.scanCode({
+				    onlyFromCamera: true,
+				    success: function (res) {
+						item.number= res.result
+						self.ShopService.GetExpressInformation({number:res.result}).then(response =>{
+							item.label= response.data.label
+							item.value= response.data.value
+							self.selectID = response.data.id
+						}).catch(error =>{
+							self.$util.msg(error.msg,2000);
+						})
+				    }
+				});
+			},
+			addListFn(){//添加
+				this.isShowRemarks = false
+				let obj ={name:'',number:'',value:''};
+				this.logisticsList.push(obj)
+			},
+			deleteLogistItemFn(item,index){
+				this.$util.modal('提示','确认删除物流信息吗?','确定','取消',true,() =>{
+					this.logisticsList.splice(index, 1);
+				})
+			},
+			pageNavigateTo(index){//选择物流公司
+				this.isChange = false
+				this.checkLogicsIndex = index
+				this.$api.navigateTo(`/supplier/pages/deliver/logistics-list?selectID=${this.selectID}`)
+			},
+			showShowRemarksFn(){//显示发货备注
+				this.isShowRemarks = !this.isShowRemarks 
+				if(this.isShowRemarks){
+					this.specClass = 'show';
+				}else{
+					this.specClass = 'hide';
+				}
+			},
+			uploadPhotoFn(){//添加发货备注图片
+				uploadFileImage().then(res =>{
+					this.photoLists.push(JSON.parse(res.data).data)
+				})
+			},
+			deletePhotoFn(index){//删除发货备注图片
+				this.photoLists.splice(index, 1);
+			},
+			confirmDeliverFn(){//确认发货
+				switch(this.addLogisticsType){
+					case 'add':
+						this.isNewAddLogisticsFn()
+						break;
+					case 'reple':
+						this.isRepleAddLogisticsFn()
+						break;
+				}
+			},
+			isRepleAddLogisticsFn(){//重新添加物流信息
+				// 校验物流公司不能为空
+				let isLogisticsLabel = false
+				let isLogisticsNumber = false
+				this.logisticsList.forEach(el =>{
+					if(el.label == ''){
+						isLogisticsLabel = true
+					}
+					if(el.number == ''){
+						isLogisticsNumber = true
+					}
+				})
+				if(isLogisticsLabel){
+					this.$util.msg('请选择物流公司',2000);
+					return
+				}
+				if(isLogisticsNumber){
+					this.$util.msg('请输入物流单号',2000);
+					return
+				}
+				//统一处理物流单号
+				let logisticsArray = []
+				let checkRepeat = false
+				for (const el of this.logisticsList) {
+					 // 检查缓存中是否已经存在
+					if (logisticsArray.find(c => c.number === el.number && c.number === el.number)) {
+					   // 已经存在
+					  checkRepeat = true
+					}else{
+						// 不存在就说明以前没遇到过,把它记录下来
+						let logisticsObj = {
+								number:el.number,
+								logisticsCompanyName:el.label,
+								logisticsCompanyCode:el.value 
+							}
+						logisticsArray.push(logisticsObj)
+					}
+				}
+				if(checkRepeat){
+					this.$util.msg('物流单号重复',2000);
+					return
+				}
+				//统一处理备注图片
+				this.photoLists.forEach(el =>{
+					this.info.image += el+'##'
+				})
+				let params = {
+						logistics:logisticsArray,
+						remarkImage:this.info.image,
+						remark:this.info.note,
+						logisticsBatchID:this.logisticsBatchId
+					}
+				this.ShopService.ShopAddLogisticsInfo({params:JSON.stringify(params)}).then(response =>{
+					this.$util.msg('添加物流成功',2000,true,'success')
+					setTimeout(()=>{
+						this.$api.navigateTo(`/supplier/pages/deliver/deliver-record?shopOrderId=${this.info.shopOrderId}`)
+					},2000)
+				}).catch(error =>{
+					this.$util.msg(error.msg,2000);
+				})
+			},
+			isNewAddLogisticsFn(){//第一次添加发货物流信息
+				// 校验物流公司不能为空
+				let isLogisticsLabel = false
+				let isLogisticsNumber = false
+				this.logisticsList.forEach(el =>{
+					if(el.label == ''){
+						isLogisticsLabel = true
+					}
+					if(el.number == ''){
+						isLogisticsNumber = true
+					}
+				})
+				if(isLogisticsLabel){
+					this.$util.msg('请选择物流公司',2000);
+					return
+				}
+				if(isLogisticsNumber){
+					this.$util.msg('请输入物流单号',2000);
+					return
+				}
+				//统一处理物流单号
+				let logisticsArray = []
+				let checkRepeat = false
+				for (const el of this.logisticsList) {
+					 // 检查缓存中是否已经存在
+					if (logisticsArray.find(c => c.number === el.number && c.number === el.number)) {
+					   // 已经存在
+					  checkRepeat = true
+					}else{
+						// 不存在就说明以前没遇到过,把它记录下来
+						let logisticsObj = {
+								number:el.number,
+								logisticsCompanyName:el.label,
+								logisticsCompanyCode:el.value 
+							}
+						logisticsArray.push(logisticsObj)
+					}
+				}
+				if(checkRepeat){
+					this.$util.msg('物流单号重复',2000);
+					return
+				}
+				//统一处理备注图片
+				this.info.image = ''
+				this.photoLists.forEach(el =>{
+					this.info.image += el+'##'
+				})
+				let params = {
+						logistics:logisticsArray,
+						record:this.record,
+						info:this.info
+					}
+				this.ShopService.ShopAddLogistics({params:JSON.stringify(params)}).then(response =>{
+					this.$util.msg('发货成功',2000,true,'success')
+					setTimeout(()=>{
+						this.$api.redirectTo(`/supplier/pages/deliver/deliver-record?shopOrderId=${this.info.shopOrderId}`)
+					},2000)
+				}).catch(error =>{
+					this.$util.msg(error.msg,2000);
+				})
+			},
+			previewImg (index) {//顶部商品图片预览
+				isPreviewImg = true
+				let previewUrls = this.photoLists
+				uni.previewImage({
+					current: index, 	//图片索引
+					urls: previewUrls, //必须是http图片,本地图片无效
+					longPressActions:''
+				})
+			},
+			conInput(e){//备注文字字数限制
+				let value = e.detail.value;
+				let len = parseInt(value.length);
+				if (len > this.max) return;
+				this.min = len;
+				if(this.min == 200){
+					this.$util.msg('您输入的字数已达上限',2000);
+				}
+			}
+		},
+		onShow() {
+			//处理选择物流公司
+			let pages = getCurrentPages();
+			let currPage = pages[pages.length-1];
+			if(currPage.data.select =='select'){
+				let SelectData = uni.getStorageSync('selectLogics')
+				this.selectID = SelectData.id
+				let setNewLogisticsList = this.logisticsList
+				setNewLogisticsList.forEach((el,index,arr) =>{
+					if(index == this.checkLogicsIndex ){
+						arr[this.checkLogicsIndex] = Object.assign({},arr[this.checkLogicsIndex],SelectData)
+					}
+				})
+				this.logisticsList = setNewLogisticsList
+			}
+			this.isChange = true
+		}
+	}
+</script>
+
+<style lang="scss">
+	page {
+		height: auto;
+		background:#F7F7F7;
+	}
+	@keyframes showRemarks {
+		0% {opacity: 0;}
+		20% {opacity: 0.2;}
+		40% {opacity: 0.4;}
+		60% {opacity: 0.6;}
+		80% {opacity: 0.8;}
+		100% {opacity: 1;}
+	}
+	@keyframes hideRemarks {
+		0% {opacity: 1;}
+		20% {opacity: 0.8;}
+		40% {opacity: 0.6;}
+		60% {opacity: 0.4;}
+		80% {opacity: 0.2;}
+		100% {opacity: 0;}
+	}
+	.logistics{
+		border-top: 1px solid #EBEBEB;
+	}
+	.logistics-list{
+		width: 100%;
+		height: auto;
+		padding: 10rpx 0;
+		background-color: #FFFFFF;
+		margin-bottom: 24rpx;
+		.item-title{
+			width: 702rpx;
+			height: 80rpx;
+			padding: 0 24rpx;
+			line-height: 80rpx;
+			text-align: left;
+			font-size: $font-size-28;
+			color: $text-color;
+			border-bottom: 1px solid #EBEBEB;
+			.title-left{
+				float: left;
+			}
+			.title-right{
+				float: right;
+				.icon-shanchu{
+					font-size: $font-size-30;
+					color: #FF2A2A;
+				}
+			}
+		}
+		.item-main{
+			width: 702rpx;
+			padding: 0 24rpx;
+			.item-main-cell{
+				width: 100%;
+				height: 80rpx;
+				line-height: 80rpx;
+				border-bottom: 1px solid #EBEBEB;
+				position: relative;
+				&.none{
+					border-bottom: none;
+					text-align: center;
+					font-size: $font-size-28;
+					color: $color-system;
+				}
+				.icon-xiayibu{
+					width: 40rpx;
+					height: 80rpx;
+					display: block;
+					position: absolute;
+					right: 0;
+					top: 0;
+					font-size: $font-size-32;
+					color: $text-color;
+					text-align: center;
+				}
+				.icon-icon-test{
+					color: $color-system;
+					font-size: $font-size-28;
+					margin-right: 10rpx;
+				}
+				.input{
+					width: 100%;
+					height: 44rpx;
+					line-height: 44rpx;
+					padding: 18rpx 0;
+					font-size: $font-size-28;
+					color: $text-color;
+				}
+			}
+		}
+	}
+	.logistics-btn{
+		width: 702rpx;
+		height: 88rpx;
+		margin: 0 auto;
+		.btn{
+			width: 100%;
+			height: 100%;
+			background-color: #FFF;
+			border-radius: 14rpx;
+			border: 1px solid $color-system;
+			line-height: 88rpx;
+			text-align: center;
+			color: $color-system;
+		}
+	}
+	.logistics-btn-fiexd{
+		width: 702rpx;
+		padding: 0 24rpx;
+		height:auto;
+		position: fixed;
+		bottom: 0;
+		left: 0;
+		background-color: #FFF;
+		border-radius: 20rpx 20rpx 0 0;
+		box-shadow:0px 3px 10px rgba(51, 51, 51,0.5);
+		z-index: 999;
+		.btn-tips{
+			height: 80rpx;
+			line-height: 80rpx;
+			text-align: center;
+			font-size: $font-size-28;
+			color: #999999;
+		}
+		.confim-btn{
+			width: 702rpx;
+			height: 88rpx;
+			background: $btn-confirm;
+			line-height: 88rpx;
+			text-align: center;
+			color: #FFF;
+			font-size: $font-size-28;
+			border-radius: 14rpx;
+		}
+		.logistics-remarks{
+			width: 100%;
+			height: auto;
+			&.show {
+				animation: showRemarks 0.2s linear both;
+			}
+			&.hide {
+				animation: hideRemarks 0.2s linear both;
+			}
+			.label{
+				height: 44rpx;
+				line-height: 44rpx;
+				font-size: $font-size-28;
+				color: $text-color;
+			}
+			.remarks-photo{
+				width: 100%;
+				height: auto;	
+				padding: 10rpx 0;
+				.photo-item{
+					display: inline-block;
+					width: 112rpx;
+					height: 112rpx;
+					margin: 10rpx 0;
+					margin-right: 25rpx;
+					border-radius: 10rpx;
+					border:1px solid #F5F5F5;
+					position: relative;
+					float: left;
+					&.add{
+						width: 112rpx;
+						height: 112rpx;
+						border-color: #FFC684;
+						text-align: center;
+						line-height: 112rpx;
+						margin-right: 0rpx;
+						.icon-jiahao{
+							font-size: $font-size-44;
+							color:#FFC684 ;
+							font-weight: bold;
+						}
+					}
+					.icon-iconfontguanbi{
+						width: 24rpx;
+						height: 24rpx;
+						border-radius: 0 10rpx 0 0;
+						display: block;
+						position: absolute;
+						right: 0;
+						top: 0;
+						background: rgba(51, 51, 51, 0.7);
+						text-align: center;
+						line-height: 24rpx;
+						color: #FFF;
+						font-size: $font-size-22;
+					}
+					image{
+						width: 112rpx;
+						height: 112rpx;
+						border-radius: 10rpx;
+					}
+				}	
+				.photo-list{
+					width: 100%;
+					height: 116rpx;
+					overflow: hidden;
+					white-space: nowrap;
+					display: flex;
+					align-items: flex-start;
+				}
+				.scoll-wrapper{
+					display:flex;
+					align-items: flex-start;
+				}
+			}
+			.remarks-textarea{
+				width: 652rpx;
+				height: 124rpx;
+				padding:10rpx 24rpx 24rpx 24rpx;
+				margin-top: 20rpx;
+				background-color: #F5F5F5;
+				border-radius: 10rpx;
+				position: relative;
+				.textarea{
+					width: 100%;
+					height: 100%;
+					line-height: 36rpx;
+					font-size: $font-size-24;
+					color: $text-color;
+					z-index: 1;
+				}
+				.limit-text{
+					position: absolute;
+					right: 20rpx;
+					bottom: 0;
+					line-height: 44rpx;
+					font-size: $font-size-24;
+					color: #D0D0D0;
+					.red{
+						color: $color-system;
+					}
+				}
+			}
+			.remarks-tips{
+				width: 100%;
+				line-height: 70rpx;
+				font-size: $font-size-24;
+				color: #999999;
+			}
+		}
+	}
+</style>

+ 533 - 0
supplier/pages/deliver/deliver-goods.vue

@@ -0,0 +1,533 @@
+<template>
+	<view class="container cart clearfix"> 
+		<view class="record-content-empty" v-if="isEmpty" :style="{'height': windowHeight ? windowHeight - CustomBar+'px' : 'auto'}">
+			<view class="record-container clearfix">
+				<image class="club-empty-image" src="https://img.caimei365.com/group1/M00/03/B7/Cmis2178OfaAEjhLAABqsz9OXM0847.png" mode="aspectFit"></image>
+				<view class="txt">未发货商品已全部取消,无需再发货~</view>
+			</view>
+		</view>
+		<view class="container-cart-main" v-else>
+			<view class="container-cart">
+				<view class="cart-content" :style="{paddingBottom :isIphoneX ? '130rpx' : '100rpx'}">
+					<view class="goods-title">请选择合适的商品数量进行发货</view>
+					<view class="goods-list">
+						<view 	class="goods-pros" v-for="(pros,idx) in productsList" :key="idx" >
+							<view class="goods-pros-t"  @click.stop="ischeck(pros)">
+								<!--选择商品-->
+								<view class="checkbox-box">
+									<button class="checkbox iconfont" :class="[pros.checked ?'icon-gouxuanl':'icon-weigouxuan']"></button>
+								</view>
+								<view class="pros-img"><image :src="pros.productImage ? pros.productImage:''" alt="" /></view>
+								<view class="pros-product">
+									<view class="producttitle">{{pros.name}}</view>
+									<view class="productspec">规格:{{pros.productUnit ? pros.productUnit : ''}}</view>
+									<view class="productspec">商品编码:{{pros.productNo ? pros.productNo : ''}}</view>
+									<view class="product-view">
+										<view class="view-num">数量:{{pros.num+pros.presentNum}}</view>
+									</view>
+									<view class="product-view">
+										<view class="view-num">已发货:{{pros.shipmentsNum}}</view>
+										<view class="view-num">未发货:{{pros.notOutStore-pros.actualCancelNum}}</view>
+									</view>
+									<view class="product-view">
+										<view class="view-num">已退货:{{pros.returnedNum}}</view>
+										<view class="view-num">已取消:{{pros.actualCancelNum}}</view>
+									</view>
+								</view>	
+							</view>
+							<view class="goods-pros-b">
+								<view class="productprice">
+									<view class="text">本次发货</view>
+									<view class="count">
+										<view class="number-box">
+											<view  class="iconfont icon-jianhao" :class="[pros.isReduceNum ? 'disabled':'']" @click="changeCountSub(pros)"></view>
+											<input class="btn-input" type="number" maxlength='4' v-model="pros.shipmentCount" @blur="changeNnmber($event,pros)">
+											<view  class="iconfont icon-jiahao"  :class="[pros.isPlusNum ?'disabled':'']" @click="changeCountAdd(pros)"></view>
+										</view>
+									</view>
+								</view>
+							</view>
+						</view>
+					</view>	
+				</view>
+				<!-- 脚部菜单 -->
+				<view class="footer" :style="{paddingBottom :isIphoneX ? '68rpx' : '0rpx'}">
+					<view class="footer-le">
+						<view class="foot-check checkbox-box" @tap.stop="checkAll()">
+							<button class="checkbox iconfont" :class="[isCheckAll?'icon-gouxuan':'icon-weigouxuan']"></button> 
+							<view class="text">全选</view>
+						</view>
+					</view>
+					<view class="footer-ri" >
+						<view class="btn" @tap="toConfirmDeliver">去发货</view>
+					</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+<script>
+	import authorize from '@/common/config/authorize.js'
+	import { mapState,mapMutations } from 'vuex';
+	
+	export default{
+		data(){
+			return{
+				isEmpty:false,
+				CustomBar:this.CustomBar,// 顶部导航栏高度
+				isIphoneX:this.$store.state.isIphoneX,
+				shopOrderId:'',
+				productsList:[],//发货的商品
+				isCheckAll:false,//是否全选
+				scrollHeight: '',
+				windowHeight: '',
+			}
+		},
+		onLoad(option){
+	
+		},
+		computed: {
+			...mapState(['hasLogin','userInfo'])
+		},
+		methods:{
+			initShopOrderShipmentsInfo(){//初始化
+				this.ShopService.ShopOrderShipmentsInfo({ shopOrderId : this.shopOrderId }).then(response =>{
+					if( response.data.orderProductList.length>0){
+						let orderProductList = response.data.orderProductList
+						let elObject = {}
+						let isReduceNum = false
+						let creatProductList = []
+						this.isEmpty = false
+						orderProductList.forEach(el =>{
+							let uninNum = el.notOutStore - el.actualCancelNum//未发货数量
+							if(uninNum == 1){
+								isReduceNum = true
+							}else{
+								isReduceNum = false
+							}
+							elObject = {
+								shipmentCount:uninNum,
+								isReduceNum:isReduceNum,
+								checked:false
+							}
+							creatProductList.push(Object.assign({},el,elObject))
+						})
+						this.productsList = creatProductList
+						console.log(this.productsList)
+					}else{
+						this.isEmpty = true
+					}
+				}).catch(error =>{
+					this.$util.msg(error.msg,2000);
+				})
+				
+			},		
+			setScrollHeight() {
+				const {windowHeight, pixelRatio} = wx.getSystemInfoSync();
+				this.windowHeight = windowHeight - 1;
+				this.scrollHeight = windowHeight - 1;
+			},
+			ischeck(pro){//为未选中的时候改变为true,反之为true
+				pro.checked = !pro.checked;
+				this.updateCheckAllBtn();
+			},
+			updateCheckAllBtn() {// 全选勾选判断
+				let goodsCheckedLength = 0,
+					productsList = this.productsList;
+				productsList.forEach(item => {
+					if(item.checked) { goodsCheckedLength++; }
+				})
+				this.isCheckAll = goodsCheckedLength === productsList.length;
+			},
+			updateBothCheckBtn() {
+				this.productsList.forEach((item)=>{
+					item.checked = this.isCheckAll ;
+				})
+			},
+			checkAll(){//全选方法内调用方法
+			    this.isCheckAll = !this.isCheckAll;
+				this.updateBothCheckBtn();     
+			},
+			changeCountAdd(pros){//商品数量加加
+				let uninNum = pros.notOutStore-pros.actualCancelNum//未发货数量
+				if(pros.shipmentCount == uninNum){
+					this.isNoneNum =true
+					return
+				}else{
+					pros.shipmentCount++
+					this.isNoneNum =false
+				}
+			},
+			changeCountSub(pros){//商品数量减减
+				let uninNum = pros.notOutStore-pros.actualCancelNum//未发货数量
+				if(pros.shipmentCount == 1){
+					pros.shipmentCount = pros.shipmentCount
+					return
+				}else{
+					pros.shipmentCount--
+				}
+			},
+			changeNnmber(e,pros){//输入商品数量更新
+				let uninNum = pros.notOutStore-pros.actualCancelNum//未发货数量
+				let _value = e.detail.value;
+				if(!this.$api.isNumber(_value) || uninNum == 1){
+					pros.shipmentCount = uninNum
+				}else if(_value > uninNum){	
+					pros.shipmentCount = uninNum
+				}else{
+					pros.shipmentCount = e.detail.value
+				}
+			},
+			toConfirmDeliver(){//添加物流页面
+				let setProductList=[];
+				this.productsList.forEach(el=>{
+					if(el.checked){
+						let elObject = {
+								orderProductId:el.orderProductID.toString(),
+								num:el.shipmentCount.toString()
+						}
+						setProductList.push(elObject)
+					}
+				})
+				if(setProductList == ''){
+					this.$util.msg("请先选择商品~",2000);
+					return
+				}else{
+					this.$api.navigateTo(`/supplier/pages/deliver/add-logistics?type=add&shopOrderId=${this.shopOrderId}&data=${JSON.stringify(setProductList)}`)
+				}
+			},
+		},
+		onPullDownRefresh() {//下拉刷新
+			this.initShopOrderShipmentsInfo()
+			uni.stopPullDownRefresh()
+		},
+		onShow(){
+			this.shopOrderId = uni.getStorageSync('shopOrderId')
+			this.setScrollHeight()
+			this.initShopOrderShipmentsInfo();
+		},
+	}
+</script>
+
+<style lang="scss">
+	page{
+		background: #f7f7f7;
+		height: auto;
+	}
+	.record-content-empty{
+		width: 100%;
+		height: 100%;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		.record-container{
+			width: 465rpx;
+			height: auto;
+			image{
+				width: 400rpx;
+				height: 400rpx;
+				display: block;
+				margin: 0 auto;
+			}
+			.txt{
+				font-size: $font-size-28;
+				text-align: center;
+				color: #333;
+				line-height: 30rpx;
+				margin-bottom: 20rpx;
+			}
+			.btn{
+				width: 400rpx;
+				height: 80rpx;
+				background: $btn-confirm;
+				border-radius: 10rpx;
+				line-height: 80rpx;
+				font-size: $font-size-28;
+				text-align: center;
+				color: #FFFFFF;
+			}
+		}
+	}
+	.cart-content{
+		position: relative;
+	}
+	.goods-title{
+		width: 702rpx;
+		padding: 0 24rpx;
+		height: 80rpx;
+		line-height: 80rpx;
+		text-align: left;
+		font-size: $font-size-28;
+		color: $color-system;
+		background-color: rgba(225, 86, 22, 0.17);
+	}
+	.checkbox-box{
+		display: flex;
+		align-items: center;
+		.checkbox{
+			display: flex;
+			margin: 0;
+			padding: 0;
+			display: flex;
+			flex-direction: column;
+			align-items: center;
+			box-sizing: border-box;
+			text-align: center;
+			text-decoration: none;
+			border-radius: 0;
+			-webkit-tap-highlight-color: transparent;
+			overflow: hidden;
+			background-color:#FFFFFF;
+			font-size: 36rpx;
+			color:$color-system;
+		}
+		&.disabled{
+			.checkbox{
+				color:#999999
+			}
+		}
+		.text{
+			font-size: $font-size-24;
+			margin-left: 10rpx;
+		}
+	}
+	.goods-list{
+		width: 100%;
+		height: auto;
+		background-color: #F7F7F7;
+		margin-top: 24rpx;
+		.goods-item{
+			width: 702rpx;
+			padding: 0 24rpx;
+			background: #FFFFFF;
+			margin-bottom: 24rpx;
+		}
+		.goods-pros{
+			width: 702rpx;
+			padding: 0 24rpx;
+			background: #FFFFFF;
+			margin-bottom: 24rpx;
+		}	
+		.goods-pros-t{
+			display: flex;
+			width: 100%;
+			height: auto;
+			padding:20rpx 0;
+			.checkbox-box{
+				padding: 10rpx;
+			}
+			.pros-img{
+				width: 210rpx;
+				height: 210rpx;
+				border-radius: 10rpx;
+				margin:0 20rpx;
+				border:1px solid #f3f3f3;
+				image{
+					width: 100%;
+					height: 100%;
+					border-radius: 10rpx;
+				}
+			}
+		}
+		.goods-pros-b{
+			width:622rpx;
+			height: 80rpx;
+			margin-left: 84rpx;
+			border-top: 1px solid #F7F7F7;
+			position: relative;
+			.productprice{
+				height: 48rpx;
+				width: 100%;
+				margin-top: 15rpx;
+				.text{
+					line-height: 48rpx;
+					float: left;
+					color: $text-color;
+					font-size: $font-size-28;
+				}
+				.count{
+					height: 100%;
+					float: right;
+					position: relative;
+					&.show{
+						display: block;
+					}
+					&.none{
+						display: none;
+					}
+					.number-box{
+						display: flex;
+						justify-content: center;
+						align-items: center;
+						.iconfont{
+							font-size: $font-size-24;
+							padding:0 20rpx;
+							color: $text-color;
+							text-align: center;
+							line-height: 48rpx;
+							font-weight: bold;
+							&.disabled{
+								color: #999999;
+							}
+						}
+						.btn-input{
+							width: 62rpx;
+							height: 48rpx;
+							line-height: 48rpx;
+							background: #F8F8F8;
+							border-radius: 4rpx;
+							text-align: center;
+							font-size: $font-size-24;
+						}
+					}
+					.uni-numbox{
+						position: absolute;
+						left: 45rpx;
+						bottom: 0;
+						.uni-numbox-minus, .uni-numbox-plus{
+							width: 50rpx;
+							line-height: 40rpx;
+						}
+						.uni-numbox-value {
+							font-size: $font-size-28;
+							width: 60rpx;
+						}
+					}
+				}
+			}
+		}
+		.pros-product{
+			width: 402rpx;
+			height: 100%;
+			line-height: 36rpx;
+			font-size: $font-size-28;	
+			position: relative;
+			.producttitle{
+				width: 100%;
+				display: inline-block;
+				height: auto;							
+				text-overflow:ellipsis;
+				display: -webkit-box;
+				word-break: break-all;
+				-webkit-box-orient: vertical;
+				-webkit-line-clamp: 2;
+				overflow: hidden;
+				margin-bottom: 8rpx;
+			}
+			.productspec{
+				height: 44rpx;
+				color: #999999;
+				line-height: 44rpx;
+				font-size: $font-size-26;
+			}
+			.product-view{
+				width: 100%;
+				height: auto;
+				display: flex;
+				.view-num{
+					flex: 1;
+					text-align: left;
+					font-size: $font-size-26;
+					color: #666666;
+					line-height: 44rpx;
+				}
+			}
+		}
+	}
+	.footer{
+		width: 100%;
+		background-color: #FFFFFF;
+		height: 110rpx;
+		position: fixed;
+		bottom: 0rpx;
+		z-index: 100;
+		.footer-le{
+			width: 490rpx;
+			height: 100%;
+			padding:0 30rpx;
+			float: left;
+			.text{
+				font-weight: bold;
+			}
+			.foot-check{
+				width: 100rpx;
+				float: left;
+				line-height: 110rpx;
+				font-size: $font-size-24;
+				.checkbox{
+					width: 40rpx;
+					text-align: center;
+				}
+				.text{
+					width: 60rpx;
+					float: right;
+				}
+			}
+			.foot-check-delbtn{
+				float: left;
+				.delBtn{
+					margin: 0;
+					padding: 0;
+					display: flex;
+					flex-direction: column;
+					align-items: center;
+					box-sizing: border-box;
+					font-size: $font-size-24;
+					text-align: center;
+					text-decoration: none;
+					border-radius: 0;
+					-webkit-tap-highlight-color: transparent;
+					overflow: hidden;
+					background-color:#FFFFFF;
+					color: #FF2A2A;
+					padding: 0 24rpx;
+					display: flex;
+					justify-content: center;
+					align-items: center;
+					line-height: 110rpx;
+					font-weight: bold;
+					&.none{
+						display: none;	
+					}
+				}
+			}
+			.sum{
+				font-size: $font-size-28;
+				line-height: 110rpx;
+				color: $text-color;
+				display: flex;
+				justify-content: flex-end;
+				.money{
+					color: #FF2A2A;
+				}
+				.money-sign{
+					font-size: $font-size-24;
+					color: #FF2A2A;
+				}
+			}
+		}
+		.footer-ri{
+			width: 200rpx;
+			height: 100%;
+			background:linear-gradient(135deg,rgba(242,143,49,1) 0%,rgba(225,86,22,1) 100%);
+			float: right;
+			display: flex;
+			justify-content: space-between;
+			align-items: center;
+			z-index: 999;
+			&.none{
+				display: none;
+			}
+			.btn{
+				width: 200rpx;
+				height: 100%;
+				font-size: $font-size-28;
+				line-height: 110rpx;
+				color: #FFFFFF;
+				display: flex;
+				justify-content: center;
+				align-items: center;
+			}
+		}
+	}
+</style>

+ 479 - 0
supplier/pages/deliver/deliver-record.vue

@@ -0,0 +1,479 @@
+<template>
+	<view class="container record clearfix" :style="{paddingTop:CustomBar+'px'}"> 
+		<cd-custom :systeminfo='systeminfo' :navbar-data='nvabarData' :headerBtnPosi ="headerBtnPosi" :page='1' @pageDetails="hanldPageDetails"></cd-custom>
+		<view class="record-content-empty" v-if="isEmpty" :style="{'height': windowHeight ? windowHeight - CustomBar+'px' : 'auto'}">
+			<view class="record-container clearfix">
+				<image class="club-empty-image" src="https://img.caimei365.com/group1/M00/03/B7/Cmis2178OfaAEjhLAABqsz9OXM0847.png" mode="aspectFit"></image>
+				<view class="txt">此订单暂无发货记录~</view>
+				<view class="btn" @click="pageGoLink">去发货</view>
+			</view>
+		</view>
+		<view class="record-content" v-else>
+			<scroll-view scroll-y="true" class="scroll-view">
+				<view class="record-list clearfix"  v-for="(item,index) in RecordList" :key="index">
+					<view class="record-top clearfix">
+						<view class="top-view">
+							<view class="top-viewlabel">发货时间:</view>
+							<view class="top-viewtext">{{item.deliveryTime}}</view>
+						</view>
+						<view class="top-view" v-for="(logist,idx) in item.logisticsInformationList" :key="logist.id">
+							<view class="top-viewlabel">{{logist.logisticsCompanyName}}:</view>
+							<view class="top-viewtext">
+								<text>{{logist.nu}}</text>
+							</view>
+						</view>
+					</view>
+					<view class="goods-pros">
+						<view class="goods-pros-t" v-for="(pros,idx) in item.logisticsRecordList" :key="pros.id">
+							<view class="pros-img"><image :src="pros.image ? pros.image:''" alt="" mode="aspectFill"/></view>
+							<view class="pros-product">
+								<view class="producttitle">{{pros.productName}}</view>
+								<view class="productspec">规格:{{pros.unit ? pros.unit : ''}}</view>
+								<view class="productspec">商品编码:{{pros.productCode ? pros.productCode : ''}}</view>
+								<view class="product-view">
+									<view class="view-num">数量:{{pros.buyNum}}</view>
+								</view>
+								<view class="product-view">
+									<view class="view-num">本次发货:{{pros.num}}</view>
+									<view class="view-num">已发货:{{pros.shipmentsNum}}</view>
+								</view>
+								<view class="product-view">
+									<view class="view-num">未发货:{{pros.notShippedNum}}</view>
+									<view class="view-num">已退货:{{pros.returnedNum}}</view>
+								</view>
+							</view>	
+						</view>
+						<view class="goods-pros-b clearfix" v-show="item.remarkImages.length>0">
+							<view class="b-label">拍照备注</view>
+							<view class="b-photo">
+								<view class="b-imageView" v-for="(imgItem,imgIdx) in item.remarkImages" :key="imgIdx" >
+									<image :src="imgItem" mode="aspectFill"  @click="previewImg(imgIdx,item.remarkImages)"></image>
+								</view>
+							</view>
+						</view>
+						<view class="goods-pros-b clearfix" v-if="item.remark!=''">
+							<view class="b-label">文字备注</view>
+							<view class="b-photo">
+								<view class="text">{{item.remark ? item.remark : ''}}</view>
+							</view>
+						</view>
+					</view>
+					<!-- 底部button -->
+					<order-button ref="orderButton" 
+								  :hanldData="item" 
+								  @buttonConfirm="handButtonConfirm">
+					</order-button>
+				</view>
+				<!--加载loadding-->
+				<tui-loadmore :visible="loadding" :index="3" type="black"></tui-loadmore>
+				<tui-nomore :visible="!pullUpOn" bgcolor="#F7F7F7" :text='nomoreText'></tui-nomore>
+				<!--加载loadding-->
+			</scroll-view>	
+		</view>
+	</view>
+</template>
+<script>
+	import { mapState,mapMutations } from 'vuex';
+	import orderButton from '@/components/cm-module/orderDetails/supplierRecorgButton.vue'	//底部按钮
+	import tuiLoadmore from "@/components/tui-components/loadmore/loadmore"
+	import tuiNomore from "@/components/tui-components/nomore/nomore"
+	import cdCustom from "@/components/cm-custom/custom-d"
+	
+	var isPreviewImg 
+	export default{
+		components:{
+			orderButton,
+			tuiLoadmore,
+			tuiNomore,
+			cdCustom
+		},
+		data(){
+			return{
+				nvabarData: {//顶部自定义导航
+					showCapsule: 1, // 是否显示左上角图标   1表示显示    0表示不显示
+					title: '发货记录', // 导航栏 中间的标题
+				},
+				headerBtnPosi:	this.setHeaderBtnPosi(),//获取设备顶部胶囊高度
+				systeminfo:this.setSysteminfo(),		 //获取设备信息
+				CustomBar:this.CustomBar,// 顶部导航栏高度
+				isIphoneX:this.$store.state.isIphoneX,
+				shopOrderId:'',
+				lgisList:[],
+				ramkesList:[],
+				RecordList:[],	//发货记录
+				pageNum:1,
+				pageSize:10,
+				hasNextPage:false,
+				loadding: false,
+				pullUpOn: true,
+				pullFlag: true,
+				isEmpty:false,
+				nomoreText: '上拉显示更多',
+				scrollHeight: '',
+				windowHeight: '',
+			}
+		},
+		onLoad(option){
+			this.shopOrderId = option.shopOrderId
+			this.setScrollHeight()
+			this.initShopShipmentsRecord();
+		},
+		computed: {
+			...mapState(['hasLogin','userInfo'])
+		},
+		methods:{
+			initShopShipmentsRecord(){//初始化发货记录 index:1
+				this.ShopService.ShopShipmentsRecord({ shopOrderId : this.shopOrderId,pageSize:this.pageSize,pageNum:this.pageNum }).then(response =>{
+					console.log(response)
+					let responseData = response.data.logisticsBatchPage
+					if(responseData.results&&responseData.results.length > 0){
+						this.isEmpty = false
+						this.hasNextPage = responseData.hasNextPage
+						this.RecordList =responseData.results
+						this.pullFlag = false;
+						setTimeout(()=>{this.pullFlag = true;},500)
+						if(this.hasNextPage){
+							this.pullUpOn = false
+							this.nomoreText = '上拉显示更多'
+						}else{
+							if(this.RecordList.length < 2){
+								this.pullUpOn = true
+								this.loadding = false
+							}else{
+								this.pullUpOn = false
+								this.loadding = false
+								this.nomoreText = '已至底部'
+							}
+						}
+					}else{
+						this.isEmpty = true
+					}
+				}).catch(error =>{
+					this.$util.msg(error.msg,2000);
+				})
+			},	
+			getOnReachBottomData(){
+				this.ShopService.ShopShipmentsRecord({ shopOrderId : this.shopOrderId,pageSize:this.pageSize,pageNum:this.pageNum+=1 }).then(response =>{
+					let responseData = response.data.logisticsBatchPage
+					if(responseData.results&&responseData.results.length > 0){
+						this.hasNextPage = responseData.hasNextPage
+						this.RecordList = this.RecordList.concat(responseData.results) 
+						this.pullFlag = false;// 防上拉暴滑
+						setTimeout(()=>{this.pullFlag = true;},500)
+						if(this.hasNextPage){
+							this.pullUpOn = false
+							this.nomoreText = '上拉显示更多'
+						}else{
+							this.pullUpOn = false
+							this.loadding = false
+							this.nomoreText = '已至底部'
+						}
+					}
+				}).catch(error =>{
+					this.$util.msg(error.msg,2000)
+				})
+			},
+			setHeaderBtnPosi(){// 获得胶囊按钮位置信息
+				let headerBtnPosi = uni.getMenuButtonBoundingClientRect();
+				return headerBtnPosi
+			},
+			setSysteminfo(){ // 获取设备信息
+				let systeminfo;
+				uni.getSystemInfo({
+					success: (res) => {
+						systeminfo = res
+					},
+				})
+				return systeminfo
+			},
+			setScrollHeight() {
+				const {windowHeight, pixelRatio} = wx.getSystemInfoSync();
+				this.windowHeight = windowHeight - 1;
+				this.scrollHeight = windowHeight - 1;
+			},
+			previewImg (index,previewUrls) {//顶部商品图片预览
+				isPreviewImg = true
+				uni.previewImage({
+					current: index, 	//图片索引
+					urls: previewUrls, //必须是http图片,本地图片无效
+					longPressActions:''
+				})
+			},
+			handButtonConfirm(data){//监听点击时间的按钮类型并执行...
+				// console.log(data)
+				this.handShowAlert(data)
+			},
+			handShowAlert(data){//判断点击的按钮类型并执行...
+				let hanldType = data.hanldType
+				let hanldData = data.hanldData
+				switch(hanldType){
+					case 'cancel':
+						this.handCenceConfirm(hanldData)
+						break
+					case 'add':
+						let setProductList =[]
+						let repleArray =hanldData.logisticsRecordList
+						repleArray.forEach(el=>{
+							let elObject = {
+									orderProductId:el.orderProductID.toString(),
+									num:el.num.toString()
+							}
+							setProductList.push(elObject)
+						})
+						let data = {
+								logisticsBatchId:hanldData.id,
+								logisticsBatchData:setProductList
+							}
+						this.$api.navigateTo(`/supplier/pages/deliver/add-logistics?type=reple&shopOrderId=${this.shopOrderId}&data=${JSON.stringify(data)}`)
+						break
+				}
+			},
+			handCenceConfirm(data){//取消订单
+				this.$util.modal('提示','确定要撤销本次发货吗?撤销后需重新发货','确定','取消',true,() =>{
+					this.ShopService.ShopCancelShipment({ logisticsBatchId : data.id }).then(response =>{
+						this.$util.msg('撤销成功',2000,true,'success');
+						setTimeout(()=>{
+							this.initShopShipmentsRecord()
+						},2000)
+					}).catch(error =>{
+						this.$util.msg(error.msg,2000)
+					})
+				})
+			},
+			pageGoLink(){
+				this.$api.navigateTo('/supplier/pages/deliver/deliver-goods?shopOrderId='+this.shopOrderId)
+			},
+			hanldPageDetails(){
+				this.$api.navigateTo('/supplier/pages/order/order-details?shopOrderId='+this.shopOrderId)
+			}
+		},
+		onPullDownRefresh() {//下拉刷新
+			this.initShopShipmentsRecord()
+			uni.stopPullDownRefresh()
+		},
+		onReachBottom() {
+			if(this.hasNextPage){
+				this.loadding = true
+				this.pullUpOn = true
+				this.getOnReachBottomData()
+			}	
+		},
+		onShow(){
+			
+		},
+	}
+</script>
+
+<style lang="scss">
+	page{
+		background: #f7f7f7;
+		height: auto;
+	}
+	.record-content{
+		position: relative;
+		border-top: 1px solid #EBEBEB;
+		.scroll-view{
+			height: 100%;
+		}
+	}
+	.record-content-empty{
+		width: 100%;
+		height: 100%;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		.record-container{
+			width: 400rpx;
+			height: auto;
+			image{
+				width: 400rpx;
+				height: 400rpx;
+				display: block;
+			}
+			.txt{
+				font-size: $font-size-28;
+				text-align: center;
+				color: #333;
+				line-height: 30rpx;
+				margin-bottom: 20rpx;
+			}
+			.btn{
+				width: 400rpx;
+				height: 80rpx;
+				background: $btn-confirm;
+				border-radius: 10rpx;
+				line-height: 80rpx;
+				font-size: $font-size-28;
+				text-align: center;
+				color: #FFFFFF;
+			}
+		}
+	}
+	.record-list{
+		width: 100%;
+		height: auto;
+		background-color: #F7F7F7;
+		margin-bottom: 24rpx;
+		.record-top{
+			width: 702rpx;
+			padding: 20rpx 24rpx;
+			height: auto;
+			border-bottom: 2px solid #FF9100;
+			background-color: #FFF;
+			.top-view{
+				width: 100%;
+				height: auto;
+				float: left;
+				line-height: 50rpx;
+				font-size: $font-size-28;
+				color: #333333;
+				display: flex;
+				.top-viewlabel{
+					width: 130rpx;
+					margin-right: 10rpx;
+				}
+				.top-viewtext{
+					width:562rpx;
+					height: auto;
+					text{
+						display: inline-block;
+						margin-right: 30rpx;
+					}
+				}
+			}
+		}
+		.goods-pros{
+			width: 702rpx;
+			padding: 0 24rpx;
+			background: #FFFFFF;
+		}	
+		.goods-pros-t{
+			display: flex;
+			width: 100%;
+			height: auto;
+			padding:20rpx 0;
+			.pros-img{
+				width: 210rpx;
+				height: 210rpx;
+				border-radius: 10rpx;
+				margin:0 20rpx;
+				border:1px solid #f3f3f3;
+				margin-left: 0;
+				image{
+					width: 100%;
+					height: 100%;
+					border-radius: 10rpx;
+				}
+			}
+			.pros-product{
+				width: 492rpx;
+				height: 100%;
+				line-height: 36rpx;
+				font-size: $font-size-28;	
+				position: relative;
+				.producttitle{
+					width: 100%;
+					display: inline-block;
+					height: auto;							
+					text-overflow:ellipsis;
+					display: -webkit-box;
+					word-break: break-all;
+					-webkit-box-orient: vertical;
+					-webkit-line-clamp: 2;
+					overflow: hidden;
+					margin-bottom: 8rpx;
+				}
+				.productspec{
+					height: 44rpx;
+					color: #999999;
+					line-height: 44rpx;
+					font-size: $font-size-26;
+				}
+				.product-view{
+					width: 100%;
+					height: auto;
+					display: flex;
+					.view-num{
+						flex: 1;
+						text-align: left;
+						font-size: $font-size-26;
+						color: #666666;
+						line-height: 44rpx;
+					}
+				}
+			}
+		}
+		.goods-pros-b{
+			width:100%;
+			height: auto;
+			padding: 10rpx 0;
+			border-top: 1px solid #F7F7F7;
+			border-bottom: 1px solid #F7F7F7;
+			position: relative;
+			.b-label{
+				width: 100%;
+				line-height: 70rpx;
+				font-size: $font-size-28;
+				color: $text-color;
+			}
+			.b-photo{
+				width: 100%;
+				height: auto;
+				padding: 10rpx 0;
+				.b-imageView{
+					width: 112rpx;
+					height: 112rpx;
+					margin: 0 20rpx 20rpx 0;
+					float: left;
+					image{
+						width: 112rpx;
+						height: 112rpx;
+						display: block;
+					}
+				}
+				.text{
+					line-height: 44rpx;
+					font-size: $font-size-28;
+					color: $text-color;
+				}
+			}
+			.goods-pros-m{
+				width: 100%;
+				height: auto;
+				line-height: 76rpx;
+				font-size: $font-size-26;
+				color: $text-color;
+				float: left;
+				padding: 10rpx 0;
+				border-top: 1px solid #F7F7F7;
+				border-bottom: 1px solid #F7F7F7;
+				.m-text{
+					width: 62rpx;
+					float: left;
+					padding-right: 20rpx;
+					font-weight:bold;
+				}
+				.m-input{
+					display: -webkit-box;
+					display: -webkit-flex;
+					display: flex;
+					-webkit-box-align: center;
+					-webkit-align-items: center;
+					align-items: center;
+					position: relative;
+					width: 620rpx;
+					height: auto;
+					padding: 20rpx 0 10rpx 0;
+					background: #FFFFFF;
+					.text{
+						width: 100%;
+						height: 100%;
+						font-size: $font-size-26;
+						line-height: 36rpx;
+						color: #333333;
+					}
+				}
+			}
+		}
+	}
+</style>

+ 98 - 0
supplier/pages/deliver/logistics-list.vue

@@ -0,0 +1,98 @@
+<template>
+	<view class="container logistics clearfix"> 
+		<view class="list-cell-item" :class="selectID == item.id  ? 'active' : ''" v-for="(item,index) in companyList" :key="item.id" @click="checkLogics(item)">
+			<view class="item-name">{{item.label}}</view>
+			<view class="item-icon" v-show="selectID == item.id"><text class="iconfont icon-gou"></text></view>
+		</view>
+	</view>
+</template>
+<script>
+	import authorize from '@/common/config/authorize.js'
+	import { mapState,mapMutations } from 'vuex';
+	import { queryShoppingCartList,shoppingCartUpdate,shoppingCartDelete } from "@/api/cart.js" 
+	
+	export default{
+		data(){
+			return{
+				CustomBar:this.CustomBar,// 顶部导航栏高度
+				isIphoneX:this.$store.state.isIphoneX,
+				isACtive:false,
+				companyList:[],
+				selectID:'',
+			}
+		},
+		onLoad(option){
+			this.selectID = option.selectID
+			this.initGetLogisticsCompany();
+		},
+		computed: {
+			...mapState(['hasLogin','userInfo'])
+		},
+		methods:{
+			initGetLogisticsCompany(){//查询物流公司列表
+				let params = {userID:this.userID}
+				this.ShopService.GetLogisticsCompany({}).then(response =>{
+					this.companyList = response.data
+				}).catch(error =>{
+					this.$util.msg(error.msg,2000);
+				})
+			},	
+			checkLogics(item){//选择物流
+				uni.setStorageSync('selectLogics',item)
+				var pages = getCurrentPages();
+				var prevPage = pages[pages.length - 2];  //上一个页面	
+					prevPage.setData({select:'select'})
+				uni.navigateBack();
+			}
+		},
+		onPullDownRefresh() {//下拉刷新
+			this.initGetLogisticsCompany()
+			uni.stopPullDownRefresh()
+		},
+		onShow(){
+			
+		},
+	}
+</script>
+
+<style lang="scss">
+	page{
+		background: #f7f7f7;
+		height: auto;
+	}
+	.logistics{
+		width: 702rpx;
+		padding: 0 24rpx;
+		border-top: 1px solid #F7F7F7;
+		background-color: #FFFFFF;
+		.list-cell-item{
+			width: 702rpx;
+			height: 88rpx;
+			line-height: 88rpx;
+			border-bottom: 1px solid #F7F7F7;
+			&.active{
+				.item-name{
+					color: $color-system;
+				}
+				.item-icon{
+					color: $color-system;
+				}
+			}
+			.item-name{
+				float: left;
+				font-size: $font-size-28;
+				color: $text-color;
+			}
+			.item-icon{
+				width:88rpx;
+				height: 88rpx;
+				float: right;
+				line-height: 88rpx;
+				text-align: center;
+				.icon-gou{
+					font-size: $font-size-44;
+				}
+			}
+		}
+	}
+</style>

+ 371 - 0
supplier/pages/login/bind-operator.vue

@@ -0,0 +1,371 @@
+<template>
+	<view class="container login">
+		<view class="login-main">
+			<text class="logo-text">您的微信尚未绑定供应商账号,填写以下资料进行绑定后,您能通过微信快速登录</text>
+		</view>
+		<view class="login-form clearfix">
+			<view class="login-input">
+				<input type="text" 
+					   v-model="bindLinkName"  
+					   maxlength="30" 
+					   class="input" 
+					   placeholder="请输入供应商联系人姓名"
+				/>
+			</view>
+		</view>
+		<view class="login-form clearfix">
+			<view class="login-input">
+				<input type="number" 
+					   v-model="bindLinkPhone"  
+					   maxlength="11" 
+					   class="input" 
+					   placeholder="请输入手机号"
+				/>
+			</view>
+		</view>
+		<view class="login-form clearfix">
+			<view class="login-input code">
+				<input type="text" 
+					   v-model="imageCode"  
+					   maxlength="4" 
+					   class="input" 
+					   placeholder="请输入右侧图形验证码"
+				/>
+			</view>
+			<view class="login-input img-btn">
+				<view class="vscodeimg">
+					<image :src="imageCodeUrl" mode=""></image>
+				</view>
+				<view class="vscod-refresh"  @click.stop="getVerificationCode">
+					<text class="iconfont icon-shuaxin"></text>
+					<text class="ref-text">刷新</text>
+				</view>
+			</view>
+		</view>
+		<view class="login-form clearfix">
+			<view class="login-input code">
+				<input type="number" 
+					   v-model="mobildeCode"  
+					   maxlength="6" 
+					   class="input" 
+					   placeholder="请输入短信验证码"
+				/>
+			</view>
+			<view class="login-input btn" :class="[isMobileDisabled  ? 'disabled' : '']" >
+				<button type="button"
+						@click.stop="getMobileCodeFn"
+						:disabled="isMobileDisabled"
+					    class="input">
+						{{ mobileCodeText }}
+				</button>
+			</view>
+		</view>
+		<view class="login-form clearfix">
+			<view class="login-btn"  @click="bindWechatInfo">绑定</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import { mapState,mapMutations } from 'vuex'
+	import authorize from '@/common/config/authorize.js' 
+	import wxLogin from "@/common/config/wxLogin.js"
+	import { getImageCode, getbindOperatorCode } from "@/api/utils.js"
+	export default{
+		data() {
+			return{
+				shopOrderId:'',
+				userID:'',
+				bindLinkName:'',  		//供应商联系人姓名
+				bindLinkPhone:'',  		//用户手机号
+				mobildeCode:'',  		//手机验证码
+				imageCode:'',			//图形验证码
+				imageCodeUrl:'',		//图形验证码地址
+				imageCodetoken:'',		//图形校验token
+				isMobileDisabled:false, //获取手机短信按钮
+				count: '',				//倒计时
+				mobileCodeText: '获取验证码',
+				codeTime: null,
+				bind_supplierInfo:{}
+			}
+		},
+		onLoad(option) {
+			this.shopOrderId = option.shopOrderId
+			// console.log(this.shopOrderId);
+			this.bind_supplierInfo = uni.getStorageSync('bind_supplierInfo');
+			this.getVerificationCode()
+		},
+		methods:{
+			...mapMutations(['login']),
+			bindWechatInfo(){
+				if( this.bindLinkName == ''){
+					this.$util.msg('请输入姓名',2000)
+					return
+				}
+				if( this.bindLinkPhone == ''){
+					this.$util.msg('请输入手机号',2000)
+					return
+				}
+				if(!this.$reg.isMobile(this.bindLinkPhone)){
+					this.$util.msg('请输入正确的手机号',2000)
+					return
+				}
+				if( this.mobildeCode == ''){
+					this.$util.msg('请输入手机验证码',2000)
+					return
+				}
+				if(!this.$reg.isMobileCode(this.mobildeCode)){
+					this.$util.msg('验证码格式不正确',2000)
+					return
+				}
+				this.bindingWechatLogin()
+			},
+			getVerificationCode(){//图形验证
+				getImageCode().then(res => {
+					this.imageCodeUrl = res.data.baseImage
+					this.imageCodetoken = res.data.token
+				})
+			},
+			getMobileCodeFn(){//获取手机验证码
+				if( this.bindLinkPhone == ''){
+					this.$util.msg('请输入手机号',2000);
+					return
+				}
+				if(!this.$reg.isMobile(this.bindLinkPhone)){
+					this.$util.msg('请输入正确的手机号',2000);
+					return
+				}
+				if( this.imageCode == ''){
+					this.$util.msg('请输入图形验证码',2000);
+					return
+				}
+				let params = {
+						userId:this.bind_supplierInfo.userId,
+						mobile:this.bindLinkPhone,
+						platformType:2,
+						imgCode:this.imageCode,
+						token:this.imageCodetoken,
+					}
+				this.isMobileDisabled = true;
+				getbindOperatorCode(params).then(res =>{
+					const TIME_COUNT = 60;
+					this.$util.msg('验证短信已发送',2000)
+			     	if (!this.codeTime) {
+			       		this.count = TIME_COUNT;
+						this.isMobileDisabled = true;
+			       		this.codeTime = setInterval(() => {
+			       			if (this.count > 1 && this.count <= TIME_COUNT) {
+			         			this.count--
+			         			this.mobileCodeText = this.count +'s重新发送'
+			        		} else {
+				         		this.isMobileDisabled = false;
+				         		clearInterval(this.codeTime)
+				         		this.codeTime = null
+								this.mobileCodeText = '获取验证码'
+			        		}
+			       		},1000)
+			      	}
+				}).catch( error =>{
+					this.$util.msg(error.msg,2000)
+					this.isMobileDisabled = false;
+				})
+			},
+			bindingWechatLogin(){//获取用户基本信息登录
+				wx.getUserInfo({
+					success: res => {
+						this.isUserInfo = false;
+						this.userInfo = res.userInfo;
+						let params ={
+								userID:this.bind_supplierInfo.userId,
+								mobile:this.bindLinkPhone,
+								linkName:this.bindLinkName,
+								verificationCode:this.mobildeCode,
+								nickName:res.userInfo.nickName,
+								headimgurl:res.userInfo.avatarUrl,
+								openid:this.bind_supplierInfo.openid,
+								shopID:this.bind_supplierInfo.shopId,
+								unionId:this.bind_supplierInfo.unionId
+						}
+						this.ShopService.BindShopOperator(params).then(response =>{
+							this.$api.navigateTo(`/supplier/pages/order/order-details?shopOrderId=${this.shopOrderId}`)
+						}).catch(error =>{
+							this.$util.msg(error.msg,2000)
+						})	
+					}
+				})
+			},
+			//关闭未授权用户授权提示弹窗
+			hideModel(){
+				this.isUserInfo = false;
+			}
+		},
+		onShow() {
+			
+		}
+	}
+</script>
+
+<style lang="scss">
+	.login{
+		width: 100%;
+		height: auto;
+		border-top: 1px solid #F7F7F7;
+		.model-warp.none{
+			display: none;			
+		}
+		.model-warp.show{
+			display: block;
+		}
+		.login-main{
+			width: 702rpx;
+			background: rgba(225, 86, 22, 0.1);
+			display: flex;
+			flex-direction: column;
+			align-items: center;
+			height: 68rpx;
+			padding: 20rpx 24rpx;
+			margin: 24rpx 0 118rpx 0;
+			.logo-text{
+				font-size: 24rpx;
+				line-height: 34rpx;
+				color: $color-system;
+			}
+		}
+		.login-form{
+			width: 702rpx;
+			height: auto;
+			padding: 0 24rpx;
+			.login-input{
+				width: 654rpx;
+				height: 40rpx;
+				padding: 24rpx;
+				margin-bottom: 20rpx;
+				background: #F7F7F7;
+				border-radius: 14rpx;
+				display: flex;
+				flex-direction: column;
+				align-items: center;
+				&.code{
+					width: 370rpx;
+					float: left;
+					margin-right: 20rpx;
+				}
+				&.btn{
+					width: 258rpx;
+					height: 88rpx;
+					padding: 0;
+					float: left;
+					background: $btn-confirm;
+					.input{
+						width: 258rpx;
+						height: 88rpx;
+						line-height: 88rpx;
+						padding: 0;
+						border-radius: 14rpx;
+						color: #FFFFFF;
+						background: $btn-confirm;
+					}
+					&.disabled{
+						background: #F7F7F7;
+						.input{
+							background: #F7F7F7;
+							color: #999999;
+						}
+					}
+				}
+				&.img-btn{
+					width: 250rpx;
+					height: 88rpx;
+					padding: 0;
+					float: left;
+					background: #FFFFFF;
+					display: block;
+					.vscodeimg{
+						width: 180rpx;
+						height: 88rpx;
+						float: left;
+						display: flex;
+						flex-direction: column;
+						align-items: center;
+						border-radius: 14rpx;
+						image{
+							width: 180rpx;
+							height: 88rpx;
+							border-radius: 14rpx;
+						}
+					}
+					.vscod-refresh{
+						width: 70rpx;
+						float: right;
+						display: flex;
+						flex-direction: column;
+						align-items: center;
+						.icon-shuaxin{
+							font-size: 48rpx;
+							color: #333333;
+						}
+						.ref-text{
+							font-size: 24rpx;
+							color: #333333;
+						}
+					}
+				}
+				.input{
+					width: 100%;
+					height: 100%;
+					background: #F7F7F7;
+					font-size: $font-size-28;
+					line-height: 40rpx;
+					color: #333333;
+					border-radius: 14rpx;
+				}
+			}
+		}
+		.login-btn{
+			width: 702rpx;
+			height: 88rpx;
+			border-radius: 14rpx;
+			font-size: $font-size-28;
+			line-height: 88rpx;
+			color: #FFFFFF;
+			margin: 0 auto;
+			text-align: center;
+			background: $btn-confirm;
+			margin-top: 100rpx;
+		}
+		.model-authorization{
+			width: 100%;
+			height: 100%;
+			position: fixed;
+			top: 0;
+			left: 0;
+			z-index: 999;
+			.authorization{
+				width: 518rpx;
+				height: 320rpx;
+				position: absolute;
+				background: rgba(255,255,255,.7);
+				left: 0;
+				right: 0;
+				bottom: 0;
+				top: 0;
+				margin: auto;
+				.to-btn{
+					position: absolute;
+					top: 0;
+					left: 0;
+					right: 0;
+					bottom: 0;
+					margin: auto;
+					width: 70%;
+					height: 88rpx;
+					font-size: $font-size-28;
+					line-height: 88rpx;
+					color: #FFFFFF;
+					text-align: center;
+					border-radius: 44rpx;
+				}
+			}
+		}
+	}
+</style>

+ 130 - 0
supplier/pages/login/share-info.vue

@@ -0,0 +1,130 @@
+<template>
+	<view class="container share" v-if="isRequest">
+		<view class="share-empty">
+			<view class="icon"><image :src="imagePath" mode="widthFix"></image></view>
+			<view class="text">暂无权限查看</view>
+		</view>
+	</view>
+</template>
+<script>
+	import authorize from '@/common/config/authorize.js' 
+	import { orderShareCode } from "@/api/order.js" 
+	export default{
+		data() {
+			return{
+				isRequest:false,
+				invitationCode:'',
+				imagePath:'https://admin-b.caimei365.com/userfiles/1/images/photo/2020/06/%E6%97%A0%E6%9D%83%E9%99%90%402x.png',
+				serviceProviderId:'',
+				shopOrderId:null,
+				source:1,
+				shareCode:'',
+				authority:'',//用户权限
+			}
+		},
+		onLoad(option) {
+			// scene 需要使用 decodeURIComponent 才能获取到生成二维码时传入的 scene
+			console.log(option);
+			if(option.scene){
+				this.shopOrderId = Number(decodeURIComponent(option.scene))
+			}else{
+				this.shopOrderId = option.shopOrderId
+				this.authority = option.authority
+				if(this.authority == '2'){
+					this.source = 2
+				}else if(this.authority == '3'){
+					this.source = 3
+				}
+			}
+			authorize.getSetting().then(wxResponse =>{// console.log('是否已授权',res);//0:为取消授权 1:为已授权 2:为未操作
+				if(wxResponse != 1){
+					this.$api.navigateTo('/pages/authorization/authorization?type=4')
+					setTimeout(()=>{
+						this.isRequest = true
+					},2000)
+				}else{
+					this.infoMiniShipments();
+				}
+			})	
+		},
+		methods:{
+			infoMiniShipments(){
+				authorize.getCode('weixin').then(wechatcode =>{
+					authorize.getUserInfo('weixin').then(wxResponse =>{
+						let params = {
+								code:wechatcode,
+								encryptedData:wxResponse.encryptedData,
+								iv:wxResponse.iv,
+								shopOrderId:this.shopOrderId,
+								source:this.source,
+								shareCode:this.shareCode
+						}
+						this.ShopService.MiniShipments(params).then(res =>{
+							switch(res.data.resultCode){
+								case 1:
+									this.shopOrderId = res.data.shopOrderId;
+									this.$api.navigateTo(`/supplier/pages/order/order-service-details?shopOrderId=${this.shopOrderId}`)
+									break;
+								case 2:
+									console.log('供应商联系人');
+									this.$api.navigateTo(`/supplier/pages/order/order-details?shopOrderId=${this.shopOrderId}`)
+									break;
+								case 3:
+									console.log('供应商发货人员');
+									this.$api.navigateTo(`/supplier/pages/order/order-details?shopOrderId=${this.shopOrderId}`)
+									break;
+							}
+						}).catch(err =>{
+							if(this.source == 2){
+								this.$api.setStorage('bind_supplierInfo', err.data)
+								this.$api.navigateTo(`/supplier/pages/login/bind-operator?shopOrderId=${this.shopOrderId}`)
+							}else if(this.source == 3){
+								this.$api.navigateTo(`/supplier/pages/login/share-login?shopOrderId=${this.shopOrderId}`)
+							}else{
+								this.isRequest = true;
+							}
+						})	
+					})
+				})		
+			}
+		},
+		onShow() {
+			authorize.getSetting().then(wxResponse =>{// console.log('是否已授权',res);//0:为取消授权 1:为已授权 2:为未操作
+				if(wxResponse == 1){
+					this.isRequest = false;
+					this.infoMiniShipments();
+				}
+			})	
+		}
+	}
+</script>
+
+<style lang="scss">
+	.share{
+		width: 100%;
+		height:100%;
+		background: #FFFFFF;
+		display: flex;
+		align-items: center;
+		justify-content:center;
+		.share-empty{
+			width: 376rpx;
+			height: 460rpx;
+			.icon{
+				width: 376rpx;
+				height: 400rpx;
+				image{
+					width: 100%;
+					height: 100%;
+					display: block;
+				}
+			}
+			.text{
+				font-size: $font-size-28;
+				line-height: 60rpx;
+				color: $text-color;
+				text-align: center;
+			}
+		}
+	}
+</style>

+ 146 - 0
supplier/pages/login/share-login.vue

@@ -0,0 +1,146 @@
+<template>
+	<view class="container login">
+		<view class="login-main">
+			<image class="logo" src="@/static/login-logo@3x.png" mode=""></image>
+			<text class="logo-text">生美/医美采购服务平台</text>
+		</view>
+		<view class="login-input">
+			<input type="number" 
+				   v-model="shareCode"  
+				   maxlength="6" 
+				   class="input" 
+				   placeholder="请输入邀请码"
+			/>
+		</view>
+		<view class="login-btn"  @click.stop="goLogin">查看订单</view>
+	</view>
+</template>
+<script>
+	import authorize from '@/common/config/authorize.js' 
+	import { orderShareCode } from "@/api/order.js" 
+	export default{
+		data() {
+			return{
+				imagePath:'https://img.caimei365.com/group1/M00/03/83/Cmis214FbbCAQhKoAAKWfqqSIds292.png',
+				shareCode:'',  		//获取用户登录的邀请码
+				isUserInfo:false,	//控制显示授权弹窗
+				nickName:'',		//存储用户名
+				userInfo:'',		//存储微信用户授权信息
+				shopOrderId:0,			//订单ID
+				userID:0			,//分享人的用户ID
+				isShareStatus:false,
+				serviceProviderId:''
+			}
+		},
+		onLoad(option) {
+			this.shopOrderId = option.shopOrderId
+			console.log(this.shopOrderId)
+		},
+		methods:{
+			goLogin() {
+				if(this.shareCode == ''){
+					this.$util.msg('请联系分享人获取分享码',2000);
+					return
+				}
+				if(!this.$api.isNumber(this.shareCode)){
+					this.$util.msg('分享码格式不正确',2000);
+					return
+				}
+				authorize.getCode('weixin').then(wechatcode =>{
+					authorize.getUserInfo('weixin').then(wxResponse =>{
+						let params ={
+								code:wechatcode,
+								encryptedData:wxResponse.encryptedData,
+								iv:wxResponse.iv,
+								shopOrderId:this.shopOrderId,
+								source:3,
+								shareCode:this.shareCode
+							}
+						this.ShopService.MiniShipments(params).then(res =>{
+							if(res.data.resultCode ==3){
+								console.log('供应商发货人员');
+								this.$api.navigateTo(`/supplier/pages/order/order-details?shopOrderId=${this.shopOrderId}`)
+							}
+						}).catch(error =>{
+							this.$util.msg(error.msg,2000);
+						})	
+					})	
+				})
+			},
+		},
+		onShow() {
+			
+		}
+	}
+</script>
+
+<style lang="scss">
+	.login{
+		width: 100%;
+		height:100%;
+		background: #FFFFFF;
+		.model-warp.none{
+			display: none;			
+		}
+		.model-warp.show{
+			display: block;
+		}
+		.login-main{
+			width: 100%;
+			display: flex;
+			flex-direction: column;
+			align-items: center;
+			height: 198rpx;
+			padding: 170rpx 0 90rpx 0;
+			.logo{
+				width: 138rpx;
+				height: 118rpx;
+				display: block;
+			}
+			.logo-text{
+				font-size: 40rpx;
+				line-height: 44rpx;
+				color: $color-system;
+				font-weight: 600;
+				margin-top: 20rpx;
+			}
+		}
+		.login-input{
+			width: 654rpx;
+			height: 40rpx;
+			padding: 24rpx;
+			margin: 0 auto;
+			margin-bottom: 24rpx;
+			background: #F7F7F7;
+			border-radius: 14rpx;
+			.input{
+				width: 100%;
+				height: 100%;
+				background: #F7F7F7;
+				font-size: $font-size-28;
+				line-height: 40rpx;
+				color: #333333;
+				border-radius: 14rpx;
+			}
+		}
+		.login-row{
+			padding: 0 24rpx;
+			font-size: $font-size-28;
+			line-height: 40rpx;
+			color: #E15616;
+			margin-bottom: 48rpx;
+		}
+		.login-btn{
+			width: 702rpx;
+			height: 88rpx;
+			border-radius: 14rpx;
+			font-size: $font-size-28;
+			line-height: 88rpx;
+			color: #FFFFFF;
+			margin: 0 auto;
+			text-align: center;
+			background: $btn-confirm;
+			margin-top: 48rpx;
+		}
+	}
+</style>

+ 486 - 0
supplier/pages/order/order-details.vue

@@ -0,0 +1,486 @@
+<template>
+	<view class="details clearfix" :style="{paddingBottom :isIphoneX ? (130+68)+'rpx' : '130rpx'}">
+		<cu-custom :navbar-data='nvabarData'></cu-custom>
+		<view class="container-details" :style="{paddingTop:CustomBar+'px'}" v-show="isRequest">
+			<!-- 订单信息 -->
+			<view class="information-content">
+				<view class="info-item"><view class="item-view"><text class="label">供应商:{{orderInfo.shopName ? orderInfo.shopName :''}}</text></view></view>
+				<view class="info-item"><view class="item-view"><text class="label">订单号:{{orderInfo.shopOrderNo}}</text></view></view>
+				<view class="info-item"><view class="item-view"><text class="label">下单时间:{{orderInfo.orderTime}}</text></view></view>
+				<view class="info-item">
+					<view class="item-view"><text class="label">收款状态:<text :style="{color:setStatusText(orderInfo.receiptStatus)}">{{setStatusTextHtml(orderInfo.receiptStatus)}}</text></text></view>
+					<view class="item-view"><text class="label">结算状态:<text :style="{color:setStatusText(orderInfo.payStatus)}">{{setStatusTextHtml1(orderInfo.payStatus)}}</text></text></view>
+				</view>
+				<view class="info-item">
+					<view class="item-view"><text class="label">发货状态:<text :style="{color:setStatusText(orderInfo.sendOutStatus)}">{{setStatusTextHtml2(orderInfo.sendOutStatus)}}</text></text></view>
+				</view>
+			</view>
+			<!-- 地址信息 -->
+			<view class="address-content">
+				<view class="info-item"><text class="label">收货人:{{orderInfo.userInfo.shouHuoRen}}</text></view>
+				<view class="info-item"><text class="label">联系方式:{{orderInfo.userInfo.mobile}}</text></view>
+				<view class="info-item"><text class="label">收货地址:<text style="color: #666666;">{{orderInfo.userInfo.address}}</text></text></view>
+			</view>
+			<!-- 商品 -->
+			<view class="goods-list">
+				<view class="goods-item clearfix">
+					<view class="productlist" v-for="(pros,idx) in orderInfo.orderProductList" :key="idx">
+						<view class="goods-pros-t" @click="hanldOperationConfim(pros)">
+							<view class="pros-left">
+								<view class="pros-img"><image :src="pros.productImage" alt="" mode="aspectFill"/></view>
+							</view>
+							<view class="pros-product">
+								<view class="producttitle">{{pros.aliasName ? pros.aliasName : ''}}</view>
+								<view class="productspec">规格:{{pros.productUnit ? pros.productUnit : ''}}</view>
+								<view class="productspec">商品编码:{{pros.productNo ? pros.productNo : ''}}</view>
+								<view class="product-view">
+									<view class="view-num">数量:{{pros.num+pros.presentNum}}</view>
+								</view>
+								<view class="product-view">
+									<view class="view-num">已发货:{{pros.shipmentsNum}}</view>
+									<view class="view-num">未发货:{{pros.notOutStore-pros.actualCancelNum}}</view>
+								</view>
+								<view class="product-view">
+									<view class="view-num" v-if="pros.returnedNum>0">已退货:{{pros.returnedNum}}</view>
+									<view class="view-num" v-if="pros.actualCancelNum>0">已取消:{{pros.actualCancelNum}}</view>
+								</view>
+							</view>	
+						</view>
+					</view>	
+					<view class="goods-pros-m" v-show="orderInfo.note!=null">
+						<view class="m-text">留言:</view>
+						<view class="m-input">
+							<view class="text">{{orderInfo.note ? orderInfo.note : ''}}</view>
+						</view>	
+					</view>
+					<view class="goods-pros-b">
+						<view class="count">共{{orderInfo.itemCount}}件商品</view>
+					</view>
+				</view>
+			</view>
+			<!-- 底部button -->
+			<order-button ref="orderButton" 
+						  v-if= "isRequest" 
+						  :status= "btnStatus" 
+						  :shareCode= "shareCode"
+						   @buttonConfirm="handButtonConfirm">
+			</order-button>
+		</view>
+		<share-alert  :shopOrderID="shopOrderId" 
+					  v-if="isShareModal"  
+					  @shareConfirm ='onShareAppMessage'>
+		</share-alert>		
+	</view>
+</template>
+
+<script>
+	import headerBack from '@/components/cm-module/headerNavbar/header-back' 		 	 //自定义导航
+	import orderAddress from '@/components/cm-module/orderDetails/orderAddress' 		 //地址信息
+	import goodsList from '@/components/cm-module/orderDetails/goodsList'		 		 //商品列表
+	import orderButton from '@/components/cm-module/orderDetails/supplierDetaileButton'	//底部按钮
+	import shareAlert from '@/components/cm-module/modelAlert/supplierShareAlert'	  //分享弹窗
+	import { queryOrderDetails,cancelOrder,deleteOrder,confirmReceipt,affirmOrder } from "@/api/order.js" 
+	export default {
+		components:{
+			headerBack,
+			orderAddress,
+			goodsList,
+			orderButton,
+			shareAlert,
+		},
+		data() {
+			return {
+				nvabarData: {		//顶部自定义导航
+					showCapsule: 1, // 是否显示左上角图标  1表示显示  0表示不显示,
+					showSearch: 0,
+					title: '订单详情', // 导航栏 中间的标题
+					haveBack:false,
+					textLeft:this.$store.state.isIphone
+				},
+				windowHeight: '',
+				isIphoneX:this.$store.state.isIphoneX,
+				CustomBar:this.CustomBar,// 顶部导航栏高度
+				state:0,
+				userID:'',
+				shopOrderId:'',
+				shareCode:'',				//分享码
+				payStatus:0,
+				btnStatus:0,				//按钮组件状态
+				isRequest:false,			//是否加载完成渲染子组件
+				isOrderShare:false,
+				isShareModal:false,
+				orderInfo:{},				//订单信息
+				
+			}
+		},
+		onLoad(option){
+			console.log(option.shopOrderId)
+			this.shopOrderId = option.shopOrderId;
+			this.initShopOrderDetails()
+		},
+		methods: {
+			initShopOrderDetails(){//初始化页面数据@参数:订单ID
+				this.ShopService.GetShopOrderDetails({ shopOrderId : this.shopOrderId }).then(res =>{
+					this.orderInfo  = res.data.shopOrder
+					this.btnStatus = this.orderInfo.sendOutStatus
+					this.isRequest = true
+				}).catch(err =>{
+					this.$util.msg(err.msg,2000);
+				})
+			},
+			handButtonConfirm(data){//监听点击时间的按钮类型并执行...
+				this.handShowAlert(data)
+			},
+			handShowAlert(type){//判断点击的按钮类型并执行...
+				switch(type){
+					case 'record':
+						this.$api.navigateTo('/supplier/pages/deliver/deliver-record?shopOrderId='+this.shopOrderId)
+						break
+					case 'deliver':
+						this.$api.setStorage('shopOrderId',this.shopOrderId)
+						this.$api.navigateTo('/supplier/pages/deliver/deliver-goods')
+						break
+				}
+			},
+			setStatusTextHtml(status){
+				let TextHtml='';
+				switch(status){
+					case '1':
+						TextHtml = '待付款'
+						break;
+					case '2':
+						TextHtml = '部分付款'
+						break;
+					case '3':
+						TextHtml = '已付款'
+						break;
+				}
+				return TextHtml
+			},
+			setStatusTextHtml1(status){
+				let TextHtml='';
+				switch(status){
+					case '1':
+						TextHtml = '待结算'
+						break;
+					case '2':
+						TextHtml = '部分结算'
+						break;
+					case '3':
+						TextHtml = '已结算'
+						break;
+				}
+				return TextHtml
+			},
+			setStatusTextHtml2(status){
+				let TextHtml='';
+				switch(status){
+					case '1':
+						TextHtml = '待发货'
+						break;
+					case '2':
+						TextHtml = '部分发货'
+						break;
+					case '3':
+						TextHtml = '已发货'
+						break;
+				}
+				return TextHtml
+			},
+			setStatusText(status){
+				let textColor='';
+				switch(status){
+					case '1':
+						textColor = '#FF2A2A'
+						break;
+					case '2':
+						textColor = '#E15616'
+						break;
+					case '3':
+						textColor = '#38CB3D'
+						break;
+				}
+				return textColor
+			},
+			onShareCode(){
+				this.isShareModal = true
+			},
+			onShareAppMessage(res){//分享转发
+				this.isShareModal = false
+				if (res.from === 'button') {
+					// 来自页面内转发按钮
+			    }
+				return {
+					title: '您有订单待处理,请点击查看~',
+					path: `/supplier/pages/login/share-info?authority=3&shopOrderId=${this.shopOrderId}`,
+					imageUrl:'https://img.caimei365.com/group1/M00/03/95/Cmis216Sk_SABnOFABZCgCzFV_g063.png'
+				}
+			}
+		},
+		onPullDownRefresh() {//下拉刷新
+			this.initShopOrderDetails()
+			uni.stopPullDownRefresh()
+		},
+		onShow() {
+
+		}
+	}
+</script>
+
+<style lang="scss">
+	page {
+		background:#F7F7F7;
+	}
+	.details{
+		padding-bottom: 130rpx;
+		width: 100%;
+		height: auto;
+	}
+	.container-details{
+		background:#F7F7F7;
+	}
+	.information-content{
+		width: 702rpx;
+		height: auto;
+		padding:10rpx 24rpx;
+		background: #FFFFFF;
+		margin-bottom: 24rpx;
+		.info-item{
+			height: 58rpx;
+			width: 100%;
+			display: flex;
+			.item-view{
+				flex: 1;
+				line-height: 58rpx;
+				font-size: $font-size-28;
+				color: #333333;
+			}
+		}
+	}
+	.address-content{
+		width: 702rpx;
+		height: auto;
+		padding:10rpx 24rpx;
+		background: #FFFFFF;
+		margin-bottom: 24rpx;
+		.info-item{
+			width: 100%;
+			display: flex;
+			line-height: 50rpx;
+			font-size: $font-size-28;
+			color: #333333;
+		}
+	}
+	.goods-list{
+		width: 100%;
+		height: auto;
+		background: #F7F7F7;
+		.goods-item{
+			width: 702rpx;
+			padding:24rpx;
+			height: auto;
+			background: #FFFFFF;
+			margin-bottom: 24rpx;
+			&:last-child{
+				margin-bottom: 0;
+			}
+		}
+		.productlist{
+			width: 100%;
+			height: auto;
+		}	
+		.goods-pros-t{
+			display: flex;
+			width: 100%;
+			height: auto;
+			padding: 12rpx 0;
+			.pros-left{
+				width: 210rpx;
+				height: 100%;
+				margin:0 26rpx 0 0;
+			}
+			.pros-img{
+				width: 210rpx;
+				height: 210rpx;
+				border-radius: 10rpx;
+				border:1px solid #f3f3f3;
+				image{
+					width: 100%;
+					height: 100%;
+					border-radius: 10rpx;
+				}
+			}
+		}
+		.pros-product{
+			width: 468rpx;
+			height: 100%;
+			line-height: 36rpx;
+			font-size: $font-size-26;	
+			position: relative;
+			.icon-genghuan{
+				position: absolute;
+				top: 50%;
+				right: 0;
+				font-size: $font-size-44;
+				color: $color-system;
+			}
+			.product-view{
+				width: 100%;
+				height: auto;
+				display: flex;
+				.view-num{
+					flex: 1;
+					text-align: left;
+					font-size: $font-size-26;
+					color: #666666;
+					line-height: 44rpx;
+				}
+			}
+			.producttitle{
+				width: 100%;
+				display: inline-block;
+				height: auto;							
+				text-overflow:ellipsis;
+				display: -webkit-box;
+				word-break: break-all;
+				-webkit-box-orient: vertical;
+				-webkit-line-clamp: 2;
+				overflow: hidden;
+				margin-bottom: 8rpx;
+			}
+			.productspec{
+				height: 44rpx;
+				color: #666666;
+				line-height: 44rpx;
+			}
+			.productprice{
+				height: 48rpx;
+				position: absolute;
+				width: 100%;
+				bottom: 0;
+				.price{
+					line-height: 48rpx;
+					font-size: $font-size-28;
+					width: 48%;
+					color: #FF2A2A;
+					float: left;
+				}
+				.count{
+					height: 100%;
+					float: right;
+					position: relative;
+					.small{
+						color: #666666;
+					}
+				}
+			}
+		}
+		.goods-pros-m{
+			width: 100%;
+			height: auto;
+			line-height: 76rpx;
+			font-size: $font-size-26;
+			color: $text-color;
+			float: left;
+			padding: 10rpx 0;
+			border-top: 1px solid #F7F7F7;
+			border-bottom: 1px solid #F7F7F7;
+			.m-text{
+				width: 62rpx;
+				float: left;
+				padding-right: 20rpx;
+				font-weight:bold;
+			}
+			.m-input{
+				display: -webkit-box;
+				display: -webkit-flex;
+				display: flex;
+				-webkit-box-align: center;
+				-webkit-align-items: center;
+				align-items: center;
+				position: relative;
+				width: 620rpx;
+				height: auto;
+				padding: 20rpx 0 10rpx 0;
+				background: #FFFFFF;
+				.text{
+					width: 100%;
+					height: 100%;
+					font-size: $font-size-26;
+					line-height: 36rpx;
+					color: #333333;
+				}
+			}
+		}
+		.goods-pros-b{
+			width:100%;
+			height: 40rpx;
+			margin-top: 12rpx;
+			float: left;
+			.count{
+				float: right;
+				font-size: $font-size-28;
+				line-height: 40rpx;
+				color: $text-color;
+				display: flex;
+				justify-content: flex-end;
+			}
+		}
+	}
+	.button-template{
+		width: 100%;
+		height: auto;
+		position: fixed;
+		bottom: 0;
+		left: 0;
+		background: #FFFFFF;
+		.button-content{
+			width: 702rpx;
+			padding:0 24rpx;
+			height: auto;
+			float: left;
+			position: relative;
+			.btn{
+				width: 160rpx;
+				height:  64rpx;
+				margin:22rpx;
+				line-height: 64rpx;
+				font-size:$font-size-26;
+				color: #FFFFFF;
+				text-align: center;
+				border-radius: 10rpx;
+				float: right;
+			}
+			.btn-color{
+				background: $btn-confirm;
+				margin: 22rpx 0 22rpx 22rpx;
+				.tips{
+					width: 160rpx;
+					height: 34rpx;
+					padding: 10rpx 10rpx;
+					background:linear-gradient(45deg,rgba(0,0,0,1) 0%,rgba(87,87,87,1) 100%);
+					box-shadow:0px 2px 4px 0px rgba(0,0,0,0.2);
+					border-radius: 8rpx;
+					position: absolute;
+					color: #FFFFFF;
+					line-height: 34rpx;
+					font-size: $font-size-24;
+					text-align: left;
+					right: 24rpx;
+					top: -45rpx;
+					&:before{
+						content: "";
+						width: 25rpx;
+						height: 25rpx;
+						background:linear-gradient(45deg,rgba(0,0,0,1) 0%,rgba(87,87,87,1) 100%);
+						position: absolute;
+						bottom: -8rpx;
+						right: 30rpx;
+						z-index: -1;
+						transform:rotate(45deg);
+					}
+				}
+			}
+		}
+	}
+</style>

+ 592 - 0
supplier/pages/order/order-service-details.vue

@@ -0,0 +1,592 @@
+<template>
+	<view class="details clearfix" :style="{paddingBottom :isIphoneX ? (130+68)+'rpx' : '130rpx'}">
+		<cu-custom :navbar-data='nvabarData'></cu-custom>
+		<view class="container-details" :style="{paddingTop:CustomBar+'px'}" v-show="isRequest">
+			<!-- 订单信息 -->
+			<view class="information-content">
+				<view class="info-item"><view class="item-view"><text class="label">供应商:{{orderInfo.shopName ? orderInfo.shopName :''}}</text></view></view>
+				<view class="info-item"><view class="item-view"><text class="label">订单号:{{orderInfo.shopOrderNo}}</text></view></view>
+				<view class="info-item"><view class="item-view"><text class="label">下单时间:{{orderInfo.orderTime}}</text></view></view>
+				<view class="info-item">
+					<view class="item-view"><text class="label">收款状态:<text :style="{color:setStatusText(orderInfo.receiptStatus)}">{{setStatusTextHtml(orderInfo.receiptStatus)}}</text></text></view>
+					<view class="item-view"><text class="label">结算状态:<text :style="{color:setStatusText(orderInfo.payStatus)}">{{setStatusTextHtml1(orderInfo.payStatus)}}</text></text></view>
+				</view>
+				<view class="info-item">
+					<view class="item-view"><text class="label">发货状态:<text :style="{color:setStatusText(orderInfo.sendOutStatus)}">{{setStatusTextHtml2(orderInfo.sendOutStatus)}}</text></text></view>
+				</view>
+			</view>
+			<!-- 地址信息 -->
+			<view class="address-content">
+				<view class="info-item"><text class="label">收货人:{{orderInfo.userInfo.shouHuoRen}}</text></view>
+				<view class="info-item"><text class="label">联系方式:{{orderInfo.userInfo.mobile}}</text></view>
+				<view class="info-item"><text class="label">收货地址:<text style="color: #666666;">{{orderInfo.userInfo.address}}</text></text></view>
+			</view>
+			<!-- 商品 -->
+			<view class="goods-list">
+				<view class="goods-item clearfix">
+					<view class="productlist" v-for="(pros,idx) in orderInfo.orderProductList" :key="idx">
+						<view class="goods-pros-t" @click="hanldOperationConfim(pros)">
+							<view class="pros-left">
+								<view class="pros-img"><image :src="pros.productImage" alt="" mode="aspectFill" /></view>
+							</view>
+							<view class="pros-product">
+								<view class="producttitle">{{pros.aliasName ? pros.aliasName : ''}}</view>
+								<view class="productspec">规格:{{pros.productUnit ? pros.productUnit : ''}}</view>
+								<view class="productspec">商品编码:{{pros.productNo ? pros.productNo : ''}}</view>
+								<view class="product-view">
+									<view class="view-num">数量:{{pros.num+pros.presentNum}}</view>
+								</view>
+								<view class="product-view">
+									<view class="view-num">已发货:{{pros.shipmentsNum}}</view>
+									<view class="view-num">未发货:{{pros.notOutStore-pros.actualCancelNum}}</view>
+								</view>
+								<view class="product-view">
+									<view class="view-num" v-if="pros.returnedNum>0">已退货:{{pros.returnedNum}}</view>
+									<view class="view-num" v-if="pros.actualCancelNum>0">已取消:{{pros.actualCancelNum}}</view>
+								</view>
+								<text class="iconfont icon-genghuan"></text>
+							</view>	
+						</view>
+					</view>	
+					<view class="goods-pros-m" v-if="orderInfo.note!=null || orderInfo.note!=''">
+						<view class="m-text">留言:</view>
+						<view class="m-input">
+							<view class="text">{{orderInfo.note ? orderInfo.note : ''}}</view>
+						</view>	
+					</view>
+					<view class="goods-pros-b">
+						<view class="count">共{{orderInfo.itemCount}}件商品</view>
+					</view>
+				</view>
+			</view>	
+			<!-- 底部按钮 -->
+			<view class="button-template" :style="{paddingBottom :isIphoneX ? '68rpx' : '0rpx'}">
+				<view class="button-content">
+					<!-- #ifdef MP-WEIXIN -->
+					<button class="btn btn-color" open-type="share" @click="onShareAppMessage">分享订单</button>
+					<!-- #endif -->
+				</view>
+			</view>
+			<!--底部选择模态层弹窗组件 -->
+			<view class="popup spec" :class="specClass"  @touchmove.stop.prevent="discard" @tap="hideSpec">
+				<!-- 遮罩层 -->
+				<view class="mask"></view>
+				<view class="layer" @tap.stop="discard" :style="{paddingBottom :isIphoneX ? '68rpx' : '36rpx',bottom:isIphoneX ?'-332rpx' : '-294rpx'}">
+					<view class="content">
+						<view class="layer-title">商品显示名:</view>
+						<view class="layer-name">{{handleData.name}}</view>
+						<view class="layer-text">
+							<view class="layer-text-fl">
+								售价:<text style="color: #666;">¥{{toFixedFn(handleData.discountPrice)}}</text>
+							</view>
+							<view class="layer-text-fr">
+								<text style="color: #666;">共计{{handleData.num+handleData.presentNum}}件商品</text>
+							</view>
+						</view>
+					</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import headerBack from '@/components/cm-module/headerNavbar/header-back' 		 	 //自定义导航
+	import orderAddress from '@/components/cm-module/orderDetails/orderAddress' 		 //地址信息
+	import goodsList from '@/components/cm-module/orderDetails/goodsList'		 		 //商品列表
+	import orderButton from '@/components/cm-module/orderDetails/orderButton'			 //底部按钮
+	export default {
+		components:{
+			headerBack,
+			orderAddress,
+			goodsList,
+			orderButton,
+		},
+		data() {
+			return {
+				nvabarData: {		//顶部自定义导航
+					showCapsule: 1, // 是否显示左上角图标  1表示显示  0表示不显示,
+					showSearch: 0,
+					title: '订单详情', // 导航栏 中间的标题
+					haveBack:false,
+					textLeft:this.$store.state.isIphone
+				},
+				isIphoneX:this.$store.state.isIphoneX,
+				CustomBar:this.CustomBar,// 顶部导航栏高度
+				specClass: '',//规格弹窗css类,控制开关动画
+				handleData:{},
+				state:0,
+				userID:'',
+				shopOrderId:'',
+				shareCode:'',				//分享码
+				orderInfo:{},				//订单信息
+				payStatus:0,
+				btnStatus:0,				//按钮组件状态
+				isRequest:false,			//是否加载完成渲染子组件
+				isOrderShare:false,
+				addressData:{},				//地址信息初始化
+				information:{},				//订单信息初始化
+			}
+		},
+		onLoad(option){
+			console.log(option)
+			this.shopOrderId = option.shopOrderId
+			this.initShopOrderDetails()
+		},
+		methods: {
+			initShopOrderDetails(){//初始化页面数据@参数:订单ID
+				this.ShopService.GetShopOrderDetails({ shopOrderId : this.shopOrderId }).then(res =>{
+					this.orderInfo  = res.data.shopOrder
+					this.isRequest = true
+				}).catch(err =>{
+					this.$util.msg(err.msg,2000);
+				})
+			},
+			handButtonConfirm(data){//监听点击时间的按钮类型并执行...
+				this.handShowAlert(data)
+			},
+			setStatusTextHtml(status){
+				let TextHtml='';
+				switch(status){
+					case '1':
+						TextHtml = '待付款'
+						break;
+					case '2':
+						TextHtml = '部分付款'
+						break;
+					case '3':
+						TextHtml = '已付款'
+						break;
+				}
+				return TextHtml
+			},
+			setStatusTextHtml1(status){
+				let TextHtml='';
+				switch(status){
+					case '1':
+						TextHtml = '待结算'
+						break;
+					case '2':
+						TextHtml = '部分结算'
+						break;
+					case '3':
+						TextHtml = '已结算'
+						break;
+				}
+				return TextHtml
+			},
+			setStatusTextHtml2(status){
+				let TextHtml='';
+				switch(status){
+					case '1':
+						TextHtml = '待发货'
+						break;
+					case '2':
+						TextHtml = '部分发货'
+						break;
+					case '3':
+						TextHtml = '已发货'
+						break;
+				}
+				return TextHtml
+			},
+			setStatusText(status){
+				let textColor='';
+				switch(status){
+					case '1':
+						textColor = '#FF2A2A'
+						break;
+					case '2':
+						textColor = '#E15616'
+						break;
+					case '3':
+						textColor = '#38CB3D'
+						break;
+				}
+				return textColor
+			},
+			hanldOperationConfim(data){//显示选择数量确认弹窗
+				this.specClass = 'show';
+				this.handleData = data
+			},
+			toFixedFn(text){
+				return Number(text).toFixed(2);
+			},
+			hideSpec() {//关闭选择数量确认弹窗
+				this.specClass = 'hide';
+				setTimeout(() => {
+					this.specClass = 'none';
+				}, 200);
+			},
+			onShareAppMessage(res){//分享转发
+				if (res.from === 'button') {
+					// 来自页面内转发按钮
+			    }
+				return {
+					title: '您有订单待处理,请点击查看~',
+					path: `/supplier/pages/login/share-info?authority=2&shopOrderId=${this.shopOrderId}`,
+					imageUrl:'https://img.caimei365.com/group1/M00/03/95/Cmis216Sk_SABnOFABZCgCzFV_g063.png'
+				}
+			},
+			discard(){
+				//丢弃
+			}
+		},
+		onPullDownRefresh() {//下拉刷新
+			this.initShopOrderDetails()
+			uni.stopPullDownRefresh()
+		},
+		onShow() {
+
+		}
+	}
+</script>
+
+<style lang="scss">
+	page {
+		height: 100%;
+		background:#F7F7F7;
+	}
+	.details{
+		padding-bottom: 130rpx;
+		width: 100%;
+		height: auto;
+	}
+	.container-details{
+		background:#F7F7F7;
+	}
+	.information-content{
+		width: 702rpx;
+		height: auto;
+		padding:10rpx 24rpx;
+		background: #FFFFFF;
+		margin-bottom: 24rpx;
+		.info-item{
+			height: 58rpx;
+			width: 100%;
+			display: flex;
+			.item-view{
+				flex: 1;
+				line-height: 58rpx;
+				font-size: $font-size-28;
+				color: #333333;
+			}
+		}
+	}
+	.address-content{
+		width: 702rpx;
+		height: auto;
+		padding:10rpx 24rpx;
+		background: #FFFFFF;
+		margin-bottom: 24rpx;
+		.info-item{
+			width: 100%;
+			display: flex;
+			line-height: 50rpx;
+			font-size: $font-size-28;
+			color: #333333;
+		}
+	}
+	.goods-list{
+		width: 100%;
+		height: auto;
+		background: #F7F7F7;
+		.goods-item{
+			width: 702rpx;
+			padding:24rpx;
+			height: auto;
+			background: #FFFFFF;
+			margin-bottom: 24rpx;
+			&:last-child{
+				margin-bottom: 0;
+			}
+		}
+		.productlist{
+			width: 100%;
+			height: auto;
+		}	
+		.goods-pros-t{
+			display: flex;
+			width: 100%;
+			height: auto;
+			padding: 12rpx 0;
+			.pros-left{
+				width: 210rpx;
+				height: 100%;
+				margin:0 26rpx 0 0;
+			}
+			.pros-img{
+				width: 210rpx;
+				height: 210rpx;
+				border-radius: 10rpx;
+				border:1px solid #f3f3f3;
+				image{
+					width: 100%;
+					height: 100%;
+					border-radius: 10rpx;
+				}
+			}
+		}
+		.pros-product{
+			width: 468rpx;
+			height: 100%;
+			line-height: 36rpx;
+			font-size: $font-size-26;	
+			position: relative;
+			.icon-genghuan{
+				position: absolute;
+				top: 50%;
+				right: 0;
+				font-size: $font-size-44;
+				color: $color-system;
+			}
+			.product-view{
+				width: 100%;
+				height: auto;
+				display: flex;
+				.view-num{
+					flex: 1;
+					text-align: left;
+					font-size: $font-size-26;
+					color: #666666;
+					line-height: 44rpx;
+				}
+			}
+			.producttitle{
+				width: 100%;
+				display: inline-block;
+				height: auto;							
+				text-overflow:ellipsis;
+				display: -webkit-box;
+				word-break: break-all;
+				-webkit-box-orient: vertical;
+				-webkit-line-clamp: 2;
+				overflow: hidden;
+				margin-bottom: 8rpx;
+			}
+			.productspec{
+				height: 44rpx;
+				color: #666666;
+				line-height: 44rpx;
+			}
+			.productprice{
+				height: 48rpx;
+				position: absolute;
+				width: 100%;
+				bottom: 0;
+				.price{
+					line-height: 48rpx;
+					font-size: $font-size-28;
+					width: 48%;
+					color: #FF2A2A;
+					float: left;
+				}
+				.count{
+					height: 100%;
+					float: right;
+					position: relative;
+					.small{
+						color: #666666;
+					}
+				}
+			}
+		}
+		.goods-pros-m{
+			width: 100%;
+			height: auto;
+			line-height: 76rpx;
+			font-size: $font-size-26;
+			color: $text-color;
+			float: left;
+			padding: 10rpx 0;
+			border-top: 1px solid #F7F7F7;
+			border-bottom: 1px solid #F7F7F7;
+			.m-text{
+				width: 62rpx;
+				float: left;
+				padding-right: 20rpx;
+				font-weight:bold;
+			}
+			.m-input{
+				display: -webkit-box;
+				display: -webkit-flex;
+				display: flex;
+				-webkit-box-align: center;
+				-webkit-align-items: center;
+				align-items: center;
+				position: relative;
+				width: 620rpx;
+				height: auto;
+				padding: 20rpx 0 10rpx 0;
+				background: #FFFFFF;
+				.text{
+					width: 100%;
+					height: 100%;
+					font-size: $font-size-26;
+					line-height: 36rpx;
+					color: #333333;
+				}
+			}
+		}
+		.goods-pros-b{
+			width:100%;
+			height: 40rpx;
+			margin-top: 12rpx;
+			float: left;
+			.count{
+				float: right;
+				font-size: $font-size-28;
+				line-height: 40rpx;
+				color: $text-color;
+				display: flex;
+				justify-content: flex-end;
+			}
+		}
+	}
+	.button-template{
+		width: 100%;
+		height: auto;
+		position: fixed;
+		bottom: 0;
+		left: 0;
+		background: #FFFFFF;
+		-webkit-border-radius: 20rpx 20rpx 0 0;
+		border-radius: 20rpx 20rpx 0 0;
+		-webkit-box-shadow: 0px 3px 10px rgba(51, 51, 51, 0.5);
+		box-shadow: 0px 3px 10px rgba(51, 51, 51, 0.5);
+		.button-content{
+			width: 702rpx;
+			padding:0 24rpx;
+			height: auto;
+			float: left;
+			position: relative;
+			.btn{
+				width: 160rpx;
+				height:  64rpx;
+				margin:22rpx;
+				line-height: 64rpx;
+				font-size:$font-size-26;
+				color: #FFFFFF;
+				text-align: center;
+				border-radius: 10rpx;
+				float: right;
+			}
+			.btn-color{
+				background: $btn-confirm;
+				margin: 22rpx 0 22rpx 22rpx;
+				.tips{
+					width: 160rpx;
+					height: 34rpx;
+					padding: 10rpx 10rpx;
+					background:linear-gradient(45deg,rgba(0,0,0,1) 0%,rgba(87,87,87,1) 100%);
+					box-shadow:0px 2px 4px 0px rgba(0,0,0,0.2);
+					border-radius: 8rpx;
+					position: absolute;
+					color: #FFFFFF;
+					line-height: 34rpx;
+					font-size: $font-size-24;
+					text-align: left;
+					right: 24rpx;
+					top: -45rpx;
+					&:before{
+						content: "";
+						width: 25rpx;
+						height: 25rpx;
+						background:linear-gradient(45deg,rgba(0,0,0,1) 0%,rgba(87,87,87,1) 100%);
+						position: absolute;
+						bottom: -8rpx;
+						right: 30rpx;
+						z-index: -1;
+						transform:rotate(45deg);
+					}
+				}
+			}
+		}
+	}
+	.popup {
+		position: fixed;
+		top: 0;
+		width: 100%;
+		height: 100%;
+		z-index: 999;
+		display: none;
+		.mask{
+			position: fixed;
+			top: 0;
+			width: 100%;
+			height: 100%;
+			z-index: 21;
+			background-color: rgba(0, 0, 0, 0.6);
+		}
+		.layer {
+			position: fixed;
+			z-index: 22;
+			bottom: -294rpx;
+			width: 702rpx;
+			padding: 24rpx 24rpx 36rpx 24rpx;
+			height: 236rpx;
+			border-radius: 20rpx 20rpx 0 0;
+			background-color: #fff;
+			display: flex;
+			flex-wrap: wrap;
+			align-content: space-between;
+			.content {
+				width: 100%;
+				.layer-title{
+					font-size: $font-size-28;
+					color: $text-color;
+					line-height: 58rpx;
+				}
+				.layer-name{
+					width: 100%;
+					display: inline-block;
+					height: auto;							
+					text-overflow:ellipsis;
+					display: -webkit-box;
+					word-break: break-all;
+					-webkit-box-orient: vertical;
+					-webkit-line-clamp: 2;
+					overflow: hidden;
+					margin-bottom: 8rpx;
+					font-size: $font-size-28;
+					color: #666;
+				}
+				.layer-text{
+					margin-top: 10rpx;
+					font-size: $font-size-28;
+					color: $text-color;
+					line-height: 58rpx;
+					.layer-text-fl{
+						float: left;
+					}
+					.layer-text-fr{
+						float: right;
+					}
+				}
+			}
+		}
+		
+		&.show {
+			display: block;
+			.mask{
+				animation: showPopup 0.2s linear both;
+			}
+			.layer {
+				animation: showLayer 0.2s linear both;
+			}
+		}
+		&.hide {
+			display: block;
+			.mask{
+				animation: hidePopup 0.2s linear both;
+			}
+			
+			.layer {
+				animation: hideLayer 0.2s linear both;
+			}
+		}
+		&.none {
+			display: none;
+		}
+	}	
+</style>

Einige Dateien werden nicht angezeigt, da zu viele Dateien in diesem Diff geändert wurden.