feat(admin): 最低价ASIN列表操作列新增整条删除按钮——后端DELETE /skip-price-asins/{id}(权限校验+日志),前端确认弹窗+删空页回退,补单测与对齐测试
This commit is contained in:
+10
@@ -165,6 +165,16 @@ public class SkipPriceAsinController {
|
||||
isSuper(operator)));
|
||||
}
|
||||
|
||||
@DeleteMapping("/{id}")
|
||||
@Operation(summary = "删除整条跳过跟价 ASIN 记录", description = "按主键删除店铺的全部站点 ASIN 与最低价配置。")
|
||||
public ApiResponse<Void> delete(
|
||||
HttpServletRequest request,
|
||||
@Parameter(description = "主键 ID", required = true) @PathVariable Long id) {
|
||||
AdminUserEntity operator = requireOperator(request);
|
||||
skipPriceAsinService.delete(id, operator.getId(), isSuper(operator));
|
||||
return ApiResponse.success("删除成功", null);
|
||||
}
|
||||
|
||||
@DeleteMapping("/{id}/countries/{country}")
|
||||
@Operation(summary = "删除指定国家的跳过跟价 ASIN")
|
||||
public ApiResponse<Void> deleteCountry(
|
||||
|
||||
+10
@@ -336,6 +336,16 @@ public class SkipPriceAsinService {
|
||||
skipPriceAsinMapper.updateById(entity);
|
||||
}
|
||||
|
||||
/** 删除整条最低价 ASIN 记录(该店铺全部站点的配置)。 */
|
||||
@Transactional
|
||||
public void delete(Long id, Long operatorId, boolean superAdmin) {
|
||||
SkipPriceAsinEntity entity = getById(id);
|
||||
validateGroupAccess(entity, operatorId, superAdmin);
|
||||
skipPriceAsinMapper.deleteById(entity.getId());
|
||||
log.info("[skip-price-asin] delete record id={} shopName={} groupId={} operatorId={}",
|
||||
entity.getId(), entity.getShopName(), entity.getGroupId(), operatorId);
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public SkipPriceAsinItemVo updateCountry(Long id, String country, String asin, BigDecimal minimumPrice,
|
||||
Long operatorId, boolean superAdmin) {
|
||||
|
||||
+27
@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.conditions.Wrapper;
|
||||
import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;
|
||||
import org.apache.ibatis.builder.MapperBuilderAssistant;
|
||||
import org.apache.ibatis.session.Configuration;
|
||||
import com.nanri.aiimage.common.exception.BusinessException;
|
||||
import com.nanri.aiimage.modules.shopkey.mapper.ShopManageMapper;
|
||||
import com.nanri.aiimage.modules.shopkey.mapper.SkipPriceAsinMapper;
|
||||
import com.nanri.aiimage.modules.shopkey.model.dto.SkipPriceAsinCreateRequest;
|
||||
@@ -34,6 +35,7 @@ import java.util.concurrent.atomic.AtomicReference;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertNull;
|
||||
import static org.junit.jupiter.api.Assertions.assertThrows;
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.Mockito.never;
|
||||
import static org.mockito.Mockito.verify;
|
||||
@@ -179,6 +181,31 @@ class SkipPriceAsinServiceTest {
|
||||
assertEquals(new BigDecimal("14.00"), existing.getMinimumPriceUk());
|
||||
}
|
||||
|
||||
@Test
|
||||
void deleteRemovesWholeRecordAfterGroupAccessCheck() {
|
||||
SkipPriceAsinEntity entity = new SkipPriceAsinEntity();
|
||||
entity.setId(100L);
|
||||
entity.setGroupId(10L);
|
||||
entity.setShopName("shop-a");
|
||||
entity.setAsinDe("B0DE1");
|
||||
when(skipPriceAsinMapper.selectById(100L)).thenReturn(entity);
|
||||
when(shopManageGroupService.getAccessibleById(10L, 7L, true)).thenReturn(group());
|
||||
|
||||
service.delete(100L, 7L, true);
|
||||
|
||||
verify(skipPriceAsinMapper).deleteById((java.io.Serializable) 100L);
|
||||
}
|
||||
|
||||
@Test
|
||||
void deleteRejectsUnknownRecord() {
|
||||
when(skipPriceAsinMapper.selectById(999L)).thenReturn(null);
|
||||
|
||||
BusinessException exception = assertThrows(BusinessException.class, () -> service.delete(999L, 7L, true));
|
||||
|
||||
assertEquals("记录不存在", exception.getMessage());
|
||||
verify(skipPriceAsinMapper, never()).deleteById(any(java.io.Serializable.class));
|
||||
}
|
||||
|
||||
private ShopManageGroupEntity group() {
|
||||
ShopManageGroupEntity group = new ShopManageGroupEntity();
|
||||
group.setId(10L);
|
||||
|
||||
Reference in New Issue
Block a user