shish 2 лет назад
Родитель
Сommit
261cb70848

+ 365 - 0
ghsApp/src/admin/changePrice/batchChange2.vue

@@ -0,0 +1,365 @@
+<template>
+	<view class="app-content" style="background:white;">
+		<view class="billing_box_bg">
+		<view class="input-wrap">
+				<view style="padding:0upx 0upx 0upx 0upx;margin-right:10upx;" >
+					<button class="admin-button-com middle blue" @click="selectFlowerNumFn()">图片分类</button>
+				</view>
+				<view class="search-bar">
+					<app-search-module v-model="py" placeholder="输入拼音首字母搜索" @input="searchFn"/>
+				</view>
+			</view>
+	
+			<view class="scroll-middle_bx">
+				<scroll-view scroll-y scroll-with-animation class="tab-view" :scroll-top="scrollTop">
+					<div v-for="(item, index) in globalClassItemList" :key="index" class="tab-bar-item" :class="[classIndex == index ? 'active' : '']" :data-current="index" @tap.stop="swichClass(index)">
+						<text style="text-align: center;">{{ item.className || "" }}</text>
+					</div>
+				</scroll-view>
+					<scroll-view scroll-y class="right-box" 
+						:scroll-into-view="scroll_into_view" 
+						scroll-with-animation="true"
+						@scroll="scroll_detail"
+						lower-threshold="100"
+						@scrolltolower="scroll_bottom">
+	
+					<block v-if="!$util.isEmpty(globalClassItemList)">
+						<view class="item_list_bx selectAll" v-for="(classItem, classIndex) in globalClassItemList" :key="classIndex" :id="`class_${classIndex}`">
+							<view class="item_list_title"> {{ classItem.className }} 
+								<text style="float:right;color:#3385FF;margin-right:50upx;font-size:30upx;" @click="getCurrentAll(classIndex)">全选 / 取消</text>
+							</view>
+	
+							<view v-if="classItem.child && !$util.isEmpty(classItem.child)">
+	
+								<template v-for="(productItem, productIndex) in classItem.child">
+									<view style="height:230upx" :id="`class_${classIndex}`" :key="productIndex">
+										<ItemComponent :ref="`item_${productItem.id}`" v-if="classItem.isActive" :isPrice="false" @checkItem="checkItemEvent" :info="productItem"></ItemComponent>
+									</view>
+								</template>
+	
+							</view>
+							<view v-else>
+								<view style="height:260upx;text-align:center;color:#CCCCCC;position: relative;">
+									<view style="position: absolute;margin:auto;top:130upx;left:0;right:0;bottom:0;">暂无花材</view>
+								</view>
+							</view>
+	
+						</view>
+					</block>
+					<block v-else>
+						<view style="width: 100%">
+							<app-wrapper-empty  title="加载中" :is-empty="$util.isEmpty(globalClassItemList)"/>
+						</view>
+					</block>
+	
+				</scroll-view>
+			</view>
+	
+		  <div class="app-footer">
+			<button class="admin-button-com big blue" @click="changeSelectItem()">修改所选花材价格</button>
+		  </div>
+	
+			<uni-popup ref="selectFlowerNumRef" background-color="#fff" type="center" :animation="false" class="class-popup-style">
+				<view style="display:flex;padding:20upx;height:auto;justify-content: space-between;align-items:center;flex-wrap:wrap;max-height:100vh;overflow:auto;">
+	
+					<view v-for="(item, index) in globalClassItemList" :key="index" @tap.stop="changeClass(index)" style="margin-bottom:20upx;margin-left:3upx;">
+					<image :src="item.classCover" style="width:120upx;height:120upx;border-radius:10upx;"></image>
+					<view style="margin-top:5upx;overflow: hidden;white-space: nowrap;width:120upx;text-align:center;">{{item.className}}</view>
+					</view>
+	
+				</view>
+			</uni-popup>
+	
+			<image v-if="showClassRemind" @click="hideClassRemind" style="position:absolute;width:610upx;height:699upx;top:225upx;left:80upx;z-index:9999;" :src="`${constant.imgUrl}/class_remind.png`"></image>
+	
+			<modal-module :show="showClassModel" @cancel="cancelModifyModel" @click="confirmModifyClass" title=" " color="#333" :size="32" padding="30rpx 30rpx" >
+				<template slot="customContent">
+					<view style="padding:30upx 0">
+
+						<view class="module-com input-line-wrap">
+							<tui-list-cell class="line-cell" :arrow="false" :hover="false">
+								<view class="tui-title">大客价</view>
+								<input type="digit" placeholder="请填写大客价" v-model="form.hjPrice" @focus="form.hjPrice=''" placeholder-class="tui-placeholder"/>
+							</tui-list-cell>
+							<tui-list-cell class="line-cell" :arrow="false" :hover="false">
+								<view class="tui-title" style="color:#3385FF;font-weight:bold;">批发价</view>
+								<input type="digit" placeholder="请填写批发价" v-model="form.price" @focus="form.price=''" placeholder-class="tui-placeholder"/>
+							</tui-list-cell>
+							<tui-list-cell class="line-cell" :arrow="false" :hover="false">
+								<view class="tui-title">零售价</view>
+								<input type="digit" placeholder="请填写零售价" v-model="form.skPrice" @focus="form.skPrice=''" placeholder-class="tui-placeholder"/>
+							</tui-list-cell>
+						</view>
+
+					</view>
+				</template>
+			</modal-module>
+
+		</view>
+	</view>
+	</template>
+	<script>
+	import AppSearchModule from "@/components/module/app-search";
+	import AppWrapperEmpty from "@/components/app-wrapper-empty";
+	import ItemComponent from "./components/changeClassItem";
+	import productMins from "@/mixins/product";
+	import { manyItemChangeOnePrice } from "@/api/product";
+	import { mapGetters } from "vuex";
+	import ModalModule from "@/components/plugin/modal";
+	import TuiListCell from "@/components/plugin/list-cell";
+	export default {
+		name: "batchChangePrice",
+		components: {
+			AppSearchModule,
+			AppWrapperEmpty,
+			ItemComponent,
+			ModalModule,
+			TuiListCell
+		},
+		mixins: [productMins],
+		data() {
+			return {
+				autoLoad: false,
+				selectJobType: "batchChangePrice",
+				tabIndex: 0,
+				priceArr:[],
+				showClassRemind:false,
+				currentList:[],
+				showClassModel:false,
+				form:{price:'',hjPrice:'',skPrice:''}
+			};
+		},
+		computed:{
+			...mapGetters(["getMyShopInfo","getLoginInfo"]),
+		},
+		onLoad() {
+			this.initProduct()
+		},
+		methods: {
+			getCurrentAll(index){
+				let that = this
+				let child = this.globalClassItemList[index] && this.globalClassItemList[index].child ? this.globalClassItemList[index].child : []
+				if(!this.$util.isEmpty(child)){
+					child.forEach((item) => {
+						let id = item.id
+						let current = 'item_'+id
+						that.$refs[current][0].checkEvent()
+					})
+				}
+			},
+			changeSelectItem(){
+				let that = this
+				if(this.$util.isEmpty(this.currentList)){
+					this.$msg('请选择花材')
+					return false
+				}
+				this.showClassModel = true
+			},
+			confirmModifyClass(val){
+				if (val.index === 0) {
+					this.cancelModifyModel();
+					return false
+				}
+				let that = this
+				if(this.$util.isEmpty(this.currentList)){
+					this.$msg('请选择花材')
+					return false
+				}
+				if(Number(this.form.price)<=0){
+					this.$msg('请填写批发价')
+					return false;
+				}
+				if(Number(this.form.hjPrice)<=0){
+					this.$msg('请填写大客价')
+					return false;
+				}
+				if(Number(this.form.skPrice)<=0){
+					this.$msg('请填写零售价')
+					return false;
+				}
+				if(Number(this.form.hjPrice) > Number(this.form.price)){
+					this.$msg('大客价不能大于批发价')
+					return false
+				}
+				if(Number(this.form.price) > Number(this.form.skPrice)){
+					this.$msg('批发价不能大于零售价')
+					return false
+				}
+				this.$util.confirmModal({content:'确认修改?'},() => {
+					manyItemChangeOnePrice({ids:JSON.stringify(that.currentList),...that.form}).then(res=>{
+						if(res.code == 1){
+							that.cancelModifyModel()
+							that.$msg(res.msg)
+							that.form.price=''
+							that.form.skPrice=''
+							that.form.hjPrice=''
+							that.initProduct()
+						}
+					})
+				})
+			},
+			cancelModifyModel() {
+				this.showClassModel = false;
+			},
+			checkItemEvent(item,check) {
+				let id = item.id
+				if(check == true){
+					const index = this.currentList.indexOf(id);
+					if (index == -1) {
+						this.currentList.push(id)
+					}
+				}else{
+					const index = this.currentList.indexOf(id);
+					if (index > -1) {
+						this.currentList.splice(index, 1)
+					}
+				}
+			},
+			changeClass(index){
+				this.$refs.selectFlowerNumRef.close()
+				this.swichClass(index)
+			},
+			selectFlowerNumFn(){
+				this.$refs.selectFlowerNumRef.open('top')
+			},
+			initProduct(){
+				this.initData({ requestType:'itemList',status:0,delStatus:0})
+			}
+		}
+	};
+	</script>
+	
+	<style lang="scss" scoped>
+	.billing_box_bg {
+		height: 100%;
+		background: white;
+		display: flex;
+		background:white;
+		flex-direction: column;
+		.input-wrap {
+			display: flex;
+			padding: 22upx 20upx 22upx 13upx;
+			.search-bar {
+				flex: 1;
+			}
+			.city-select {
+				display: flex;
+				flex-shrink: 0;
+				align-items: center;
+				margin-right: 15upx;
+				margin-left: 45upx;
+				background-color: #ffff;
+				.iconfont {
+					margin-left: 20upx;
+					font-size: 30upx;
+				}
+			}
+		}
+		.scroll-middle_bx {
+			flex: 1;
+			display: flex;
+			width: 100%;
+			height: 100%;
+			overflow: hidden;
+		}
+		.tab-view {
+			height: calc(100vh - 140upx);
+			width: 170upx;
+			flex-shrink: 0;
+			background-color: #f0f2f6;
+			.tab-bar-item {
+				position: relative;
+				width: 170upx;
+				height: 90upx;
+				box-sizing: border-box;
+				display: flex;
+				align-items: center;
+				justify-content: center;
+				font-size: 26upx;
+				color: #444;
+				font-weight: 400;
+				.tag {
+					display: flex;
+					padding: 0 20upx;
+					align-items: center;
+					position: absolute;
+					right: 0;
+					top: 0;
+					height: 32upx;
+					background: #ff2842;
+					border-radius: 16upx;
+					color: #fff;
+					font-size: 20upx;
+				}
+		  &:last-child{
+			margin-bottom: 110upx;
+		  }
+			}
+	
+			.active {
+				position: relative;
+				color: $mainColor;
+				font-size: 26upx;
+				background: #fff;
+			}
+	
+			.active::before {
+				content: "";
+				position: absolute;
+				border-left: 8upx solid $mainColor;
+				height: 100%;
+				left: 0;
+			}
+		}
+		.right-box {
+			height: calc(100vh - 230upx);
+			flex: 1;
+			box-sizing: border-box;
+		}
+		.item_list_bx {
+			padding: 40upx 16upx;
+		}
+		.item_list_title {
+			margin-bottom: 20upx;
+			font-size: 24upx;
+			font-weight: 600;
+			color: #666666;
+		}
+		.select-cmd_bx {
+			& .kc {
+				color: #999999;
+				font-size: 28upx;
+				font-weight: 400;
+				margin-bottom: 60upx;
+				text-align: center;
+				margin-top: 10upx;
+			}
+			& .num_bx {
+				display: flex;
+				align-items: center;
+				margin-bottom: 80upx;
+				& > input {
+					width: 212upx;
+					height: 80upx;
+					border: 1upx solid #dddddd;
+					border-radius: 4upx;
+					text-align: center;
+					margin-right: 24upx;
+				}
+			}
+		}
+		.app-footer {
+			justify-content: space-evenly;
+			z-index: 9999;
+			.admin-button-com {
+				width: 60%;
+			}
+			button{
+				width:600upx;
+			}
+		}
+	}
+	.class-popup-style{
+		z-index:999999;
+	}
+	</style>

+ 327 - 0
ghsApp/src/admin/changePrice/components/Item2.vue

@@ -0,0 +1,327 @@
+<template>
+<view class="product">
+	<view class="item-cmd_bx">
+		<button v-if="Number(info.discountPrice)>0" @click.stop="cancelDiscountFn(info)" class="admin-button-com mini-btn blue" 
+			style="position:absolute;bottom:0upx;font-size:24upx;left:10upx;z-index:20;">取消特价</button>
+
+		<button v-if="info.reachNum && info.reachNum>0 && info.reachNumDiscount && info.reachNumDiscount>0" @click.stop="cancelFullOff(info)" class="admin-button-com mini-btn blue" 
+			style="position:absolute;bottom:0upx;font-size:24upx;left:10upx;z-index:40;">取消满减</button>
+
+		<view class="img_bx" @click="pageTo({url: '/admin/item/detail?id='+info.id})">
+			<view v-if="info.status == 2" class="sold-out">
+				<view class="sold-out-xj">已下架</view>
+			</view>
+			<image :src="info.cover" style="width:160upx;height:160upx;" lazy-load="true" :lazy-load-margin="0"></image>
+		</view>
+		<view class="cmd-info_bx" @click="pageTo({url: '/admin/item/detail?id='+info.id})">
+			<view class="tit">
+				<text style="font-size:22upx;border:1upx solid #3385ff;color:white;background-color:#3385ff;margin-right:5upx;padding-left:5upx;padding-right:5upx;" 
+				v-if="frontHide == 1">隐</text>
+				<text style="font-size:22upx;border:1upx solid #3385ff;color:white;background-color:#3385ff;margin-right:5upx;padding-left:5upx;padding-right:5upx;" 
+				v-if="info.presell == 1">预售</text>
+				{{ info.name || "" }}
+				<text v-if="info.variety && info.variety ==1" class="show-color"></text>
+			</view>
+			<text class="hj-price">¥{{ info.hjPrice?parseFloat(info.hjPrice):0 }}</text>
+			<text class="kc">¥{{ info.price?parseFloat(info.price):0 }}</text>
+			<text class="sk-price">¥{{ info.skPrice?parseFloat(info.skPrice):0 }}</text>
+			<view class="num-open_bx">
+				<view>
+					<view class="open-bx" >
+						<view class="hd-price-area">
+							<input class="change-input" @click.stop @blur="savePrice" placeholder-style="color:#CCCCCC" v-model="modifyPrice" type="digit" placeholder="批发价" />
+						</view>
+						<view class="sk-price-area">
+							<input class="change-input" @click.stop @blur="savePrice" placeholder-style="color:#CCCCCC" v-model="skModifyPrice" type="digit" placeholder="零售价" />
+						</view>
+						<view class="hj-price-area">
+							<input class="change-input" @click.stop @blur="savePrice" placeholder-style="color:#CCCCCC" v-model="hjModifyPrice" type="digit" placeholder="大客价" />
+						</view>
+						<text v-if="info.reachNum && info.reachNum>0 && info.reachNumDiscount && info.reachNumDiscount>0" style="position:absolute;top:140upx;right:210upx;color:#3385FF;">
+							{{info.reachNum}}↓{{info.reachNumDiscount?parseFloat(info.reachNumDiscount):0}}
+						</text>
+					</view>
+				</view>
+			</view>
+		</view>
+	</view>
+
+	<view class="level-price">
+		<text>剩余 {{info.stock?parseFloat(info.stock):0}}</text>
+		<text style="position:absolute;left:40upx;">毛利 ¥{{ info.ml ? parseFloat(info.ml) : 0 }}</text>
+		<text style="position:absolute;right:50upx;">成本 ¥{{ parseFloat(info.cost) }}</text>
+	</view>
+
+</view>
+</template>
+<script>
+export default {
+	name: "item",
+	components: {
+	},
+	props: {
+		isPrice: {
+			type: Boolean,
+			default: true
+		},
+		isEdit: {
+			type: Boolean,
+			default: true
+		},
+		info: {
+			required: true
+		}
+	},
+	data() {
+		return {
+			hjModifyPrice:'',
+			modifyPrice:'',
+			skModifyPrice:'',
+			frontHide:0
+		};
+	},
+	watch: {
+		modifyPrice: {
+			handler(newValue) {
+				if(Number(newValue)>0){
+					let skMore = this.info.skMore ? Number(this.info.skMore) : 0
+					let hjAddPrice = this.info.hjAddPrice ? Number(this.info.hjAddPrice) : 0
+					let addPrice = this.info.addPrice ? Number(this.info.addPrice) : 0
+
+					let skAddNum = Number(skMore) - Number(addPrice)
+					skAddNum = skAddNum.toFixed(2)
+					let skAmount = Number(skAddNum) + Number(newValue)
+					if(skAmount>0){
+						skAmount = skAmount.toFixed(2)
+						skAmount = parseFloat(skAmount)
+						this.skModifyPrice = skAmount
+					}else{
+						this.skModifyPrice = ''
+					}
+
+					let hjSubNum = Number(addPrice) - Number(hjAddPrice)
+					hjSubNum = hjSubNum.toFixed(2)
+					let hjAmount = Number(newValue) - Number(hjSubNum)
+					if(hjAmount > 0){
+						hjAmount = hjAmount.toFixed(2)
+						hjAmount = parseFloat(hjAmount)
+						this.hjModifyPrice = hjAmount
+					}else{
+						this.hjModifyPrice = ''
+					}
+				}else{
+					this.skModifyPrice = ''
+					this.hjModifyPrice = ''
+				}
+			}
+		}
+	},
+	mounted(){
+		if(this.info){
+			this.frontHide = this.info.frontHide
+		}
+	},
+	methods: {
+		hideChangeFn(item,status){
+			this.$emit("hideChangeFn",item,status)
+		},
+		cancelPreSellFn(item){
+			this.$emit("cancelPreSellFn",item)
+		},
+		cancelFullOff(item){
+			this.$emit("cancelFullOff",item)
+		},
+		cancelDiscountFn(item){
+			this.$emit("cancelDiscountFn",item)
+		},
+		savePrice() {
+			if(Number(this.modifyPrice)>0 && Number(this.skModifyPrice) > 0 && Number(this.hjModifyPrice) > 0){
+				this.$emit("savePrice",this.modifyPrice,this.skModifyPrice,this.hjModifyPrice,this.info.id,1)
+			}else{
+				this.$emit("savePrice",this.modifyPrice,this.skModifyPrice,this.hjModifyPrice,this.info.id,0)
+			}
+		}
+	}
+};
+</script>
+<style lang="scss" scoped>
+.product{
+	height:230upx;
+	.level-price{
+		display:flex;
+		color:#CCCCCC;
+		text-align: right;
+		font-size:24upx;
+		justify-content:space-around;
+	}
+}
+.item-cmd_bx {
+	height:160upx;
+	position: relative;
+	margin-bottom: 20upx;
+	.img_bx {
+		height: 160upx;
+		width: 160upx;
+		position: absolute;
+		left: 0upx;
+		top: 0upx;
+		.sold-out{
+			z-index:10;
+			width:160upx;
+			height:160upx;
+			background-color:black;
+			position:absolute;
+			top:0;
+			left:0;
+			opacity: 0.6;
+			color:white;
+			text-align:center;
+			.sold-out-xj{
+				line-height:160upx;
+				font-size:28upx;
+			}
+		}
+	}
+	.cmd-info_bx {
+		position: relative;
+		padding-left: 177upx;
+		&.active{
+			&:before{
+				content: ' ';
+				height: 22upx;
+				width: 22upx;
+				border-width: 2upx 2upx 0 0;
+				border-color: #b2b2b2;
+				border-style: solid;
+				-webkit-transform: matrix(0.5, 0.5, -0.5, 0.5, 0, 0);
+				transform: matrix(0.5, 0.5, -0.5, 0.5, 0, 0);
+				position: absolute;
+				top: 50%;
+				margin-top: -12upx;
+				right: 30upx;
+			}
+		}
+		& .tit {
+			font-size: 30upx;
+			font-weight: bold;
+			color: #333333;
+			padding-top: 0upx;
+			overflow: hidden;
+			white-space: nowrap;
+			text-overflow: ellipsis;
+			width:360upx;
+			.show-color{
+				display:inline-block;
+				width:25upx;
+				height:25upx;
+				background-color:rgb(9, 199, 9);
+				border-radius:15upx;
+				border:none;
+				margin-left:15upx;
+			}
+		}
+		& .hj-price{
+			color:green;
+			position: absolute;
+			top:48upx;
+			left:171upx;
+		}
+		& .kc {
+			color:red;
+			font-size:28upx;
+			font-weight:bold;
+			position: absolute;
+			top:86upx;
+			left:171upx;
+		}
+		& .sk-price{
+			color:#333333;
+			position: absolute;
+			top:130upx;
+			left:171upx;
+		}
+		& .num-open_bx {
+			display: flex;
+			align-items: center;
+			& .price {
+				font-size: 30upx;
+				color: red;
+				flex: 1;
+			}
+			& .open-bx {
+				color:#999999;
+				width:300upx;
+				text{
+					font-size: 24upx;
+				}
+				*.warn {
+					color: $redColor;
+				}
+				.hd-price-area{
+					width:180upx;
+					position: absolute;
+					top:37upx;
+					right:-30upx;
+					.change-input {
+						width: 150upx;
+						height: 60upx;
+						line-height: 60upx;
+						text-align: center;
+						background: #ffffff;
+						border: 1upx solid #b4b4b4;
+						border-radius: 4upx;
+						font-size: 25upx;
+						color:#777777;
+						display:inline-block;
+					}
+					.change-text{
+						font-size:22upx;
+					}
+				}
+				.sk-price-area{
+					width:180upx;
+					position: absolute;
+					top:115upx;
+					right:-30upx;
+					.change-input {
+						width: 150upx;
+						height: 60upx;
+						line-height: 60upx;
+						text-align: center;
+						background: #ffffff;
+						border: 1upx solid #b4b4b4;
+						border-radius: 4upx;
+						font-size: 25upx;
+						color:#777777;
+						display:inline-block;
+					}
+					.change-text{
+						font-size:22upx;
+					}
+				}
+				.hj-price-area{
+					width:130upx;
+					position: absolute;
+					top:75upx;
+					right:150upx;
+					.change-input {
+						width: 120upx;
+						height: 60upx;
+						line-height: 60upx;
+						text-align: center;
+						background: #ffffff;
+						border: 1upx solid #b4b4b4;
+						border-radius: 4upx;
+						font-size: 25upx;
+						color:#777777;
+						display:inline-block;
+					}
+					.change-text{
+						font-size:22upx;
+					}
+				}
+			}
+		}
+	}
+}
+</style>

+ 383 - 0
ghsApp/src/admin/changePrice/list2.vue

@@ -0,0 +1,383 @@
+<template>
+<view class="app-content" style="background:white;">
+	<view class="billing_box_bg">
+    <view class="input-wrap">
+			<view style="padding:0upx 0upx 0upx 0upx;margin-right:10upx;" >
+				<button class="admin-button-com middle blue" @click="selectFlowerNumFn()">图片分类</button>
+			</view>
+			<view class="search-bar">
+				<app-search-module v-model="py" placeholder="输入拼音首字母搜索" @input="searchFn"/>
+			</view>
+			<view style="padding:0 0upx 0 20upx;" >
+				<button class="admin-button-com middle blue" @click="downloadTable()">价格表</button>
+			</view>
+		</view>
+
+		<view class="scroll-middle_bx">
+			<scroll-view scroll-y scroll-with-animation class="tab-view" :scroll-top="scrollTop">
+				<div v-for="(item, index) in globalClassItemList" :key="index" class="tab-bar-item" :class="[classIndex == index ? 'active' : '']" :data-current="index" @tap.stop="swichClass(index)">
+					<text style="text-align: center;">{{ item.className || "" }}</text>
+				</div>
+			</scroll-view>
+				<scroll-view scroll-y class="right-box" 
+					:scroll-into-view="scroll_into_view" 
+					scroll-with-animation="true"
+					@scroll="scroll_detail"
+					lower-threshold="100"
+					@scrolltolower="scroll_bottom">
+
+				<block v-if="!$util.isEmpty(globalClassItemList)">
+					<view class="item_list_bx selectAll" v-for="(classItem, classIndex) in globalClassItemList" :key="classIndex" :id="`class_${classIndex}`">
+						<view class="item_list_title"> {{ classItem.className }}</view>
+
+						<view v-if="classItem.child && !$util.isEmpty(classItem.child)">
+
+							<template v-for="(productItem, productIndex) in classItem.child">
+								<view style="height:230upx" :id="`class_${classIndex}`" :key="productIndex">
+									<ItemComponent v-if="classItem.isActive" :isPrice="false" :info="productItem" @hideChangeFn="hideChangeFn" :ref="`productRef${productItem.id}`"
+									@savePrice="savePrice" @cancelDiscountFn="cancelDiscountFn" @cancelFullOff="cancelFullOff" @cancelPreSellFn="cancelPreSellFn"></ItemComponent>
+								</view>
+							</template>
+
+						</view>
+						<view v-else>
+							<view style="height:260upx;text-align:center;color:#CCCCCC;position: relative;">
+								<view style="position: absolute;margin:auto;top:130upx;left:0;right:0;bottom:0;">暂无花材</view>
+							</view>
+						</view>
+
+					</view>
+				</block>
+				<block v-else>
+					<view style="width: 100%">
+						<app-wrapper-empty  title="加载中" :is-empty="$util.isEmpty(globalClassItemList)"/>
+					</view>
+				</block>
+
+			</scroll-view>
+		</view>
+
+      <div class="app-footer">
+		<button class="admin-button-com big default" @click="goBatchChange">批量修改</button>
+        <button class="admin-button-com big blue" style="width:40vw;" @click="commitPrice">保存修改</button>
+      </div>
+
+		<uni-popup ref="selectFlowerNumRef" background-color="#fff" type="center" :animation="false" class="class-popup-style">
+			<view style="display:flex;padding:20upx;height:auto;justify-content: space-between;align-items:center;flex-wrap:wrap;max-height:100vh;overflow:auto;">
+
+				<view v-for="(item, index) in globalClassItemList" :key="index" @tap.stop="changeClass(index)" style="margin-bottom:20upx;margin-left:3upx;">
+				<image :src="item.classCover" style="width:120upx;height:120upx;border-radius:10upx;"></image>
+				<view style="margin-top:5upx;overflow: hidden;white-space: nowrap;width:120upx;text-align:center;">{{item.className}}</view>
+				</view>
+
+			</view>
+		</uni-popup>
+
+		<image v-if="showClassRemind" @click="hideClassRemind" style="position:absolute;width:610upx;height:699upx;top:225upx;left:80upx;z-index:9999;" :src="`${constant.imgUrl}/class_remind.png`"></image>
+
+	</view>
+</view>
+</template>
+<script>
+import AppSearchModule from "@/components/module/app-search";
+import AppWrapperEmpty from "@/components/app-wrapper-empty";
+import ItemComponent from "./components/Item2";
+import productMins from "@/mixins/product";
+import { mapGetters } from "vuex";
+import { batchChangePrice,generatePriceTable,cancelDiscountPrice,cancelFullOffFn,cancelPreSell } from '@/api/product'
+import { changeFrontHide } from '@/api/item'
+export default {
+	name: "item_list",
+	components: {
+		AppSearchModule,
+		AppWrapperEmpty,
+		ItemComponent
+	},
+	mixins: [productMins],
+	data() {
+		return {
+			autoLoad: false,
+			selectJobType: "stock",
+			tabIndex: 0,
+			priceList:[],
+			showClassRemind:false
+		};
+	},
+	computed:{
+		...mapGetters(["getMyShopInfo","getLoginInfo"]),
+	},
+	onLoad() {
+		this.initProduct()
+	},
+	methods: {
+		goBatchChange(){
+			this.$util.pageTo({url: '/admin/changePrice/batchChange'})
+		},
+		hideChangeFn(item,status){
+			let that = this
+			changeFrontHide({id:item.id,status:status}).then(res=>{
+				if(res.code == 1){
+					that.$refs[`productRef${item.id}`][0].frontHide = status
+				}
+			})
+		},
+		changeClass(index){
+			this.$refs.selectFlowerNumRef.close()
+			this.swichClass(index)
+		},
+		selectFlowerNumFn(){
+			this.$refs.selectFlowerNumRef.open('top')
+		},
+		hideClassRemind(){
+
+		},
+		cancelPreSellFn(item){
+			let that = this
+			this.$util.confirmModal({content:'确认取消预售?'},() => {
+				cancelPreSell({id:item.id}).then(res=>{
+					if(res.code == 1){
+						that.$msg(res.msg)
+					}
+				})
+			})
+		},
+		cancelFullOff(item){
+			let that = this
+			this.$util.confirmModal({content:'确认取消满减?'},() => {
+				cancelFullOffFn({id:item.id}).then(res=>{
+					if(res.code == 1){
+						that.$msg(res.msg)
+					}
+				})
+			})
+		},
+		cancelDiscountFn(item){
+			let that = this
+			this.$util.confirmModal({content:'确认取消特价?'},() => {
+				cancelDiscountPrice({id:item.id}).then(res=>{
+					if(res.code == 1){
+						that.$msg(res.msg)
+					}
+				})
+			})
+		},
+		downloadTable(){
+			let level = 0
+			let levelList = ['零售价', '批发价']
+			uni.showActionSheet({
+				itemList: levelList,
+				success: function (respond) {
+					level = respond.tapIndex
+					uni.showLoading({title:'下载中',mask:true})
+					generatePriceTable({level:level}).then(res => {
+						if(res.code == 1){
+							uni.hideLoading()
+							let file = res.data.file
+							let shortFile = res.data.shortFile
+							uni.downloadFile({
+								url: file,
+								header: {"Content-Type": 'application/vnd.ms-excel'},
+								filePath: `${wx.env.USER_DATA_PATH}/${shortFile}`,
+								success: (res) => {
+									if (res.statusCode === 200) {
+										wx.saveFileToDisk({
+											filePath: res.filePath,
+											success: function(res) {
+												console.log(res)
+											},
+											fail:function(res) {
+												console.log(res)
+											}
+										})
+									}
+								},
+								fail:()=>{
+									uni.showToast({title:'请用电脑打开小程序下载',mask:true,icon:'none'})
+								}
+							});
+						}					
+					})
+				}
+			})
+		},
+		initProduct(){
+			this.shopId = this.getMyShopInfo.id;
+			let type = '';
+			this.initData({ type, shopId: this.shopId,status:0,requestType:'changePrice'});
+		},
+		commitPrice(){
+			let that = this
+			if(this.priceList.length == 0){
+				this.$msg('没有修改')
+				return;
+			}
+			this.$util.confirmModal({content:'确认修改?'},() => {
+				that.commitChange()
+			})
+		},
+		commitChange(){
+			let data = JSON.stringify(this.priceList);
+			batchChangePrice({data:data,appVersion:1}).then(res => {
+					if(res.code == 1){
+						this.priceList = [];
+						this.initProduct()
+					}
+					uni.showToast({ title: '修改成功', icon: 'success', })
+				})
+		},
+		savePrice(price,skPrice,hjPrice,id,status){
+			if(this.priceList.length > 0){
+				this.priceList.forEach(function(value,index,array){
+					if(value.id == id){
+						array.splice(index,1)
+					}
+				});
+			}
+			if(status == 1){
+				this.priceList.push({id:id,price:price,skPrice:skPrice,hjPrice:hjPrice})
+			}
+		},
+		affirm(val) {
+			if (val.index === 0) {
+				this.modalCancel();
+			}
+		},
+		scrollTop() {},
+		initProductInfo() {
+			this.globalClassItemListContrapose = [];
+			this.page = 1;
+			this.isMore = true;
+		}
+	}
+};
+</script>
+
+<style lang="scss" scoped>
+.billing_box_bg {
+	height: 100%;
+	background: white;
+	display: flex;
+	background:white;
+	flex-direction: column;
+	.input-wrap {
+		display: flex;
+		padding: 22upx 20upx 22upx 13upx;
+		.search-bar {
+			flex: 1;
+		}
+		.city-select {
+			display: flex;
+			flex-shrink: 0;
+			align-items: center;
+			margin-right: 15upx;
+			margin-left: 45upx;
+			background-color: #ffff;
+			.iconfont {
+				margin-left: 20upx;
+				font-size: 30upx;
+			}
+		}
+	}
+	.scroll-middle_bx {
+		flex: 1;
+		display: flex;
+		width: 100%;
+		height: 100%;
+		overflow: hidden;
+	}
+	.tab-view {
+		padding-bottom:100upx;
+		height: calc(100vh - 140upx);
+		width: 170upx;
+		flex-shrink: 0;
+		background-color: #f0f2f6;
+		.tab-bar-item {
+			position: relative;
+			width: 170upx;
+			height: 90upx;
+			box-sizing: border-box;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+			font-size: 26upx;
+			color: #444;
+			font-weight: 400;
+			.tag {
+				display: flex;
+				padding: 0 20upx;
+				align-items: center;
+				position: absolute;
+				right: 0;
+				top: 0;
+				height: 32upx;
+				background: #ff2842;
+				border-radius: 16upx;
+				color: #fff;
+				font-size: 20upx;
+			}
+      &:last-child{
+        margin-bottom: 110upx;
+      }
+		}
+
+		.active {
+			position: relative;
+			color: $mainColor;
+			font-size: 26upx;
+			background: #fff;
+		}
+
+		.active::before {
+			content: "";
+			position: absolute;
+			border-left: 8upx solid $mainColor;
+			height: 100%;
+			left: 0;
+		}
+	}
+	.right-box {
+		height: calc(100vh - 200upx);
+		flex: 1;
+		box-sizing: border-box;
+	}
+	.item_list_bx {
+		padding: 40upx 16upx;
+	}
+	.item_list_title {
+		margin-bottom: 20upx;
+		font-size: 24upx;
+		font-weight: 600;
+		color: #666666;
+	}
+	.select-cmd_bx {
+		& .kc {
+			color: #999999;
+			font-size: 28upx;
+			font-weight: 400;
+			margin-bottom: 60upx;
+			text-align: center;
+			margin-top: 10upx;
+		}
+		& .num_bx {
+			display: flex;
+			align-items: center;
+			margin-bottom: 80upx;
+			& > input {
+				width: 212upx;
+				height: 80upx;
+				border: 1upx solid #dddddd;
+				border-radius: 4upx;
+				text-align: center;
+				margin-right: 24upx;
+			}
+		}
+	}
+	.app-footer {
+		justify-content: space-evenly;
+		z-index: 9999;
+	}
+}
+.class-popup-style{
+	z-index:999999;
+}
+</style>

+ 1 - 1
ghsApp/src/admin/home/apply.vue

@@ -35,7 +35,7 @@ export default {
                     list:[
                         {name: "花材",img: `${this.$constant.imgUrl}/ghs/home/hcgl.png`,url: "/admin/item/list"},
                         {name: "分类",img: `${this.$constant.imgUrl}/ghs/home/hcgl.png`,url: "/admin/itemClass/list"},
-                        {name: "改价",img: `${this.$constant.imgUrl}/ghs/home/gj.png`,url: "/admin/changePrice/list"},
+                        {name: "改价",img: `${this.$constant.imgUrl}/ghs/home/gj.png`,url: "/admin/changePrice/list2"},
                         {name: "批量改价",img: `${this.$constant.imgUrl}/ghs/home/gj.png`,url:"/admin/changePrice/batchChange"},
                         {name: "批量移动",img: `${this.$constant.imgUrl}/ghs/home/hcgl.png`,url: "/admin/changePrice/changeClass"},
                         {name: "加价管理",img: `${this.$constant.imgUrl}/ghs/home/hcgl.png`,url: "/admin/itemClass/add"},

+ 3 - 1
ghsApp/src/pages.json

@@ -124,6 +124,7 @@
 			"root": "admin/changePrice",
 			"pages": [
 				{"path": "list","style": {"navigationBarTitleText": "改价"}},
+				{"path": "list2","style": {"navigationBarTitleText": "改价"}},
 				{"path": "changeStock","style": {"navigationBarTitleText": "修改库存"}},
 				{"path": "changeList","style": {"navigationBarTitleText": "价格变动记录"}},
 				{"path": "costChangeList","style": {"navigationBarTitleText": "成本变动记录"}},
@@ -132,7 +133,8 @@
 				{"path": "removeList","style": {"navigationBarTitleText": "彻底删除"}},
 				{"path": "changeClass","style": {"navigationBarTitleText": "批量移动"}},
 				{"path": "setSon","style": {"navigationBarTitleText": "设置子花材"}},
-				{"path": "batchChange","style": {"navigationBarTitleText": "批量改价"}}
+				{"path": "batchChange","style": {"navigationBarTitleText": "批量改价"}},
+				{"path": "batchChange2","style": {"navigationBarTitleText": "批量改价"}}
 			]
 		},
 		{