shish 2 luni în urmă
părinte
comite
7633eec2f1
1 a modificat fișierele cu 2016 adăugiri și 6 ștergeri
  1. 2016 6
      hdApp/src/pagesPurchase/order.vue

+ 2016 - 6
hdApp/src/pagesPurchase/order.vue

@@ -1,15 +1,2025 @@
 <template>
-  <view class="ghs_list_page flex-col">
+  <view>
+    <block v-if="loginStyle == 0">
+      <view class="login-page">
+        <view class="login-hero">
+          <image
+            class="login-hero-bg"
+            :src="constant.hostUrl + '/image//workbench-header-bg.webp'"
+            mode="aspectFill"
+          />
+          <view class="login-hero-scrim"></view>
+          <view class="status-space" :style="{ height: statusBarHeight + 'px' }"></view>
+          <view class="login-hero-inner">
+            <text class="login-hero-title">花掌柜</text>
+            <text class="login-hero-desc">登录查看我的门店</text>
+          </view>
+        </view>
+        <view class="login-body">
+          <!-- #ifdef MP-WEIXIN -->
+          <view class="login-card">
+            <view class="login-card-top">
+              <view class="login-card-icon-wrap login-card-icon-wrap--buy">
+                <image class="login-card-icon" :src="iconSrc('bouquet')" mode="aspectFit" />
+              </view>
+              <view class="login-card-main">
+                <text class="login-card-title">个人买花</text>
+                <text class="login-card-desc">购买花材、花束和绿植</text>
+              </view>
+            </view>
+            <button class="login-card-btn login-card-btn--outline" @click="buyItem">买花</button>
+          </view>
+          <!-- #endif -->
+          <view class="login-card">
+            <view class="login-card-top">
+              <view class="login-card-icon-wrap login-card-icon-wrap--supply">
+                <image class="login-card-icon" :src="iconSrc('procurement')" mode="aspectFit" />
+              </view>
+              <view class="login-card-main">
+                <text class="login-card-title">花店进货</text>
+                <text class="login-card-desc">花店买花材、采购和管理</text>
+              </view>
+            </view>
+            <button
+              class="login-card-btn login-card-btn--primary"
+              @click="pageTo({ url: '/admin/home/login' })"
+            >登录</button>
+          </view>
+          <view class="login-register" @click="pageTo({ url: '/pagesClient/official/apply' })">
+            <text class="login-register-tip">还没有花店账号?</text>
+            <text class="login-register-link">花店注册</text>
+          </view>
+        </view>
+      </view>
+    </block>
+    <block v-else>
+      <view class="order-page">
+        <view class="ghs_list_page flex-col">
+          <view class="profile-section">
+            <image class="workbench-header-bg" :src="constant.hostUrl + '/image//workbench-header-bg.webp'" mode="aspectFill"></image>
+            <view class="status-safe-area" :style="{ height: statusBarHeight + 'px' }"></view>
+            <view class="custom-nav">
+              <text class="custom-nav-title">{{ workbenchTitle }}</text>
+            </view>
+            <!-- <view class="profile-header">
+              <view class="avatar-container">
+                <button class="avatar-button" open-type="chooseAvatar" @chooseavatar="onChooseAvatar">
+                  <image class="avatar" :src="shopAvatar()" mode="aspectFill" />
+                </button>
+              </view>
+              <view class="user-info" @click="pageTo({ url: '/admin/home/edit' })">
+                <text class="username">{{ (shopInfo && shopInfo.shopName == '首店') ? (shopInfo.merchantName || '') :
+                  (((shopInfo && shopInfo.merchantName) ? shopInfo.merchantName : '') + (shopInfo && shopInfo.shopName ?
+                    (' ' + shopInfo.shopName) : '')) }}</text>
+              </view>
+            </view> -->
+
+            <view class="function-grid function-grid--overlay">
+              <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" />
+                <text class="function-text function-text--overlay function-text--sm">我的地址</text>
+              </view>
+              <view class="function-item function-item--overlay" @click="pageTo({ url: '/admin/stat/cgItem' })">
+                <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="goMore()">
+                <image class="function-icon" :src="iconSrc('open-shop')" mode="aspectFit" />
+                <text class="function-text function-text--overlay function-text--sm">申请开店</text>
+              </view>
+            </view>
+          </view>
+
+          <!-- <view class="admin-contact-wrap">
+            <view class="admin-contact-inner">
+              <text class="admin-contact-name">{{ loginInfo.admin && loginInfo.admin.name ? loginInfo.admin.name : ''
+                }}</text>
+              <text class="admin-contact-divider">|</text>
+              <text class="admin-contact-mobile">{{ loginInfo.admin && loginInfo.admin.mobile ? loginInfo.admin.mobile :
+                '' }}</text>
+            </view>
+          </view> -->
+
+          <view v-if="!$util.isEmpty(data.warning)" class="warning-banner">{{ data.warning }}</view>
+
+          <template v-if="!$util.isEmpty(ad)">
+            <block v-for="(adInfo, adIndex) in ad" :key="adIndex">
+              <view class="ad-wrap" @click.stop="pageTo({ url: adInfo.url })">
+                <image :src="adInfo.banner" mode="widthFix" class="ad-image"></image>
+              </view>
+            </block>
+          </template>
+
+          <template v-if="!$util.isEmpty(supplierList)">
+            <view class="ghs_list_area flex-col justify-end">
+              <view class="ghs_box flex-col justify-end" v-for="(ghsInfo, index) in supplierList" :key="index">
+                <view class="image-text_7 flex-row justify-between">
+                  <view class="section_1 flex-col">
+                    <image class="logo" :src="ghsInfo.smallAvatar" />
+                  </view>
+                  <view class="text-group_7 flex-col justify-center">
+                    <text class="text_8">{{ ghsInfo.name }}</text>
+                    <view class="phone-line"
+                      v-if="!$util.isEmpty(ghsInfo.telephone) || !$util.isEmpty(ghsInfo.telephone2)"
+                      @click.stop="callUp(ghsInfo)">
+                      <image class="phone-icon" :src="iconSrc('stock-phone')" mode="aspectFit" />
+                      <text class="phone-text">
+                        <text v-if="!$util.isEmpty(ghsInfo.telephone)">{{ ghsInfo.telephone }}</text>
+                      </text>
+                    </view>
+                    <text class="text_9">
+
+                      <block v-if="ghsInfo.cutStyle && ghsInfo.cutStyle == 1">
+                        <block v-if="ghsInfo.meetNum > 0 || ghsInfo.meetAmount > 0">
+                          <text class="discount-highlight" v-if="ghsInfo.cutAmount > 0">
+                            满<text v-if="ghsInfo.meetNum > 0">{{ ghsInfo.meetNum ? ghsInfo.meetNum : 0 }}扎</text>
+                            <text v-if="ghsInfo.meetAmount > 0"><text
+                                v-if="ghsInfo.meetNum > 0">和</text>{{ ghsInfo.meetAmount ? ghsInfo.meetAmount : 0 }}元</text>{{ ghsInfo.cutAmount ? parseFloat(ghsInfo.cutAmount * 100).toString().replace(/0/g, '') : 0 }}折
+                          </text>
+                        </block>
+                      </block>
+                      <block v-else>
+                        <block v-if="ghsInfo.meetNum > 0 || ghsInfo.meetAmount > 0">
+                          <text class="discount-highlight" v-if="ghsInfo.cutAmount > 0">
+                            满<text v-if="ghsInfo.meetNum > 0">{{ ghsInfo.meetNum ? ghsInfo.meetNum : 0 }}扎</text>
+                            <text v-if="ghsInfo.meetAmount > 0"><text
+                                v-if="ghsInfo.meetNum > 0">和</text>{{ ghsInfo.meetAmount ? ghsInfo.meetAmount : 0 }}元</text>优惠{{ ghsInfo.cutAmount ? parseFloat(ghsInfo.cutAmount) : 0 }}元
+                          </text>
+                        </block>
+                      </block>
+
+                    </text>
+                    <text class="text_distance" v-if="ghsInfo.distance && ghsInfo.distance > 0">{{ ghsInfo.distance >
+                      1000 ? Math.round(Number(ghsInfo.distance) / 1000) + 'km' : ghsInfo.distance + 'm' }}</text>
+                  </view>
+                </view>
+                <view class="box_9">
+                  <view class="tag_2" @click="pageTo({ url: '/admin/ghs/debtChange?ghsId=' + ghsInfo.id })">
+                    <image class="tag-icon" :src="iconSrc('stock-debt-change')" mode="aspectFit" />
+                    <text>挂账变动</text>
+                  </view>
+                  <view class="tag_2" @click="pageTo({ url: '/admin/clear/list?ghsId=' + ghsInfo.id })">
+                    <image class="tag-icon" :src="iconSrc('stock-checkout-record')" mode="aspectFit" />
+                    <text>结账记录</text>
+                  </view>
+                  <view class="tag_2 tag_2--bought"
+                    @click.stop="pageTo({ url: '/pagesPurchase/shopping?ghsId=' + ghsInfo.id + '&ghsName=' + ghsInfo.name })">
+                    <image class="tag-icon" :src="iconSrc('stock-purchase-record')" mode="aspectFit" />
+                    <text>购买记录</text>
+                  </view>
+                  <view class="tag_2 tag_2--share tag_2--highlight">
+                    <button open-type="share" :data-ghs="ghsInfo" class="share-button-mask"></button>
+                    <image class="tag-icon" :src="iconSrc('stock-share')" mode="aspectFit" />
+                    <text>分享本店</text>
+                  </view>
+                  <view class="tag_2 tag_2--highlight" @click.stop="getMore(ghsInfo)">
+                    <image class="tag-icon" :src="iconSrc('stock-more-features')" mode="aspectFit" />
+                    <text>更多功能</text>
+                  </view>
+                </view>
+                <view class="box_6 flex-row" @click="settleAccounts(ghsInfo)" v-if="Number(ghsInfo.debtAmount) > 0">
+                  <view class="show_clear_area flex-row justify-between">
+                    <text class="waite_clear_order">待结订单 {{ ghsInfo.debtNum }}笔 合计¥{{ ghsInfo.debtAmount ? parseFloat(ghsInfo.debtAmount) : 0 }}</text>
+                    <text class="clear-action" v-if="ghsInfo.remainDebtAmount > 0">选订单结算 ></text>
+                  </view>
+                </view>
+
+                <block v-if="Number(ghsInfo.balance) > 0">
+                  <view class="box_6 box_6--blue flex-row" v-if="ghsInfo.remainDebtAmount > 0"
+                    @click.stop="recharge(ghsInfo)">
+                    <view class="show_clear_area flex-row justify-between">
+                      <text class="waite_clear_order waite_clear_order--blue">
+                        <text v-if="Number(ghsInfo.balance) > 0">减去余额¥{{ ghsInfo.balance ? parseFloat(ghsInfo.balance) : 0
+                          }}</text>
+                        <text v-if="ghsInfo.remainDebtAmount > 0" class="ml-15">实欠¥{{ ghsInfo.remainDebtAmount }}</text>
+                      </text>
+                      <text class="clear-action clear-action--blue">按金额结算 ></text>
+                    </view>
+                  </view>
+
+                  <view class="box_6 box_6--blue flex-row" v-if="ghsInfo.remainDebtAmount < 0"
+                    @click.stop="recharge(ghsInfo)">
+                    <view class="show_clear_area flex-row justify-between">
+                      <text class="waite_clear_order waite_clear_order--blue">
+                        <text>账户余额¥{{ Math.abs(ghsInfo.remainDebtAmount) }}</text>
+                      </text>
+                      <text class="clear-action clear-action--blue">已结清</text>
+                    </view>
+                  </view>
+                </block>
+
+                <block v-if="ghsInfo.live == 1">
+                  <view class="button_7 flex-col" @click.stop="goKmCg(ghsInfo)"
+                    v-if="ghsInfo.openKmCg && ghsInfo.openKmCg == 1"><text class="text_13">昆明直采</text></view>
+                  <view class="button_4 flex-col" v-if="ghsInfo.isOpen == 1" @click="enterShop(ghsInfo)"><text
+                      class="text_13">购买</text></view>
+                  <view class="button_5 flex-col" v-else @click="enterShop(ghsInfo)"><text class="text_13">购买</text>
+                  </view>
+                </block>
+                <block v-else>
+                  <view class="button_6 flex-col" @click="fillCg(ghsInfo)"><text class="text_13">购买</text></view>
+                </block>
+              </view>
+            </view>
+          </template>
+
+          <block v-else>
+
+            <!-- 如果没有请求过接口,不确定这个花店,有没批发店,暂时不显示找批发店的入口,避免引起争议 -->
+            <block v-if="hasRequestApi == 0">
+              <view class="location-empty-box">
+                <view class="location-empty-title">暂无批发店</view>
+              </view>
+            </block>
+            <block v-else>
+              <view v-if="isWithinTwoDays" class="no-supplier-tip">附近暂无批发店</view>
+              <block v-else>
+                <view class="location-empty-box">
+                  <image class="location-empty-icon" :src="iconSrc('general-location')" mode="aspectFit" />
+                  <view class="location-empty-title">开启定位,查看附近批发店</view>
+                  <button class="location-empty-btn" @click="searchGhs()">开启</button>
+                </view>
+              </block>
+            </block>
+
+          </block>
+
+          <view class="support-entry" @click="toPhone()">
+            <text>厦门中花汇技术支持 <text class="support-divider">|</text> 联系厦门中花汇</text>
+          </view>
+
+        </view>
+      </view>
+    </block>
+
+    <uni-popup ref="toShowMore" background-color="#fff" type="center" :animation="true" class="class-popup-style">
+      <view class="more-popup-list">
+        <view class="more-popup-item"><button @click="rechargeChange()">充值记录</button></view>
+        <view class="more-popup-item"><button @click="balanceChange()">余额变动</button></view>
+        <view class="more-popup-item"><button @click="bpSj()">删除</button></view>
+        <view class="more-popup-item more-popup-item--cancel"><button @click="closeToShow()">取消</button></view>
+      </view>
+    </uni-popup>
+
+    <!-- 多供货商提示弹框 -->
+    <uni-popup ref="supplierNoticePopup" background-color="#fff" type="center" :animation="true"
+      class="supplier-notice-popup">
+      <view class="supplier-notice-container">
+        <!-- 头部 -->
+        <view class="supplier-notice-header">
+          <text class="supplier-notice-title">您已有多个批发店</text>
+        </view>
+
+        <!-- 中间供货商列表 -->
+        <view class="supplier-notice-content">
+          <view class="supplier-list">
+            <view class="supplier-item" v-for="(supplier, index) in displayGhsList" :key="index">
+              <view class="supplier-icon">🏪</view>
+              <text class="supplier-name">{{ supplier.name }}</text>
+            </view>
+          </view>
+        </view>
+
+        <!-- 底部提示 -->
+        <view class="supplier-notice-footer">
+          <text class="supplier-notice-tip">买花时注意区分,避免下错!!</text>
+          <view class="supplier-notice-buttons">
+            <button class="admin-button-com default" @click="remindLater">下次提醒</button>
+            <button class="admin-button-com blue" @click="closeSupplierNotice">知道了</button>
+          </view>
+        </view>
+      </view>
+    </uni-popup>
+
+
   </view>
 </template>
 <script>
+import { mapGetters } from "vuex";
+import { getWeixinId } from "@/api/invite";
+import { consoleIndex } from "@/api/workbench";
+import autoUpdateMixins from "@/mixins/autoUpdate";
+import { ghsList } from "@/api/purchase";
+import { changeDelStatus, hasMoreGhs, searchNearbyGhs } from "@/api/ghs";
+import { currentShop, uploadShopAvatar } from "@/api/shop";
+import { hasNotice } from "@/api/admin";
+import { APIHOST } from "@/config";
+import permision from "@/utils/wa-permission_1.1/permission.js";
+import { iconSrc } from "@/utils/iconSrc";
 export default {
-  components: {
-  },
-  data () {
+  name: "workbench",
+  mixins: [autoUpdateMixins],
+  data() {
     return {
-      supplierList: []
+      constant: this.$constant,
+      ad: [],
+      getappIdList: {},
+      data: {
+        admin: {},
+        asset: {},
+        notice: {},
+        todayData: { income: 0.00, order: 0, custom: 0, expend: 0.00, visit: 0 },
+        isMini: 0
+      },
+      supplierList: [],
+      //登录状态 0未登录 1登录仅用到了采购 2登录用到完整功能
+      loginStyle: 0,
+      currentGhs: {},
+      displayGhsList: [],// 用于显示在弹框中的供货商列表
+      shopInfo: [],
+      supplierSearchTime: 0, // 查找附近批发店时间
+      hasRequestApi: 0,
+      statusBarHeight: 0
+    };
+  },
+  computed: {
+    ...mapGetters({ loginInfo: "getLoginInfo" }),
+    workbenchTitle() {
+      if (this.shopInfo && this.shopInfo.shopName == '首店') {
+        return this.shopInfo.merchantName || '进货'
+      }
+      const merchantName = (this.shopInfo && this.shopInfo.merchantName) ? this.shopInfo.merchantName : ''
+      const shopName = (this.shopInfo && this.shopInfo.shopName) ? this.shopInfo.shopName : ''
+      const title = merchantName + (shopName ? (' · ' + shopName) : '')
+      return title || '进货'
+    },
+    isWithinTwoDays() {
+      if (!this.supplierSearchTime) return false;
+      const twoDays = 2 * 24 * 60 * 60 * 1000;
+      return (Date.now() - this.supplierSearchTime) < twoDays;
+    }
+  },
+  watch: {
+    //只需要采购花材的花店不显示底部菜单
+    loginInfo(newVal) {
+      if (!this.$util.isEmpty(newVal.admin) && newVal.admin.currentShopId > 0) {
+        this.handleLoginStyle()
+      }
+    }
+  },
+  onPullDownRefresh() {
+    this.init();
+    uni.stopPullDownRefresh();
+  },
+  onLoad() {
+    try {
+      const systemInfo = uni.getSystemInfoSync()
+      this.statusBarHeight = systemInfo.statusBarHeight || 0
+    } catch (e) {
+      this.statusBarHeight = 0
+    }
+    getWeixinId().then(res => {
+      this.getappIdList = res.data
+    })
+  },
+  onShow() {
+    this.supplierSearchTime = uni.getStorageSync('supplier_search_time') || 0;
+
+    this.init();
+
+    // 判断是否登录
+    if (!this.$util.isEmpty(this.loginInfo.admin) && this.loginInfo.admin.currentShopId > 0) {
+      this.handleLoginStyle()
+      //this.showShopName()
+    }
+  },
+  onShareAppMessage(res) {
+    if (res.from === 'button') {
+      let ghsInfo = res.target.dataset.ghs
+      let hdShopAdminId = this.loginInfo && this.loginInfo.shopAdminId ? this.loginInfo.shopAdminId : 0
+      let ghsShopAdminId = ghsInfo.shopAdminId || 0
+      let shopId = ghsInfo.shopId || 0
+      let fromGhsId = ghsInfo.id || 0
+      let fromCg = 1
+
+      let path = `/pagesPurchase/ghsProduct?hdShopAdminId=${hdShopAdminId}&ghsShopAdminId=${ghsShopAdminId}&shopId=${shopId}&id=0&fromGhsId=${fromGhsId}&fromCg=${fromCg}`
+
+      return {
+        title: ghsInfo.name,
+        desc: "",
+        path: path,
+        imageUrl: ghsInfo.avatar || ghsInfo.smallAvatar || ''
+      }
+    }
+    return { title: "花掌柜,花店管家婆", desc: "", imageUrl: "", path: "admin/home/workbench" }
+  },
+  methods: {
+    iconSrc,
+    onChooseAvatar(e) {
+      if (this.loginInfo && this.loginInfo.staff && this.loginInfo.staff.founder != 2) {
+        this.$msg('门店LOGO请老板修改')
+        return
+      }
+      if (e && e.detail && e.detail.avatarUrl) {
+        let avatarUrl = e.detail.avatarUrl
+        this.updateShopAvatar(avatarUrl)
+      } else {
+        this.$msg('获取头像失败')
+      }
+    },
+    updateShopAvatar(avatarUrl) {
+      let token = uni.getStorageSync('token') || ''
+      let url = APIHOST + '/upload/save-file'
+      uni.uploadFile({
+        url: url,
+        filePath: avatarUrl,
+        name: 'file',
+        header: { token: token },
+        formData: {},
+        success: (res) => {
+          try {
+            const ret = JSON.parse(res.data)
+            if (ret.code == 1) {
+              this.shopInfo.avatar = ret.data.shortUrl
+              this.$msg('头像已更新')
+              uni.setStorageSync('shopAvatar', this.shopInfo.avatar)
+
+              //请后端,上传新的头像地址,同步更新xhGhsCustom里面的头像地址
+              uploadShopAvatar({ id: this.shopInfo.id, avatar: ret.data.shortUrl }).then(res => {
+                if (res.code == 1) {
+                  // this.$msg('头像上传成功')
+                } else {
+                  // this.$msg(res.msg || '上传失败')
+                  console.log(res.msg || '上传失败')
+                }
+              })
+            } else {
+              this.$msg(ret.msg || '上传失败')
+            }
+          } catch (err) {
+            this.$msg('服务异常')
+          }
+        },
+        fail: () => {
+          this.$msg('上传失败')
+        }
+      })
+    },
+    shopAvatar() {
+      const avatar = (this.shopInfo && this.shopInfo.avatar) ? this.shopInfo.avatar : '/default_avatar.png?x-oss-process=image/resize,m_fill,h_130,w_130'
+      if (!avatar) {
+        return ''
+      }
+      if (/^https?:\/\//i.test(avatar)) {
+        return avatar
+      }
+      return this.$constant.imgUrl + (avatar.indexOf('/') === 0 ? avatar : ('/' + avatar))
+    },
+    buyItem() {
+      let that = this
+      // #ifdef MP-WEIXIN
+      uni.navigateToMiniProgram({
+        //姜枫-2021.04.13
+        appId: that.getappIdList.mall.miniAppId,
+        path: 'pages/home/recent',
+        //develop 开发版 trial 体验版 release 正式版
+        envVersion: process.env.NODE_ENV === 'development' ? 'develop' : 'release',
+        extraData: {},
+        success(res) {
+        }
+      })
+      // #endif
+      // #ifdef APP-PLUS
+      that.$msg("请用微信打开")
+      // #endif
+    },
+    init() {
+      this.getGHSList()
+
+      // #ifdef MP-WEIXIN
+      this.isMini = 1
+      // #endif
+
+      consoleIndex({ isMini: this.isMini }).then(res => {
+        this.data = res.data
+      })
+      this.showShopName()
+    },
+    handleLoginStyle() {
+      this.loginStyle = 1
+      this.toRemindCustom()
+    },
+    closeToShow() {
+      this.$refs.toShowMore.close()
+    },
+    // 显示供货商提示弹框
+    showSupplierNotice() {
+      // 设置要显示的供货商列表,最多显示5个
+      this.displayGhsList = this.supplierList.filter(item => item.name).slice(0, 5)
+      this.$refs.supplierNoticePopup.open('center')
+    },
+    // 关闭供货商提示弹框
+    closeSupplierNotice() {
+      this.$refs.supplierNoticePopup.close()
+      // 调用已有的接口标记已通知
+      hasNotice().then(res => { })
+    },
+    // 下次提醒
+    remindLater() {
+      this.$refs.supplierNoticePopup.close()
+      // 不调用hasNotice接口,保持提醒状态
+    },
+    getMore(info) {
+      this.currentGhs = info
+      this.$refs.toShowMore.open('center')
+    },
+    callUp(ghs) {
+      let mobileList = []
+      if (!this.$util.isEmpty(ghs.telephone)) {
+        mobileList.push(ghs.telephone)
+      }
+      if (!this.$util.isEmpty(ghs.telephone2)) {
+        mobileList.push(ghs.telephone2)
+      }
+      if (this.$util.isEmpty(mobileList)) {
+        this.$msg('没有联系电话')
+        return false
+      }
+      uni.showActionSheet({
+        itemList: mobileList,
+        success: function (respond) {
+          let currentIndex = respond.tapIndex
+          let mobile = mobileList[currentIndex]
+          uni.makePhoneCall({ phoneNumber: mobile })
+        }
+      })
+    },
+    toPhone() {
+      this.$util.pageTo({ url: '/pagesPurchase/contact' })
+    },
+    showShopName() {
+      currentShop().then(res => {
+        if (res.code == 1) {
+          this.shopInfo = res.data ? res.data : []
+          if (this.shopInfo.avatar) {
+            uni.setStorageSync('shopAvatar', this.shopInfo.avatar);
+          } else {
+            uni.setStorageSync('shopAvatar', '');
+          }
+        }
+      })
+    },
+    goMore() {
+      this.$util.pageTo({ url: '/pagesPurchase/pb' })
+    },
+    rechargeChange() {
+      this.closeToShow()
+      this.pageTo({ url: '/admin/ghs/rechargeChange?ghsId=' + this.currentGhs.id })
+    },
+    balanceChange() {
+      this.closeToShow()
+      this.pageTo({ url: '/admin/ghs/balanceChange?ghsId=' + this.currentGhs.id })
+    },
+    bpSj() {
+      let that = this
+      that.$util.confirmModal({ content: '确认删除?删除后你不能再跟此批发店买花!!!!', okText: '确认' }, () => {
+        that.confirmPb(that.currentGhs)
+      })
+    },
+    recharge(currentGhs) {
+      this.pageTo({ url: '/admin/ghs/pay?id=' + currentGhs.id + '&salt=' + currentGhs.salt })
+    },
+    confirmPb(ghs) {
+      let that = this
+      changeDelStatus({ delStatus: 1, ghsId: ghs.id }).then(res => {
+        if (res.code == 1) {
+          that.closeToShow()
+          that.getGHSList()
+        }
+      })
+    },
+    fillCg(item) {
+      this.pageTo({ url: '/pagesPurchase/addCg?ghsId=' + item.id + '&ghsName=' + item.name })
+    },
+    goKmCg(currentGhs) {
+      let self = this
+      // #ifdef MP-WEIXIN
+      uni.navigateToMiniProgram({
+        appId: currentGhs.kmCgAppId,
+        path: currentGhs.kmCgUrl,
+        //develop 开发版 trial 体验版 release 正式版
+        envVersion: process.env.NODE_ENV === 'development' ? 'develop' : 'release',
+        extraData: {},
+        success(res) { }
+      })
+      // #endif
+      // #ifdef APP-PLUS
+      self.$msg('开发中')
+      // #endif
+    },
+    enterShop(item) {
+      let that = this
+      if (item.isOpen == 0) {
+        this.$msg('已休店,请选择其它门店')
+        return false
+      }
+      that.pageTo({ url: '/pagesPurchase/ghsProduct?id=' + item.id })
+    },
+    settleAccounts(item) {
+      this.pageTo({ url: '/pagesPurchase/gathering?id=' + item.id })
+    },
+    getGHSList() {
+      return ghsList().then(res => {
+        this.supplierList = res.data.list
+        this.ad = res.data.ad ? res.data.ad : []
+        this.hasRequestApi = 1
+      })
+    },
+    toRemindCustom() {
+      if (this.loginStyle == 1) {
+        hasMoreGhs().then(ret => {
+          if (ret.data.needNotice == 1) {
+            this.showSupplierNotice()
+          }
+        })
+      }
+    },
+    async searchGhs() {
+      console.log('searchGhs start')
+
+      // #ifdef APP-PLUS
+      // App 端先显式申请权限,避免部分机型 getLocation 挂起无回调
+      if (plus.os.name === 'Android') {
+        const permissionRes = await permision.requestAndroidPermission('android.permission.ACCESS_FINE_LOCATION')
+        if (permissionRes !== 1) {
+          this.$msg('请开启定位权限后重试')
+          if (permissionRes === -1) {
+            permision.gotoAppPermissionSetting()
+          }
+          return
+        }
+      }
+      if (!permision.checkSystemEnableLocation()) {
+        this.$msg('请先开启系统定位服务')
+        return
+      }
+      // #endif
+
+      let hasLocationCallback = false
+      const timeoutTimer = setTimeout(() => {
+        if (!hasLocationCallback) {
+          console.log('getLocation timeout')
+          this.$msg('定位超时,请确认系统定位已开启后重试')
+        }
+      }, 5000)
+
+      const handleLocationSuccess = (res, locationType) => {
+        hasLocationCallback = true
+        clearTimeout(timeoutTimer)
+        console.log('getLocation success', locationType, res)
+        searchNearbyGhs({
+          locationType: locationType,
+          lat: res.latitude,
+          long: res.longitude
+        }).then(ret => {
+          if (ret.code == 1) {
+            uni.setStorageSync('supplier_search_time', Date.now()) //设置缓存时间--记录当前查找附近批发店的时间
+            //重新刷新列表
+            this.getGHSList()
+            this.$msg('查找成功')
+          } else {
+            this.$msg(ret.msg)
+          }
+        })
+      }
+      const requestLocation = (locationType) => {
+        uni.getLocation({
+          type: locationType,
+          success: (res) => {
+            handleLocationSuccess(res, locationType)
+          },
+          fail: (err) => {
+            console.log('getLocation fail', locationType, err)
+            // 部分安卓机型不支持 gcj02,自动降级到 wgs84 再试一次
+            if (locationType === 'gcj02' && (
+              err.code == 18 ||
+              err.errCode == 18 ||
+              (err.errMsg && (
+                err.errMsg.indexOf('not support gcj02') > -1 ||
+                err.errMsg.indexOf('Not Support CoordsType') > -1
+              ))
+            )) {
+              requestLocation('wgs84')
+              return
+            }
+            hasLocationCallback = true
+            clearTimeout(timeoutTimer)
+            uni.showToast({ title: '定位失败,请检查定位权限', icon: 'none' })
+          },
+          complete: () => {
+            console.log('getLocation complete', locationType)
+          }
+        })
+      }
+      // iOS 机型在部分运行环境不支持 gcj02,直接使用 wgs84
+      // #ifdef APP-PLUS
+      if (plus.os.name === 'iOS') {
+        requestLocation('wgs84')
+        return
+      }
+      // #endif
+      requestLocation('gcj02')
+    }
+  }
+};
+</script>
+<style lang="scss" scoped>
+.login-page {
+  min-height: 100vh;
+  display: flex;
+  flex-direction: column;
+  background: #f2f7f4;
+}
+
+.login-hero {
+  position: relative;
+  padding: 0 24upx 36upx;
+  overflow: hidden;
+  background: linear-gradient(180deg, #e8f5ed 0%, #ecf6f0 72%, #f2f7f4 100%);
+}
+
+.login-hero-bg {
+  position: absolute;
+  left: 0;
+  top: 0;
+  width: 100%;
+  height: 360upx;
+  z-index: 0;
+  opacity: 0.55;
+}
+
+.login-hero-scrim {
+  position: absolute;
+  left: 0;
+  right: 0;
+  top: 0;
+  height: 360upx;
+  z-index: 1;
+  background: linear-gradient(
+    180deg,
+    rgba(255, 255, 255, 0.78) 0%,
+    rgba(237, 248, 242, 0.52) 48%,
+    rgba(255, 255, 255, 0) 100%
+  );
+  pointer-events: none;
+}
+
+.status-space {
+  position: relative;
+  z-index: 2;
+  width: 100%;
+}
+
+.login-hero-inner {
+  position: relative;
+  z-index: 2;
+  padding: 56upx 8upx 0;
+}
+
+.login-hero-title {
+  display: block;
+  color: #161819;
+  font-size: 58upx;
+  font-weight: 700;
+  line-height: 60upx;
+  text-shadow:
+    0 0 12upx rgba(255, 255, 255, 0.92),
+    0 2upx 6upx rgba(255, 255, 255, 0.75);
+}
+
+.login-hero-desc {
+  display: block;
+  margin-top: 14upx;
+  color: #192129;
+  font-size: 34upx;
+  line-height: 44upx;
+}
+
+.login-body {
+  flex: 1;
+  padding: 28upx 24upx 64upx;
+}
+
+.login-card {
+  display: flex;
+  flex-direction: column;
+  align-items: stretch;
+  padding: 36upx 32upx 32upx;
+  background: #fff;
+  border-radius: 24upx;
+  box-shadow: 0 8upx 24upx rgba(9, 197, 103, 0.08);
+}
+
+.login-card + .login-card {
+  margin-top: 36upx;
+}
+
+.login-card-top {
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  min-width: 0;
+}
+
+.login-card-icon-wrap {
+  width: 104upx;
+  height: 104upx;
+  border-radius: 26upx;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  flex-shrink: 0;
+}
+
+.login-card-icon-wrap--buy {
+  background: linear-gradient(135deg, #fff4e8 0%, #ffe8d6 100%);
+}
+
+.login-card-icon-wrap--supply {
+  background: linear-gradient(135deg, #e8f8f0 0%, #d4f0e2 100%);
+}
+
+.login-card-icon {
+  width: 56upx;
+  height: 56upx;
+}
+
+.login-card-main {
+  flex: 1;
+  min-width: 0;
+  margin-left: 24upx;
+}
+
+.login-card-title {
+  display: block;
+  color: #161819;
+  font-size: 38upx;
+  font-weight: 700;
+  line-height: 48upx;
+}
+
+.login-card-desc {
+  display: block;
+  margin-top: 12upx;
+  color: #8a9199;
+  font-size: 30upx;
+  line-height: 40upx;
+}
+
+.login-card-btn {
+  width: 100%;
+  margin: 36upx 0 0;
+  padding: 0;
+  min-width: 0;
+  height: 101upx;
+  line-height: 101upx;
+  font-size: 38upx;
+  font-weight: 600;
+  border-radius: 40upx;
+  text-align: center;
+  border: none;
+  color: #fff;
+  background: #09c567;
+}
+
+.login-card-btn::after {
+  border: none;
+}
+
+.login-card-btn--primary,
+.login-card-btn--outline {
+  color: #fff;
+  background: #09c567;
+}
+
+.login-register {
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  justify-content: center;
+  margin-top: 56upx;
+}
+
+.login-register-tip {
+  color: #8a9199;
+  font-size: 40upx;
+  line-height: 44upx;
+}
+
+.login-register-link {
+  margin-left: 8upx;
+  color: #09c567;
+  font-size: 40upx;
+  line-height: 44upx;
+  font-weight: 600;
+}
+
+.order-page {
+  .ghs_list_page {
+    background-color: rgba(255, 255, 255, 1);
+    position: relative;
+    width: 750upx;
+    overflow: hidden;
+
+    .profile-section {
+      background-color: #09C567;
+      padding: 30upx 30upx 0upx 30upx;
+      border-radius: 0;
+
+      .profile-header {
+        display: flex;
+        align-items: center;
+
+        .avatar-container {
+          width: 50upx;
+          height: 50upx;
+          border-radius: 50upx;
+          overflow: hidden;
+          background-color: rgba(255, 255, 255, 0.2);
+          border: 1upx solid #ffffff;
+          display: flex;
+          align-items: center;
+          justify-content: center;
+
+          .avatar-button {
+            background: none !important;
+            border: none !important;
+            padding: 0 !important;
+            margin: 0 !important;
+            line-height: 1;
+            display: flex;
+            align-items: center;
+            justify-content: center;
+            width: 50upx;
+            height: 50upx;
+            color: transparent !important;
+
+            &::after {
+              border: none !important;
+            }
+          }
+
+          .avatar {
+            width: 50upx;
+            height: 50upx;
+            border-radius: 50upx;
+          }
+        }
+
+        .user-info {
+          flex: 1;
+          margin-left: 10upx;
+          display: flex;
+          align-items: center;
+
+          .username {
+            display: block;
+            font-size: 40upx;
+            font-weight: bold;
+            color: #ffffff;
+            line-height: 1;
+          }
+
+          .user-id {
+            display: block;
+            margin-top: 6upx;
+            font-size: 26upx;
+            color: #ffffff;
+          }
+        }
+
+        .more-icon {
+          margin-left: 12upx;
+          width: 60upx;
+          height: 60upx;
+          border-radius: 30upx;
+          align-items: center;
+          justify-content: center;
+          display: flex;
+        }
+      }
+
+    }
+
+    .flex-col {
+      display: flex;
+      flex-direction: column;
+    }
+
+    .flex-row {
+      display: flex;
+      flex-direction: row;
+    }
+
+    .justify-end {
+      display: flex;
+      justify-content: flex-end;
+    }
+
+    .justify-between {
+      display: flex;
+      justify-content: space-between;
+    }
+
+    .ghs_list_area {
+      width: 750upx;
+      background-color: #ece5e5;
+
+      .ghs_box {
+        background-color: rgba(255, 255, 255, 1);
+        position: relative;
+        width: 750upx;
+        height: auto;
+        margin-bottom: 35upx;
+
+        .more-btn {
+          position: absolute;
+          top: 20upx;
+          right: 20upx;
+          width: 40upx;
+          height: 40upx;
+          display: flex;
+          align-items: center;
+          justify-content: center;
+          border-radius: 20upx;
+          background: rgba(0, 0, 0, 0.05);
+
+          .more-icon {
+            font-size: 24upx;
+            color: #666;
+            font-weight: bold;
+          }
+        }
+
+        .image-text_7 {
+          width: 674upx;
+          height: 120upx;
+          margin: 40upx 0 0 31upx;
+
+          .section_1 {
+            width: 120upx;
+            height: 120upx;
+
+            .logo {
+              width: 120upx;
+              height: 120upx;
+              border-radius: 10upx;
+            }
+          }
+
+          .text-group_7 {
+            width: 533upx;
+            min-height: 99upx;
+            height: auto;
+            margin-top: 5upx;
+            justify-content: center;
+
+            .text_8 {
+              display: inline-block;
+              width: 550upx;
+              height: 38upx;
+              color: rgba(51, 51, 51, 1);
+              font-size: 36upx;
+              font-weight: bold;
+              text-align: left;
+              white-space: nowrap;
+              line-height: 38upx;
+              overflow: hidden;
+              margin-bottom: 12upx;
+            }
+
+            .text_9 {
+              width: 533upx;
+              height: 25upx;
+              overflow-wrap: break-word;
+              color: rgba(153, 153, 153, 1);
+              font-size: 30upx;
+              text-align: left;
+              white-space: nowrap;
+              line-height: 25upx;
+              margin-bottom: 10upx;
+            }
+
+            .text_distance {
+              font-size: 26upx;
+              color: #666;
+              line-height: 24upx;
+            }
+          }
+        }
+
+        .box_4 {
+          background-color: rgba(238, 238, 238, 1);
+          width: 750upx;
+          height: 1upx;
+          margin-top: 40upx;
+        }
+
+        .box_9 {
+          width: calc(100% - 30upx);
+          height: auto;
+          margin: 23upx 15upx 22upx 15upx;
+          display: flex;
+          flex-wrap: wrap;
+          align-items: stretch;
+          overflow: visible;
+          position: relative;
+
+          .tag_2 {
+            background-color: rgba(255, 255, 255, 1);
+            border-radius: 8px;
+            height: 80upx;
+            border: 2px solid rgba(221, 221, 221, 1);
+            color: rgba(51, 51, 51, 1);
+            font-size: 28upx;
+            margin: 0 7upx 15upx 0;
+            text-align: center;
+            width: calc((100% - 28upx) / 5);
+            padding: 0 4upx;
+            box-sizing: border-box;
+            display: flex;
+            align-items: center;
+            justify-content: center;
+
+            &:nth-child(5n) {
+              margin-right: 0;
+            }
+
+            text {
+              display: block;
+              width: 100%;
+              font-size: 28upx;
+              line-height: 1.2;
+              white-space: nowrap;
+              overflow: hidden;
+              text-overflow: ellipsis;
+            }
+          }
+
+          .tag_2--share {
+            padding-left: 2upx;
+            padding-right: 2upx;
+            position: relative;
+          }
+
+          .tag_2--highlight {
+            color: #09C567;
+            border-color: #09C567;
+            font-weight: bold;
+          }
+
+          .share-button-mask {
+            position: absolute;
+            top: 0;
+            left: 0;
+            width: 100%;
+            height: 100%;
+            opacity: 0;
+            z-index: 10;
+          }
+        }
+
+        .box_6 {
+          background-color: rgb(248, 242, 242);
+          width: 750upx;
+          height: 95upx;
+
+          .show_clear_area {
+            width: 247upx;
+            height: 29upx;
+            margin: 26upx 0 0 30upx;
+
+            .waite_clear_order {
+              width: 214upx;
+              height: 29upx;
+              overflow-wrap: break-word;
+              color: rgba(255, 40, 66, 1);
+              font-size: 31upx;
+              font-weight: bold;
+              text-align: left;
+              white-space: nowrap;
+              line-height: 29upx;
+            }
+
+            .waite_clear_order--blue {
+              color: #3385ff;
+            }
+
+            .ml-15 {
+              margin-left: 15upx;
+            }
+
+            .ml-30 {
+              margin-left: 30upx;
+            }
+          }
+        }
+
+        .button_4 {
+          height: 92upx;
+          line-height: 92upx;
+          text-align: center;
+          background-color: #09C567;
+          background-size: 137upx 137upx;
+          width: 130upx;
+          position: absolute;
+          left: 570upx;
+          top: 110upx;
+          border-radius: 39upx;
+
+          .text_13 {
+            color: rgba(255, 255, 255, 1);
+            font-size: 30upx;
+            font-weight: bold;
+          }
+        }
+
+        .button_5 {
+          height: 92upx;
+          line-height: 92upx;
+          text-align: center;
+          background-color: #CCCCCC;
+          background-size: 137upx 137upx;
+          width: 130upx;
+          position: absolute;
+          left: 570upx;
+          top: 110upx;
+          border-radius: 39upx;
+
+          .text_13 {
+            color: rgba(255, 255, 255, 1);
+            font-size: 30upx;
+            font-weight: bold;
+          }
+        }
+
+        .button_6 {
+          height: 92upx;
+          line-height: 92upx;
+          text-align: center;
+          background-color: rgb(152, 153, 197);
+          background-size: 137upx 137upx;
+          width: 170upx;
+          position: absolute;
+          left: 540upx;
+          top: 110upx;
+          border-radius: 39upx;
+
+          .text_13 {
+            color: rgba(255, 255, 255, 1);
+            font-size: 30upx;
+            font-weight: bold;
+          }
+        }
+
+        .button_7 {
+          height: 92upx;
+          line-height: 92upx;
+          text-align: center;
+          background-color: #09C567;
+          background-size: 137upx 137upx;
+          width: 180upx;
+          position: absolute;
+          left: 330upx;
+          top: 95upx;
+          border-radius: 39upx;
+
+          .text_13 {
+            color: rgba(255, 255, 255, 1);
+            font-size: 30upx;
+            font-weight: bold;
+          }
+        }
+      }
+    }
+  }
+}
+
+.admin-contact-wrap {
+  text-align: center;
+  font-size: 28upx;
+  color: #666;
+  padding: 16upx 30upx;
+  margin: 0 20upx;
+  background: #fff;
+  border-radius: 30upx;
+}
+
+.admin-contact-inner {
+  display: inline-flex;
+  align-items: center;
+  background: #fff;
+  padding: 10upx 25upx;
+  border-radius: 20upx;
+  box-shadow: 0 2upx 8upx rgba(0, 0, 0, 0.05);
+}
+
+.admin-contact-name {
+  color: #333;
+  font-weight: 500;
+  font-size: 28upx;
+}
+
+.admin-contact-divider {
+  margin: 0 15upx;
+  color: #eee;
+}
+
+.admin-contact-mobile {
+  color: #666;
+  font-size: 28upx;
+}
+
+.ad-wrap {
+  text-align: center;
+}
+
+.ad-image {
+  width: 97%;
+  margin: 0 auto;
+}
+
+.discount-highlight {
+  color: red;
+  font-weight: bold;
+}
+
+.no-supplier-tip {
+  margin: 60upx auto 40upx auto;
+  font-weight: bold;
+  font-size: 36upx;
+  text-align: center;
+  color: #999;
+}
+
+.location-empty-box {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  margin-top: 100upx;
+  margin-bottom: 100upx;
+}
+
+.location-empty-title {
+  font-size: 36upx;
+  color: #999;
+  font-weight: bold;
+  margin-bottom: 40upx;
+}
+
+.location-empty-btn {
+  background-color: #09C567;
+  color: #fff;
+  width: 240upx;
+  border-radius: 10upx;
+}
+
+.support-entry {
+  text-align: center;
+  margin-top: 20upx;
+  margin-bottom: 50upx;
+  color: #827171;
+  font-size: 32upx;
+}
+
+.support-divider {
+  margin: 0 20upx 0 20upx;
+}
+
+.more-popup-list {
+  display: flex;
+  width: 100vw;
+  padding: 20upx 20upx 40upx 20upx;
+  height: auto;
+  justify-content: space-between;
+  align-items: center;
+  flex-wrap: wrap;
+  max-height: 100vh;
+  overflow: auto;
+}
+
+.more-popup-item {
+  width: 100vw;
+  margin-top: 8upx;
+}
+
+.more-popup-item--cancel {
+  margin-top: 30upx;
+}
+
+/* 供货商提示弹框样式 */
+.supplier-notice-popup {
+  .supplier-notice-container {
+    width: 650upx;
+    background-color: #fff;
+    border-radius: 20upx;
+    overflow: hidden;
+
+    .supplier-notice-header {
+      padding: 40upx 30upx 20upx;
+      text-align: center;
+      background-color: #f8f9fa;
+      border-bottom: 1upx solid #e9ecef;
+
+      .supplier-notice-title {
+        font-size: 36upx;
+        font-weight: bold;
+        color: #333;
+      }
+    }
+
+    .supplier-notice-content {
+      padding: 20upx 0;
+
+      .supplier-list {
+        padding: 0 30upx;
+
+        .supplier-item {
+          display: flex;
+          align-items: center;
+          padding: 20upx 0;
+          border-bottom: 1upx solid #f0f0f0;
+
+          &:last-child {
+            border-bottom: none;
+          }
+
+          .supplier-icon {
+            width: 60upx;
+            height: 60upx;
+            background-color: #e3f2fd;
+            border-radius: 50%;
+            display: flex;
+            align-items: center;
+            justify-content: center;
+            font-size: 32upx;
+            margin-right: 20upx;
+          }
+
+          .supplier-name {
+            font-size: 32upx;
+            color: #333;
+            flex: 1;
+            font-weight: 500;
+          }
+        }
+      }
+    }
+
+    .supplier-notice-footer {
+      padding: 30upx;
+      text-align: center;
+      background-color: #f8f9fa;
+      border-top: 1upx solid #e9ecef;
+
+      .supplier-notice-tip {
+        display: block;
+        font-size: 42upx;
+        font-weight: bold;
+        color: red;
+        margin-bottom: 30upx;
+        line-height: 1.4;
+      }
+
+      .supplier-notice-buttons {
+        display: flex;
+        justify-content: space-between;
+
+        .admin-button-com+.admin-button-com {
+          margin-left: 20upx;
+        }
+
+        .admin-button-com {
+          flex: 1;
+          margin: 0;
+          padding: 20upx 0;
+          height: auto;
+          line-height: normal;
+          font-size: 34upx;
+          font-weight: bold;
+        }
+      }
     }
   }
 }
-</script>
+
+.warning-banner {
+  background-color: #ff6b6b;
+  border-radius: 8upx;
+  margin: 0upx 10upx 20upx 10upx;
+  padding: 20upx 24upx;
+  color: #ffffff;
+  font-size: 32upx;
+  font-weight: 600;
+  text-align: center;
+  line-height: 1.4;
+}
+
+/* New workbench visual style */
+.order-page {
+  min-height: 100vh;
+  background: #f5f7f6;
+}
+
+.order-page .ghs_list_page {
+  width: 750upx;
+  min-height: 100vh;
+  overflow: hidden;
+  background: #f5f7f6;
+}
+
+.order-page .ghs_list_page .profile-section {
+  position: relative;
+  padding: 0 24upx 4upx;
+  overflow: hidden;
+  background: linear-gradient(180deg, rgba(255, 255, 255, 0.08) 0%, rgba(255, 255, 255, 0.24) 58%, rgba(245, 247, 246, 0.58) 100%);
+}
+
+.order-page .ghs_list_page .profile-section::before {
+  content: "";
+  position: absolute;
+  left: 0;
+  right: 0;
+  top: 0;
+  height: 280upx;
+  z-index: 1;
+  background: linear-gradient(
+    180deg,
+    rgba(255, 255, 255, 0.78) 0%,
+    rgba(237, 248, 242, 0.52) 48%,
+    rgba(255, 255, 255, 0) 100%
+  );
+  pointer-events: none;
+}
+
+.workbench-header-bg {
+  position: absolute;
+  left: 0;
+  top: 0;
+  width: 100%;
+  height: 300upx;
+  z-index: 0;
+}
+
+.order-page .ghs_list_page .profile-section::after {
+  content: "";
+  position: absolute;
+  left: 0;
+  right: 0;
+  top: 252upx;
+  height: 150upx;
+  z-index: 1;
+  background: linear-gradient(180deg, rgba(245, 247, 246, 0) 0%, rgba(245, 247, 246, 0.62) 100%);
+  pointer-events: none;
+}
+
+.status-safe-area,
+.custom-nav,
+.profile-header,
+.function-grid--overlay {
+  position: relative;
+  z-index: 2;
+}
+
+.custom-nav {
+  position: relative;
+  height: 145upx;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  padding-top: 65upx;
+  box-sizing: border-box;
+}
+
+.custom-nav-title {
+  max-width: 560upx;
+  color: #161819;
+  font-size: 50upx;
+  font-weight: 700;
+  line-height: 48upx;
+  text-align: center;
+  text-shadow:
+    0 0 12upx rgba(255, 255, 255, 0.92),
+    0 2upx 6upx rgba(255, 255, 255, 0.75);
+  overflow: hidden;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+}
+
+.order-page .ghs_list_page .profile-section .profile-header {
+  min-height: 78upx;
+  justify-content: center;
+}
+
+.order-page .ghs_list_page .profile-section .profile-header .avatar-container {
+  width: 72upx;
+  height: 72upx;
+  border-radius: 50%;
+  border: 4upx solid rgba(255, 255, 255, 0.95);
+  background: #fff;
+  box-shadow: 0 8upx 22upx rgba(9, 197, 103, 0.18);
+}
+
+.order-page .ghs_list_page .profile-section .profile-header .avatar-container .avatar-button {
+  width: 72upx;
+  height: 72upx;
+  border-radius: 50%;
+}
+
+.order-page .ghs_list_page .profile-section .profile-header .avatar-container .avatar {
+  width: 72upx;
+  height: 72upx;
+  border-radius: 50%;
+}
+
+.order-page .ghs_list_page .profile-section .profile-header .user-info {
+  flex: 0 1 auto;
+  max-width: 540upx;
+  margin-left: 18upx;
+}
+
+.order-page .ghs_list_page .profile-section .profile-header .user-info .username {
+  color: #161819;
+  font-size: 34upx;
+  line-height: 42upx;
+  overflow: hidden;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+}
+
+.order-page .ghs_list_page .profile-section .function-grid--overlay {
+  margin-top: 10upx;
+  min-height: 166upx;
+  padding: 30upx 12upx 24upx;
+  border-radius: 26upx;
+  background: #f5f7f6;
+  box-shadow: 0 14upx 34upx rgba(42, 75, 55, 0.13);
+  display: flex;
+  align-items: center;
+  justify-content: space-around;
+  box-sizing: border-box;
+}
+
+.order-page .ghs_list_page .profile-section .function-item--overlay {
+  flex: 1;
+  padding: 0;
+  border: 0;
+  background: transparent;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: center;
+}
+
+.order-page .ghs_list_page .profile-section .function-item--overlay+.function-item--overlay {
+  margin-left: 0;
+}
+
+.order-page .ghs_list_page .profile-section .function-text--overlay {
+  margin-top: 14upx;
+  color: #202325;
+  font-size: 29upx;
+  line-height: 36upx;
+  background-color: transparent;
+}
+
+.admin-contact-wrap {
+  margin: 20upx 24upx 0;
+  padding: 18upx 24upx;
+  border-radius: 22upx;
+  background: #fff;
+  box-shadow: 0 10upx 26upx rgba(31, 46, 37, 0.06);
+}
+
+.admin-contact-inner {
+  width: 100%;
+  padding: 0;
+  box-shadow: none;
+  justify-content: center;
+}
+
+.warning-banner {
+  margin: 22upx 24upx 0;
+  padding: 22upx 28upx;
+  border-radius: 20upx;
+  background: linear-gradient(90deg, #ff393f 0%, #ff4d4f 100%);
+  box-shadow: 0 10upx 22upx rgba(255, 57, 63, 0.18);
+  color: #fff;
+  font-size: 30upx;
+  font-weight: 700;
+}
+
+.ad-wrap {
+  margin: 22upx 24upx 0;
+  overflow: hidden;
+  border-radius: 20upx;
+}
+
+.ad-image {
+  display: block;
+  width: 100%;
+  margin: 0;
+}
+
+.order-page .ghs_list_page .ghs_list_area {
+  width: 750upx;
+  padding: 24upx 0 12upx;
+  background: #f5f7f6;
+}
+
+.order-page .ghs_list_page .ghs_list_area .ghs_box {
+  width: 702upx;
+  margin: 0 24upx 24upx;
+  padding: 24upx 24upx 26upx;
+  box-sizing: border-box;
+  border-radius: 24upx;
+  background: #fff;
+  box-shadow: 0 10upx 28upx rgba(24, 37, 30, 0.08);
+}
+
+.order-page .ghs_list_page .ghs_list_area .ghs_box .image-text_7 {
+  width: 100%;
+  min-height: 116upx;
+  height: auto;
+  margin: 0;
+  align-items: center;
+  justify-content: flex-start;
+  padding-right: 178upx;
+  box-sizing: border-box;
+}
+
+.order-page .ghs_list_page .ghs_list_area .ghs_box .image-text_7 .section_1 {
+  width: 112upx;
+  height: 112upx;
+  flex-shrink: 0;
+}
+
+.order-page .ghs_list_page .ghs_list_area .ghs_box .image-text_7 .section_1 .logo {
+  width: 112upx;
+  height: 112upx;
+  border-radius: 50%;
+  background: #eaf8ef;
+}
+
+.order-page .ghs_list_page .ghs_list_area .ghs_box .image-text_7 .text-group_7 {
+  flex: 1;
+  width: auto;
+  min-width: 0;
+  min-height: 100upx;
+  margin: 0 0 0 24upx;
+}
+
+.order-page .ghs_list_page .ghs_list_area .ghs_box .image-text_7 .text-group_7 .text_8 {
+  width: 100%;
+  height: auto;
+  margin-bottom: 10upx;
+  color: #171a1d;
+  font-size: 36upx;
+  line-height: 44upx;
+  font-weight: 700;
+}
+
+.phone-line {
+  width: 100%;
+  min-height: 34upx;
+  display: flex;
+  align-items: center;
+  margin-bottom:10upx;
+}
+
+.phone-text {
+  flex: 1;
+  min-width: 0;
+  margin-left: 10upx;
+  color: #252a2d;
+  font-size: 28upx;
+  line-height: 32upx;
+  white-space: nowrap;
+}
+
+.order-page .ghs_list_page .ghs_list_area .ghs_box .image-text_7 .text-group_7 .text_9 {
+  width: 100%;
+  height: auto;
+  min-height: 28upx;
+  margin-bottom: 6upx;
+  color: #7e8782;
+  font-size: 24upx;
+  line-height: 30upx;
+}
+
+.order-page .ghs_list_page .ghs_list_area .ghs_box .image-text_7 .text-group_7 .text_distance {
+  color: #7e8782;
+  font-size: 24upx;
+  line-height: 30upx;
+}
+
+.order-page .ghs_list_page .ghs_list_area .ghs_box .box_4 {
+  display: none;
+}
+
+.order-page .ghs_list_page .ghs_list_area .ghs_box .button_4,
+.order-page .ghs_list_page .ghs_list_area .ghs_box .button_5,
+.order-page .ghs_list_page .ghs_list_area .ghs_box .button_6,
+.order-page .ghs_list_page .ghs_list_area .ghs_box .button_7 {
+  top: 48upx;
+  left: auto;
+  right: 28upx;
+  width: 142upx;
+  height: 76upx;
+  line-height: 76upx;
+  border-radius: 999upx;
+  box-shadow: 0 8upx 18upx rgba(9, 197, 103, 0.22);
+}
+
+.order-page .ghs_list_page .ghs_list_area .ghs_box .button_4,
+.order-page .ghs_list_page .ghs_list_area .ghs_box .button_7 {
+  background: linear-gradient(135deg, #16d66d 0%, #08b858 100%);
+}
+
+.order-page .ghs_list_page .ghs_list_area .ghs_box .button_5 {
+  background: #c9d0cd;
+  box-shadow: none;
+}
+
+.order-page .ghs_list_page .ghs_list_area .ghs_box .button_6 {
+  background: linear-gradient(135deg, #65c690 0%, #35aa69 100%);
+}
+
+.order-page .ghs_list_page .ghs_list_area .ghs_box .button_7 {
+  right: 182upx;
+  width: 156upx;
+}
+
+.order-page .ghs_list_page .ghs_list_area .ghs_box .button_4 .text_13,
+.order-page .ghs_list_page .ghs_list_area .ghs_box .button_5 .text_13,
+.order-page .ghs_list_page .ghs_list_area .ghs_box .button_6 .text_13,
+.order-page .ghs_list_page .ghs_list_area .ghs_box .button_7 .text_13 {
+  color: #fff;
+  font-size: 28upx;
+  font-weight: 700;
+}
+
+.order-page .ghs_list_page .ghs_list_area .ghs_box .box_9 {
+  width: 100%;
+  margin: 30upx 0 8upx;
+  display: flex;
+  flex-wrap: nowrap;
+  justify-content: space-between;
+  overflow: visible;
+}
+
+.order-page .ghs_list_page .ghs_list_area .ghs_box .box_9 .tag_2 {
+  width: 120upx;
+  height: 140upx;
+  margin: 0;
+  padding: 15upx 4upx;
+  border: 1upx solid #dbeee3;
+  border-radius: 10upx;
+  background: #fbfffd;
+  color: #1f2523;
+  box-sizing: border-box;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: center;
+}
+
+.order-page .ghs_list_page .ghs_list_area .ghs_box .box_9 .tag_2 text {
+  width: 100%;
+  margin-top: 13upx;
+  color: #1f2523;
+  font-size: 24upx;
+  line-height: 30upx;
+  text-align: center;
+}
+
+.order-page .ghs_list_page .ghs_list_area .ghs_box .box_9 .tag_2--highlight {
+  color: #09c567;
+  border-color: #d2efdd;
+  font-weight: 400;
+}
+
+.order-page .ghs_list_page .ghs_list_area .ghs_box .box_9 .tag_2--highlight text {
+  color: #1f2523;
+}
+
+.order-page .ghs_list_page .ghs_list_area .ghs_box .box_6 {
+  width: 100%;
+  height: auto;
+  min-height: 72upx;
+  margin-top: 18upx;
+  border-radius: 12upx;
+  background: #fff1f1;
+}
+
+.order-page .ghs_list_page .ghs_list_area .ghs_box .box_6--blue {
+  background: #edf6ff;
+}
+
+.order-page .ghs_list_page .ghs_list_area .ghs_box .box_6 .show_clear_area {
+  width: 100%;
+  height: auto;
+  min-height: 72upx;
+  margin: 0;
+  padding: 0 18upx;
+  box-sizing: border-box;
+  align-items: center;
+  flex-wrap: nowrap;
+}
+
+.order-page .ghs_list_page .ghs_list_area .ghs_box .box_6 .show_clear_area .waite_clear_order {
+  flex: 1;
+  width: auto;
+  height: auto;
+  color: #f50e24;
+  font-size: 30upx;
+  line-height: 38upx;
+  font-weight: 700;
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+
+.clear-action {
+  flex-shrink: 0;
+  margin-left: 18upx;
+  color: #f50e24;
+  font-size: 26upx;
+  line-height: 34upx;
+  font-weight: 700;
+  white-space: nowrap;
+}
+
+.order-page .ghs_list_page .ghs_list_area .ghs_box .box_6 .show_clear_area .waite_clear_order--blue,
+.clear-action--blue {
+  color: #1677ff;
+}
+
+.location-empty-box {
+  width: 702upx;
+  margin: 40upx 24upx 80upx;
+  padding: 70upx 24upx;
+  box-sizing: border-box;
+  border-radius: 24upx;
+  background: #fff;
+  box-shadow: 0 10upx 28upx rgba(24, 37, 30, 0.06);
+}
+
+.location-empty-title {
+  color: #77817c;
+  font-size: 32upx;
+}
+
+.location-empty-btn {
+  margin-top: 22upx;
+  background: #09c567;
+  color: #fff;
+  border-radius: 999upx;
+}
+
+.no-supplier-tip {
+  width: 702upx;
+  margin: 40upx 24upx 80upx;
+  padding: 70upx 24upx;
+  box-sizing: border-box;
+  border-radius: 24upx;
+  background: #fff;
+  color: #77817c;
+  font-size: 32upx;
+  box-shadow: 0 10upx 28upx rgba(24, 37, 30, 0.06);
+}
+
+.function-icon,
+.phone-icon,
+.tag-icon,
+.location-empty-icon {
+  display: block;
+  flex-shrink: 0;
+}
+
+.function-icon {
+  width: 58upx;
+  height: 58upx;
+}
+
+.phone-icon {
+  width: 28upx;
+  height: 28upx;
+}
+
+.tag-icon {
+  width: 50upx;
+  height: 50upx;
+}
+
+.location-empty-icon {
+  width: 40upx;
+  height: 40upx;
+  margin-bottom: 24upx;
+}
+</style>