From 438aef7af7f22927794c720a7128c6f8b3c2d1ae Mon Sep 17 00:00:00 2001 From: irving Date: Sat, 8 Nov 2025 20:06:15 -0500 Subject: [PATCH] fix: ignore null level prices when updating commodity --- .../PlayCommodityInfoController.java | 6 +++- .../admin/api/PlayCommodityInfoApiTest.java | 33 +++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/play-admin/src/main/java/com/starry/admin/modules/shop/controller/PlayCommodityInfoController.java b/play-admin/src/main/java/com/starry/admin/modules/shop/controller/PlayCommodityInfoController.java index fd985cc..4b68bb8 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/shop/controller/PlayCommodityInfoController.java +++ b/play-admin/src/main/java/com/starry/admin/modules/shop/controller/PlayCommodityInfoController.java @@ -109,9 +109,13 @@ public class PlayCommodityInfoController { if (!jsonObject.containsKey(playClerkLevelInfoEntity.getId())) { throw new CustomException("请求参数错误"); } + String rawPrice = jsonObject.getString(playClerkLevelInfoEntity.getId()); + if (rawPrice == null || rawPrice.trim().isEmpty()) { + continue; + } double price = 0.0; try { - price = Double.parseDouble(jsonObject.getString(playClerkLevelInfoEntity.getId())); + price = Double.parseDouble(rawPrice); } catch (RuntimeException e) { throw new CustomException("请求参数错误,价格格式为空"); } diff --git a/play-admin/src/test/java/com/starry/admin/api/PlayCommodityInfoApiTest.java b/play-admin/src/test/java/com/starry/admin/api/PlayCommodityInfoApiTest.java index d89caee..a014d5d 100644 --- a/play-admin/src/test/java/com/starry/admin/api/PlayCommodityInfoApiTest.java +++ b/play-admin/src/test/java/com/starry/admin/api/PlayCommodityInfoApiTest.java @@ -221,6 +221,39 @@ class PlayCommodityInfoApiTest extends WxCustomOrderApiTestSupport { assertThat(pricing.getPrice()).isEqualByComparingTo(new BigDecimal("188.50")); } + @Test + // 测试用例:调用价格更新接口时若某个等级价格传入null,接口应忽略该列并保持原价,确保支持分步维护价格。 + void updateInfoSkipsNullLevelPrices() throws Exception { + ensureTenantContext(); + PlayCommodityAndLevelInfoEntity before = commodityAndLevelInfoService.lambdaQuery() + .eq(PlayCommodityAndLevelInfoEntity::getCommodityId, ApiTestDataSeeder.DEFAULT_COMMODITY_ID) + .eq(PlayCommodityAndLevelInfoEntity::getLevelId, ApiTestDataSeeder.DEFAULT_CLERK_LEVEL_ID) + .one(); + + assertThat(before).as("种子数据应具备默认等级价格").isNotNull(); + + ObjectNode payload = objectMapper.createObjectNode(); + payload.put("id", ApiTestDataSeeder.DEFAULT_COMMODITY_ID); + payload.putNull(ApiTestDataSeeder.DEFAULT_CLERK_LEVEL_ID); + + mockMvc.perform(post("/shop/commodity/updateInfo") + .header(USER_HEADER, DEFAULT_USER) + .header(TENANT_HEADER, DEFAULT_TENANT) + .contentType(MediaType.APPLICATION_JSON) + .content(payload.toString())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.code").value(200)); + + ensureTenantContext(); + PlayCommodityAndLevelInfoEntity after = commodityAndLevelInfoService.lambdaQuery() + .eq(PlayCommodityAndLevelInfoEntity::getCommodityId, ApiTestDataSeeder.DEFAULT_COMMODITY_ID) + .eq(PlayCommodityAndLevelInfoEntity::getLevelId, ApiTestDataSeeder.DEFAULT_CLERK_LEVEL_ID) + .one(); + + assertThat(after).isNotNull(); + assertThat(after.getPrice()).as("空价格不应覆盖原值").isEqualByComparingTo(before.getPrice()); + } + @Test // 测试用例:使用商品修改接口把自动结算等待时长从不限时(-1)调整为10分钟,验证更新后查询返回新的配置。 void updateEndpointSwitchesAutomaticSettlement() throws Exception {