Browse Source

Merge branch 'redesign‌-260706' of git.huaml.com:zhh/front-end into redesign‌-260706

shizhongqi 6 days ago
parent
commit
2143a82151
39 changed files with 1283 additions and 673 deletions
  1. 2 2
      ghs/dist/shop/index.html
  2. 0 0
      ghs/dist/shop/js/app.9f5fa3e6.js
  3. 2 2
      hd/dist/shop/index.html
  4. 0 0
      hd/dist/shop/js/app.6156a144.js
  5. 10 2
      hdApp/src/admin/ghs/balanceChange.vue
  6. 74 18
      hdApp/src/admin/ghs/pay.vue
  7. 1 1
      hdApp/src/admin/home/components/purchase-ghs-panel.vue
  8. 502 0
      hdh5/admin/ghs/balanceChange.vue
  9. 642 619
      hdh5/admin/ghs/pay.vue
  10. 10 1
      hdh5/api/ghs/index.js
  11. 11 0
      hdh5/pages.json
  12. 0 0
      hdh5/unpackage/dist/build/web/assets/_plugin-vue_export-helper.6vb9oaJO.js
  13. 0 0
      hdh5/unpackage/dist/build/web/assets/_plugin-vue_export-helper.H6AekIpX.js
  14. 1 1
      hdh5/unpackage/dist/build/web/assets/admin-cg-alipay.CxZsNMyg.js
  15. 1 1
      hdh5/unpackage/dist/build/web/assets/admin-clear-alipay.9HtuqQJ6.js
  16. 0 0
      hdh5/unpackage/dist/build/web/assets/admin-ghs-balanceChange.EHeynR2t.js
  17. 0 0
      hdh5/unpackage/dist/build/web/assets/admin-ghs-pay.CmRIWzbh.js
  18. 0 0
      hdh5/unpackage/dist/build/web/assets/admin-ghs-pay.IflcH4VK.js
  19. 0 0
      hdh5/unpackage/dist/build/web/assets/balanceChange-AtjNIdyy.css
  20. 12 0
      hdh5/unpackage/dist/build/web/assets/index-BBAix273.js
  21. 0 0
      hdh5/unpackage/dist/build/web/assets/index-BvquTqJD.css
  22. 0 12
      hdh5/unpackage/dist/build/web/assets/index-CS1sLqOC.js
  23. 0 0
      hdh5/unpackage/dist/build/web/assets/index-Dzn8UyOo.css
  24. 1 1
      hdh5/unpackage/dist/build/web/assets/index.DNfuzBGq.js
  25. 1 0
      hdh5/unpackage/dist/build/web/assets/index.DPtqXnrX.js
  26. 0 0
      hdh5/unpackage/dist/build/web/assets/pagesPurchase-gathering.BHZnxdvl.js
  27. 0 0
      hdh5/unpackage/dist/build/web/assets/pagesPurchase-gathering.urUf1h8Y.js
  28. 0 0
      hdh5/unpackage/dist/build/web/assets/pay-DxAIVytI.css
  29. 0 0
      hdh5/unpackage/dist/build/web/assets/pay-mBXFKWse.css
  30. 2 2
      hdh5/unpackage/dist/build/web/index.html
  31. 3 3
      hdh5/unpackage/dist/cache/.vite/deps/_metadata.json
  32. 1 1
      mallh5/unpackage/dist/build/web/assets/index-B5rO03ky.js
  33. 1 1
      mallh5/unpackage/dist/build/web/assets/pages-pay-demo.TyNY5I7J.js
  34. 0 0
      mallh5/unpackage/dist/build/web/assets/pages-pay-index.CMOAWAzv.js
  35. 0 0
      mallh5/unpackage/dist/build/web/assets/pages-pay-success.JGl4tffq.js
  36. 1 1
      mallh5/unpackage/dist/build/web/index.html
  37. 3 3
      mallh5/unpackage/dist/cache/.vite/deps/_metadata.json
  38. 2 2
      pt/dist/web/index.html
  39. 0 0
      pt/dist/web/js/app.fa534e4a.js

+ 2 - 2
ghs/dist/shop/index.html

@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="referer" content="never"><meta name="renderer" content="webkit"><meta name="viewport" content><link rel="icon" href="/favicon.ico"><link rel="stylesheet" type="text/css" media="print" href="/print-lock.css"><title>销花宝</title><link href="https://img.wixhb.com/cdn/nprogress/0.2.0/nprogress.min.css" rel="stylesheet"><link href="https://img.wixhb.com/cdn/quill/2.0.0-dev.3/quill.core.min.css" rel="stylesheet"><link href="https://img.wixhb.com/cdn/viewerjs/1.3.7/viewer.min.css" rel="stylesheet"><link href="https://img.wixhb.com/cdn/element-ui/2.13.0/theme-chalk/index.css" rel="stylesheet"><style>html,
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="referer" content="never"><meta name="renderer" content="webkit"><meta name="viewport" content><link rel="icon" href="/favicon.ico"><link rel="stylesheet" type="text/css" media="print" href="/print-lock.css"><title>销花宝</title><link href="https://img.hzghd.com/cdn/nprogress/0.2.0/nprogress.min.css" rel="stylesheet"><link href="https://img.hzghd.com/cdn/quill/2.0.0-dev.3/quill.core.min.css" rel="stylesheet"><link href="https://img.hzghd.com/cdn/viewerjs/1.3.7/viewer.min.css" rel="stylesheet"><link href="https://img.hzghd.com/cdn/element-ui/2.13.0/theme-chalk/index.css" rel="stylesheet"><style>html,
 			body,
 			#app {
 				height: 100%;
@@ -43,4 +43,4 @@
 			.once .sub-title {
 				color: #ababab;
 				font-size: 12px;
-			}</style><link href="/css/app.03cfa881.css" rel="preload" as="style"><link href="/css/chunk-libs.ce660555.css" rel="preload" as="style"><link href="/js/app.9c3dba4c.js" rel="preload" as="script"><link href="/js/chunk-libs.344d2dbf.js" rel="preload" as="script"><link href="/css/chunk-libs.ce660555.css" rel="stylesheet"><link href="/css/app.03cfa881.css" rel="stylesheet"></head><body><noscript></noscript><div id="app"><div class="once"><div class="container"><div class="title">正在加载资源</div><div class="sub-title">初次加载资源可能需要较多时间 请耐心等待</div></div><div class="footer"><a href="https://www.baidu.com/" target="_blank">花卉宝</a></div></div></div><script src="https://img.wixhb.com/cdn/vue/2.6.10/vue.min.js"></script><script src="https://img.wixhb.com/cdn/vue-router/3.1.3/vue-router.min.js"></script><script src="https://img.wixhb.com/cdn/vuex/3.1.1/vuex.min.js"></script><script src="https://img.wixhb.com/cdn/clipboard.js/2.0.4/clipboard.min.js"></script><script src="https://img.wixhb.com/cdn/axios/0.19.0-beta.1/axios.min.js"></script><script src="https://img.wixhb.com/cdn/nprogress/0.2.0/nprogress.min.js"></script><script src="https://img.wixhb.com/cdn/Mock.js/1.0.1-beta3/mock-min.js"></script><script src="https://img.wixhb.com/cdn/quill/2.0.0-dev.3/quill.min.js"></script><script src="https://img.wixhb.com/cdn/element-ui/2.13.0/index.js"></script><script src="https://img.wixhb.com/cdn/viewerjs/1.3.7/viewer.min.js"></script><script src="https://img.wixhb.com/cdn/echarts/4.4.0-rc.1/echarts.min.js"></script><script src="https://img.wixhb.com/cdn/npm/vue-echarts@4.0.2.js"></script><script src="/js/chunk-libs.344d2dbf.js"></script><script src="/js/app.9c3dba4c.js"></script></body></html>
+			}</style><link href="/css/app.03cfa881.css" rel="preload" as="style"><link href="/css/chunk-libs.ce660555.css" rel="preload" as="style"><link href="/js/app.9f5fa3e6.js" rel="preload" as="script"><link href="/js/chunk-libs.344d2dbf.js" rel="preload" as="script"><link href="/css/chunk-libs.ce660555.css" rel="stylesheet"><link href="/css/app.03cfa881.css" rel="stylesheet"></head><body><noscript></noscript><div id="app"><div class="once"><div class="container"><div class="title">正在加载资源</div><div class="sub-title">初次加载资源可能需要较多时间 请耐心等待</div></div><div class="footer"><a href="https://www.baidu.com/" target="_blank">花卉宝</a></div></div></div><script src="https://img.hzghd.com/cdn/vue/2.6.10/vue.min.js"></script><script src="https://img.hzghd.com/cdn/vue-router/3.1.3/vue-router.min.js"></script><script src="https://img.hzghd.com/cdn/vuex/3.1.1/vuex.min.js"></script><script src="https://img.hzghd.com/cdn/clipboard.js/2.0.4/clipboard.min.js"></script><script src="https://img.hzghd.com/cdn/axios/0.19.0-beta.1/axios.min.js"></script><script src="https://img.hzghd.com/cdn/nprogress/0.2.0/nprogress.min.js"></script><script src="https://img.hzghd.com/cdn/Mock.js/1.0.1-beta3/mock-min.js"></script><script src="https://img.hzghd.com/cdn/quill/2.0.0-dev.3/quill.min.js"></script><script src="https://img.hzghd.com/cdn/element-ui/2.13.0/index.js"></script><script src="https://img.hzghd.com/cdn/viewerjs/1.3.7/viewer.min.js"></script><script src="https://img.hzghd.com/cdn/echarts/4.4.0-rc.1/echarts.min.js"></script><script src="https://img.hzghd.com/cdn/npm/vue-echarts@4.0.2.js"></script><script src="/js/chunk-libs.344d2dbf.js"></script><script src="/js/app.9f5fa3e6.js"></script></body></html>

File diff suppressed because it is too large
+ 0 - 0
ghs/dist/shop/js/app.9f5fa3e6.js


+ 2 - 2
hd/dist/shop/index.html

@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="referer" content="never"><meta name="renderer" content="webkit"><meta name="viewport" content><link rel="icon" href="/favicon.ico"><link rel="stylesheet" type="text/css" media="print" href="/print-lock.css"><title>只管花</title><link href="https://img.huahb.cn/cdn/nprogress/0.2.0/nprogress.min.css" rel="stylesheet"><link href="https://img.huahb.cn/cdn/quill/2.0.0-dev.3/quill.core.min.css" rel="stylesheet"><link href="https://img.huahb.cn/cdn/viewerjs/1.3.7/viewer.min.css" rel="stylesheet"><link href="https://img.huahb.cn/cdn/element-ui/2.13.0/theme-chalk/index.css" rel="stylesheet"><style>html,
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="referer" content="never"><meta name="renderer" content="webkit"><meta name="viewport" content><link rel="icon" href="/favicon.ico"><link rel="stylesheet" type="text/css" media="print" href="/print-lock.css"><title>只管花</title><link href="https://img.huaml.com/cdn/nprogress/0.2.0/nprogress.min.css" rel="stylesheet"><link href="https://img.huaml.com/cdn/quill/2.0.0-dev.3/quill.core.min.css" rel="stylesheet"><link href="https://img.huaml.com/cdn/viewerjs/1.3.7/viewer.min.css" rel="stylesheet"><link href="https://img.huaml.com/cdn/element-ui/2.13.0/theme-chalk/index.css" rel="stylesheet"><style>html,
 			body,
 			#app {
 				height: 100%;
@@ -43,4 +43,4 @@
 			.once .sub-title {
 				color: #ababab;
 				font-size: 12px;
-			}</style><link href="/css/app.97b5310c.css" rel="preload" as="style"><link href="/css/chunk-libs.b57e4bfb.css" rel="preload" as="style"><link href="/js/app.bf88ca96.js" rel="preload" as="script"><link href="/js/chunk-libs.7289eda9.js" rel="preload" as="script"><link href="/css/chunk-libs.b57e4bfb.css" rel="stylesheet"><link href="/css/app.97b5310c.css" rel="stylesheet"></head><body><noscript></noscript><div id="app"><div class="once"><div class="container"><div class="title">正在加载资源</div><div class="sub-title">初次加载资源可能需要较多时间 请耐心等待</div></div><div class="footer"><a href="https://www.baidu.com/" target="_blank">花卉宝</a></div></div></div><script src="https://img.huahb.cn/cdn/vue/2.6.10/vue.min.js"></script><script src="https://img.huahb.cn/cdn/vue-router/3.1.3/vue-router.min.js"></script><script src="https://img.huahb.cn/cdn/vuex/3.1.1/vuex.min.js"></script><script src="https://img.huahb.cn/cdn/clipboard.js/2.0.4/clipboard.min.js"></script><script src="https://img.huahb.cn/cdn/axios/0.19.0-beta.1/axios.min.js"></script><script src="https://img.huahb.cn/cdn/nprogress/0.2.0/nprogress.min.js"></script><script src="https://img.huahb.cn/cdn/Mock.js/1.0.1-beta3/mock-min.js"></script><script src="https://img.huahb.cn/cdn/quill/2.0.0-dev.3/quill.min.js"></script><script src="https://img.huahb.cn/cdn/element-ui/2.13.0/index.js"></script><script src="https://img.huahb.cn/cdn/viewerjs/1.3.7/viewer.min.js"></script><script src="https://img.huahb.cn/cdn/echarts/4.4.0-rc.1/echarts.min.js"></script><script src="https://img.huahb.cn/cdn/npm/vue-echarts@4.0.2.js"></script><script src="/js/chunk-libs.7289eda9.js"></script><script src="/js/app.bf88ca96.js"></script></body></html>
+			}</style><link href="/css/app.97b5310c.css" rel="preload" as="style"><link href="/css/chunk-libs.b57e4bfb.css" rel="preload" as="style"><link href="/js/app.6156a144.js" rel="preload" as="script"><link href="/js/chunk-libs.7289eda9.js" rel="preload" as="script"><link href="/css/chunk-libs.b57e4bfb.css" rel="stylesheet"><link href="/css/app.97b5310c.css" rel="stylesheet"></head><body><noscript></noscript><div id="app"><div class="once"><div class="container"><div class="title">正在加载资源</div><div class="sub-title">初次加载资源可能需要较多时间 请耐心等待</div></div><div class="footer"><a href="https://www.baidu.com/" target="_blank">花卉宝</a></div></div></div><script src="https://img.huaml.com/cdn/vue/2.6.10/vue.min.js"></script><script src="https://img.huaml.com/cdn/vue-router/3.1.3/vue-router.min.js"></script><script src="https://img.huaml.com/cdn/vuex/3.1.1/vuex.min.js"></script><script src="https://img.huaml.com/cdn/clipboard.js/2.0.4/clipboard.min.js"></script><script src="https://img.huaml.com/cdn/axios/0.19.0-beta.1/axios.min.js"></script><script src="https://img.huaml.com/cdn/nprogress/0.2.0/nprogress.min.js"></script><script src="https://img.huaml.com/cdn/Mock.js/1.0.1-beta3/mock-min.js"></script><script src="https://img.huaml.com/cdn/quill/2.0.0-dev.3/quill.min.js"></script><script src="https://img.huaml.com/cdn/element-ui/2.13.0/index.js"></script><script src="https://img.huaml.com/cdn/viewerjs/1.3.7/viewer.min.js"></script><script src="https://img.huaml.com/cdn/echarts/4.4.0-rc.1/echarts.min.js"></script><script src="https://img.huaml.com/cdn/npm/vue-echarts@4.0.2.js"></script><script src="/js/chunk-libs.7289eda9.js"></script><script src="/js/app.6156a144.js"></script></body></html>

File diff suppressed because it is too large
+ 0 - 0
hd/dist/shop/js/app.6156a144.js


+ 10 - 2
hdApp/src/admin/ghs/balanceChange.vue

@@ -73,6 +73,9 @@ export default {
 			return !this.hasList
 		}
 	},
+	onLoad() {
+		this.getMyChange()
+	},
 	methods: {
 		formatMoney(val) {
 			const n = parseFloat(val)
@@ -116,10 +119,15 @@ export default {
 		shouldHideRow(item) {
 			return item.io == 0 && item.event && String(item.event).indexOf('结账') === 0
 		},
-		async init() {
+		init(){
+
+		},
+		async getMyChange() {
+			let salt = this.option.salt||''
 			const res = await balanceChangeList({
 				page: this.list.page,
-				ghsId: this.option.ghsId
+				ghsId: this.option.ghsId,
+				salt: salt
 			})
 			if (this.$util.isEmpty(res.data.list)) {
 				this.completes(res)

+ 74 - 18
hdApp/src/admin/ghs/pay.vue

@@ -1,6 +1,6 @@
 <template>
 	<view class="pay-page">
-		<!-- 供货商信息 -->
+		<!-- 供货商信息:仅展示品牌信息,避免与下方操作入口抢位 -->
 		<view class="pay-card pay-card--header">
 			<view class="pay-header-main">
 				<image class="pay-header-logo" :src="`${constant.imgUrl}/logo4.png`" mode="aspectFill" />
@@ -9,29 +9,35 @@
 					<view class="pay-header-sub">向供货商付款</view>
 				</view>
 			</view>
-			<button
-				v-if="showGatheringBtn"
-				class="admin-button-com middle pay-header-btn"
-				:disabled="ghsDataLoading"
-				@click="goGathering">
-				查看待结订单
-			</button>
 		</view>
 
-		<!-- 问候与待结提示 -->
+		<!-- 问候、待结金额独占;明细入口沉底并排,避免挤占金额区 -->
 		<view class="pay-card pay-card--welcome">
 			<view v-if="ghsDataLoading" class="pay-status pay-status--loading">加载中...</view>
 			<view v-else-if="loadError" class="pay-status pay-status--error">{{ loadError }}</view>
 			<template v-else>
 				<view class="pay-welcome-text">
-					<text class="pay-welcome-name">{{ customName }}</text>
-					<text v-if="hasOutstanding">,请确认金额后付款结账</text>
-					<text v-else>,您好,请输入金额充值</text>
+					<text class="pay-welcome-name">您好,{{ displayCustomName }}</text>
 				</view>
 				<view v-if="hasOutstanding" class="pay-debt-box">
 					<view class="pay-debt-label">待结金额(元)</view>
 					<view class="pay-debt-value">{{ outstandingAmount }}</view>
 				</view>
+				<!-- 次级入口:有待结时双按钮等宽,无待结时仅余额明细 -->
+				<view class="pay-entry-row" :class="{ 'pay-entry-row--single': !showGatheringBtn }">
+					<view
+						v-if="showGatheringBtn"
+						class="pay-entry-btn"
+						@click="goGathering">
+						<text class="pay-entry-btn__text">查看待结订单</text>
+					</view>
+					<view
+						class="pay-entry-btn"
+						:class="{ 'pay-entry-btn--disabled': !id }"
+						@click="goBalanceChange">
+						<text class="pay-entry-btn__text">查看余额明细</text>
+					</view>
+				</view>
 			</template>
 		</view>
 
@@ -118,6 +124,14 @@
 			customName() {
 				return this.customInfo.name || ''
 			},
+			/** 客户名最多展示 7 个字,超出用省略号,避免挤占右侧按钮 */
+			displayCustomName() {
+				const name = this.customName || ''
+				if (name.length > 15) {
+					return name.slice(0, 15) + '...'
+				}
+				return name
+			},
 			// 待结金额:净 balance 为负取绝对值(appVersion>=3)
 			outstandingAmount() {
 				const info = this.customInfo
@@ -345,6 +359,14 @@
 				}
 				this.pageTo({ url: `/pagesPurchase/gathering?id=${this.id}&salt=${this.salt}&ghsId=${this.id}`, type: 2 })
 			},
+			/** 跳转当前供货商余额变动明细页 */
+			goBalanceChange() {
+				if (!this.id) {
+					this.$msg('供货商信息加载中,请稍后再试')
+					return
+				}
+				this.pageTo({ url: '/admin/ghs/balanceChange?ghsId=' + this.id+'&salt='+this.salt })
+			},
 			downloadImg() {
 				if (!this.imgUrl) {
 					this.$msg('二维码加载中,请稍后再试')
@@ -414,7 +436,6 @@
 		display: flex;
 		flex-direction: row;
 		align-items: center;
-		justify-content: space-between;
 	}
 
 	.pay-header-main {
@@ -454,11 +475,6 @@
 		line-height: 32upx;
 	}
 
-	.pay-header-btn {
-		flex-shrink: 0;
-		margin-left: 20upx;
-	}
-
 	.pay-welcome-text {
 		font-size: 28upx;
 		color: $fontColor2;
@@ -470,6 +486,46 @@
 		font-weight: bold;
 	}
 
+	/* 明细入口:等宽描边按钮,与待结金额纵向分层 */
+	.pay-entry-row {
+		display: flex;
+		flex-direction: row;
+		align-items: stretch;
+		margin-top: 24upx;
+	}
+
+	/* 单按钮时行宽约半行,按钮长度与双按钮场景下单个一致 */
+	.pay-entry-row--single {
+		width: 50%;
+	}
+
+	.pay-entry-btn {
+		flex: 1;
+		height: 72upx;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		box-sizing: border-box;
+		border: 1upx solid #d0e3ff;
+		background-color: #f5f9ff;
+		border-radius: 12upx;
+		margin-left: 16upx;
+
+		&:first-child {
+			margin-left: 0;
+		}
+	}
+
+	.pay-entry-btn--disabled {
+		opacity: 0.5;
+	}
+
+	.pay-entry-btn__text {
+		font-size: 26upx;
+		color: #3385ff;
+		line-height: 36upx;
+	}
+
 	.pay-status {
 		font-size: 28upx;
 		line-height: 42upx;

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

@@ -463,7 +463,7 @@ export default {
       })
     },
     recharge(currentGhs) {
-      this.pageTo({ url: '/admin/ghs/pay?id=' + currentGhs.id + '&salt=' + currentGhs.salt })
+      this.pageTo({ url: '/admin/ghs/pay?id=' + currentGhs.id + '&salt=' + currentGhs.salt+'&ghsId=' + currentGhs.id })
     },
     confirmPb(ghs) {
       let that = this

+ 502 - 0
hdh5/admin/ghs/balanceChange.vue

@@ -0,0 +1,502 @@
+<template>
+	<!--
+		H5 余额变动明细页
+		用途:扫码付款场景查看与供货商的余额流水;与小程序共用 /ghs-balance-change/list
+		调用方:admin/ghs/pay 的「查看余额明细」
+	-->
+	<view class="bc-page">
+		<view class="nav-bar">
+			<view class="nav-back" @click="goBack">
+				<text class="back-arrow">&lt;</text>
+			</view>
+			<view class="nav-title">余额变动</view>
+			<view class="nav-placeholder"></view>
+		</view>
+		<view class="nav-bar-placeholder"></view>
+
+		<view v-if="loading && page === 1" class="bc-status">加载中...</view>
+		<view v-else-if="loadError" class="bc-status bc-status--error">{{ loadError }}</view>
+		<template v-else>
+			<view v-if="list.length > 0" class="bc-sheet">
+				<view class="bc-head">
+					<text class="bc-th bc-th--time">时间</text>
+					<text class="bc-th bc-th--event">事项</text>
+					<text class="bc-th bc-th--amt">变动</text>
+					<text class="bc-th bc-th--bal">余额</text>
+				</view>
+				<view class="bc-body">
+					<view
+						v-for="(item, index) in list"
+						:key="index"
+						class="bc-item"
+						:class="{ 'bc-item--alt': index % 2 === 1 }"
+					>
+						<view
+							class="bc-row-main"
+							:class="{ 'bc-row-main--with-extra': item.showExtraRow }"
+						>
+							<view class="bc-td bc-td--time">
+								<text class="bc-date">{{ item.dateText }}</text>
+								<text class="bc-clock">{{ item.timeLine }}</text>
+							</view>
+							<view class="bc-td bc-td--event">
+								<text class="bc-event">{{ item.event }}</text>
+								<text v-if="item.showStaff" class="bc-meta">{{ item.staffName }}</text>
+								<text v-if="item.showRemark" class="bc-meta bc-meta--remark">{{ item.remark }}</text>
+							</view>
+							<view class="bc-td bc-td--amt">
+								<text class="bc-amount" :class="item.amountClassName">{{ item.amount }}</text>
+							</view>
+							<view class="bc-td bc-td--bal">
+								<text class="bc-balance">{{ item.balanceText }}</text>
+							</view>
+						</view>
+						<view v-if="item.showExtraRow" class="bc-row-extra">
+							<view class="bc-tags-row">
+								<text
+									v-if="item.showRefundTag"
+									class="bc-tag bc-tag--refund"
+								>{{ item.refundTagText }}</text>
+								<text
+									v-if="item.showClearLink"
+									class="bc-tag bc-tag--link"
+								>{{ item.clearLinkText }}</text>
+							</view>
+						</view>
+					</view>
+				</view>
+				<view v-if="loadingMore" class="bc-status bc-status--more">加载更多...</view>
+				<view v-else-if="finished" class="bc-status bc-status--more">没有更多了</view>
+			</view>
+			<view v-else class="bc-empty">
+				<text class="bc-empty__text">暂无余额变动记录</text>
+			</view>
+		</template>
+	</view>
+</template>
+
+<script>
+import { balanceChangeList } from '@/api/ghs'
+
+export default {
+	name: 'ghsBalanceChangeH5',
+	data() {
+		return {
+			ghsId: 0,
+			salt: '',
+			list: [],
+			page: 1,
+			pageSize: 20,
+			loading: false,
+			loadingMore: false,
+			finished: false,
+			loadError: ''
+		}
+	},
+	onLoad(options) {
+		this.ghsId = options.ghsId || options.id || 0
+		this.salt = options.salt || ''
+		if (!this.ghsId) {
+			this.loadError = '参数错误,缺少供货商信息'
+			return
+		}
+		this.fetchList(true)
+	},
+	onReachBottom() {
+		if (!this.finished && !this.loading && !this.loadingMore) {
+			this.fetchList(false)
+		}
+	},
+	onPullDownRefresh() {
+		this.fetchList(true).finally(() => {
+			uni.stopPullDownRefresh()
+		})
+	},
+	methods: {
+		goBack() {
+			uni.navigateBack({ delta: 1 })
+		},
+		formatMoney(val) {
+			const n = parseFloat(val)
+			return isNaN(n) ? '0' : String(n)
+		},
+		hasText(val) {
+			return val !== undefined && val !== null && String(val).trim() !== ''
+		},
+		/** 结账类支出行不展示(与小程序一致) */
+		shouldHideRow(item) {
+			return item.io == 0 && item.event && String(item.event).indexOf('结账') === 0
+		},
+		/** 映射列表行展示字段 */
+		mapListItem(item, amountDisplay) {
+			const row = Object.assign({}, item)
+			row.amount = amountDisplay
+			const text = String(amountDisplay || '')
+			row.amountClassName = (text.indexOf('+') === 0 || Number(row.io) === 1) ? 'bc-amount--in' : 'bc-amount--out'
+			const addTime = row.addTime || ''
+			if (addTime.length >= 16) {
+				row.dateText = addTime.substr(5, 5)
+				row.timeLine = addTime.substr(11, 5)
+			} else if (addTime.length >= 11) {
+				row.dateText = addTime.substr(0, 10)
+				row.timeLine = addTime.substr(11)
+			} else {
+				row.dateText = addTime
+				row.timeLine = ''
+			}
+			row.balanceText = this.formatMoney(row.balance)
+			const clearSn = row.clearSn || ''
+			const clearAmt = this.formatMoney(row.clearAmount)
+			row.showClearLink = Number(row.clearId) > 0 || this.hasText(clearSn)
+			row.clearLinkText = '结账单 ' + clearSn + ' · 本单销' + clearAmt + '元'
+			row.showStaff = this.hasText(row.staffName)
+			row.showRemark = this.hasText(row.remark)
+			const eventText = String(row.event || '')
+			row.showRefundTag = Number(row.capitalType) === 82 || eventText.indexOf('充值退款') >= 0
+			row.refundTagText = row.showStaff
+				? '充值退款 · 操作人 ' + row.staffName
+				: '充值退款'
+			row.showExtraRow = row.showClearLink || row.showRefundTag
+			return row
+		},
+		/**
+		 * 拉取余额变动列表
+		 * @param {boolean} reset 是否从第一页刷新
+		 */
+		async fetchList(reset) {
+			if (reset) {
+				this.page = 1
+				this.finished = false
+				this.loadError = ''
+				this.loading = true
+			} else {
+				this.loadingMore = true
+			}
+			try {
+				const res = await balanceChangeList({
+					page: this.page,
+					pageSize: this.pageSize,
+					ghsId: this.ghsId,
+					salt: this.salt
+				})
+				if (!res || res.code !== 1) {
+					if (reset) {
+						this.loadError = (res && res.msg) || '加载失败'
+						this.list = []
+					}
+					this.finished = true
+					return
+				}
+				const rawList = (res.data && res.data.list) ? res.data.list : []
+				const rows = []
+				rawList.forEach((item) => {
+					if (this.shouldHideRow(item)) {
+						return
+					}
+					const amountDisplay = item.io == 0
+						? '-' + parseFloat(item.amount)
+						: '+' + parseFloat(item.amount)
+					rows.push(this.mapListItem(item, amountDisplay))
+				})
+				this.list = reset ? rows : this.list.concat(rows)
+				const moreData = res.data && res.data.moreData
+				if (!moreData) {
+					this.finished = true
+				} else {
+					this.page += 1
+				}
+			} catch (e) {
+				if (reset) {
+					this.loadError = '网络异常,请稍后重试'
+					this.list = []
+				}
+				this.finished = true
+			} finally {
+				this.loading = false
+				this.loadingMore = false
+			}
+		}
+	}
+}
+</script>
+
+<style lang="scss" scoped>
+.bc-page {
+	min-height: 100vh;
+	background: #fff;
+	box-sizing: border-box;
+}
+
+.nav-bar {
+	position: fixed;
+	top: 0;
+	left: 0;
+	right: 0;
+	z-index: 100;
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	padding: 20upx 24upx;
+	padding-top: calc(20upx + env(safe-area-inset-top));
+	background: #fff;
+	border-bottom: 1upx solid #f0f0f0;
+	box-sizing: border-box;
+}
+
+.nav-back,
+.nav-placeholder {
+	width: 72upx;
+	height: 72upx;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+}
+
+.back-arrow {
+	font-size: 40upx;
+	color: #333;
+	font-weight: bold;
+	line-height: 1;
+}
+
+.nav-title {
+	flex: 1;
+	text-align: center;
+	font-size: 34upx;
+	font-weight: 600;
+	color: #222;
+}
+
+.nav-bar-placeholder {
+	height: calc(112upx + env(safe-area-inset-top));
+}
+
+.bc-status {
+	padding: 80upx 30upx;
+	text-align: center;
+	font-size: 28upx;
+	color: #999;
+}
+
+.bc-status--error {
+	color: #e64340;
+}
+
+.bc-status--more {
+	padding: 30upx;
+	font-size: 24upx;
+}
+
+.bc-empty {
+	padding: 160upx 30upx;
+	text-align: center;
+}
+
+.bc-empty__text {
+	font-size: 28upx;
+	color: #999;
+}
+
+.bc-sheet {
+	width: 100%;
+	background: #fff;
+}
+
+.bc-head {
+	display: flex;
+	align-items: center;
+	padding: 22upx 0;
+	background: #f8f9fb;
+	border-bottom: 1upx solid #eceef2;
+}
+
+.bc-th {
+	font-size: 28upx;
+	color: #8c8c8c;
+	font-weight: 500;
+	line-height: 1.2;
+}
+
+.bc-th--time {
+	width: 100upx;
+	flex-shrink: 0;
+	padding-left: 8upx;
+	box-sizing: border-box;
+}
+
+.bc-th--event {
+	flex: 1;
+	min-width: 0;
+	padding-right: 12upx;
+}
+
+.bc-th--amt {
+	width: 118upx;
+	flex-shrink: 0;
+	text-align: right;
+}
+
+.bc-th--bal {
+	width: 140upx;
+	flex-shrink: 0;
+	padding-right: 8upx;
+	text-align: right;
+	box-sizing: border-box;
+}
+
+.bc-item {
+	border-bottom: 1upx solid #f2f3f5;
+	box-sizing: border-box;
+}
+
+.bc-item:last-child {
+	border-bottom: none;
+}
+
+.bc-item--alt {
+	background: #fafbfc;
+}
+
+.bc-row-main {
+	display: flex;
+	align-items: flex-start;
+	padding: 24upx 0;
+	box-sizing: border-box;
+}
+
+.bc-row-main--with-extra {
+	padding-bottom: 0;
+}
+
+.bc-row-extra {
+	width: 100%;
+	padding: 12upx 0 20upx;
+	box-sizing: border-box;
+}
+
+.bc-tags-row {
+	display: flex;
+	flex-direction: row;
+	flex-wrap: wrap;
+	align-items: flex-start;
+	width: 100%;
+	padding-left: 8upx;
+	padding-right: 8upx;
+	box-sizing: border-box;
+}
+
+.bc-td--time {
+	width: 100upx;
+	flex-shrink: 0;
+	padding-left: 8upx;
+	display: flex;
+	flex-direction: column;
+	align-items: flex-start;
+	justify-content: center;
+	box-sizing: border-box;
+}
+
+.bc-td--event {
+	flex: 1;
+	min-width: 0;
+	padding-right: 12upx;
+}
+
+.bc-td--amt {
+	width: 118upx;
+	flex-shrink: 0;
+	padding-right: 8upx;
+	display: flex;
+	justify-content: flex-end;
+	box-sizing: border-box;
+}
+
+.bc-td--bal {
+	width: 140upx;
+	flex-shrink: 0;
+	padding-right: 8upx;
+	display: flex;
+	justify-content: flex-end;
+	box-sizing: border-box;
+}
+
+.bc-date,
+.bc-clock {
+	font-size: 28upx;
+	color: #2c2c2c;
+	line-height: 1.35;
+}
+
+.bc-clock {
+	margin-top: 4upx;
+}
+
+.bc-event {
+	display: block;
+	font-size: 28upx;
+	color: #1a1a1a;
+	font-weight: 500;
+	line-height: 1.45;
+	word-break: break-all;
+}
+
+.bc-meta {
+	display: block;
+	margin-top: 8upx;
+	font-size: 22upx;
+	color: #999;
+	line-height: 1.4;
+	word-break: break-all;
+}
+
+.bc-meta--remark {
+	color: #b3b3b3;
+}
+
+.bc-tag {
+	display: block;
+	max-width: 100%;
+	padding: 6upx 14upx;
+	margin-top: 10upx;
+	margin-right: 12upx;
+	font-size: 28upx;
+	line-height: 1.4;
+	border-radius: 8upx;
+	word-break: break-all;
+	box-sizing: border-box;
+}
+
+.bc-tags-row .bc-tag:first-child {
+	margin-top: 0;
+}
+
+.bc-tag--link {
+	color: #969aa0;
+	background: #eef4ff;
+}
+
+.bc-tag--refund {
+	color: #cf1322;
+	background: #fff1f0;
+}
+
+.bc-amount {
+	font-size: 28upx;
+	font-weight: 600;
+	line-height: 1.35;
+}
+
+.bc-amount--in {
+	color: #07a84c;
+}
+
+.bc-amount--out {
+	color: #e62e45;
+}
+
+.bc-balance {
+	font-size: 28upx;
+	color: #131212;
+	line-height: 1.35;
+}
+</style>

+ 642 - 619
hdh5/admin/ghs/pay.vue

@@ -1,92 +1,120 @@
 <template>
-	<view class="pay-container">
-		<!-- 支付金额区域 -->
-		<view class="amount-section">
-			<view class="amount-label">支付金额</view>
-			<view class="amount-display">
-				<text class="currency">¥</text>
-				<text class="amount">{{ displayAmount }}</text>
+	<!--
+		H5 向供货商付款页(支付宝收款风格)
+		用途:扫码后输入金额并用支付宝支付;展示待结与余额入口
+	-->
+	<view class="pay-page">
+		<!-- 收款方信息 -->
+		<view class="pay-merchant">
+			<view class="pay-merchant__avatar">
+				<text class="pay-merchant__avatar-text">{{ merchantInitial }}</text>
+			</view>
+			<view class="pay-merchant__meta">
+				<text class="pay-merchant__name">{{ merchantName }}</text>
 			</view>
-			<button class="clear-amount-btn" @click="changeAmount(0)">清空金额</button>
 		</view>
 
-		<!-- 客户信息卡片 -->
-		<view class="customer-info-card">
-			<view class="card-header">
-				<view class="customer-avatar">
-					<text class="avatar-text">{{ customInfo.name ? customInfo.name.charAt(0) : '客' }}</text>
+		<!-- 金额主视觉 -->
+		<view class="pay-amount-card">
+			<view class="pay-amount-card__head">
+				<text class="pay-amount-card__title">付款金额</text>
+				<text v-if="canPay" class="pay-amount-card__clear" @click="changeAmount(0)">清空</text>
+			</view>
+			<view class="pay-amount-row">
+				<text class="pay-amount-row__currency">¥</text>
+				<text class="pay-amount-row__value" :class="{ 'pay-amount-row__value--placeholder': !canPay }">{{ amountText }}</text>
+				<view class="pay-amount-row__cursor"></view>
+			</view>
+
+			<!-- 待结提示:点按可填入金额 -->
+			<view
+				v-if="hasOutstanding"
+				class="pay-debt-tip"
+				@click="fillOutstanding">
+				<view class="pay-debt-tip__left">
+					<text class="pay-debt-tip__label">待结金额</text>
+					<text class="pay-debt-tip__value">¥{{ outstandingAmount }}</text>
 				</view>
-				<view class="customer-details">
-					<text class="customer-name">{{ customInfo.name || '客户' }}</text>
-					<text class="customer-status has-debt" @click="goGathering">
-						查看待结订单
-					</text>
+				<view class="pay-debt-tip__btn">
+					<text class="pay-debt-tip__action">一键填入</text>
 				</view>
 			</view>
-			<view class="debt-info" v-if="Number(customInfo.remainDebtAmount) > 0">
-				<view class="debt-amount" @click="changeAmount(customInfo.remainDebtAmount)">
-					<text class="debt-label">待结金额</text>
-					<text class="debt-value">¥{{ customInfo.remainDebtAmount }}</text>
-				</view>
+			<!-- 有可用余额时展示当前账户余额 -->
+			<view v-else-if="hasPositiveBalance" class="pay-balance-tip">
+				<text class="pay-balance-tip__label">当前账户余额</text>
+				<text class="pay-balance-tip__value">¥{{ accountBalance }}</text>
 			</view>
 		</view>
 
-		<!-- 数字键盘 - 使用直接事件绑定,确保兼容性 -->
-		<view class="keyboard-section">
-			<view class="keyboard">
-				<view class="keyboard-row" v-for="(row, rowIndex) in keyboardKeys" :key="rowIndex">
-					<view 
-						class="key-item" 
-						v-for="(key, keyIndex) in row" 
-						:key="`${rowIndex}-${keyIndex}`"
-						:class="{ 
-							'key-number': key.type === 'number',
-							'key-delete': key.type === 'delete',
-							'key-dot': key.type === 'dot',
-							'key-confirm': key.type === 'confirm'
-						}"
-						@click="handleKeyPress(key)"
-						@touchstart="handleTouchStart"
-						@touchend="handleTouchEnd"
-					>
-						<text v-if="key.type === 'delete'" class="iconfont icon-delete"></text>
-						<text v-else-if="key.type === 'confirm'">确认</text>
-						<text v-else>{{ key.value }}</text>
-					</view>
+		<!-- 账户与明细:独立信息卡,居中排版 -->
+		<view class="pay-extra-card">
+			<view v-if="displayCustomName" class="pay-account">
+				<view class="pay-account__meta">
+					<text class="pay-account__name">付款人:{{ displayCustomName }}</text>
+				</view>
+			</view>
+			<view
+				class="pay-action-row"
+				:class="{
+					'pay-action-row--single': !showGatheringBtn,
+					'pay-action-row--with-account': !!displayCustomName
+				}">
+				<view
+					v-if="showGatheringBtn"
+					class="pay-action-chip pay-action-chip--debt"
+					@click="goGathering">
+					<text class="pay-action-chip__text">查看待结订单</text>
+				</view>
+				<view
+					class="pay-action-chip"
+					:class="{ 'pay-action-chip--disabled': !id }"
+					@click="goBalanceChange">
+					<text class="pay-action-chip__text">查看余额明细</text>
 				</view>
 			</view>
 		</view>
 
-		<!-- 支付按钮 -->
-		<view class="pay-button-section">
-			<button 
-				class="pay-button" 
-				:class="{ disabled: !canPay }"
-				:disabled="!canPay"
-				@click="handlePay"
-			>
-				<text class="button-text">支付宝支付</text>
-			</button>
+		<!-- 底部:支付宝式数字键盘 + 右侧付款键 -->
+		<view class="pay-keyboard-wrap">
+			<view class="pay-keyboard">
+				<view class="pay-keyboard__keys">
+					<view
+						v-for="(key, index) in flatKeys"
+						:key="index"
+						class="pay-key"
+						:class="{ 'pay-key--del': key.type === 'delete' }"
+						@click="handleKeyPress(key)">
+						<view class="pay-key__inner">
+							<text v-if="key.type === 'delete'" class="pay-key__del">⌫</text>
+							<text v-else class="pay-key__num">{{ key.value }}</text>
+						</view>
+					</view>
+				</view>
+				<view
+					class="pay-key-pay"
+					:class="{ 'pay-key-pay--disabled': !canPay }"
+					@click="handlePay">
+					<text class="pay-key-pay__text">付款</text>
+				</view>
+			</view>
+			<view class="pay-safe-area"></view>
 		</view>
-
-
 	</view>
 </template>
 
 <script>
-import { getGhsData } from '@/api/ghs';
+import { getGhsData } from '@/api/ghs'
 import { rechargeFn } from '@/api/custom-recharge'
 
-// 优化:使用常量避免重复创建
 const KEY_TYPES = {
 	NUMBER: 'number',
 	DELETE: 'delete',
 	DOT: 'dot',
 	CONFIRM: 'confirm'
-};
+}
 
-const MAX_INTEGER_LENGTH = 8;
-const MAX_DECIMAL_LENGTH = 2;
+const MAX_INTEGER_LENGTH = 8
+const MAX_DECIMAL_LENGTH = 2
 
 export default {
 	name: 'pay',
@@ -94,7 +122,6 @@ export default {
 		return {
 			currentAmount: '0',
 			displayAmount: '0',
-			// 优化:使用静态数据,避免重复创建
 			keyboardKeys: [
 				[
 					{ type: KEY_TYPES.NUMBER, value: '1' },
@@ -117,675 +144,671 @@ export default {
 					{ type: KEY_TYPES.DELETE, value: '' }
 				]
 			],
-			// 优化:使用更高效的状态管理
 			amountBuffer: '0',
 			updateScheduled: false,
 			updateTimer: null,
-
-			id:0,
-			salt:'',
-			ghsInfo:[],
-			customInfo:{},
-			payWay:1
+			id: 0,
+			salt: '',
+			ghsInfo: {},
+			customInfo: {},
+			payWay: 1
 		}
 	},
 	computed: {
-		// 简化支付按钮判断逻辑:只要大于0就能支付
 		canPay() {
-			const amount = parseFloat(this.currentAmount);
-			return amount > 0;
+			return parseFloat(this.currentAmount) > 0
+		},
+		/** 金额展示:输入中保留原始缓冲,避免过早补零打断输入 */
+		amountText() {
+			if (!this.canPay && this.amountBuffer === '0') {
+				return '0.00'
+			}
+			return this.amountBuffer
+		},
+		displayCustomName() {
+			const name = (this.customInfo && this.customInfo.name) ? String(this.customInfo.name) : ''
+			if (!name) {
+				return ''
+			}
+			if (name.length > 7) {
+				return name.slice(0, 7) + '...'
+			}
+			return name
+		},
+		merchantName() {
+			const name = (this.ghsInfo && this.ghsInfo.name) ? String(this.ghsInfo.name) : '供货商'
+			if (name.length > 12) {
+				return name.slice(0, 12) + '...'
+			}
+			return name
+		},
+		merchantInitial() {
+			const name = (this.ghsInfo && this.ghsInfo.name) ? String(this.ghsInfo.name) : '商'
+			return name.charAt(0) || '商'
+		},
+		outstandingAmount() {
+			const info = this.customInfo || {}
+			const remain = parseFloat(info.remainDebtAmount || 0)
+			if (remain > 0) {
+				return parseFloat(remain.toFixed(2))
+			}
+			const bal = parseFloat(info.balance || 0)
+			return bal < 0 ? parseFloat(Math.abs(bal).toFixed(2)) : 0
+		},
+		hasOutstanding() {
+			return this.outstandingAmount > 0
+		},
+		/** 净 balance 为正时的可用余额 */
+		accountBalance() {
+			const bal = parseFloat((this.customInfo && this.customInfo.balance) || 0)
+			return bal > 0 ? parseFloat(bal.toFixed(2)) : 0
+		},
+		hasPositiveBalance() {
+			return this.accountBalance > 0
+		},
+		showGatheringBtn() {
+			return this.hasOutstanding && !!this.id
+		},
+		/** 键盘扁平化为 12 键网格,配合右侧付款柱 */
+		flatKeys() {
+			const keys = []
+			this.keyboardKeys.forEach((row) => {
+				row.forEach((key) => {
+					keys.push(key)
+				})
+			})
+			return keys
 		}
 	},
 	onLoad(options) {
 		if (options.id) {
-			this.id = options.id;
+			this.id = options.id
 		}
 		if (options.salt) {
-			this.salt = options.salt;
+			this.salt = options.salt
 		}
-		let that = this
 		if (this.id && this.salt) {
-			getGhsData({id:this.id,salt:this.salt}).then(res => {
-				if (res.data && res.data.ghs){
-					that.ghsInfo = res.data.ghs
-					that.customInfo = res.data.custom?res.data.custom:[]
-
-					if(that.customInfo.remainDebtAmount && Number(that.customInfo.remainDebtAmount)>0){
-						that.currentAmount = parseFloat(that.customInfo.remainDebtAmount).toString()
-						that.updateDisplay()
+			getGhsData({ id: this.id, salt: this.salt }).then(res => {
+				if (res.data && res.data.ghs) {
+					this.ghsInfo = res.data.ghs
+					this.customInfo = res.data.custom ? res.data.custom : {}
+					if (this.hasOutstanding) {
+						this.fillOutstanding()
 					}
 				}
 			})
 		}
-		
-
 	},
 	methods: {
-		changeAmount(amount){
-			this.currentAmount = amount
+		/** 同步缓冲与展示金额 */
+		changeAmount(amount) {
+			const num = parseFloat(amount)
+			if (!num || num <= 0) {
+				this.amountBuffer = '0'
+				this.currentAmount = '0'
+				this.displayAmount = '0'
+				return
+			}
+			const amountStr = parseFloat(num.toFixed(2)).toString()
+			this.amountBuffer = amountStr
+			this.currentAmount = amountStr
 			this.updateDisplay()
 		},
-		// 优化:添加触摸反馈
-		handleTouchStart(e) {
-			const target = e.currentTarget;
-			if (target && target.style) {
-				target.style.transform = 'scale(0.95)';
+		/** 一键填入待结金额 */
+		fillOutstanding() {
+			if (!this.hasOutstanding) {
+				return
 			}
+			this.changeAmount(this.outstandingAmount)
 		},
-		
-		handleTouchEnd(e) {
-			const target = e.currentTarget;
-			if (target && target.style) {
-				setTimeout(() => {
-					target.style.transform = 'scale(1)';
-				}, 100);
-			}
-		},
-
-		// 优化:简化的键盘处理逻辑
+		handleTouchStart() {},
+		handleTouchEnd() {},
 		handleKeyPress(key) {
-			// 防抖处理
 			if (this.updateTimer) {
-				clearTimeout(this.updateTimer);
+				clearTimeout(this.updateTimer)
 			}
-			
 			if (key.type === KEY_TYPES.NUMBER) {
-				this.addNumber(key.value);
+				this.addNumber(key.value)
 			} else if (key.type === KEY_TYPES.DELETE) {
-				this.deleteNumber();
+				this.deleteNumber()
 			} else if (key.type === KEY_TYPES.DOT) {
-				this.addDecimal();
+				this.addDecimal()
 			}
-			
-			// 使用 requestAnimationFrame 优化更新
-			this.scheduleUpdate();
+			this.scheduleUpdate()
 		},
-
-		// 优化:使用 requestAnimationFrame 调度更新
 		scheduleUpdate() {
 			if (!this.updateScheduled) {
-				this.updateScheduled = true;
+				this.updateScheduled = true
 				requestAnimationFrame(() => {
-					this.updateDisplay();
-					this.updateScheduled = false;
-				});
+					this.updateDisplay()
+					this.updateScheduled = false
+				})
 			}
 		},
-
-		// 优化:更高效的数字添加逻辑
 		addNumber(num) {
-			const buffer = this.amountBuffer;
-			
-			// 快速路径:如果当前是0且输入的不是小数点,直接替换
+			const buffer = this.amountBuffer
 			if (buffer === '0' && num !== '.') {
-				this.amountBuffer = num;
-				this.currentAmount = num;
-				return;
+				this.amountBuffer = num
+				this.currentAmount = num
+				return
 			}
-
-			// 检查长度限制
-			const parts = buffer.split('.');
-			const integerPart = parts[0];
-			const decimalPart = parts[1];
-
-			// 整数部分限制
+			const parts = buffer.split('.')
+			const integerPart = parts[0]
+			const decimalPart = parts[1]
 			if (!decimalPart && integerPart.length >= MAX_INTEGER_LENGTH) {
-				uni.showToast({
-					title: '金额不能超过8位数',
-					icon: 'none',
-					duration: 1500
-				})
-				return;
+				uni.showToast({ title: '金额不能超过8位数', icon: 'none', duration: 1500 })
+				return
 			}
-
-			// 小数部分限制
 			if (decimalPart && decimalPart.length >= MAX_DECIMAL_LENGTH) {
-				uni.showToast({
-					title: '最多支持2位小数',
-					icon: 'none',
-					duration: 1500
-				})
-				return;
+				uni.showToast({ title: '最多支持2位小数', icon: 'none', duration: 1500 })
+				return
 			}
-
-			// 添加数字
-			this.amountBuffer = buffer + num;
-			this.currentAmount = this.amountBuffer;
+			this.amountBuffer = buffer + num
+			this.currentAmount = this.amountBuffer
 		},
-
-		// 优化:更高效的小数点添加逻辑
 		addDecimal() {
 			if (!this.amountBuffer.includes('.')) {
-				this.amountBuffer += '.';
-				this.currentAmount = this.amountBuffer;
+				this.amountBuffer += '.'
+				this.currentAmount = this.amountBuffer
 			}
 		},
-
-		// 优化:更高效的删除逻辑
 		deleteNumber() {
-			const buffer = this.amountBuffer;
+			const buffer = this.amountBuffer
 			if (buffer.length > 1) {
-				this.amountBuffer = buffer.slice(0, -1);
+				this.amountBuffer = buffer.slice(0, -1)
 			} else {
-				this.amountBuffer = '0';
+				this.amountBuffer = '0'
 			}
-			this.currentAmount = this.amountBuffer;
+			this.currentAmount = this.amountBuffer
 		},
-
-		// 优化:更高效的显示更新逻辑
 		updateDisplay() {
-			let amount = this.currentAmount;
-			
-			// 确保 amount 是字符串类型
+			let amount = this.currentAmount
 			if (typeof amount !== 'string') {
-				amount = amount.toString();
+				amount = amount.toString()
 			}
-			
-			// 快速路径:如果是0,直接显示
 			if (amount === '0') {
-				this.displayAmount = '0';
-				return;
+				this.displayAmount = '0'
+				return
 			}
-
-			// 检查是否包含小数点
 			if (amount.includes('.')) {
-				const numAmount = parseFloat(amount) || 0;
-				this.displayAmount = numAmount.toFixed(2);
+				const numAmount = parseFloat(amount) || 0
+				this.displayAmount = numAmount.toFixed(2)
 			} else {
-				// 整数显示
-				this.displayAmount = amount;
+				this.displayAmount = amount
 			}
 		},
-
-		// 优化:更高效的金额设置
 		setAmount(amount) {
-			const numAmount = parseFloat(amount);
-			if (!isNaN(numAmount) && numAmount > 0) {
-				const amountStr = numAmount.toString();
-				this.amountBuffer = amountStr;
-				this.currentAmount = amountStr;
-				this.updateDisplay();
-			}
+			this.changeAmount(amount)
 		},
-
-
-		// 处理支付
 		handlePay() {
-			if (!this.canPay) return;
-			const amount = parseFloat(this.currentAmount);
-			// 简化验证:只要大于0就能支付
+			if (!this.canPay) {
+				return
+			}
+			const amount = parseFloat(this.currentAmount)
 			if (amount <= 0) {
-				uni.showToast({
-					title: '请输入金额!',
-					icon: 'none',
-					duration: 2000
-				})
+				uni.showToast({ title: '请输入金额!', icon: 'none', duration: 2000 })
 				return false
 			}
-			let params = {}
-			params = {
+			const params = {
 				actPrice: amount,
 				payWay: this.payWay,
+				ghsId: this.id,
+				salt: this.salt
 			}
-			params.ghsId = this.id
-			params.salt = this.salt
+			uni.showLoading({ title: '跳转中...', mask: true })
 			rechargeFn(params).then(res => {
-				//错误返回判断
-				if(res.code == 0){
-					uni.hideLoading()
-					uni.showToast({
-						title: res.msg,
-						icon: 'none',
-						duration: 2000
-					})
-					return false
-				}			
-				// 隐藏加载提示
 				uni.hideLoading()
-				// 显示成功提示
-				uni.showToast({
-					title: '正在跳转支付...',
-					icon: 'success',
-					duration: 1500
-				})
-				// 延迟跳转到支付页面
+				if (res.code == 0) {
+					uni.showToast({ title: res.msg, icon: 'none', duration: 2000 })
+					return false
+				}
+				uni.showToast({ title: '正在跳转支付...', icon: 'success', duration: 1500 })
 				setTimeout(() => {
-					window.location.href = res.data.url;
-				}, 300)					
-			}).catch(err => {
-				// 隐藏加载提示
+					window.location.href = res.data.url
+				}, 300)
+			}).catch(() => {
 				uni.hideLoading()
-				// 显示错误提示
-				uni.showToast({
-					title: '请求失败,请重试',
-					icon: 'none',
-					duration: 2000
-				})
+				uni.showToast({ title: '请求失败,请重试', icon: 'none', duration: 2000 })
 			})
-
 		},
-
-		// 返回上一页
 		goBack() {
-			uni.navigateBack({
-				delta: 1
-			});
+			uni.navigateBack({ delta: 1 })
 		},
-
-		// 跳转到待结订单页面
 		goGathering() {
 			if (!this.id) {
-				uni.showToast({
-					title: '供货商信息加载中,请稍后再试',
-					icon: 'none'
-				});
-				return;
+				uni.showToast({ title: '供货商信息加载中,请稍后再试', icon: 'none' })
+				return
 			}
 			uni.navigateTo({
 				url: `/pagesPurchase/gathering?id=${this.id}&salt=${this.salt}`
-			});
+			})
 		},
-
-
+		/** 跳转余额变动明细(与小程序共用接口,salt 访客可查) */
+		goBalanceChange() {
+			if (!this.id) {
+				uni.showToast({ title: '供货商信息加载中,请稍后再试', icon: 'none' })
+				return
+			}
+			uni.navigateTo({
+				url: `/admin/ghs/balanceChange?ghsId=${this.id}&salt=${this.salt}`
+			})
+		}
 	}
 }
 </script>
 
 <style lang="scss" scoped>
-.pay-container {
+.pay-page {
 	min-height: 100vh;
-	background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
-	position: relative;
+	background: #f5f5f5;
+	box-sizing: border-box;
+	padding-bottom: 560upx;
 }
 
-.nav-bar {
+/* 收款方:简洁头像 + 名称 */
+.pay-merchant {
 	display: flex;
+	flex-direction: row;
 	align-items: center;
-	justify-content: center; /* Changed to center the title */
-	padding: 20upx 30upx;
-	background: rgba(255, 255, 255, 0.1);
-	backdrop-filter: blur(10px);
-	
-	.nav-back {
-		width: 80upx;
-		height: 80upx;
-		display: flex;
-		align-items: center;
-		justify-content: center;
-		border-radius: 50%;
-		background: rgba(255, 255, 255, 0.2);
-		cursor: pointer;
-		transition: all 0.2s ease;
-		
-		&:active {
-			background: rgba(255, 255, 255, 0.3);
-			transform: scale(0.9);
-		}
-		
-		.iconfont {
-			font-size: 40upx;
-			color: #fff;
-			font-weight: bold;
-		}
-	}
-	
-	.nav-title {
-		color: #fff;
-		font-size: 36upx;
-		font-weight: 600;
-	}
-	
-	.nav-placeholder {
-		width: 80upx; /* Placeholder for back button */
-	}
+	justify-content: center;
+	padding: 56upx 40upx 28upx;
 }
 
-.amount-section {
-	padding: 60upx 40upx;
-	text-align: center;
-	
-	.amount-label {
-		color: rgba(255, 255, 255, 0.8);
-		font-size: 34upx;
-		margin-bottom: 20upx;
-	}
-	
-	.amount-display {
-		display: flex;
-		align-items: baseline;
-		justify-content: center;
-		margin-bottom: 20upx;
-		
-		.currency {
-			color: #fff;
-			font-size: 48upx;
-			font-weight: 600;
-			margin-right: 10upx;
-		}
-		
-		.amount {
-			color: #fff;
-			font-size: 80upx;
-			font-weight: 700;
-			font-family: 'Arial', sans-serif;
-		}
-	}
-	
-	.clear-amount-btn {
-		color: rgb(226, 219, 219);
-		font-size: 22upx;
-		margin-top: 20upx;
-		background: transparent;
-		border: 1upx solid rgb(226, 219, 219);
-		border-radius: 12upx;
-		padding: 6upx 12upx;
-		transition: all 0.3s ease;
-		cursor: pointer;
-		width: auto;
-		display: inline-block;
-	}
+.pay-merchant__avatar {
+	width: 72upx;
+	height: 72upx;
+	border-radius: 16upx;
+	background: #1677ff;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	flex-shrink: 0;
 }
 
-.customer-info-card {
-	background: #fff; /* Changed to white */
-	margin: 0 30upx 20upx;
-	border-radius: 20upx;
-	padding: 30upx;
-	box-shadow: 0 8upx 30upx rgba(0, 0, 0, 0.08);
-	position: relative;
-	overflow: hidden;
-	
-	&::before {
-		content: '';
-		position: absolute;
-		top: 0;
-		left: 0;
-		right: 0;
-		height: 8upx;
-		background: #fff; /* Changed to white */
-		box-shadow: 0 2upx 8upx rgba(0, 0, 0, 0.1);
-	}
-	
-	.card-header {
-		display: flex;
-		align-items: center;
-		margin-bottom: 20upx;
-		margin-top: 8upx;
-		
-		.customer-avatar {
-			width: 90upx;
-			height: 90upx;
-			border-radius: 50%;
-			background: linear-gradient(135deg, #1677ff 0%, #4096ff 100%);
-			display: flex;
-			align-items: center;
-			justify-content: center;
-			margin-right: 25upx;
-			box-shadow: 0 6upx 20upx rgba(22, 119, 255, 0.3);
-			position: relative;
-			
-			&::after {
-				content: '';
-				position: absolute;
-				top: -2upx;
-				left: -2upx;
-				right: -2upx;
-				bottom: -2upx;
-				border-radius: 50%;
-				background: linear-gradient(135deg, #1677ff 0%, #4096ff 100%);
-				z-index: -1;
-				opacity: 0.3;
-			}
-			
-			.avatar-text {
-				color: #fff;
-				font-size: 44upx;
-				font-weight: 600;
-			}
-		}
-		
-		.customer-details {
-			flex: 1;
-			display: flex;
-			align-items: center;
-			justify-content: space-between;
-			
-			.customer-name {
-				display: block;
-				font-size: 34upx;
-				font-weight: 600;
-				color: #333;
-			}
-			
-			.customer-status {
-				display: flex;
-				align-items: center;
-				justify-content: center;
-				font-size: 24upx;
-				color: #999;
-				padding: 0 24upx;
-				height: 70upx;
-				line-height: 70upx;
-				border-radius: 36upx;
-				background: #f8f9fa;
-				border: 1upx solid #e9ecef;
-				box-sizing: border-box;
-				
-				&.has-debt {
-					color: #fff;
-					background: linear-gradient(135deg, #ff6b6b 0%, #ff5252 100%);
-					border-color: #ff6b6b;
-					box-shadow: 0 2upx 10upx rgba(255, 107, 107, 0.3);
-				}
-			}
-		}
+.pay-merchant__avatar-text {
+	color: #fff;
+	font-size: 34upx;
+	font-weight: 600;
+	line-height: 1;
+}
+
+.pay-merchant__meta {
+	margin-left: 20upx;
+	display: flex;
+	flex-direction: column;
+	min-width: 0;
+}
+
+.pay-merchant__label {
+	font-size: 24upx;
+	color: #999;
+	line-height: 32upx;
+}
+
+.pay-merchant__name {
+	margin-top: 4upx;
+	font-size: 32upx;
+	font-weight: 600;
+	color: #222;
+	line-height: 44upx;
+}
+
+/* 金额白卡 */
+.pay-amount-card {
+	margin: 0 24upx;
+	padding: 36upx 32upx 28upx;
+	background: #fff;
+	border-radius: 16upx;
+	box-sizing: border-box;
+}
+
+.pay-amount-card__head {
+	display: flex;
+	flex-direction: row;
+	align-items: center;
+	justify-content: space-between;
+}
+
+.pay-amount-card__title {
+	font-size: 28upx;
+	color: #666;
+	line-height: 40upx;
+}
+
+.pay-amount-card__clear {
+	font-size: 26upx;
+	color: #1677ff;
+	line-height: 40upx;
+	padding: 0 8upx;
+}
+
+.pay-amount-row {
+	display: flex;
+	flex-direction: row;
+	align-items: flex-end;
+	margin-top: 28upx;
+	min-height: 96upx;
+}
+
+.pay-amount-row__currency {
+	font-size: 48upx;
+	font-weight: 600;
+	color: #222;
+	line-height: 1;
+	margin-right: 12upx;
+	padding-bottom: 10upx;
+}
+
+.pay-amount-row__value {
+	font-size: 80upx;
+	font-weight: 600;
+	color: #222;
+	line-height: 1;
+	font-family: 'DIN Alternate', 'Helvetica Neue', Arial, sans-serif;
+	word-break: break-all;
+}
+
+.pay-amount-row__value--placeholder {
+	color: #ccc;
+}
+
+/* 仿输入光标闪烁 */
+.pay-amount-row__cursor {
+	width: 4upx;
+	height: 64upx;
+	margin-left: 8upx;
+	margin-bottom: 8upx;
+	background: #1677ff;
+	animation: pay-cursor-blink 1s steps(1) infinite;
+}
+
+@keyframes pay-cursor-blink {
+	0%,
+	50% {
+		opacity: 1;
 	}
-	
-	.debt-info {
-		background: linear-gradient(135deg, #fff5f5 0%, #fef2f2 100%);
-		border-radius: 15upx;
-		padding: 20upx 25upx;
-		margin-top: 20upx;
-		border: 1upx solid rgba(255, 107, 107, 0.2);
-		position: relative;
-		
-		&::before {
-			content: '';
-			position: absolute;
-			top: 0;
-			left: 0;
-			right: 0;
-			bottom: 0;
-			background: linear-gradient(135deg, rgba(255, 107, 107, 0.05) 0%, rgba(255, 107, 107, 0.02) 100%);
-			border-radius: 15upx;
-		}
-		
-		.debt-amount {
-			display: flex;
-			align-items: baseline;
-			justify-content: space-between;
-			margin-bottom: 10upx;
-			position: relative;
-			z-index: 1;
-			
-			.debt-label {
-				font-size: 28upx;
-				color: #666;
-				font-weight: 500;
-			}
-			
-			.debt-value {
-				font-size: 40upx;
-				font-weight: 700;
-				color: #ff6b6b;
-				font-family: 'Arial', sans-serif;
-				text-shadow: 0 2upx 10upx rgba(255, 107, 107, 0.2);
-			}
-		}
-		
-		.debt-tip {
-			font-size: 22upx;
-			color: #999;
-			text-align: right;
-			position: relative;
-			z-index: 1;
-			font-style: italic;
-		}
+	51%,
+	100% {
+		opacity: 0;
 	}
 }
 
-.keyboard-section {
-	position: fixed;
-	bottom: 160upx;
-	left: 0;
-	right: 0;
-	background: rgba(255, 255, 255, 0.98);
-	backdrop-filter: blur(20px);
-	padding: 30upx;
-	border-top: 1upx solid rgba(0, 0, 0, 0.05);
-	
-	.keyboard {
-		.keyboard-row {
-			display: flex;
-			margin-bottom: 20upx;
-			
-			&:last-child {
-				margin-bottom: 0;
-			}
-			
-			.key-item {
-				flex: 1;
-				height: 120upx;
-				margin: 0 10upx;
-				border-radius: 20upx;
-				display: flex;
-				align-items: center;
-				justify-content: center;
-				font-size: 40upx;
-				font-weight: 600;
-				transition: all 0.15s ease;
-				user-select: none;
-				-webkit-user-select: none;
-				cursor: pointer;
-				will-change: transform;
-				position: relative;
-				overflow: hidden;
-				
-				&::before {
-					content: '';
-					position: absolute;
-					top: 0;
-					left: 0;
-					right: 0;
-					bottom: 0;
-					background: linear-gradient(135deg, rgba(255, 255, 255, 0.1) 0%, rgba(255, 255, 255, 0.05) 100%);
-					opacity: 0;
-					transition: opacity 0.15s ease;
-				}
-				
-				&:active::before {
-					opacity: 1;
-				}
-				
-				&.key-number {
-					background: linear-gradient(135deg, #f8f9fa 0%, #e9ecef 100%);
-					color: #333;
-					box-shadow: 0 4upx 20upx rgba(0, 0, 0, 0.08);
-					border: 1upx solid rgba(0, 0, 0, 0.05);
-				}
-				
-				&.key-delete {
-					background: linear-gradient(135deg, #ff6b6b 0%, #ff5252 100%);
-					color: #fff;
-					box-shadow: 0 4upx 20upx rgba(255, 107, 107, 0.3);
-				}
-				
-				&.key-dot {
-					background: linear-gradient(135deg, #f8f9fa 0%, #e9ecef 100%);
-					color: #333;
-					box-shadow: 0 4upx 20upx rgba(0, 0, 0, 0.08);
-					border: 1upx solid rgba(0, 0, 0, 0.05);
-				}
-				
-				&.key-confirm {
-					background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
-					color: #fff;
-					box-shadow: 0 4upx 20upx rgba(102, 126, 234, 0.3);
-				}
-			}
-		}
+.pay-debt-tip {
+	display: flex;
+	flex-direction: row;
+	align-items: center;
+	justify-content: space-between;
+	margin-top: 28upx;
+	padding: 20upx 22upx;
+	background: #fff7f0;
+	border-radius: 12upx;
+	box-sizing: border-box;
+}
+
+.pay-debt-tip__left {
+	display: flex;
+	flex-direction: row;
+	align-items: baseline;
+	flex: 1;
+	min-width: 0;
+}
+
+.pay-debt-tip__label {
+	font-size: 26upx;
+	color: #999;
+	line-height: 36upx;
+	flex-shrink: 0;
+}
+
+.pay-debt-tip__value {
+	margin-left: 12upx;
+	font-size: 32upx;
+	font-weight: 600;
+	color: #ff6a00;
+	line-height: 36upx;
+}
+
+.pay-debt-tip__btn {
+	flex-shrink: 0;
+	padding: 8upx 20upx;
+	background: #1677ff;
+	border-radius: 28upx;
+}
+
+.pay-debt-tip__action {
+	font-size: 24upx;
+	color: #fff;
+	line-height: 32upx;
+}
+
+/* 正余额提示条:与待结条对称,蓝色系 */
+.pay-balance-tip {
+	display: flex;
+	flex-direction: row;
+	align-items: center;
+	justify-content: center;
+	margin-top: 28upx;
+	padding: 20upx 22upx;
+	background: #f0f7ff;
+	border-radius: 12upx;
+	box-sizing: border-box;
+}
+
+.pay-balance-tip__label {
+	font-size: 30upx;
+	color: #333;
+	line-height: 36upx;
+}
+
+.pay-balance-tip__value {
+	margin-left: 12upx;
+	font-size: 34upx;
+	font-weight: 600;
+	color: #1677ff;
+	line-height: 36upx;
+}
+
+/* 账户 + 明细入口:白卡居中 */
+.pay-extra-card {
+	margin: 20upx 24upx 0;
+	padding: 28upx 24upx 30upx;
+	background: #fff;
+	border-radius: 16upx;
+	box-sizing: border-box;
+}
+
+.pay-account {
+	display: flex;
+	flex-direction: row;
+	align-items: center;
+	justify-content: center;
+}
+
+.pay-account__badge {
+	width: 56upx;
+	height: 56upx;
+	border-radius: 50%;
+	background: #e8f3ff;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	flex-shrink: 0;
+}
+
+.pay-account__badge-text {
+	font-size: 24upx;
+	color: #1677ff;
+	font-weight: 600;
+	line-height: 1;
+}
+
+.pay-account__meta {
+	display: flex;
+	flex-direction: column;
+	align-items: center;
+	min-width: 0;
+}
+
+.pay-account__name {
+	font-size: 32upx;
+	font-weight: 600;
+	color: #222;
+	line-height: 40upx;
+}
+
+.pay-action-row {
+	display: flex;
+	flex-direction: row;
+	align-items: stretch;
+	justify-content: center;
+}
+
+.pay-action-row--with-account {
+	margin-top: 28upx;
+	padding-top: 28upx;
+	border-top: 1upx solid #f0f0f0;
+}
+
+.pay-action-row--single .pay-action-chip {
+	width: 300upx;
+	flex: none;
+}
+
+.pay-action-chip {
+	flex: 1;
+	max-width: 300upx;
+	height: 72upx;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	box-sizing: border-box;
+	background: #f5f9ff;
+	border: 1upx solid #d6e4ff;
+	border-radius: 36upx;
+	margin-left: 20upx;
+
+	&:first-child {
+		margin-left: 0;
 	}
 }
 
-.pay-button-section {
+.pay-action-chip--debt {
+	background: #fff7f0;
+	border-color: #ffd8b8;
+}
+
+.pay-action-chip--debt .pay-action-chip__text {
+	color: #ff6a00;
+}
+
+.pay-action-chip--disabled {
+	opacity: 0.45;
+}
+
+.pay-action-chip:active {
+	opacity: 0.85;
+}
+
+.pay-action-chip__text {
+	font-size: 26upx;
+	color: #1677ff;
+	line-height: 36upx;
+	font-weight: 500;
+}
+
+/* 底部键盘:左 3×4 数字区 + 右通栏付款 */
+.pay-keyboard-wrap {
 	position: fixed;
-	bottom: 0;
 	left: 0;
 	right: 0;
-	padding: 30upx;
-	background: rgba(255, 255, 255, 0.98);
-	backdrop-filter: blur(20px);
-	border-top: 1upx solid rgba(0, 0, 0, 0.05);
-	
-	.pay-button {
-		width: 100%;
-		height: 100upx;
-		background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
-		color: #fff;
-		font-size: 36upx;
-		font-weight: 600;
-		border-radius: 50upx;
-		border: none;
-		transition: all 0.3s ease;
-		position: relative;
-		overflow: hidden;
-		
-		&::before {
-			content: '';
-			position: absolute;
-			top: 0;
-			left: 0;
-			right: 0;
-			bottom: 0;
-			background: linear-gradient(135deg, rgba(255, 255, 255, 0.1) 0%, rgba(255, 255, 255, 0.05) 100%);
-			opacity: 0;
-			transition: opacity 0.3s ease;
-		}
-		
-		&:active::before {
-			opacity: 1;
-		}
-		
-		&.disabled {
-			background: linear-gradient(135deg, #e9ecef 0%, #dee2e6 100%);
-			color: #adb5bd;
-			box-shadow: none;
-		}
-		
-		&:not(.disabled):active {
-			transform: scale(0.98);
-		}
-		
-		.button-text {
-			position: absolute;
-			left: 50%;
-			transform: translateX(-50%);
-			font-size: 36upx;
-			font-weight: 600;
-			color: #fff;
-		}
-		
-		.button-amount {
-			position: absolute;
-			right: 30upx;
-			font-size: 36upx;
-			font-weight: 700;
-			color: #fff;
-			font-family: 'Arial', sans-serif;
-		}
-	}
+	bottom: 0;
+	background: #d1d3d9;
+	z-index: 20;
+	box-sizing: border-box;
+}
+
+.pay-keyboard {
+	display: flex;
+	flex-direction: row;
+	align-items: stretch;
+	padding: 12upx;
+	box-sizing: border-box;
+}
+
+.pay-keyboard__keys {
+	flex: 3;
+	display: flex;
+	flex-direction: row;
+	flex-wrap: wrap;
+}
+
+.pay-key {
+	width: 33.333%;
+	height: 108upx;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	box-sizing: border-box;
+	padding: 6upx;
+}
+
+.pay-key__inner {
+	width: 100%;
+	height: 100%;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	background: #fff;
+	border-radius: 12upx;
+	box-shadow: 0 2upx 0 #b8bbc3;
 }
 
+.pay-key:active .pay-key__inner {
+	background: #e8e8e8;
+}
+
+.pay-key__num {
+	font-size: 44upx;
+	font-weight: 500;
+	color: #222;
+	line-height: 1;
+}
+
+.pay-key__del {
+	font-size: 40upx;
+	color: #333;
+	line-height: 1;
+}
 
+.pay-key-pay {
+	flex: 1;
+	margin: 6upx;
+	margin-left: 4upx;
+	border-radius: 12upx;
+	background: #1677ff;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	box-sizing: border-box;
+}
 
+.pay-key-pay--disabled {
+	background: #a0c4ff;
+}
+
+.pay-key-pay:not(.pay-key-pay--disabled):active {
+	background: #0958d9;
+}
+
+.pay-key-pay__text {
+	color: #fff;
+	font-size: 36upx;
+	font-weight: 600;
+	letter-spacing: 4upx;
+}
+
+.pay-safe-area {
+	height: env(safe-area-inset-bottom);
+	background: #d1d3d9;
+}
 </style>

+ 10 - 1
hdh5/api/ghs/index.js

@@ -1,5 +1,14 @@
 import https from '@/plugins/luch-request_0.0.7/request'
 
+/** 未登录扫码付款:按 id+salt 拉取供货商/客户待结信息 */
 export const getGhsData = data => {
 	return https.get('/ghs/get-ghs-data', data)
-}
+}
+
+/**
+ * 供货商余额变动明细(与小程序共用接口)
+ * 登录态:校验 shop 归属;H5 访客:传 salt 校验后可查
+ */
+export const balanceChangeList = data => {
+	return https.get('/ghs-balance-change/list', data)
+}

+ 11 - 0
hdh5/pages.json

@@ -10,6 +10,17 @@
 				}
 			}
 		},
+		{
+			"path": "admin/ghs/balanceChange",
+			"style": {
+				"navigationBarTitleText": "余额变动",
+				"navigationStyle": "custom",
+				"enablePullDownRefresh": true,
+				"h5": {
+					"titleNView": false
+				}
+			}
+		},
 		{
 			"path": "pagesPurchase/gathering",
 			"style": {

File diff suppressed because it is too large
+ 0 - 0
hdh5/unpackage/dist/build/web/assets/_plugin-vue_export-helper.6vb9oaJO.js


File diff suppressed because it is too large
+ 0 - 0
hdh5/unpackage/dist/build/web/assets/_plugin-vue_export-helper.H6AekIpX.js


+ 1 - 1
hdh5/unpackage/dist/build/web/assets/admin-cg-alipay.N9IqAwYO.js → hdh5/unpackage/dist/build/web/assets/admin-cg-alipay.CxZsNMyg.js

@@ -1 +1 @@
-import{s as a,f as e,q as t,c as n,w as s,e as o,k as i,i as r,o as d,d as p}from"./index-CS1sLqOC.js";import{c as l}from"./index.CDovZGC1.js";import{_ as c}from"./_plugin-vue_export-helper.H6AekIpX.js";const h=c({name:"alipay",components:{},mixins:[],data:()=>({payUrl:"",hasRenew:1}),computed:{},onLoad(a){let e=a.orderSn?a.orderSn:"";this.payInit(e)},mounted(){},methods:{init(){},go(){1==this.hasRenew&&(window.location.href=this.payUrl)},payInit(e){if(""==e)return a({title:"没有找到订单编号",icon:"none",duration:1500}),!1;l({orderSn:e}).then((e=>{if(0==e.code)return a({title:e.msg,icon:"none",duration:1500}),!1;this.hasRenew=e.data.hasRenew?e.data.hasRenew:0,e.data.hasRenew&&1==e.data.hasRenew&&(this.payUrl=e.data.payUrl,window.location.href=this.payUrl)}))}}},[["render",function(a,l,c,h,w,u){const m=i,f=r;return d(),e("div",{class:"app-content pay-wrap"},[t("div",{class:"delivery-wrap"},[t("div",{class:"btn-wrap"},[1==w.hasRenew?(d(),n(m,{key:0,class:"button-com red",onClick:l[0]||(l[0]=a=>u.go())},{default:s((()=>[p("正在打开支付宝...")])),_:1})):o("",!0),0==w.hasRenew?(d(),n(f,{key:1,style:{"margin-top":"50upx","font-size":"40upx","font-weight":"bold","text-align":"center"}},{default:s((()=>[p("商家还未开通此功能")])),_:1})):o("",!0)])])])}],["__scopeId","data-v-1045a385"]]);export{h as default};
+import{s as a,j as e,u as t,c as n,w as s,f as o,q as i,i as r,o as d,e as p}from"./index-BBAix273.js";import{c as l}from"./index.DNfuzBGq.js";import{_ as c}from"./_plugin-vue_export-helper.6vb9oaJO.js";const h=c({name:"alipay",components:{},mixins:[],data:()=>({payUrl:"",hasRenew:1}),computed:{},onLoad(a){let e=a.orderSn?a.orderSn:"";this.payInit(e)},mounted(){},methods:{init(){},go(){1==this.hasRenew&&(window.location.href=this.payUrl)},payInit(e){if(""==e)return a({title:"没有找到订单编号",icon:"none",duration:1500}),!1;l({orderSn:e}).then((e=>{if(0==e.code)return a({title:e.msg,icon:"none",duration:1500}),!1;this.hasRenew=e.data.hasRenew?e.data.hasRenew:0,e.data.hasRenew&&1==e.data.hasRenew&&(this.payUrl=e.data.payUrl,window.location.href=this.payUrl)}))}}},[["render",function(a,l,c,h,w,u){const m=i,f=r;return d(),e("div",{class:"app-content pay-wrap"},[t("div",{class:"delivery-wrap"},[t("div",{class:"btn-wrap"},[1==w.hasRenew?(d(),n(m,{key:0,class:"button-com red",onClick:l[0]||(l[0]=a=>u.go())},{default:s((()=>[p("正在打开支付宝...")])),_:1})):o("",!0),0==w.hasRenew?(d(),n(f,{key:1,style:{"margin-top":"50upx","font-size":"40upx","font-weight":"bold","text-align":"center"}},{default:s((()=>[p("商家还未开通此功能")])),_:1})):o("",!0)])])])}],["__scopeId","data-v-1045a385"]]);export{h as default};

+ 1 - 1
hdh5/unpackage/dist/build/web/assets/admin-clear-alipay.rS9y61zB.js → hdh5/unpackage/dist/build/web/assets/admin-clear-alipay.9HtuqQJ6.js

@@ -1 +1 @@
-import{s as a,f as e,q as t,c as n,w as s,e as o,k as i,i as r,o as d,d as p}from"./index-CS1sLqOC.js";import{b as l}from"./index.CDovZGC1.js";import{_ as c}from"./_plugin-vue_export-helper.H6AekIpX.js";const h=c({name:"alipay",components:{},mixins:[],data:()=>({payUrl:"",hasRenew:1}),computed:{},onLoad(a){let e=a.orderSn?a.orderSn:"";this.payInit(e)},mounted(){},methods:{init(){},go(){1==this.hasRenew&&(window.location.href=this.payUrl)},payInit(e){if(""==e)return a({title:"没有找到订单号",icon:"none",duration:1500}),!1;l({orderSn:e}).then((e=>{if(0==e.code)return a({title:e.msg,icon:"none",duration:1500}),!1;this.hasRenew=e.data.hasRenew?e.data.hasRenew:0,e.data.hasRenew&&1==e.data.hasRenew&&(this.payUrl=e.data.payUrl,window.location.href=this.payUrl)}))}}},[["render",function(a,l,c,h,w,u){const m=i,f=r;return d(),e("div",{class:"app-content pay-wrap"},[t("div",{class:"delivery-wrap"},[t("div",{class:"btn-wrap"},[1==w.hasRenew?(d(),n(m,{key:0,class:"button-com red",onClick:l[0]||(l[0]=a=>u.go())},{default:s((()=>[p("正在打开支付宝...")])),_:1})):o("",!0),0==w.hasRenew?(d(),n(f,{key:1,style:{"margin-top":"50upx","font-size":"40upx","font-weight":"bold","text-align":"center"}},{default:s((()=>[p("商家还未开通此功能")])),_:1})):o("",!0)])])])}],["__scopeId","data-v-12a9cc21"]]);export{h as default};
+import{s as a,j as e,u as t,c as n,w as s,f as o,q as i,i as r,o as d,e as p}from"./index-BBAix273.js";import{b as l}from"./index.DNfuzBGq.js";import{_ as c}from"./_plugin-vue_export-helper.6vb9oaJO.js";const h=c({name:"alipay",components:{},mixins:[],data:()=>({payUrl:"",hasRenew:1}),computed:{},onLoad(a){let e=a.orderSn?a.orderSn:"";this.payInit(e)},mounted(){},methods:{init(){},go(){1==this.hasRenew&&(window.location.href=this.payUrl)},payInit(e){if(""==e)return a({title:"没有找到订单号",icon:"none",duration:1500}),!1;l({orderSn:e}).then((e=>{if(0==e.code)return a({title:e.msg,icon:"none",duration:1500}),!1;this.hasRenew=e.data.hasRenew?e.data.hasRenew:0,e.data.hasRenew&&1==e.data.hasRenew&&(this.payUrl=e.data.payUrl,window.location.href=this.payUrl)}))}}},[["render",function(a,l,c,h,w,u){const m=i,f=r;return d(),e("div",{class:"app-content pay-wrap"},[t("div",{class:"delivery-wrap"},[t("div",{class:"btn-wrap"},[1==w.hasRenew?(d(),n(m,{key:0,class:"button-com red",onClick:l[0]||(l[0]=a=>u.go())},{default:s((()=>[p("正在打开支付宝...")])),_:1})):o("",!0),0==w.hasRenew?(d(),n(f,{key:1,style:{"margin-top":"50upx","font-size":"40upx","font-weight":"bold","text-align":"center"}},{default:s((()=>[p("商家还未开通此功能")])),_:1})):o("",!0)])])])}],["__scopeId","data-v-12a9cc21"]]);export{h as default};

File diff suppressed because it is too large
+ 0 - 0
hdh5/unpackage/dist/build/web/assets/admin-ghs-balanceChange.EHeynR2t.js


File diff suppressed because it is too large
+ 0 - 0
hdh5/unpackage/dist/build/web/assets/admin-ghs-pay.CmRIWzbh.js


File diff suppressed because it is too large
+ 0 - 0
hdh5/unpackage/dist/build/web/assets/admin-ghs-pay.IflcH4VK.js


File diff suppressed because it is too large
+ 0 - 0
hdh5/unpackage/dist/build/web/assets/balanceChange-AtjNIdyy.css


File diff suppressed because it is too large
+ 12 - 0
hdh5/unpackage/dist/build/web/assets/index-BBAix273.js


File diff suppressed because it is too large
+ 0 - 0
hdh5/unpackage/dist/build/web/assets/index-BvquTqJD.css


File diff suppressed because it is too large
+ 0 - 12
hdh5/unpackage/dist/build/web/assets/index-CS1sLqOC.js


File diff suppressed because it is too large
+ 0 - 0
hdh5/unpackage/dist/build/web/assets/index-Dzn8UyOo.css


+ 1 - 1
hdh5/unpackage/dist/build/web/assets/index.CDovZGC1.js → hdh5/unpackage/dist/build/web/assets/index.DNfuzBGq.js

@@ -1 +1 @@
-import{h as a}from"./_plugin-vue_export-helper.H6AekIpX.js";const s=async s=>a.post("/purchase/ali-pay",s),e=async s=>a.post("/purchase-clear/ali-pay",s),p=async s=>a.get("/purchase/debt-list",s),c=async s=>a.get("/ghs/detail",s),r=async s=>a.post("/purchase-clear/create-order",s);export{r as a,e as b,s as c,c as g,p};
+import{h as a}from"./_plugin-vue_export-helper.6vb9oaJO.js";const s=async s=>a.post("/purchase/ali-pay",s),e=async s=>a.post("/purchase-clear/ali-pay",s),p=async s=>a.get("/purchase/debt-list",s),c=async s=>a.get("/ghs/detail",s),r=async s=>a.post("/purchase-clear/create-order",s);export{r as a,e as b,s as c,c as g,p};

+ 1 - 0
hdh5/unpackage/dist/build/web/assets/index.DPtqXnrX.js

@@ -0,0 +1 @@
+import{h as e}from"./_plugin-vue_export-helper.6vb9oaJO.js";const g=g=>e.get("/ghs/get-ghs-data",g),s=g=>e.get("/ghs-balance-change/list",g);export{s as b,g};

File diff suppressed because it is too large
+ 0 - 0
hdh5/unpackage/dist/build/web/assets/pagesPurchase-gathering.BHZnxdvl.js


File diff suppressed because it is too large
+ 0 - 0
hdh5/unpackage/dist/build/web/assets/pagesPurchase-gathering.urUf1h8Y.js


File diff suppressed because it is too large
+ 0 - 0
hdh5/unpackage/dist/build/web/assets/pay-DxAIVytI.css


File diff suppressed because it is too large
+ 0 - 0
hdh5/unpackage/dist/build/web/assets/pay-mBXFKWse.css


+ 2 - 2
hdh5/unpackage/dist/build/web/index.html

@@ -16,8 +16,8 @@
 	<script src="/static/web/quill-1.3.7.min.js"></script>
     <!--preload-links-->
     <!--app-context-->
-    <script type="module" crossorigin src="/assets/index-CS1sLqOC.js"></script>
-    <link rel="stylesheet" crossorigin href="/assets/index-Dzn8UyOo.css">
+    <script type="module" crossorigin src="/assets/index-BBAix273.js"></script>
+    <link rel="stylesheet" crossorigin href="/assets/index-BvquTqJD.css">
   </head>
   <body>
     <div id="app"><!--app-html--></div>


+ 3 - 3
hdh5/unpackage/dist/cache/.vite/deps/_metadata.json

@@ -1,8 +1,8 @@
 {
-  "hash": "14fa295b",
-  "configHash": "c15e052d",
+  "hash": "c51d6aff",
+  "configHash": "24fd9046",
   "lockfileHash": "e3b0c442",
-  "browserHash": "5d86e942",
+  "browserHash": "9f6f0388",
   "optimized": {},
   "chunks": {}
 }

File diff suppressed because it is too large
+ 1 - 1
mallh5/unpackage/dist/build/web/assets/index-B5rO03ky.js


+ 1 - 1
mallh5/unpackage/dist/build/web/assets/pages-pay-demo.jXX3xtpy.js → mallh5/unpackage/dist/build/web/assets/pages-pay-demo.TyNY5I7J.js

@@ -1 +1 @@
-import{c as e,w as a,i as o,o as t,a as n}from"./index-BhxOCqMw.js";import{_ as s}from"./_plugin-vue_export-helper.BCo6x5W8.js";const r=s({name:"index",data:()=>({}),computed:{},onLoad(e){},methods:{}},[["render",function(s,r,d,u,i,m){const p=o;return t(),e(p,null,{default:a((()=>[n(" 您好 ")])),_:1})}]]);export{r as default};
+import{c as e,w as a,i as o,o as t,a as n}from"./index-B5rO03ky.js";import{_ as s}from"./_plugin-vue_export-helper.BCo6x5W8.js";const r=s({name:"index",data:()=>({}),computed:{},onLoad(e){},methods:{}},[["render",function(s,r,d,u,i,m){const p=o;return t(),e(p,null,{default:a((()=>[n(" 您好 ")])),_:1})}]]);export{r as default};

File diff suppressed because it is too large
+ 0 - 0
mallh5/unpackage/dist/build/web/assets/pages-pay-index.CMOAWAzv.js


File diff suppressed because it is too large
+ 0 - 0
mallh5/unpackage/dist/build/web/assets/pages-pay-success.JGl4tffq.js


+ 1 - 1
mallh5/unpackage/dist/build/web/index.html

@@ -16,7 +16,7 @@
 	<script src="/static/web/quill-1.3.7.min.js"></script>
     <!--preload-links-->
     <!--app-context-->
-    <script type="module" crossorigin src="/assets/index-BhxOCqMw.js"></script>
+    <script type="module" crossorigin src="/assets/index-B5rO03ky.js"></script>
     <link rel="stylesheet" crossorigin href="/assets/index-Dzn8UyOo.css">
   </head>
   <body>

+ 3 - 3
mallh5/unpackage/dist/cache/.vite/deps/_metadata.json

@@ -1,8 +1,8 @@
 {
-  "hash": "964a26c4",
-  "configHash": "732862a2",
+  "hash": "bd818bf7",
+  "configHash": "0397d4ff",
   "lockfileHash": "e3b0c442",
-  "browserHash": "9fe8f204",
+  "browserHash": "af9be4c9",
   "optimized": {},
   "chunks": {}
 }

+ 2 - 2
pt/dist/web/index.html

@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="referer" content="never"><meta name="renderer" content="webkit"><meta name="viewport" content><link rel="icon" href="/favicon.ico"><link rel="stylesheet" type="text/css" media="print" href="/print-lock.css"><title>花卉宝</title><link href="https://img.wixhb.com/cdn/nprogress/0.2.0/nprogress.min.css" rel="stylesheet"><link href="https://img.wixhb.com/cdn/quill/2.0.0-dev.3/quill.core.min.css" rel="stylesheet"><link href="https://img.wixhb.com/cdn/viewerjs/1.3.7/viewer.min.css" rel="stylesheet"><link href="https://img.wixhb.com/cdn/element-ui/2.13.0/theme-chalk/index.css" rel="stylesheet"><style>html,
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="referer" content="never"><meta name="renderer" content="webkit"><meta name="viewport" content><link rel="icon" href="/favicon.ico"><link rel="stylesheet" type="text/css" media="print" href="/print-lock.css"><title>花卉宝</title><link href="http://img.hzghd.com/cdn/nprogress/0.2.0/nprogress.min.css" rel="stylesheet"><link href="http://img.hzghd.com/cdn/quill/2.0.0-dev.3/quill.core.min.css" rel="stylesheet"><link href="http://img.hzghd.com/cdn/viewerjs/1.3.7/viewer.min.css" rel="stylesheet"><link href="http://img.hzghd.com/cdn/element-ui/2.13.0/theme-chalk/index.css" rel="stylesheet"><style>html,
 			body,
 			#app {
 				height: 100%;
@@ -43,4 +43,4 @@
 			.once .sub-title {
 				color: #ababab;
 				font-size: 12px;
-			}</style><link href="/css/app.97b5310c.css" rel="preload" as="style"><link href="/css/chunk-libs.b57e4bfb.css" rel="preload" as="style"><link href="/js/app.d3e25896.js" rel="preload" as="script"><link href="/js/chunk-libs.7289eda9.js" rel="preload" as="script"><link href="/css/chunk-libs.b57e4bfb.css" rel="stylesheet"><link href="/css/app.97b5310c.css" rel="stylesheet"></head><body><noscript></noscript><div id="app"><div class="once"><div class="container"><div class="title">正在加载资源</div><div class="sub-title">初次加载资源可能需要较多时间 请耐心等待</div></div><div class="footer"><a href="https://www.baidu.com/" target="_blank">花卉宝</a></div></div></div><script src="https://img.wixhb.com/cdn/vue/2.6.10/vue.min.js"></script><script src="https://img.wixhb.com/cdn/vue-router/3.1.3/vue-router.min.js"></script><script src="https://img.wixhb.com/cdn/vuex/3.1.1/vuex.min.js"></script><script src="https://img.wixhb.com/cdn/clipboard.js/2.0.4/clipboard.min.js"></script><script src="https://img.wixhb.com/cdn/axios/0.19.0-beta.1/axios.min.js"></script><script src="https://img.wixhb.com/cdn/nprogress/0.2.0/nprogress.min.js"></script><script src="https://img.wixhb.com/cdn/Mock.js/1.0.1-beta3/mock-min.js"></script><script src="https://img.wixhb.com/cdn/quill/2.0.0-dev.3/quill.min.js"></script><script src="https://img.wixhb.com/cdn/element-ui/2.13.0/index.js"></script><script src="https://img.wixhb.com/cdn/viewerjs/1.3.7/viewer.min.js"></script><script src="https://img.wixhb.com/cdn/echarts/4.4.0-rc.1/echarts.min.js"></script><script src="https://img.wixhb.com/cdn/npm/vue-echarts@4.0.2.js"></script><script src="/js/chunk-libs.7289eda9.js"></script><script src="/js/app.d3e25896.js"></script></body></html>
+			}</style><link href="/css/app.97b5310c.css" rel="preload" as="style"><link href="/css/chunk-libs.b57e4bfb.css" rel="preload" as="style"><link href="/js/app.fa534e4a.js" rel="preload" as="script"><link href="/js/chunk-libs.7289eda9.js" rel="preload" as="script"><link href="/css/chunk-libs.b57e4bfb.css" rel="stylesheet"><link href="/css/app.97b5310c.css" rel="stylesheet"></head><body><noscript></noscript><div id="app"><div class="once"><div class="container"><div class="title">正在加载资源</div><div class="sub-title">初次加载资源可能需要较多时间 请耐心等待</div></div><div class="footer"><a href="https://www.baidu.com/" target="_blank">花卉宝</a></div></div></div><script src="http://img.hzghd.com/cdn/vue/2.6.10/vue.min.js"></script><script src="http://img.hzghd.com/cdn/vue-router/3.1.3/vue-router.min.js"></script><script src="http://img.hzghd.com/cdn/vuex/3.1.1/vuex.min.js"></script><script src="http://img.hzghd.com/cdn/clipboard.js/2.0.4/clipboard.min.js"></script><script src="http://img.hzghd.com/cdn/axios/0.19.0-beta.1/axios.min.js"></script><script src="http://img.hzghd.com/cdn/nprogress/0.2.0/nprogress.min.js"></script><script src="http://img.hzghd.com/cdn/Mock.js/1.0.1-beta3/mock-min.js"></script><script src="http://img.hzghd.com/cdn/quill/2.0.0-dev.3/quill.min.js"></script><script src="http://img.hzghd.com/cdn/element-ui/2.13.0/index.js"></script><script src="http://img.hzghd.com/cdn/viewerjs/1.3.7/viewer.min.js"></script><script src="http://img.hzghd.com/cdn/echarts/4.4.0-rc.1/echarts.min.js"></script><script src="http://img.hzghd.com/cdn/npm/vue-echarts@4.0.2.js"></script><script src="/js/chunk-libs.7289eda9.js"></script><script src="/js/app.fa534e4a.js"></script></body></html>

File diff suppressed because it is too large
+ 0 - 0
pt/dist/web/js/app.fa534e4a.js


Some files were not shown because too many files changed in this diff