shish преди 6 месеца
родител
ревизия
069dc37c7d

+ 5 - 0
ghsApp/src/admin/item/detail.vue

@@ -324,6 +324,7 @@
 				<view style="width:100vw;margin-top:8upx;"><button @click="orderRecord(productData)">下单记录</button></view>
 				<view style="width:100vw;margin-top:8upx;"><button @click="copyCreate(productData)">复制新建</button></view>
 				<view style="width:100vw;margin-top:8upx;"><button @click="onStockChange(productData)">路上库存变动</button></view>
+        <view style="width:100vw;margin-top:8upx;"><button @click="moreColor(productData)">多颜色</button></view>
 				<view style="width:100vw;margin-top:8upx;" v-if="productData.delStatus == 0"><button @click="changeDelStatus(productData,1)">删除</button></view>
         <view style="width:100vw;margin-top:8upx;" v-if="productData.delStatus == 1"><button @click="changeDelStatus(productData,0)">取消删除</button></view>
 				<view style="width:100vw;margin-top:30upx;"><button @click="closeMoreDoPop()">取消</button></view>
@@ -695,6 +696,10 @@ export default {
 			this.closeMoreDoPop()
 			this.pageTo({url: '/pagesStorehouse/stockWarn/onStockChange?id='+info.id+'&name='+info.name})
 		},
+    moreColor(info){
+			this.closeMoreDoPop()
+			this.pageTo({url: '/admin/item/xjSelect?itemId='+info.id})
+    },
     goPart(){
       this.closeMoreDoPop()
       this.partShow = true

+ 14 - 29
ghsApp/src/admin/item/xj.vue

@@ -2,9 +2,9 @@
 <view class="app-content">
 	<view class="billing_box_bg">
     	<view class="input-wrap">
-			<text style="margin-right:30upx;">库存:{{stock}}扎</text>
-			单价:<input @focus="option.price=''" style="border:1upx solid #CCC;width:160upx;margin-right:40upx;" placeholder-style="color:#CCCCCC" v-model="option.price" type="digit" placeholder="请填写" />
-			<button class="admin-button-com mini-btn blue" @click="goChange()">修改库存</button>
+			<text style="margin-right:30upx;">{{stock}}扎</text>
+			单价:<input @focus="option.price=''" style="border:1upx solid #CCC;width:110upx;margin-right:40upx;height:70upx;" placeholder-style="color:#CCCCCC" v-model="option.price" type="digit" placeholder="" />
+			<button class="admin-button-com middle blue" @click="goChange()">修改库存</button>
 		</view>
 		<view class="scroll-middle_bx">
 			<block>
@@ -34,7 +34,7 @@
 		<div class="app-footer footer-button">
 			<button class="admin-button-com big blue" @click="clearXj()">清除全部</button>
 			<button class="admin-button-com big blue" @click="goBack()" style="margin-left:58upx;padding:30upx 55upx 30upx 55upx;">返回</button>
-			<button class="admin-button-com big blue" @click="confirmXj()" style="margin-left:58upx;padding:30upx 65upx; 30upx 65upx;" >确认</button>
+			<button class="admin-button-com big blue" @click="confirmXj()" style="margin-left:58upx;padding:30upx 65upx 30upx 65upx;" >确认</button>
 		</div>
 
 	</view>
@@ -81,9 +81,6 @@ export default {
 	},
 	onPullDownRefresh() {
 	},
-	onShow(){
-		this.init()
-	},
 	methods: {
 		goChange(){
 			let productId = this.option.productId ? this.option.productId : 0
@@ -191,24 +188,12 @@ export default {
 	background: white;
 	flex-direction: column;
 	.input-wrap {
-		font-size:30upx;
+		font-size:49upx;
+		font-weight: normal;
 		display: flex;
-		padding: 22upx 20upx 22upx 30upx;
-		.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;
-			}
-		}
+		padding: 22upx 0upx 22upx 20upx;
+		border-bottom: 1upx solid #dddddd;
+		margin-bottom:20upx;
 	}
 	.scroll-middle_bx {
 		margin-bottom:110upx;
@@ -363,15 +348,15 @@ export default {
 	}
 }
 .change-input {
-	width: 285upx;
-	height: 60upx;
-	line-height: 60upx;
+	width: 260upx;
+	height: 70upx;
+	line-height: 70upx;
 	text-align: center;
 	background: #ffffff;
 	border: 1upx solid #b4b4b4;
 	border-radius: 4upx;
-	font-size: 25upx;
-	color:#5e5d5d;
+	font-size: 27upx;
+	color:#1d1d1d;
 	position: relative;
 	left:120upx;
 	top:-36upx;

+ 4 - 4
ghsApp/src/admin/item/xjSelect.vue

@@ -23,7 +23,7 @@
 							</div>
 						</div>
 						<view style="text-align:center;">
-							<button class="admin-button-com big blue" style="width:95%;" formType="submit">全部提交</button>
+							<button class="admin-button-com big blue" style="width:95%;" formType="submit">添加</button>
 						</view>
 					</block>
 				</div>
@@ -45,7 +45,7 @@
 										<view class="tit">
 										{{ xjItem.name || "" }}
 										<text @click="delXj(xjItem)" style="color:#3385ff;margin-left:35upx;font-size:30upx;">删除</text>
-										<text @click="changeNameFn(xjItem)" style="color:#3385ff;margin-left:35upx;font-size:30upx;">修改</text>
+										<text @click="changeNameFn(xjItem)" style="color:#3385ff;margin-left:35upx;font-size:30upx;">修改名称</text>
 										</view>
 										<view class="kc"></view>
 										<view class="num-open_bx">
@@ -66,7 +66,7 @@
 			</view>
 		</view>
 		<view class="app-footer" v-if="variety ==1">
-			<button class="admin-button-com big default" @click="clearXj">清空花材</button>
+			<button class="admin-button-com big default" @click="clearXj">删除全部花材</button>
 			<button class="admin-button-com big blue" style="margin-left:40upx;" @click="goBack()">返回列表</button>
 			<button class="admin-button-com big blue" style="margin-left:40upx;" @click="saveAllItemNum()">保存修改</button>
 		</view>
@@ -224,7 +224,7 @@ export default {
 		},
 		clearXj(){
 			let that = this
-			that.$util.confirmModal({content:'确认清空全部?'},() => {
+			that.$util.confirmModal({content:'确认删除全部?'},() => {
 				clearAll({itemId:this.option.itemId}).then(res => {
 					that.$msg(res.msg)
 					if(res.code == 1){

+ 5 - 0
ghsPad/src/api/xj/index.js

@@ -0,0 +1,5 @@
+import https from '@/plugins/luch-request_0.0.7/request'
+
+export const getSjXj = data => {
+	return https.get('/xj/get-sj-xj', data)
+}

+ 94 - 1
ghsPad/src/mixins/product.js

@@ -3,6 +3,7 @@ import { copyObject } from "@/utils/util";
 import { getBySn } from '@/api/goods'
 import { showClass } from '@/api/item-class/index'
 import { showList } from '@/api/item/index'
+import { getSjXj } from '@/api/xj'
 export default {
 	data() {
 		return {
@@ -29,6 +30,7 @@ export default {
             globalRightItemCategoryId: '',
             globalRightAllItemInfo:[],
             globalRightItemInfloList:[],
+            globalGridFlowerList:[]
 		};
 	},
 	onLoad(options) {
@@ -110,6 +112,13 @@ export default {
 			}
 			uni.setStorageSync('selectList_'+this.currentJobType+'_target_'+this.currentBackJobId, currentInfo)
 
+			//多颜色也要挂单
+			let xjInfo = uni.getStorageSync("xj")
+			if (!this.$util.isEmpty(xjInfo)) {
+				uni.setStorageSync("xj_hand_"+this.currentBackJobId, xjInfo)
+				uni.removeStorageSync("xj")
+			}
+
 			uni.removeStorageSync('selectList_'+that.currentJobType+'_target_'+that.currentJobId)
 			that.reSetSelectInfo({currentJobType:that.currentJobType,currentJobId:that.currentJobId})
 
@@ -134,6 +143,13 @@ export default {
 			//清除挂单
 			uni.removeStorageSync('selectList_'+that.currentJobType+'_target_'+that.currentBackJobId)
 
+			//多颜色的处理
+			let xjInfo = uni.getStorageSync("xj_hand_"+this.currentBackJobId)
+			if (!this.$util.isEmpty(xjInfo)) {
+				uni.setStorageSync("xj", xjInfo)
+				uni.removeStorageSync("xj_hand_"+this.currentBackJobId)
+			}
+
 			this.globalHasHand = 0
 		},
 		removeFromSave(){
@@ -162,6 +178,10 @@ export default {
 				})
 				this.$forceUpdate()
 			}
+
+			//多颜色也需要删除
+			uni.removeStorageSync('xj')
+
 		},
 		//取出缓存数据
 		initDataFromStorage() {
@@ -193,6 +213,11 @@ export default {
 				item.currentNum = parseInt(Number(item.currentNum)+Number(list[index].currentNum))
 			}
 
+			//多颜色,弹框时,没有选花材,直接点清除全部
+			if(index == -1 && item.currentNum<=0){
+				return
+			}
+
 			//扫码会出现负数
 			if(Number(item.currentNum)<0){
 				return false
@@ -226,6 +251,8 @@ export default {
 			}else{
 				if(item.currentNum <= 0){
 					list.splice(index,1)
+					//删除当前花材的多颜色
+					this.delCurrentXj(item)
 				}else{
 					list[index].currentNum = item.currentNum
 					list[index].unitPrice = item.unitPrice
@@ -241,6 +268,21 @@ export default {
 			this.pushToSave(list)
 			this.addItemModelHidden()
 		},
+		delCurrentXj(item){
+			if(item.variety == 0){
+				return true
+			}
+            let saveInfo = uni.getStorageSync("xj")
+            const ptItemId = item.itemId
+            if (!this.$util.isEmpty(saveInfo)) {
+				saveInfo.forEach((colorItem, colorIndex) => {
+					if (colorItem.ptItemId == ptItemId) {
+						saveInfo.splice(colorIndex, 1)
+					}
+				})
+				uni.setStorageSync("xj", saveInfo)
+            }
+		},
 		//显示可以修改花材的弹框
 		showAddModelFn(info) {
 			if(Number(info.stock) <= 0){
@@ -250,7 +292,7 @@ export default {
 					return false
 				}
 			}
-			this.$refs.selectNumPriceRef.open('center')
+
 			this.customData = copyObject(info)
 			this.$nextTick(()=>{
 				if(this.currentJobType == 'bill'){
@@ -262,6 +304,38 @@ export default {
 					}
 				}
 			})
+
+			//多颜色选项
+			if(info.variety == 1){
+				getSjXj({itemId:info.id}).then(res=>{
+					if(res.code == 1){
+						const currentXjList = res.data.list || []
+					
+						// 从本地存储中获取已选择的数量
+						const saveInfo = uni.getStorageSync("xj")
+						const selectedQtyMap = {}
+					
+						if (!this.$util.isEmpty(saveInfo)) {
+							const xjData = saveInfo.find(item => item.ptItemId == info.itemId)
+							if (xjData && xjData.list) {
+								xjData.list.forEach(it => {
+									selectedQtyMap[it.id] = it.num
+								})
+							}
+						}
+					
+						// 将已选数量映射到花材列表
+						this.globalGridFlowerList = currentXjList.map(item => ({
+							...item,
+							selectedQty: selectedQtyMap[item.id] || 0,
+							randomNum:Math.random()//这个随机数是必要的,不要删除,否则会有问题。因为左边列表页打开弹框和右边花材打开弹框数据同步问题
+						}))
+						this.$refs.selectFlowerGridRef.open('center')
+					}
+				})
+			}else{
+				this.$refs.selectNumPriceRef.open('center')
+			}
 		},
 		confirmAddItemModel(item) {
 			if (item.index === 0) {
@@ -297,6 +371,25 @@ export default {
 			}
 			this.customData = {};
 		},
+		//清除全部多颜色
+        globalClearXj(customData){
+            customData.currentNum = 0
+			this.replaceItemFn(customData)
+            this.globalCloseXjPop()
+        },
+		//确认多颜色
+        globalConfirmChangeXj(customData,xjData) {
+            customData.currentNum = xjData.stock
+            customData.unitPrice = xjData.price
+            customData.unitType = 0
+			customData.unitName = customData.bigUnit
+            this.confirmAddItemModel(customData)
+            this.globalCloseXjPop()
+        },
+		//取消多颜色框
+		globalCloseXjPop(){
+			this.$refs.selectFlowerGridRef.close()
+		},
 		async takeItem(code){
 			if(this.$util.isEmpty(code)){
 				return false

+ 4 - 1
ghsPad/src/pages/home/components/console.vue

@@ -285,8 +285,11 @@ export default {
 				productList.push({productId:productItem.id,bigNum:bigNum,smallNum:smallNum,classId:0,itemId:productItem.itemId,price:productItem.unitPrice})
 			})
 
+			//多颜色
+			let xj = uni.getStorageSync('xj')
+
 			//isCashier=1时收银台播放 总金额139元,请扫码付款
-			createOrder({...params,product:JSON.stringify(productList),isCashier:1,customId:this.customId}).then(res=>{
+			createOrder({...params,product:JSON.stringify(productList),isCashier:1,customId:this.customId,xj:JSON.stringify(xj)}).then(res=>{
 				uni.hideLoading()
 				if(res.code == 1){
 					if(res.data.diff && !this.$util.isEmpty(res.data.diff)){

+ 7 - 1
ghsPad/src/pages/home/components/leftArea.vue

@@ -38,15 +38,21 @@
             <selectNumPrice @confirmAddItemModel="confirmAddItemModel" :customData.sync="customData" @cancelKdSelectNumPrice="addItemModelHidden"></selectNumPrice>
         </uni-popup>
 
+        <!-- 花材网格选择弹框 -->
+        <uni-popup ref="selectFlowerGridRef" background-color="#fff" type="center" :animation="false">
+            <selectFlowerGrid :flowerData="globalGridFlowerList" @globalClearXj="globalClearXj" @globalConfirmChangeXj="globalConfirmChangeXj" @globalCloseXjPop="globalCloseXjPop" :customData.sync="customData"></selectFlowerGrid>
+        </uni-popup>
+
     </view>
 </template>
 <script>
 import productMins from "@/mixins/product";
 import selectNumPrice from './selectNumPrice.vue'
 import { mapGetters } from "vuex";
+import selectFlowerGrid from './selectFlowerGrid.vue'
 export default {
     name:'leftItem',
-    components:{selectNumPrice},
+    components:{selectNumPrice,selectFlowerGrid},
 	mixins: [productMins],
 	props: {
         changeCurrentJobType:{

+ 33 - 1
ghsPad/src/pages/home/components/rightItem.vue

@@ -26,15 +26,21 @@
             <selectNumPrice v-else @confirmAddItemModel="confirmAddItemModel" :customData.sync="customData" @addToClear="addToClear" @cancelKdSelectNumPrice="addItemModelHidden"></selectNumPrice>
         </uni-popup>
 
+        <!-- 花材网格选择弹框 -->
+        <uni-popup ref="selectFlowerGridRef" background-color="#fff" type="center" :animation="false">
+            <selectFlowerGrid :flowerData="globalGridFlowerList" @globalClearXj="globalClearXj" @globalConfirmChangeXj="globalConfirmChangeXj" @globalCloseXjPop="globalCloseXjPop" :customData.sync="customData"></selectFlowerGrid>
+        </uni-popup>
+
     </view>
 </template>
 <script>
 import productMins from "@/mixins/product";
 import selectNumPrice from './selectNumPrice.vue'
 import selectNum from './selectNum.vue'
+import selectFlowerGrid from './selectFlowerGrid.vue'
 export default {
     name:'rightItem',
-    components:{ selectNumPrice,selectNum },
+    components:{ selectNumPrice, selectNum, selectFlowerGrid },
 	mixins: [productMins],
     data(){
         return {
@@ -211,5 +217,31 @@ export default {
             }
         }
     }
+    & .flower-grid-test-btn {
+        height: 50upx;
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        background-color: #3385FF;
+        color: #ffffff;
+        border-radius: 8upx;
+        margin: 10upx 15upx;
+        font-size: 14upx;
+        font-weight: 500;
+        cursor: pointer;
+        transition: all 0.3s;
+        box-shadow: 0 2upx 8upx rgba(51, 133, 255, 0.2);
+
+        &:active {
+            background-color: #2568d3;
+            transform: scale(0.98);
+            box-shadow: 0 1upx 4upx rgba(51, 133, 255, 0.3);
+        }
+
+        text {
+            font-size: 14upx;
+            color: #ffffff;
+        }
+    }
 }
 </style>

+ 423 - 0
ghsPad/src/pages/home/components/selectFlowerGrid.vue

@@ -0,0 +1,423 @@
+<template>
+    <view class="flower-grid-popup">
+        <!-- 标题栏 -->
+        <view class="popup-header">
+            <view class="header-content">
+                <text>剩{{customData.stock?parseFloat(customData.stock):0}}扎 单价</text>
+                <input class="price-input" @focus="unitPrice=''" v-model="unitPrice" type="digit" />
+            </view>
+        </view>
+
+        <!-- 商品网格容器 -->
+        <scroll-view class="grid-scroll-container" scroll-y="true" :style="{height: scrollHeight}">
+            <view class="flowers-grid">
+                <view v-for="item in flowerList" :key="item.id" class="flower-grid-item">
+                    <!-- 商品图片 -->
+                    <view class="flower-img-box">
+                        <image :src="item.cover" mode="aspectFill" class="flower-img" lazy-load="false"> </image>
+                    </view>
+
+                    <!-- 商品信息 -->
+                    <view class="flower-info">
+                        <text class="flower-name">{{item.name}}</text>
+                        <text style="color:#615e5e;width:100%;font-size:12upx;text-align:center;">剩{{item.stock?parseFloat(item.stock):0}}</text>
+                        <!-- 数量调整器 -->
+                        <view class="quantity-controller">
+                            <view class="qty-btn minus-btn" @tap="decreaseQty(item)">
+                                <text>−</text>
+                            </view>
+                            <view class="qty-display">
+                                <input 
+                                    v-model.number="item.selectedQty" 
+                                    type="number"
+                                    class="qty-input"
+                                    @blur="validateQty(item)">
+                            </view>
+                            <view class="qty-btn plus-btn" @tap="increaseQty(item)">
+                                <text>+</text>
+                            </view>
+                        </view>
+                    </view>
+                </view>
+            </view>
+        </scroll-view>
+
+        <!-- 底部按钮栏 -->
+        <view class="popup-footer">
+            <view class="footer-btn cancel-btn" @tap="confirmClearXj">
+                <text>清除全部</text>
+            </view>
+            <view class="footer-btn cancel-btn" @tap="handleCancel">
+                <text>取消</text>
+            </view>
+            <view class="footer-btn confirm-btn" @tap="handleConfirm">
+                <text>确认</text>
+            </view>
+        </view>
+    </view>
+</template>
+
+<script>
+export default {
+    name: 'selectFlowerGrid',
+    props: {
+        flowerData: { type: Array, default: () => [] },
+        customData:{ type:Object, default:()=>{} }
+    },
+    data() {
+        return {
+            flowerList: [],
+            scrollHeight: '600upx',
+            unitPrice:0,
+            xjData: []
+        }
+    },
+    watch: {
+        flowerData: {
+            handler(newData) {
+                const dataToUse = (newData && newData.length > 0) ? newData : []
+                this.flowerList = dataToUse
+            },
+            deep: true,
+            immediate: true
+        },
+        customData:{
+            handler(newData){
+                this.unitPrice = newData.unitPrice?parseFloat(newData.unitPrice):0
+            },
+            deep: true,
+            immediate: true
+        }
+    },
+    mounted() {
+        this.calculateScrollHeight()
+    },
+    methods: {
+        // 计算滚动区域高度
+        calculateScrollHeight() {
+            // 总高度 - 头部高度 - 底部按钮高度
+            this.scrollHeight = 'calc(100vh - 100upx - 90upx)'
+        },
+        // 增加数量
+        increaseQty(item) {
+            this.$util.hitVoice()
+            item.selectedQty = parseInt(item.selectedQty) || 0
+            item.selectedQty++
+        },
+        // 减少数量
+        decreaseQty(item) {
+            this.$util.hitVoice()
+            item.selectedQty = parseInt(item.selectedQty) || 0
+            if (item.selectedQty > 0) {
+                item.selectedQty--
+            }
+        },
+        // 验证数量输入
+        validateQty(item) {
+            let qty = parseInt(item.selectedQty) || 0
+            if (qty < 0) {
+                item.selectedQty = 0
+            } else {
+                item.selectedQty = qty
+            }
+        },
+        confirmClearXj() {
+            uni.removeStorageSync("xj")
+            if (!this.$util.isEmpty(this.flowerList)) {
+                this.flowerList.forEach(item => {
+                    item.selectedQty = 0
+                })
+            }
+            this.$emit('globalClearXj', this.customData)
+        },
+        handleCancel() {
+            this.$emit('globalCloseXjPop')
+        },
+        handleConfirm() {
+            // 收集选中的花材
+            let arr = []
+            this.flowerList.forEach(item => {
+                if (!this.$util.isEmpty(item.selectedQty) && Number(item.selectedQty) > 0) {
+                    arr.push({id: item.id, num: item.selectedQty})
+                }
+            })
+
+            // 验证单价
+            if (this.$util.isMoney(this.unitPrice) == false) {
+                this.$msg("请填写单价")
+                return false
+            }
+
+            // 计算总数量
+            let totalNum = 0
+            arr.forEach((item) => {
+                totalNum = (Number(item.num) + Number(totalNum)).toFixed(0)
+            })
+
+            if (totalNum <= 0) {
+                this.$msg("请填写数量哈")
+                return false
+            }
+            // 验证库存
+            if (totalNum > Number(this.customData.stock)) {
+                this.$msg("数量超过总库存")
+                return false
+            }
+
+            // 保存到本地存储
+            let saveInfo = uni.getStorageSync("xj")
+            const ptItemId = this.customData.itemId ? this.customData.itemId : 0
+            if (!this.$util.isEmpty(saveInfo)) {
+                let getIndex = -1
+                saveInfo.forEach((colorItem, colorIndex) => {
+                    if (colorItem.ptItemId == ptItemId) {
+                        getIndex = colorIndex
+                    }
+                })
+                if (getIndex > -1) {
+                    saveInfo[getIndex].list = arr
+                } else {
+                    saveInfo.push({ptItemId: ptItemId, list: arr})
+                }
+            } else {
+                saveInfo = [{ptItemId: ptItemId, list: arr}]
+            }
+            uni.setStorageSync("xj", saveInfo)
+
+            // 返回确认数据
+            this.xjData = {price: this.unitPrice, stock: totalNum, hasUpdate: 1, cancel: 0}
+            this.$emit('globalConfirmChangeXj',this.customData, this.xjData)
+        }
+    }
+}
+</script>
+
+<style lang="scss" scoped>
+.flower-grid-popup {
+    width: 80vw;
+    height: 98vh;
+    background-color: #ffffff;
+    border-radius: 0;
+    display: flex;
+    flex-direction: column;
+    box-sizing: border-box;
+    overflow: hidden;
+    box-shadow: 0 4upx 16upx rgba(0, 0, 0, 0.15);
+
+    .popup-header {
+        height: 50upx;
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        padding: 0 30upx;
+        border-bottom: 2upx solid #eeeeee;
+        background-color:#c3cfe2;
+
+        .header-content {
+            display: flex;
+            align-items: center;
+
+            text {
+                font-size: 19upx;
+                color: #333333;
+                font-weight: 500;
+                margin-right: 10upx;
+            }
+
+            .price-input {
+                border: 1upx solid black;
+                width: 90upx;
+                height: 32upx;
+                padding: 0 8upx;
+                box-sizing: border-box;
+                border-radius: 3upx;
+                font-size: 16upx;
+                text-align: center;
+            }
+        }
+    }
+
+    // 滚动区域
+    .grid-scroll-container {
+        flex: 1;
+        width: 100%;
+        overflow-y: scroll;
+        scrollbar-width: auto;
+
+        &::-webkit-scrollbar {
+            width: 10upx;
+        }
+
+        &::-webkit-scrollbar-track {
+            background: #f5f5f5;
+            border-radius: 5upx;
+        }
+
+        &::-webkit-scrollbar-thumb {
+            background: linear-gradient(180deg, #3385ff 0%, #2568d3 100%);
+            border-radius: 5upx;
+            min-height: 20upx;
+
+            &:hover {
+                background: linear-gradient(180deg, #2568d3 0%, #1a4fa1 100%);
+                box-shadow: 0 0 5upx rgba(51, 133, 255, 0.3);
+            }
+        }
+    }
+
+    // 网格容器 - 缩小卡片 85%,增加边距
+    .flowers-grid {
+        display: grid;
+        grid-template-columns: repeat(auto-fit, minmax(116.81upx, 1fr));
+        padding: 25upx 31.25upx;
+        grid-auto-rows: max-content;
+
+        .flower-grid-item {
+            display: flex;
+            flex-direction: column;
+            align-items: center;
+            background-color: #fafafa;
+            padding: 10.63upx;
+            border-radius: 6.38upx;
+            transition: all 0.3s;
+            border: 1upx solid #e8e8e8;
+            margin: 10upx;
+
+            // 图片容器
+            .flower-img-box {
+                width: 100%;
+                height: 0;
+                padding-bottom: 100%;
+                position: relative;
+                margin-bottom: 7.97upx;
+                border-radius: 5.31upx;
+                overflow: hidden;
+
+                .flower-img {
+                    position: absolute;
+                    top: 0;
+                    left: 0;
+                    width: 100%;
+                    height: 100%;
+                    display: block;
+                }
+            }
+
+            // 商品信息
+            .flower-info {
+                width: 100%;
+                display: flex;
+                flex-direction: column;
+                align-items: center;
+
+                .flower-name {
+                    font-size: 12upx;
+                    font-weight: 500;
+                    color: black;
+                    text-align: center;
+                    display: -webkit-box;
+                    -webkit-line-clamp: 1;
+                    -webkit-box-orient: vertical;
+                    line-clamp: 1;
+                    overflow: hidden;
+                    text-overflow: ellipsis;
+                    line-height: 1.4;
+                }
+
+                // 数量调整器
+                .quantity-controller {
+                    display: flex;
+                    align-items: center;
+                    justify-content: center;
+                    background: linear-gradient(135deg, #f9f9f9 0%, #f0f0f0 100%);
+                    border: 2upx solid #e8e8e8;
+                    border-radius: 4.25upx;
+                    padding: 6upx 2upx;
+                    width: 100%;
+
+                    .qty-btn {
+                        margin: 0 3upx;
+                        width: 40upx;
+                        height: 26upx;
+                        display: flex;
+                        align-items: center;
+                        justify-content: center;
+                        background-color: #ffffff;
+                        border: 2upx solid #d0d0d0;
+                        border-radius: 3.19upx;
+                        transition: all 0.2s;
+                        font-weight: bold;
+                                              
+                        text {
+                            font-size: 10upx;
+                            color: #666666;
+                            font-weight: bold;
+                        }
+                    }
+
+                    .qty-display {
+                        width: 35.41upx;
+                        height: 26.56upx;
+                        display: flex;
+                        align-items: center;
+                        justify-content: center;
+
+                        .qty-input {
+                            width: 100%;
+                            height: 100%;
+                            text-align: center;
+                            font-size: 13upx;
+                            font-weight: bold;
+                            color: #333333;
+                            border: none;
+                            background-color: transparent;
+                            padding: 0;
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    // 底部按钮栏 - 再缩小 1/2 (总计 33.33%)
+    .popup-footer {
+        height: 45upx;
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        padding: 0 14upx;
+        border-top: 2upx solid #eeeeee;
+        background: linear-gradient(135deg, #fafafa 0%, #f5f5f5 100%);
+
+        .footer-btn {
+            margin: 0 20upx;
+            flex: 1;
+            height: 34upx;
+            display: flex;
+            align-items: center;
+            justify-content: center;
+            border-radius: 2.22upx;
+            transition: all 0.3s;
+            min-width: 62upx;
+            max-width: 89upx;
+
+            text {
+                font-size: 16upx;
+            }
+
+            &.cancel-btn {
+                background: linear-gradient(135deg, #f0f0f0 0%, #e8e8e8 100%);
+                color: #666666;
+                border: 2upx solid #d0d0d0;
+            }
+
+            &.confirm-btn {
+                background: linear-gradient(135deg, #3385ff 0%, #2568d3 100%);
+                color: #ffffff;
+                box-shadow: 0 4upx 12upx rgba(51, 133, 255, 0.3);
+            }
+        }
+    }
+}
+</style>
+