mirror of
https://gitee.com/hhyykk/ipms-sjy.git
synced 2025-07-25 16:35:06 +08:00
Merge remote-tracking branch 'origin/feature/1.8.0-uniapp' into feature/1.8.0-uniapp
This commit is contained in:
@ -12,6 +12,6 @@ public class ProductPropertyValueUpdateReqVO extends ProductPropertyValueBaseVO
|
||||
|
||||
@ApiModelProperty(value = "主键", required = true, example = "1024")
|
||||
@NotNull(message = "主键不能为空")
|
||||
private Integer id;
|
||||
private Long id;
|
||||
|
||||
}
|
||||
|
@ -55,9 +55,8 @@ public class ProductSpuDetailRespVO extends ProductSpuBaseVO {
|
||||
|
||||
}
|
||||
|
||||
// TODO @luowenfeng: categoryIds => categoryId,example 也要改下哈
|
||||
@ApiModelProperty(value = "分类 id 数组,一直递归到一级父节点", example = "[1,2,4]")
|
||||
private Long categoryIds;
|
||||
@ApiModelProperty(value = "分类 id 数组,一直递归到一级父节点", example = "4")
|
||||
private Long categoryId;
|
||||
|
||||
// TODO @芋艿:在瞅瞅~
|
||||
@ApiModelProperty(value = "规格属性修改和详情展示组合", example = "[{\"propertyId\":2,\"name\":\"内存\",\"propertyValues\":[{\"v1\":11,\"v2\":\"64G\"},{\"v1\":10,\"v2\":\"32G\"}]},{\"propertyId\":3,\"name\":\"尺寸\",\"propertyValues\":[{\"v1\":16,\"v2\":\"6.1\"},{\"v1\":15,\"v2\":\"5.7\"}]}]")
|
||||
|
@ -25,10 +25,9 @@ public interface ProductPropertyMapper extends BaseMapperX<ProductPropertyDO> {
|
||||
.orderByDesc(ProductPropertyDO::getId));
|
||||
}
|
||||
|
||||
// TODO @luowenfeng: selectByNameLike,这样更清晰哈。
|
||||
default ProductPropertyDO selectByName(String name) {
|
||||
return selectOne(new LambdaQueryWrapperX<ProductPropertyDO>()
|
||||
.likeIfPresent(ProductPropertyDO::getName, name));
|
||||
.eqIfPresent(ProductPropertyDO::getName, name));
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -17,8 +17,7 @@ import java.util.List;
|
||||
@Mapper
|
||||
public interface ProductPropertyValueMapper extends BaseMapperX<ProductPropertyValueDO> {
|
||||
|
||||
// TODO @luowenfeng: selectListByPropertyId 是不是就可以啦
|
||||
default List<ProductPropertyValueDO> selectListByPropertyValueListByPropertyId(List<Long> propertyIds) {
|
||||
default List<ProductPropertyValueDO> selectListByPropertyId(List<Long> propertyIds) {
|
||||
return selectList(new LambdaQueryWrapperX<ProductPropertyValueDO>()
|
||||
.inIfPresent(ProductPropertyValueDO::getPropertyId, propertyIds));
|
||||
}
|
||||
|
@ -19,6 +19,7 @@ import javax.annotation.Resource;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||
import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.PROPERTY_EXISTS;
|
||||
@ -58,8 +59,8 @@ public class ProductPropertyServiceImpl implements ProductPropertyService {
|
||||
public void updateProperty(ProductPropertyUpdateReqVO updateReqVO) {
|
||||
// 校验存在
|
||||
this.validatePropertyExists(updateReqVO.getId());
|
||||
// TODO @luowenfeng:如果是自己的情况下,名字相同也是 ok 的呀~
|
||||
if (productPropertyMapper.selectByName(updateReqVO.getName()) != null) {
|
||||
ProductPropertyDO productPropertyDO = productPropertyMapper.selectByName(updateReqVO.getName());
|
||||
if (productPropertyDO != null && !productPropertyDO.getId().equals(updateReqVO.getId())) {
|
||||
throw exception(PROPERTY_EXISTS);
|
||||
}
|
||||
// 更新
|
||||
@ -97,10 +98,6 @@ public class ProductPropertyServiceImpl implements ProductPropertyService {
|
||||
return ProductPropertyConvert.INSTANCE.convertPage(pageResult);
|
||||
}
|
||||
|
||||
private List<ProductPropertyValueDO> getPropertyValueListByPropertyId(List<Long> propertyIds) {
|
||||
return productPropertyValueMapper.selectListByPropertyValueListByPropertyId(propertyIds);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ProductPropertyRespVO getProperty(Long id) {
|
||||
ProductPropertyDO property = productPropertyMapper.selectById(id);
|
||||
@ -117,7 +114,7 @@ public class ProductPropertyServiceImpl implements ProductPropertyService {
|
||||
List<ProductPropertyRespVO> propertyList = getPropertyList(listReqVO);
|
||||
|
||||
// 查询属性值
|
||||
List<ProductPropertyValueDO> valueDOList = productPropertyValueMapper.selectListByPropertyValueListByPropertyId(CollectionUtils.convertList(propertyList, ProductPropertyRespVO::getId));
|
||||
List<ProductPropertyValueDO> valueDOList = productPropertyValueMapper.selectListByPropertyId(CollectionUtils.convertList(propertyList, ProductPropertyRespVO::getId));
|
||||
Map<Long, List<ProductPropertyValueDO>> valueDOMap = CollectionUtils.convertMultiMap(valueDOList, ProductPropertyValueDO::getPropertyId);
|
||||
return CollectionUtils.convertList(propertyList, m -> {
|
||||
ProductPropertyAndValueRespVO productPropertyAndValueRespVO = ProductPropertyConvert.INSTANCE.convert(m);
|
||||
|
@ -14,6 +14,7 @@ import org.springframework.validation.annotation.Validated;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||
import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.PROPERTY_VALUE_EXISTS;
|
||||
@ -42,8 +43,8 @@ public class ProductPropertyValueServiceImpl implements ProductPropertyValueServ
|
||||
|
||||
@Override
|
||||
public void updatePropertyValue(ProductPropertyValueUpdateReqVO updateReqVO) {
|
||||
// TODO @luowenfeng:如果是自己的情况下,名字相同也是 ok 的呀~
|
||||
if (productPropertyValueMapper.selectByName(updateReqVO.getPropertyId(), updateReqVO.getName()) != null) {
|
||||
ProductPropertyValueDO productPropertyValueDO = productPropertyValueMapper.selectByName(updateReqVO.getPropertyId(), updateReqVO.getName());
|
||||
if (productPropertyValueDO != null && !productPropertyValueDO.getId().equals(updateReqVO.getId())) {
|
||||
throw exception(PROPERTY_VALUE_EXISTS);
|
||||
}
|
||||
ProductPropertyValueDO convert = ProductPropertyValueConvert.INSTANCE.convert(updateReqVO);
|
||||
|
@ -162,7 +162,6 @@ public class ProductSpuServiceImpl implements ProductSpuService {
|
||||
});
|
||||
respVO.setProductPropertyViews(productPropertyViews);
|
||||
}
|
||||
respVO.setCategoryIds(respVO.getCategoryId());
|
||||
}
|
||||
return respVO;
|
||||
}
|
||||
|
@ -1,8 +1,11 @@
|
||||
package cn.iocoder.yudao.module.product.service.spu;
|
||||
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
import cn.hutool.core.util.RandomUtil;
|
||||
import cn.iocoder.yudao.framework.common.exception.ServiceException;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
|
||||
import cn.iocoder.yudao.framework.common.util.collection.SetUtils;
|
||||
import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
|
||||
import cn.iocoder.yudao.module.product.controller.admin.property.vo.property.ProductPropertyRespVO;
|
||||
import cn.iocoder.yudao.module.product.controller.admin.property.vo.value.ProductPropertyValueRespVO;
|
||||
@ -33,10 +36,12 @@ import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId;
|
||||
import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
|
||||
import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;
|
||||
|
||||
// TODO @芋艿:review 下单元测试
|
||||
|
||||
/**
|
||||
* {@link ProductSpuServiceImpl} 的单元测试类
|
||||
*
|
||||
@ -67,6 +72,13 @@ public class ProductSpuServiceImplTest extends BaseDbUnitTest {
|
||||
@MockBean
|
||||
private ProductPropertyValueService productPropertyValueService;
|
||||
|
||||
public String generateNo() {
|
||||
return DateUtil.format(new Date(), "yyyyMMddHHmmss") + RandomUtil.randomInt(100000, 999999);
|
||||
}
|
||||
|
||||
public Long generateId() {
|
||||
return RandomUtil.randomLong(100000, 999999);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCreateSpu_success() {
|
||||
@ -206,34 +218,119 @@ public class ProductSpuServiceImplTest extends BaseDbUnitTest {
|
||||
Assertions.assertIterableEquals(createReqVO, spuList);
|
||||
}
|
||||
|
||||
// TODO @luowenfeng:单测要分情况;类似你这个,可以分 2 个单测;一个是有预存预警的;一个是没库存预警的;
|
||||
// 然后,参考其它模块的 getPage 类型的方法的单测。
|
||||
@Test
|
||||
void getSpuPage() {
|
||||
// 准备参数
|
||||
ProductSpuDO createReqVO = randomPojo(ProductSpuDO.class);
|
||||
productSpuMapper.insert(createReqVO);
|
||||
|
||||
ArrayList<ProductSkuDO> remindSpuIds = Lists.newArrayList(
|
||||
// randomPojo(ProductSkuDO.class, o -> o.setSpuId(createReqVO.getId())),
|
||||
// randomPojo(ProductSkuDO.class, o -> o.setSpuId(createReqVO.getId()))
|
||||
);
|
||||
|
||||
// Mockito.when(productSkuService.getRemindSpuIds()).thenReturn(remindSpuIds);
|
||||
|
||||
void getSpuPage_alarmStock_empty() {
|
||||
// 调用
|
||||
ProductSpuPageReqVO productSpuPageReqVO = new ProductSpuPageReqVO();
|
||||
// productSpuPageReqVO.setTabStatus(2);
|
||||
productSpuPageReqVO.setAlarmStock(true);
|
||||
|
||||
PageResult<ProductSpuRespVO> spuPage = productSpuService.getSpuPage(productSpuPageReqVO);
|
||||
|
||||
Set<Long> resultRemindSpuIds = new HashSet<>();
|
||||
resultRemindSpuIds.add(null);
|
||||
PageResult<ProductSpuRespVO> result = ProductSpuConvert.INSTANCE.convertPage(productSpuMapper.selectPage(productSpuPageReqVO, resultRemindSpuIds));
|
||||
PageResult<Object> result = PageResult.empty();
|
||||
Assertions.assertIterableEquals(result.getList(), spuPage.getList());
|
||||
Assertions.assertEquals(spuPage.getTotal(), result.getTotal());
|
||||
}
|
||||
|
||||
@Test
|
||||
void getSpuPage_alarmStock() {
|
||||
// mock 数据
|
||||
Long brandId = generateId();
|
||||
Long categoryId = generateId();
|
||||
String code = generateNo();
|
||||
|
||||
// 准备参数
|
||||
ProductSpuDO createReqVO = randomPojo(ProductSpuDO.class, o->{
|
||||
o.setStatus(ProductSpuStatusEnum.ENABLE.getStatus());
|
||||
o.setTotalStock(500);
|
||||
o.setMinPrice(1);
|
||||
o.setMaxPrice(50);
|
||||
o.setMarketPrice(25);
|
||||
o.setSpecType(ProductSpuSpecTypeEnum.RECYCLE.getType());
|
||||
o.setBrandId(brandId);
|
||||
o.setCategoryId(categoryId);
|
||||
o.setClickCount(100);
|
||||
o.setCode(code);
|
||||
o.setDescription("测试商品");
|
||||
o.setPicUrls(new ArrayList<>());
|
||||
o.setName("测试");
|
||||
o.setSalesCount(100);
|
||||
o.setSellPoint("超级加倍");
|
||||
o.setShowStock(true);
|
||||
o.setVideoUrl("");
|
||||
});
|
||||
productSpuMapper.insert(createReqVO);
|
||||
|
||||
Set<Long> alarmStockSpuIds = SetUtils.asSet(createReqVO.getId());
|
||||
|
||||
List<ProductSkuDO> productSpuDOS = Arrays.asList(randomPojo(ProductSkuDO.class, o -> {
|
||||
o.setSpuId(createReqVO.getId());
|
||||
}), randomPojo(ProductSkuDO.class, o -> {
|
||||
o.setSpuId(createReqVO.getId());
|
||||
}));
|
||||
|
||||
Mockito.when(productSkuService.getSkusByAlarmStock()).thenReturn(productSpuDOS);
|
||||
|
||||
// 调用
|
||||
ProductSpuPageReqVO productSpuPageReqVO = new ProductSpuPageReqVO();
|
||||
productSpuPageReqVO.setAlarmStock(true);
|
||||
PageResult<ProductSpuRespVO> spuPage = productSpuService.getSpuPage(productSpuPageReqVO);
|
||||
|
||||
PageResult<ProductSpuRespVO> result = ProductSpuConvert.INSTANCE.convertPage(productSpuMapper.selectPage(productSpuPageReqVO, alarmStockSpuIds));
|
||||
Assertions.assertIterableEquals(result.getList(), spuPage.getList());
|
||||
Assertions.assertEquals(spuPage.getTotal(), result.getTotal());
|
||||
}
|
||||
|
||||
@Test
|
||||
void getSpuPage() {
|
||||
// mock 数据
|
||||
Long brandId = generateId();
|
||||
Long categoryId = generateId();
|
||||
|
||||
// 准备参数
|
||||
ProductSpuDO createReqVO = randomPojo(ProductSpuDO.class, o->{
|
||||
o.setStatus(ProductSpuStatusEnum.ENABLE.getStatus());
|
||||
o.setTotalStock(1);
|
||||
o.setMinPrice(1);
|
||||
o.setMaxPrice(1);
|
||||
o.setMarketPrice(1);
|
||||
o.setSpecType(ProductSpuSpecTypeEnum.RECYCLE.getType());
|
||||
o.setBrandId(brandId);
|
||||
o.setCategoryId(categoryId);
|
||||
o.setClickCount(1);
|
||||
o.setCode(generateNo());
|
||||
o.setDescription("测试商品");
|
||||
o.setPicUrls(new ArrayList<>());
|
||||
o.setName("测试");
|
||||
o.setSalesCount(1);
|
||||
o.setSellPoint("卖点");
|
||||
o.setShowStock(true);
|
||||
});
|
||||
|
||||
// 准备参数
|
||||
productSpuMapper.insert(createReqVO);
|
||||
// 测试 status 不匹配
|
||||
productSpuMapper.insert(cloneIgnoreId(createReqVO, o -> o.setStatus(ProductSpuStatusEnum.DISABLE.getStatus())));
|
||||
productSpuMapper.insert(cloneIgnoreId(createReqVO, o -> o.setStatus(ProductSpuStatusEnum.RECYCLE.getStatus())));
|
||||
// 测试 SpecType 不匹配
|
||||
productSpuMapper.insert(cloneIgnoreId(createReqVO, o -> o.setSpecType(ProductSpuSpecTypeEnum.DISABLE.getType())));
|
||||
// 测试 BrandId 不匹配
|
||||
productSpuMapper.insert(cloneIgnoreId(createReqVO, o -> o.setBrandId(generateId())));
|
||||
// 测试 CategoryId 不匹配
|
||||
productSpuMapper.insert(cloneIgnoreId(createReqVO, o -> o.setCategoryId(generateId())));
|
||||
|
||||
// 调用
|
||||
ProductSpuPageReqVO productSpuPageReqVO = new ProductSpuPageReqVO();
|
||||
productSpuPageReqVO.setAlarmStock(false);
|
||||
productSpuPageReqVO.setBrandId(brandId);
|
||||
productSpuPageReqVO.setStatus(ProductSpuStatusEnum.ENABLE.getStatus());
|
||||
productSpuPageReqVO.setCategoryId(categoryId);
|
||||
|
||||
PageResult<ProductSpuRespVO> spuPage = productSpuService.getSpuPage(productSpuPageReqVO);
|
||||
|
||||
PageResult<ProductSpuRespVO> result = ProductSpuConvert.INSTANCE.convertPage(productSpuMapper.selectPage(productSpuPageReqVO, (Set<Long>) null));
|
||||
Assertions.assertEquals(result, spuPage);
|
||||
}
|
||||
|
||||
@Test
|
||||
void testGetSpuPage() {
|
||||
// 准备参数
|
||||
@ -242,13 +339,6 @@ public class ProductSpuServiceImplTest extends BaseDbUnitTest {
|
||||
});
|
||||
productSpuMapper.insert(createReqVO);
|
||||
|
||||
ArrayList<ProductSkuDO> remindSpuIds = Lists.newArrayList(
|
||||
// randomPojo(ProductSkuDO.class, o -> o.setSpuId(createReqVO.getId())),
|
||||
// randomPojo(ProductSkuDO.class, o -> o.setSpuId(createReqVO.getId()))
|
||||
);
|
||||
|
||||
// Mockito.when(productSkuService.getRemindSpuIds()).thenReturn(remindSpuIds);
|
||||
|
||||
// 调用
|
||||
AppSpuPageReqVO appSpuPageReqVO = new AppSpuPageReqVO();
|
||||
appSpuPageReqVO.setCategoryId(2L);
|
||||
|
Reference in New Issue
Block a user