diff --git a/yudao-module-mall/yudao-module-product-biz/pom.xml b/yudao-module-mall/yudao-module-product-biz/pom.xml index c8bad46..eb6ec12 100644 --- a/yudao-module-mall/yudao-module-product-biz/pom.xml +++ b/yudao-module-mall/yudao-module-product-biz/pom.xml @@ -60,4 +60,25 @@ + + + + src/main/resources + true + + **/*.xlsx + **/*.xls + + + + src/main/resources + false + + **/*.xlsx + **/*.xls + + + + + diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/spu/ProductSpuController.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/spu/ProductSpuController.java index 0c30897..5101b24 100644 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/spu/ProductSpuController.java +++ b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/spu/ProductSpuController.java @@ -1,6 +1,8 @@ package cn.iocoder.yudao.module.product.controller.admin.spu; +import cn.hutool.core.io.resource.ResourceUtil; import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; @@ -12,21 +14,27 @@ import cn.iocoder.yudao.module.product.dal.dataobject.spu.ProductSpuDO; import cn.iocoder.yudao.module.product.enums.spu.ProductSpuStatusEnum; import cn.iocoder.yudao.module.product.service.sku.ProductSkuService; import cn.iocoder.yudao.module.product.service.spu.ProductSpuService; +import cn.iocoder.yudao.module.system.enums.common.SexEnum; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelWriter; +import com.alibaba.excel.write.metadata.WriteSheet; +import com.alibaba.excel.write.metadata.fill.FillConfig; +import com.alibaba.fastjson.JSON; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.extern.slf4j.Slf4j; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; import java.io.IOException; -import java.util.Collection; -import java.util.Comparator; -import java.util.List; -import java.util.Map; +import java.util.*; import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; @@ -36,6 +44,7 @@ import static cn.iocoder.yudao.framework.common.pojo.PageParam.PAGE_SIZE_NONE; @RestController @RequestMapping("/product/spu") @Validated +@Slf4j public class ProductSpuController { @Resource @@ -129,7 +138,7 @@ public class ProductSpuController { @PreAuthorize("@ss.hasPermission('product:spu:export')") @ApiAccessLog(operateType = EXPORT) public void exportSpuList(@Validated ProductSpuPageReqVO reqVO, - HttpServletResponse response) throws IOException { + HttpServletResponse response) throws IOException { reqVO.setPageSize(PAGE_SIZE_NONE); List list = productSpuService.getSpuPage(reqVO).getList(); // 导出 Excel @@ -137,4 +146,33 @@ public class ProductSpuController { BeanUtils.toBean(list, ProductSpuRespVO.class)); } + @GetMapping("/get-import-template") + @Operation(summary = "获得导入商品模板") + public void importTemplate(HttpServletResponse response) throws IOException { + try (ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).withTemplate(ResourceUtil.getStream("file/商品导入-模版.xlsx")).build()) { + WriteSheet writeSheet = EasyExcel.writerSheet().build(); + FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build(); + + Map map = new HashMap(); + + excelWriter.fill(map, writeSheet); + excelWriter.fill(new ArrayList<>(), fillConfig, writeSheet); + } catch (IOException e) { + e.printStackTrace(); + log.error("|获得导入商品模板|意外的错误:{}", e.getMessage()); + } + } + + @PostMapping("/import") + @Operation(summary = "导入商品") + @Parameters({ + @Parameter(name = "file", description = "Excel 文件", required = true), + }) + @PreAuthorize("@ss.hasPermission('system:user:import')") + public CommonResult> importExcel(@RequestParam("file") MultipartFile file) throws Exception { + List list = ExcelUtils.read(file, ProductImportExcelVO.class); + return success(productSpuService.importProductList(list)); + } + + } diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/spu/vo/ProductImportExcelResVO.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/spu/vo/ProductImportExcelResVO.java new file mode 100644 index 0000000..9204d86 --- /dev/null +++ b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/spu/vo/ProductImportExcelResVO.java @@ -0,0 +1,28 @@ +package cn.iocoder.yudao.module.product.controller.admin.spu.vo; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.util.List; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Accessors(chain = false) +public class ProductImportExcelResVO { + + /** + * 行号 + */ + private Integer lineNumber; + + /** + * 错误信息 + */ + private List errors; + +} diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/spu/vo/ProductImportExcelVO.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/spu/vo/ProductImportExcelVO.java new file mode 100644 index 0000000..d48b225 --- /dev/null +++ b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/spu/vo/ProductImportExcelVO.java @@ -0,0 +1,62 @@ +package cn.iocoder.yudao.module.product.controller.admin.spu.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.math.BigDecimal; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Accessors(chain = false) +public class ProductImportExcelVO { + + @ExcelProperty("商品名称") + private String name; + + @ExcelProperty("商品分类") + private String categoryStr; + + /** + * 商品分类编号 + */ + private Long categoryId; + + @ExcelProperty("商品品牌") + private String brandStr; + + /** + * 品牌编号 + */ + private Long brandId; + + @ExcelProperty("商品关键字") + private String keyword; + + @ExcelProperty("商品简介") + private String introduction; + + @ExcelProperty("销售价") + private BigDecimal price; + + @ExcelProperty("市场价") + private BigDecimal marketPrice; + + @ExcelProperty("成本价") + private BigDecimal costPrice; + + @ExcelProperty("库存") + private Integer stock; + + @ExcelProperty("重量(kg)") + private BigDecimal weight; + + @ExcelProperty("体积(m^3)") + private BigDecimal volume; + +} diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/brand/ProductBrandService.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/brand/ProductBrandService.java index aa401ed..1dabb9b 100644 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/brand/ProductBrandService.java +++ b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/brand/ProductBrandService.java @@ -53,6 +53,8 @@ public interface ProductBrandService { */ List getBrandList(Collection ids); + List getBrandListByNames(Collection names); + /** * 获得品牌列表 * @@ -80,7 +82,7 @@ public interface ProductBrandService { * 获取指定状态的品牌列表 * * @param status 状态 - * @return 返回品牌列表 + * @return 返回品牌列表 */ List getBrandListByStatus(Integer status); } diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/brand/ProductBrandServiceImpl.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/brand/ProductBrandServiceImpl.java index b97123f..b65ddfd 100644 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/brand/ProductBrandServiceImpl.java +++ b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/brand/ProductBrandServiceImpl.java @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.product.service.brand; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.module.product.controller.admin.brand.vo.ProductBrandCreateReqVO; import cn.iocoder.yudao.module.product.controller.admin.brand.vo.ProductBrandListReqVO; import cn.iocoder.yudao.module.product.controller.admin.brand.vo.ProductBrandPageReqVO; @@ -15,6 +16,7 @@ import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; import java.util.Collection; +import java.util.Collections; import java.util.List; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; @@ -93,6 +95,11 @@ public class ProductBrandServiceImpl implements ProductBrandService { return brandMapper.selectBatchIds(ids); } + @Override + public List getBrandListByNames(Collection names) { + return brandMapper.selectList(new LambdaQueryWrapperX().in(ProductBrandDO::getName, names)); + } + @Override public List getBrandList(ProductBrandListReqVO listReqVO) { return brandMapper.selectList(listReqVO); diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/category/ProductCategoryService.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/category/ProductCategoryService.java index 73a93fa..3e5bf6d 100644 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/category/ProductCategoryService.java +++ b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/category/ProductCategoryService.java @@ -68,6 +68,11 @@ public interface ProductCategoryService { */ List getCategoryList(ProductCategoryListReqVO listReqVO); + /** + * 获取一级分类 + */ + List getStairCategoryList(List names); + /** * 获得开启状态的商品分类列表 * diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/category/ProductCategoryServiceImpl.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/category/ProductCategoryServiceImpl.java index 42db6d9..579f38f 100644 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/category/ProductCategoryServiceImpl.java +++ b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/category/ProductCategoryServiceImpl.java @@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.module.product.controller.admin.category.vo.ProductCategoryListReqVO; import cn.iocoder.yudao.module.product.controller.admin.category.vo.ProductCategorySaveReqVO; import cn.iocoder.yudao.module.product.dal.dataobject.category.ProductCategoryDO; @@ -14,10 +15,7 @@ import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Objects; +import java.util.*; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.product.dal.dataobject.category.ProductCategoryDO.CATEGORY_LEVEL; @@ -171,6 +169,14 @@ public class ProductCategoryServiceImpl implements ProductCategoryService { return productCategoryMapper.selectList(listReqVO); } + @Override + public List getStairCategoryList(List names) { + return productCategoryMapper.selectList(new LambdaQueryWrapperX() + .in(ProductCategoryDO::getName, names) + .eq(ProductCategoryDO::getParentId, PARENT_ID_NULL) + ); + } + @Override public List getEnableCategoryList() { return productCategoryMapper.selectListByStatus(CommonStatusEnum.ENABLE.getStatus()); diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/spu/ProductSpuService.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/spu/ProductSpuService.java index 75ef927..1e59359 100644 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/spu/ProductSpuService.java +++ b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/spu/ProductSpuService.java @@ -2,9 +2,7 @@ package cn.iocoder.yudao.module.product.service.spu; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; -import cn.iocoder.yudao.module.product.controller.admin.spu.vo.ProductSpuPageReqVO; -import cn.iocoder.yudao.module.product.controller.admin.spu.vo.ProductSpuSaveReqVO; -import cn.iocoder.yudao.module.product.controller.admin.spu.vo.ProductSpuUpdateStatusReqVO; +import cn.iocoder.yudao.module.product.controller.admin.spu.vo.*; import cn.iocoder.yudao.module.product.controller.app.spu.vo.AppProductSpuPageReqVO; import cn.iocoder.yudao.module.product.dal.dataobject.spu.ProductSpuDO; import org.springframework.scheduling.annotation.Async; @@ -143,4 +141,8 @@ public interface ProductSpuService { @Async void updateBrowseCount(Long id, int incrCount); + /** + * 导入商品 + */ + List importProductList(List list); } diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/spu/ProductSpuServiceImpl.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/spu/ProductSpuServiceImpl.java index ce80f9b..624340b 100644 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/spu/ProductSpuServiceImpl.java +++ b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/spu/ProductSpuServiceImpl.java @@ -7,26 +7,30 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.product.controller.admin.category.vo.ProductCategoryListReqVO; -import cn.iocoder.yudao.module.product.controller.admin.spu.vo.ProductSkuSaveReqVO; -import cn.iocoder.yudao.module.product.controller.admin.spu.vo.ProductSpuPageReqVO; -import cn.iocoder.yudao.module.product.controller.admin.spu.vo.ProductSpuSaveReqVO; -import cn.iocoder.yudao.module.product.controller.admin.spu.vo.ProductSpuUpdateStatusReqVO; +import cn.iocoder.yudao.module.product.controller.admin.spu.vo.*; import cn.iocoder.yudao.module.product.controller.app.spu.vo.AppProductSpuPageReqVO; +import cn.iocoder.yudao.module.product.dal.dataobject.brand.ProductBrandDO; import cn.iocoder.yudao.module.product.dal.dataobject.category.ProductCategoryDO; +import cn.iocoder.yudao.module.product.dal.dataobject.sku.ProductSkuDO; import cn.iocoder.yudao.module.product.dal.dataobject.spu.ProductSpuDO; +import cn.iocoder.yudao.module.product.dal.mysql.sku.ProductSkuMapper; import cn.iocoder.yudao.module.product.dal.mysql.spu.ProductSpuMapper; import cn.iocoder.yudao.module.product.enums.spu.ProductSpuStatusEnum; import cn.iocoder.yudao.module.product.service.brand.ProductBrandService; import cn.iocoder.yudao.module.product.service.category.ProductCategoryService; import cn.iocoder.yudao.module.product.service.sku.ProductSkuService; import com.google.common.collect.Maps; +import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; +import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.*; +import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*; @@ -38,12 +42,15 @@ import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.*; * * @author 芋道源码 */ +@Slf4j @Service @Validated public class ProductSpuServiceImpl implements ProductSpuService { @Resource private ProductSpuMapper productSpuMapper; + @Resource + private ProductSkuMapper productSkuMapper; @Resource @Lazy // 循环依赖,避免报错 @@ -154,7 +161,106 @@ public class ProductSpuServiceImpl implements ProductSpuService { @Override public void updateBrowseCount(Long id, int incrCount) { - productSpuMapper.updateBrowseCount(id , incrCount); + productSpuMapper.updateBrowseCount(id, incrCount); + } + + /** + * 导入商品 + */ + @Override + public List importProductList(List list) { + List resList = new ArrayList<>(); + if (ObjectUtil.isEmpty(list)) return resList; + // excel品牌 + List excelBrandStrList = list.stream().map(ProductImportExcelVO::getBrandStr).distinct().filter(ObjectUtil::isNotEmpty).map(s -> s.replaceAll("\\s+", "")).collect(Collectors.toList()); + // excel所有的一级分类 + List excelCategoryStrList = list.stream().map(ProductImportExcelVO::getCategoryStr).distinct().filter(ObjectUtil::isNotEmpty).map(s -> s.replaceAll("\\s+", "")).map(s -> s.split("-")[0]).collect(Collectors.toList()); + // db品牌 + List brandList = brandService.getBrandListByNames(excelBrandStrList); + // db一级分类 + List categoryList = categoryService.getStairCategoryList(excelCategoryStrList); + // 新增的商品 + List addList = new ArrayList<>(); + try { + for (int i = 0; i < list.size(); i++) { + ProductImportExcelVO v = list.get(i); + List errors = new ArrayList<>(); + ProductImportExcelResVO entity = new ProductImportExcelResVO(); + entity.setLineNumber(i + 1); + // 开始处理导入数据 + ProductBrandDO targetBrand = brandList.stream().filter(item -> ObjectUtil.equals(v.getBrandStr(), item.getName())).findFirst().orElse(null); + if (ObjectUtil.isEmpty(targetBrand)) { + errors.add("品牌[" + v.getBrandStr() + "]不存在,请添加后再导入"); + } else { + v.setBrandId(targetBrand.getId()); + } + List categoryStrs = Arrays.asList(v.getCategoryStr().split("-")); + // 查询一级分类 + ProductCategoryDO targetCategory = categoryList.stream().filter(item -> ObjectUtil.equals(categoryStrs.get(0), item.getName())).findFirst().orElse(null); + if (ObjectUtil.isNull(targetCategory)) { + errors.add("一级分类[" + v.getCategoryStr() + "]不存在,请添加后再导入"); + } else { + v.setCategoryId(targetCategory.getId()); + } + // 如果有二级分类 + if (categoryStrs.size() > 1) { + ProductCategoryDO targetCategory2 = categoryList.stream().filter(item -> ObjectUtil.equals(categoryStrs.get(1), item.getName())).findFirst().orElse(null); + if (ObjectUtil.isNull(targetCategory2)) { + errors.add("二级分类[" + v.getCategoryStr() + "]不存在,请添加后再导入"); + } else { + v.setCategoryId(targetCategory2.getId()); + } + } + if (ObjectUtil.isNotEmpty(errors)) { + entity.setErrors(errors); + resList.add(entity); + continue; + } + addList.add(v); + } + if (ObjectUtil.isNotEmpty(resList)) return resList; + // 新增商品 + for (ProductImportExcelVO v : addList) { + int price = v.getPrice().multiply(BigDecimal.valueOf(100)).setScale(0, RoundingMode.HALF_UP).intValue(); + int marketPrice = v.getMarketPrice().multiply(BigDecimal.valueOf(100)).setScale(0, RoundingMode.HALF_UP).intValue(); + int costPrice = v.getCostPrice().multiply(BigDecimal.valueOf(100)).setScale(0, RoundingMode.HALF_UP).intValue(); + ProductSpuDO spuObj = new ProductSpuDO(); + spuObj.setName(v.getName()); + spuObj.setKeyword(v.getKeyword()); + spuObj.setCategoryId(v.getCategoryId()); + spuObj.setBrandId(v.getBrandId()); + spuObj.setPicUrl(""); + spuObj.setSliderPicUrls(new ArrayList<>()); + spuObj.setSort(0); + spuObj.setStatus(ProductSpuStatusEnum.ENABLE.getStatus()); + spuObj.setSpecType(false); + spuObj.setPrice(price); + spuObj.setMarketPrice(marketPrice); + spuObj.setCostPrice(costPrice); + spuObj.setStock(v.getStock()); + spuObj.setDeliveryTypes(new ArrayList<>()); + productSpuMapper.insert(spuObj); + // 插入 + List skuList = new ArrayList<>(); + ProductSkuSaveReqVO skuObj = new ProductSkuSaveReqVO(); + skuObj.setName(v.getName()); + skuObj.setPrice(price); + skuObj.setMarketPrice(marketPrice); + skuObj.setCostPrice(costPrice); + skuObj.setBarCode(""); + skuObj.setPicUrl(""); + skuObj.setStock(v.getStock()); + skuObj.setWeight(v.getWeight().doubleValue()); + skuObj.setVolume(v.getVolume().doubleValue()); + productSkuService.validateSkuList(skuList, false); + productSkuService.updateSkuList(spuObj.getId(), skuList); + skuList.add(skuObj); + } + } catch (Exception e) { + e.printStackTrace(); + log.error("|导入商品|意外的错误f:{}", e.getMessage()); + } + return resList; } @Override diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/resources/file/商品导入-模版.xlsx b/yudao-module-mall/yudao-module-product-biz/src/main/resources/file/商品导入-模版.xlsx new file mode 100644 index 0000000..379180b Binary files /dev/null and b/yudao-module-mall/yudao-module-product-biz/src/main/resources/file/商品导入-模版.xlsx differ diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/photo/vo/PhotoPageReqVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/photo/vo/PhotoPageReqVO.java index 8e761bd..7fa4dba 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/photo/vo/PhotoPageReqVO.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/photo/vo/PhotoPageReqVO.java @@ -29,7 +29,7 @@ public class PhotoPageReqVO extends PageParam { private PhotoResourceTypeEnum resourceType; @Schema(description = "资源地址") - private Long address; + private String address; @Schema(description = "tag_json") private String tagJson; diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/photo/vo/PhotoRespVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/photo/vo/PhotoRespVO.java index 6862a65..ae85657 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/photo/vo/PhotoRespVO.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/photo/vo/PhotoRespVO.java @@ -32,7 +32,7 @@ public class PhotoRespVO { @Schema(description = "资源地址", requiredMode = Schema.RequiredMode.REQUIRED) @ExcelProperty("资源地址") - private Long address; + private String address; @Schema(description = "tag") @ExcelProperty("tag-json") diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/photo/vo/PhotoSaveReqVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/photo/vo/PhotoSaveReqVO.java index 598c559..67bb159 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/photo/vo/PhotoSaveReqVO.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/photo/vo/PhotoSaveReqVO.java @@ -25,7 +25,7 @@ public class PhotoSaveReqVO { @Schema(description = "资源地址", requiredMode = Schema.RequiredMode.REQUIRED) @NotNull(message = "资源地址不能为空") - private Long address; + private String address; @Schema(description = "tag") private String tagJson; diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/photo/vo/AppUploadReqVo.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/photo/vo/AppUploadReqVo.java index 5d49347..62233ff 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/photo/vo/AppUploadReqVo.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/photo/vo/AppUploadReqVo.java @@ -22,7 +22,7 @@ public class AppUploadReqVo { @Schema(description = "资源地址") @NotNull(message = "资源地址不能为空") - private Long address; + private String address; @Schema(description = "发布-经度") private Double issueLong; diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/user/vo/AppMemberUserUpdateReqVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/user/vo/AppMemberUserUpdateReqVO.java index 0adbf2b..66fb030 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/user/vo/AppMemberUserUpdateReqVO.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/user/vo/AppMemberUserUpdateReqVO.java @@ -1,10 +1,14 @@ package cn.iocoder.yudao.module.member.controller.app.user.vo; +import cn.iocoder.yudao.module.member.enums.photo.PhotoResourceTypeEnum; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import org.hibernate.validator.constraints.URL; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; import java.time.LocalDateTime; +import java.util.List; @Schema(description = "用户 App - 会员用户更新 Request VO") @Data @@ -32,4 +36,20 @@ public class AppMemberUserUpdateReqVO { @Schema(description = "个人介绍") private String description; + @Schema(description = "用户相册") + private List photo; + + @Data + public static class UploadReqVo { + + @Schema(description = "资源类型") + @NotEmpty(message = "上传途径不能为空") + private PhotoResourceTypeEnum resourceType; + + @Schema(description = "资源地址") + @NotNull(message = "资源地址不能为空") + private String address; + + } + } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/photo/PhotoDO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/photo/PhotoDO.java index a480985..44cee17 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/photo/PhotoDO.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/photo/PhotoDO.java @@ -46,7 +46,7 @@ public class PhotoDO extends BaseDO { /** * 资源地址 */ - private Long address; + private String address; /** * tag-json diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImpl.java index 6f1744d..b5d7c4f 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImpl.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImpl.java @@ -13,8 +13,12 @@ import cn.iocoder.yudao.module.member.controller.admin.user.vo.MemberUserUpdateR import cn.iocoder.yudao.module.member.controller.app.user.vo.*; import cn.iocoder.yudao.module.member.convert.auth.AuthConvert; import cn.iocoder.yudao.module.member.convert.user.MemberUserConvert; +import cn.iocoder.yudao.module.member.dal.dataobject.photo.PhotoDO; import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; +import cn.iocoder.yudao.module.member.dal.mysql.photo.PhotoMapper; import cn.iocoder.yudao.module.member.dal.mysql.user.MemberUserMapper; +import cn.iocoder.yudao.module.member.enums.photo.PhotoBizTypeEnum; +import cn.iocoder.yudao.module.member.enums.photo.PhotoResourceTypeEnum; import cn.iocoder.yudao.module.member.mq.producer.user.MemberUserProducer; import cn.iocoder.yudao.module.system.api.sms.SmsCodeApi; import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeUseReqDTO; @@ -34,6 +38,8 @@ import javax.validation.Valid; import java.time.LocalDateTime; import java.util.Collection; import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getClientIP; @@ -51,6 +57,8 @@ public class MemberUserServiceImpl implements MemberUserService { @Resource private MemberUserMapper memberUserMapper; + @Resource + private PhotoMapper photoMapper; @Resource private SmsCodeApi smsCodeApi; @@ -144,6 +152,17 @@ public class MemberUserServiceImpl implements MemberUserService { public void updateUser(Long userId, AppMemberUserUpdateReqVO reqVO) { MemberUserDO updateObj = BeanUtils.toBean(reqVO, MemberUserDO.class).setId(userId); memberUserMapper.updateById(updateObj); + if (ObjectUtil.isNotEmpty(reqVO.getPhoto())) { + List photoList = reqVO.getPhoto().stream().map(item -> { + PhotoDO entity = new PhotoDO(); + entity.setMemberId(userId); + entity.setBizType(PhotoBizTypeEnum.USER_PHOTO.getType()); + entity.setResourceType(item.getResourceType().getType()); + entity.setAddress(item.getAddress()); + return entity; + }).collect(Collectors.toList()); + photoMapper.insert(photoList); + } } @Override diff --git a/yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/enums/ErrorCodeConstants.java b/yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/enums/ErrorCodeConstants.java index cb9e568..7b0d673 100644 --- a/yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/enums/ErrorCodeConstants.java +++ b/yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/enums/ErrorCodeConstants.java @@ -77,6 +77,7 @@ public interface ErrorCodeConstants { // ========== 钱包用户转账模块 1-007-010-000 ========== ErrorCode WALLET_USER_TRANSFER_NOT_FOUND = new ErrorCode(1_007_010_000, "用户转账单不存在"); + ErrorCode WALLET_USER_TRANSFER_NOT_SELF = new ErrorCode(1_007_010_001, "自己不能给自己送出礼物"); // ========== 示例订单 1-007-900-000 ========== ErrorCode DEMO_ORDER_NOT_FOUND = new ErrorCode(1_007_900_000, "示例订单不存在"); diff --git a/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/wallet/PayWalletRechargeServiceImpl.java b/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/wallet/PayWalletRechargeServiceImpl.java index 5fec2f2..3a6e117 100644 --- a/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/wallet/PayWalletRechargeServiceImpl.java +++ b/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/wallet/PayWalletRechargeServiceImpl.java @@ -127,7 +127,7 @@ public class PayWalletRechargeServiceImpl implements PayWalletRechargeService { public Long sendGift(AppPayWalletGiftSendReqVo dto) { // 自己不能给自己送出礼物 if (ObjectUtil.equals(dto.getTargetMemberId(), dto.getOperationMemberId())) { - throw new RuntimeException("自己不能给自己送出礼物"); + throw exception(WALLET_USER_TRANSFER_NOT_SELF); } // 查询目标用户钱包