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);
}
// 查询目标用户钱包