From 5a4da0dd1db1727a039bbefc40551525eff6d0fb Mon Sep 17 00:00:00 2001
From: shinnosuke <tantao@1hoper.com>
Date: 星期四, 17 九月 2026 19:16:46 +0800
Subject: [PATCH] 更新....

---
 talent-card-server/src/main/java/com/talentcard/server/business/admin/AdminBusinessService.java |   32 ++++++++++++++++++++++----------
 1 files changed, 22 insertions(+), 10 deletions(-)

diff --git a/talent-card-server/src/main/java/com/talentcard/server/business/admin/AdminBusinessService.java b/talent-card-server/src/main/java/com/talentcard/server/business/admin/AdminBusinessService.java
index c02a939..f806203 100644
--- a/talent-card-server/src/main/java/com/talentcard/server/business/admin/AdminBusinessService.java
+++ b/talent-card-server/src/main/java/com/talentcard/server/business/admin/AdminBusinessService.java
@@ -858,13 +858,13 @@
 				select p.id, p.id as product_id, p.merchant_id, m.merchant_name, m.merchant_type, m.merchant_type_code, m.contact_mobile,
 				       p.product_no, p.product_type, p.product_name, p.subtitle, p.cover_url,
 				       p.original_price, p.sale_price, p.subsidy_amount, p.is_government_subsidy,
-				       p.stock, p.sales_count, p.detail_text, p.benefit_desc, p.purchase_notice,
+				       p.stock, %s, p.detail_text, p.benefit_desc, p.purchase_notice,
 				       p.valid_start_time, p.valid_end_time, p.product_images, p.rights_config,
 				       p.audit_status, p.audit_remark, p.status, p.sort_no, p.submit_time, p.created_at, p.updated_at
 				from merchant_product p
 				left join merchant m on m.id = p.merchant_id
 				where p.deleted = 0 and p.merchant_id = ?
-				""");
+				""".formatted(salesCountSelect("p.id", "p")));
 		StringBuilder countSql = new StringBuilder("""
 				select count(*)
 				from merchant_product p
@@ -913,7 +913,7 @@
 				select r.id, r.product_id, r.merchant_id, m.merchant_name, m.merchant_type, m.merchant_type_code, m.contact_mobile,
 				       r.product_no, r.product_type, r.product_name,
 				       r.subtitle, r.cover_url, r.original_price, r.sale_price, r.subsidy_amount,
-				       r.is_government_subsidy, r.stock, r.sales_count, r.detail_text, r.benefit_desc,
+				       r.is_government_subsidy, r.stock, %s, r.detail_text, r.benefit_desc,
 				       r.purchase_notice, r.valid_start_time, r.valid_end_time, r.product_images, r.rights_config,
 				       r.audit_status, r.audit_remark, r.audit_by, r.audit_time, r.submit_time,
 				       r.source_created_at as created_at, p.status
@@ -921,7 +921,7 @@
 				left join merchant_product p on p.id = r.product_id
 				left join merchant m on m.id = r.merchant_id
 				where r.deleted = 0
-				""");
+				""".formatted(salesCountSelect("r.product_id", "p")));
 		StringBuilder countSql = new StringBuilder("""
 				select count(*)
 				from merchant_product_audit_record r
@@ -980,13 +980,13 @@
 				select p.id, p.merchant_id, m.merchant_name, m.merchant_type, m.merchant_type_code, m.contact_mobile,
 				       p.product_no, p.product_type, p.product_name,
 				       p.subtitle, p.cover_url, p.original_price, p.sale_price, p.subsidy_amount,
-				       p.is_government_subsidy, p.stock, p.sales_count, p.detail_text, p.benefit_desc,
+				       p.is_government_subsidy, p.stock, %s, p.detail_text, p.benefit_desc,
 				       p.purchase_notice, p.valid_start_time, p.valid_end_time, p.product_images, p.rights_config,
 				       p.audit_status, p.audit_remark, p.status, p.sort_no, p.submit_time, p.created_at, p.updated_at
 				from merchant_product p
 				left join merchant m on m.id = p.merchant_id
 				where p.deleted = 0 and p.id = ?
-				""", id);
+				""".formatted(salesCountSelect("p.id", "p")), id);
 	}
 
 	@Transactional(readOnly = true)
@@ -995,7 +995,7 @@
 				select r.id, r.product_id, r.merchant_id, m.merchant_name, m.merchant_type, m.merchant_type_code, m.contact_mobile,
 				       r.product_no, r.product_type, r.product_name, r.subtitle, r.cover_url,
 				       r.original_price, r.sale_price, r.subsidy_amount, r.is_government_subsidy,
-				       r.stock, r.sales_count, r.detail_text, r.benefit_desc, r.purchase_notice,
+				       r.stock, %s, r.detail_text, r.benefit_desc, r.purchase_notice,
 				       r.valid_start_time, r.valid_end_time, r.product_images, r.rights_config,
 				       r.audit_status, r.audit_remark, r.audit_by, r.audit_time, r.submit_time,
 				       r.source_created_at as created_at, p.status
@@ -1003,7 +1003,7 @@
 				left join merchant_product p on p.id = r.product_id
 				left join merchant m on m.id = r.merchant_id
 				where r.deleted = 0 and r.id = ?
-				""", auditRecordId);
+				""".formatted(salesCountSelect("r.product_id", "p")), auditRecordId);
 	}
 
 	@Transactional
@@ -1580,6 +1580,18 @@
 		return Boolean.TRUE.equals(value == null ? defaultValue : value) ? (byte) 1 : (byte) 0;
 	}
 
+	/**
+	 * 团单销量 = 该商品的有效订单数(已支付,且未取消/未退款)。
+	 *
+	 * 商品表上的 sales_count 只在部分流程(如酒店房型预约)里累加,普通团单下单后一直是 0,
+	 * 后台列表就统计不出销量。这里直接按订单算,同时保留 sales_count 作为下限,兼容历史数据。
+	 */
+	String salesCountSelect(String productIdExpression, String productAlias) {
+		return "greatest(coalesce(" + productAlias + ".sales_count, 0), (select count(*) from benefit_order bo"
+				+ " where bo.deleted = 0 and bo.product_id = " + productIdExpression
+				+ " and bo.order_status = 1 and (bo.refund_status is null or bo.refund_status = 0))) as sales_count";
+	}
+
 	private List<Long> couponProductIds(Long couponId) {
 		return jdbcTemplate.queryForList(
 				"select product_id from merchant_coupon_product where coupon_id = ? order by id",
@@ -1589,13 +1601,13 @@
 
 	private List<Map<String, Object>> couponProducts(Long couponId) {
 		return DatabaseRows.normalize(jdbcTemplate.queryForList("""
-				select p.id, p.product_name, p.cover_url, p.sale_price, p.sales_count, p.submit_time, p.created_at,
+				select p.id, p.product_name, p.cover_url, p.sale_price, %s, p.submit_time, p.created_at,
 				       p.audit_status, p.status
 				from merchant_coupon_product cp
 				join merchant_product p on p.id = cp.product_id
 				where cp.coupon_id = ? and p.deleted = 0
 				order by cp.id
-				""", couponId));
+				""".formatted(salesCountSelect("p.id", "p")), couponId));
 	}
 
 	private void syncCouponProducts(Long couponId, List<Long> productIds, String productScope) {

--
Gitblit v1.7.1