Files
medical-mall/unpackage/cache/.app-android/sourcemap/pages/mall/consumer/checkout.kt.map

1 line
109 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"version":3,"sources":["pages/mall/consumer/checkout.uvue","pages/mall/consumer/address-list.uvue","pages/main/profile.uvue","uni_modules/ak-req/ak-req.uts","pages/user/change-password.uvue","pages/user/login.uvue","pages/main/index.uvue","pages/user/center.uvue","pages/user/register.uvue"],"sourcesContent":["<!-- 结算页面 -->\r\n<template>\r\n\t<view class=\"checkout-page\">\r\n\t\t<scroll-view class=\"checkout-content\" direction=\"vertical\">\r\n\t\t\t<!-- 收货地址 -->\r\n\t\t\t<view class=\"section-card address-section\" @click=\"selectAddress\">\r\n\t\t\t\t<view class=\"address-icon-wrapper\">\r\n\t\t\t\t\t<text class=\"location-icon\">📍</text>\r\n\t\t\t\t</view>\r\n\t\t\t\t<view v-if=\"selectedAddress\" class=\"address-info\">\r\n\t\t\t\t\t<view class=\"address-header\">\r\n\t\t\t\t\t\t<text class=\"recipient\">{{ selectedAddress!!.recipient_name }}</text>\r\n\t\t\t\t\t\t<text class=\"phone\">{{ selectedAddress!!.phone }}</text>\r\n\t\t\t\t\t\t<view v-if=\"selectedAddress!!.is_default\" class=\"default-tag\">\r\n\t\t\t\t\t\t\t<text class=\"tag-text\">默认</text>\r\n\t\t\t\t\t\t</view>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t\t<text class=\"address-detail\">{{ getFullAddress(selectedAddress!!) }}</text>\r\n\t\t\t\t</view>\r\n\t\t\t\t<view v-else class=\"no-address\">\r\n\t\t\t\t\t<text class=\"no-address-text\">请选择收货地址</text>\r\n\t\t\t\t</view>\r\n\t\t\t\t<view class=\"address-arrow-wrapper\">\r\n\t\t\t\t\t<text class=\"address-arrow\"></text>\r\n\t\t\t\t</view>\r\n\t\t\t</view>\r\n\r\n\t\t\t<!-- 商品列表 (按店铺分组) -->\r\n\t\t\t<view class=\"section-card products-section\">\r\n\t\t\t\t<view v-if=\"shopGroups.length > 0\">\r\n <view v-for=\"group in shopGroups\" :key=\"group.shopId\" class=\"shop-group\">\r\n <view class=\"shop-header\">\r\n <text class=\"shop-icon\">🏪</text>\r\n <text class=\"shop-name\">{{ group.shopName }}</text>\r\n </view>\r\n \r\n <!-- 商品列表 -->\r\n <view v-for=\"item in group.items\" :key=\"item.id\" class=\"product-item\">\r\n <image class=\"product-image\" :src=\"item.product_image\" mode=\"aspectFill\" />\r\n <view class=\"product-info\">\r\n <view class=\"product-name-row\">\r\n <text class=\"product-name\">{{ item.product_name }}</text>\r\n <text class=\"product-price\">¥{{ item.price }}</text>\r\n </view>\r\n <view class=\"product-spec-row\">\r\n <text v-if=\"item.sku_specifications\" class=\"product-spec\">{{ formatSpecs(item.sku_specifications) }}</text>\r\n <text class=\"product-quantity\">×{{ item.quantity }}</text>\r\n </view>\r\n <!-- 商品小计移至图片右侧 -->\r\n <view class=\"item-subtotal-row\">\r\n <text class=\"item-subtotal-label\">小计:</text>\r\n <text class=\"item-subtotal-price\">¥{{ (item.price * item.quantity).toFixed(2) }}</text>\r\n </view>\r\n </view>\r\n </view>\r\n </view>\r\n\t\t\t\t</view>\r\n\t\t\t\t<view v-else class=\"no-products\">\r\n\t\t\t\t\t<text class=\"no-products-text\">暂无商品信息</text>\r\n\t\t\t\t</view>\r\n\t\t\t</view>\r\n\r\n\t\t\t<!-- 配送方式 -->\r\n\t\t\t<view class=\"section-card delivery-section\">\r\n\t\t\t\t<view class=\"delivery-row\">\r\n\t\t\t\t\t<text class=\"section-title\">配送方式</text>\r\n\t\t\t\t\t<view class=\"delivery-selector\">\r\n\t\t\t\t\t\t<view v-for=\"option in deliveryOptions\" \r\n\t\t\t\t\t\t\t\t\t:key=\"option.id\" \r\n\t\t\t\t\t\t\t\t\t:class=\"['delivery-pill', { selected: selectedDelivery === option.id }]\"\r\n\t\t\t\t\t\t\t\t\t@click=\"selectDelivery(option)\">\r\n\t\t\t\t\t\t\t<text class=\"pill-name\">{{ option.name }}</text>\r\n\t\t\t\t\t\t</view>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t</view>\r\n\t\t\t\t<view class=\"delivery-detail\" v-if=\"selectedDelivery\">\r\n\t\t\t\t\t<text class=\"detail-desc\">{{ deliveryOptions.find(opt => opt.id === selectedDelivery)?.description }}</text>\r\n\t\t\t\t\t<text class=\"detail-price\">费用: ¥{{ deliveryOptions.find(opt => opt.id === selectedDelivery)?.price.toFixed(2) }}</text>\r\n\t\t\t\t</view>\r\n\t\t\t</view>\r\n\r\n\t\t\t<!-- 优惠券 -->\r\n\t\t\t<view class=\"section-card coupon-section\" @click=\"selectCoupon\">\r\n\t\t\t\t<view class=\"coupon-row\">\r\n\t\t\t\t\t<text class=\"section-title\">优惠券</text>\r\n\t\t\t\t\t<view class=\"coupon-right-content\">\r\n\t\t\t\t\t\t<text v-if=\"selectedCoupon != null\" class=\"coupon-selected-name\">{{ selectedCoupon.template?.name ?? '已选择优惠券' }}</text>\r\n\t\t\t\t\t\t<text v-else class=\"coupon-placeholder\">暂无可用优惠券</text>\r\n\t\t\t\t\t\t<text class=\"arrow-icon\"></text>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t</view>\r\n\t\t\t</view>\r\n\r\n\t\t\t<!-- 买家留言 -->\r\n\t\t\t<view class=\"section-card remark-section\">\r\n\t\t\t\t<view class=\"remark-row\">\r\n\t\t\t\t\t<text class=\"section-title\">买家留言</text>\r\n\t\t\t\t\t<input class=\"remark-input-compact\" \r\n\t\t\t\t\t\t\t\t v-model=\"remark\" \r\n\t\t\t\t\t\t\t\t placeholder=\"选填,给商家留言\"\r\n\t\t\t\t\t\t\t\t maxlength=\"100\" />\r\n\t\t\t\t</view>\r\n\t\t\t</view>\r\n\r\n\t\t\t<!-- 价格明细 -->\r\n\t\t\t<view class=\"section-card price-section\">\r\n\t\t\t\t<view class=\"price-grid\">\r\n\t\t\t\t\t<view class=\"price-item-inline\">\r\n\t\t\t\t\t\t<text class=\"price-item-label\">商品</text>\r\n\t\t\t\t\t\t<text class=\"price-item-value\">¥{{ totalAmount.toFixed(2) }}</text>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t\t<view class=\"price-item-inline\">\r\n\t\t\t\t\t\t<text class=\"price-item-label\">运费</text>\r\n\t\t\t\t\t\t<text class=\"price-item-value\">+¥{{ deliveryFee.toFixed(2) }}</text>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t\t<view v-if=\"discountAmount > 0\" class=\"price-item-inline\">\r\n\t\t\t\t\t\t<text class=\"price-item-label\">优惠</text>\r\n\t\t\t\t\t\t<text class=\"price-item-value discount-text\">-¥{{ discountAmount.toFixed(2) }}</text>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t</view>\r\n\t\t\t</view>\r\n\t\t\t\r\n\t\t\t<view class=\"safe-area-bottom\"></view>\r\n\t\t</scroll-view>\r\n\r\n\t\t<!-- 底部结算栏 -->\r\n\t\t<view class=\"footer-action-bar\">\r\n\t\t\t<view class=\"footer-left\">\r\n\t\t\t\t<text class=\"footer-total-label\">合计:</text>\r\n\t\t\t\t<text class=\"footer-currency\">¥</text>\r\n\t\t\t\t<text class=\"footer-price\">{{ actualAmount.toFixed(2) }}</text>\r\n\t\t\t</view>\r\n\t\t\t<button class=\"footer-submit-btn\" @click=\"submitOrder\">提交订单</button>\r\n\t\t</view>\r\n\r\n\t\t<!-- 地址选择弹窗 -->\r\n\t\t<view v-if=\"showAddressPopup\" class=\"address-popup-mask\" @click=\"showAddressPopup = false\">\r\n\t\t\t<view class=\"address-popup\" @click.stop>\r\n\t\t\t\t<view class=\"popup-header\">\r\n\t\t\t\t\t<text class=\"popup-title\">选择收货地址</text>\r\n\t\t\t\t\t<text class=\"popup-close\" @click=\"showAddressPopup = false\">×</text>\r\n\t\t\t\t</view>\r\n\t\t\t\t\r\n\t\t\t\t<scroll-view class=\"address-list-container\" direction=\"vertical\" :scroll-with-animation=\"true\">\r\n\t\t\t\t\t<!-- 登录提示 -->\r\n\t\t\t\t\t<view v-if=\"isLoggedIn == false\" class=\"login-prompt\" @click=\"goToLogin\">\r\n\t\t\t\t\t\t<text class=\"login-prompt-icon\">🔒</text>\r\n\t\t\t\t\t\t<text class=\"login-prompt-text\">您尚未登录,点击登录以同步服务器地址</text>\r\n\t\t\t\t\t\t<text class=\"login-prompt-arrow\"></text>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t\t\r\n\t\t\t\t\t<!-- 地址列表 -->\r\n\t\t\t\t\t<view v-if=\"isLoggedIn\">\r\n\t\t\t\t\t\t<view v-if=\"addressList.length > 0\">\r\n\t\t\t\t\t\t\t<view v-for=\"address in addressList\" :key=\"address.id\" \r\n\t\t\t\t\t\t\t\t\t\tclass=\"popup-address-item\" @click=\"handleSelectAddress(address)\">\r\n\t\t\t\t\t\t\t\t<view class=\"popup-address-header\">\r\n\t\t\t\t\t\t\t\t\t<text class=\"popup-address-name\">{{ address.recipient_name }}</text>\r\n\t\t\t\t\t\t\t\t\t<text class=\"popup-address-phone\">{{ address.phone }}</text>\r\n\t\t\t\t\t\t\t\t\t<view v-if=\"address.is_default\" class=\"popup-default-tag\">\r\n\t\t\t\t\t\t\t\t\t\t<text class=\"popup-tag-text\">默认</text>\r\n\t\t\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t\t\t<text class=\"popup-address-detail\">{{ getFullAddress(address) }}</text>\r\n\t\t\t\t\t\t\t\t<view v-if=\"selectedAddress !== null && selectedAddress.id === address.id\" class=\"popup-selected-indicator\">\r\n\t\t\t\t\t\t\t\t\t<text>✓</text>\r\n\t\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t<!-- 空状态 -->\r\n\t\t\t\t\t\t<view v-else class=\"popup-empty-address\">\r\n\t\t\t\t\t\t\t<text class=\"popup-empty-icon\">📍</text>\r\n\t\t\t\t\t\t\t<text class=\"popup-empty-text\">暂无收货地址</text>\r\n\t\t\t\t\t\t</view>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t\t\r\n\t\t\t\t\t<!-- 未登录时的本地地址展示 -->\r\n\t\t\t\t\t<view v-if=\"isLoggedIn == false && addressList.length > 0\">\r\n\t\t\t\t\t\t<text class=\"local-address-title\">本地地址(未同步)</text>\r\n\t\t\t\t\t\t<view v-for=\"address in addressList\" :key=\"address.id\" \r\n\t\t\t\t\t\t\t\t\tclass=\"popup-address-item\" @click=\"handleSelectAddress(address)\">\r\n\t\t\t\t\t\t\t<view class=\"popup-address-header\">\r\n\t\t\t\t\t\t\t\t<text class=\"popup-address-name\">{{ address.recipient_name }}</text>\r\n\t\t\t\t\t\t\t\t<text class=\"popup-address-phone\">{{ address.phone }}</text>\r\n\t\t\t\t\t\t\t\t<view v-if=\"address.is_default\" class=\"popup-default-tag\">\r\n\t\t\t\t\t\t\t\t\t<text class=\"popup-tag-text\">默认</text>\r\n\t\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t\t<text class=\"popup-address-detail\">{{ getFullAddress(address) }}</text>\r\n\t\t\t\t\t\t\t<view v-if=\"selectedAddress != null && selectedAddress!.id === address.id\" class=\"popup-selected-indicator\">\r\n\t\t\t\t\t\t\t\t<text>✓</text>\r\n\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t</view>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t\t\r\n\t\t\t\t\t<!-- 完全无地址状态 -->\r\n\t\t\t\t\t<view v-if=\"isLoggedIn && addressList.length === 0\" class=\"popup-empty-address\">\r\n\t\t\t\t\t\t<text class=\"popup-empty-icon\">📍</text>\r\n\t\t\t\t\t\t<text class=\"popup-empty-text\">暂无收货地址</text>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t</scroll-view>\r\n\t\t\t\t\r\n\t\t\t\t<!-- 新建地址按钮 -->\r\n\t\t\t\t<view class=\"popup-add-address-btn\" @click=\"handleAddNewAddress\">\r\n\t\t\t\t\t<text class=\"popup-btn-icon\">+</text>\r\n\t\t\t\t\t<text class=\"popup-btn-text\">新建收货地址</text>\r\n\t\t\t\t</view>\r\n\t\t\t</view>\r\n\t\t</view>\r\n\r\n\t\t<!-- 新建地址表单弹窗 -->\r\n\t\t<view v-if=\"showNewAddressForm\" class=\"address-form-mask\" @click=\"cancelNewAddress\">\r\n\t\t\t<view class=\"address-form-popup\" @click.stop>\r\n\t\t\t\t<view class=\"form-header\">\r\n\t\t\t\t\t<text class=\"form-title\">新建收货地址</text>\r\n\t\t\t\t\t<view class=\"form-close-btn\" @click=\"cancelNewAddress\">\r\n\t\t\t\t\t\t<text class=\"form-close-icon\">✕</text>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t</view>\r\n\t\t\t\t\r\n\t\t\t\t<scroll-view class=\"form-content\" direction=\"vertical\">\r\n\t\t\t\t\t<view class=\"form-section\">\r\n\t\t\t\t\t\t<view class=\"form-item\">\r\n\t\t\t\t\t\t\t<text class=\"form-label\">收货人</text>\r\n\t\t\t\t\t\t\t<input class=\"form-input\" v-model=\"newAddress.recipient_name\" \r\n\t\t\t\t\t\t\t\t\t\t placeholder=\"请输入收货人姓名\" />\r\n\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t<view class=\"form-item\">\r\n\t\t\t\t\t\t\t<text class=\"form-label\">手机号</text>\r\n\t\t\t\t\t\t\t<input class=\"form-input\" v-model=\"newAddress.phone\" \r\n\t\t\t\t\t\t\t\t\t\t placeholder=\"请输入手机号码\" type=\"number\" />\r\n\t\t\t\t\t\t</view>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t\t\r\n\t\t\t\t\t<view class=\"form-section\">\r\n\t\t\t\t\t\t<view class=\"form-item\">\r\n\t\t\t\t\t\t\t<view class=\"label-row\">\r\n\t\t\t\t\t\t\t\t<text class=\"form-label\">智能填写</text>\r\n\t\t\t\t\t\t\t\t<text class=\"smart-tag\">识别姓名/电话/地址</text>\r\n\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t\t<textarea class=\"form-textarea smart-address-input\" \r\n\t\t\t\t\t\t\t\t\t\t\t\tv-model=\"smartAddressInput\" \r\n\t\t\t\t\t\t\t\t\t\t\t\tplaceholder=\"粘贴收货信息文本,自动拆分字段\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t@input=\"parseSmartAddress\"\r\n\t\t\t\t\t\t\t\t\t\t\t\tmaxlength=\"200\" />\r\n\t\t\t\t\t\t</view>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t\t\r\n\t\t\t\t\t<view class=\"form-section\">\r\n\t\t\t\t\t\t<view class=\"form-item\">\r\n\t\t\t\t\t\t\t<text class=\"form-label\">所在地区</text>\r\n\t\t\t\t\t\t\t<view class=\"region-inputs\">\r\n\t\t\t\t\t\t\t\t<input class=\"form-input region-input form-input-readonly\" v-model=\"newAddress.province\" \r\n\t\t\t\t\t\t\t\t\t\t\t placeholder=\"省\" readonly />\r\n\t\t\t\t\t\t\t\t<input class=\"form-input region-input form-input-readonly\" v-model=\"newAddress.city\" \r\n\t\t\t\t\t\t\t\t\t\t\t placeholder=\"市\" readonly />\r\n\t\t\t\t\t\t\t\t<input class=\"form-input region-input form-input-readonly\" v-model=\"newAddress.district\" \r\n\t\t\t\t\t\t\t\t\t\t\t placeholder=\"区/县\" readonly />\r\n\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t<view class=\"form-item\">\r\n\t\t\t\t\t\t\t<text class=\"form-label\">详细地址</text>\r\n\t\t\t\t\t\t\t<textarea class=\"form-textarea detail-textarea\" v-model=\"newAddress.detail\" \r\n\t\t\t\t\t\t\t\t\t\t\t\tplaceholder=\"如街道、楼栋、门牌号等\" \r\n\t\t\t\t\t\t\t\t\t\t\t\tmaxlength=\"100\" />\r\n\t\t\t\t\t\t</view>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t\t\r\n\t\t\t\t\t<view class=\"form-item checkbox-item\">\r\n\t\t\t\t\t\t<view class=\"checkbox-wrapper\" @click=\"newAddress.is_default = !newAddress.is_default\">\r\n\t\t\t\t\t\t\t<view :class=\"['checkbox', { checked: newAddress.is_default }]\">\r\n\t\t\t\t\t\t\t\t<text v-if=\"newAddress.is_default\" class=\"checkbox-check\">✓</text>\r\n\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t\t<text class=\"checkbox-label\">设为默认地址</text>\r\n\t\t\t\t\t\t</view>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t</scroll-view>\r\n\t\t\t\t\r\n\t\t\t\t<view class=\"form-buttons\">\r\n\t\t\t\t\t<button class=\"form-submit-btn\" @click=\"saveNewAddress\">保存并使用</button>\r\n\t\t\t\t</view>\r\n\t\t\t</view>\r\n\t\t</view>\r\n\t\t<!-- 确认保存弹窗 -->\r\n\t\t<view v-if=\"showSaveConfirm\" class=\"confirm-popup-mask\">\r\n\t\t\t<view class=\"confirm-popup\">\r\n\t\t\t\t<view class=\"confirm-header\">\r\n\t\t\t\t\t<text class=\"confirm-title\">保存地址</text>\r\n\t\t\t\t</view>\r\n\t\t\t\t<view class=\"confirm-content\">\r\n\t\t\t\t\t<text class=\"confirm-message\">是否保存该地址用于下次使用?</text>\r\n\t\t\t\t</view>\r\n\t\t\t\t<view class=\"confirm-buttons\">\r\n\t\t\t\t\t<button class=\"confirm-btn cancel\" @click=\"handleSaveConfirm(false)\">仅本次</button>\r\n\t\t\t\t\t<button class=\"confirm-btn confirm\" @click=\"handleSaveConfirm(true)\">保存</button>\r\n\t\t\t\t</view>\r\n\t\t\t</view>\r\n\t\t</view>\r\n\r\n\t</view>\r\n</template>\r\n\r\n<script setup lang=\"uts\">\r\nimport { ref, onMounted, computed, watch, onUnmounted, getCurrentInstance } from 'vue'\r\nimport { onLoad } from '@dcloudio/uni-app'\r\nimport { supabaseService, type UserAddress as SupabaseUserAddress } from '@/utils/supabaseService.uts'\r\n\r\ntype CheckoutItemType = {\r\n\tid: string\r\n\tproduct_id: string\r\n\tsku_id: string\r\n\tproduct_name: string\r\n\tproduct_image: string\r\n\tsku_specifications: any\r\n\tprice: number\r\n\toriginal_price: number // 原价\r\n\tmember_price: number // 会员价\r\n\tquantity: number\r\n shop_id?: string\r\n shop_name?: string\r\n merchant_id?: string\r\n}\r\n\r\ntype DeliveryOptionType = {\r\n\tid: string\r\n\tname: string\r\n\tprice: number\r\n\tdescription: string\r\n}\r\n\r\ntype ShopGroupType = {\r\n\tshopId: string\r\n\tshopName: string\r\n\tmerchant_id: string\r\n\titems: Array<CheckoutItemType>\r\n}\r\n\r\ntype CouponTemplateType = {\r\n\tname: string\r\n\tdiscount_value: number\r\n\tmin_order_amount: number\r\n}\r\n\r\ntype UserCouponType = {\r\n\tid: string\r\n\ttemplate: CouponTemplateType | null\r\n}\r\n\r\ntype AddressItem = {\r\n\tid: string\r\n\trecipient_name: string\r\n\tphone: string\r\n\tprovince: string\r\n\tcity: string\r\n\tdistrict: string\r\n\tdetail: string\r\n\tis_default: boolean\r\n}\r\n\r\ntype NewAddressData = {\r\n id: string\r\n name: string\r\n phone: string\r\n province: string\r\n city: string\r\n district: string\r\n detail: string\r\n isDefault: boolean\r\n}\r\n\r\n// 添加新地址表单类型定义\r\ntype NewAddressForm = {\r\n\trecipient_name: string\r\n\tphone: string\r\n\tprovince: string\r\n\tcity: string\r\n\tdistrict: string\r\n\tdetail: string\r\n\tis_default: boolean\r\n}\r\n\r\ntype MockAddress = {\r\n\tid: string\r\n\tname: string\r\n\tphone: string\r\n\tprovince: string\r\n\tcity: string\r\n\tdistrict: string\r\n\tdetail: string\r\n\tisDefault: boolean\r\n}\r\n\r\n// 添加对象 keys 获取函数\r\nfunction getObjectKeys(obj: object): string[] {\r\n const keys: string[] = []\r\n // UTS 兼容的对象属性获取方式\r\n const tempObj = obj as Record<string, any>\r\n \r\n // 使用 try-catch 安全获取对象属性\r\n try {\r\n // 假设我们知道一些常见的属性名\r\n const commonKeys = ['id', 'name', 'value', 'label', 'key', 'recipient_name', 'phone', 'province', 'city', 'district', 'detail', 'is_default']\r\n for (let i = 0; i < commonKeys.length; i++) {\r\n const key = commonKeys[i]\r\n // 替换 hasOwnProperty 检查\r\n if (tempObj[key] !== null) { // 移除对 undefined 的检查\r\n keys.push(key)\r\n }\r\n }\r\n } catch (e) {\r\n // 捕获异常,避免编译错误\r\n }\r\n \r\n return keys\r\n}\r\n\r\nconst checkoutItems = ref<Array<CheckoutItemType>>([])\r\nconst selectedAddress = ref<AddressItem | null>(null)\r\nconst deliveryOptions = ref<Array<DeliveryOptionType>>([\r\n\t{ id: 'express', name: '物流快递', price: 8.00, description: '普通快递配送' },\r\n\t{ id: 'local', name: '同城配送', price: 15.00, description: '同城极速上门' }\r\n])\r\nconst selectedDelivery = ref<string>('express')\r\nconst selectedCoupon = ref<UserCouponType | null>(null)\r\nconst remark = ref<string>('')\r\nconst showAddressPopup = ref<boolean>(false)\r\nconst addressList = ref<Array<AddressItem>>([])\r\nconst newAddress = ref<NewAddressForm>({\r\n\trecipient_name: '',\r\n\tphone: '',\r\n\tprovince: '',\r\n\tcity: '',\r\n\tdistrict: '',\r\n\tdetail: '',\r\n\tis_default: false\r\n})\r\nconst showNewAddressForm = ref<boolean>(false)\r\nconst showSaveConfirm = ref<boolean>(false)\r\nconst smartAddressInput = ref<string>('')\r\n\r\nconst toUTSJSONObject = (value: any): UTSJSONObject => {\r\n\tif (value instanceof UTSJSONObject) return value as UTSJSONObject\r\n\treturn JSON.parse(JSON.stringify(value ?? {})) as UTSJSONObject\r\n}\r\n\r\n// 计算属性 - 修复价格同步问题\r\n// 按店铺分组商品\r\nconst shopGroups = computed((): Array<ShopGroupType> => {\r\n\tconst groups: Array<ShopGroupType> = []\r\n\tcheckoutItems.value.forEach((item) => {\r\n\t\tconst shopId = item.shop_id ?? 'unknown'\r\n\t\tlet target: ShopGroupType | null = null\r\n\t\tfor (let i = 0; i < groups.length; i++) {\r\n\t\t\tif (groups[i].shopId == shopId) {\r\n\t\t\t\ttarget = groups[i]\r\n\t\t\t\tbreak\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (target == null) {\r\n\t\t\ttarget = {\r\n\t\t\t\tshopId: shopId,\r\n\t\t\t\tshopName: item.shop_name ?? '商城优选',\r\n\t\t\t\tmerchant_id: item.merchant_id ?? item.shop_id ?? '',\r\n\t\t\t\titems: []\r\n\t\t\t}\r\n\t\t\tgroups.push(target)\r\n\t\t}\r\n\t\ttarget.items.push(item)\r\n\t})\r\n\treturn groups\r\n})\r\n\r\nconst getGroupTotal = (group: ShopGroupType): string => {\r\n\tlet sum = 0\r\n\tgroup.items.forEach((item) => {\r\n\t\t// 优先使用会员价,如果没有会员价则使用原价\r\n\t\tlet price = item.price\r\n\t\tif (item.member_price != null && item.member_price > 0 && item.member_price < item.price) {\r\n\t\t\tprice = item.member_price\r\n\t\t}\r\n\t\tconst quantity = item.quantity\r\n\t\tif (isNaN(price) == false && isNaN(quantity) == false) {\r\n\t\t\tsum += (price * quantity)\r\n\t\t}\r\n\t})\r\n\treturn sum.toFixed(2)\r\n}\r\n\r\nconst totalAmount = computed(() => {\r\n\tconsole.log('计算商品总价checkoutItems:', checkoutItems.value)\r\n\tif (checkoutItems.value.length == 0) {\r\n\t\tconsole.log('商品列表为空返回0')\r\n\t\treturn 0\r\n\t}\r\n\t\r\n\t// 确保每个商品的价格和数量都是数字类型,并计算总和\r\n\tconst total = checkoutItems.value.reduce((sum, item) => {\r\n\t\t// 确保item存在且包含必要的属性\r\n\t\tif (item == null) return sum\r\n\t\t\r\n\t\t// 优先使用会员价,如果没有会员价则使用原价\r\n\t\tlet price = item.price\r\n\t\tif (item.member_price != null && item.member_price > 0 && item.member_price < item.price) {\r\n\t\t\tprice = item.member_price\r\n\t\t}\r\n\t\tconst quantity = item.quantity\r\n\t\t\r\n\t\t// 验证转换后的数字是否有效\r\n\t\tif (isNaN(price) || isNaN(quantity) || price <= 0 || quantity <= 0) {\r\n\t\t\tconsole.warn('商品价格或数量无效:', item, 'price:', price, 'quantity:', quantity)\r\n\t\t\treturn sum\r\n\t\t}\r\n\t\t\r\n\t\tconst itemTotal = price * quantity\r\n\t\treturn sum + itemTotal\r\n\t}, 0)\r\n\t\r\n\treturn total\r\n})\r\n\r\nconst deliveryFee = computed(() => {\r\n\tconst option = deliveryOptions.value.find(opt => opt.id === selectedDelivery.value)\r\n\treturn option?.price ?? 0\r\n})\r\n\r\nconst discountAmount = computed(() => {\r\n\tconst coupon = selectedCoupon.value?.template\r\n\tif (coupon == null) return 0\r\n\t// 确保使用计算后的商品总价进行比较 (should be min_order_amount)\r\n\tif (totalAmount.value < coupon.min_order_amount) return 0\r\n\t\r\n\t// 简单处理:假设都是满减券\r\n\treturn coupon.discount_value\r\n})\r\n\r\nconst actualAmount = computed(() => {\r\n\t// 确保所有值都是数字类型\r\n\tconst total = typeof totalAmount.value === 'number' ? totalAmount.value : 0\r\n\tconst delivery = typeof deliveryFee.value === 'number' ? deliveryFee.value : 0\r\n\tconst discount = typeof discountAmount.value === 'number' ? discountAmount.value : 0\r\n\t\r\n\t// 正确计算:商品总价 + 运费 - 优惠减免\r\n\tlet amount = total + delivery - discount\r\n\t\r\n\t// 金额必须大于等于0\r\n\treturn amount > 0 ? amount : 0\r\n})\r\n\r\n// 监听checkoutItems变化 - 调试用\r\nwatch(checkoutItems, (newItems: Array<CheckoutItemType>) => {\r\n\tconsole.log('checkoutItems变化了:', newItems)\r\n\tconsole.log('商品总价计算:', totalAmount.value)\r\n}, { deep: true })\r\n\r\n// 处理商品数据清洗\r\nconst processCheckoutItems = async (items: any[]) => {\r\n\t// 获取会员折扣信息\r\n\tlet memberDiscount = 1.0\r\n\ttry {\r\n\t\tconst memberInfo = await supabaseService.getUserMemberInfo()\r\n\t\tconst discountRaw = memberInfo.get('discount')\r\n\t\tif (discountRaw != null) {\r\n\t\t\tmemberDiscount = discountRaw as number\r\n\t\t}\r\n\t} catch (e) {\r\n\t\tconsole.log('获取会员信息失败,使用默认折扣:', e)\r\n\t}\r\n\t\r\n\t// 数据清洗:确保价格和数量是数字类型\r\n\tconst converted: Array<CheckoutItemType> = []\r\n\tif (items != null && items.length > 0) {\r\n\t\tfor (let i = 0; i < items.length; i++) {\r\n\t\t\tconst obj = toUTSJSONObject(items[i])\r\n\t\t\tconst id = obj.getString('id') ?? ''\r\n\t\t\tconst productId = obj.getString('product_id') ?? obj.getString('productId') ?? id\r\n\t\t\tconst skuId = obj.getString('sku_id') ?? obj.getString('skuId') ?? id\r\n\t\t\tconst productName = obj.getString('product_name') ?? obj.getString('name') ?? ''\r\n\t\t\tconst productImage = obj.getString('product_image') ?? obj.getString('image') ?? ''\r\n\r\n\t\t\tlet specs: any = {}\r\n\t\t\tconst skuSpecsAny = obj.get('sku_specifications')\r\n\t\t\tif (skuSpecsAny != null) {\r\n\t\t\t\tspecs = skuSpecsAny\r\n\t\t\t} else {\r\n\t\t\t\tconst specAny = obj.get('spec')\r\n\t\t\t\tif (specAny != null) specs = ({ spec: specAny } as any)\r\n\t\t\t}\r\n\r\n\t\t\tlet price = 0\r\n\t\t\tconst priceAny = obj.get('price')\r\n\t\t\tif (priceAny != null) {\r\n\t\t\t\tconst parsed = parseFloat(priceAny.toString())\r\n\t\t\t\tif (isNaN(parsed) == false) price = parsed\r\n\t\t\t}\r\n\r\n\t\t\tlet quantity = 1\r\n\t\t\tconst quantityAny = obj.get('quantity')\r\n\t\t\tif (quantityAny != null) {\r\n\t\t\t\tconst parsedQ = parseInt(quantityAny.toString())\r\n\t\t\t\tif (isNaN(parsedQ) == false && parsedQ >= 1) quantity = parsedQ\r\n\t\t\t}\r\n\r\n\t\t\tconst shopId = obj.getString('shop_id') ?? obj.getString('shopId') ?? 'unknown'\r\n\t\t\tconst shopName = obj.getString('shop_name') ?? obj.getString('shopName') ?? ''\r\n\t\t\tconst merchantId = obj.getString('merchant_id') ?? obj.getString('merchantId') ?? ''\r\n\t\t\t\r\n\t\t\t// 计算会员价\r\n\t\t\tlet memberPrice = 0\r\n\t\t\tif (memberDiscount > 0 && memberDiscount < 1 && price > 0) {\r\n\t\t\t\tmemberPrice = Math.round(price * memberDiscount * 100) / 100\r\n\t\t\t}\r\n\r\n\t\t\tconverted.push({\r\n\t\t\t\tid: id,\r\n\t\t\t\tproduct_id: productId,\r\n\t\t\t\tsku_id: skuId,\r\n\t\t\t\tproduct_name: productName,\r\n\t\t\t\tproduct_image: productImage,\r\n\t\t\t\tsku_specifications: specs,\r\n\t\t\t\tprice: parseFloat(price.toFixed(2)),\r\n\t\t\t\toriginal_price: parseFloat(price.toFixed(2)),\r\n\t\t\t\tmember_price: memberPrice,\r\n\t\t\t\tquantity: quantity,\r\n\t\t\t\tshop_id: shopId,\r\n\t\t\t\tshop_name: shopName,\r\n\t\t\t\tmerchant_id: merchantId\r\n\t\t\t} as CheckoutItemType)\r\n\t\t}\r\n\t}\r\n\tcheckoutItems.value = converted\r\n\t// 调试:打印每个商品的价格\r\n\tif (checkoutItems.value.length > 0) {\r\n\t\tconsole.log('清洗后商品价格明细:')\r\n\t\tcheckoutItems.value.forEach((item: CheckoutItemType, index: number) => {\r\n\t\t\tconsole.log(`商品${index}:`, item.product_name, '原价:', item.price, '会员价:', item.member_price, 'shop:', item.shop_id)\r\n\t\t})\r\n\t}\r\n}\r\n\r\n// 获取当前用户ID\r\nfunction getCurrentUserId(): string {\r\n\tconst userId = supabaseService.getCurrentUserId()\r\n\treturn userId ?? ''\r\n}\r\n\r\n// 生命周期\r\nonMounted(() => {\r\n\t// 监听地址更新事件\r\n\tuni.$on('addressUpdated', (updatedAddressList: Array<AddressItem>) => {\r\n\t\taddressList.value = updatedAddressList\r\n\t\t\r\n\t\t// 如果当前没有选中地址,尝试选择默认地址\r\n\t\tif (selectedAddress.value == null && addressList.value.length > 0) {\r\n\t\t\tlet defaultAddress: AddressItem | null = null\r\n\t\t\tfor (let i = 0; i < addressList.value.length; i++) {\r\n\t\t\t\tconst addr = addressList.value[i]\r\n\t\t\t\tif (addr.is_default) {\r\n\t\t\t\t\tdefaultAddress = addr\r\n\t\t\t\t\tbreak\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (defaultAddress != null) selectedAddress.value = defaultAddress\r\n\t\t}\r\n\t})\r\n})\r\n\r\n// 组件卸载时移除事件监听\r\nonUnmounted(() => {\r\n\tuni.$off('addressUpdated')\r\n\tuni.$off('checkoutPageShow')\r\n // 离开页面时清除结算数据,防止下次进入时显示旧数据\r\n uni.removeStorageSync('checkout_type')\r\n uni.removeStorageSync('checkout_items')\r\n})\r\n\r\n// 加载默认地址\r\nasync function loadDefaultAddress(): Promise<void> {\r\n\ttry {\r\n\t\t// 首先检查用户是否登录\r\n\t\tconst currentUserId = getCurrentUserId()\r\n\t\t\r\n\t\t// 如果用户已登录尝试从Supabase加载地址数据\r\n\t\tif (currentUserId != '') {\r\n\t\t\tconst supabaseAddresses = await supabaseService.getAddresses()\r\n\t\t\t\r\n\t\t\tif (supabaseAddresses != null && supabaseAddresses.length > 0) {\r\n\t\t\t\t// 查找默认地址\r\n\t\t\t\tconst defaultAddress = supabaseAddresses.find((addr: SupabaseUserAddress) => addr.is_default === true)\r\n\t\t\t\tif (defaultAddress != null) {\r\n\t\t\t\t\t// 转换地址格式以匹配selectedAddress的结构\r\n\t\t\t\t\tconst addr: AddressItem = {\r\n\t\t\t\t\t\tid: defaultAddress.id,\r\n\t\t\t\t\t\trecipient_name: defaultAddress.recipient_name,\r\n\t\t\t\t\t\tphone: defaultAddress.phone,\r\n\t\t\t\t\t\tprovince: defaultAddress.province,\r\n\t\t\t\t\t\tcity: defaultAddress.city,\r\n\t\t\t\t\t\tdistrict: defaultAddress.district,\r\n\t\t\t\t\t\tdetail: defaultAddress.detail_address,\r\n\t\t\t\t\t\tis_default: defaultAddress.is_default\r\n\t\t\t\t\t}\r\n\t\t\t\t\tselectedAddress.value = addr\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// 如果没有默认地址,使用第一个地址\r\n\t\t\t\t\tconst firstAddress = supabaseAddresses[0]\r\n\t\t\t\t\tconst addr: AddressItem = {\r\n\t\t\t\t\t\tid: firstAddress.id,\r\n\t\t\t\t\t\trecipient_name: firstAddress.recipient_name,\r\n\t\t\t\t\t\tphone: firstAddress.phone,\r\n\t\t\t\t\t\tprovince: firstAddress.province,\r\n\t\t\t\t\t\tcity: firstAddress.city,\r\n\t\t\t\t\t\tdistrict: firstAddress.district,\r\n\t\t\t\t\t\tdetail: firstAddress.detail_address,\r\n\t\t\t\t\t\tis_default: firstAddress.is_default\r\n\t\t\t\t\t}\r\n\t\t\t\t\tselectedAddress.value = addr\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t// 同时更新本地存储缓存\r\n\t\t\t\tconst localAddresses: any[] = []\r\n\t\t\t\tfor (let i = 0; i < supabaseAddresses.length; i++) {\r\n\t\t\t\t\tconst addr = supabaseAddresses[i]\r\n\t\t\t\t\tlocalAddresses.push({\r\n\t\t\t\t\t\tid: addr.id,\r\n\t\t\t\t\t\tname: addr.recipient_name,\r\n\t\t\t\t\t\tphone: addr.phone,\r\n\t\t\t\t\t\tprovince: addr.province,\r\n\t\t\t\t\t\tcity: addr.city,\r\n\t\t\t\t\t\tdistrict: addr.district,\r\n\t\t\t\t\t\tdetail: addr.detail_address,\r\n\t\t\t\t\t\tisDefault: addr.is_default\r\n\t\t\t\t\t})\r\n\t\t\t\t}\r\n\t\t\t\tuni.setStorageSync('addresses', JSON.stringify(localAddresses))\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\t// 如果Supabase没有地址数据或用户未登录尝试从本地存储加载\r\n\t\tif (selectedAddress.value == null) {\r\n\t\t\tconst storedAddresses = uni.getStorageSync('addresses')\r\n\t\t\tconst storedAddressesStr = storedAddresses != null ? storedAddresses.toString() : ''\r\n\t\t\tif (storedAddressesStr != '') {\r\n\t\t\t\ttry {\r\n\t\t\t\t\tconst addresses = JSON.parse(storedAddressesStr) as any[]\r\n\t\t\t\t\tif (addresses != null && addresses.length > 0) {\r\n\t\t\t\t\t\tlet picked: UTSJSONObject | null = null\r\n\t\t\t\t\t\tfor (let i = 0; i < addresses.length; i++) {\r\n\t\t\t\t\t\t\tconst obj = toUTSJSONObject(addresses[i])\r\n\t\t\t\t\t\t\tconst isDef = obj.getBoolean('isDefault') ?? obj.getBoolean('is_default') ?? false\r\n\t\t\t\t\t\t\tif (isDef) {\r\n\t\t\t\t\t\t\t\tpicked = obj\r\n\t\t\t\t\t\t\t\tbreak\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (picked == null) picked = toUTSJSONObject(addresses[0])\r\n\r\n\t\t\t\t\t\tconst addr: AddressItem = {\r\n\t\t\t\t\t\t\tid: picked.getString('id') ?? '',\r\n\t\t\t\t\t\t\trecipient_name: picked.getString('recipient_name') ?? picked.getString('name') ?? '',\r\n\t\t\t\t\t\t\tphone: picked.getString('phone') ?? '',\r\n\t\t\t\t\t\t\tprovince: picked.getString('province') ?? '',\r\n\t\t\t\t\t\t\tcity: picked.getString('city') ?? '',\r\n\t\t\t\t\t\t\tdistrict: picked.getString('district') ?? '',\r\n\t\t\t\t\t\t\tdetail: picked.getString('detail') ?? picked.getString('detail_address') ?? '',\r\n\t\t\t\t\t\t\tis_default: picked.getBoolean('isDefault') ?? picked.getBoolean('is_default') ?? false\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tselectedAddress.value = addr\r\n\t\t\t\t\t}\r\n\t\t\t\t} catch (err) {\r\n\t\t\t\t\tconsole.error('解析本地地址数据失败:', err)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\t// 如果仍然没有地址,使用模拟地址数据\r\n\t\tif (selectedAddress.value == null) {\r\n\t\t\t// 模拟地址数据\r\n\t\t\tconst mockAddresses: MockAddress[] = [\r\n\t\t\t\t{\r\n\t\t\t\t\tid: 'addr_001',\r\n\t\t\t\t\tname: '张三',\r\n\t\t\t\t\tphone: '13800138001',\r\n\t\t\t\t\tprovince: '北京市',\r\n\t\t\t\t\tcity: '北京市',\r\n\t\t\t\t\tdistrict: '朝阳区',\r\n\t\t\t\t\tdetail: '建国路88号SOHO现代城A座1001',\r\n\t\t\t\t\tisDefault: true\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\tid: 'addr_002',\r\n\t\t\t\t\tname: '李四',\r\n\t\t\t\t\tphone: '13900139001',\r\n\t\t\t\t\tprovince: '上海市',\r\n\t\t\t\t\tcity: '上海市',\r\n\t\t\t\t\tdistrict: '浦东新区',\r\n\t\t\t\t\tdetail: '陆家嘴环路1000号汇亚大厦20层',\r\n\t\t\t\t\tisDefault: false\r\n\t\t\t\t}\r\n\t\t\t]\r\n\t\t\t\r\n\t\t\t// 保存模拟地址到本地存储\r\n\t\t\tuni.setStorageSync('addresses', JSON.stringify(mockAddresses))\r\n\t\t\t\r\n\t\t\t// 使用第一个地址作为默认地址\r\n\t\t\tconst first = mockAddresses[0]\r\n\t\t\tconst addr: AddressItem = {\r\n\t\t\t\tid: first.id,\r\n\t\t\t\trecipient_name: first.name,\r\n\t\t\t\tphone: first.phone,\r\n\t\t\t\tprovince: first.province,\r\n\t\t\t\tcity: first.city,\r\n\t\t\t\tdistrict: first.district,\r\n\t\t\t\tdetail: first.detail,\r\n\t\t\t\tis_default: first.isDefault\r\n\t\t\t}\r\n\t\t\tselectedAddress.value = addr\r\n\t\t}\r\n\t\t\r\n\t} catch (error) {\r\n\t\tconsole.error('加载地址失败:', error)\r\n\t}\r\n}\r\n\r\n// 用户登录状态\r\nconst isLoggedIn = computed((): boolean => {\r\n\tconst userId = getCurrentUserId()\r\n\treturn userId != ''\r\n})\r\n\r\n// 获取完整地址\r\nconst getFullAddress = (address: AddressItem): string => {\r\n\treturn `${address.province}${address.city}${address.district}${address.detail}`\r\n}\r\n\r\n// 加载地址列表\r\nasync function loadAddressList(): Promise<void> {\r\n console.log('[loadAddressList] 开始加载地址列表')\r\n\ttry {\r\n\t\tconst currentUserId = getCurrentUserId()\r\n\t\tconsole.log('[loadAddressList] currentUserId:', currentUserId)\r\n\t\t\r\n\t\tif (currentUserId != '') {\r\n\t\t\tconst supabaseAddresses = await supabaseService.getAddresses()\r\n\t\t\tconsole.log('[loadAddressList] supabaseAddresses 数量:', supabaseAddresses != null ? supabaseAddresses.length : 0)\r\n\t\t\t\r\n\t\t\tif (supabaseAddresses != null && supabaseAddresses.length > 0) {\r\n\t\t\t\tconst list: AddressItem[] = []\r\n\t\t\t\tconst localAddresses: any[] = []\r\n\t\t\t\tfor (let i = 0; i < supabaseAddresses.length; i++) {\r\n\t\t\t\t\tconst addr = supabaseAddresses[i]\r\n\t\t\t\t\tconsole.log('[loadAddressList] 地址', i, ':', addr.recipient_name, addr.phone, addr.detail_address)\r\n\t\t\t\t\tlist.push({\r\n\t\t\t\t\t\tid: addr.id,\r\n\t\t\t\t\t\trecipient_name: addr.recipient_name,\r\n\t\t\t\t\t\tphone: addr.phone,\r\n\t\t\t\t\t\tprovince: addr.province,\r\n\t\t\t\t\t\tcity: addr.city,\r\n\t\t\t\t\t\tdistrict: addr.district,\r\n\t\t\t\t\t\tdetail: addr.detail_address,\r\n\t\t\t\t\t\tis_default: addr.is_default\r\n\t\t\t\t\t})\r\n\t\t\t\t\tlocalAddresses.push({\r\n\t\t\t\t\t\tid: addr.id,\r\n\t\t\t\t\t\tname: addr.recipient_name,\r\n\t\t\t\t\t\tphone: addr.phone,\r\n\t\t\t\t\t\tprovince: addr.province,\r\n\t\t\t\t\t\tcity: addr.city,\r\n\t\t\t\t\t\tdistrict: addr.district,\r\n\t\t\t\t\t\tdetail: addr.detail_address,\r\n\t\t\t\t\t\tisDefault: addr.is_default\r\n\t\t\t\t\t})\r\n\t\t\t\t}\r\n\t\t\t\taddressList.value = list\r\n\t\t\t\tconsole.log('[loadAddressList] addressList.value 设置完成, 数量:', addressList.value.length)\r\n\t\t\t\tuni.setStorageSync('addresses', JSON.stringify(localAddresses))\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tif (addressList.value.length == 0) {\r\n\t\t\tconst storedAddresses = uni.getStorageSync('addresses')\r\n\t\t\tconst storedAddressesStr = storedAddresses != null ? storedAddresses.toString() : ''\r\n\t\t\tif (storedAddressesStr != '') {\r\n\t\t\t\ttry {\r\n\t\t\t\t\tconst addresses = JSON.parse(storedAddressesStr) as any[]\r\n\t\t\t\t\tif (addresses != null && addresses.length > 0) {\r\n\t\t\t\t\t\tconst list: AddressItem[] = []\r\n\t\t\t\t\t\tfor (let i = 0; i < addresses.length; i++) {\r\n\t\t\t\t\t\t\tconst obj = toUTSJSONObject(addresses[i])\r\n\t\t\t\t\t\t\tlist.push({\r\n\t\t\t\t\t\t\t\tid: obj.getString('id') ?? '',\r\n\t\t\t\t\t\t\t\trecipient_name: obj.getString('recipient_name') ?? obj.getString('name') ?? '',\r\n\t\t\t\t\t\t\t\tphone: obj.getString('phone') ?? '',\r\n\t\t\t\t\t\t\t\tprovince: obj.getString('province') ?? '',\r\n\t\t\t\t\t\t\t\tcity: obj.getString('city') ?? '',\r\n\t\t\t\t\t\t\t\tdistrict: obj.getString('district') ?? '',\r\n\t\t\t\t\t\t\t\tdetail: obj.getString('detail') ?? obj.getString('detail_address') ?? '',\r\n\t\t\t\t\t\t\t\tis_default: obj.getBoolean('isDefault') ?? obj.getBoolean('is_default') ?? false\r\n\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\taddressList.value = list\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\taddressList.value = []\r\n\t\t\t\t\t}\r\n\t\t\t\t} catch (err) {\r\n\t\t\t\t\taddressList.value = []\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\taddressList.value = []\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tif (addressList.value.length == 0) {\r\n\t\t\tconst mockAddresses: MockAddress[] = [\r\n\t\t\t\t{\r\n\t\t\t\t\tid: 'addr_001',\r\n\t\t\t\t\tname: '张三',\r\n\t\t\t\t\tphone: '13800138001',\r\n\t\t\t\t\tprovince: '北京市',\r\n\t\t\t\t\tcity: '北京市',\r\n\t\t\t\t\tdistrict: '朝阳区',\r\n\t\t\t\t\tdetail: '建国路88号SOHO现代城A座1001',\r\n\t\t\t\t\tisDefault: true\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\tid: 'addr_002',\r\n\t\t\t\t\tname: '李四',\r\n\t\t\t\t\tphone: '13900139001',\r\n\t\t\t\t\tprovince: '上海市',\r\n\t\t\t\t\tcity: '上海市',\r\n\t\t\t\t\tdistrict: '浦东新区',\r\n\t\t\t\t\tdetail: '陆家嘴环路1000号汇亚大厦20层',\r\n\t\t\t\t\tisDefault: false\r\n\t\t\t\t}\r\n\t\t\t]\r\n\t\t\t\r\n\t\t\tuni.setStorageSync('addresses', JSON.stringify(mockAddresses))\r\n\t\t\t\r\n\t\t\tconst list: AddressItem[] = []\r\n\t\t\tfor (let i = 0; i < mockAddresses.length; i++) {\r\n\t\t\t\tconst addr = mockAddresses[i]\r\n\t\t\t\tlist.push({\r\n\t\t\t\t\tid: addr.id,\r\n\t\t\t\t\trecipient_name: addr.name,\r\n\t\t\t\t\tphone: addr.phone,\r\n\t\t\t\t\tprovince: addr.province,\r\n\t\t\t\t\tcity: addr.city,\r\n\t\t\t\t\tdistrict: addr.district,\r\n\t\t\t\t\tdetail: addr.detail,\r\n\t\t\t\t\tis_default: addr.isDefault\r\n\t\t\t\t})\r\n\t\t\t}\r\n\t\t\taddressList.value = list\r\n\t\t}\r\n\t} catch (error) {\r\n\t\tconsole.error('加载地址列表失败:', error)\r\n\t}\r\n}\r\n\r\n// 从本地存储加载结算数据(例如从购物车进入)\r\nasync function loadFromLocalStorage(): Promise<void> {\r\n\tconst cartData = uni.getStorageSync('cart')\r\n\tconst cartDataStr = cartData != null ? cartData.toString() : ''\r\n\tif (cartDataStr != '') {\r\n\t\ttry {\r\n\t\t\tconst cartItems = JSON.parse(cartDataStr) as any[]\r\n\t\t\tconst selectedCartItems: any[] = []\r\n\t\t\tfor (let i = 0; i < cartItems.length; i++) {\r\n\t\t\t\tconst obj = toUTSJSONObject(cartItems[i])\r\n\t\t\t\tconst selected = obj.getBoolean('selected') ?? false\r\n\t\t\t\tif (selected) selectedCartItems.push(obj)\r\n\t\t\t}\r\n\t\t\tif (selectedCartItems.length > 0) {\r\n\t\t\t\tawait processCheckoutItems(selectedCartItems)\r\n\t\t\t}\r\n\t\t} catch (e) {\r\n\t\t\tconsole.error('解析购物车数据失败:', e)\r\n\t\t}\r\n\t}\r\n\tloadDefaultAddress()\r\n}\r\n\r\n// 加载结算数据兼容旧版本现在主要在onLoad中处理\r\nfunction loadCheckoutData(): void {\r\n\tloadFromLocalStorage()\r\n}\r\n\r\n// 初始化加载数据\r\nasync function initCheckoutData(): Promise<void> {\r\n let dataLoaded = false\r\n\tconst checkoutTypeAny = uni.getStorageSync('checkout_type')\r\n\tconst checkoutType = checkoutTypeAny != null ? checkoutTypeAny.toString() : ''\r\n\tif (checkoutType == 'buy_now' || checkoutType == 'cart') {\r\n\t\tconsole.log(`检测到结算模式(${checkoutType})从Storage加载数据`)\r\n\t\tconst itemsStrAny = uni.getStorageSync('checkout_items')\r\n\t\tconst itemsStr = itemsStrAny != null ? itemsStrAny.toString() : ''\r\n\t\tif (itemsStr != '') {\r\n\t\t\ttry {\r\n\t\t\t\tconst items = JSON.parse(itemsStr as string)\r\n\t\t\t\tconsole.log('从Storage加载的商品数据:', items)\r\n if (items != null && Array.isArray(items) && items.length > 0) {\r\n\t\t\t\t await processCheckoutItems(items)\r\n dataLoaded = true\r\n }\r\n\t\t\t} catch (e) {\r\n\t\t\t\tconsole.error('解析结算数据失败', e)\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tif (dataLoaded == false) {\r\n console.log('未找到预结算数据,尝试从购物车本地存储加载')\r\n\t await loadFromLocalStorage()\r\n }\r\n \r\n loadDefaultAddress()\r\n loadAddressList()\r\n}\r\n\r\nonLoad((options: any) => {\r\n initCheckoutData()\r\n})\r\n\r\n// 页面显示时触发\r\nfunction onShow(): void {\r\n\tconst userId = getCurrentUserId()\r\n\tif (userId != '') {\r\n\t\tloadDefaultAddress()\r\n\t\tloadAddressList()\r\n\t}\r\n}\r\n\r\nuni.$on('checkoutPageShow', onShow)\r\n\r\n// 选择地址\r\nconst handleSelectAddress = (address: AddressItem) => {\r\n\tselectedAddress.value = address\r\n\tshowAddressPopup.value = false\r\n}\r\n\r\n// 新建地址\r\nconst handleAddNewAddress = () => {\r\n\tshowNewAddressForm.value = true\r\n}\r\n\r\n// 保存新地址\r\nconst saveNewAddress = async () => {\r\n\tif (newAddress.value.recipient_name == '' || newAddress.value.phone == '' || newAddress.value.detail == '') {\r\n\t\tuni.showToast({\r\n\t\t\ttitle: '请填写完整信息',\r\n\t\t\ticon: 'none'\r\n\t\t})\r\n\t\treturn\r\n\t}\r\n\t// 触发保存确认弹窗\r\n\tshowSaveConfirm.value = true\r\n}\r\n\r\n// 处理保存确认\r\nconst handleSaveConfirm = async (save: boolean) => {\r\n\tshowSaveConfirm.value = false\r\n\t\r\n\tconst newAddressData: NewAddressData = {\r\n\t\tid: `addr_${Date.now()}`,\r\n\t\tname: newAddress.value.recipient_name,\r\n\t\tphone: newAddress.value.phone,\r\n\t\tprovince: newAddress.value.province,\r\n\t\tcity: newAddress.value.city,\r\n\t\tdistrict: newAddress.value.district,\r\n\t\tdetail: newAddress.value.detail,\r\n isDefault: newAddress.value.is_default \r\n\t}\r\n\t\t\r\n\t\tif (save) {\r\n\t\t\tconst storedAddresses = uni.getStorageSync('addresses')\r\n\t\t\tlet addresses: any[] = []\r\n\t\t\tconst storedAddressesStr = storedAddresses != null ? storedAddresses.toString() : ''\r\n\t\t\tif (storedAddressesStr != '') {\r\n\t\t\t\ttry {\r\n\t\t\t\t\taddresses = JSON.parse(storedAddressesStr) as any[]\r\n\t\t\t\t} catch (e) {\r\n\t\t\t\t\taddresses = []\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tconst normalized: any[] = []\r\n\t\t\tfor (let i = 0; i < addresses.length; i++) {\r\n\t\t\t\tconst obj = toUTSJSONObject(addresses[i])\r\n\t\t\t\tconst isDef = obj.getBoolean('isDefault') ?? obj.getBoolean('is_default') ?? false\r\n\t\t\t\tnormalized.push({\r\n\t\t\t\t\tid: obj.getString('id') ?? '',\r\n\t\t\t\t\tname: obj.getString('name') ?? obj.getString('recipient_name') ?? '',\r\n\t\t\t\t\tphone: obj.getString('phone') ?? '',\r\n\t\t\t\t\tprovince: obj.getString('province') ?? '',\r\n\t\t\t\t\tcity: obj.getString('city') ?? '',\r\n\t\t\t\t\tdistrict: obj.getString('district') ?? '',\r\n\t\t\t\t\tdetail: obj.getString('detail') ?? obj.getString('detail_address') ?? '',\r\n\t\t\t\t\tisDefault: newAddressData.isDefault ? false : isDef as boolean,\r\n\t\t\t\t\tlabel: obj.getString('label') ?? ''\r\n\t\t\t\t})\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tif (normalized.length === 0 && newAddressData.isDefault == false) {\r\n\t\t\t\tnewAddressData.isDefault = true\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tnormalized.unshift(newAddressData)\r\n\t\t\tuni.setStorageSync('addresses', JSON.stringify(normalized))\r\n\t\t\t\r\n\t\t\tconst updatedList: AddressItem[] = []\r\n\t\t\tfor (let i = 0; i < normalized.length; i++) {\r\n\t\t\t\tconst obj = toUTSJSONObject(normalized[i])\r\n\t\t\t\tupdatedList.push({\r\n\t\t\t\t\tid: obj.getString('id') ?? '',\r\n\t\t\t\t\trecipient_name: obj.getString('recipient_name') ?? obj.getString('name') ?? '',\r\n\t\t\t\t\tphone: obj.getString('phone') ?? '',\r\n\t\t\t\t\tprovince: obj.getString('province') ?? '',\r\n\t\t\t\t\tcity: obj.getString('city') ?? '',\r\n\t\t\t\t\tdistrict: obj.getString('district') ?? '',\r\n\t\t\t\t\tdetail: obj.getString('detail') ?? obj.getString('detail_address') ?? '',\r\n\t\t\t\t\tis_default: obj.getBoolean('isDefault') ?? obj.getBoolean('is_default') ?? false\r\n\t\t\t\t})\r\n\t\t\t}\r\n\t\t\tuni.$emit('addressUpdated', updatedList)\r\n\t\t}\r\n\t\t\r\n\t\tconst checkoutFormatAddress: AddressItem = {\r\n\t\tid: newAddressData.id ?? '',\r\n\t\trecipient_name: newAddressData.name ?? '',\r\n\t\tphone: newAddressData.phone ?? '',\r\n\t\tprovince: newAddressData.province,\r\n\t\tcity: newAddressData.city,\r\n\t\tdistrict: newAddressData.district,\r\n\t\tdetail: newAddressData.detail,\r\n\t\tis_default: newAddressData.isDefault\r\n\t}\r\n\t\t\r\n\t\tif (checkoutFormatAddress.is_default) {\r\n\t\t\tfor (let i = 0; i < addressList.value.length; i++) {\r\n\t\t\t\taddressList.value[i].is_default = false\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\taddressList.value.unshift(checkoutFormatAddress)\r\n\t\t\r\n\t\tif (checkoutFormatAddress.is_default || selectedAddress.value == null) {\r\n\t\t\tselectedAddress.value = checkoutFormatAddress\r\n\t\t}\r\n\t\t\r\n\t\tnewAddress.value = {\r\n\t\trecipient_name: '',\r\n\t\tphone: '',\r\n\t\tprovince: '',\r\n\t\tcity: '',\r\n\t\tdistrict: '',\r\n\t\tdetail: '',\r\n\t\tis_default: false\r\n\t} as NewAddressForm;\r\n\t\tsmartAddressInput.value = ''\r\n\t\tshowNewAddressForm.value = false\r\n\t\t\r\n\t\tuni.showToast({\r\n\t\t\ttitle: '地址保存成功',\r\n\t\t\ticon: 'success'\r\n\t\t})\r\n}\r\n\r\n// 解析智能地址\r\nconst parseSmartAddress = () => {\r\n\tconst input = smartAddressInput.value.trim()\r\n\tif (input == '') return\r\n\t\r\n\tnewAddress.value.recipient_name = ''\r\n\tnewAddress.value.phone = ''\r\n\tnewAddress.value.province = ''\r\n\tnewAddress.value.city = ''\r\n\tnewAddress.value.district = ''\r\n\tnewAddress.value.detail = ''\r\n\t\r\n\tconst phoneRegex = /(1[3-9]\\d{9})/g\r\n\tconst phoneMatches = input.match(phoneRegex)\r\n\tif (phoneMatches != null && phoneMatches.length > 0) {\r\n\t\tnewAddress.value.phone = phoneMatches[0] ?? ''\r\n\t}\r\n\t\r\n\tconst nameRegex = /([\\u4e00-\\u9fa5]{2,4})/g\r\n\tconst nameMatches = input.match(nameRegex)\r\n\t\tif (nameMatches != null && nameMatches.length > 0) {\r\n\t\t\tnewAddress.value.recipient_name = nameMatches[0] ?? ''\r\n\t\t}\r\n\t\r\n\tlet addressText = input\r\n\tif (newAddress.value.recipient_name != '') {\r\n\t\taddressText = addressText.replace(newAddress.value.recipient_name, '')\r\n\t}\r\n\tif (newAddress.value.phone != '') {\r\n\t\taddressText = addressText.replace(newAddress.value.phone, '')\r\n\t}\r\n\t\r\n\taddressText = addressText.replace(/[,;\\s]+/g, ' ').trim()\r\n\t\r\n\tconst patterns = [\r\n\t\t/^(.*?省)?(.*?市)?(.*?[区县])?(.*)$/,\r\n\t\t/^(.*?省)?(.*?市)?(.*)$/\r\n\t]\r\n\t\r\n\tfor (const pattern of patterns) {\r\n\t\tconst match = addressText.match(pattern)\r\n\t\tif (match != null) {\r\n\t\t\tconst [, province, city, district, detail] = match\r\n\t\t\t\r\n\t\t\tif (province != null) newAddress.value.province = province.replace('省', '').trim()\r\n\t\t\tif (city != null) newAddress.value.city = city.replace('市', '').trim()\r\n\t\t\tif (district != null) newAddress.value.district = district.trim()\r\n\t\t\tif (detail != null) newAddress.value.detail = detail.trim()\r\n\t\t\t\r\n\t\t\tif (newAddress.value.detail == '' && district != null && detail != null) {\r\n\t\t\t\tnewAddress.value.detail = detail.trim()\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tbreak\r\n\t\t}\r\n\t}\r\n\t\r\n\tif (newAddress.value.province == '' && newAddress.value.city == '' && newAddress.value.district == '') {\r\n\t\tconst parts = addressText.split(/[省市县区]/)\r\n\t\tif (parts.length >= 2) {\r\n\t\t\tnewAddress.value.province = parts[0] ?? ''\r\n\t\t\tnewAddress.value.city = parts[1] ?? ''\r\n\t\t\tnewAddress.value.detail = parts.slice(2).join('').trim()\r\n\t\t\tif (newAddress.value.detail == '') {\r\n\t\t\t newAddress.value.detail = addressText\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tnewAddress.value.detail = addressText\r\n\t\t}\r\n\t}\r\n\t\r\n\tif (newAddress.value.detail == '' && addressText.trim() != '') {\r\n\t\tnewAddress.value.detail = addressText.trim()\r\n\t}\r\n}\r\n\r\n// 取消新建地址\r\nconst cancelNewAddress = () => {\r\n\tshowNewAddressForm.value = false\r\n\tnewAddress.value = {\r\n\t\t\trecipient_name: '',\r\n\t\t\tphone: '',\r\n\t\t\tprovince: '',\r\n\t\t\tcity: '',\r\n\t\t\tdistrict: '',\r\n\t\t\tdetail: '',\r\n\t\t\tis_default: false\r\n\t\t} as NewAddressForm;\r\n\t\tsmartAddressInput.value = ''\r\n}\r\n\r\n// 获取规格文本\r\nfunction formatSpecs(specs: any): string {\r\n if (specs == null) return ''\r\n \r\n try {\r\n const specsStr = JSON.stringify(specs)\r\n if (specsStr == '{}' || specsStr == '[]' || specsStr == '\"\"' || specsStr == '') return ''\r\n \r\n // 使用 Record 类型替代 UTSJSONObject 的迭代器方法\r\n const specsObj = JSON.parse(specsStr) as Record<string, any>\r\n \r\n const parts: string[] = []\r\n // 遍历已知可能的规格键名\r\n const possibleKeys = ['颜色', '尺寸', '规格', '型号', '版本', '材质', '款式', 'color', 'size', 'spec', 'version', 'style']\r\n \r\n // 先尝试已知键名\r\n for (let i = 0; i < possibleKeys.length; i++) {\r\n const key = possibleKeys[i]\r\n const value = specsObj[key]\r\n if (value != null && value.toString() != '') {\r\n parts.push(`${key}: ${value.toString()}`)\r\n }\r\n }\r\n \r\n // 如果已知键名没找到,尝试遍历对象的所有属性\r\n if (parts.length === 0) {\r\n // 使用 JSON.stringify 后正则匹配键值对\r\n const keyValueRegex = /\"([^\"]+)\":\\s*\"([^\"]+)\"/g\r\n let match: RegExpExecArray | null = null\r\n while (true) {\r\n match = keyValueRegex.exec(specsStr)\r\n if (match == null) break\r\n const key = match[1]\r\n const value = match[2]\r\n if (key != null && value != null && value != '') {\r\n parts.push(`${key}: ${value}`)\r\n }\r\n }\r\n }\r\n \r\n if (parts.length === 0) return ''\r\n return parts.join('; ')\r\n } catch (e) {\r\n return ''\r\n }\r\n}\r\n\r\n// 选择配送方式\r\nconst selectDelivery = (option: DeliveryOptionType) => {\r\n\tselectedDelivery.value = option.id\r\n}\r\n\r\n// 选择优惠券\r\nconst selectCoupon = () => {\r\n\tuni.navigateTo({\r\n\t\turl: '/pages/mall/consumer/coupons',\r\n\t\tsuccess: (res: any) => {\r\n // 移除事件通道相关代码,避免使用不支持的 API\r\n // 注释掉事件通道逻辑,因为当前环境不支持 createEventChannel\r\n // const eventChannel = res.eventChannel || uni.createEventChannel()\r\n // if (eventChannel && eventChannel.emit) {\r\n // eventChannel.emit('setSelectMode', { selectMode: true })\r\n // }\r\n }\r\n\t})\r\n\t\r\n\tuni.$on('couponSelected', (coupon: any) => {\r\n\tselectedCoupon.value = coupon as UserCouponType\r\n\tuni.$off('couponSelected')\r\n\t})\r\n}\r\n\r\n// 提交订单\r\nconst submitOrder = async () => {\r\n if (selectedAddress.value == null) {\r\n uni.showToast({ title: '请选择收货地址', icon: 'none' })\r\n return\r\n }\r\n\r\n if (checkoutItems.value.length === 0) {\r\n uni.showToast({ title: '订单中没有商品', icon: 'none' })\r\n return\r\n }\r\n\r\n uni.showLoading({ title: '提交中...' })\r\n\r\n try {\r\n const userId = supabaseService.getCurrentUserId()\r\n if (userId == null || userId == '') {\r\n uni.hideLoading()\r\n uni.showToast({ title: '请先登录', icon: 'none' })\r\n return\r\n }\r\n \r\n console.log('[submitOrder] 开始创建订单, userId:', userId)\r\n console.log('[submitOrder] shopGroups数量:', shopGroups.value.length)\r\n \r\n const groups: any[] = []\r\n for (let i = 0; i < shopGroups.value.length; i++) {\r\n const group = shopGroups.value[i]\r\n console.log(`[submitOrder] 处理店铺组 ${i}:`, {\r\n shopId: group.shopId,\r\n shopName: group.shopName,\r\n merchant_id: group.merchant_id,\r\n itemsCount: group.items.length\r\n })\r\n const items: any[] = []\r\n for (let j = 0; j < group.items.length; j++) {\r\n const item = group.items[j]\r\n items.push({\r\n id: item.id,\r\n product_id: item.product_id,\r\n sku_id: item.sku_id,\r\n quantity: item.quantity,\r\n price: item.price,\r\n member_price: item.member_price,\r\n product_name: item.product_name,\r\n product_image: item.product_image,\r\n specifications: item.sku_specifications\r\n })\r\n }\r\n const finalMerchantId = (group.merchant_id != null && group.merchant_id != '') ? group.merchant_id : group.shopId\r\n console.log(`[submitOrder] 店铺组 ${i} 最终使用的 merchant_id:`, finalMerchantId)\r\n groups.push({\r\n merchant_id: finalMerchantId,\r\n shopId: group.shopId,\r\n shopName: group.shopName,\r\n items: items\r\n })\r\n }\r\n \r\n console.log('[submitOrder] 准备传递的 groups 数量:', groups.length)\r\n\r\n const result = await supabaseService.createOrdersByShop({\r\n shipping_address: selectedAddress.value !== null ? toUTSJSONObject(selectedAddress.value!) : new UTSJSONObject(),\r\n shopGroups: groups,\r\n deliveryFee: deliveryFee.value,\r\n discountAmount: discountAmount.value\r\n })\r\n \r\n uni.hideLoading()\r\n \r\n console.log('[submitOrder] 创建结果 success:', result.success)\r\n\r\n if (result.success) {\r\n try {\r\n uni.removeStorageSync('checkout_items')\r\n uni.removeStorageSync('checkout_type')\r\n } catch(e) { console.error(e) }\r\n\r\n const orderIds = result.orderIds\r\n if (orderIds.length === 1) {\r\n uni.navigateTo({\r\n url: `/pages/mall/consumer/payment?orderId=${orderIds[0]}&amount=${actualAmount.value}`\r\n })\r\n } else {\r\n uni.showToast({ title: `成功创建${orderIds.length}个订单`, icon: 'success' })\r\n setTimeout(() => {\r\n uni.redirectTo({ url: '/pages/mall/consumer/orders' })\r\n }, 1500)\r\n }\r\n } else {\r\n const errMsg = (result.error != null && result.error !== '') ? result.error : '创建订单失败'\r\n console.error('[submitOrder] 订单创建失败:', errMsg)\r\n uni.showToast({ title: errMsg, icon: 'none' })\r\n }\r\n\r\n } catch (err: any) {\r\n uni.hideLoading()\r\n console.error('[submitOrder] 提交订单错误:', err)\r\n const errMsg = (err.message != null && err.message !== '') ? (err.message as string) : '提交订单失败'\r\n uni.showToast({ title: errMsg, icon: 'none' })\r\n }\r\n}\r\n\r\n// 生成订单号\r\nconst generateOrderNo = (): string => {\r\n\tconst date = new Date()\r\n // ...\r\n\tconst random = Math.random().toString().slice(2, 8)\r\n\treturn `ORD${Date.now()}${random}`\r\n}\r\n\r\n// 返回\r\nconst goBack = () => {\r\n\tuni.navigateBack()\r\n}\r\n\r\n// 选择地址\r\nconst selectAddress = () => {\r\n\tshowAddressPopup.value = true;\r\n}\r\n\r\n// 添加登录跳转方法\r\nconst goToLogin = () => {\r\n uni.navigateTo({\r\n url: '/pages/login/login' // 根据实际登录页面路径调整\r\n })\r\n}\r\n</script>\r\n\r\n<style scoped>\r\n.checkout-page {\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\tposition: absolute;\r\n\ttop: 0;\r\n\tleft: 0;\r\n\tright: 0;\r\n\tbottom: 0;\r\n\tbackground-color: #f8f8f8;\r\n\toverflow: hidden;\r\n\talign-items: center; /* PC端居中显示 */\r\n}\r\n/* 顶部栏 */\r\n.checkout-header {\r\n\tbackground-color: #ffffff;\r\n\tpadding: 15px;\r\n\tborder-bottom: 1px solid #f0f0f0;\r\n\tflex-shrink: 0;\r\n\twidth: 100%;\r\n}\r\n\r\n.header-title {\r\n\tfont-size: 18px;\r\n\tfont-weight: bold;\r\n\tcolor: #333333;\r\n text-align: center;\r\n}\r\n\r\n.checkout-content {\r\n\tflex: 1;\r\n\twidth: 100%;\r\n\tmax-width: 800px; /* 限制PC端内容宽度 */\r\n\tmin-height: 0;\r\n\tbackground-color: #f8f8f8;\r\n}\r\n\r\n/* 卡片容器 */\r\n.no-products { \r\n\tdisplay: flex; \r\n\tflex-direction: column;\r\n\talign-items: center; \r\n\tjustify-content: center; \r\n\tpadding: 30px 0;\r\n}\r\n.no-products-text { font-size: 14px; color: #999999; }\r\n\r\n.section-card {\r\n background-color: #ffffff;\r\n margin: 12px;\r\n padding: 18px;\r\n border-radius: 12px;\r\n box-shadow: 0 2px 8px rgba(0,0,0,0.02);\r\n}\r\n\r\n/* 自适应适配 */\r\n@media screen and (min-width: 768px) {\r\n .section-card {\r\n margin: 16px 0;\r\n }\r\n .delivery-options-grid {\r\n display: flex;\r\n flex-direction: row !important;\r\n flex-wrap: wrap;\r\n gap: 12px;\r\n }\r\n .delivery-card {\r\n flex: 1;\r\n min-width: 280px;\r\n margin-bottom: 0 !important;\r\n }\r\n /* 底部结算栏在大屏居中并限宽 */\r\n .footer-action-bar {\r\n max-width: 800px;\r\n left: 50% !important;\r\n right: auto !important;\r\n transform: translateX(-50%);\r\n border-radius: 16px 16px 0 0;\r\n box-shadow: 0 -4px 16px rgba(0,0,0,0.05);\r\n }\r\n}\r\n\r\n.address-section {\r\n\tmargin-top: 12px;\r\n\tdisplay: flex;\r\n\tflex-direction: row;\r\n\talign-items: center;\r\n\tpadding: 16px;\r\n\tposition: relative;\r\n\tbackground-color: #ffffff;\r\n}\r\n\r\n.address-icon-wrapper {\r\n\tmargin-right: 12px;\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n}\r\n\r\n.location-icon {\r\n\tfont-size: 24px;\r\n\tcolor: #ff5000;\r\n}\r\n\r\n.address-info { \r\n\tflex: 1; \r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n}\r\n\r\n.address-header { \r\n\tdisplay: flex; \r\n\tflex-direction: row;\r\n\talign-items: center; \r\n\tmargin-bottom: 4px; \r\n}\r\n\r\n.recipient { font-size: 17px; font-weight: bold; color: #333333; margin-right: 12px; }\r\n.phone { font-size: 14px; color: #666666; margin-right: 8px; }\r\n.default-tag { background-color: #fff0eb; border: 0.5px solid #ff5000; padding: 0 6px; border-radius: 4px; }\r\n.tag-text { color: #ff5000; font-size: 11px; }\r\n\r\n.address-detail { \r\n\tfont-size: 13px; \r\n\tcolor: #666; \r\n\tline-height: 1.5; \r\n\tlines: 2;\r\n\ttext-overflow: ellipsis;\r\n\toverflow: hidden;\r\n}\r\n\r\n.address-arrow-wrapper {\r\n\tmargin-left: 8px;\r\n}\r\n\r\n.address-arrow { \r\n\tcolor: #ccc; \r\n\tfont-size: 20px; \r\n}\r\n\r\n.no-address { flex: 1; display: flex; align-items: center; }\r\n.no-address-text { font-size: 16px; color: #999999; }\r\n\r\n.products-section { padding: 0; }\r\n.debug-info { padding: 10px 15px; border-bottom: 1px solid #f5f5f5; margin-bottom: 10px; }\r\n.debug-text { font-size: 12px; color: #999; text-align: center; }\r\n.shop-group { background-color: #fff; padding: 0; }\r\n.shop-header { display: flex; flex-direction: row; align-items: center; padding: 5px 0 12px; }\r\n.shop-icon { font-size: 17px; margin-right: 6px; }\r\n.shop-name { font-size: 15px; font-weight: bold; color: #333; }\r\n.shop-subtotal { display: flex; justify-content: flex-end; align-items: center; padding: 12px 0 5px; margin-top: 5px; border-top: 1px dashed #f0f0f0; }\r\n.subtotal-label { color: #888; margin-right: 8px; font-size: 13px; }\r\n.subtotal-value { color: #666; font-size: 13px; }\r\n.subtotal-text { color: #333; margin-right: 5px; font-size: 14px; }\r\n.subtotal-price { color: #ff5000; font-weight: bold; font-size: 16px; }\r\n\r\n.product-item { display: flex; flex-direction: row; padding: 12px 0; }\r\n.product-image { width: 85px; height: 85px; border-radius: 8px; margin-right: 12px; background-color: #f8f8f8; }\r\n.product-info { flex: 1; display: flex; flex-direction: column; justify-content: space-between; }\r\n.product-name-row { display: flex; flex-direction: row; justify-content: space-between; align-items: flex-start; }\r\n.product-name { flex: 1; font-size: 14px; color: #333333; line-height: 1.4; lines: 2; text-overflow: ellipsis; overflow: hidden; margin-right: 12px; }\r\n.product-price { font-size: 15px; color: #333; font-weight: normal; }\r\n.product-spec-row { display: flex; flex-direction: row; justify-content: space-between; align-items: center; margin-bottom: 4px; }\r\n.product-spec { font-size: 12px; color: #999999; background-color: #f7f7f7; padding: 2px 6px; border-radius: 4px; }\r\n.product-quantity { font-size: 12px; color: #999999; }\r\n\r\n/* 配送方式重构 */\r\n.delivery-row {\r\n display: flex;\r\n flex-direction: row;\r\n justify-content: space-between;\r\n align-items: center;\r\n}\r\n\r\n.delivery-selector {\r\n display: flex;\r\n flex-direction: row;\r\n gap: 8px;\r\n}\r\n\r\n.delivery-pill {\r\n padding: 4px 12px;\r\n background-color: #f5f5f5;\r\n border-radius: 16px;\r\n border: 1px solid transparent;\r\n}\r\n\r\n.delivery-pill.selected {\r\n background-color: #fff9f6;\r\n border-color: #ff5000;\r\n}\r\n\r\n.pill-name {\r\n font-size: 12px;\r\n color: #666;\r\n}\r\n\r\n.delivery-pill.selected .pill-name {\r\n color: #ff5000;\r\n}\r\n\r\n.delivery-detail {\r\n margin-top: 10px;\r\n display: flex;\r\n flex-direction: row;\r\n justify-content: space-between;\r\n padding-top: 8px;\r\n border-top: 0.5px solid #f9f9f9;\r\n}\r\n\r\n.detail-desc {\r\n font-size: 11px;\r\n color: #999;\r\n}\r\n\r\n.detail-price {\r\n font-size: 11px;\r\n color: #ff5000;\r\n}\r\n\r\n/* 优惠券重构 */\r\n.coupon-row {\r\n display: flex;\r\n flex-direction: row;\r\n justify-content: space-between;\r\n align-items: center;\r\n}\r\n\r\n.coupon-right-content {\r\n display: flex;\r\n flex-direction: row;\r\n align-items: center;\r\n}\r\n\r\n/* 留言重构 */\r\n.remark-row {\r\n display: flex;\r\n flex-direction: row;\r\n align-items: center;\r\n}\r\n\r\n.remark-input-compact {\r\n flex: 1;\r\n margin-left: 15px;\r\n font-size: 14px;\r\n color: #333;\r\n height: 30px;\r\n}\r\n\r\n/* 价格明细横向排列 */\r\n.price-grid {\r\n display: flex;\r\n flex-direction: row;\r\n justify-content: space-between;\r\n}\r\n\r\n.price-item-inline {\r\n display: flex;\r\n flex-direction: row;\r\n align-items: baseline;\r\n}\r\n\r\n.price-item-label {\r\n font-size: 12px;\r\n color: #999;\r\n margin-right: 4px;\r\n}\r\n\r\n.price-item-value {\r\n font-size: 14px;\r\n color: #333;\r\n font-weight: 500;\r\n}\r\n\r\n.item-subtotal-row {\r\n\tdisplay: flex;\r\n\tflex-direction: row;\r\n\tjustify-content: flex-end;\r\n\talign-items: center;\r\n\tmargin-top: 4px;\r\n}\r\n.item-subtotal-label {\r\n\tfont-size: 12px;\r\n\tcolor: #999;\r\n\tmargin-right: 4px;\r\n}\r\n.item-subtotal-price {\r\n\tfont-size: 14px;\r\n\tcolor: #ff5000;\r\n\tfont-weight: bold;\r\n}\r\n\r\n/* 配送方式网格 */\r\n.delivery-options-grid {\r\n display: flex;\r\n flex-direction: column;\r\n}\r\n\r\n.delivery-card {\r\n display: flex;\r\n flex-direction: row;\r\n justify-content: space-between;\r\n align-items: center;\r\n padding: 15px;\r\n border: 1px solid #f0f0f0;\r\n border-radius: 10px;\r\n margin-bottom: 10px;\r\n background-color: #fafafa;\r\n}\r\n\r\n.delivery-card.selected {\r\n border-color: #ff5000;\r\n background-color: #fff9f6;\r\n}\r\n\r\n.option-main {\r\n flex: 1;\r\n}\r\n\r\n.option-name {\r\n font-size: 15px;\r\n color: #333;\r\n font-weight: 500;\r\n margin-bottom: 4px;\r\n display: block;\r\n}\r\n\r\n.option-desc {\r\n font-size: 12px;\r\n color: #999;\r\n display: block;\r\n}\r\n\r\n.option-side {\r\n display: flex;\r\n align-items: center;\r\n}\r\n\r\n.option-price {\r\n font-size: 14px;\r\n color: #333;\r\n margin-right: 10px;\r\n}\r\n\r\n.select-icon {\r\n width: 18px;\r\n height: 18px;\r\n background-color: #ff5000;\r\n border-radius: 50%;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n}\r\n\r\n.check-mark {\r\n color: #ffffff;\r\n font-size: 12px;\r\n margin-top: -1px;\r\n}\r\n\r\n/* 优惠券样式重构 */\r\n.coupon-content {\r\n display: flex;\r\n flex-direction: row;\r\n justify-content: space-between;\r\n align-items: center;\r\n}\r\n\r\n.coupon-left {\r\n display: flex;\r\n align-items: center;\r\n}\r\n\r\n.coupon-tag {\r\n background-color: #ff5000;\r\n color: #fff;\r\n font-size: 10px;\r\n padding: 1px 4px;\r\n border-radius: 2px;\r\n margin-left: 8px;\r\n}\r\n\r\n.coupon-right {\r\n display: flex;\r\n align-items: center;\r\n}\r\n\r\n.coupon-selected-name {\r\n font-size: 14px;\r\n color: #ff5000;\r\n}\r\n\r\n.coupon-placeholder {\r\n font-size: 14px;\r\n color: #999;\r\n}\r\n\r\n.arrow-icon {\r\n font-size: 18px;\r\n color: #ccc;\r\n margin-left: 5px;\r\n}\r\n\r\n/* 留言输入 */\r\n.remark-input-new {\r\n width: 100%;\r\n background-color: #f9f9f9;\r\n border-radius: 8px;\r\n padding: 12px;\r\n font-size: 14px;\r\n min-height: 48px;\r\n}\r\n\r\n/* 价格明细列表 */\r\n.price-list {\r\n margin-top: 5px;\r\n}\r\n\r\n.price-item {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n padding: 6px 0;\r\n}\r\n\r\n.price-item-label {\r\n font-size: 14px;\r\n color: #666;\r\n}\r\n\r\n.price-item-value {\r\n font-size: 14px;\r\n color: #333;\r\n}\r\n\r\n.discount-text {\r\n color: #ff5000;\r\n}\r\n\r\n.section-title { font-size: 15px; font-weight: bold; color: #333333; }\r\n\r\n/* 底部操作栏 */\r\n.footer-action-bar {\r\n position: fixed;\r\n bottom: 0;\r\n left: 0;\r\n right: 0;\r\n height: 60px;\r\n background-color: #ffffff;\r\n display: flex;\r\n flex-direction: row;\r\n align-items: center;\r\n justify-content: space-between;\r\n padding: 0 16px;\r\n padding-bottom: constant(safe-area-inset-bottom);\r\n padding-bottom: env(safe-area-inset-bottom);\r\n border-top: 1px solid #f0f0f0;\r\n z-index: 100;\r\n}\r\n\r\n.footer-left {\r\n display: flex;\r\n flex-direction: row;\r\n align-items: baseline;\r\n}\r\n\r\n.footer-total-label {\r\n font-size: 14px;\r\n color: #333;\r\n margin-right: 4px;\r\n}\r\n\r\n.footer-currency {\r\n font-size: 14px;\r\n color: #ff5000;\r\n font-weight: bold;\r\n}\r\n\r\n.footer-price {\r\n font-size: 22px;\r\n color: #ff5000;\r\n font-weight: bold;\r\n}\r\n\r\n.footer-submit-btn {\r\n background-color: #ff5000;\r\n color: #ffffff;\r\n padding: 0 28px;\r\n height: 42px;\r\n line-height: 42px;\r\n border-radius: 21px;\r\n font-size: 16px;\r\n font-weight: bold;\r\n border: none;\r\n margin: 0;\r\n}\r\n\r\n.safe-area-bottom {\r\n height: 100px; /* 留出底部操作栏和安全区的空间 */\r\n width: 100%;\r\n}\r\n\r\n/* 弹窗样式 */\r\n.address-popup-mask, .address-form-mask, .confirm-popup-mask { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background-color: rgba(0, 0, 0, 0.5); z-index: 9998; }\r\n.address-popup-mask { display: flex; align-items: flex-end; justify-content: center; }\r\n.address-form-mask, .confirm-popup-mask { display: flex; align-items: center; justify-content: center; z-index: 10000; }\r\n.address-popup { \r\n background-color: #ffffff; \r\n width: 100%; \r\n height: 450px;\r\n border-radius: 20px 20px 0 0; \r\n display: flex; \r\n flex-direction: column; \r\n position: relative;\r\n z-index: 9999;\r\n}\r\n.address-form-popup { \r\n background-color: #f8f8f8; \r\n width: 92%; \r\n max-width: 500px; \r\n height: 600px;\r\n border-radius: 16px; \r\n display: flex; \r\n flex-direction: column; \r\n overflow: hidden;\r\n position: relative;\r\n z-index: 10001;\r\n}\r\n\r\n.popup-header { \r\n padding: 16px; \r\n border-bottom: 0.5px solid #eee; \r\n display: flex; \r\n flex-direction: row;\r\n align-items: center; \r\n justify-content: center; \r\n flex-shrink: 0; \r\n position: relative;\r\n}\r\n\r\n.popup-title { font-size: 17px; font-weight: bold; color: #333333; }\r\n.popup-close { position: absolute; right: 16px; font-size: 20px; color: #999999; padding: 4px; }\r\n\r\n.address-list-container {\r\n flex: 1;\r\n width: 100%;\r\n padding: 12px;\r\n box-sizing: border-box;\r\n}\r\n\r\n.popup-address-item { \r\n padding: 16px; \r\n margin-bottom: 12px; \r\n background-color: #fff;\r\n border: 1px solid #f0f0f0; \r\n border-radius: 12px; \r\n position: relative; \r\n}\r\n\r\n.popup-address-header { \r\n display: flex; \r\n flex-direction: row;\r\n align-items: center; \r\n margin-bottom: 8px; \r\n}\r\n\r\n.popup-address-name { font-size: 15px; font-weight: bold; color: #333333; margin-right: 12px; }\r\n.popup-address-phone { font-size: 14px; color: #666666; margin-right: 8px; }\r\n.popup-default-tag { background-color: #fff0eb; padding: 1px 6px; border-radius: 4px; }\r\n.popup-tag-text { color: #ff5000; font-size: 10px; }\r\n.popup-address-detail { font-size: 13px; color: #666; line-height: 1.4; }\r\n\r\n.popup-selected-indicator {\r\n position: absolute;\r\n right: 16px;\r\n top: 50%;\r\n transform: translateY(-50%);\r\n color: #ff5000;\r\n font-weight: bold;\r\n font-size: 18px;\r\n}\r\n\r\n.popup-empty-address { display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 60px 20px; }\r\n.popup-empty-icon { font-size: 48px; margin-bottom: 12px; opacity: 0.3; }\r\n.popup-empty-text { font-size: 14px; color: #999; }\r\n\r\n.popup-add-address-btn { \r\n background-color: #ff5000; \r\n margin: 12px 16px 30px; \r\n height: 44px;\r\n border-radius: 22px; \r\n display: flex; \r\n flex-direction: row;\r\n align-items: center; \r\n justify-content: center; \r\n flex-shrink: 0; \r\n}\r\n\r\n.popup-btn-icon { color: #ffffff; font-size: 20px; margin-right: 6px; font-weight: normal; }\r\n.popup-btn-text { color: #ffffff; font-size: 15px; font-weight: bold; }\r\n\r\n.address-form-popup { \r\n background-color: #f8f8f8; \r\n width: 92%; \r\n max-width: 500px; \r\n height: 600px; /* 改用具体的像素高度Android 端的 scroll-view 计算更稳健 */\r\n border-radius: 16px; \r\n display: flex; \r\n flex-direction: column; \r\n overflow: hidden;\r\n position: relative;\r\n z-index: 10001;\r\n}\r\n\r\n.form-header { \r\n padding: 16px; \r\n background-color: #ffffff;\r\n display: flex; \r\n flex-direction: row;\r\n align-items: center; \r\n justify-content: center; \r\n position: relative;\r\n border-bottom: 0.5px solid #eee;\r\n flex-shrink: 0;\r\n}\r\n\r\n.form-title { font-size: 17px; font-weight: bold; color: #333333; }\r\n.form-close-btn { position: absolute; right: 12px; width: 28px; height: 28px; display: flex; align-items: center; justify-content: center; }\r\n.form-close-icon { font-size: 18px; color: #999; }\r\n\r\n.form-content { \r\n flex: 1; \r\n width: 100%;\r\n /* 在 Android 下scroll-view 如果不给明确的高度且处于 flex 容器,必须通过 flex-grow 撑开 */\r\n flex-grow: 1;\r\n flex-shrink: 1;\r\n background-color: #ffffff;\r\n padding: 12px;\r\n}\r\n\r\n.form-section {\r\n background-color: #ffffff;\r\n border-radius: 12px;\r\n padding: 0 12px;\r\n margin-bottom: 12px;\r\n}\r\n\r\n.form-item { \r\n padding: 16px 0;\r\n border-bottom: 0.5px solid #f5f5f5;\r\n}\r\n\r\n.form-item:last-child {\r\n border-bottom: none;\r\n}\r\n\r\n.form-label { \r\n font-size: 14px; \r\n color: #333; \r\n margin-bottom: 10px; \r\n display: flex;\r\n}\r\n\r\n.label-row {\r\n display: flex;\r\n flex-direction: row;\r\n justify-content: space-between;\r\n align-items: center;\r\n margin-bottom: 10px;\r\n}\r\n\r\n.smart-tag {\r\n font-size: 11px;\r\n color: #ff5000;\r\n background-color: #fff0eb;\r\n padding: 2px 6px;\r\n border-radius: 4px;\r\n}\r\n\r\n.form-input { \r\n width: 100%; \r\n height: 32px;\r\n font-size: 15px; \r\n color: #333; \r\n}\r\n\r\n.form-input-readonly { color: #888; }\r\n\r\n.region-inputs { \r\n display: flex; \r\n flex-direction: row;\r\n justify-content: space-between; \r\n}\r\n\r\n.region-input { flex: 1; text-align: center; }\r\n\r\n.form-textarea { \r\n width: 100%; \r\n background-color: #f9f9f9;\r\n border-radius: 8px;\r\n padding: 10px; \r\n font-size: 14px; \r\n color: #333; \r\n box-sizing: border-box; \r\n}\r\n\r\n.smart-address-input { height: 80px; }\r\n.detail-textarea { height: 60px; }\r\n\r\n.checkbox-item { \r\n background-color: #ffffff;\r\n border-radius: 12px;\r\n padding: 16px;\r\n}\r\n\r\n.checkbox-wrapper { display: flex; flex-direction: row; align-items: center; }\r\n.checkbox { width: 18px; height: 18px; border: 1.5px solid #ddd; border-radius: 9px; margin-right: 10px; display: flex; align-items: center; justify-content: center; }\r\n.checkbox.checked { background-color: #ff5000; border-color: #ff5000; }\r\n.checkbox-check { color: #ffffff; font-size: 12px; }\r\n.checkbox-label { font-size: 14px; color: #333; }\r\n\r\n.form-buttons { \r\n padding: 12px 16px 30px; \r\n background-color: #ffffff;\r\n flex-shrink: 0;\r\n}\r\n\r\n.form-submit-btn { \r\n width: 100%;\r\n background-color: #ff5000; \r\n color: #ffffff; \r\n height: 44px;\r\n line-height: 44px;\r\n border-radius: 22px; \r\n font-size: 16px; \r\n font-weight: bold; \r\n border: none; \r\n}\r\n\r\n/* 确认保存弹窗 */\r\n.confirm-popup-mask { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background-color: rgba(0, 0, 0, 0.5); z-index: 9998; display: flex; align-items: center; justify-content: center; }\r\n.confirm-popup { background-color: #ffffff; width: 80%; max-width: 320px; border-radius: 12px; overflow: hidden; }\r\n\r\n.confirm-header { padding: 24px 0 12px; text-align: center; }\r\n.confirm-title { font-size: 17px; font-weight: bold; color: #333; }\r\n.confirm-content { padding: 0 24px 24px; text-align: center; }\r\n.confirm-message { font-size: 14px; color: #666; line-height: 1.5; }\r\n.confirm-buttons { display: flex; flex-direction: row; border-top: 0.5px solid #eee; }\r\n.confirm-btn { flex: 1; height: 48px; line-height: 48px; text-align: center; font-size: 16px; background-color: #ffffff; border: none; border-radius: 0; }\r\n.confirm-btn.cancel { color: #666; border-right: 0.5px solid #eee; }\r\n.confirm-btn.confirm { color: #ff5000; font-weight: bold; }\r\n</style>\r\n",null,null,null,null,null,null,null,null],"names":[],"mappings":"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"}