1. ProductService接口
/**
* 通过商品Id查询唯一的商品信息
* @param productId
* @return
*/
Product getProductById(long productId);
/**
* 修改商品信息以及商品详情图处理
* @param product
* @param thumbnail
* @param productImgHolderList
* @return
* @throws ProductOperationException
*/
ProductExecution modifyProduct(Product product,
ImageHolder thumbnail,
List<ImageHolder> productImgHolderList)throws ProductOperationException;
2. ProductServiceImpl实现类
@Override
public Product getProductById(long productId) {
return productDao.queryProductById(productId);
}
/**
* 1.如果缩略图参数有值,就处理缩略图
* 如果原先存在缩略图,就先删除缩略图,之后获取缩略图相对路径并赋值给product
* 2.如果商品详情图列表有值,对商品详情图片做同样的处理
* 3.将tb_product_img下面的该商品原先的商品详情图记录全部清除
* 4.更新tb_product的信息
* @param product
* @param thumbnail
* @param productImgHolderList
* @return
* @throws ProductOperationException
*/
@Override
@Transactional
public ProductExecution modifyProduct(Product product,
ImageHolder thumbnail,
List<ImageHolder> productImgHolderList) throws ProductOperationException {
//空值判断
if(product!=null && product.getShop()!=null && product.getShop().getShopId()!=null){
//给商品设置上默认属性
product.setLastEditTime(new Date());
//如果商品缩略图不为空则删除原有缩略图并添加
if(thumbnail!=null){
//先获取一遍原有信息,因为原来的信息中有原有的图片地址
Product tempProduct = productDao.queryProductById(product.getProductId());
if(tempProduct.getImgAddr()!=null){
ImageUtil.deleteFileOrPath(tempProduct.getImgAddr());
}
addThumbnail(product,thumbnail);
}
//如果有新存入的商品详情图,就将原来的删除并添加新的图片
if(productImgHolderList!=null && productImgHolderList.size()>0){
deleteProductImgList(product.getProductId());
addProductImgList(product,productImgHolderList);
}
//更新商品信息
try {
int effectedNum = productDao.updateProduct(product);
if(effectedNum<0){
throw new ProductOperationException("更新图片信息失败");
}
return new ProductExecution(ProductStateEnum.SUCCESS,product);
} catch (Exception e) {
throw new ProductOperationException("更新图片信息失败:"+e.toString());
}
}else{
return new ProductExecution(ProductStateEnum.EMPTY);
}
}
/**
* 删除某个商品下面的所有详情图
* @param productId
*/
private void deleteProductImgList(Long productId) {
//根据productId获取原来的图片
List<ProductImg> productImgList = productImgDao.queryProductImgList(productId);
//删除原来的图片
for(ProductImg productImg : productImgList){
ImageUtil.deleteFileOrPath(productImg.getImgAddr());
}
//删除数据库里原有图片的信息
productImgDao.deleteProductImgByProductId(productId);
}
3. ProductServiceTest测试类
@Test
public void testModifyProduct() throws ShopOperationException, FileNotFoundException {
Shop shop1 = new Shop();
shop1.setShopId(143L);
ProductCategory pc1 = new ProductCategory();
pc1.setProductCategoryId(8L);
Product product = new Product();
product.setProductId(20L);
product.setShop(shop1);
product.setProductCategory(pc1);
product.setProductName("正式商品");
product.setProductDesc("正式商品");
//创建缩略图文件流
File thumbnailFile = new File("F:/XiaoYuanShangPu/xiaohuangren.jpg");
InputStream is = new FileInputStream(thumbnailFile);
ImageHolder thumbnail = new ImageHolder(thumbnailFile.getName(), is);
//创建两个商品详情图片文件流并将它们添加到详情图列表中
File productImg1 = new File("F:/XiaoYuanShangPu/xiaohuangren.jpg");
InputStream is1 = new FileInputStream(productImg1);
File productImg2 = new File("F:/XiaoYuanShangPu/dabai.jpg");
InputStream is2 = new FileInputStream(productImg2);
List<ImageHolder> productImgList = new ArrayList<>();
productImgList.add(new ImageHolder(productImg1.getName(), is1));
productImgList.add(new ImageHolder(productImg2.getName(), is2));
//更新商品信息
ProductExecution pe = productService.modifyProduct(product,thumbnail,productImgList);
assertEquals(ProductStateEnum.SUCCESS.getState(),pe.getState());
}