فهرست منبع

Merge branch 'after-sale' into dev

shish 2 روز پیش
والد
کامیت
94bfe8f4fe

+ 77 - 15
ghs/src/views/assets/cgItem.vue

@@ -1,3 +1,7 @@
+<!--
+  PC 采购花材排行:与小程序 admin/stat/cgItem 同源 /stat-cg/profit。
+  入库日净量 + 隔天通过日扣数量/金额(可为负);请求参数与小程序对齐。
+-->
 <template>
 	<div class="shop-list">
 		<x-crud @load="onLoad">
@@ -10,15 +14,26 @@
 			</template>
 
             <template #slot-total-amount>
-				<span style="font-size:15px;font-weight:bold;"></span>
+				<div class="cg-total-wrap">
+					<div class="cg-total-nums">
+						<span style="font-size:15px;font-weight:bold;">
+							<span :style="negStyle(totalNum)">{{ formatNum(totalNum) }}</span> 扎
+							¥<span :style="negStyle(totalAmount)">{{ formatNum(totalAmount) }}</span>
+						</span>
+						<span v-if="Number(nextDayDeduct) > 0" style="font-size:15px;font-weight:bold;margin-left:15px;color:#e67e22;">隔天售后扣减:¥{{ formatNum(nextDayDeduct) }}</span>
+					</div>
+					<div class="cg-tip">
+						数量、金额已按售后扣减(隔天售后记在通过日,可为负)。入库日不含隔天退货量。
+					</div>
+				</div>
 			</template>
 
-			<template #table-column-mll="{scope}">
-				<span>{{ scope.row.mll }}%</span>
+			<template #table-column-num="{scope}">
+				<span :style="negStyle(scope.row.num)">{{ formatNum(scope.row.num) }}</span>
         	</template>
 
-			<template #table-column-num="{scope}">
-				<span>{{ scope.row.num?parseFloat(scope.row.num):0 }}</span>
+			<template #table-column-amount="{scope}">
+				<span :style="negStyle(scope.row.amount)">{{ formatNum(scope.row.amount) }}</span>
         	</template>
 
 		</x-crud>
@@ -61,17 +76,49 @@ export default {
             startTime:'',
             endTime:'',
             searchTime:'',
+			/** 与小程序 cgItem 一致:默认按数量排序 */
+			sort: 'num',
             totalAmount:0,
 			totalNum:0,
-			totalMl:0
+			nextDayDeduct:0
 		}
 	},
 	computed: {
 		...mapGetters(['shopInfo']),
 	},
 	methods: {
+		/** 数字展示:不用 truthy,避免负数被当成空 */
+		formatNum(val) {
+			const n = parseFloat(val);
+			return isNaN(n) ? 0 : n;
+		},
+		negStyle(val) {
+			const n = Number(val);
+			return (!isNaN(n) && n < 0) ? 'color:#e74c3c;font-weight:bold;' : '';
+		},
+		/** 与小程序 getStatCgItem 对齐的查询参数 */
+		queryParams(extra) {
+			return {
+				searchTime: this.searchTime,
+				startTime: this.startTime,
+				endTime: this.endTime,
+				sort: this.sort,
+				...(extra || {})
+			};
+		},
+		/** 接口未返回合计时,按列表汇总数量/金额(含负数行) */
+		sumListTotals(list) {
+			let totalNum = 0;
+			let totalAmount = 0;
+			(list || []).forEach((row) => {
+				totalNum += this.formatNum(row.num);
+				totalAmount += this.formatNum(row.amount);
+			});
+			this.totalNum = totalNum;
+			this.totalAmount = Math.round(totalAmount * 100) / 100;
+		},
 		exportData(){
-			this.$service.statCg.getProfit({searchTime:this.searchTime,startTime:this.startTime,endTime:this.endTime,export:1}).then(res => {
+			this.$service.statCg.getProfit(this.queryParams({export:1})).then(res => {
 				if(res.file){
 					window.location.href = res.file
 				}
@@ -81,11 +128,10 @@ export default {
                 this.app = app;
                 ctx.service({
                     page: () => {
-                        return this.$service.statCg.getProfit({searchTime:this.searchTime,startTime:this.startTime,endTime:this.endTime}).then((res) => {
-							this.totalAmount = res.totalAmount||0
-							this.totalMl = res.totalMl||0
-							this.totalNum = res.totalNum||0
-							let list = [...res.list]
+                        return this.$service.statCg.getProfit(this.queryParams()).then((res) => {
+							this.nextDayDeduct = this.formatNum(res.nextDayDeduct)
+							const list = Array.isArray(res.list) ? res.list : Object.keys(res.list || {}).map(k => res.list[k])
+							this.sumListTotals(list)
                             return {
                                 list: list
                             };
@@ -111,7 +157,7 @@ export default {
 						}
 					],
 					op: {
-						visible: true,
+						visible: false,
 						props: {
 							width: 250,
 							align: 'center',
@@ -137,7 +183,7 @@ export default {
             this.searchTime = 'custom'
             this.startTime = this.currentDateList[0]
             this.endTime = this.currentDateList[1]
-            this.app.refresh({searchTime:this.searchTime,startTime:this.startTime,endTime:this.endTime});
+            this.app.refresh(this.queryParams());
         }
 	},
 };
@@ -147,4 +193,20 @@ export default {
 .shop-list {
   height: 100%;
 }
-</style>
+.cg-total-wrap {
+  display: block;
+  width: 100%;
+}
+.cg-total-nums {
+  display: block;
+  line-height: 1.6;
+}
+.cg-tip {
+  display: block;
+  width: 100%;
+  margin-top: 8px;
+  font-size: 13px;
+  color: #1c89e0;
+  line-height: 1.6;
+}
+</style>

+ 70 - 14
ghs/src/views/assets/incomeClass.vue

@@ -1,3 +1,7 @@
+<!--
+  PC 收支分类:与小程序 classProfit 同源 /stat/class-profit(StatSaleClass::classProfile)。
+  采购成本、销售收入已含隔天售后通过日扣减;仅退款含隔天通过日金额。
+-->
 <template>
 	<div class="shop-list">
 		<x-crud @load="onLoad">
@@ -8,6 +12,26 @@
 			<template #slot-export-due>
 				<el-button type="primary" size="mini" style="margin-left:60px;" @click="exportData()">导出数据</el-button>
 			</template>
+			<template #slot-class-tip>
+				<div class="class-tip">
+					采购成本、销售收入已按售后扣减(隔天售后记在通过日,分类成本/收入可为负)。采购仅退款、销售仅退款含隔天通过日金额。
+				</div>
+			</template>
+			<template #table-column-income="{scope}">
+				<div :style="negStyle(scope.row.income)">{{ formatNum(scope.row.income) }}</div>
+			</template>
+			<template #table-column-expend="{scope}">
+				<div :style="negStyle(scope.row.expend)">{{ formatNum(scope.row.expend) }}</div>
+			</template>
+			<template #table-column-profit="{scope}">
+				<div :style="negStyle(scope.row.profit)">{{ formatNum(scope.row.profit) }}</div>
+			</template>
+			<template #table-column-saleNum="{scope}">
+				<div :style="negStyle(scope.row.saleNum)">{{ formatNum(scope.row.saleNum) }}</div>
+			</template>
+			<template #table-column-cgNum="{scope}">
+				<div :style="negStyle(scope.row.cgNum)">{{ formatNum(scope.row.cgNum) }}</div>
+			</template>
 		</x-crud>
 	</div>
 </template>
@@ -55,8 +79,27 @@ export default {
 		...mapGetters(['shopInfo']),
 	},
 	methods: {
+		/** 数字展示:避免 undefined / NaN */
+		formatNum(val) {
+			const n = parseFloat(val);
+			return isNaN(n) ? 0 : n;
+		},
+		/** 负数量/金额标红,突出隔天通过日扣减 */
+		negStyle(val) {
+			const n = Number(val);
+			return (!isNaN(n) && n < 0) ? 'color:#e74c3c;font-weight:bold;' : '';
+		},
+		/** 与小程序 classProfit 相同查询参数 */
+		queryParams(extra) {
+			return {
+				searchTime: this.searchTime,
+				startTime: this.startTime,
+				endTime: this.endTime,
+				...(extra || {})
+			};
+		},
 		exportData(){
-			this.$service.stat.getClassProfit({searchTime:this.searchTime,startTime:this.startTime,endTime:this.endTime,export:1}).then(res => {
+			this.$service.stat.getClassProfit(this.queryParams({export:1})).then(res => {
 				if(res.file){
 					window.location.href = res.file
 				}
@@ -66,15 +109,20 @@ export default {
                 this.app = app;
                 ctx.service({
                     page: () => {
-                        return this.$service.stat.getClassProfit({searchTime:this.searchTime,startTime:this.startTime,endTime:this.endTime}).then((res) => {
+                        return this.$service.stat.getClassProfit(this.queryParams()).then((res) => {
+							const packFreight = this.formatNum(res.packFreight)
+							const onlyRefundCg = this.formatNum(res.onlyRefundCg)
+							const onlyRefund = this.formatNum(res.onlyRefund)
+							const totalLabourCost = this.formatNum(res.totalLabourCost)
+							const totalDiscountAmount = this.formatNum(res.totalDiscountAmount)
 							let list = [
-								...res.list,
-								{className:'物流打包费',income:0,expend:res.packFreight,profit:-res.packFreight,saleNum:0,cgNum:0},
-								{className:'采购仅退款',income:res.onlyRefundCg,expend:0,profit:res.onlyRefundCg,saleNum:0,cgNum:0},
-								{className:'销售仅退款',income:0,expend:res.onlyRefund,profit:-res.onlyRefund,saleNum:0,cgNum:0},
-								{className:'附加人工费',income:res.totalLabourCost,expend:0,profit:res.totalLabourCost,saleNum:0,cgNum:0},
-								{className:'优惠金额',income:-res.totalDiscountAmount,expend:0,profit:-res.totalDiscountAmount,saleNum:0,cgNum:0},
-								{className:'【汇总金额】',income:res.totalIncome,expend:res.totalExpend,profit:res.totalProfit,saleNum:0,cgNum:0}
+								...(res.list || []),
+								{className:'物流打包费',income:0,expend:packFreight,profit:-packFreight,saleNum:0,cgNum:0},
+								{className:'采购仅退款',income:onlyRefundCg,expend:0,profit:onlyRefundCg,saleNum:0,cgNum:0},
+								{className:'销售仅退款',income:0,expend:onlyRefund,profit:-onlyRefund,saleNum:0,cgNum:0},
+								{className:'附加人工费',income:totalLabourCost,expend:0,profit:totalLabourCost,saleNum:0,cgNum:0},
+								{className:'优惠金额',income:-totalDiscountAmount,expend:0,profit:-totalDiscountAmount,saleNum:0,cgNum:0},
+								{className:'【汇总金额】',income:this.formatNum(res.totalIncome),expend:this.formatNum(res.totalExpend),profit:this.formatNum(res.totalProfit),saleNum:0,cgNum:0}
 							]
                             return {
                                 list: list
@@ -116,7 +164,7 @@ export default {
 						},
 					],
 					op: {
-						visible: true,
+						visible: false,
 						props: {
 							width: 250,
 							align: 'center',
@@ -128,12 +176,11 @@ export default {
 				})
 				.set('layout', [
 					[   'slot-date-select',
-                        'slot-order-debt',
 						'slot-export-due',
 						'flex1'
 					],
 					[ 'data-table' ],
-                    ['flex1']
+                    ['slot-class-tip','flex1']
 				])
 				.done();
 			    app.refresh();
@@ -142,7 +189,7 @@ export default {
             this.searchTime = 'custom'
             this.startTime = this.currentDateList[0]
             this.endTime = this.currentDateList[1]
-            this.app.refresh({searchTime:this.searchTime,startTime:this.startTime,endTime:this.endTime});
+            this.app.refresh(this.queryParams());
         }
 	},
 };
@@ -152,4 +199,13 @@ export default {
 .shop-list {
   height: 100%;
 }
-</style>
+.class-tip {
+  display: block;
+  width: 100%;
+  margin-top: 10px;
+  padding: 0 4px;
+  font-size: 13px;
+  color: #1c89e0;
+  line-height: 1.6;
+}
+</style>

+ 67 - 14
ghs/src/views/assets/incomeOutItem.vue

@@ -1,3 +1,7 @@
+<!--
+  PC 花材收支明细:与 /stat/income-out-item(StatSaleClass::incomeOutItem)对齐。
+  销售/采购均按隔天售后通过日扣减(数量与金额可为负);仅退款含隔天通过日金额。
+-->
 <template>
 	<div class="shop-list">
 		<x-crud @load="onLoad">
@@ -8,6 +12,26 @@
 			<template #slot-export-due>
 				<el-button type="primary" size="mini" style="margin-left:60px;" @click="exportData()">导出数据</el-button>
 			</template>
+			<template #slot-item-tip>
+				<div class="item-tip">
+					采购成本、销售收入已按售后扣减(隔天售后记在通过日,花材成本/收入/数量可为负)。采购仅退款、销售仅退款含隔天通过日金额。
+				</div>
+			</template>
+			<template #table-column-income="{scope}">
+				<div :style="negStyle(scope.row.income)">{{ formatNum(scope.row.income) }}</div>
+			</template>
+			<template #table-column-expend="{scope}">
+				<div :style="negStyle(scope.row.expend)">{{ formatNum(scope.row.expend) }}</div>
+			</template>
+			<template #table-column-profit="{scope}">
+				<div :style="negStyle(scope.row.profit)">{{ formatNum(scope.row.profit) }}</div>
+			</template>
+			<template #table-column-inNum="{scope}">
+				<div :style="negStyle(scope.row.inNum)">{{ formatNum(scope.row.inNum) }}</div>
+			</template>
+			<template #table-column-outNum="{scope}">
+				<div :style="negStyle(scope.row.outNum)">{{ formatNum(scope.row.outNum) }}</div>
+			</template>
 		</x-crud>
 	</div>
 </template>
@@ -55,8 +79,24 @@ export default {
 		...mapGetters(['shopInfo']),
 	},
 	methods: {
+		formatNum(val) {
+			const n = parseFloat(val);
+			return isNaN(n) ? 0 : n;
+		},
+		negStyle(val) {
+			const n = Number(val);
+			return (!isNaN(n) && n < 0) ? 'color:#e74c3c;font-weight:bold;' : '';
+		},
+		queryParams(extra) {
+			return {
+				searchTime: this.searchTime,
+				startTime: this.startTime,
+				endTime: this.endTime,
+				...(extra || {})
+			};
+		},
 		exportData(){
-			this.$service.stat.getIncomeOutItem({searchTime:this.searchTime,startTime:this.startTime,endTime:this.endTime,export:1}).then(res => {
+			this.$service.stat.getIncomeOutItem(this.queryParams({export:1})).then(res => {
 				if(res.file){
 					window.location.href = res.file
 				}
@@ -66,15 +106,20 @@ export default {
                 this.app = app;
                 ctx.service({
                     page: () => {
-                        return this.$service.stat.getIncomeOutItem({searchTime:this.searchTime,startTime:this.startTime,endTime:this.endTime}).then((res) => {
+                        return this.$service.stat.getIncomeOutItem(this.queryParams()).then((res) => {
+							const packFreight = this.formatNum(res.packFreight)
+							const onlyRefundCg = this.formatNum(res.onlyRefundCg)
+							const onlyRefund = this.formatNum(res.onlyRefund)
+							const totalLabourCost = this.formatNum(res.totalLabourCost)
+							const totalDiscountAmount = this.formatNum(res.totalDiscountAmount)
 							let list = [
-								...res.list,
-								{name:'物流打包费',income:0,expend:res.packFreight,profit:-res.packFreight,inNum:0,outNum:0},
-								{name:'采购仅退款',income:res.onlyRefundCg,expend:0,profit:res.onlyRefundCg,inNum:0,outNum:0},
-								{name:'销售仅退款',income:0,expend:res.onlyRefund,profit:-res.onlyRefund,inNum:0,outNum:0},
-								{name:'附加人工费',income:res.totalLabourCost,expend:0,profit:res.totalLabourCost,inNum:0,outNum:0},
-								{name:'优惠金额',income:-res.totalDiscountAmount,expend:0,profit:-res.totalDiscountAmount,inNum:0,outNum:0},
-								{name:'【汇总金额】',income:res.totalIncome,expend:res.totalExpend,profit:res.totalProfit,inNum:0,outNum:0}
+								...(res.list || []),
+								{name:'物流打包费',income:0,expend:packFreight,profit:-packFreight,inNum:0,outNum:0},
+								{name:'采购仅退款',income:onlyRefundCg,expend:0,profit:onlyRefundCg,inNum:0,outNum:0},
+								{name:'销售仅退款',income:0,expend:onlyRefund,profit:-onlyRefund,inNum:0,outNum:0},
+								{name:'附加人工费',income:totalLabourCost,expend:0,profit:totalLabourCost,inNum:0,outNum:0},
+								{name:'优惠金额',income:-totalDiscountAmount,expend:0,profit:-totalDiscountAmount,inNum:0,outNum:0},
+								{name:'【汇总金额】',income:this.formatNum(res.totalIncome),expend:this.formatNum(res.totalExpend),profit:this.formatNum(res.totalProfit),inNum:0,outNum:0}
 							]
                             return {
                                 list: list
@@ -116,7 +161,7 @@ export default {
 						},
 					],
 					op: {
-						visible: true,
+						visible: false,
 						props: {
 							width: 250,
 							align: 'center',
@@ -128,12 +173,11 @@ export default {
 				})
 				.set('layout', [
 					[   'slot-date-select',
-                        'slot-order-debt',
 						'slot-export-due',
 						'flex1'
 					],
 					[ 'data-table' ],
-                    ['flex1']
+                    ['slot-item-tip','flex1']
 				])
 				.done();
 			    app.refresh();
@@ -142,7 +186,7 @@ export default {
             this.searchTime = 'custom'
             this.startTime = this.currentDateList[0]
             this.endTime = this.currentDateList[1]
-            this.app.refresh({searchTime:this.searchTime,startTime:this.startTime,endTime:this.endTime});
+            this.app.refresh(this.queryParams());
         }
 	},
 };
@@ -152,4 +196,13 @@ export default {
 .shop-list {
   height: 100%;
 }
-</style>
+.item-tip {
+  display: block;
+  width: 100%;
+  margin-top: 10px;
+  padding: 0 4px;
+  font-size: 13px;
+  color: #1c89e0;
+  line-height: 1.6;
+}
+</style>

+ 73 - 14
ghs/src/views/assets/itemSale.vue

@@ -1,3 +1,7 @@
+<!--
+  PC 花材销量:与小程序 productSale 同源 /stat-item/show。
+  支付日净销量 + 隔天通过日扣数量/金额(可为负);仅退款只扣金额。
+-->
 <template>
 	<div class="shop-list">
 		<x-crud @load="onLoad">
@@ -12,15 +16,35 @@
 			</template>
 
             <template #slot-total-amount>
-				<span style="font-size:15px;font-weight:bold;">{{totalNum}} 扎 ¥{{ totalAmount }} 总毛利 {{ totalMl }}</span>
+				<div class="sale-total-wrap">
+					<div class="sale-total-nums">
+						<span style="font-size:15px;font-weight:bold;">
+							<span :style="negStyle(totalNum)">{{ formatNum(totalNum) }}</span> 扎
+							¥<span :style="negStyle(totalAmount)">{{ formatNum(totalAmount) }}</span>
+							总毛利 <span :style="negStyle(totalMl)">{{ formatNum(totalMl) }}</span>
+						</span>
+						<span v-if="Number(nextDayDeduct) > 0" style="font-size:15px;font-weight:bold;margin-left:15px;color:#e67e22;">隔天售后扣减:¥{{ formatNum(nextDayDeduct) }}</span>
+					</div>
+					<div class="sale-tip">
+						数量、金额、毛利已按售后扣减(隔天售后记在通过日,可为负)。仅退款只扣金额不扣扎数。
+					</div>
+				</div>
 			</template>
 
 			<template #table-column-mll="{scope}">
-				<span>{{ scope.row.mll }}%</span>
+				<span>{{ formatNum(scope.row.mll) }}%</span>
         	</template>
 
 			<template #table-column-num="{scope}">
-				<span>{{ scope.row.num?parseFloat(scope.row.num):0 }}</span>
+				<span :style="negStyle(scope.row.num)">{{ formatNum(scope.row.num) }}</span>
+        	</template>
+
+			<template #table-column-amount="{scope}">
+				<span :style="negStyle(scope.row.amount)">{{ formatNum(scope.row.amount) }}</span>
+        	</template>
+
+			<template #table-column-gross="{scope}">
+				<span :style="negStyle(scope.row.gross)">{{ formatNum(scope.row.gross) }}</span>
         	</template>
 
 		</x-crud>
@@ -65,15 +89,34 @@ export default {
             searchTime:'',
             totalAmount:0,
 			totalNum:0,
-			totalMl:0
+			totalMl:0,
+			nextDayDeduct:0
 		}
 	},
 	computed: {
 		...mapGetters(['shopInfo']),
 	},
 	methods: {
+		/** 数字展示:不用 truthy,避免负数被当成空 */
+		formatNum(val) {
+			const n = parseFloat(val);
+			return isNaN(n) ? 0 : n;
+		},
+		negStyle(val) {
+			const n = Number(val);
+			return (!isNaN(n) && n < 0) ? 'color:#e74c3c;font-weight:bold;' : '';
+		},
+		/** 与小程序 productSale 对齐的查询参数 */
+		queryParams(extra) {
+			return {
+				searchTime: this.searchTime,
+				startTime: this.startTime,
+				endTime: this.endTime,
+				...(extra || {})
+			};
+		},
 		exportData(){
-			this.$service.statItem.getShow({searchTime:this.searchTime,startTime:this.startTime,endTime:this.endTime,export:1}).then(res => {
+			this.$service.statItem.getShow(this.queryParams({export:1})).then(res => {
 				if(res.file){
 					window.location.href = res.file
 				}
@@ -83,11 +126,12 @@ export default {
                 this.app = app;
                 ctx.service({
                     page: () => {
-                        return this.$service.statItem.getShow({searchTime:this.searchTime,startTime:this.startTime,endTime:this.endTime}).then((res) => {
-							this.totalAmount = res.totalAmount||0
-							this.totalMl = res.totalMl||0
-							this.totalNum = res.totalNum||0
-							let list = [...res.list]
+                        return this.$service.statItem.getShow(this.queryParams()).then((res) => {
+							this.totalAmount = this.formatNum(res.totalAmount)
+							this.totalMl = this.formatNum(res.totalMl)
+							this.totalNum = this.formatNum(res.totalNum)
+							this.nextDayDeduct = this.formatNum(res.nextDayDeduct)
+							const list = Array.isArray(res.list) ? res.list : Object.keys(res.list || {}).map(k => res.list[k])
                             return {
                                 list: list
                             };
@@ -123,7 +167,7 @@ export default {
 						}
 					],
 					op: {
-						visible: true,
+						visible: false,
 						props: {
 							width: 250,
 							align: 'center',
@@ -135,7 +179,6 @@ export default {
 				})
 				.set('layout', [
 					[   'slot-date-select',
-                        'slot-order-debt',
                         'slot-export-due',
 						'flex1'
 					],
@@ -149,7 +192,7 @@ export default {
             this.searchTime = 'custom'
             this.startTime = this.currentDateList[0]
             this.endTime = this.currentDateList[1]
-            this.app.refresh({searchTime:this.searchTime,startTime:this.startTime,endTime:this.endTime});
+            this.app.refresh(this.queryParams());
         }
 	},
 };
@@ -159,4 +202,20 @@ export default {
 .shop-list {
   height: 100%;
 }
-</style>
+.sale-total-wrap {
+  display: block;
+  width: 100%;
+}
+.sale-total-nums {
+  display: block;
+  line-height: 1.6;
+}
+.sale-tip {
+  display: block;
+  width: 100%;
+  margin-top: 8px;
+  font-size: 13px;
+  color: #1c89e0;
+  line-height: 1.6;
+}
+</style>

+ 71 - 5
ghs/src/views/custom/account.vue

@@ -1,3 +1,6 @@
+<!--
+  PC 应收统计:未扣隔天金额 / 隔天售后金额 / 已扣隔天金额 三分列,便于对照。
+-->
 <template>
 	<div class="shop-list">
 		<x-crud @load="onLoad">
@@ -15,13 +18,30 @@
 			</template>
 
             <template #slot-total-amount>
-				<span style="font-size:15px;font-weight:bold;">累计金额:{{ totalAmount }}</span>
+				<div class="yj-total-wrap">
+					<div class="yj-total-nums">
+						<span style="font-size:15px;font-weight:bold;">未扣隔天:¥{{ formatNum(totalOriginAmount) }}</span>
+						<span v-if="Number(nextDayDeduct) > 0" style="font-size:15px;font-weight:bold;margin-left:15px;color:#e67e22;">隔天售后:¥{{ formatNum(nextDayDeduct) }}</span>
+						<span :style="numStyle(totalAmount, true)">已扣隔天:¥{{ formatNum(totalAmount) }}</span>
+					</div>
+					<div class="yj-total-tip">
+						<div>未扣隔天=开单实付合计;隔天售后=通过日扣减额;已扣隔天=未扣隔天−隔天售后(可为负;订单数不减)。</div>
+					</div>
+				</div>
 			</template>
 
 			<template #slot-export-due>
 				<el-button type="primary" size="mini" style="margin-left:60px;" @click="exportDue()">导出数据</el-button>
 			</template>
 
+			<template #table-column-amount="{scope}">
+				<div :style="negOnly(scope.row.amount)">{{ formatNum(scope.row.amount) }}</div>
+			</template>
+
+			<template #table-column-nextDayAmount="{scope}">
+				<div :style="Number(scope.row.nextDayAmount) > 0 ? 'color:#e67e22;font-weight:bold;' : ''">{{ formatNum(scope.row.nextDayAmount) }}</div>
+			</template>
+
 		</x-crud>
 	</div>
 </template>
@@ -62,7 +82,9 @@ export default {
             startTime:'',
             endTime:'',
             searchTime:'',
+            totalOriginAmount:0,
             totalAmount:0,
+			nextDayDeduct:0,
             debt:'-1'
 		};
 	},
@@ -70,6 +92,22 @@ export default {
 		...mapGetters(['shopInfo']),
 	},
 	methods: {
+		formatNum(val) {
+			const n = parseFloat(val);
+			return isNaN(n) ? 0 : n;
+		},
+		numStyle(val, withMargin) {
+			const n = Number(val);
+			const base = 'font-size:15px;font-weight:bold;' + (withMargin ? 'margin-left:15px;' : '');
+			if (!isNaN(n) && n < 0) {
+				return base + 'color:#e74c3c;';
+			}
+			return base;
+		},
+		negOnly(val) {
+			const n = Number(val);
+			return (!isNaN(n) && n < 0) ? 'color:#e74c3c;font-weight:bold;' : '';
+		},
 		exportDue(){
 			this.$service.order.getAccountList({searchTime:this.searchTime,startTime:this.startTime,endTime:this.endTime,debt:this.debt,export:1}).then(res => {
 				if(res.file){
@@ -82,9 +120,11 @@ export default {
                 ctx.service({
                     page: () => {
                         return this.$service.order.getAccountList({searchTime:this.searchTime,startTime:this.startTime,endTime:this.endTime,debt:this.debt}).then((res) => {
-                            this.totalAmount = res.totalAmount ? res.totalAmount : 0
+                            this.totalOriginAmount = this.formatNum(res.totalOriginAmount)
+                            this.totalAmount = this.formatNum(res.totalAmount)
+							this.nextDayDeduct = this.formatNum(res.nextDayDeduct)
                             return {
-                                list: res.list
+                                list: res.list || []
                             };
                         });
                     }
@@ -107,7 +147,17 @@ export default {
 							align: 'center',
 						},
 						{
-							label: '金额',
+							label: '未扣隔天金额',
+							prop: 'originAmount',
+							align: 'center',
+						},
+						{
+							label: '隔天售后金额',
+							prop: 'nextDayAmount',
+							align: 'center',
+						},
+						{
+							label: '已扣隔天金额',
 							prop: 'amount',
 							align: 'center',
 						}
@@ -154,4 +204,20 @@ export default {
 .shop-list {
   height: 100%;
 }
-</style>
+.yj-total-wrap {
+  display: block;
+  width: 100%;
+}
+.yj-total-nums {
+  display: block;
+  line-height: 1.6;
+}
+.yj-total-tip {
+  display: block;
+  width: 100%;
+  margin-top: 10px;
+  font-size: 13px;
+  color: #1c89e0;
+  line-height: 1.6;
+}
+</style>

+ 58 - 10
ghs/src/views/custom/yj.vue

@@ -1,3 +1,6 @@
+<!--
+  PC 客户业绩:按账单时间汇总开单;隔天售后按通过日扣实际金额并计入退款(与小程序 customSale 对齐)。
+-->
 <template>
 	<div class="shop-list">
 		<x-crud @load="onLoad">
@@ -17,14 +20,23 @@
 			
 
             <template #slot-total-amount>
-				<span style="font-size:15px;font-weight:bold;">订单数:{{ totalNum }}</span>
-				<span style="font-size:15px;font-weight:bold;margin-left:15px;">订单金额:¥{{ totalOrderPrice }}</span>
-				<span style="font-size:15px;font-weight:bold;margin-left:15px;">退款金额:¥{{ totalTkPrice }}</span>
-				<span style="font-size:15px;font-weight:bold;margin-left:15px;">(仅退款金额:¥{{ totalOnlyTkPrice }})</span>
-				<span style="font-size:15px;font-weight:bold;margin-left:15px;">实际金额:¥{{ totalActPrice }}</span>
-				<span style="font-size:15px;font-weight:bold;margin-left:15px;">含(纸箱:{{ totalCartonNum }}个 ¥{{ totalCarton }}</span>
-				<span style="font-size:15px;font-weight:bold;margin-left:15px;">打包费:¥{{ totalPack }}</span>
-				<span style="font-size:15px;font-weight:bold;margin-left:15px;">运费:¥{{ totalFreight }})</span>
+				<div class="yj-total-wrap">
+					<div class="yj-total-nums">
+						<span style="font-size:15px;font-weight:bold;">订单数:{{ totalNum }}</span>
+						<span style="font-size:15px;font-weight:bold;margin-left:15px;">订单金额:¥{{ totalOrderPrice }}</span>
+						<span style="font-size:15px;font-weight:bold;margin-left:15px;">退款金额:¥{{ totalTkPrice }}</span>
+						<span style="font-size:15px;font-weight:bold;margin-left:15px;">(仅退款金额:¥{{ totalOnlyTkPrice }})</span>
+						<span :style="numStyle(totalActPrice, true)">实际金额:¥{{ totalActPrice }}</span>
+						<span style="font-size:15px;font-weight:bold;margin-left:15px;">含(纸箱:{{ totalCartonNum }}个 ¥{{ totalCarton }}</span>
+						<span style="font-size:15px;font-weight:bold;margin-left:15px;">打包费:¥{{ totalPack }}</span>
+						<span style="font-size:15px;font-weight:bold;margin-left:15px;">运费:¥{{ totalFreight }})</span>
+						<span v-if="Number(nextDayDeduct) > 0" style="font-size:15px;font-weight:bold;margin-left:15px;color:#e67e22;">隔天售后扣减:¥{{ nextDayDeduct }}</span>
+					</div>
+					<div class="yj-total-tip">
+						<div>实际金额、退款已按售后扣减(隔天售后记在通过日,实际金额可为负;订单数不减)。</div>
+						<div>纸箱/打包/运费仍按开单日剩余数量统计。</div>
+					</div>
+				</div>
 			</template>
 
 			<template #slot-export-data>
@@ -36,7 +48,11 @@
 			</template>
 
 			<template #table-column-tkPrice="{scope}">
-				<div style="cursor: pointer;" @click.stop="getTkDetail(scope.row)">{{ scope.row.tkPrice?parseFloat(scope.row.tkPrice):0 }}</div>
+				<div :style="numStyle(scope.row.tkPrice)" style="cursor: pointer;" @click.stop="getTkDetail(scope.row)">{{ formatNum(scope.row.tkPrice) }}</div>
+			</template>
+
+			<template #table-column-actPrice="{scope}">
+				<div :style="numStyle(scope.row.actPrice)">{{ formatNum(scope.row.actPrice) }}</div>
 			</template>
 
 		</x-crud>
@@ -88,6 +104,7 @@ export default {
 			totalTkPrice:0,
 			totalOnlyTkPrice:0,
 			totalNum:0,
+			nextDayDeduct:0,
             debt:'-1'
 		};
 	},
@@ -95,6 +112,20 @@ export default {
 		...mapGetters(['shopInfo']),
 	},
 	methods: {
+		/** 金额展示:空当 0 */
+		formatNum(val) {
+			const n = parseFloat(val);
+			return isNaN(n) ? 0 : n;
+		},
+		/** 负金额标红,便于识别隔天通过日扣减 */
+		numStyle(val, withMargin) {
+			const n = Number(val);
+			const neg = !isNaN(n) && n < 0;
+			if (withMargin) {
+				return 'font-size:15px;font-weight:bold;margin-left:15px;' + (neg ? 'color:#e74c3c;' : '');
+			}
+			return neg ? 'color:#e74c3c;font-weight:bold;' : '';
+		},
 		goChange(data){
 			let query = {};
 			query.customName = data.name
@@ -128,6 +159,7 @@ export default {
 							this.totalTkPrice = res.totalTkPrice ? res.totalTkPrice : 0
 							this.totalOnlyTkPrice = res.totalOnlyTkPrice?res.totalOnlyTkPrice:0
 							this.totalNum = res.totalNum?res.totalNum:0
+							this.nextDayDeduct = res.nextDayDeduct ? res.nextDayDeduct : 0
                             return {
                                 list: res.list
                             };
@@ -233,4 +265,20 @@ export default {
 .shop-list {
   height: 100%;
 }
-</style>
+.yj-total-wrap {
+  display: block;
+  width: 100%;
+}
+.yj-total-nums {
+  display: block;
+  line-height: 1.6;
+}
+.yj-total-tip {
+  display: block;
+  width: 100%;
+  margin-top: 10px;
+  font-size: 13px;
+  color: #1c89e0;
+  line-height: 1.6;
+}
+</style>

+ 71 - 5
ghs/src/views/in/due.vue

@@ -1,3 +1,6 @@
+<!--
+  PC 应付统计:未扣隔天金额 / 隔天售后金额 / 已扣隔天金额 三分列,便于对照。
+-->
 <template>
 	<div class="shop-list">
 		<x-crud @load="onLoad">
@@ -15,13 +18,30 @@
 			</template>
 
             <template #slot-total-amount>
-				<span style="font-size:15px;font-weight:bold;">累计金额:{{ totalAmount }}</span>
+				<div class="yj-total-wrap">
+					<div class="yj-total-nums">
+						<span style="font-size:15px;font-weight:bold;">未扣隔天:¥{{ formatNum(totalOriginAmount) }}</span>
+						<span v-if="Number(nextDayDeduct) > 0" style="font-size:15px;font-weight:bold;margin-left:15px;color:#e67e22;">隔天售后:¥{{ formatNum(nextDayDeduct) }}</span>
+						<span :style="numStyle(totalAmount, true)">已扣隔天:¥{{ formatNum(totalAmount) }}</span>
+					</div>
+					<div class="yj-total-tip">
+						<div>未扣隔天=入库实付合计;隔天售后=通过日扣减额;已扣隔天=未扣隔天−隔天售后(可为负;订单数不减)。</div>
+					</div>
+				</div>
 			</template>
 
 			<template #slot-export-due>
 				<el-button type="primary" size="mini" style="margin-left:60px;" @click="exportDue()">导出数据</el-button>
 			</template>
 
+			<template #table-column-amount="{scope}">
+				<div :style="negOnly(scope.row.amount)">{{ formatNum(scope.row.amount) }}</div>
+			</template>
+
+			<template #table-column-nextDayAmount="{scope}">
+				<div :style="Number(scope.row.nextDayAmount) > 0 ? 'color:#e67e22;font-weight:bold;' : ''">{{ formatNum(scope.row.nextDayAmount) }}</div>
+			</template>
+
 		</x-crud>
 	</div>
 </template>
@@ -62,7 +82,9 @@ export default {
             startTime:'',
             endTime:'',
             searchTime:'',
+            totalOriginAmount:0,
             totalAmount:0,
+			nextDayDeduct:0,
             debt:'0'
 		};
 	},
@@ -70,6 +92,22 @@ export default {
 		...mapGetters(['shopInfo']),
 	},
 	methods: {
+		formatNum(val) {
+			const n = parseFloat(val);
+			return isNaN(n) ? 0 : n;
+		},
+		numStyle(val, withMargin) {
+			const n = Number(val);
+			const base = 'font-size:15px;font-weight:bold;' + (withMargin ? 'margin-left:15px;' : '');
+			if (!isNaN(n) && n < 0) {
+				return base + 'color:#e74c3c;';
+			}
+			return base;
+		},
+		negOnly(val) {
+			const n = Number(val);
+			return (!isNaN(n) && n < 0) ? 'color:#e74c3c;font-weight:bold;' : '';
+		},
 		exportDue(){
 			this.$service.purchaseOrder.dueList({searchTime:this.searchTime,startTime:this.startTime,endTime:this.endTime,debt:this.debt,export:1}).then(res => {
 				if(res.file){
@@ -82,9 +120,11 @@ export default {
                 ctx.service({
                     page: () => {
                         return this.$service.purchaseOrder.dueList({searchTime:this.searchTime,startTime:this.startTime,endTime:this.endTime,debt:this.debt}).then((res) => {
-                            this.totalAmount = res.totalAmount ? res.totalAmount : 0
+                            this.totalOriginAmount = this.formatNum(res.totalOriginAmount)
+                            this.totalAmount = this.formatNum(res.totalAmount)
+							this.nextDayDeduct = this.formatNum(res.nextDayDeduct)
                             return {
-                                list: res.list
+                                list: res.list || []
                             };
                         });
                     }
@@ -107,7 +147,17 @@ export default {
 							align: 'center',
 						},
 						{
-							label: '金额',
+							label: '未扣隔天金额',
+							prop: 'originAmount',
+							align: 'center',
+						},
+						{
+							label: '隔天售后金额',
+							prop: 'nextDayAmount',
+							align: 'center',
+						},
+						{
+							label: '已扣隔天金额',
 							prop: 'amount',
 							align: 'center',
 						}
@@ -154,4 +204,20 @@ export default {
 .shop-list {
   height: 100%;
 }
-</style>
+.yj-total-wrap {
+  display: block;
+  width: 100%;
+}
+.yj-total-nums {
+  display: block;
+  line-height: 1.6;
+}
+.yj-total-tip {
+  display: block;
+  width: 100%;
+  margin-top: 10px;
+  font-size: 13px;
+  color: #1c89e0;
+  line-height: 1.6;
+}
+</style>

+ 68 - 19
ghs/src/views/in/yj.vue

@@ -1,3 +1,7 @@
+<!--
+  PC 供货业绩:与小程序 cgStat 同源 /stat-cg-ghs/profile;
+  隔天采购售后按通过日扣实际金额(可为负,订单数不减)。
+-->
 <template>
 	<div class="shop-list">
 		<x-crud @load="onLoad">
@@ -15,14 +19,23 @@
 			</template>
 
             <template #slot-total-amount>
-				<span style="font-size:15px;font-weight:bold;">订单数:{{ totalNum }}</span>
-				<span style="font-size:15px;font-weight:bold;margin-left:15px;">订单金额:{{ totalOrderPrice }}</span>
-				<span style="font-size:15px;font-weight:bold;margin-left:15px;">退款金额:{{ totalTkPrice }}</span>
-				<span style="font-size:15px;font-weight:bold;margin-left:15px;">(仅退款金额:{{ totalOnlyTkPrice }})</span>
-				<span style="font-size:15px;font-weight:bold;margin-left:15px;">实际金额:{{ totalActPrice }}</span>
-				<span style="font-size:15px;font-weight:bold;margin-left:15px;">含(纸箱:{{ totalCarton }}</span>
-				<span style="font-size:15px;font-weight:bold;margin-left:15px;">打包费:{{ totalPack }}</span>
-				<span style="font-size:15px;font-weight:bold;margin-left:15px;">运费:{{ totalFreight }})</span>
+				<div class="yj-total-wrap">
+					<div class="yj-total-nums">
+						<span style="font-size:15px;font-weight:bold;">订单数:{{ totalNum }}</span>
+						<span style="font-size:15px;font-weight:bold;margin-left:15px;">订单金额:{{ totalOrderPrice }}</span>
+						<span style="font-size:15px;font-weight:bold;margin-left:15px;">退款金额:{{ totalTkPrice }}</span>
+						<span style="font-size:15px;font-weight:bold;margin-left:15px;">(仅退款金额:{{ totalOnlyTkPrice }})</span>
+						<span :style="numStyle(totalActPrice, true)">实际金额:{{ totalActPrice }}</span>
+						<span style="font-size:15px;font-weight:bold;margin-left:15px;">含(纸箱:{{ totalCarton }}</span>
+						<span style="font-size:15px;font-weight:bold;margin-left:15px;">打包费:{{ totalPack }}</span>
+						<span style="font-size:15px;font-weight:bold;margin-left:15px;">运费:{{ totalFreight }})</span>
+						<span v-if="Number(nextDayDeduct) > 0" style="font-size:15px;font-weight:bold;margin-left:15px;color:#e67e22;">隔天售后扣减:¥{{ nextDayDeduct }}</span>
+					</div>
+					<div class="yj-total-tip">
+						<div>金额已按售后扣减(隔天售后记在通过日,可为负;订单数不减)。</div>
+						<div>纸箱/打包/运费仍按入库日剩余数量统计。</div>
+					</div>
+				</div>
 			</template>
 
 			<template #slot-export-data>
@@ -34,7 +47,11 @@
 			</template>
 
 			<template #table-column-tkPrice="{scope}">
-				<div style="cursor: pointer;" @click.stop="getTkDetail(scope.row)">{{ scope.row.tkPrice?parseFloat(scope.row.tkPrice):0 }}</div>
+				<div :style="numStyle(scope.row.tkPrice)" style="cursor: pointer;" @click.stop="getTkDetail(scope.row)">{{ formatNum(scope.row.tkPrice) }}</div>
+			</template>
+
+			<template #table-column-actPrice="{scope}">
+				<div :style="numStyle(scope.row.actPrice)">{{ formatNum(scope.row.actPrice) }}</div>
 			</template>
 
 		</x-crud>
@@ -85,6 +102,7 @@ export default {
 			totalTkPrice:0,
 			totalOnlyTkPrice:0,
 			totalNum:0,
+			nextDayDeduct:0,
             debt:'0'
 		};
 	},
@@ -92,6 +110,20 @@ export default {
 		...mapGetters(['shopInfo']),
 	},
 	methods: {
+		/** 数字展示:不用 truthy,避免 0/负数被当成空 */
+		formatNum(val) {
+			const n = parseFloat(val);
+			return isNaN(n) ? 0 : n;
+		},
+		/** 负金额标红,与小程序 cgStat 一致 */
+		numStyle(val, withMargin) {
+			const n = Number(val);
+			const neg = !isNaN(n) && n < 0;
+			if (withMargin) {
+				return 'font-size:15px;font-weight:bold;margin-left:15px;' + (neg ? 'color:#e74c3c;' : '');
+			}
+			return neg ? 'color:#e74c3c;font-weight:bold;' : '';
+		},
 		getTkDetail(info){
 			let query = {ghsId:info.id,ghsName:info.name,searchTime:this.searchTime,startTime:this.startTime,endTime:this.endTime,status:1};
 			this.$router.push({ path: '/in/refund-list', query })
@@ -117,16 +149,17 @@ export default {
                 ctx.service({
                     page: () => {
                         return this.$service.statCgGhs.getProfile({searchTime:this.searchTime,startTime:this.startTime,endTime:this.endTime,debt:this.debt}).then((res) => {
-                            this.totalActPrice = res.totalActPrice ? res.totalActPrice : 0
-							this.totalOrderPrice = res.totalOrderPrice ? res.totalOrderPrice : 0
-							this.totalCarton = res.totalCarton ? res.totalCarton : 0
-							this.totalPack = res.totalPack ? res.totalPack : 0
-							this.totalFreight = res.totalFreight ? res.totalFreight : 0
-							this.totalTkPrice = res.totalTkPrice ? res.totalTkPrice : 0
-							this.totalOnlyTkPrice = res.totalOnlyTkPrice ? res.totalOnlyTkPrice:0
-							this.totalNum = res.totalNum?res.totalNum:0
+                            this.totalActPrice = this.formatNum(res.totalActPrice)
+							this.totalOrderPrice = this.formatNum(res.totalOrderPrice)
+							this.totalCarton = this.formatNum(res.totalCarton)
+							this.totalPack = this.formatNum(res.totalPack)
+							this.totalFreight = this.formatNum(res.totalFreight)
+							this.totalTkPrice = this.formatNum(res.totalTkPrice)
+							this.totalOnlyTkPrice = this.formatNum(res.totalOnlyTkPrice)
+							this.totalNum = this.formatNum(res.totalNum)
+							this.nextDayDeduct = this.formatNum(res.nextDayDeduct)
                             return {
-                                list: res.list
+                                list: res.list || []
                             };
                         });
                     }
@@ -220,4 +253,20 @@ export default {
 .shop-list {
   height: 100%;
 }
-</style>
+.yj-total-wrap {
+  display: block;
+  width: 100%;
+}
+.yj-total-nums {
+  display: block;
+  line-height: 1.6;
+}
+.yj-total-tip {
+  display: block;
+  width: 100%;
+  margin-top: 10px;
+  font-size: 13px;
+  color: #1c89e0;
+  line-height: 1.6;
+}
+</style>

+ 24 - 15
ghsApp/src/admin/clear/info.vue

@@ -81,21 +81,10 @@
 					</tui-list-cell>
 				</div>
 			</view>
-			<view class="content-box price-detail" v-if="!$util.isEmpty(detailInfo.remark)">
-				<div class="module-com input-line-wrap">
-					<tui-list-cell class="line-cell" :hover="false">
-						<div class="tui-title">备注</div>
-						<input
-							:disabled="true"
-							v-model="detailInfo.remark"
-							placeholder-class="phcolor"
-							class="tui-input"
-							name="name"
-							maxlength="50"
-							type="text"
-						/>
-					</tui-list-cell>
-				</div>
+			<!-- 备注只读展示:多行文本卡片,避免禁用 input 观感差、长文截断 -->
+			<view class="content-box remark-card" v-if="!$util.isEmpty(detailInfo.remark)">
+				<view class="remark-label">备注</view>
+				<text class="remark-text">{{ detailInfo.remark }}</text>
 			</view>
 
 			<view class="title">
@@ -345,6 +334,26 @@ export default {
 		margin-top: 20upx;
 		margin-bottom: 20upx;
 	}
+	/* 结账单备注:浅底卡片 + 自动换行,与金额区风格区分开 */
+	.remark-card {
+		margin-top: 20upx;
+		margin-bottom: 20upx;
+		padding: 24upx 28upx;
+		.remark-label {
+			color: #999999;
+			font-size: 24upx;
+			line-height: 1.4;
+			margin-bottom: 12upx;
+		}
+		.remark-text {
+			display: block;
+			color: #333333;
+			font-size: 28upx;
+			line-height: 1.55;
+			word-break: break-all;
+			white-space: pre-wrap;
+		}
+	}
 	.detail-price_box {
 		color: #333333;
 		font-size: 22upx;

+ 11 - 10
ghsApp/src/admin/ghs/balanceChange.vue

@@ -77,10 +77,6 @@ export default {
 		hasText(val) {
 			return val !== undefined && val !== null && String(val).trim() !== ''
 		},
-		isPurchaseClearRow(row) {
-			const event = String(row.event || '')
-			return Number(row.relateId) > 0 && event.indexOf('采购单结账') === 0
-		},
 		mapListItem(item, amountDisplay) {
 			const row = Object.assign({}, item)
 			row.amount = amountDisplay
@@ -98,8 +94,13 @@ export default {
 				row.timeLine = ''
 			}
 			row.balanceText = this.formatMoney(row.balance)
-			row.showClearLink = this.isPurchaseClearRow(row)
-			row.clearLinkText = row.showClearLink ? '查看结账单' : ''
+			const clearSn = row.clearSn || ''
+			const clearAmt = this.formatMoney(row.clearAmount)
+			// 与客户余额变动一致:有 clearId 或 clearSn 即展示「结账单 · 本单销」
+			row.showClearLink = Number(row.clearId) > 0 || this.hasText(clearSn)
+			row.clearLinkText = row.showClearLink
+				? ('结账单 ' + clearSn + ' · 本单销' + clearAmt + '元')
+				: ''
 			row.showStaff = this.hasText(row.staffName)
 			row.showRemark = this.hasText(row.remark)
 			row.showExtraRow = row.showClearLink
@@ -123,13 +124,13 @@ export default {
 			this.completes(res)
 		},
 		goDetail(item) {
-			if (this.isPurchaseClearRow(item)) {
-				this.$util.pageTo({ url: '/admin/clear/info?id=' + item.relateId })
+			if (Number(item.clearId) > 0) {
+				this.$util.pageTo({ url: '/admin/clear/info?id=' + item.clearId })
 			}
 		},
 		goClear(item) {
-			if (Number(item.relateId) > 0) {
-				this.$util.pageTo({ url: '/admin/clear/info?id=' + item.relateId })
+			if (Number(item.clearId) > 0) {
+				this.$util.pageTo({ url: '/admin/clear/info?id=' + item.clearId })
 			}
 		}
 	},

+ 8 - 0
ghsApp/src/api/ghs/index.js

@@ -12,6 +12,14 @@ export const changeGhsName = data => {
 	return https.get('/ghs/modify-name', data)
 }
 
+/**
+ * 按采购挂账单重算并回写供货商待结笔数
+ * @param {{ id: number }} data 供货商 id
+ */
+export const refreshDebtNum = data => {
+	return https.get('/ghs/refresh-debt-num', data)
+}
+
 /** *
  * 供货商列表 姜枫 2021.04.01  ghs/add
  */

+ 6 - 6
ghsApp/src/components/forward-options-popup.vue

@@ -33,14 +33,14 @@ export default {
 			}
 			if (this.mode === 'purchase') {
 				if (this.orderCleared) {
-					return '采购单已结清,本次售后不减实付,只会算今天退款;金额将退回采购账户余额。'
+					return '采购单已结清,本次售后不减实付,只会算今天退款;金额将退回采购账户余额。'
 				}
 				return '本次售后不减采购实付,只会算作今天退款;金额将退回采购账户余额。'
 			}
 			if (this.orderCleared) {
-				return '订单已结账,本次售后不减订单实付,只会算今天退款;资金将原路退回。'
+				return '订单已结账,本次售后不减订单实付,只会算今天退款;资金将原路退回。'
 			}
-			return '本次售后不减订单实付,只会算今天退款;资金将原路退回。'
+			return '本次售后不减订单实付,只会算今天退款;资金将原路退回。'
 		}
 	},
 	methods: {
@@ -82,10 +82,10 @@ export default {
 	margin-bottom: 16upx;
 }
 .tip {
-	font-size: 34upx;
+	font-size: 38upx;
 	color: #666;
-	line-height: 1.5;
-	margin-bottom: 28upx;
+	line-height: 1.6;
+	margin-bottom: 60upx;
 }
 .btns {
 	display: flex;

+ 39 - 2
ghsApp/src/pagesArrears/detailsItem.vue

@@ -5,6 +5,8 @@
 			<text class="iconfont iconweixuanzhong" v-else> </text>
 		</view>
 		<view class="details-main">
+			<!-- 右上角脱离文档流,不挤占价格行宽 -->
+			<view class="detail-btn" @click.stop="goToDetai(info)">查看明细</view>
 			<view class="item-header">
 				<text class="name">单号 {{info.orderSn}} </text>
 			</view>
@@ -13,12 +15,18 @@
 			</view>
 			<view class="item-row">
 				<view :class="[Number(info.debtPrice)>Number(info.remainDebtPrice) ? 'price-del' : 'price']">¥{{ parseFloat(info.debtPrice || info.remainDebtPrice) }}</view>
-				<view class="price" style="border:1upx solid #67a0f7;border-radius:10upx;font-weight:normal;color:#3385FF;font-size:32upx;width:180upx;height:80upx;justify-content:center;" @click.stop="goToDetai(info)">查看明细</view>
+			</view>
+			<!-- 售后退款单独成行:当天 / 隔天,对齐 pagesGys/detailsItem -->
+			<view class="item-row" v-if="Number(info.tkPrice)>0">
+				<view class="refund-tip refund-tip-same">当天售后 ¥{{info.tkPrice?parseFloat(info.tkPrice):0}}</view>
+			</view>
+			<view class="item-row" v-if="Number(info.nextDayTkPrice)>0">
+				<view class="refund-tip refund-tip-next">隔天售后 ¥{{parseFloat(info.nextDayTkPrice)}}</view>
 			</view>
 			<view class="item-row" v-if="!$util.isEmpty(info.remark)">
 				<view class="remark">{{ info.remark }}</view>
 			</view>
-			<view class="item-row" v-if="Number(info.debtPrice)>Number(info.remainDebtPrice)">
+			<view class="item-row" v-if="Number(info.debtPrice)>Number(info.remainDebtPrice) && Number(info.clearId)>0">
 				<view class="price" style="color:red;">已清 ¥{{ info.hasPayDebt }},剩余待结 ¥{{ parseFloat(info.remainDebtPrice) }}</view>
 			</view>
 		</view>
@@ -74,6 +82,25 @@ export default {
 	}
 	.details-main {
 		flex: 1;
+		position: relative;
+		// 给右上角「查看明细」留空,避免单号被挡住
+		padding-right: 200upx;
+	}
+	.detail-btn {
+		position: absolute;
+		top: 0;
+		right: 0;
+		z-index: 2;
+		width: 180upx;
+		height: 80upx;
+		border: 1upx solid #67a0f7;
+		border-radius: 10upx;
+		font-size: 32upx;
+		font-weight: normal;
+		color: #3385FF;
+		display: flex;
+		align-items: center;
+		justify-content: center;
 	}
 	.item-header {
 		display: flex;
@@ -126,6 +153,16 @@ export default {
 			color: #333333;
 			text-decoration: line-through;
 		}
+		.refund-tip {
+			font-size: 26upx;
+			font-weight: normal;
+		}
+		.refund-tip-same {
+			color: red;
+		}
+		.refund-tip-next {
+			color: #e67e22;
+		}
 	}
 }
 </style>

+ 53 - 12
ghsApp/src/pagesGys/details.vue

@@ -63,10 +63,17 @@
 						<view class="flex">合计金额:{{selectTotalAmount}}</view>
 						<view class="flex">实付金额:<input @focus="modifyPrice = null" v-model="modifyPrice" type="digit"/></view>
 						<view class="flex">优惠金额:{{(selectTotalAmount - modifyPrice).toFixed(2)}}</view>
-						<view class="flex">支付方式:
-							<picker mode="selector" :value="payWay" :range="payWayList" range-key="name" @change="changePayWayFn" class="tui-input" >
-							<div style="border:1upx solid #CCCCCC;width:300upx;height:70upx;line-height:70upx;">{{ payWayData.name }}</div>
-							</picker>
+						<view class="pay-way-row">
+							<view class="pay-way-label">支付方式:</view>
+							<view class="pay-way-btns">
+								<button
+									v-for="item in payWayList"
+									:key="item.id"
+									class="admin-button-com middle pay-way-btn"
+									:class="payWay === item.id ? 'blue' : 'default'"
+									@click="selectPayWay(item)"
+								>{{ item.name }}</button>
+							</view>
 						</view>
 					</view>
 				</view>
@@ -101,7 +108,6 @@ export default {
 			searchTime:'',
 			startTime:'',
 			endTime:'',
-			payWayData:{name:"线下微信",id:0},
 			payWayList:[{name:"线下微信",id:0},{name:"现金",id:4},{name:"线下支付宝",id:1},{name:"银行卡",id:5}],
 			payWay:0,
 			confirm:-1
@@ -138,7 +144,13 @@ export default {
 			if (this.detailsList) {
 				for (const item of this.detailsList) {
 					if (item.checked) {
-						amount=amount+Number(item.realPrice);
+						// 结账合计用剩余待结;无字段时回落 actPrice/realPrice
+						const remain = Number(item.remainDebtPrice)
+						if (remain > 0) {
+							amount = amount + remain
+						} else {
+							amount = amount + Number(item.actPrice || item.realPrice || 0)
+						}
 					}
 				}
 			}
@@ -168,10 +180,12 @@ export default {
 		init(){
 
 		},
-		changePayWayFn(e) {
-			let info = this.payWayList[e.detail.value]
-			this.payWay = info.id
-			this.payWayData = info
+		/** 结账弹窗:点选支付方式(替代原生 picker) */
+		selectPayWay(item) {
+			if (!item) {
+				return
+			}
+			this.payWay = item.id
 		},
 		selectDateFn(val){
 			this.searchTime = val.searchTime
@@ -426,9 +440,10 @@ export default {
 		.num_bx {
 			margin-top:30upx;
 			margin-bottom:50upx;
-			margin-left:80upx;
+			margin-left:40upx;
+			margin-right:40upx;
 			view{
-				height: 80upx;
+				min-height: 80upx;
 				font-size: 28upx;
 			}
 			input {
@@ -440,6 +455,32 @@ export default {
 				font-size: 35upx;
 				width:300upx;
 			}
+			.pay-way-row {
+				display: flex;
+				align-items: flex-start;
+				min-height: auto;
+				margin-top: 10upx;
+				.pay-way-label {
+					flex-shrink: 0;
+					line-height: 70upx;
+					min-height: auto;
+				}
+				.pay-way-btns {
+					flex: 1;
+					display: flex;
+					flex-wrap: wrap;
+					align-items: center;
+					min-height: auto;
+				}
+				.pay-way-btn {
+					margin: 0 12upx 12upx 0;
+					padding: 0 20upx;
+					min-width: 140upx;
+					height: 64upx;
+					line-height: 64upx;
+					font-size: 26upx;
+				}
+			}
 		}
 	}
 }

+ 79 - 13
ghsApp/src/pagesGys/detailsItem.vue

@@ -5,6 +5,8 @@
 			<text class="iconfont iconweixuanzhong" v-else> </text>
 		</view>
 		<view class="details-main">
+			<!-- 右上角脱离文档流,不挤占价格/售后文案行宽 -->
+			<view class="detail-btn" @click.stop="goToDetai(info)">查看明细</view>
 			<view class="item-header">
 				<text class="name">
 					{{info.orderSn}}
@@ -21,15 +23,26 @@
 			</view>
 			<view class="item-row">
 				<view class="price" style="color:#3385FF;">
-					<text>¥{{ parseFloat(info.realPrice) }}</text>
-					<text v-if="Number(info.tkPrice)>0" style="margin-left:30upx;color:red;">已退¥{{info.tkPrice?parseFloat(info.tkPrice):0}}</text>
+					<text :class="[hasPartialClear ? 'price-del' : '']">¥{{ parseFloat(displayDebtPrice) }}</text>
 				</view>
-				<view class="price" style="border:1upx solid #67a0f7;border-radius:10upx;font-weight:normal;color:#3385FF;font-size:32upx;width:180upx;height:80upx;justify-content:center;" @click.stop="goToDetai(info)">查看明细</view>
+			</view>
+			<!-- 售后退款单独成行,不与挂账价格挤在同一行 -->
+			<view class="item-row" v-if="Number(info.tkPrice)>0">
+				<view class="refund-tip refund-tip-same">当天售后 ¥{{info.tkPrice?parseFloat(info.tkPrice):0}}</view>
+			</view>
+			<view class="item-row" v-if="Number(info.nextDayTkPrice)>0">
+				<view class="refund-tip refund-tip-next">隔天售后 ¥{{parseFloat(info.nextDayTkPrice)}}</view>
+			</view>
+			<view class="item-row" v-if="hasPartialClear">
+				<view class="price" style="color:red;">已清 ¥{{ hasPayDebt }},剩余待结 ¥{{ parseFloat(remainDebtPrice) }}</view>
 			</view>
 		</view>
 	</view>
 </template>
 <script>
+/**
+ * 供货商采购挂账明细行:支持已清/剩余待结展示(对齐 pagesArrears/detailsItem)
+ */
 export default {
 	props: {
 		info: {
@@ -44,6 +57,32 @@ export default {
 			default: false
 		}
 	},
+	computed: {
+		remainDebtPrice() {
+			const remain = Number(this.info.remainDebtPrice)
+			if (remain > 0) {
+				return remain
+			}
+			return Number(this.info.actPrice || this.info.realPrice || 0)
+		},
+		displayDebtPrice() {
+			const debt = Number(this.info.debtPrice)
+			if (debt > 0) {
+				return debt
+			}
+			return this.remainDebtPrice
+		},
+		hasPayDebt() {
+			if (this.info.hasPayDebt != null && Number(this.info.hasPayDebt) > 0) {
+				return parseFloat(Number(this.info.hasPayDebt).toFixed(2))
+			}
+			const diff = this.displayDebtPrice - this.remainDebtPrice
+			return diff > 0 ? parseFloat(diff.toFixed(2)) : 0
+		},
+		hasPartialClear() {
+			return this.displayDebtPrice > this.remainDebtPrice
+		}
+	},
 	methods: {
 		goToDetai(item){
 			this.$util.pageTo({
@@ -79,6 +118,25 @@ export default {
 	}
 	.details-main {
 		flex: 1;
+		position: relative;
+		// 给右上角「查看明细」留空,避免单号被挡住
+		padding-right: 200upx;
+	}
+	.detail-btn {
+		position: absolute;
+		top: 0;
+		right: 0;
+		z-index: 2;
+		width: 180upx;
+		height: 80upx;
+		border: 1upx solid #67a0f7;
+		border-radius: 10upx;
+		font-size: 32upx;
+		font-weight: normal;
+		color: #3385FF;
+		display: flex;
+		align-items: center;
+		justify-content: center;
 	}
 	.item-header {
 		display: flex;
@@ -101,22 +159,30 @@ export default {
 		display: flex;
 		align-items: center;
 		justify-content: space-between;
-
 		.mark {
-			font-size: 28upx;
-			font-weight: 400;
-			color: #666666;
+			font-size: 26upx;
+			color: #666;
 		}
 		.price {
+			font-size: 32upx;
+			font-weight: 600;
 			display: flex;
 			align-items: center;
-			font-size: 28upx;
+		}
+		.price-del {
+			text-decoration: line-through;
+			color: #999 !important;
 			font-weight: 600;
-			color: #333333;
-			.iconfont {
-				font-size: 28upx;
-				color: #999999;
-			}
+		}
+		.refund-tip {
+			font-size: 26upx;
+			font-weight: normal;
+		}
+		.refund-tip-same {
+			color: red;
+		}
+		.refund-tip-next {
+			color: #e67e22;
 		}
 	}
 }

+ 105 - 7
ghsApp/src/pagesPurchase/info.vue

@@ -71,19 +71,36 @@
 
 			<view class="bills-info_box content-box" style="margin-top:18upx;">
 				<view class="order-info_box" v-if="detailInfo.debt == 1">
-				<view>订单状态:</view>
+					<view>订单状态:</view>
 					<view style="color:red;font-weight:bold;">挂账</view>
 					<view class="price">
 						<button class="admin-button-com outline-action" @click="goToClear(detailInfo)">全部挂账</button>
 					</view>
 				</view>
 				<view class="order-info_box" v-else>
-				<view>订单状态:</view>
-					<view v-if="detailInfo.clearId > 0">已结清</view>
-					<view class="price" v-if="detailInfo.clearId > 0">
-					<button @click="pageTo({url: '/admin/clear/info',query: {id: detailInfo.clearId}})" class="admin-button-com outline-action">查看结账单</button>
+					<view>订单状态:</view>
+					<!-- clearId=1 仅结账痕迹;真实结账单用 orderClearList 或 clearId>1 -->
+					<view v-if="hasPurchaseCleared">已结清</view>
+					<view class="price" v-if="Number(detailInfo.clearId) > 1 && $util.isEmpty(detailInfo.orderClearList)">
+						<button @click="goClearBill({ clearId: detailInfo.clearId })" class="admin-button-com outline-action">查看结账单</button>
+					</view>
+					<view v-else></view>
+				</view>
+				<!-- 结账信息:列出每笔结账单及金额,点击进结账单详情看操作人 -->
+				<view class="order-info_box order-clear-bills" v-if="!$util.isEmpty(detailInfo.orderClearList)">
+					<view class="order-clear-bills__label">结账信息:</view>
+					<view class="order-clear-bills__links">
+						<view
+							v-for="(bill, billIndex) in detailInfo.orderClearList"
+							:key="billIndex"
+							class="order-clear-bills__link"
+							:class="{ 'order-clear-bills__link--first': billIndex === 0 }"
+							@click.stop="goClearBill(bill)"
+						>
+							<text class="order-clear-bills__sn">{{ formatClearBillLabel(bill) }}</text>
+							<text v-if="Number(bill.amount) > 0" class="order-clear-bills__amt">¥{{ parseFloat(bill.amount) }}</text>
+						</view>
 					</view>
-					<view v-if="detailInfo.clearId == 0"></view>          
 				</view>
 			</view>
 
@@ -356,6 +373,19 @@ export default {
 			const tk = Number(this.detailInfo.tkPrice || 0)
 			const next = Number(this.detailInfo.nextDayTkPrice || 0)
 			return parseFloat((tk + next).toFixed(2))
+		},
+		/**
+		 * 是否展示「已结清」:非挂账,且已有结账单列表结清 / clearId 痕迹 / 剩余待结为 0
+		 */
+		hasPurchaseCleared() {
+			const info = this.detailInfo || {}
+			if (Number(info.debt) === 1) {
+				return false
+			}
+			if (!this.$util.isEmpty(info.orderClearList) && Number(info.remainDebtPrice) <= 0) {
+				return true
+			}
+			return Number(info.clearId) > 0
 		}
   	},
 	mixins: [productMins],
@@ -627,6 +657,25 @@ export default {
 				url: '/pagesGys/details?id='+item.ghsId
 			})
 		},
+		/**
+		 * 跳转采购结账单详情(看操作人、金额)
+		 */
+		goClearBill(item) {
+			const id = item && item.clearId ? item.clearId : 0
+			// clearId=1 仅为结账痕迹,不是真实结账单主键
+			if (!id || Number(id) <= 1) {
+				return
+			}
+			this.pageTo({ url: '/admin/clear/info', query: { id } })
+		},
+		/**
+		 * 结账单短文案:前缀「结账单」+ clearSn 后四位(对齐 pagesOrder/detail)
+		 */
+		formatClearBillLabel(bill) {
+			const sn = bill && bill.clearSn != null ? String(bill.clearSn) : ''
+			const tail = sn ? sn.slice(-4) : ''
+			return '结账单' + tail
+		},
 		modifyRemark(){
 			const self = this;
 			let remark = this.detailInfo.remark
@@ -814,7 +863,6 @@ export default {
 	}
 	.bills-info_box {
 		padding: 30upx 20upx 30upx;
-		// border-bottom: 1upx solid #EEEEEE;
 		& > .order-info_box {
 			display: flex;
 			align-items: center;
@@ -828,6 +876,8 @@ export default {
 			}
 			& > view:nth-child(2) {
 				color: #333333;
+				flex: 1;
+				margin-left: 20upx;
 			}
 			& > .price {
 				flex: 1;
@@ -836,6 +886,7 @@ export default {
 				display: flex;
 				align-items: center;
 				justify-content: flex-end;
+				font-weight: 600;
 				& .iconxiangyou {
 					color: #999999;
 					font-size: 25upx;
@@ -843,6 +894,53 @@ export default {
 				}
 			}
 		}
+		/* 结账信息:与第一条结账单顶对齐 */
+		& > .order-info_box.order-clear-bills {
+			align-items: flex-start;
+			margin-top: 16upx;
+		}
+	}
+	.order-clear-bills__label {
+		font-size: 26upx;
+		line-height: 40upx;
+		font-weight: 400;
+		color: #999999;
+		width: 135upx;
+		text-align: right;
+		flex-shrink: 0;
+	}
+	.order-clear-bills__links {
+		flex: 1;
+		display: flex;
+		flex-direction: column;
+		min-width: 0;
+		margin-left: 20upx;
+	}
+	.order-clear-bills__link {
+		display: flex;
+		flex-direction: row;
+		align-items: center;
+		box-sizing: border-box;
+		width: 100%;
+		color: #3385ff;
+		line-height: 40upx;
+		margin-top: 12upx;
+	}
+	.order-clear-bills__link--first {
+		margin-top: 0;
+	}
+	.order-clear-bills__sn {
+		color: #3385ff;
+		font-size: 28upx;
+		font-weight: 400;
+		line-height: 40upx;
+	}
+	.order-clear-bills__amt {
+		color: #3385ff;
+		font-size: 28upx;
+		margin-left: 18upx;
+		font-weight: 400;
+		line-height: 40upx;
 	}
 	.content-box {
 		background-color: #ffffff;

+ 2 - 2
ghsApp/src/pagesPurchase/refund.vue

@@ -45,8 +45,8 @@
 			<view class="refund-label">订单金额:</view>
 			<view class="list">
 				¥{{parseFloat(orderInfo.actPrice || orderInfo.orderPrice)||0}}
-				<text style="margin-left:25upx;font-size:25upx;color:green;" v-if="Number(orderInfo.tkPrice)>0">当天已退¥{{orderInfo.tkPrice ? parseFloat(orderInfo.tkPrice) : 0}}</text>
-				<text style="margin-left:15upx;font-size:25upx;color:#e6a23c;" v-if="Number(orderInfo.nextDayTkPrice)>0">隔天已退¥{{parseFloat(orderInfo.nextDayTkPrice)}}</text>
+				<text style="margin-left:25upx;font-size:25upx;color:green;" v-if="Number(orderInfo.tkPrice)>0">当天售后 ¥{{orderInfo.tkPrice ? parseFloat(orderInfo.tkPrice) : 0}}</text>
+				<text style="margin-left:15upx;font-size:25upx;color:#e6a23c;" v-if="Number(orderInfo.nextDayTkPrice)>0">隔天售后 ¥{{parseFloat(orderInfo.nextDayTkPrice)}}</text>
 			</view>
 		</view>
 		<view class="flex refund-item">

+ 38 - 15
ghsApp/src/pagesPurchase/supplier.vue

@@ -57,11 +57,12 @@
               <!-- 下拉菜单内容 -->
               <view class="more-dropdown" v-if="activeMenuId === item.id">
                 <view class="dropdown-item" hover-class="none" @click.stop="handleDebtChangeFromMenu(item)">
-                  <text class="dropdown-icon">📋</text>
                   <text class="dropdown-text">挂账变动明细(废弃)</text>
                 </view>
-                <view class="dropdown-item" hover-class="none" @click.stop="handleDeleteFromMenu(item)">
-                  <text class="dropdown-icon">🗑</text>
+                <view class="dropdown-item" hover-class="none" @click.stop="handleRefreshDebtNum(item)">
+                  <text class="dropdown-text">待结笔数刷新</text>
+                </view>
+                <view class="dropdown-item dropdown-item-danger" hover-class="none" @click.stop="handleDeleteFromMenu(item)">
                   <text class="dropdown-text">删除供货商</text>
                 </view>
               </view>
@@ -84,9 +85,9 @@
           <!-- 记录信息区(中部,非删除状态显示) -->
           <view class="record-section" v-if="isNormalList">
             <view class="record-buttons">
+              <view class="record-btn" hover-class="none" @click.stop="cgList(item)">采购记录</view>
               <view class="record-btn" hover-class="none" @click.stop="pageTo({ url: '/admin/clear/list?ghsId='+item.id})">结账记录</view>
               <view class="record-btn" hover-class="none" @click.stop="getBalanceList(item)">余额变动明细</view>
-              <view class="record-btn" hover-class="none" @click.stop="cgList(item)">采购记录</view>
             </view>
           </view>
 
@@ -174,7 +175,7 @@
 <script>
 import Tabs from "@/components/plugin/tabs";
 import AppWrapperEmpty from "@/components/app-wrapper-empty";
-import { getList, changeGhsName, changeLocationFn, changeDelStatus } from "@/api/ghs";
+import { getList, changeGhsName, changeLocationFn, changeDelStatus, refreshDebtNum } from "@/api/ghs";
 import AppSearchModule from "@/components/module/app-search";
 import ModalModule from "@/components/plugin/modal";
 import { list } from "@/mixins";
@@ -257,7 +258,7 @@ export default {
       if (bal < 0) {
         return Math.abs(bal)
       }
-      return parseFloat(item.debtAmount || 0)
+      return 0
     },
     // 是否有待结:金额优先,避免「N 笔 0 元」仍展示
     hasSupplierPending(item) {
@@ -326,6 +327,29 @@ export default {
       this.activeMenuId = null
       this.getDebtList(item)
     },
+    /**
+     * 更多菜单:按采购挂账单重算该供货商待结笔数并更新列表展示
+     */
+    handleRefreshDebtNum(item) {
+      this.activeMenuId = null
+      if (!item || !item.id) {
+        return
+      }
+      const oldNum = parseInt(item.debtNum || 0, 10) || 0
+      refreshDebtNum({ id: item.id }).then(res => {
+        if (res.code != 1) {
+          return
+        }
+        const debtNum = parseInt((res.data && res.data.debtNum) || 0, 10) || 0
+        this.$set(item, 'debtNum', debtNum)
+        // 页头总笔数仅统计有待结金额的供货商,本行无待结金额时不改总笔数
+        if (this.info && this.isNormalList && this.hasSupplierPending(item)) {
+          const total = parseInt(this.info.totalDebtNum || 0, 10) || 0
+          this.$set(this.info, 'totalDebtNum', Math.max(0, total + (debtNum - oldNum)))
+        }
+        this.$msg('已刷新')
+      })
+    },
     init() {
       this.getGhsList()
     },
@@ -711,20 +735,18 @@ export default {
               transition: background-color 0.2s ease;
               
               &:active {
+                background-color: #f5f7fa;
+              }
+
+              // 删除项按压反馈用红色,与普通菜单项区分
+              &.dropdown-item-danger:active {
                 background-color: #ffeef0;
                 
-                .dropdown-text, .dropdown-icon {
+                .dropdown-text {
                   color: #ff4d4f;
                 }
               }
               
-              .dropdown-icon {
-                font-size: 26upx;
-                color: #999;
-                margin-right: 12upx;
-                flex-shrink: 0;
-              }
-              
               .dropdown-text {
                 font-size: 26upx;
                 color: #555;
@@ -818,7 +840,8 @@ export default {
             background-color: #e8f1ff;
             border: 1upx solid #c5daf5;
             border-radius: 8upx;
-            padding: 14upx 0;
+            // 原 padding 14upx,上下各 +2 共增高 4upx,flex 保证文字垂直居中
+            padding: 16upx 0;
             cursor: pointer;
             margin-right: 16upx;
             transition: all 0.2s ease;