Jelajahi Sumber

Merge branch 'master' into zhongqi-birthDay

shizhongqi 1 bulan lalu
induk
melakukan
4e315c7c1a

+ 246 - 2
ghsApp/src/admin/billing/index2.vue

@@ -9,7 +9,7 @@
 				<app-search-module ref="globalSearchRef" v-model="globalPy" placeholder="这里搜索" @input="globalSearch" />
 			</view>
 			<view style="float:right;margin-left:15upx;">
-				<button class="admin-button-com middle blue" style="background-color: red;color:white;border-color: red;" @click="removeFromSave(option.customId)">清空购物</button>
+				<button class="admin-button-com middle blue" style="background-color: red;color:white;border-color: red;" @click="removeFromSave(option.customId)">清空购物</button>
 			</view>
 		</view>
 
@@ -53,6 +53,8 @@
 							</view>
 						</view>
 					</view>
+					<!-- 底部占位,避免最后一项花材被底部「选好了」栏遮挡 -->
+					<view style="height: 200upx;"></view>
 				</block>
 				<block v-else>
 					<app-wrapper-empty title="加载中" :is-empty="$util.isEmpty(globalItemData)" />
@@ -111,7 +113,49 @@
 			</template>
 		</modal-module>
 
-		<footer-cart :price="allPrice" :count="allCount" @confirm="confirmToSave" ></footer-cart>
+		<footer-cart :price="allPrice" :count="allCount" @confirm="confirmToSave" @showCartItem="showCartItem"></footer-cart>
+
+		<!-- 购物车弹框:展示已选花材列表 -->
+		<view v-if="cartItemShow == true" class="cart-popup-mask" @click="hideCartItem()">
+			<!-- 弹框底部需留出底部购物车栏高度,避免最后一项被「选好了」遮挡 -->
+			<view class="cart-popup-panel" @click.stop="">
+				<view class="commodity-view">
+					<view class="summary-bar">
+						<button class="admin-button-com blue middle" @click.stop="clearCartInPopup()" style="background-color: red;border:1upx solid red;">清空购物车</button>
+					</view>
+					<view class="commodity-list">
+						<view class="commodity-item" v-for="(item, index) in selectList" :key="index">
+							<image class="item-icon" :src="item.cover" />
+							<view class="item-info">
+								<view class="info-line">
+									<view class="name-unit-col">
+										<text class="item-name">{{ item.name }}</text>
+										<text class="item-unit">
+											<block v-if="item.ratioType == 0">{{ item.ratio }}{{ item.smallUnit }}/{{ item.bigUnit }}</block>
+											<block v-else>若干{{ item.smallUnit }}/{{ item.bigUnit }}</block>
+										</text>
+									</view>
+									<text class="item-price">
+										<text class="unit">¥</text>
+										<text class="price">{{ getCartItemUnitPrice(item) }}</text>
+									</text>
+								</view>
+								<view style="text-align:right;">
+									<view class="open-bx cart-open-bx">
+										<text class="iconfont iconjian" @click.stop="delItem(item)" v-if="item.bigCount > 0 || item.smallCount > 0"></text>
+										<text class="num" @click.stop="customUpdate(item)">
+											<text v-if="item.bigCount > 0" style="font-weight:bold;color:#3385ff;">{{ item.bigCount }}</text>
+											<text v-if="item.smallCount > 0"><text v-if="item.bigCount > 0">/</text>{{ item.smallCount }}</text>
+										</text>
+										<text class="iconfont iconzeng icon-add-btn" @click.stop="addAction(item)"></text>
+									</view>
+								</view>
+							</view>
+						</view>
+					</view>
+				</view>
+			</view>
+		</view>
 
 		<uni-popup ref="globalClassImgRef" 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;">
@@ -161,6 +205,7 @@ export default {
 			xjDataInfo:{},
 			treeData:{},
 			treeDataInfo:{},
+			cartItemShow: false,
 		};
 	},
 	computed: {
@@ -318,6 +363,87 @@ export default {
 		selectFlowerNumFn(){
 			this.$refs.globalClassImgRef.open('top')
 		},
+		/**
+		 * 展开/收起购物车弹框
+		 */
+		showCartItem() {
+			if (this.cartItemShow == true) {
+				this.cartItemShow = false
+			} else if (!this.$util.isEmpty(this.selectList)) {
+				this.cartItemShow = true
+			}
+		},
+		/**
+		 * 关闭购物车弹框
+		 */
+		hideCartItem() {
+			this.cartItemShow = false
+		},
+		/**
+		 * 弹框内清空购物车:确认后再关闭弹框并清除
+		 */
+		clearCartInPopup() {
+			const that = this
+			that.$util.confirmModal({ content: '确认清除花材?' }, () => {
+				that.cartItemShow = false
+				that.removeFromSaveDirect()
+				that.$msg('已清除')
+			})
+		},
+		/**
+		 * 获取购物车单项单价
+		 * @param {object} item - 已选花材
+		 */
+		getCartItemUnitPrice(item) {
+			if (item.userPrice > 0) {
+				return parseFloat(item.userPrice).toFixed(2)
+			}
+			return parseFloat(item.bigPrice || item.price || 0).toFixed(2)
+		},
+		/**
+		 * 购物车弹框内减少数量
+		 * @param {object} item - 已选花材
+		 */
+		delItem(item) {
+			if (item.variety == 1) {
+				this.$msg('多颜色请在列表里修改')
+				return
+			}
+			this.replaceItemFn(item, 0, 'sub')
+		},
+		/**
+		 * 购物车弹框内增加数量
+		 * @param {object} item - 已选花材
+		 */
+		addAction(item) {
+			if (item.variety == 1) {
+				this.$msg('多颜色请在列表里修改')
+				return
+			}
+			if (this.globalCheckStock) {
+				const ratio = Number(item.ratio) || 1
+				const bigCount = Number(item.bigCount) || 0
+				const smallCount = Number(item.smallCount) || 0
+				const bigNum = Number(item.bigNum) || 0
+				const smallNum = Number(item.smallNum) || 0
+				if (bigCount * ratio + smallCount + 1 > bigNum * ratio + smallNum) {
+					this.$msg('库存不足哦')
+					return
+				}
+			}
+			this.replaceItemFn(item, 0, 'add')
+		},
+		/**
+		 * 购物车弹框内点击数量,打开编辑弹框
+		 * @param {object} item - 已选花材
+		 */
+		customUpdate(item) {
+			if (item.variety == 1) {
+				this.$msg('多颜色请在列表里修改')
+				return
+			}
+			this.showAddModelFn(item)
+		},
 		confirmToSave() {
 			if(this.$util.isEmpty(this.selectList)){
 				this.$msg('请选择花材')
@@ -468,4 +594,122 @@ export default {
 	color:red;
 	font-weight:bold;
 }
+
+/* 购物车弹框遮罩 */
+.cart-popup-mask {
+	position: fixed;
+	z-index: 190;
+	top: 0;
+	left: 0;
+	width: 100vw;
+	height: 100vh;
+	background: rgba(0, 0, 0, 0.6);
+	color: #fff;
+}
+/* 弹框面板:bottom 对齐底部购物车栏上沿(约 118upx + 安全区) */
+.cart-popup-panel {
+	position: fixed;
+	bottom: calc(140upx + env(safe-area-inset-bottom));
+	left: 0;
+	width: 100vw;
+	background-color: white;
+	max-height: calc(100vh - 140upx - env(safe-area-inset-bottom));
+}
+
+.commodity-view {
+	display: flex;
+	flex-direction: column;
+	max-height: calc(100vh - 140upx - env(safe-area-inset-bottom));
+	.commodity-list {
+		overflow: scroll;
+		flex: 1;
+		max-height: 50vh;
+		padding: 20upx;
+		/* 列表底部留白,滚动到底时最后一项不被底部栏挡住 */
+		padding-bottom: 60upx;
+		.commodity-item {
+			display: flex;
+			margin-bottom: 20upx;
+			.item-icon {
+				flex-shrink: 0;
+				width: 140upx;
+				height: 140upx;
+			}
+			.item-info {
+				display: flex;
+				flex-direction: column;
+				justify-content: center;
+				flex: 1;
+				margin-left: 20upx;
+				.info-line {
+					margin-bottom: 20upx;
+					display: flex;
+					justify-content: space-between;
+					align-items: flex-end;
+					.name-unit-col {
+						flex: 1;
+						min-width: 0;
+					}
+					.item-name {
+						color: #666;
+						font-size: 30upx;
+						font-weight: bold;
+						overflow: hidden;
+						white-space: nowrap;
+						text-overflow: ellipsis;
+						width: 400upx;
+					}
+					.item-unit {
+						display: block;
+						margin-top: 8upx;
+						color: #999;
+						font-size: 24upx;
+					}
+					.item-price {
+						color: #333;
+						font-size: 22upx;
+						flex-shrink: 0;
+						.price {
+							font-size: 32upx;
+							font-weight: bold;
+						}
+					}
+				}
+				/* 加减按钮尺寸对齐本页花材列表 app-commodity2 */
+				.cart-open-bx {
+					display: flex;
+					align-items: center;
+					justify-content: flex-end;
+					.iconfont {
+						color: #3385ff;
+						font-size: 55upx;
+					}
+					.icon-add-btn {
+						font-size: 69upx;
+					}
+					.num {
+						display: inline-block;
+						width: 100upx;
+						height: 50upx;
+						line-height: 50upx;
+						text-align: center;
+						margin: 0 20upx;
+						color: #868686;
+						border-radius: 22upx;
+						background-color: #f5f5f5;
+						font-size: 28upx;
+					}
+				}
+			}
+		}
+	}
+	.summary-bar {
+		padding: 0 20upx;
+		height: 90upx;
+		display: flex;
+		align-items: center;
+		justify-content: space-between;
+		border-top: 1upx solid #eeeeee;
+	}
+}
 </style>

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

@@ -99,7 +99,8 @@ export default {
                         {name: "预订汇总",img: `${this.$constant.hostUrl}/image/ghs/home/kcyjs.png`,url: "/admin/order/statBook"},
                         {name: "预订客户",img: `${this.$constant.hostUrl}/image/ghs/home/kcyjs.png`,url: "/admin/book/custom"},
                         {name: "预订明细",img: `${this.$constant.hostUrl}/image/ghs/home/kcyjs.png`,url: "/admin/book/itemCustom"},
-                        {name: "配送片区",img: `${this.$constant.hostUrl}/image/ghs/home/kcyjs.png`,url: "/admin/order/orderListByDist"}
+                        {name: "配送片区",img: `${this.$constant.hostUrl}/image/ghs/home/kcyjs.png`,url: "/admin/order/orderListByDist"},
+                        {name: "配送方式",img: `${this.$constant.hostUrl}/image/ghs/home/kcyjs.png`,url: "/pagesOrder/shMethod"}
                     ]
                 },
                 {

+ 8 - 0
ghsApp/src/admin/home/order.vue

@@ -199,6 +199,7 @@
         "
       >
         <view style="width: 100vw; margin-top: 20upx"><button @click="printWlList()">打印物流列表</button></view>
+        <view style="width: 100vw; margin-top: 35upx"><button @click="toShMethod()">配送方式</button></view>
         <view style="width: 100vw; margin-top: 35upx"><button @click="closeMore()">取消</button></view>
       </view>
     </uni-popup>
@@ -616,6 +617,13 @@ export default {
       this.closeMore();
       this.$util.pageTo({ url: '/pagesOrder/printWlList' });
     },
+    /**
+     * 跳转至配送方式设置页面
+     */
+    toShMethod() {
+      this.closeMore();
+      this.$util.pageTo({ url: '/pagesOrder/shMethod' });
+    },
     getCustom(item) {
       this.showSearch = false;
       this.customId = item.id;

+ 30 - 0
ghsApp/src/api/sh-method/index.js

@@ -0,0 +1,30 @@
+/**
+ * 用途:配送方式配置 API 接口
+ * 谁用:供货商移动端 (ghsApp) 配送方式设置页面
+ * 解决什么问题:定义获取和保存配送方式配置的 HTTP 接口
+ */
+
+import https from '@/plugins/luch-request_0.0.7/request'
+
+/**
+ * 获取指定配送方式的配置
+ * @param {object} data - { style }
+ */
+export const getShMethodConfig = data => {
+  return https.get('/sh-method/get-config', data)
+}
+
+/**
+ * 获取所有配送方式的排序和别名信息
+ */
+export const getShMethodSorts = () => {
+  return https.get('/sh-method/get-sorts')
+}
+
+/**
+ * 保存指定配送方式的配置
+ * @param {object} data - 配置数据
+ */
+export const saveShMethodConfig = data => {
+  return https.post('/sh-method/save-config', data)
+}

+ 5 - 1
ghsApp/src/components/module/app-footer-cart.vue

@@ -1,7 +1,7 @@
 <template>
 	<view class="cart-ft_bx">
 		<view class="cart-ct_bx">
-			<view class="cart-lf_bx">
+			<view class="cart-lf_bx" @click="showCartItem">
 				<view class="cart-dot_bx">
 					<i class="iconfont icongouwuche"></i>
 				</view>
@@ -39,6 +39,10 @@ export default {
 	methods: {
 		confirmEvent() {
 			this.$emit("confirm");
+		},
+		// 点击左侧购物车区域,展开已选花材列表
+		showCartItem() {
+			this.$emit("showCartItem");
 		}
 	}
 };

+ 1 - 0
ghsApp/src/pages.json

@@ -114,6 +114,7 @@
 				{"path": "refund","style": {"navigationBarTitleText": "退款"}},
 				{"path": "refundDetail","style": {"navigationBarTitleText": "售后信息"}},
 				{"path": "ship","style": {"navigationBarTitleText": "发货"}},
+				{"path": "shMethod","style": {"navigationBarTitleText": "配送方式"}},
 				{"path": "shipInfo","style": {"navigationBarTitleText": "发货"}},
 				{"path": "allot","style": {"navigationBarTitleText": "分配"}},
 				{"path": "refundSuccess","style": {"navigationBarTitleText": "结果"}},

+ 8 - 0
ghsApp/src/pagesArrears/detailsItem.vue

@@ -15,6 +15,9 @@
 				<view :class="[Number(info.debtPrice)>Number(info.remainDebtPrice) ? 'price-del' : 'price']">¥{{ parseFloat(info.debtPrice || info.remainDebtPrice) }}</view>
 				<view class="price" style="border:1upx solid #67a0f7;border-radius:10upx;font-weight:normal;color:#3385FF;font-size:32upx;width:180upx;height:80upx;justify-content:center;" @click.stop="goToDetai(info)">查看明细</view>
 			</view>
+			<view class="item-row" v-if="!$util.isEmpty(info.remark)">
+				<view class="remark">{{ info.remark }}</view>
+			</view>
 			<view class="item-row" v-if="Number(info.debtPrice)>Number(info.remainDebtPrice)">
 				<view class="price" style="color:red;">已清 ¥{{ info.hasPayDebt }},剩余待结 ¥{{ parseFloat(info.remainDebtPrice) }}</view>
 			</view>
@@ -99,6 +102,11 @@ export default {
 			font-weight: 400;
 			color: #666666;
 		}
+		.remark {
+			font-size:32upx;
+			font-weight:bold;
+			color: red;
+		}
 		.price {
 			display: flex;
 			align-items: center;

+ 152 - 82
ghsApp/src/pagesClient/member/detail.vue

@@ -108,51 +108,51 @@
           </view>
       </view>
 
-      <div class="module-com tabs-wrap">
-        <div class="tabs-list" v-for="(item, index) in tabsData" :key="index" @click="pageTo(item)">
-          <div class="tabs-img">
+      <view class="module-com tabs-wrap">
+        <view class="tabs-list" v-for="(item, index) in tabsData" :key="index" @click="pageTo(item)">
+          <view class="tabs-img">
             <text class="tabs-emoji">{{ item.emoji }}</text>
-          </div>
-          <div class="tabs-name">{{ item.name }}</div>
-        </div>
-      </div>
+          </view>
+          <view class="tabs-name">{{ item.name }}</view>
+        </view>
+      </view>
 
       <view class="module-com user-open_bx">
         <view class="input-line-wrap">
 
             <tui-list-cell class="line-cell" :hover="false" :arrow="true" @click="pageTo({ url: '/pagesArrears/details',query: {id: userInfo.id}})">
-              <div class="tui-title">待结订单</div>
+              <view class="tui-title">待结订单</view>
             </tui-list-cell>
 
             <tui-list-cell class="line-cell" :hover="false" :arrow="true" @click="pageTo({ url: '/admin/clear/customList',query: {customId: userInfo.id}})">
-              <div class="tui-title">结账记录</div>
+              <view class="tui-title">结账记录</view>
             </tui-list-cell>
 
             <tui-list-cell class="line-cell" :hover="false" :arrow="true" @click="pageTo({ url: '/admin/custom/balanceChange?customId='+userInfo.id})">
-              <div class="tui-title">余额变动</div>
+              <view class="tui-title">余额变动</view>
             </tui-list-cell>
 
             <tui-list-cell class="line-cell" :hover="false">
-              <div class="tui-title">客户自助挂账</div>
-              <div class="switch_bx">
+              <view class="tui-title">线上自助挂账</view>
+              <view class="switch_bx">
                 <text v-if="form.debt == 0">禁止</text>
                 <text v-else>允许</text>
                 <switch :checked="form.debt == 0 ? false : true" @change="remindChangeFn" style="transform: scale(0.8,0.8)" />
-              </div>
+              </view>
             </tui-list-cell>
 
 						<tui-list-cell class="line-cell" :hover="false">
-              <div class="tui-title">挂账额度</div>
+              <view class="tui-title">挂账额度</view>
               <input v-model="debtLimit" @click="debtLimit=''" placeholder-class="phcolor" class="tui-input" confirm-type="go" placeholder="请填写" type="digit" style="width:47%;border:1upx solid #ddd;margin-right:12upx;height:70upx;text-align:center;" />
               <button class="admin-button-com blue middle" @tap="amendMoney">确定</button>
 						</tui-list-cell>
 
             <tui-list-cell class="line-cell" :hover="false" :arrow="true" @click="pageTo({ url: '/admin/custom/rechargeChange?customId='+userInfo.id})">
-              <div class="tui-title">充值记录</div>
+              <view class="tui-title">充值记录</view>
             </tui-list-cell>
 
             <tui-list-cell class="line-cell" :hover="false" :arrow="true" @click="pageTo({url:'/admin/order/customOrder?customId='+userInfo.id})">
-              <div class="tui-title">下单记录</div>
+              <view class="tui-title">下单记录</view>
               <view style="font-size:24upx;" v-if="userInfo.recentExpend!='0000-00-00 00:00:00'">最近下单 {{ userInfo.recentExpend ? userInfo.recentExpend.substr(5,11) : '' }}</view>
             </tui-list-cell>
 
@@ -182,7 +182,7 @@
               </tui-list-cell>
 
               <tui-list-cell class="line-cell" :hover="false" v-if="form.home == 1">
-                <view class="tui-title">涨价比例</view>
+                <view class="tui-title">每扎涨价比例</view>
                 <view style="display:flex;align-items:center;">
                   <input v-model="userInfo.risePercent" @click="userInfo.risePercent=''" placeholder-class="phcolor" class="tui-input" confirm-type="go" placeholder="不涨填0" type="number" style="width:245upx;border:1upx solid #ddd;margin-right:10upx;height:70upx;text-align:center;" />
                   <text style="margin-right:30upx;">%</text>
@@ -191,7 +191,7 @@
               </tui-list-cell>
 
               <tui-list-cell class="line-cell" :hover="false" v-if="form.home == 1">
-                <view class="tui-title">最高涨幅</view>
+                <view class="tui-title">整单最高涨价</view>
                 <view style="display:flex;align-items:center;">
                   <input v-model="userInfo.riseRange" @click="userInfo.riseRange=''" placeholder-class="phcolor" class="tui-input" confirm-type="go" placeholder="不限制填0" type="number" style="width:245upx;border:1upx solid #ddd;margin-right:10upx;height:70upx;text-align:center;" />
                   <text style="margin-right:30upx;">元</text>
@@ -202,15 +202,14 @@
 
             <view style="border:2upx solid #CCCCCC;margin-top:20upx;">
               <tui-list-cell class="line-cell" :hover="false">
-                <div class="tui-title">送货上门</div>
-                <div class="switch_bx">
-                  <text v-if="form.home == 0">不支持</text>
-                  <text v-else>支持</text>
-                  <switch :checked="form.home == 0 ? false : true" @change="homeChangeFn" style="transform: scale(0.8,0.8)" />
-                </div>
+                <view class="tui-title">送货上门</view>
+                <view style="margin-left: auto; display: flex; align-items: center;">
+                  <button class="admin-button-com middle" :class="[form.home == 1 ? 'blue' : 'default']" @click="changeHomeBtn(1)">启用</button>
+                  <button class="admin-button-com middle" :class="[form.home == 0 ? 'blue' : 'default']" @click="changeHomeBtn(0)" style="margin-left:20upx;">禁用</button>
+                </view>
               </tui-list-cell>
               <tui-list-cell class="line-cell" :hover="false" v-if="form.home == 1">
-                <div class="tui-title">最低消费金额</div>
+                <view class="tui-title">最低消费金额</view>
                 <view style="display:flex;align-items:center;">
                   <input v-model="userInfo.homeAmount" @click="userInfo.homeAmount=''" placeholder-class="phcolor" class="tui-input" confirm-type="go" placeholder="不限制填0" type="digit" style="width:245upx;border:1upx solid #ddd;margin-right:10upx;height:70upx;text-align:center;" />
                   <text style="margin-right:30upx;">元</text>
@@ -218,84 +217,103 @@
                 <button class="admin-button-com blue middle" @tap="changeHomeParams">确定</button>
               </tui-list-cell>
               <tui-list-cell class="line-cell" :hover="false" v-if="form.home == 1">
-                <div class="tui-title">最低消费扎数</div>
+                <view class="tui-title">最低消费扎数</view>
                 <view style="display:flex;align-items:center;">
                   <input v-model="userInfo.homeNum" @click="userInfo.homeNum=''" placeholder-class="phcolor" class="tui-input" confirm-type="go" placeholder="不限制填0" type="number" style="width:245upx;border:1upx solid #ddd;margin-right:10upx;height:70upx;text-align:center;" />
                   <text style="margin-right:30upx;">扎</text>
                 </view>
                 <button class="admin-button-com blue middle" @tap="changeHomeParams">确定</button>
               </tui-list-cell>
+              <!-- 不满最低消费要求时的处理方式:收运费 / 收包装费 / 不能下单 -->
+              <tui-list-cell class="line-cell" :hover="false" v-if="form.home == 1">
+                <view class="tui-title">不满最低要求</view>
+                <button class="admin-button-com middle" :class="[form.homeUnMeet == 0 ? 'blue' : 'default']" @click="homeUnMeetBtn(0)">收运费</button>
+                <button class="admin-button-com middle" :class="[form.homeUnMeet == 1 ? 'blue' : 'default']" @click="homeUnMeetBtn(1)" style="margin-left:4upx;">收包装费</button>
+                <button class="admin-button-com middle" :class="[form.homeUnMeet == 2 ? 'blue' : 'default']" @click="homeUnMeetBtn(2)" style="margin-left:4upx;">不能买</button>
+              </tui-list-cell>
+              <!-- homeUnMeet 为 0/1 时填写对应费用;为 2(不能下单)时不展示 -->
+              <tui-list-cell class="line-cell" :hover="false" v-if="form.home == 1 && form.homeUnMeet != 2">
+                <view class="tui-title">{{ homeUnFeeLabel }}</view>
+                <view style="display:flex;align-items:center;">
+                  <input v-model="userInfo.homeUnFee" @click="userInfo.homeUnFee=''" placeholder-class="phcolor" class="tui-input" confirm-type="go" placeholder="请填写" type="digit" style="width:245upx;border:1upx solid #ddd;margin-right:10upx;height:70upx;text-align:center;" />
+                  <text style="margin-right:30upx;">元</text>
+                </view>
+                <button class="admin-button-com blue middle" @tap="changeHomeParams(true)">确定</button>
+              </tui-list-cell>
+
             </view>
 
             <tui-list-cell class="line-cell" :hover="false">
-              <div class="tui-title">审核状态</div>
-              <div class="switch_bx">
+              <view class="tui-title">审核状态</view>
+              <view class="switch_bx">
                 <text v-if="form.passStatus == 0">待审</text>
                 <text v-else>通过</text>
                 <switch :checked="form.passStatus == 0 ? false : true" @change="passStatusChangeFn" style="transform: scale(0.8,0.8)" />
-              </div>
+              </view>
             </tui-list-cell>
 
             <tui-list-cell class="line-cell" :hover="false">
-              <div class="tui-title">查看库存</div>
-              <div class="switch_bx">
+              <view class="tui-title">查看库存</view>
+              <view class="switch_bx">
                 <text v-if="form.showStock == 0">禁止</text>
                 <text v-else>允许</text>
                 <switch :checked="form.showStock == 0 ? false : true" @change="showStockChangeFn" style="transform: scale(0.8,0.8)" />
-              </div>
+              </view>
             </tui-list-cell>
 
             <tui-list-cell class="line-cell" :hover="false">
-              <div class="tui-title">列入黑名单</div>
-              <div class="switch_bx">
-                <text v-if="form.black == 1"></text>
-                <text v-else>是</text>
+              <view class="tui-title">列入黑名单</view>
+              <view class="switch_bx">
+                <text v-if="form.black == 1">没有</text>
+                <text v-else>是</text>
                 <switch :checked="form.black == 1 ? false : true" @change="blackChangeFn" style="transform: scale(0.8,0.8)" />
-              </div>
+              </view>
             </tui-list-cell>
 
             <tui-list-cell class="line-cell" :hover="false">
-              <div class="tui-title">删除状态</div>
-              <div class="switch_bx">
+              <view class="tui-title">删除状态</view>
+              <view class="switch_bx">
                 <text v-if="form.delStatus == 1">已删</text>
                 <text v-else>正常</text>
                 <switch :checked="form.delStatus == 1 ? true : false" @change="delChangeFn" style="transform: scale(0.8,0.8)" />
-              </div>
+              </view>
             </tui-list-cell>
 
             <tui-list-cell class="line-cell" :hover="false">
-              <div class="tui-title">客户简称</div>
+              <view class="tui-title">客户简称</view>
               <input v-model="userInfo.shortName" @click="userInfo.shortName=''" placeholder-class="phcolor" class="tui-input" confirm-type="go" placeholder="请填写" type="text" style="width:48%;border:1upx solid #ddd;margin-right:12upx;height:70upx;text-align:center;" />
               <button class="admin-button-com blue middle" @tap="changeShortName">确定</button>
             </tui-list-cell>
 
             <tui-list-cell class="line-cell" :hover="false">
-              <div class="tui-title">使用物流</div>
+              <view class="tui-title">使用物流</view>
               <input v-model="userInfo.wlName" @click="userInfo.wlName=''" placeholder-class="phcolor" class="tui-input" confirm-type="go" placeholder="请填写" type="text" style="width:195upx;border:1upx solid #ddd;margin-right:10upx;height:70upx;text-align:center;" />
               <button class="admin-button-com middle" @tap="getMyWl" style="margin-right:10upx;">选择</button>
               <button class="admin-button-com blue middle" @tap="changeWlFn">保存</button>
             </tui-list-cell>
 
             <tui-list-cell class="line-cell" :hover="false">
-              <div class="tui-title">货位号</div>
+              <view class="tui-title">货位号</view>
               <input v-model="userInfo.seatSn" @click="userInfo.seatSn=''" placeholder-class="phcolor" class="tui-input" confirm-type="go" placeholder="请填写" type="number" style="width:195upx;border:1upx solid #ddd;margin-right:10upx;height:70upx;text-align:center;" />
               <button class="admin-button-com middle" @tap="createSeatSn" style="margin-right:10upx;">生成</button>
               <button class="admin-button-com blue middle" @tap="modifySeatSn">保存</button>
             </tui-list-cell>
 
             <tui-list-cell class="line-cell" :hover="true" :arrow="true" @click="changeIntroducer()">
-              <div class="tui-title">介绍人</div>
+              <view class="tui-title">介绍人</view>
               <view class="tui-input">{{ form.staffName }}</view>
             </tui-list-cell>
 
             <tui-list-cell class="line-cell" :hover="false">
-              <div class="tui-title">挂账超额后</div>
-              <button class="admin-button-com middle" :class="[form.debtLimitPay == 0 ? 'blue' : 'default']" @click="debtLimitPayBtn(0)">现金可下单</button>
-              <button class="admin-button-com middle" :class="[form.debtLimitPay == 1 ? 'blue' : 'default']" @click="debtLimitPayBtn(1)" style="margin-left:15upx;">现金不能下单</button>
+              <view class="tui-title">挂账超额</view>
+              <view style="margin-left: auto; display: flex; align-items: center;">
+                <button class="admin-button-com middle" :class="[form.debtLimitPay == 0 ? 'blue' : 'default']" @click="debtLimitPayBtn(0)">现金可以买</button>
+                <button class="admin-button-com middle" :class="[form.debtLimitPay == 1 ? 'blue' : 'default']" @click="debtLimitPayBtn(1)" style="margin-left:20upx;">现金禁止买</button>
+              </view>
             </tui-list-cell>
 
             <tui-list-cell class="line-cell" :hover="false" :arrow="true" @click="pageTo({ url: '/admin/custom/debtChange',query: {customId: userInfo.id}})">
-              <div class="tui-title" style="width:300upx;">挂账变动(废弃)</div>
+              <view class="tui-title" style="width:300upx;">挂账变动(废弃)</view>
             </tui-list-cell>
 
         </view>
@@ -304,52 +322,52 @@
 
 		<modal-module :show="changeShow" @click="confirmChange" :maskClosable="true" title="修改名称" padding="30rpx 30rpx" >
       <template v-slot:content>
-        <div class="app-modal-input-wrap">
-        <div class="inp-list-line">
-          <div class="line-input">
+        <view class="app-modal-input-wrap">
+        <view class="inp-list-line">
+          <view class="line-input">
           <input type="text" style="width:61%;text-align:center;" :focus="changeFocus" v-model="customName" class="inp-input" />
-          </div>
-        </div>
-        </div>
+          </view>
+        </view>
+        </view>
       </template>
 		</modal-module>
 
 		<modal-module :show="czShow" @click="confirmRecharge" :maskClosable="true" title="充值余额" padding="30rpx 30rpx" >
       <template v-slot:content>
-        <div class="app-modal-input-wrap">
+        <view class="app-modal-input-wrap">
 
-        <div class="inp-list-line">
-          <div class="line-label">充值金额</div>
-          <div class="line-input">
+        <view class="inp-list-line">
+          <view class="line-label">充值金额</view>
+          <view class="line-input">
           <input type="digit" style="text-align:center;" :focus="czFocus" v-model="rechargeMoney" class="inp-input" />
-          </div>
-        </div>
+          </view>
+        </view>
 
-        <div class="inp-list-line">
-          <div class="line-label">充值类型</div>
-          <div class="line-input">
+        <view class="inp-list-line">
+          <view class="line-label">充值类型</view>
+          <view class="line-input">
             <button class="admin-button-com big" :class="[rechargeType == 0 ? 'blue' : '']" style="margin-right:25upx;" @click="rechargeType = 0">付款充值</button>
             <button class="admin-button-com big" :class="[rechargeType == 1 ? 'blue' : '']" @click="rechargeType = 1">售后返充</button>
-          </div>
-        </div>
+          </view>
+        </view>
 
-        <div class="inp-list-line" style="margin-top:35upx;" v-if="rechargeType == 0">
-					<div class="line-label">付款方式</div>
-					<div class="line-input">
+        <view class="inp-list-line" style="margin-top:35upx;" v-if="rechargeType == 0">
+					<view class="line-label">付款方式</view>
+					<view class="line-input">
                 <button style="margin-right:2upx;" class="admin-button-com middle" :class="[payWay == 0 ? 'blue' : '']" @click="payWay = 0">微 信</button>
                 <button style="margin-right:2upx;" class="admin-button-com middle" :class="[payWay == 1 ? 'blue' : '']" @click="payWay = 1">支付宝</button>
                 <button style="margin-right:2upx;" class="admin-button-com middle" :class="[payWay == 4 ? 'blue' : '']" @click="payWay = 4">现 金</button>
                 <button class="admin-button-com middle" :class="[payWay == 5 ? 'blue' : '']" @click="payWay = 5">银行卡</button>
-					</div>
-				</div>
-        </div>
+					</view>
+				</view>
+        </view>
 
-        <div class="inp-list-line">
-          <div class="line-label"></div>
-          <div class="line-input">
+        <view class="inp-list-line">
+          <view class="line-label"></view>
+          <view class="line-input">
           <input type="text" style="text-align:center;margin-top:40upx;font-size:32upx;" v-model="rechargeRemark" class="inp-input" placeholder="这里写备注" />
-          </div>
-        </div>
+          </view>
+        </view>
 
       </template>
 		</modal-module>
@@ -475,6 +493,7 @@ export default {
         home:1,
         homeAmount:0,
         homeNum:0,
+        homeUnMeet:0,
         risePercent:0,
         riseRange:0,
         wlId:0,
@@ -517,7 +536,7 @@ export default {
           }
         },
         {
-          name: "减余额",
+          name: "减余额",
           emoji: "✂️",
           funtion: () => {
             this.deductAmount = ''
@@ -547,7 +566,11 @@ export default {
     };
   },
 	computed: {
-		...mapGetters({ dictInfo:"getDictionariesInfo" })
+		...mapGetters({ dictInfo:"getDictionariesInfo" }),
+    /** 不满最低要求时:0 收运费,1 收包装费,对应费用输入框标题 */
+    homeUnFeeLabel () {
+      return Number(this.form.homeUnMeet) === 1 ? '包装费' : '运费'
+    }
 	},
 	onShareAppMessage(res) {
     let id = this.userInfo.ghsId ? this.userInfo.ghsId : 0
@@ -850,7 +873,11 @@ export default {
         }
       })
     },
-    changeHomeParams(){
+    /**
+     * 保存送货上门相关参数
+     * @param {boolean} validateFee - 是否校验运费/包装费(费用行点确定时为 true)
+     */
+    changeHomeParams(validateFee = false){
       if(this.$util.isEmpty(this.userInfo.homeAmount)){
         this.$msg('请填写最低消费金额')
         return false
@@ -859,14 +886,45 @@ export default {
         this.$msg('请填写最低消费扎数')
         return false
       }
-      let homeAmount = this.userInfo.homeAmount
-      let homeNum = this.userInfo.homeNum
-      modifyHomeParams({id:this.option.id,homeAmount:homeAmount,homeNum:homeNum}).then(res=>{
+      const homeUnMeet = Number(this.form.homeUnMeet) || 0
+      if (validateFee && homeUnMeet !== 2 && this.$util.isEmpty(this.userInfo.homeUnFee)) {
+        this.$msg(homeUnMeet === 1 ? '请填写包装费' : '请填写运费')
+        return false
+      }
+      modifyHomeParams({
+        id: this.option.id,
+        homeAmount: this.userInfo.homeAmount,
+        homeNum: this.userInfo.homeNum,
+        homeUnMeet: homeUnMeet,
+        homeUnFee: homeUnMeet === 2 ? 0 : (this.userInfo.homeUnFee || 0)
+      }).then(res=>{
         if(res.code == 1){
           this.$msg(res.msg)
         }
       })
     },
+    /**
+     * 切换「不满最低要求时」的处理方式
+     * @param {number} value - 0 收运费,1 收包装费,2 不能下单
+     */
+    homeUnMeetBtn (value) {
+      if (Number(this.form.homeUnMeet) === value) {
+        return true
+      }
+      this.form.homeUnMeet = value
+      this.userInfo.homeUnMeet = value
+      modifyHomeParams({
+        id: this.option.id,
+        homeAmount: this.userInfo.homeAmount,
+        homeNum: this.userInfo.homeNum,
+        homeUnMeet: value,
+        homeUnFee: value === 2 ? 0 : (this.userInfo.homeUnFee || 0)
+      }).then(res => {
+        if (res.code == 1) {
+          this.$msg(res.msg)
+        }
+      })
+    },
     changeShortName(){
       let shortName = this.userInfo.shortName||''
       modifyShortName({id:this.option.id,shortName:shortName}).then(res=>{
@@ -1064,6 +1122,17 @@ export default {
         }
       })
     },
+    changeHomeBtn(value){
+      if (Number(this.form.home) === value) {
+        return
+      }
+      this.form.home = value
+      toChangeHome({customId:this.userInfo.id,home:this.form.home}).then(res=>{
+        if(res.code == 1){
+          this.$msg(res.msg)
+        }
+      })
+    },
     passStatusChangeFn(e){
       this.form.passStatus = e.detail.value ? 1 : 0
       changePassStatus({customId:this.userInfo.id,passStatus:this.form.passStatus}).then(res=>{
@@ -1120,6 +1189,7 @@ export default {
         this.form.showStock = this.userInfo.showStock
         this.form.passStatus = this.userInfo.passStatus
         this.form.home = this.userInfo.home
+        this.form.homeUnMeet = this.userInfo.homeUnMeet != null ? Number(this.userInfo.homeUnMeet) : 0
         this.form.staffId = this.userInfo.staffId
         this.form.staffName = this.userInfo.staffName
         this.form.debtLimitPay = this.userInfo.debtLimitPay||0

+ 809 - 0
ghsApp/src/pagesOrder/shMethod.vue

@@ -0,0 +1,809 @@
+<!--
+  用途:配送方式配置页面
+  谁用:供货商管理员
+  解决什么问题:配置送货、自取、跑腿、快递、物流等配送方式的起送条件、计费规则、说明项等。
+-->
+<template>
+  <view class="sh-method-page app-content">
+    <!-- 顶部 Tab 切换 -->
+    <view class="tab-bar">
+      <view
+        v-for="(tab, index) in tabs"
+        :key="index"
+        class="tab-item"
+        :class="{ active: tabIndex === index }"
+        @click="changeTab(index)"
+      >
+        {{ tab.name }}
+      </view>
+    </view>
+
+    <!-- 配置表单区域 -->
+    <scroll-view scroll-y class="form-scroll">
+      <view class="form-container">
+
+        <tui-list-cell class="line-cell" :hover="false">
+          <view class="tui-title">名称</view>
+          <input type="text" v-model="form.name" @focus="form.name = ''" class="tui-input" placeholder="请填写名称" />
+        </tui-list-cell>
+
+        <!-- 状态 -->
+        <tui-list-cell class="line-cell" :hover="false">
+          <view class="tui-title">状态</view>
+          <view class="btn-group">
+            <button
+              class="admin-button-com middle"
+              :class="[form.status == 1 ? 'blue' : 'default']"
+              @click="form.status = 1"
+            >
+              启用
+            </button>
+            <button
+              class="admin-button-com middle"
+              :class="[form.status == 0 ? 'blue' : 'default']"
+              @click="form.status = 0"
+              style="margin-left: 20upx;"
+            >
+              禁用
+            </button>
+          </view>
+        </tui-list-cell>
+
+        <!-- 顺序 -->
+        <tui-list-cell class="line-cell" :hover="false">
+          <view class="tui-title">顺序</view>
+          <input type="number" v-model="form.sort" @focus="form.sort = ''" class="tui-input" placeholder="请填写顺序" />
+        </tui-list-cell>
+
+        <!-- 送货 / 快递 特有字段 -->
+        <block v-if="form.style === 0 || form.style === 4">
+          <tui-list-cell class="line-cell" :hover="false">
+            <view class="tui-title">最低消费金额</view>
+            <input type="digit" v-model="form.minAmount" @focus="form.minAmount = ''" class="tui-input" placeholder="不限制填0" />
+          </tui-list-cell>
+          <tui-list-cell class="line-cell" :hover="false">
+            <view class="tui-title">最低消费数量</view>
+            <input type="number" v-model="form.minNum" @focus="form.minNum = ''" class="tui-input" placeholder="不限制填0" />
+          </tui-list-cell>
+          <tui-list-cell class="line-cell" :hover="false">
+            <view class="tui-title">不满条件</view>
+            <view class="btn-group">
+              <button
+                class="admin-button-com middle"
+                :class="[form.unMeet == 0 ? 'blue' : 'default']"
+                @click="form.unMeet = 0"
+              >
+                收运费
+              </button>
+              <button
+                class="admin-button-com middle"
+                :class="[form.unMeet == 2 ? 'blue' : 'default']"
+                @click="form.unMeet = 2"
+                style="margin-left: 10upx;"
+              >
+                收包装费
+              </button>
+              <button
+                class="admin-button-com middle"
+                :class="[form.unMeet == 1 ? 'blue' : 'default']"
+                @click="form.unMeet = 1"
+                style="margin-left: 10upx;"
+              >
+                不能买
+              </button>
+            </view>
+          </tui-list-cell>
+          <tui-list-cell class="line-cell" :hover="false" v-if="form.unMeet != 1">
+            <view class="tui-title">{{ form.unMeet == 2 ? '包装费' : '运费' }}</view>
+            <input type="digit" v-model="form.unMeetFee" @focus="form.unMeetFee = ''" class="tui-input" placeholder="请填写金额" />
+          </tui-list-cell>
+        </block>
+
+        <!-- 跑腿 特有字段 -->
+        <block v-if="form.style === 2">
+          <!-- 满减规则圈起来 -->
+          <view class="rule-section-wrapper">
+            <view class="section-header no-margin">
+              <text class="section-title">满减规则</text>
+              <button class="admin-button-com mini blue" @click="addReduceRule">添加</button>
+            </view>
+            <view class="rule-list" v-if="form.reduceRules && form.reduceRules.length > 0">
+              <view class="rule-card" v-for="(rule, index) in form.reduceRules" :key="index">
+                <view class="rule-row">
+                  <text class="rule-label">满</text>
+                  <input type="number" v-model="rule.meetNum" @focus="rule.meetNum = ''" class="rule-input" placeholder="0" />
+                  <text class="rule-label">扎 且</text>
+                  <input type="digit" v-model="rule.meetAmount" @focus="rule.meetAmount = ''" class="rule-input-large" placeholder="0.00" />
+                  <text class="rule-label">元</text>
+                  <input type="digit" v-model="rule.freeKm" @focus="rule.freeKm = ''" class="rule-input-large" placeholder="0" />
+                  <text class="rule-label">公里内免跑腿费</text>
+                </view>
+                <button class="admin-button-com mini rule-del-btn" @click="removeReduceRule(index)">
+                  删除
+                </button>
+              </view>
+            </view>
+            <view class="no-data-tip" v-else>暂无满减规则</view>
+          </view>
+
+          <view class="notice-text">
+            不符合满减规则时,将通过跑腿计算运费,跑腿无法使用时,将使用自定义计费
+          </view>
+
+          <!-- 自定义计费 -->
+          <view class="section-header">
+            <text class="section-title">自定义计费</text>
+          </view>
+          <tui-list-cell class="line-cell" :hover="false">
+            <view class="tui-title">起步价</view>
+            <view class="input-row">
+              <input type="digit" v-model="form.startKm" @focus="form.startKm = ''" class="tui-input-sm" placeholder="0" />
+              <text class="unit-text">km内</text>
+              <input type="digit" v-model="form.startPrice" @focus="form.startPrice = ''" class="tui-input-sm" placeholder="0.00" />
+              <text class="unit-text">元</text>
+            </view>
+          </tui-list-cell>
+          <tui-list-cell class="line-cell" :hover="false">
+            <view class="tui-title">超出起步</view>
+            <view class="input-row">
+              <text class="unit-text">每公里加</text>
+              <input type="digit" v-model="form.perKmPrice" @focus="form.perKmPrice = ''" class="tui-input-sm" placeholder="0.00" />
+              <text class="unit-text">元</text>
+            </view>
+          </tui-list-cell>
+          <tui-list-cell class="line-cell" :hover="false">
+            <view class="tui-title">临时涨价</view>
+            <view class="input-row">
+              <input type="digit" v-model="form.changeRate" @focus="form.changeRate = ''" class="tui-input-sm" placeholder="0" />
+              <text class="unit-text">%</text>
+              <text class="unit-text">填负值时为降价</text>
+            </view>
+          </tui-list-cell>
+        </block>
+
+        <!-- 物流 特有字段 -->
+        <block v-if="form.style === 3">
+          <tui-list-cell class="line-cell" :hover="false">
+            <view class="tui-title">配送物流</view>
+            <view style="margin-left: auto;">
+              <button class="admin-button-com middle blue" @click="manageWl">管理物流</button>
+            </view>
+          </tui-list-cell>
+        </block>
+
+        <!-- 说明项区域圈起来 -->
+        <view class="explain-section-wrapper">
+          <view class="section-header no-margin">
+            <text class="section-title">说明(最多5个)</text>
+            <button class="admin-button-com mini blue" @click="addExplain">添加</button>
+          </view>
+          <view class="explain-list" v-if="form.explains && form.explains.length > 0">
+            <view class="explain-card" v-for="(exp, index) in form.explains" :key="index">
+              <textarea
+                v-model="exp.explain"
+                class="explain-textarea"
+                placeholder="最多50个字"
+                maxlength="50"
+                :class="[
+                  exp.color == 2 ? 'text-red' : '',
+                  exp.color == 3 ? 'text-blue' : '',
+                  exp.fontWeight == 2 ? 'text-bold' : ''
+                ]"
+              />
+              <view class="explain-actions">
+                <view class="action-group">
+                  <button
+                    class="admin-button-com mini"
+                    :class="[exp.color == 1 ? 'blue' : 'default']"
+                    @click="setExplainColor(index, 1)"
+                  >
+                    黑色
+                  </button>
+                  <button
+                    class="admin-button-com mini"
+                    :class="[exp.color == 2 ? 'blue' : 'default']"
+                    @click="setExplainColor(index, 2)"
+                    style="margin-left: 10upx;"
+                  >
+                    红色
+                  </button>
+                  <button
+                    class="admin-button-com mini"
+                    :class="[exp.color == 3 ? 'blue' : 'default']"
+                    @click="setExplainColor(index, 3)"
+                    style="margin-left: 10upx;"
+                  >
+                    蓝色
+                  </button>
+                </view>
+                <view class="action-group" style="margin-left: 20upx;">
+                  <button
+                    class="admin-button-com mini"
+                    :class="[exp.fontWeight == 1 ? 'blue' : 'default']"
+                    @click="setExplainWeight(index, 1)"
+                  >
+                    常规
+                  </button>
+                  <button
+                    class="admin-button-com mini"
+                    :class="[exp.fontWeight == 2 ? 'blue' : 'default']"
+                    @click="setExplainWeight(index, 2)"
+                    style="margin-left: 10upx;"
+                  >
+                    加粗
+                  </button>
+                </view>
+              <button class="admin-button-com mini explain-del-btn" @click="removeExplain(index)">
+                删除
+              </button>
+              </view>
+            </view>
+          </view>
+          <view class="no-data-tip" v-else>暂无说明项</view>
+        </view>
+      </view>
+    </scroll-view>
+
+    <!-- 底部保存按钮 -->
+    <view class="footer-btn-wrap">
+      <view class="sort-indicator">
+        <text class="sort-label">显示顺序:</text>
+        <text class="sort-value">{{ sortedMethodsText }}</text>
+      </view>
+      <button class="admin-button-com big blue" @click="submitSave">保存</button>
+    </view>
+  </view>
+</template>
+
+<script>
+import TuiListCell from "@/components/plugin/list-cell";
+import { getShMethodConfig, saveShMethodConfig, getShMethodSorts } from "@/api/sh-method";
+
+export default {
+  name: "shMethod",
+  components: {
+    TuiListCell
+  },
+  data() {
+    return {
+      tabs: [
+        { name: "送货", value: 0 },
+        { name: "自取", value: 1 },
+        { name: "跑腿", value: 2 },
+        { name: "快递", value: 4 },
+        { name: "物流", value: 3 }
+      ],
+      tabIndex: 0,
+      sortsList: [], // 存储所有配送方式的排序和别名信息
+      form: {
+        id: 0,
+        style: 0,
+        name: "",
+        status: 1,
+        sort: 0,
+        minAmount: 0.00,
+        minNum: 0,
+        unMeet: 0,
+        unMeetFee: 0.00,
+        startKm: 0.00,
+        startPrice: 0.00,
+        perKmPrice: 0.00,
+        changeRate: 0.00,
+        explains: [],
+        reduceRules: []
+      }
+    };
+  },
+  computed: {
+    // 动态计算并按顺序值由小到大列出所有配送方式别名
+    sortedMethodsText() {
+      // 过滤掉已禁用的配送方式(status === 0)
+      const enabledList = this.sortsList.filter(item => item.status !== 0);
+      if (enabledList.length === 0) {
+        return "暂无启用的配送方式";
+      }
+      // 复制一份数组以避免直接修改 state
+      const sorted = [...enabledList];
+      // 按 sort 升序,若 sort 相同则按 style 升序
+      sorted.sort((a, b) => {
+        if (a.sort !== b.sort) {
+          return a.sort - b.sort;
+        }
+        return a.style - b.style;
+      });
+      // 拼接成 "送货 > 自取 > 跑腿..." 的格式
+      return sorted.map(item => item.name).join(" - ");
+    }
+  },
+  onLoad() {
+    this.loadConfig(0);
+    this.loadSorts();
+  },
+  methods: {
+    init(){},
+    /**
+     * 加载所有配送方式的排序和别名信息
+     */
+    loadSorts() {
+      getShMethodSorts()
+        .then(res => {
+          if (res.code == 1 && res.data) {
+            this.sortsList = res.data;
+          }
+        })
+        .catch(err => {
+          console.error("加载排序信息失败", err);
+        });
+    },
+    /**
+     * 切换 Tab
+     * @param {number} index - 选中的 Tab 索引
+     */
+    changeTab(index) {
+      if (this.tabIndex === index) return;
+      this.tabIndex = index;
+      this.loadConfig(this.tabs[index].value);
+    },
+
+    /**
+     * 加载当前配送方式配置
+     * @param {number} style - 配送类型 (0-4)
+     */
+    loadConfig(style) {
+      getShMethodConfig({ style }).then(res => {
+          if (res.code == 1 && res.data) {
+            const data = res.data;
+            this.form = {
+              id: data.id || 0,
+              style: style,
+              name: data.name || "",
+              status: data.status != null ? Number(data.status) : 1,
+              sort: data.sort != null ? Number(data.sort) : 0,
+              minAmount: data.minAmount != null ? parseFloat(data.minAmount) : 0.00,
+              minNum: data.minNum != null ? Number(data.minNum) : 0,
+              unMeet: data.unMeet != null ? Number(data.unMeet) : 0,
+              unMeetFee: data.unMeetFee != null ? parseFloat(data.unMeetFee) : 0.00,
+              startKm: data.startKm != null ? parseFloat(data.startKm) : 0.00,
+              startPrice: data.startPrice != null ? parseFloat(data.startPrice) : 0.00,
+              perKmPrice: data.perKmPrice != null ? parseFloat(data.perKmPrice) : 0.00,
+              changeRate: data.changeRate != null ? parseFloat(data.changeRate) : 0.00,
+              explains: (data.explains || []).map(exp => ({
+                ...exp,
+                color: exp.color != null ? Number(exp.color) : 1,
+                fontWeight: exp.fontWeight != null ? Number(exp.fontWeight) : 1
+              })),
+              reduceRules: data.reduceRules || []
+            }
+          } else {
+            this.$msg(res.msg || "加载失败")
+          }
+        }).catch(err => {
+          this.$msg("加载失败,请重试");
+        })
+    },
+
+    /**
+     * 添加满减规则
+     */
+    addReduceRule() {
+      this.form.reduceRules.push({
+        meetNum: 0,
+        meetAmount: 0.00,
+        freeKm: 0,
+        sort: this.form.reduceRules.length
+      });
+    },
+
+    /**
+     * 删除满减规则
+     * @param {number} index - 规则索引
+     */
+    removeReduceRule(index) {
+      this.$util.confirmModal({ content: "确认删除该满减规则吗?" }, () => {
+        this.form.reduceRules.splice(index, 1);
+      });
+    },
+
+    /**
+     * 添加说明项
+     */
+    addExplain() {
+      if (this.form.explains.length >= 5) {
+        this.$msg("最多只能添加5条说明");
+        return;
+      }
+      this.form.explains.push({
+        explain: "",
+        color: 1, // 1: 黑色, 2: 红色, 3: 蓝色
+        fontWeight: 1, // 1: 常规, 2: 加粗
+        sort: this.form.explains.length
+      });
+    },
+
+    /**
+     * 删除说明项
+     * @param {number} index - 说明索引
+     */
+    removeExplain(index) {
+      this.$util.confirmModal({ content: "确认删除该说明吗?" }, () => {
+        this.form.explains.splice(index, 1);
+      });
+    },
+
+    /**
+     * 设置说明项颜色
+     * @param {number} index - 说明项索引
+     * @param {number} color - 颜色值 (1: 黑色, 2: 红色, 3: 蓝色)
+     */
+    setExplainColor(index, color) {
+      const exp = this.form.explains[index];
+      if (exp) {
+        exp.color = color;
+        // 强制触发 Vue 2 数组/对象响应式更新
+        this.$set(this.form.explains, index, { ...exp });
+      }
+    },
+
+    /**
+     * 设置说明项字重
+     * @param {number} index - 说明项索引
+     * @param {number} fontWeight - 字重值 (1: 常规, 2: 加粗)
+     */
+    setExplainWeight(index, fontWeight) {
+      const exp = this.form.explains[index];
+      if (exp) {
+        exp.fontWeight = fontWeight;
+        // 强制触发 Vue 2 数组/对象响应式更新
+        this.$set(this.form.explains, index, { ...exp });
+      }
+    },
+
+    /**
+     * 跳转至物流管理
+     */
+    manageWl() {
+      this.$util.pageTo({ url: "/admin/shop/wl" });
+    },
+
+    /**
+     * 保存当前配置
+     */
+    submitSave() {
+      if (this.$util.isEmpty(this.form.name)) {
+        this.$msg("请填写别名");
+        return;
+      }
+
+      // 验证说明项内容
+      for (let i = 0; i < this.form.explains.length; i++) {
+        if (this.$util.isEmpty(this.form.explains[i].explain)) {
+          this.$msg(`请填写第 ${i + 1} 条说明内容`);
+          return;
+        }
+      }
+      saveShMethodConfig(this.form).then(res => {
+          if (res.code == 1) {
+            this.$msg("保存成功");
+            // 重新加载配置刷新数据
+            this.loadConfig(this.form.style);
+            // 重新加载排序和别名信息
+            this.loadSorts();
+          } else {
+            this.$msg(res.msg || "保存失败");
+          }
+        })
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+.sh-method-page {
+  display: flex;
+  flex-direction: column;
+  height: 100vh;
+  background-color: #f5f5f5;
+}
+
+/* 顶部 Tab 栏 */
+.tab-bar {
+  display: flex;
+  background-color: #ffffff;
+  border-bottom: 1upx solid #eeeeee;
+  position: sticky;
+  top: 0;
+  z-index: 10;
+  height: 90upx;
+  align-items: center;
+}
+
+.tab-item {
+  flex: 1;
+  text-align: center;
+  font-size: 34upx;
+  color: #666666;
+  height: 90upx;
+  line-height: 90upx;
+  position: relative;
+  transition: all 0.2s ease;
+  font-weight: bold;
+  &.active {
+    color: #3385ff;
+    font-weight: bold;
+
+    &::after {
+      content: "";
+      position: absolute;
+      bottom: 0;
+      left: 50%;
+      transform: translateX(-50%);
+      width: 40upx;
+      height: 4upx;
+      background-color: #3385ff;
+      border-radius: 2upx;
+    }
+  }
+}
+
+/* 表单区域 */
+.form-scroll {
+  flex: 1;
+  overflow: hidden;
+}
+
+.form-container {
+  padding: 20upx 20upx 160upx 20upx;
+}
+
+.line-cell {
+  background-color: #ffffff;
+  border-radius: 12upx;
+  margin-bottom: 20upx;
+}
+
+.tui-title {
+  font-size: 30upx;
+  color: #333333;
+  width: 200upx;
+}
+
+.tui-input {
+  flex: 1;
+  font-size: 30upx;
+  color: #333333;
+  text-align: right;
+}
+
+.btn-group {
+  display: flex;
+  align-items: center;
+  margin-left: auto;
+}
+
+/* 跑腿自定义计费输入行 */
+.input-row {
+  display: flex;
+  align-items: center;
+  justify-content: flex-end;
+  flex: 1;
+}
+
+.tui-input-sm {
+  width: 120upx;
+  height: 60upx;
+  border: 1upx solid #dddddd;
+  border-radius: 8upx;
+  font-size: 28upx;
+  text-align: center;
+  color: #333333;
+  background-color: #fafafa;
+}
+
+.unit-text {
+  font-size: 26upx;
+  color: #666666;
+  margin: 0 10upx;
+}
+
+/* 模块标题 */
+.section-header {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  margin: 30upx 10upx 15upx 10upx;
+}
+
+.section-title {
+  font-size: 30upx;
+  font-weight: bold;
+  color: #333333;
+}
+
+/* 满减规则卡片 */
+.rule-list {
+  margin-bottom: 20upx;
+}
+
+.rule-card {
+  background-color: #ffffff;
+  border-radius: 12upx;
+  padding: 20upx 10upx;
+  margin-bottom: 20upx;
+  border: 1upx solid #eef2f9;
+  display: flex;
+  flex-direction: column;
+}
+
+.rule-row {
+  display: flex;
+  align-items: center;
+  flex-wrap: wrap;
+  font-size: 26upx;
+  color: #333333;
+}
+
+.rule-label {
+  margin: 0 8upx;
+}
+
+.rule-input {
+  width: 80upx;
+  height: 50upx;
+  border: 1upx solid #cccccc;
+  border-radius: 6upx;
+  text-align: center;
+  font-size: 26upx;
+  background-color: #fafafa;
+}
+
+.rule-input-large {
+  width: 90upx;
+  height: 50upx;
+  border: 1upx solid #cccccc;
+  border-radius: 6upx;
+  text-align: center;
+  font-size: 26upx;
+  background-color: #fafafa;
+}
+
+.rule-del-btn {
+  margin-top: 15upx;
+  align-self: flex-end; /* 靠右边 */
+  background-color: #fff5f5 !important;
+  color: #ff3841 !important;
+  border: 1upx solid #ffcccc !important;
+}
+
+/* 提示文字 */
+.notice-text {
+  font-size: 32upx;
+  color: #ff6900;
+  line-height: 36upx;
+  padding: 15upx 20upx;
+  background-color: #fffaf5;
+  border-radius: 8upx;
+  border: 1upx solid #ffe8d6;
+  margin: 10upx 0upx;
+}
+
+/* 说明项区域圈起来 */
+.explain-section-wrapper,
+.rule-section-wrapper {
+  background-color: #ffffff;
+  border-radius: 12upx;
+  padding: 24upx;
+  margin-top: 30upx;
+  border: 1upx solid #eef2f9;
+  box-shadow: 0 2upx 8upx rgba(0, 0, 0, 0.02);
+}
+
+.no-margin {
+  margin-top: 0 !important;
+  margin-left: 0 !important;
+  margin-right: 0 !important;
+  margin-bottom: 20upx !important;
+}
+
+/* 说明卡片 */
+.explain-list {
+  margin-bottom: 20upx;
+}
+
+.explain-card {
+  background-color: #ffffff;
+  border-radius: 12upx;
+  padding: 20upx;
+  margin-bottom: 20upx;
+  border: 1upx solid #eef2f9;
+}
+
+.explain-textarea {
+  width: 100%;
+  height: 135upx;
+  font-size: 30upx;
+  color: #333333;
+  background-color: #fafafa;
+  border: 1upx solid #eeeeee;
+  border-radius: 8upx;
+  padding: 15upx;
+  box-sizing: border-box;
+  margin-bottom: 15upx;
+}
+
+.explain-actions {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+}
+
+.action-group {
+  display: flex;
+  align-items: center;
+}
+
+.explain-del-btn {
+  margin-left: auto;
+  background-color: #fff5f5 !important;
+  color: #ff3841 !important;
+  border: 1upx solid #ffcccc !important;
+}
+
+/* 文本样式控制 */
+.text-red {
+  color: #ff3841 !important;
+}
+
+.text-blue {
+  color: #3385ff !important;
+}
+
+.text-bold {
+  font-weight: bold !important;
+}
+
+.no-data-tip {
+  font-size: 26upx;
+  color: #999999;
+  text-align: center;
+  padding: 40upx 0;
+}
+
+/* 底部保存按钮 */
+.footer-btn-wrap {
+  position: fixed;
+  bottom: 0;
+  left: 0;
+  right: 0;
+  background-color: #ffffff;
+  padding: 20upx 30upx;
+  border-top: 1upx solid #eeeeee;
+  z-index: 10;
+  display: flex;
+  justify-content: space-between; /* 居左边展示顺序,居右边保存按钮 */
+  align-items: center;
+}
+
+.sort-indicator {
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+  flex: 1;
+  margin-right: 20upx;
+}
+
+.sort-label {
+  font-size: 28upx;
+  color: #999999;
+}
+
+.sort-value {
+  font-size: 28upx;
+  color: #333333;
+  margin-top: 4upx;
+}
+
+.footer-btn-wrap .admin-button-com.big {
+  width: 180upx !important; /* 按钮长一些 */
+  margin: 0 !important; /* 清除默认居中 margin */
+}
+</style>

+ 57 - 8
hdApp/src/admin/home/components/purchase-ghs-panel.vue

@@ -21,6 +21,11 @@
                 <image class="function-icon" :src="iconSrc('store')" mode="aspectFit" />
                 <text class="function-text function-text--overlay function-text--sm">切换门店</text>
               </view>
+              <view class="function-item function-item--overlay"
+                @click="pageTo({ url: '/admin/staff/list'})">
+                <image class="function-icon" :src="iconSrc('staff')" mode="aspectFit" />
+                <text class="function-text function-text--overlay function-text--sm">我的员工</text>
+              </view>
               <view class="function-item function-item--overlay"
                 @click="pageTo({ url: '/admin/shop/add?id=' + loginInfo.shopId })">
                 <image class="function-icon" :src="iconSrc('stock-my-address')" mode="aspectFit" />
@@ -30,14 +35,11 @@
                 <image class="function-icon" :src="iconSrc('stock-purchase-stats')" mode="aspectFit" />
                 <text class="function-text function-text--overlay function-text--sm">采购统计</text>
               </view>
-              <view class="function-item function-item--overlay" @click="goMore()">
-                <image class="function-icon" :src="iconSrc('stock-deleted-wholesaler')" mode="aspectFit" />
-                <text class="function-text function-text--overlay function-text--sm">已删商家</text>
-              </view>
-              <view class="function-item function-item--overlay" @click="getMall()">
-                <image class="function-icon" :src="iconSrc('open-shop')" mode="aspectFit" />
-                <text class="function-text function-text--overlay function-text--sm">零售商城</text>
+              <view class="function-item function-item--overlay" @click="openWorkbenchMore()">
+                <image class="function-icon" :src="iconSrc('stock-more-features')" mode="aspectFit" />
+                <text class="function-text function-text--overlay function-text--sm">更多操作</text>
               </view>
+
             </view>
           </view>
 
@@ -213,6 +215,33 @@
       </view>
     </uni-popup>
 
+    <!-- 工作台更多操作:零售商城、已删商家 -->
+    <uni-popup ref="workbenchMorePopup" background-color="transparent" type="center" :animation="true" class="ghs-more-popup">
+      <view class="ghs-more-card">
+        <view class="ghs-more-header">
+          <text class="ghs-more-title">更多操作</text>
+          <text class="ghs-more-subtitle">请选择功能</text>
+        </view>
+        <view class="ghs-more-body">
+          <view class="ghs-more-row ghs-more-row--primary" @click="goMallFromMore()">
+            <text class="ghs-more-row__label">零售商城</text>
+            <text class="ghs-more-row__arrow">›</text>
+          </view>
+          <view class="ghs-more-row" @click="goDeletedWholesaler()">
+            <text class="ghs-more-row__label">已删商家</text>
+            <text class="ghs-more-row__arrow">›</text>
+          </view>
+          <view class="ghs-more-row" @click="goDimissionFromMore()">
+            <text class="ghs-more-row__label">申请离职</text>
+            <text class="ghs-more-row__arrow">›</text>
+          </view>
+        </view>
+        <view class="ghs-more-footer">
+          <view class="ghs-more-cancel" @click="closeWorkbenchMore()">取消</view>
+        </view>
+      </view>
+    </uni-popup>
+
     <!-- 多供货商提示弹框 -->
     <uni-popup ref="supplierNoticePopup" background-color="#fff" type="center" :animation="true"
       class="supplier-notice-popup">
@@ -438,9 +467,29 @@ export default {
         }
       })
     },
-    goMore() {
+    /** 打开工作台更多操作弹框 */
+    openWorkbenchMore() {
+      this.$refs.workbenchMorePopup.open('center')
+    },
+    /** 关闭工作台更多操作弹框 */
+    closeWorkbenchMore() {
+      this.$refs.workbenchMorePopup.close()
+    },
+    /** 更多操作:跳转已删商家 */
+    goDeletedWholesaler() {
+      this.closeWorkbenchMore()
       this.$util.pageTo({ url: '/pagesPurchase/pb' })
     },
+    /** 更多操作:跳转零售商城 */
+    goMallFromMore() {
+      this.closeWorkbenchMore()
+      this.getMall()
+    },
+    /** 更多操作:跳转申请离职 */
+    goDimissionFromMore() {
+      this.closeWorkbenchMore()
+      this.$util.pageTo({ url: '/admin/staff/dimission' })
+    },
     getMall(){
       this.$util.pageTo({ url: '/pagesPurchase/open' })
     },

+ 4 - 4
hdApp/src/pagesPurchase/components/item.vue

@@ -17,12 +17,12 @@
 				<view class="kc num-open_bx flex-space">
 					<view>
 						<view class="flex-space" v-if="Number(info.discountPrice)>0" style="position:absolute;top:14upx;">
-							<view style="padding:6upx 5upx 6upx 5upx;text-align: center;color: red;border: 1px solid red;line-height: 1;font-size: 24upx">
+							<view style="padding:6upx 5upx 6upx 5upx;border-radius: 10upx;text-align: center;color: white;background-color: red;border: 1px solid red;line-height: 1;font-size: 24upx">
 								{{parseFloat(((Number(info.discountPrice)/Number(info.prePrice)).toFixed(2)*10).toFixed(1))+'折'}}
 							</view>
 
-							<text v-if="info.ratioType == 0" style="margin-left:6upx;color:#333333;font-size: 26upx;">{{info.ratio}}{{info.smallUnit}}</text>
-							<text v-else style="margin-left:6upx;color:#333333;font-size: 26upx;">若干</text>
+							<text v-if="info.ratioType == 0" style="margin-left:5upx;color:#333333;font-size: 24upx;">{{info.ratio}}{{info.smallUnit}}</text>
+							<text v-else style="margin-left:5upx;color:#333333;font-size: 24upx;">若干</text>
 
 						</view>
 						<view class="flex-space" style="color:#333333;position:absolute;top:13upx;" v-else>
@@ -404,7 +404,7 @@ export default {
 				font-size: 28upx;
 				color: #ff2842;
 				flex: 1;
-				top:60upx;
+				top:68upx;
 				font-weight:550;
 			}
 			& .open-bx {

+ 51 - 20
hdApp/src/pagesPurchase/ghsProduct.vue

@@ -29,7 +29,7 @@
 			</view>
 			<view style="padding:0 0upx 0 20upx;" >
 				<button class="admin-button-com middle blue" v-if="ghsInfo.presell && ghsInfo.presell == 1" style="background-color:#09C567;border:1upx solid #09C567;" @click="aheadCg(ghsInfo)">预订花材</button>
-				<button class="admin-button-com middle blue" v-else @click="delMemory()" style="background-color: red;border:1upx solid red;">清空购物</button>
+				<button class="admin-button-com middle blue" v-else @click="delMemory()" style="background-color: red;border:1upx solid red;">清空购物</button>
 			</view>
 		</view>
 
@@ -101,14 +101,20 @@
 			<view style="position: fixed;bottom: 108upx;width:100vw;background-color:white;" @click.stop="">
 				<view class="commodity-view">
 					<view class="summary-bar">
-						<button class="admin-button-com blue middle" @click.stop="delMemory()" style="background-color: red;border:1upx solid red;">清空购物</button>
+						<button class="admin-button-com blue middle" @click.stop="delMemory()" style="background-color: red;border:1upx solid red;">清空购物</button>
 					</view>
 					<view class="commodity-list">
 						<view class="commodity-item" v-for="(item, index) in selectList" :key="index">
 							<image class="item-icon" :src="item.cover" />
 							<view class="item-info">
 								<view class="info-line">
-									<text class="item-name">{{ item.name }}</text>
+									<view class="name-unit-col">
+										<text class="item-name">{{ item.name }}</text>
+										<text class="item-unit">
+											<block v-if="item.ratioType == 0">{{ item.ratio }}{{ item.smallUnit }}/{{ item.bigUnit }}</block>
+											<block v-else>若干{{ item.smallUnit }}/{{ item.bigUnit }}</block>
+										</text>
+									</view>
 									<view class="item-price-col">
 										<text class="item-price">
 											<text v-if="isReachDiscountReached(item)" class="price-original">¥{{ parseFloat(item.bigPrice || item.price) }}</text>
@@ -123,13 +129,13 @@
 									{{ getLimitBuyWarn(item) }}
 								</view>
 								<view style="text-align:right;">
-									<view class="open-bx" >
+									<view class="open-bx cart-open-bx">
 										<text class="iconfont iconjian" @click.stop="delItem(item)" v-if="item.bigCount > 0 || item.smallCount > 0"></text>
 										<text class="num" @click.stop="customUpdate(item)">
 										<text v-if="item.bigCount > 0" style="font-weight:bold;color:#3385ff;">{{ item.bigCount }}</text>
 										<text v-if="item.smallCount > 0"><text v-if="item.bigCount > 0">/</text>{{ item.smallCount }}</text>
 										</text>
-										<text class="iconfont iconzeng" @click.stop="addAction(item)"></text>
+										<text class="iconfont iconzeng add-btn" @click.stop="addAction(item)"></text>
 									</view>
 								</view>
 							</view>
@@ -1031,14 +1037,25 @@ export default {
 					display: flex;
 					justify-content: space-between;
 					align-items: flex-end;
+					.name-unit-col {
+						flex: 1;
+						min-width: 0;
+					}
 					.item-name {
 						color: #666;
-						font-size: 34upx;
+						font-size: 36upx;
+						font-weight: bold;
 						overflow: hidden;
 						white-space: nowrap;
 						text-overflow: ellipsis;
 						width:400upx;
 					}
+					.item-unit {
+						display: block;
+						margin-top: 8upx;
+						color: #999;
+						font-size: 30upx;
+					}
 					.item-price {
 						color: #333;
 						font-size: 26upx;
@@ -1065,31 +1082,45 @@ export default {
 			.limit-buy-tip {
 				position: absolute;
 				left: 0;
-				top: 86upx;
+				top: 100upx;
 				color: red;
 				font-size: 30upx;
 				text-align: left;
 			}
 
-
-	.open-bx {
+	/* 加减按钮尺寸对齐本页花材列表 item 组件 */
+	.cart-open-bx {
+		display: flex;
 		align-items: center;
+		justify-content: flex-end;
+		box-sizing: border-box;
+		flex-shrink: 0;
 		& .iconfont {
-			color: #3385ff;
-			font-size: 60upx;
+			color: #09C567;
+			font-size: 55upx;
+		}
+		& .iconfont.add-btn {
+			font-size: 70upx;
+			line-height: 1;
+			padding: 6upx;
+			margin: -6upx 0 -6upx 0;
+			box-sizing: content-box;
 		}
-
 		& > .num {
-			display: inline-block;
-			width: 130upx;
-			height:55upx;
-			line-height:55upx;
-			text-align:center;
+			display: inline-flex;
+			align-items: center;
+			justify-content: center;
+			min-width: 100upx;
+			height: 60upx;
+			line-height: 60upx;
+			text-align: center;
 			margin: 0 8upx;
-			color: #868686;
-			border-radius: 22upx;
+			color: #757575;
+			border-radius: 25upx;
 			background-color: #f5f5f5;
-			font-size: 34upx;
+			font-size: 32upx;
+			box-sizing: border-box;
+			padding: 0 8upx;
 		}
 	}
 

File diff ditekan karena terlalu besar
+ 0 - 0
hdApp/src/static/icons/open-shop.svg


File diff ditekan karena terlalu besar
+ 0 - 0
hdApp/src/static/icons/stock-deleted-wholesaler.svg


+ 4 - 1
mallApp/src/pages/item/item.vue

@@ -339,6 +339,7 @@ export default {
 
 			if(this.option.hdId && Number(this.option.hdId) > 0){
 				this.hdId = this.option.hdId
+				uni.setStorageSync('hdId', this.hdId)
 			}
 
 			const shopId = uni.getStorageSync('account')
@@ -356,6 +357,8 @@ export default {
 						if(Number(this.hdId) == 0){
 							this.hdId = res.data.hd.id
 						}
+						// 解决新用户扫码登录后,限购接口报“没有找到花店”的Bug,需要同步更新缓存中的 hdId
+						uni.setStorageSync('hdId', res.data.hd.id)
 					}
 
 					//保存当前所在门店信息
@@ -513,7 +516,7 @@ export default {
 						}
 					})
 				if (newList.length > 0) {
-					getLimitBuyInfo({ ghsId, list: newList }).then(res => {
+					getLimitBuyInfo({ ghsId,account: account, hdId: this.hdId, list: newList }).then(res => {
 						const limitBuyInfo = Array.isArray(res.data) ? res.data : []
 						const warnList = limitBuyInfo.filter(item => item.specialPrice === false && item.reachLimitBuyNum === true)
 						if (warnList.length > 0) {

Beberapa file tidak ditampilkan karena terlalu banyak file yang berubah dalam diff ini