From 71a0235a576f96adc37d62c1056fd74a593dc4fa Mon Sep 17 00:00:00 2001
From: shinnosuke <tantao@1hoper.com>
Date: 星期一, 24 八月 2026 14:12:27 +0800
Subject: [PATCH] feat: adapt fuel stores and medical product audit details

---
 talent-card-server/src/main/java/com/talentcard/server/business/admin/AdminBusinessService.java |   53 ++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 52 insertions(+), 1 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 4a5304f..d199cb3 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
@@ -322,7 +322,7 @@
 				       merchant.logo_url, merchant.cover_url, merchant.address, merchant.business_status, merchant.longitude,
 				       merchant.latitude, merchant.can_login_merchant_app, merchant.group_buying_enabled, merchant.usage_instructions,
 				       merchant.rights_text, merchant.merchant_rights_config, merchant.service_label, merchant.is_recommend,
-				       merchant.sort_no, merchant.status, merchant.created_at, merchant.updated_at,
+				       merchant.sort_no, merchant.status, merchant.created_at, merchant.updated_at, merchant.merchant_type_code,
 				       s.external_link_type as car_wash_external_link_type,
 				       s.external_mini_program_app_id as car_wash_external_mini_program_app_id,
 				       s.external_mini_program_path as car_wash_external_mini_program_path,
@@ -340,6 +340,14 @@
 				where merchant_id = ?
 				order by sort_no, id
 				""", id)));
+		if ("fuel".equals(String.valueOf(result.get("merchantTypeCode")))) {
+			result.put("applicableStores", DatabaseRows.normalize(jdbcTemplate.queryForList("""
+					select id, store_name, address, longitude, latitude
+					from transport_fuel_store
+					where merchant_id = ? and deleted = 0 and enabled = 1
+					order by sort_no asc, id asc
+					""", id)));
+		}
 		return result;
 	}
 
@@ -388,6 +396,7 @@
 		Long id = jdbcTemplate.queryForObject("select last_insert_id()", Long.class);
 		ensureParkingBenefit(id, merchantType.code());
 		ensureFuelBenefit(id, merchantType.code(), request.serviceLabel());
+		syncFuelStores(id, merchantType.code(), request.applicableStores());
 		syncPremiumTopicMerchant(id, merchantType, request.sortNo());
 		Long storeId = createDefaultStore(id, request.merchantName(), request.address());
 		syncMerchantBusinessHours(id, storeId, request.businessHours());
@@ -532,6 +541,7 @@
 		ensureUpdated(updated);
 		ensureParkingBenefit(id, merchantType.code());
 		ensureFuelBenefit(id, merchantType.code(), request.serviceLabel());
+		syncFuelStores(id, merchantType.code(), request.applicableStores());
 		syncPremiumTopicMerchant(id, merchantType, request.sortNo());
 		Long storeId = findOrCreateDefaultStore(id, request.merchantName(), request.address());
 		syncMerchantBusinessHours(id, storeId, request.businessHours());
@@ -595,6 +605,47 @@
 				""", merchantId, discountText, merchantId);
 	}
 
+	private void syncFuelStores(Long merchantId, String merchantType, List<Map<String, Object>> stores) {
+		if (!"fuel".equals(merchantType) || stores == null) return;
+		List<Map<String, Object>> normalized = new ArrayList<>();
+		Set<String> names = new HashSet<>();
+		for (Map<String, Object> store : stores) {
+			if (store == null) continue;
+			Object nameValue = store.containsKey("storeName") ? store.get("storeName") : store.get("name");
+			String name = nameValue == null ? "" : String.valueOf(nameValue).trim();
+			Object addressValue = store.get("address");
+			String address = addressValue == null ? "" : String.valueOf(addressValue).trim();
+			if (name.isBlank() || address.isBlank()) throw new BusinessException(ErrorCode.BAD_REQUEST, "请完善适用门店名称和地址");
+			if (!names.add(name)) throw new BusinessException(ErrorCode.BAD_REQUEST, "适用门店名称不能重复");
+			Double longitude = numberValue(store.get("longitude"));
+			Double latitude = numberValue(store.get("latitude"));
+			if (longitude == null || longitude < -180 || longitude > 180 || latitude == null || latitude < -90 || latitude > 90
+					|| (longitude == 0 && latitude == 0)) {
+				throw new BusinessException(ErrorCode.BAD_REQUEST, "请完成所有适用门店的标点");
+			}
+			Map<String, Object> item = new LinkedHashMap<>();
+			item.put("name", name);
+			item.put("address", address);
+			item.put("longitude", longitude);
+			item.put("latitude", latitude);
+			normalized.add(item);
+		}
+		jdbcTemplate.update("delete from transport_fuel_store where merchant_id = ?", merchantId);
+		for (int index = 0; index < normalized.size(); index++) {
+			Map<String, Object> store = normalized.get(index);
+			jdbcTemplate.update("""
+					insert into transport_fuel_store(merchant_id, store_name, address, longitude, latitude, sort_no, enabled, deleted)
+					values (?, ?, ?, ?, ?, ?, 1, 0)
+					""", merchantId, store.get("name"), store.get("address"), store.get("longitude"), store.get("latitude"), (index + 1) * 10);
+		}
+	}
+
+	private Double numberValue(Object value) {
+		if (value instanceof Number number) return number.doubleValue();
+		try { return value == null ? null : Double.valueOf(String.valueOf(value)); }
+		catch (NumberFormatException ignored) { return null; }
+	}
+
 	private void syncPremiumTopicMerchant(Long merchantId, MerchantType merchantType, Integer sortNo) {
 		if (merchantType.premiumCategoryKey() == null || merchantType.premiumBusinessType() == null) {
 			jdbcTemplate.update("update premium_topic_merchant set deleted = 1 where merchant_id = ? and deleted = 0", merchantId);

--
Gitblit v1.7.1