修正项目
This commit is contained in:
5
xlcs-parent/service/service-product/Dockerfile
Normal file
5
xlcs-parent/service/service-product/Dockerfile
Normal file
@@ -0,0 +1,5 @@
|
||||
FROM openjdk:8-jdk-alpine
|
||||
LABEL authors="yovinchen"
|
||||
VOLUME /tmp
|
||||
ADD ./target/service-product.jar service-product.jar
|
||||
ENTRYPOINT ["java","-jar","/service-product.jar", "&"]
|
57
xlcs-parent/service/service-product/pom.xml
Normal file
57
xlcs-parent/service/service-product/pom.xml
Normal file
@@ -0,0 +1,57 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>com.yovinchen</groupId>
|
||||
<artifactId>service</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>service-product</artifactId>
|
||||
<dependencies>
|
||||
|
||||
<!-- #低版本的okhttp会报错提示-->
|
||||
<dependency>
|
||||
<groupId>com.squareup.okhttp3</groupId>
|
||||
<artifactId>okhttp</artifactId>
|
||||
<version>4.9.0</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.minio</groupId>
|
||||
<artifactId>minio</artifactId>
|
||||
<version>8.5.6</version>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<artifactId>okhttp</artifactId>
|
||||
<groupId>com.squareup.okhttp3</groupId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<!-- 阿里云oss依赖 -->
|
||||
<dependency>
|
||||
<groupId>com.aliyun.oss</groupId>
|
||||
<artifactId>aliyun-sdk-oss</artifactId>
|
||||
<version>3.9.1</version>
|
||||
</dependency>
|
||||
<!-- 日期工具栏依赖 -->
|
||||
<dependency>
|
||||
<groupId>joda-time</groupId>
|
||||
<artifactId>joda-time</artifactId>
|
||||
<version>2.10.1</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.yovinchen</groupId>
|
||||
<artifactId>rabbit_util</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
<properties>
|
||||
<maven.compiler.source>8</maven.compiler.source>
|
||||
<maven.compiler.target>8</maven.compiler.target>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
</properties>
|
||||
|
||||
</project>
|
@@ -0,0 +1,21 @@
|
||||
package com.yovinchen.xlcs;
|
||||
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
|
||||
|
||||
/**
|
||||
* ClassName: ServiceProductApplication
|
||||
* Package: com.yovinchen.xlcs
|
||||
*
|
||||
* @author yovinchen
|
||||
* @Create 2023/9/15 09:47
|
||||
*/
|
||||
@SpringBootApplication
|
||||
@EnableDiscoveryClient
|
||||
public class ServiceProductApplication {
|
||||
|
||||
public static void main(String[] args) {
|
||||
SpringApplication.run(ServiceProductApplication.class, args);
|
||||
}
|
||||
}
|
@@ -0,0 +1,86 @@
|
||||
package com.yovinchen.xlcs.product.api;
|
||||
|
||||
import com.yovinchen.xlcs.model.product.Category;
|
||||
import com.yovinchen.xlcs.model.product.SkuInfo;
|
||||
import com.yovinchen.xlcs.product.service.CategoryService;
|
||||
import com.yovinchen.xlcs.product.service.SkuInfoService;
|
||||
import com.yovinchen.xlcs.vo.product.SkuInfoVo;
|
||||
import com.yovinchen.xlcs.vo.product.SkuStockLockVo;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* ClassName: ProductInnnerController
|
||||
* Package: com.yovinchen.xlcs.product.api
|
||||
*
|
||||
* @author yovinchen
|
||||
* @Create 2023/9/16 17:28
|
||||
*/
|
||||
@RestController
|
||||
@RequestMapping("api/product")
|
||||
public class ProductInnnerController {
|
||||
|
||||
@Autowired
|
||||
CategoryService categoryService;
|
||||
|
||||
@Autowired
|
||||
SkuInfoService skuInfoService;
|
||||
|
||||
@ApiOperation(value = "根据分类id获取分类信息")
|
||||
@GetMapping("inner/getCategory/{categoryId}")
|
||||
public Category getCategory(@PathVariable Long categoryId) {
|
||||
return categoryService.getById(categoryId);
|
||||
}
|
||||
|
||||
@ApiOperation(value = "根据skuId获取sku信息")
|
||||
@GetMapping("inner/getSkuInfo/{skuId}")
|
||||
public SkuInfo getSkuInfo(@PathVariable("skuId") Long skuId) {
|
||||
return skuInfoService.getById(skuId);
|
||||
}
|
||||
|
||||
@ApiOperation(value = "批量获取sku信息")
|
||||
@PostMapping("inner/findSkuInfoList")
|
||||
public List<SkuInfo> findSkuInfoList(@RequestBody List<Long> skuIdList) {
|
||||
return skuInfoService.findSkuInfoList(skuIdList);
|
||||
}
|
||||
|
||||
@ApiOperation(value = "批量获取分类信息")
|
||||
@PostMapping("inner/findCategoryList")
|
||||
public List<Category> findCategoryList(@RequestBody List<Long> categoryIdList) {
|
||||
return categoryService.listByIds(categoryIdList);
|
||||
}
|
||||
|
||||
@ApiOperation(value = "根据关键字获取sku列表")
|
||||
@GetMapping("inner/findSkuInfoByKeyword/{keyword}")
|
||||
public List<SkuInfo> findSkuInfoByKeyword(@PathVariable("keyword") String keyword) {
|
||||
return skuInfoService.findSkuInfoByKeyword(keyword);
|
||||
}
|
||||
|
||||
@ApiOperation(value = "获取所有分类")
|
||||
@GetMapping("inner/findAllCategoryList")
|
||||
public List<Category> findAllCategoryList() {
|
||||
return categoryService.list();
|
||||
}
|
||||
|
||||
@ApiOperation(value = "获取新人专享商品")
|
||||
@GetMapping("inner/findNewPersonSkuInfoList")
|
||||
public List<SkuInfo> findNewPersonSkuInfoList() {
|
||||
return skuInfoService.findNewPersonSkuInfoList();
|
||||
}
|
||||
|
||||
@ApiOperation(value = "根据skuId获取sku信息")
|
||||
@GetMapping("inner/getSkuInfoVo/{skuId}")
|
||||
public SkuInfoVo getSkuInfoVo(@PathVariable Long skuId) {
|
||||
return skuInfoService.getSkuInfoVo(skuId);
|
||||
}
|
||||
|
||||
@ApiOperation(value = "验证和锁定库存")
|
||||
@PostMapping("inner/checkAndLock/{orderNo}")
|
||||
public Boolean checkAndLock(@RequestBody List<SkuStockLockVo> skuStockLockVoList,
|
||||
@PathVariable String orderNo) {
|
||||
return skuInfoService.checkAndLock(skuStockLockVoList, orderNo);
|
||||
}
|
||||
}
|
@@ -0,0 +1,99 @@
|
||||
package com.yovinchen.xlcs.product.controller;
|
||||
|
||||
|
||||
import com.yovinchen.xlcs.common.result.Result;
|
||||
import com.yovinchen.xlcs.model.product.Attr;
|
||||
import com.yovinchen.xlcs.product.service.AttrService;
|
||||
import io.swagger.annotations.Api;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import io.swagger.annotations.ApiParam;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 商品属性 前端控制器
|
||||
* </p>
|
||||
*
|
||||
* @author yovinchen
|
||||
* @since 2023-09-15
|
||||
*/
|
||||
@Api(value = "Attr管理", tags = "平台属性管理")
|
||||
@RestController
|
||||
@RequestMapping(value = "/admin/product/attr")
|
||||
|
||||
public class AttrController {
|
||||
|
||||
@Autowired
|
||||
private AttrService attrService;
|
||||
|
||||
@ApiOperation(value = "获取平台属性列表")
|
||||
@GetMapping("{attrGroupId}")
|
||||
public Result index(
|
||||
@ApiParam(name = "attrGroupId", value = "分组id", required = true)
|
||||
@PathVariable Long attrGroupId) {
|
||||
try {
|
||||
return Result.ok(attrService.findByAttrGroupId(attrGroupId));
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("获取平台属性列表异常", e);
|
||||
}
|
||||
}
|
||||
|
||||
@ApiOperation(value = "获取平台属性")
|
||||
@GetMapping("get/{id}")
|
||||
public Result get(@PathVariable Long id) {
|
||||
try {
|
||||
Attr attr = attrService.getById(id);
|
||||
return Result.ok(attr);
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("获取平台属性异常", e);
|
||||
}
|
||||
}
|
||||
|
||||
@ApiOperation(value = "新增平台属性")
|
||||
@PostMapping("save")
|
||||
public Result save(@RequestBody Attr attr) {
|
||||
try {
|
||||
attrService.save(attr);
|
||||
return Result.ok(null);
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("新增平台属性异常", e);
|
||||
}
|
||||
}
|
||||
|
||||
@ApiOperation(value = "修改平台属性")
|
||||
@PutMapping("update")
|
||||
public Result updateById(@RequestBody Attr attr) {
|
||||
try {
|
||||
attrService.updateById(attr);
|
||||
return Result.ok(null);
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("修改平台属性异常", e);
|
||||
}
|
||||
}
|
||||
|
||||
@ApiOperation(value = "删除平台属性")
|
||||
@DeleteMapping("remove/{id}")
|
||||
public Result remove(@PathVariable Long id) {
|
||||
try {
|
||||
attrService.removeById(id);
|
||||
return Result.ok(null);
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("删除平台属性异常", e);
|
||||
}
|
||||
}
|
||||
|
||||
@ApiOperation(value = "根据id列表删除平台属性")
|
||||
@DeleteMapping("batchRemove")
|
||||
public Result batchRemove(@RequestBody List<Long> idList) {
|
||||
try {
|
||||
attrService.removeByIds(idList);
|
||||
return Result.ok(null);
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("根据id列表删除平台属性表异常", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -0,0 +1,117 @@
|
||||
package com.yovinchen.xlcs.product.controller;
|
||||
|
||||
|
||||
import com.yovinchen.xlcs.common.result.Result;
|
||||
import com.yovinchen.xlcs.model.product.AttrGroup;
|
||||
import com.yovinchen.xlcs.product.service.AttrGroupService;
|
||||
import com.yovinchen.xlcs.vo.product.AttrGroupQueryVo;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import io.swagger.annotations.Api;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import io.swagger.annotations.ApiParam;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 属性分组 前端控制器
|
||||
* </p>
|
||||
*
|
||||
* @author yovinchen
|
||||
* @since 2023-09-15
|
||||
*/
|
||||
@Api(value = "AttrGroup管理", tags = "平台属性分组管理")
|
||||
@RestController
|
||||
|
||||
@RequestMapping(value = "/admin/product/attrGroup")
|
||||
public class AttrGroupController {
|
||||
|
||||
@Autowired
|
||||
private AttrGroupService attrGroupService;
|
||||
|
||||
@ApiOperation(value = "获取平台属性分组分页列表")
|
||||
@GetMapping("{page}/{limit}")
|
||||
public Result index(@ApiParam(name = "page", value = "当前页码", required = true) @PathVariable Long page,
|
||||
@ApiParam(name = "limit", value = "每页记录数", required = true) @PathVariable Long limit,
|
||||
@ApiParam(name = "attrGroupQueryVo", value = "查询对象", required = false)
|
||||
AttrGroupQueryVo attrGroupQueryVo) {
|
||||
try {
|
||||
Page<AttrGroup> pageParam = new Page<>(page, limit);
|
||||
IPage<AttrGroup> pageModel = attrGroupService.selectPage(pageParam, attrGroupQueryVo);
|
||||
return Result.ok(pageModel);
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("获取平台属性分组分页列表异常", e);
|
||||
}
|
||||
}
|
||||
|
||||
@ApiOperation(value = "获取平台属性分组")
|
||||
@GetMapping("get/{id}")
|
||||
public Result get(@PathVariable Long id) {
|
||||
try {
|
||||
AttrGroup attrGroup = attrGroupService.getById(id);
|
||||
return StringUtils.isNotEmpty(attrGroup.toString()) ? Result.ok(attrGroup) : Result.fail(attrGroup);
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("获取商品分类信息异常", e);
|
||||
}
|
||||
}
|
||||
|
||||
@ApiOperation(value = "新增平台属性分组")
|
||||
@PostMapping("save")
|
||||
public Result save(@RequestBody AttrGroup attrGroup) {
|
||||
try {
|
||||
attrGroupService.save(attrGroup);
|
||||
return Result.ok(null);
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("新增平台属性分组异常", e);
|
||||
}
|
||||
}
|
||||
|
||||
@ApiOperation(value = "修改平台属性分组")
|
||||
@PutMapping("update")
|
||||
public Result updateById(@RequestBody AttrGroup attrGroup) {
|
||||
try {
|
||||
attrGroupService.updateById(attrGroup);
|
||||
return Result.ok(null);
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("修改平台属性分组异常", e);
|
||||
}
|
||||
}
|
||||
|
||||
@ApiOperation(value = "删除平台属性分组")
|
||||
@DeleteMapping("remove/{id}")
|
||||
public Result remove(@PathVariable Long id) {
|
||||
try {
|
||||
attrGroupService.removeById(id);
|
||||
return Result.ok(null);
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("删除平台属性分组异常", e);
|
||||
}
|
||||
}
|
||||
|
||||
@ApiOperation(value = "根据id列表删除平台属性分组")
|
||||
@DeleteMapping("batchRemove")
|
||||
public Result batchRemove(@RequestBody List<Long> idList) {
|
||||
try {
|
||||
attrGroupService.removeByIds(idList);
|
||||
return Result.ok(null);
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("根据id列表删除平台属性分组异常", e);
|
||||
}
|
||||
}
|
||||
|
||||
@ApiOperation(value = "获取全部平台属性分组")
|
||||
@GetMapping("findAllList")
|
||||
public Result findAllList() {
|
||||
try {
|
||||
return Result.ok(attrGroupService.findAllList());
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("获取全部平台属性分组异常", e);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@@ -0,0 +1,20 @@
|
||||
package com.yovinchen.xlcs.product.controller;
|
||||
|
||||
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 三级分类表 前端控制器
|
||||
* </p>
|
||||
*
|
||||
* @author yovinchen
|
||||
* @since 2023-09-15
|
||||
*/
|
||||
@RestController
|
||||
@RequestMapping("/product/base-category-trademark")
|
||||
public class BaseCategoryTrademarkController {
|
||||
|
||||
}
|
||||
|
@@ -0,0 +1,116 @@
|
||||
package com.yovinchen.xlcs.product.controller;
|
||||
|
||||
|
||||
import com.yovinchen.xlcs.common.result.Result;
|
||||
import com.yovinchen.xlcs.model.product.Category;
|
||||
import com.yovinchen.xlcs.product.service.CategoryService;
|
||||
import com.yovinchen.xlcs.vo.product.CategoryQueryVo;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import io.swagger.annotations.Api;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import io.swagger.annotations.ApiParam;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 商品三级分类 前端控制器
|
||||
* </p>
|
||||
*
|
||||
* @author yovinchen
|
||||
* @since 2023-09-15
|
||||
*/
|
||||
@Api(value = "Category管理", tags = "商品分类管理")
|
||||
@RestController
|
||||
|
||||
@RequestMapping(value = "/admin/product/category")
|
||||
public class CategoryController {
|
||||
|
||||
@Autowired
|
||||
private CategoryService categoryService;
|
||||
|
||||
@ApiOperation(value = "获取商品分类分页列表")
|
||||
@GetMapping("{page}/{limit}")
|
||||
public Result index(
|
||||
@ApiParam(name = "page", value = "当前页码", required = true) @PathVariable Long page,
|
||||
@ApiParam(name = "limit", value = "每页记录数", required = true) @PathVariable Long limit,
|
||||
@ApiParam(name = "categoryQueryVo", value = "查询对象", required = false) CategoryQueryVo categoryQueryVo) {
|
||||
try {
|
||||
Page<Category> pageParam = new Page<>(page, limit);
|
||||
IPage<Category> pageModel = categoryService.selectPage(pageParam, categoryQueryVo);
|
||||
return Result.ok(pageModel);
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("获取商品分类分页列表异常", e);
|
||||
}
|
||||
}
|
||||
|
||||
@ApiOperation(value = "获取商品分类信息")
|
||||
@GetMapping("get/{id}")
|
||||
public Result get(@PathVariable Long id) {
|
||||
try {
|
||||
Category category = categoryService.getById(id);
|
||||
return StringUtils.isNotEmpty(category.toString()) ? Result.ok(category) : Result.fail(category);
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("获取商品分类信息异常", e);
|
||||
}
|
||||
}
|
||||
|
||||
@ApiOperation(value = "新增商品分类")
|
||||
@PostMapping("save")
|
||||
public Result save(@RequestBody Category category) {
|
||||
try {
|
||||
categoryService.save(category);
|
||||
return Result.ok(null);
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("新增商品分类异常", e);
|
||||
}
|
||||
}
|
||||
|
||||
@ApiOperation(value = "修改商品分类")
|
||||
@PutMapping("update")
|
||||
public Result updateById(@RequestBody Category category) {
|
||||
try {
|
||||
categoryService.updateById(category);
|
||||
return Result.ok(null);
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("修改商品分类异常", e);
|
||||
}
|
||||
}
|
||||
|
||||
@ApiOperation(value = "删除商品分类")
|
||||
@DeleteMapping("remove/{id}")
|
||||
public Result remove(@PathVariable Long id) {
|
||||
try {
|
||||
categoryService.removeById(id);
|
||||
return Result.ok(null);
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("删除商品分类异常", e);
|
||||
}
|
||||
}
|
||||
|
||||
@ApiOperation(value = "根据id列表删除商品分类")
|
||||
@DeleteMapping("batchRemove")
|
||||
public Result batchRemove(@RequestBody List<Long> idList) {
|
||||
try {
|
||||
categoryService.removeByIds(idList);
|
||||
return Result.ok(null);
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("根据id列表删除商品分类异常", e);
|
||||
}
|
||||
}
|
||||
|
||||
@ApiOperation(value = "获取全部商品分类")
|
||||
@GetMapping("findAllList")
|
||||
public Result findAllList() {
|
||||
try {
|
||||
return Result.ok(categoryService.findAllList());
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("获取全部商品分类异常", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -0,0 +1,20 @@
|
||||
package com.yovinchen.xlcs.product.controller;
|
||||
|
||||
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 商品评价 前端控制器
|
||||
* </p>
|
||||
*
|
||||
* @author yovinchen
|
||||
* @since 2023-09-15
|
||||
*/
|
||||
@RestController
|
||||
@RequestMapping("/product/comment")
|
||||
public class CommentController {
|
||||
|
||||
}
|
||||
|
@@ -0,0 +1,20 @@
|
||||
package com.yovinchen.xlcs.product.controller;
|
||||
|
||||
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 产品评价回复表 前端控制器
|
||||
* </p>
|
||||
*
|
||||
* @author yovinchen
|
||||
* @since 2023-09-15
|
||||
*/
|
||||
@RestController
|
||||
@RequestMapping("/product/comment-replay")
|
||||
public class CommentReplayController {
|
||||
|
||||
}
|
||||
|
@@ -0,0 +1,45 @@
|
||||
package com.yovinchen.xlcs.product.controller;
|
||||
|
||||
import com.yovinchen.xlcs.common.result.Result;
|
||||
import com.yovinchen.xlcs.product.service.FileUploadService;
|
||||
import io.swagger.annotations.Api;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
/**
|
||||
* ClassName: FileUploadController
|
||||
* Package: com.yovinchen.xlcs.product.controller
|
||||
*
|
||||
* @author yovinchen
|
||||
* @Create 2023/9/15 13:56
|
||||
*/
|
||||
@Api(tags = "文件上传接口")
|
||||
@RestController
|
||||
|
||||
@RequestMapping("admin/product")
|
||||
public class FileUploadController {
|
||||
|
||||
@Autowired
|
||||
private FileUploadService fileUploadService;
|
||||
|
||||
/**
|
||||
* 文件上传
|
||||
*
|
||||
* @param file
|
||||
* @return
|
||||
* @throws Exception
|
||||
*/
|
||||
@ApiOperation("文件上传接口")
|
||||
@PostMapping("fileUpload")
|
||||
public Result fileUpload(MultipartFile file) throws Exception {
|
||||
try {
|
||||
return Result.ok(fileUploadService.fileUpload(file));
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("文件上传接口异常", e);
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,20 @@
|
||||
package com.yovinchen.xlcs.product.controller;
|
||||
|
||||
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* mq去重表 前端控制器
|
||||
* </p>
|
||||
*
|
||||
* @author yovinchen
|
||||
* @since 2023-09-15
|
||||
*/
|
||||
@RestController
|
||||
@RequestMapping("/product/mq-repeat-record")
|
||||
public class MqRepeatRecordController {
|
||||
|
||||
}
|
||||
|
@@ -0,0 +1,20 @@
|
||||
package com.yovinchen.xlcs.product.controller;
|
||||
|
||||
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 城市仓库关联表 前端控制器
|
||||
* </p>
|
||||
*
|
||||
* @author yovinchen
|
||||
* @since 2023-09-15
|
||||
*/
|
||||
@RestController
|
||||
@RequestMapping("/product/region-ware")
|
||||
public class RegionWareController {
|
||||
|
||||
}
|
||||
|
@@ -0,0 +1,20 @@
|
||||
package com.yovinchen.xlcs.product.controller;
|
||||
|
||||
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* spu属性值 前端控制器
|
||||
* </p>
|
||||
*
|
||||
* @author yovinchen
|
||||
* @since 2023-09-15
|
||||
*/
|
||||
@RestController
|
||||
@RequestMapping("/product/sku-attr-value")
|
||||
public class SkuAttrValueController {
|
||||
|
||||
}
|
||||
|
@@ -0,0 +1,20 @@
|
||||
package com.yovinchen.xlcs.product.controller;
|
||||
|
||||
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* spu属性值 前端控制器
|
||||
* </p>
|
||||
*
|
||||
* @author yovinchen
|
||||
* @since 2023-09-15
|
||||
*/
|
||||
@RestController
|
||||
@RequestMapping("/product/sku-detail")
|
||||
public class SkuDetailController {
|
||||
|
||||
}
|
||||
|
@@ -0,0 +1,20 @@
|
||||
package com.yovinchen.xlcs.product.controller;
|
||||
|
||||
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 商品图片 前端控制器
|
||||
* </p>
|
||||
*
|
||||
* @author yovinchen
|
||||
* @since 2023-09-15
|
||||
*/
|
||||
@RestController
|
||||
@RequestMapping("/product/sku-image")
|
||||
public class SkuImageController {
|
||||
|
||||
}
|
||||
|
@@ -0,0 +1,141 @@
|
||||
package com.yovinchen.xlcs.product.controller;
|
||||
|
||||
|
||||
import com.yovinchen.xlcs.common.result.Result;
|
||||
import com.yovinchen.xlcs.model.product.SkuInfo;
|
||||
import com.yovinchen.xlcs.product.service.SkuInfoService;
|
||||
import com.yovinchen.xlcs.vo.product.SkuInfoQueryVo;
|
||||
import com.yovinchen.xlcs.vo.product.SkuInfoVo;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import io.swagger.annotations.Api;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import io.swagger.annotations.ApiParam;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* sku信息 前端控制器
|
||||
* </p>
|
||||
*
|
||||
* @author yovinchen
|
||||
* @since 2023-09-15
|
||||
*/
|
||||
@Api(value = "SkuInfo管理", tags = "商品Sku管理")
|
||||
@RestController
|
||||
|
||||
@RequestMapping(value = "/admin/product/skuInfo")
|
||||
public class SkuInfoController {
|
||||
|
||||
@Autowired
|
||||
private SkuInfoService skuInfoService;
|
||||
|
||||
@ApiOperation(value = "获取sku分页列表")
|
||||
@GetMapping("{page}/{limit}")
|
||||
public Result<IPage<SkuInfo>> index(
|
||||
@ApiParam(name = "page", value = "当前页码", required = true) @PathVariable Long page,
|
||||
@ApiParam(name = "limit", value = "每页记录数", required = true) @PathVariable Long limit,
|
||||
@ApiParam(name = "skuInfoQueryVo", value = "查询对象", required = false) SkuInfoQueryVo skuInfoQueryVo) {
|
||||
try {
|
||||
Page<SkuInfo> pageParam = new Page<>(page, limit);
|
||||
IPage<SkuInfo> pageModel = skuInfoService.selectPage(pageParam, skuInfoQueryVo);
|
||||
return Result.ok(pageModel);
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("获取sku分页列表异常", e);
|
||||
}
|
||||
}
|
||||
|
||||
@ApiOperation(value = "新增商品sku信息")
|
||||
@PostMapping("save")
|
||||
public Result save(@RequestBody SkuInfoVo skuInfoVo) {
|
||||
try {
|
||||
skuInfoService.saveSkuInfo(skuInfoVo);
|
||||
return Result.ok(null);
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("新增商品sku信息异常", e);
|
||||
}
|
||||
}
|
||||
|
||||
@ApiOperation(value = "获取商品sku信息")
|
||||
@GetMapping("get/{id}")
|
||||
public Result<SkuInfoVo> get(@PathVariable Long id) {
|
||||
try {
|
||||
SkuInfoVo skuInfoVo = skuInfoService.getSkuInfoVo(id);
|
||||
return Result.ok(skuInfoVo);
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("新增商品sku信息异常", e);
|
||||
}
|
||||
}
|
||||
|
||||
@ApiOperation(value = "修改商品sku信息")
|
||||
@PutMapping("update")
|
||||
public Result updateById(@RequestBody SkuInfoVo skuInfoVo) {
|
||||
try {
|
||||
skuInfoService.updateSkuInfo(skuInfoVo);
|
||||
return Result.ok(null);
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("修改商品sku信息异常", e);
|
||||
}
|
||||
}
|
||||
|
||||
@ApiOperation(value = "删除商品sku信息")
|
||||
@DeleteMapping("remove/{id}")
|
||||
public Result remove(@PathVariable Long id) {
|
||||
try {
|
||||
skuInfoService.deleteById(id);
|
||||
return Result.ok(null);
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("删除商品sku信息异常", e);
|
||||
}
|
||||
}
|
||||
|
||||
@ApiOperation(value = "根据id列表删除商品sku信息")
|
||||
@DeleteMapping("batchRemove")
|
||||
public Result batchRemove(@RequestBody List<Long> idList) {
|
||||
try {
|
||||
skuInfoService.deleteByIds(idList);
|
||||
return Result.ok(null);
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("根据id列表删除商品sku信息异常", e);
|
||||
}
|
||||
}
|
||||
|
||||
@ApiOperation(value = "商品审核")
|
||||
@GetMapping("check/{skuId}/{status}")
|
||||
public Result check(@PathVariable("skuId") Long skuId, @PathVariable("status") Integer status) {
|
||||
try {
|
||||
skuInfoService.check(skuId, status);
|
||||
return Result.ok(null);
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("商品审核异常", e);
|
||||
}
|
||||
}
|
||||
|
||||
@ApiOperation(value = "商品上/下架")
|
||||
@GetMapping("publish/{skuId}/{status}")
|
||||
public Result publish(@PathVariable("skuId") Long skuId,
|
||||
@PathVariable("status") Integer status) {
|
||||
try {
|
||||
skuInfoService.publish(skuId, status);
|
||||
return Result.ok(null);
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("商品上/下架异常", e);
|
||||
}
|
||||
}
|
||||
|
||||
@ApiOperation(value = "新人专享")
|
||||
@GetMapping("isNewPerson/{skuId}/{status}")
|
||||
public Result isNewPerson(@PathVariable("skuId") Long skuId,
|
||||
@PathVariable("status") Integer status) {
|
||||
try {
|
||||
skuInfoService.isNewPerson(skuId, status);
|
||||
return Result.ok(null);
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("新人专享异常", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -0,0 +1,20 @@
|
||||
package com.yovinchen.xlcs.product.controller;
|
||||
|
||||
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 商品海报表 前端控制器
|
||||
* </p>
|
||||
*
|
||||
* @author yovinchen
|
||||
* @since 2023-09-15
|
||||
*/
|
||||
@RestController
|
||||
@RequestMapping("/product/sku-poster")
|
||||
public class SkuPosterController {
|
||||
|
||||
}
|
||||
|
@@ -0,0 +1,20 @@
|
||||
package com.yovinchen.xlcs.product.controller;
|
||||
|
||||
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* sku的库存历史记录 前端控制器
|
||||
* </p>
|
||||
*
|
||||
* @author yovinchen
|
||||
* @since 2023-09-15
|
||||
*/
|
||||
@RestController
|
||||
@RequestMapping("/product/sku-stock-history")
|
||||
public class SkuStockHistoryController {
|
||||
|
||||
}
|
||||
|
@@ -0,0 +1,20 @@
|
||||
package com.yovinchen.xlcs.product.controller;
|
||||
|
||||
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 仓库表 前端控制器
|
||||
* </p>
|
||||
*
|
||||
* @author yovinchen
|
||||
* @since 2023-09-15
|
||||
*/
|
||||
@RestController
|
||||
@RequestMapping("/product/ware")
|
||||
public class WareController {
|
||||
|
||||
}
|
||||
|
@@ -0,0 +1,16 @@
|
||||
package com.yovinchen.xlcs.product.mapper;
|
||||
|
||||
import com.yovinchen.xlcs.model.product.AttrGroup;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 属性分组 Mapper 接口
|
||||
* </p>
|
||||
*
|
||||
* @author yovinchen
|
||||
* @since 2023-09-15
|
||||
*/
|
||||
public interface AttrGroupMapper extends BaseMapper<AttrGroup> {
|
||||
|
||||
}
|
@@ -0,0 +1,16 @@
|
||||
package com.yovinchen.xlcs.product.mapper;
|
||||
|
||||
import com.yovinchen.xlcs.model.product.Attr;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 商品属性 Mapper 接口
|
||||
* </p>
|
||||
*
|
||||
* @author yovinchen
|
||||
* @since 2023-09-15
|
||||
*/
|
||||
public interface AttrMapper extends BaseMapper<Attr> {
|
||||
|
||||
}
|
@@ -0,0 +1,16 @@
|
||||
package com.yovinchen.xlcs.product.mapper;
|
||||
|
||||
import com.yovinchen.xlcs.model.product.BaseCategoryTrademark;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 三级分类表 Mapper 接口
|
||||
* </p>
|
||||
*
|
||||
* @author yovinchen
|
||||
* @since 2023-09-15
|
||||
*/
|
||||
public interface BaseCategoryTrademarkMapper extends BaseMapper<BaseCategoryTrademark> {
|
||||
|
||||
}
|
@@ -0,0 +1,16 @@
|
||||
package com.yovinchen.xlcs.product.mapper;
|
||||
|
||||
import com.yovinchen.xlcs.model.product.Category;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 商品三级分类 Mapper 接口
|
||||
* </p>
|
||||
*
|
||||
* @author yovinchen
|
||||
* @since 2023-09-15
|
||||
*/
|
||||
public interface CategoryMapper extends BaseMapper<Category> {
|
||||
|
||||
}
|
@@ -0,0 +1,16 @@
|
||||
package com.yovinchen.xlcs.product.mapper;
|
||||
|
||||
import com.yovinchen.xlcs.model.product.Comment;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 商品评价 Mapper 接口
|
||||
* </p>
|
||||
*
|
||||
* @author yovinchen
|
||||
* @since 2023-09-15
|
||||
*/
|
||||
public interface CommentMapper extends BaseMapper<Comment> {
|
||||
|
||||
}
|
@@ -0,0 +1,16 @@
|
||||
package com.yovinchen.xlcs.product.mapper;
|
||||
|
||||
import com.yovinchen.xlcs.model.product.CommentReplay;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 产品评价回复表 Mapper 接口
|
||||
* </p>
|
||||
*
|
||||
* @author yovinchen
|
||||
* @since 2023-09-15
|
||||
*/
|
||||
public interface CommentReplayMapper extends BaseMapper<CommentReplay> {
|
||||
|
||||
}
|
@@ -0,0 +1,16 @@
|
||||
package com.yovinchen.xlcs.product.mapper;
|
||||
|
||||
import com.yovinchen.xlcs.model.base.MqRepeatRecord;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* mq去重表 Mapper 接口
|
||||
* </p>
|
||||
*
|
||||
* @author yovinchen
|
||||
* @since 2023-09-15
|
||||
*/
|
||||
public interface MqRepeatRecordMapper extends BaseMapper<MqRepeatRecord> {
|
||||
|
||||
}
|
@@ -0,0 +1,16 @@
|
||||
package com.yovinchen.xlcs.product.mapper;
|
||||
|
||||
import com.yovinchen.xlcs.model.sys.RegionWare;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 城市仓库关联表 Mapper 接口
|
||||
* </p>
|
||||
*
|
||||
* @author yovinchen
|
||||
* @since 2023-09-15
|
||||
*/
|
||||
public interface RegionWareMapper extends BaseMapper<RegionWare> {
|
||||
|
||||
}
|
@@ -0,0 +1,16 @@
|
||||
package com.yovinchen.xlcs.product.mapper;
|
||||
|
||||
import com.yovinchen.xlcs.model.product.SkuAttrValue;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* spu属性值 Mapper 接口
|
||||
* </p>
|
||||
*
|
||||
* @author yovinchen
|
||||
* @since 2023-09-15
|
||||
*/
|
||||
public interface SkuAttrValueMapper extends BaseMapper<SkuAttrValue> {
|
||||
|
||||
}
|
@@ -0,0 +1,16 @@
|
||||
package com.yovinchen.xlcs.product.mapper;
|
||||
|
||||
import com.yovinchen.xlcs.model.product.SkuDetail;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* spu属性值 Mapper 接口
|
||||
* </p>
|
||||
*
|
||||
* @author yovinchen
|
||||
* @since 2023-09-15
|
||||
*/
|
||||
public interface SkuDetailMapper extends BaseMapper<SkuDetail> {
|
||||
|
||||
}
|
@@ -0,0 +1,16 @@
|
||||
package com.yovinchen.xlcs.product.mapper;
|
||||
|
||||
import com.yovinchen.xlcs.model.product.SkuImage;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 商品图片 Mapper 接口
|
||||
* </p>
|
||||
*
|
||||
* @author yovinchen
|
||||
* @since 2023-09-15
|
||||
*/
|
||||
public interface SkuImageMapper extends BaseMapper<SkuImage> {
|
||||
|
||||
}
|
@@ -0,0 +1,50 @@
|
||||
package com.yovinchen.xlcs.product.mapper;
|
||||
|
||||
import com.yovinchen.xlcs.model.product.SkuInfo;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* sku信息 Mapper 接口
|
||||
* </p>
|
||||
*
|
||||
* @author yovinchen
|
||||
* @since 2023-09-15
|
||||
*/
|
||||
public interface SkuInfoMapper extends BaseMapper<SkuInfo> {
|
||||
|
||||
/**
|
||||
* 验证库存
|
||||
*
|
||||
* @param skuId
|
||||
* @param skuNum
|
||||
* @return
|
||||
*/
|
||||
SkuInfo checkStock(@Param("skuId") Long skuId, @Param("skuNum") Integer skuNum);
|
||||
|
||||
/**
|
||||
* 锁订库存
|
||||
*
|
||||
* @param skuId
|
||||
* @param skuNum
|
||||
* @return
|
||||
*/
|
||||
Integer lockStock(@Param("skuId") Long skuId, @Param("skuNum") Integer skuNum);
|
||||
|
||||
/**
|
||||
* 解锁库存
|
||||
*
|
||||
* @param skuId
|
||||
* @param skuNum
|
||||
*/
|
||||
void unlockStock(@Param("skuId") Long skuId, @Param("skuNum") Integer skuNum);
|
||||
|
||||
/**z
|
||||
* 减库存
|
||||
*
|
||||
* @param skuId
|
||||
* @param skuNum
|
||||
*/
|
||||
void minusStock(@Param("skuId") Long skuId, @Param("skuNum") Integer skuNum);
|
||||
}
|
@@ -0,0 +1,17 @@
|
||||
package com.yovinchen.xlcs.product.mapper;
|
||||
|
||||
|
||||
import com.yovinchen.xlcs.model.product.SkuPoster;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 商品海报表 Mapper 接口
|
||||
* </p>
|
||||
*
|
||||
* @author yovinchen
|
||||
* @since 2023-09-15
|
||||
*/
|
||||
public interface SkuPosterMapper extends BaseMapper<SkuPoster> {
|
||||
|
||||
}
|
@@ -0,0 +1,16 @@
|
||||
package com.yovinchen.xlcs.product.mapper;
|
||||
|
||||
import com.yovinchen.xlcs.model.product.SkuStockHistory;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* sku的库存历史记录 Mapper 接口
|
||||
* </p>
|
||||
*
|
||||
* @author yovinchen
|
||||
* @since 2023-09-15
|
||||
*/
|
||||
public interface SkuStockHistoryMapper extends BaseMapper<SkuStockHistory> {
|
||||
|
||||
}
|
@@ -0,0 +1,16 @@
|
||||
package com.yovinchen.xlcs.product.mapper;
|
||||
|
||||
import com.yovinchen.xlcs.model.sys.Ware;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 仓库表 Mapper 接口
|
||||
* </p>
|
||||
*
|
||||
* @author yovinchen
|
||||
* @since 2023-09-15
|
||||
*/
|
||||
public interface WareMapper extends BaseMapper<Ware> {
|
||||
|
||||
}
|
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.yovinchen.xlcs.product.mapper.AttrGroupMapper">
|
||||
|
||||
</mapper>
|
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.yovinchen.xlcs.product.mapper.AttrMapper">
|
||||
|
||||
</mapper>
|
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.yovinchen.xlcs.product.mapper.BaseCategoryTrademarkMapper">
|
||||
|
||||
</mapper>
|
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.yovinchen.xlcs.product.mapper.CategoryMapper">
|
||||
|
||||
</mapper>
|
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.yovinchen.xlcs.product.mapper.CommentMapper">
|
||||
|
||||
</mapper>
|
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.yovinchen.xlcs.product.mapper.CommentReplayMapper">
|
||||
|
||||
</mapper>
|
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.yovinchen.xlcs.product.mapper.MqRepeatRecordMapper">
|
||||
|
||||
</mapper>
|
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.yovinchen.xlcs.product.mapper.RegionWareMapper">
|
||||
|
||||
</mapper>
|
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.yovinchen.xlcs.product.mapper.SkuAttrValueMapper">
|
||||
|
||||
</mapper>
|
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.yovinchen.xlcs.product.mapper.SkuDetailMapper">
|
||||
|
||||
</mapper>
|
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.yovinchen.xlcs.product.mapper.SkuImageMapper">
|
||||
|
||||
</mapper>
|
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.yovinchen.xlcs.product.mapper.SkuPosterMapper">
|
||||
|
||||
</mapper>
|
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.yovinchen.xlcs.product.mapper.SkuStockHistoryMapper">
|
||||
|
||||
</mapper>
|
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.yovinchen.xlcs.product.mapper.WareMapper">
|
||||
|
||||
</mapper>
|
@@ -0,0 +1,43 @@
|
||||
package com.yovinchen.xlcs.product.receiver;
|
||||
|
||||
import com.yovinchen.xlcs.mq.constant.MqConst;
|
||||
import com.yovinchen.xlcs.product.service.SkuInfoService;
|
||||
import com.rabbitmq.client.Channel;
|
||||
import org.springframework.amqp.core.Message;
|
||||
import org.springframework.amqp.rabbit.annotation.Exchange;
|
||||
import org.springframework.amqp.rabbit.annotation.Queue;
|
||||
import org.springframework.amqp.rabbit.annotation.QueueBinding;
|
||||
import org.springframework.amqp.rabbit.annotation.RabbitListener;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
* ClassName: StockReceiver
|
||||
* Package: com.yovinchen.xlcs.product.receiver
|
||||
*
|
||||
* @author yovinchen
|
||||
* @Create 2023/10/13 15:05
|
||||
*/
|
||||
@Component
|
||||
public class StockReceiver {
|
||||
|
||||
@Autowired
|
||||
private SkuInfoService skuInfoService;
|
||||
|
||||
/**
|
||||
* 扣减库存成功,更新订单状态
|
||||
*
|
||||
* @param orderNo
|
||||
* @throws IOException
|
||||
*/
|
||||
@RabbitListener(bindings = @QueueBinding(value = @Queue(value = MqConst.QUEUE_MINUS_STOCK, durable = "true"), exchange = @Exchange(value = MqConst.EXCHANGE_ORDER_DIRECT), key = {MqConst.ROUTING_MINUS_STOCK}))
|
||||
public void minusStock(String orderNo, Message message, Channel channel) throws IOException {
|
||||
if (!StringUtils.isEmpty(orderNo)) {
|
||||
skuInfoService.minusStock(orderNo);
|
||||
}
|
||||
channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
|
||||
}
|
||||
}
|
@@ -0,0 +1,25 @@
|
||||
package com.yovinchen.xlcs.product.service;
|
||||
|
||||
import com.yovinchen.xlcs.model.product.AttrGroup;
|
||||
import com.yovinchen.xlcs.vo.product.AttrGroupQueryVo;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 属性分组 服务类
|
||||
* </p>
|
||||
*
|
||||
* @author yovinchen
|
||||
* @since 2023-09-15
|
||||
*/
|
||||
public interface AttrGroupService extends IService<AttrGroup> {
|
||||
|
||||
List<AttrGroup> findAllList();
|
||||
|
||||
//平台属性分组列表
|
||||
IPage<AttrGroup> selectPage(Page<AttrGroup> pageParam, AttrGroupQueryVo attrGroupQueryVo);
|
||||
}
|
@@ -0,0 +1,19 @@
|
||||
package com.yovinchen.xlcs.product.service;
|
||||
|
||||
import com.yovinchen.xlcs.model.product.Attr;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 商品属性 服务类
|
||||
* </p>
|
||||
*
|
||||
* @author yovinchen
|
||||
* @since 2023-09-15
|
||||
*/
|
||||
public interface AttrService extends IService<Attr> {
|
||||
|
||||
List<Attr> findByAttrGroupId(Long attrGroupId);
|
||||
}
|
@@ -0,0 +1,16 @@
|
||||
package com.yovinchen.xlcs.product.service;
|
||||
|
||||
import com.yovinchen.xlcs.model.product.BaseCategoryTrademark;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 三级分类表 服务类
|
||||
* </p>
|
||||
*
|
||||
* @author yovinchen
|
||||
* @since 2023-09-15
|
||||
*/
|
||||
public interface BaseCategoryTrademarkService extends IService<BaseCategoryTrademark> {
|
||||
|
||||
}
|
@@ -0,0 +1,25 @@
|
||||
package com.yovinchen.xlcs.product.service;
|
||||
|
||||
|
||||
import com.yovinchen.xlcs.model.product.Category;
|
||||
import com.yovinchen.xlcs.vo.product.CategoryQueryVo;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 商品三级分类 服务类
|
||||
* </p>
|
||||
*
|
||||
* @author yovinchen
|
||||
* @since 2023-09-15
|
||||
*/
|
||||
public interface CategoryService extends IService<Category> {
|
||||
|
||||
IPage<Category> selectPage(Page<Category> pageParam, CategoryQueryVo categoryQueryVo);
|
||||
|
||||
List<Category> findAllList();
|
||||
}
|
@@ -0,0 +1,17 @@
|
||||
package com.yovinchen.xlcs.product.service;
|
||||
|
||||
|
||||
import com.yovinchen.xlcs.model.product.CommentReplay;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 产品评价回复表 服务类
|
||||
* </p>
|
||||
*
|
||||
* @author yovinchen
|
||||
* @since 2023-09-15
|
||||
*/
|
||||
public interface CommentReplayService extends IService<CommentReplay> {
|
||||
|
||||
}
|
@@ -0,0 +1,17 @@
|
||||
package com.yovinchen.xlcs.product.service;
|
||||
|
||||
|
||||
import com.yovinchen.xlcs.model.product.Comment;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 商品评价 服务类
|
||||
* </p>
|
||||
*
|
||||
* @author yovinchen
|
||||
* @since 2023-09-15
|
||||
*/
|
||||
public interface CommentService extends IService<Comment> {
|
||||
|
||||
}
|
@@ -0,0 +1,14 @@
|
||||
package com.yovinchen.xlcs.product.service;
|
||||
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
/**
|
||||
* ClassName: FileUploadService
|
||||
* Package: com.yovinchen.xlcs.product.service
|
||||
*
|
||||
* @author yovinchen
|
||||
* @Create 2023/9/15 13:57
|
||||
*/
|
||||
public interface FileUploadService {
|
||||
String fileUpload(MultipartFile file) throws Exception;
|
||||
}
|
@@ -0,0 +1,16 @@
|
||||
package com.yovinchen.xlcs.product.service;
|
||||
|
||||
import com.yovinchen.xlcs.model.base.MqRepeatRecord;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* mq去重表 服务类
|
||||
* </p>
|
||||
*
|
||||
* @author yovinchen
|
||||
* @since 2023-09-15
|
||||
*/
|
||||
public interface MqRepeatRecordService extends IService<MqRepeatRecord> {
|
||||
|
||||
}
|
@@ -0,0 +1,16 @@
|
||||
package com.yovinchen.xlcs.product.service;
|
||||
|
||||
import com.yovinchen.xlcs.model.sys.RegionWare;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 城市仓库关联表 服务类
|
||||
* </p>
|
||||
*
|
||||
* @author yovinchen
|
||||
* @since 2023-09-15
|
||||
*/
|
||||
public interface RegionWareService extends IService<RegionWare> {
|
||||
|
||||
}
|
@@ -0,0 +1,19 @@
|
||||
package com.yovinchen.xlcs.product.service;
|
||||
|
||||
import com.yovinchen.xlcs.model.product.SkuAttrValue;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* spu属性值 服务类
|
||||
* </p>
|
||||
*
|
||||
* @author yovinchen
|
||||
* @since 2023-09-15
|
||||
*/
|
||||
public interface SkuAttrValueService extends IService<SkuAttrValue> {
|
||||
|
||||
List<SkuAttrValue> findBySkuId(Long skuId);
|
||||
}
|
@@ -0,0 +1,16 @@
|
||||
package com.yovinchen.xlcs.product.service;
|
||||
|
||||
import com.yovinchen.xlcs.model.product.SkuDetail;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* spu属性值 服务类
|
||||
* </p>
|
||||
*
|
||||
* @author yovinchen
|
||||
* @since 2023-09-15
|
||||
*/
|
||||
public interface SkuDetailService extends IService<SkuDetail> {
|
||||
|
||||
}
|
@@ -0,0 +1,19 @@
|
||||
package com.yovinchen.xlcs.product.service;
|
||||
|
||||
import com.yovinchen.xlcs.model.product.SkuImage;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 商品图片 服务类
|
||||
* </p>
|
||||
*
|
||||
* @author yovinchen
|
||||
* @since 2023-09-15
|
||||
*/
|
||||
public interface SkuImageService extends IService<SkuImage> {
|
||||
|
||||
List<SkuImage> findBySkuId(Long skuId);
|
||||
}
|
@@ -0,0 +1,125 @@
|
||||
package com.yovinchen.xlcs.product.service;
|
||||
|
||||
import com.yovinchen.xlcs.model.product.SkuInfo;
|
||||
import com.yovinchen.xlcs.vo.product.SkuInfoQueryVo;
|
||||
import com.yovinchen.xlcs.vo.product.SkuInfoVo;
|
||||
import com.yovinchen.xlcs.vo.product.SkuStockLockVo;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* sku信息 服务类
|
||||
* </p>
|
||||
*
|
||||
* @author yovinchen
|
||||
* @since 2023-09-15
|
||||
*/
|
||||
public interface SkuInfoService extends IService<SkuInfo> {
|
||||
/**
|
||||
* 获取sku分页列表
|
||||
*
|
||||
* @param pageParam
|
||||
* @param skuInfoQueryVo
|
||||
* @return
|
||||
*/
|
||||
IPage<SkuInfo> selectPage(Page<SkuInfo> pageParam, SkuInfoQueryVo skuInfoQueryVo);
|
||||
|
||||
/**
|
||||
* 新增商品sku信息
|
||||
*
|
||||
* @param skuInfoVo
|
||||
*/
|
||||
void saveSkuInfo(SkuInfoVo skuInfoVo);
|
||||
|
||||
/**
|
||||
* 根据id获取商品sku信息
|
||||
*
|
||||
* @param id
|
||||
* @return
|
||||
*/
|
||||
SkuInfoVo getSkuInfoVo(Long id);
|
||||
|
||||
void updateSkuInfo(SkuInfoVo skuInfoVo);
|
||||
|
||||
/**
|
||||
* a商品审核
|
||||
*
|
||||
* @param skuId
|
||||
* @param status
|
||||
*/
|
||||
void check(Long skuId, Integer status);
|
||||
|
||||
/**
|
||||
* 商品上/下架
|
||||
*
|
||||
* @param skuId
|
||||
* @param status
|
||||
*/
|
||||
|
||||
void publish(Long skuId, Integer status);
|
||||
|
||||
/**
|
||||
* 新人专享
|
||||
*
|
||||
* @param skuId
|
||||
* @param status
|
||||
*/
|
||||
void isNewPerson(Long skuId, Integer status);
|
||||
|
||||
/**
|
||||
* 根据id列表删除商品sku信息
|
||||
*
|
||||
* @param idList
|
||||
*/
|
||||
void deleteByIds(List<Long> idList);
|
||||
|
||||
/**
|
||||
* 根据id删除商品sku信息
|
||||
*
|
||||
* @param id
|
||||
*/
|
||||
void deleteById(Long id);
|
||||
|
||||
/**
|
||||
* 批量获取sku信息
|
||||
*
|
||||
* @param skuIdList
|
||||
* @return
|
||||
*/
|
||||
List<SkuInfo> findSkuInfoList(List<Long> skuIdList);
|
||||
|
||||
/**
|
||||
* 根据关键字获取sku列表
|
||||
*
|
||||
* @param keyword
|
||||
* @return
|
||||
*/
|
||||
List<SkuInfo> findSkuInfoByKeyword(String keyword);
|
||||
|
||||
/**
|
||||
* 获取新人专享商品
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
List<SkuInfo> findNewPersonSkuInfoList();
|
||||
|
||||
/**
|
||||
* 验证和锁定库存
|
||||
*
|
||||
* @param skuStockLockVoList
|
||||
* @param orderNo
|
||||
* @return
|
||||
*/
|
||||
Boolean checkAndLock(List<SkuStockLockVo> skuStockLockVoList, String orderNo);
|
||||
|
||||
/**
|
||||
* 扣减库存成功,更新订单状态
|
||||
*
|
||||
* @param orderNo
|
||||
*/
|
||||
void minusStock(String orderNo);
|
||||
}
|
@@ -0,0 +1,19 @@
|
||||
package com.yovinchen.xlcs.product.service;
|
||||
|
||||
import com.yovinchen.xlcs.model.product.SkuPoster;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 商品海报表 服务类
|
||||
* </p>
|
||||
*
|
||||
* @author yovinchen
|
||||
* @since 2023-09-15
|
||||
*/
|
||||
public interface SkuPosterService extends IService<SkuPoster> {
|
||||
|
||||
List<SkuPoster> findBySkuId(Long skuId);
|
||||
}
|
@@ -0,0 +1,16 @@
|
||||
package com.yovinchen.xlcs.product.service;
|
||||
|
||||
import com.yovinchen.xlcs.model.product.SkuStockHistory;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* sku的库存历史记录 服务类
|
||||
* </p>
|
||||
*
|
||||
* @author yovinchen
|
||||
* @since 2023-09-15
|
||||
*/
|
||||
public interface SkuStockHistoryService extends IService<SkuStockHistory> {
|
||||
|
||||
}
|
@@ -0,0 +1,16 @@
|
||||
package com.yovinchen.xlcs.product.service;
|
||||
|
||||
import com.yovinchen.xlcs.model.sys.Ware;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 仓库表 服务类
|
||||
* </p>
|
||||
*
|
||||
* @author yovinchen
|
||||
* @since 2023-09-15
|
||||
*/
|
||||
public interface WareService extends IService<Ware> {
|
||||
|
||||
}
|
@@ -0,0 +1,60 @@
|
||||
package com.yovinchen.xlcs.product.service.impl;
|
||||
|
||||
|
||||
import com.yovinchen.xlcs.model.product.AttrGroup;
|
||||
import com.yovinchen.xlcs.product.mapper.AttrGroupMapper;
|
||||
import com.yovinchen.xlcs.product.service.AttrGroupService;
|
||||
import com.yovinchen.xlcs.vo.product.AttrGroupQueryVo;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 属性分组 服务实现类
|
||||
* </p>
|
||||
*
|
||||
* @author yovinchen
|
||||
* @since 2023-09-15
|
||||
*/
|
||||
@Service
|
||||
public class AttrGroupServiceImpl extends ServiceImpl<AttrGroupMapper, AttrGroup> implements AttrGroupService {
|
||||
|
||||
/**
|
||||
* 查询所有的平台属性分组列表
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public List<AttrGroup> findAllList() {
|
||||
//LambdaQueryWrapper<AttrGroup> wrapper = new LambdaQueryWrapper<>();
|
||||
QueryWrapper<AttrGroup> wrapper = new QueryWrapper<>();
|
||||
wrapper.orderByDesc("id");
|
||||
List<AttrGroup> list = baseMapper.selectList(wrapper);
|
||||
return list;
|
||||
}
|
||||
|
||||
/**
|
||||
* 平台属性分组列表
|
||||
*
|
||||
* @param pageParam
|
||||
* @param attrGroupQueryVo
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public IPage<AttrGroup> selectPage(Page<AttrGroup> pageParam, AttrGroupQueryVo attrGroupQueryVo) {
|
||||
String name = attrGroupQueryVo.getName();
|
||||
LambdaQueryWrapper<AttrGroup> wrapper = new LambdaQueryWrapper<>();
|
||||
if (!StringUtils.isEmpty(name)) {
|
||||
wrapper.like(AttrGroup::getName, name);
|
||||
}
|
||||
IPage<AttrGroup> attrGroupPage = baseMapper.selectPage(pageParam, wrapper);
|
||||
return attrGroupPage;
|
||||
}
|
||||
}
|
@@ -0,0 +1,30 @@
|
||||
package com.yovinchen.xlcs.product.service.impl;
|
||||
|
||||
import com.yovinchen.xlcs.model.product.Attr;
|
||||
import com.yovinchen.xlcs.product.mapper.AttrMapper;
|
||||
import com.yovinchen.xlcs.product.service.AttrService;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 商品属性 服务实现类
|
||||
* </p>
|
||||
*
|
||||
* @author yovinchen
|
||||
* @since 2023-09-15
|
||||
*/
|
||||
@Service
|
||||
public class AttrServiceImpl extends ServiceImpl<AttrMapper, Attr> implements AttrService {
|
||||
|
||||
@Override
|
||||
public List<Attr> findByAttrGroupId(Long attrGroupId) {
|
||||
LambdaQueryWrapper<Attr> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.eq(Attr::getAttrGroupId, attrGroupId);
|
||||
List<Attr> attrList = baseMapper.selectList(wrapper);
|
||||
return attrList;
|
||||
}
|
||||
}
|
@@ -0,0 +1,20 @@
|
||||
package com.yovinchen.xlcs.product.service.impl;
|
||||
|
||||
import com.yovinchen.xlcs.model.product.BaseCategoryTrademark;
|
||||
import com.yovinchen.xlcs.product.mapper.BaseCategoryTrademarkMapper;
|
||||
import com.yovinchen.xlcs.product.service.BaseCategoryTrademarkService;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 三级分类表 服务实现类
|
||||
* </p>
|
||||
*
|
||||
* @author yovinchen
|
||||
* @since 2023-09-15
|
||||
*/
|
||||
@Service
|
||||
public class BaseCategoryTrademarkServiceImpl extends ServiceImpl<BaseCategoryTrademarkMapper, BaseCategoryTrademark> implements BaseCategoryTrademarkService {
|
||||
|
||||
}
|
@@ -0,0 +1,44 @@
|
||||
package com.yovinchen.xlcs.product.service.impl;
|
||||
|
||||
import com.yovinchen.xlcs.model.product.Category;
|
||||
import com.yovinchen.xlcs.product.mapper.CategoryMapper;
|
||||
import com.yovinchen.xlcs.product.service.CategoryService;
|
||||
import com.yovinchen.xlcs.vo.product.CategoryQueryVo;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 商品三级分类 服务实现类
|
||||
* </p>
|
||||
*
|
||||
* @author yovinchen
|
||||
* @since 2023-09-15
|
||||
*/
|
||||
@Service
|
||||
public class CategoryServiceImpl extends ServiceImpl<CategoryMapper, Category> implements CategoryService {
|
||||
|
||||
@Override
|
||||
public IPage<Category> selectPage(Page<Category> pageParam, CategoryQueryVo categoryQueryVo) {
|
||||
String name = categoryQueryVo.getName();
|
||||
LambdaQueryWrapper<Category> queryWrapper = new LambdaQueryWrapper<>();
|
||||
if (!StringUtils.isEmpty(name)) {
|
||||
queryWrapper.like(Category::getName, name);
|
||||
}
|
||||
IPage<Category> categoryPage = baseMapper.selectPage(pageParam, queryWrapper);
|
||||
return categoryPage;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Category> findAllList() {
|
||||
LambdaQueryWrapper<Category> queryWrapper = new LambdaQueryWrapper<>();
|
||||
queryWrapper.orderByAsc(Category::getSort);
|
||||
return this.list(queryWrapper);
|
||||
}
|
||||
}
|
@@ -0,0 +1,20 @@
|
||||
package com.yovinchen.xlcs.product.service.impl;
|
||||
|
||||
import com.yovinchen.xlcs.model.product.CommentReplay;
|
||||
import com.yovinchen.xlcs.product.mapper.CommentReplayMapper;
|
||||
import com.yovinchen.xlcs.product.service.CommentReplayService;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 产品评价回复表 服务实现类
|
||||
* </p>
|
||||
*
|
||||
* @author yovinchen
|
||||
* @since 2023-09-15
|
||||
*/
|
||||
@Service
|
||||
public class CommentReplayServiceImpl extends ServiceImpl<CommentReplayMapper, CommentReplay> implements CommentReplayService {
|
||||
|
||||
}
|
@@ -0,0 +1,20 @@
|
||||
package com.yovinchen.xlcs.product.service.impl;
|
||||
|
||||
import com.yovinchen.xlcs.model.product.Comment;
|
||||
import com.yovinchen.xlcs.product.mapper.CommentMapper;
|
||||
import com.yovinchen.xlcs.product.service.CommentService;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 商品评价 服务实现类
|
||||
* </p>
|
||||
*
|
||||
* @author yovinchen
|
||||
* @since 2023-09-15
|
||||
*/
|
||||
@Service
|
||||
public class CommentServiceImpl extends ServiceImpl<CommentMapper, Comment> implements CommentService {
|
||||
|
||||
}
|
@@ -0,0 +1,69 @@
|
||||
package com.yovinchen.xlcs.product.service.impl;
|
||||
|
||||
import com.yovinchen.xlcs.product.service.FileUploadService;
|
||||
import io.minio.MinioClient;
|
||||
import org.joda.time.DateTime;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* ClassName: FileUploadServiceImpl
|
||||
* Package: com.yovinchen.xlcs.product.service.impl
|
||||
*
|
||||
* @author yovinchen
|
||||
* @Create 2023/9/15 13:57
|
||||
*/
|
||||
@Service
|
||||
public class FileUploadServiceImpl implements FileUploadService {
|
||||
|
||||
@Value("${aliyun.endpoint}")
|
||||
private String endPoint;
|
||||
@Value("${aliyun.keyid}")
|
||||
private String accessKey;
|
||||
@Value("${aliyun.keysecret}")
|
||||
private String secreKey;
|
||||
@Value("${aliyun.bucketname}")
|
||||
private String bucketName;
|
||||
|
||||
@Override
|
||||
public String fileUpload(MultipartFile file) throws Exception {
|
||||
try {
|
||||
// 创建OSSClient实例。
|
||||
// OSS ossClient = new OSSClientBuilder().build(endPoint, accessKey, secreKey);
|
||||
MinioClient minioClient =
|
||||
MinioClient.builder()
|
||||
.endpoint("https://play.min.io")
|
||||
.credentials("Q3AM3UQ867SPQQA43P2F", "zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG")
|
||||
.build();
|
||||
// 上传文件流。
|
||||
InputStream inputStream = file.getInputStream();
|
||||
String fileName = file.getOriginalFilename();
|
||||
//生成随机唯一值,使用uuid,添加到文件名称里面
|
||||
String uuid = UUID
|
||||
.randomUUID()
|
||||
.toString()
|
||||
.replaceAll("-", "");
|
||||
fileName = uuid + fileName;
|
||||
//按照当前日期,创建文件夹,上传到创建文件夹里面
|
||||
// 2021/02/02/01.jpg
|
||||
String timeUrl = new DateTime().toString("yyyy/MM/dd");
|
||||
fileName = timeUrl + "/" + fileName;
|
||||
//调用方法实现上传
|
||||
// ossClient.putObject(bucketName, fileName, inputStream);
|
||||
// 关闭OSSClient。
|
||||
// ossClient.shutdown();
|
||||
//上传之后文件路径
|
||||
String url = "https://" + bucketName + "." + endPoint + "/" + fileName;
|
||||
//返回
|
||||
return url;
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,21 @@
|
||||
package com.yovinchen.xlcs.product.service.impl;
|
||||
|
||||
|
||||
import com.yovinchen.xlcs.model.base.MqRepeatRecord;
|
||||
import com.yovinchen.xlcs.product.mapper.MqRepeatRecordMapper;
|
||||
import com.yovinchen.xlcs.product.service.MqRepeatRecordService;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* mq去重表 服务实现类
|
||||
* </p>
|
||||
*
|
||||
* @author yovinchen
|
||||
* @since 2023-09-15
|
||||
*/
|
||||
@Service
|
||||
public class MqRepeatRecordServiceImpl extends ServiceImpl<MqRepeatRecordMapper, MqRepeatRecord> implements MqRepeatRecordService {
|
||||
|
||||
}
|
@@ -0,0 +1,20 @@
|
||||
package com.yovinchen.xlcs.product.service.impl;
|
||||
|
||||
import com.yovinchen.xlcs.model.sys.RegionWare;
|
||||
import com.yovinchen.xlcs.product.mapper.RegionWareMapper;
|
||||
import com.yovinchen.xlcs.product.service.RegionWareService;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 城市仓库关联表 服务实现类
|
||||
* </p>
|
||||
*
|
||||
* @author yovinchen
|
||||
* @since 2023-09-15
|
||||
*/
|
||||
@Service
|
||||
public class RegionWareServiceImpl extends ServiceImpl<RegionWareMapper, RegionWare> implements RegionWareService {
|
||||
|
||||
}
|
@@ -0,0 +1,33 @@
|
||||
package com.yovinchen.xlcs.product.service.impl;
|
||||
|
||||
import com.yovinchen.xlcs.model.product.SkuAttrValue;
|
||||
import com.yovinchen.xlcs.product.mapper.SkuAttrValueMapper;
|
||||
import com.yovinchen.xlcs.product.service.SkuAttrValueService;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* spu属性值 服务实现类
|
||||
* </p>
|
||||
*
|
||||
* @author yovinchen
|
||||
* @since 2023-09-15
|
||||
*/
|
||||
@Service
|
||||
public class SkuAttrValueServiceImpl extends ServiceImpl<SkuAttrValueMapper, SkuAttrValue> implements SkuAttrValueService {
|
||||
|
||||
/**
|
||||
* 根据id查询商品属性信息列表
|
||||
*
|
||||
* @param skuId
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public List<SkuAttrValue> findBySkuId(Long skuId) {
|
||||
return baseMapper.selectList(new LambdaQueryWrapper<SkuAttrValue>().eq(SkuAttrValue::getSkuId, skuId));
|
||||
}
|
||||
}
|
@@ -0,0 +1,20 @@
|
||||
package com.yovinchen.xlcs.product.service.impl;
|
||||
|
||||
import com.yovinchen.xlcs.model.product.SkuDetail;
|
||||
import com.yovinchen.xlcs.product.mapper.SkuDetailMapper;
|
||||
import com.yovinchen.xlcs.product.service.SkuDetailService;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* spu属性值 服务实现类
|
||||
* </p>
|
||||
*
|
||||
* @author yovinchen
|
||||
* @since 2023-09-15
|
||||
*/
|
||||
@Service
|
||||
public class SkuDetailServiceImpl extends ServiceImpl<SkuDetailMapper, SkuDetail> implements SkuDetailService {
|
||||
|
||||
}
|
@@ -0,0 +1,33 @@
|
||||
package com.yovinchen.xlcs.product.service.impl;
|
||||
|
||||
import com.yovinchen.xlcs.model.product.SkuImage;
|
||||
import com.yovinchen.xlcs.product.mapper.SkuImageMapper;
|
||||
import com.yovinchen.xlcs.product.service.SkuImageService;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 商品图片 服务实现类
|
||||
* </p>
|
||||
*
|
||||
* @author yovinchen
|
||||
* @since 2023-09-15
|
||||
*/
|
||||
@Service
|
||||
public class SkuImageServiceImpl extends ServiceImpl<SkuImageMapper, SkuImage> implements SkuImageService {
|
||||
|
||||
/**
|
||||
* 根据id查询商品图片列表
|
||||
*
|
||||
* @param skuId
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public List<SkuImage> findBySkuId(Long skuId) {
|
||||
return baseMapper.selectList(new LambdaQueryWrapper<SkuImage>().eq(SkuImage::getSkuId, skuId));
|
||||
}
|
||||
}
|
@@ -0,0 +1,423 @@
|
||||
package com.yovinchen.xlcs.product.service.impl;
|
||||
|
||||
import com.yovinchen.xlcs.common.constant.RedisConst;
|
||||
import com.yovinchen.xlcs.common.exception.xlcsException;
|
||||
import com.yovinchen.xlcs.common.result.ResultCodeEnum;
|
||||
import com.yovinchen.xlcs.model.product.SkuAttrValue;
|
||||
import com.yovinchen.xlcs.model.product.SkuImage;
|
||||
import com.yovinchen.xlcs.model.product.SkuInfo;
|
||||
import com.yovinchen.xlcs.model.product.SkuPoster;
|
||||
import com.yovinchen.xlcs.mq.constant.MqConst;
|
||||
import com.yovinchen.xlcs.mq.service.RabbitService;
|
||||
import com.yovinchen.xlcs.product.mapper.SkuInfoMapper;
|
||||
import com.yovinchen.xlcs.product.service.SkuAttrValueService;
|
||||
import com.yovinchen.xlcs.product.service.SkuImageService;
|
||||
import com.yovinchen.xlcs.product.service.SkuInfoService;
|
||||
import com.yovinchen.xlcs.product.service.SkuPosterService;
|
||||
import com.yovinchen.xlcs.vo.product.SkuInfoQueryVo;
|
||||
import com.yovinchen.xlcs.vo.product.SkuInfoVo;
|
||||
import com.yovinchen.xlcs.vo.product.SkuStockLockVo;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import org.redisson.api.RLock;
|
||||
import org.redisson.api.RedissonClient;
|
||||
import org.springframework.beans.BeanUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.data.redis.core.RedisTemplate;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* sku信息 服务实现类
|
||||
* </p>
|
||||
*
|
||||
* @author yovinchen
|
||||
* @since 2023-09-15
|
||||
*/
|
||||
@Service
|
||||
public class SkuInfoServiceImpl extends ServiceImpl<SkuInfoMapper, SkuInfo> implements SkuInfoService {
|
||||
|
||||
@Autowired
|
||||
private SkuPosterService skuPosterService;
|
||||
@Autowired
|
||||
private SkuImageService skuImagesService;
|
||||
@Autowired
|
||||
private SkuAttrValueService skuAttrValueService;
|
||||
@Autowired
|
||||
private RabbitService rabbitService;
|
||||
|
||||
@Autowired
|
||||
private RedisTemplate redisTemplate;
|
||||
|
||||
@Autowired
|
||||
private RedissonClient redissonClient;
|
||||
|
||||
/**
|
||||
* 获取sku分页列表
|
||||
*
|
||||
* @param pageParam
|
||||
* @param skuInfoQueryVo
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public IPage<SkuInfo> selectPage(Page<SkuInfo> pageParam, SkuInfoQueryVo skuInfoQueryVo) {
|
||||
//获取条件值
|
||||
String keyword = skuInfoQueryVo.getKeyword();
|
||||
String skuType = skuInfoQueryVo.getSkuType();
|
||||
Long categoryId = skuInfoQueryVo.getCategoryId();
|
||||
//封装条件
|
||||
LambdaQueryWrapper<SkuInfo> wrapper = new LambdaQueryWrapper<>();
|
||||
if (!StringUtils.isEmpty(keyword)) {
|
||||
wrapper.like(SkuInfo::getSkuName, keyword);
|
||||
}
|
||||
if (!StringUtils.isEmpty(skuType)) {
|
||||
wrapper.eq(SkuInfo::getSkuType, skuType);
|
||||
}
|
||||
if (!StringUtils.isEmpty(categoryId)) {
|
||||
wrapper.eq(SkuInfo::getCategoryId, categoryId);
|
||||
}
|
||||
//调用方法查询
|
||||
return baseMapper.selectPage(pageParam, wrapper);
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增商品sku信息
|
||||
*
|
||||
* @param skuInfoVo
|
||||
*/
|
||||
@Transactional(rollbackFor = {Exception.class})
|
||||
@Override
|
||||
public void saveSkuInfo(SkuInfoVo skuInfoVo) {
|
||||
//保存sku信息
|
||||
SkuInfo skuInfo = new SkuInfo();
|
||||
BeanUtils.copyProperties(skuInfoVo, skuInfo);
|
||||
baseMapper.insert(skuInfo);
|
||||
|
||||
//保存sku海报
|
||||
List<SkuPoster> skuPosterList = skuInfoVo.getSkuPosterList();
|
||||
if (!CollectionUtils.isEmpty(skuPosterList)) {
|
||||
for (SkuPoster skuPoster : skuPosterList) {
|
||||
skuPoster.setSkuId(skuInfo.getId());
|
||||
}
|
||||
skuPosterService.saveBatch(skuPosterList);
|
||||
}
|
||||
|
||||
//保存sku图片
|
||||
List<SkuImage> skuImagesList = skuInfoVo.getSkuImagesList();
|
||||
if (!CollectionUtils.isEmpty(skuImagesList)) {
|
||||
int sort = 1;
|
||||
for (SkuImage skuImages : skuImagesList) {
|
||||
skuImages.setSkuId(skuInfo.getId());
|
||||
skuImages.setSort(sort);
|
||||
sort++;
|
||||
}
|
||||
skuImagesService.saveBatch(skuImagesList);
|
||||
}
|
||||
|
||||
//保存sku平台属性
|
||||
List<SkuAttrValue> skuAttrValueList = skuInfoVo.getSkuAttrValueList();
|
||||
if (!CollectionUtils.isEmpty(skuAttrValueList)) {
|
||||
int sort = 1;
|
||||
for (SkuAttrValue skuAttrValue : skuAttrValueList) {
|
||||
skuAttrValue.setSkuId(skuInfo.getId());
|
||||
skuAttrValue.setSort(sort);
|
||||
sort++;
|
||||
}
|
||||
skuAttrValueService.saveBatch(skuAttrValueList);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 商品sku信息
|
||||
*
|
||||
* @param id
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public SkuInfoVo getSkuInfoVo(Long id) {
|
||||
return getSkuInfoDB(id);
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改商品sku信息
|
||||
*
|
||||
* @param skuInfoVo
|
||||
*/
|
||||
@Override
|
||||
public void updateSkuInfo(SkuInfoVo skuInfoVo) {
|
||||
Long id = skuInfoVo.getId();
|
||||
//更新sku信息
|
||||
baseMapper.updateById(skuInfoVo);
|
||||
|
||||
//保存sku详情
|
||||
skuPosterService.remove(new LambdaQueryWrapper<SkuPoster>().eq(SkuPoster::getSkuId, id));
|
||||
//保存sku海报
|
||||
List<SkuPoster> skuPosterList = skuInfoVo.getSkuPosterList();
|
||||
if (!CollectionUtils.isEmpty(skuPosterList)) {
|
||||
for (SkuPoster skuPoster : skuPosterList) {
|
||||
skuPoster.setSkuId(id);
|
||||
}
|
||||
skuPosterService.saveBatch(skuPosterList);
|
||||
}
|
||||
|
||||
//删除sku图片
|
||||
skuImagesService.remove(new LambdaQueryWrapper<SkuImage>().eq(SkuImage::getSkuId, id));
|
||||
//保存sku图片
|
||||
List<SkuImage> skuImagesList = skuInfoVo.getSkuImagesList();
|
||||
if (!CollectionUtils.isEmpty(skuImagesList)) {
|
||||
int sort = 1;
|
||||
for (SkuImage skuImages : skuImagesList) {
|
||||
skuImages.setSkuId(id);
|
||||
skuImages.setSort(sort);
|
||||
sort++;
|
||||
}
|
||||
skuImagesService.saveBatch(skuImagesList);
|
||||
}
|
||||
|
||||
//删除sku平台属性
|
||||
skuAttrValueService.remove(new LambdaQueryWrapper<SkuAttrValue>().eq(SkuAttrValue::getSkuId, id));
|
||||
//保存sku平台属性
|
||||
List<SkuAttrValue> skuAttrValueList = skuInfoVo.getSkuAttrValueList();
|
||||
if (!CollectionUtils.isEmpty(skuAttrValueList)) {
|
||||
int sort = 1;
|
||||
for (SkuAttrValue skuAttrValue : skuAttrValueList) {
|
||||
skuAttrValue.setSkuId(id);
|
||||
skuAttrValue.setSort(sort);
|
||||
sort++;
|
||||
}
|
||||
skuAttrValueService.saveBatch(skuAttrValueList);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 商品审核
|
||||
*
|
||||
* @param skuId
|
||||
* @param status
|
||||
*/
|
||||
@Override
|
||||
public void check(Long skuId, Integer status) {
|
||||
SkuInfo skuInfo = baseMapper.selectById(skuId);
|
||||
skuInfo.setCheckStatus(status);
|
||||
baseMapper.updateById(skuInfo);
|
||||
}
|
||||
|
||||
/**
|
||||
* 商品上/下架
|
||||
*
|
||||
* @param skuId
|
||||
* @param status
|
||||
*/
|
||||
@Transactional(rollbackFor = {Exception.class})
|
||||
@Override
|
||||
public void publish(Long skuId, Integer status) {
|
||||
// 更改发布状态
|
||||
if (status == 1) {
|
||||
SkuInfo skuInfo = baseMapper.selectById(skuId);
|
||||
skuInfo.setPublishStatus(status);
|
||||
baseMapper.updateById(skuInfo);
|
||||
|
||||
//商品上架:发送mq消息同步es
|
||||
rabbitService.sendMessage(MqConst.EXCHANGE_GOODS_DIRECT, MqConst.ROUTING_GOODS_UPPER, skuId);
|
||||
} else {
|
||||
SkuInfo skuInfo = baseMapper.selectById(skuId);
|
||||
skuInfo.setPublishStatus(status);
|
||||
baseMapper.updateById(skuInfo);
|
||||
|
||||
//商品下架:发送mq消息同步es
|
||||
rabbitService.sendMessage(MqConst.EXCHANGE_GOODS_DIRECT, MqConst.ROUTING_GOODS_LOWER, skuId);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 新人专享
|
||||
*
|
||||
* @param skuId
|
||||
* @param status
|
||||
*/
|
||||
@Override
|
||||
public void isNewPerson(Long skuId, Integer status) {
|
||||
SkuInfo skuInfo = baseMapper.selectById(skuId);
|
||||
skuInfo.setIsNewPerson(status);
|
||||
baseMapper.updateById(skuInfo);
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量删商品sku信息
|
||||
*
|
||||
* @param idList
|
||||
*/
|
||||
@Override
|
||||
public void deleteByIds(List<Long> idList) {
|
||||
baseMapper.deleteBatchIds(idList);
|
||||
|
||||
//商品下架:发送mq消息同步es
|
||||
for (Long id : idList) {
|
||||
rabbitService.sendMessage(MqConst.EXCHANGE_GOODS_DIRECT, MqConst.ROUTING_GOODS_LOWER, id);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据ID批量删商品sku信息
|
||||
*
|
||||
* @param id
|
||||
*/
|
||||
@Override
|
||||
public void deleteById(Long id) {
|
||||
baseMapper.deleteById(id);
|
||||
|
||||
//商品删除:发送mq消息同步es
|
||||
rabbitService.sendMessage(MqConst.EXCHANGE_GOODS_DIRECT, MqConst.ROUTING_GOODS_LOWER, id);
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量获取sku信息
|
||||
*
|
||||
* @param skuIdList
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public List<SkuInfo> findSkuInfoList(List<Long> skuIdList) {
|
||||
return baseMapper.selectBatchIds(skuIdList);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据关键字获取sku列表
|
||||
*
|
||||
* @param keyword
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public List<SkuInfo> findSkuInfoByKeyword(String keyword) {
|
||||
return baseMapper.selectList(new LambdaQueryWrapper<SkuInfo>().like(SkuInfo::getSkuName, keyword));
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取新人专享商品
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public List<SkuInfo> findNewPersonSkuInfoList() {
|
||||
//条件1 : is_new_person=1
|
||||
//条件2 : publish_status=1
|
||||
//条件3 :显示其中三个
|
||||
//获取第一页数据,每页显示三条记录
|
||||
Page<SkuInfo> pageParam = new Page<>(1, 3);
|
||||
//调用方法查询
|
||||
IPage<SkuInfo> skuInfoPage = baseMapper.selectPage(pageParam, new LambdaQueryWrapper<SkuInfo>().eq(SkuInfo::getIsNewPerson, 1).eq(SkuInfo::getPublishStatus, 1).orderByDesc(SkuInfo::getStock));
|
||||
return skuInfoPage.getRecords();
|
||||
}
|
||||
|
||||
/**
|
||||
* 验证和锁定库存
|
||||
*
|
||||
* @param skuStockLockVoList
|
||||
* @param orderNo
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public Boolean checkAndLock(List<SkuStockLockVo> skuStockLockVoList, String orderNo) {
|
||||
//1 判断skuStockLockVoList集合是否为空
|
||||
if (CollectionUtils.isEmpty(skuStockLockVoList)) {
|
||||
throw new xlcsException(ResultCodeEnum.DATA_ERROR);
|
||||
}
|
||||
|
||||
//2 遍历skuStockLockVoList得到每个商品,验证库存并锁定库存,具备原子性
|
||||
skuStockLockVoList.stream().forEach(skuStockLockVo -> {
|
||||
this.checkLock(skuStockLockVo);
|
||||
});
|
||||
|
||||
//3 只要有一个商品锁定失败,所有锁定成功的商品都解锁
|
||||
boolean flag = skuStockLockVoList.stream().anyMatch(skuStockLockVo -> !skuStockLockVo.getIsLock());
|
||||
if (flag) {
|
||||
//所有锁定成功的商品都解锁
|
||||
skuStockLockVoList.stream().filter(SkuStockLockVo::getIsLock).forEach(skuStockLockVo -> {
|
||||
baseMapper.unlockStock(skuStockLockVo.getSkuId(), skuStockLockVo.getSkuNum());
|
||||
});
|
||||
//返回失败的状态
|
||||
return false;
|
||||
}
|
||||
|
||||
//4 如果所有商品都锁定成功了,redis缓存相关数据,为了方便后面解锁和减库存
|
||||
redisTemplate.opsForValue().set(RedisConst.SROCK_INFO + orderNo, skuStockLockVoList);
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 扣减库存成功,更新订单状态
|
||||
*
|
||||
* @param orderNo
|
||||
*/
|
||||
@Override
|
||||
public void minusStock(String orderNo) {
|
||||
//从redis获取锁定库存信息
|
||||
List<SkuStockLockVo> skuStockLockVoList = (List<SkuStockLockVo>) redisTemplate.opsForValue().get(RedisConst.SROCK_INFO + orderNo);
|
||||
if (CollectionUtils.isEmpty(skuStockLockVoList)) {
|
||||
return;
|
||||
}
|
||||
//遍历集合,得到每个对象,减库存
|
||||
skuStockLockVoList.forEach(skuStockLockVo -> {
|
||||
baseMapper.minusStock(skuStockLockVo.getSkuId(), skuStockLockVo.getSkuNum());
|
||||
});
|
||||
|
||||
//删除redis数据
|
||||
redisTemplate.delete(RedisConst.SROCK_INFO + orderNo);
|
||||
}
|
||||
|
||||
//2 遍历skuStockLockVoList得到每个商品,验证库存并锁定库存,具备原子性
|
||||
private void checkLock(SkuStockLockVo skuStockLockVo) {
|
||||
//获取锁
|
||||
//公平锁
|
||||
RLock rLock = this.redissonClient.getFairLock(RedisConst.SKUKEY_PREFIX + skuStockLockVo.getSkuId());
|
||||
//加锁
|
||||
rLock.lock();
|
||||
|
||||
try {
|
||||
//验证库存
|
||||
SkuInfo skuInfo = baseMapper.checkStock(skuStockLockVo.getSkuId(), skuStockLockVo.getSkuNum());
|
||||
//判断没有满足条件商品,设置isLock值false,返回
|
||||
if (skuInfo == null) {
|
||||
skuStockLockVo.setIsLock(false);
|
||||
return;
|
||||
}
|
||||
//有满足条件商品
|
||||
//锁定库存:update
|
||||
Integer rows = baseMapper.lockStock(skuStockLockVo.getSkuId(), skuStockLockVo.getSkuNum());
|
||||
if (rows == 1) {
|
||||
skuStockLockVo.setIsLock(true);
|
||||
}
|
||||
} finally {
|
||||
//解锁
|
||||
rLock.unlock();
|
||||
}
|
||||
}
|
||||
|
||||
//获取商品sku信息
|
||||
private SkuInfoVo getSkuInfoDB(Long skuId) {
|
||||
SkuInfoVo skuInfoVo = new SkuInfoVo();
|
||||
|
||||
SkuInfo skuInfo = baseMapper.selectById(skuId);
|
||||
//根据id查询商品图片列表
|
||||
List<SkuImage> skuImageList = skuImagesService.findBySkuId(skuId);
|
||||
//根据id查询商品海报列表
|
||||
List<SkuPoster> skuPosterList = skuPosterService.findBySkuId(skuId);
|
||||
//根据id查询商品属性信息列表
|
||||
List<SkuAttrValue> skuAttrValueList = skuAttrValueService.findBySkuId(skuId);
|
||||
|
||||
//封装数据
|
||||
BeanUtils.copyProperties(skuInfo, skuInfoVo);
|
||||
skuInfoVo.setSkuImagesList(skuImageList);
|
||||
skuInfoVo.setSkuPosterList(skuPosterList);
|
||||
skuInfoVo.setSkuAttrValueList(skuAttrValueList);
|
||||
return skuInfoVo;
|
||||
}
|
||||
|
||||
}
|
@@ -0,0 +1,33 @@
|
||||
package com.yovinchen.xlcs.product.service.impl;
|
||||
|
||||
import com.yovinchen.xlcs.model.product.SkuPoster;
|
||||
import com.yovinchen.xlcs.product.mapper.SkuPosterMapper;
|
||||
import com.yovinchen.xlcs.product.service.SkuPosterService;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 商品海报表 服务实现类
|
||||
* </p>
|
||||
*
|
||||
* @author yovinchen
|
||||
* @since 2023-09-15
|
||||
*/
|
||||
@Service
|
||||
public class SkuPosterServiceImpl extends ServiceImpl<SkuPosterMapper, SkuPoster> implements SkuPosterService {
|
||||
|
||||
/**
|
||||
* 根据id查询商品海报列表
|
||||
*
|
||||
* @param skuId
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public List<SkuPoster> findBySkuId(Long skuId) {
|
||||
return baseMapper.selectList(new LambdaQueryWrapper<SkuPoster>().eq(SkuPoster::getSkuId, skuId));
|
||||
}
|
||||
}
|
@@ -0,0 +1,20 @@
|
||||
package com.yovinchen.xlcs.product.service.impl;
|
||||
|
||||
import com.yovinchen.xlcs.model.product.SkuStockHistory;
|
||||
import com.yovinchen.xlcs.product.mapper.SkuStockHistoryMapper;
|
||||
import com.yovinchen.xlcs.product.service.SkuStockHistoryService;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* sku的库存历史记录 服务实现类
|
||||
* </p>
|
||||
*
|
||||
* @author yovinchen
|
||||
* @since 2023-09-15
|
||||
*/
|
||||
@Service
|
||||
public class SkuStockHistoryServiceImpl extends ServiceImpl<SkuStockHistoryMapper, SkuStockHistory> implements SkuStockHistoryService {
|
||||
|
||||
}
|
@@ -0,0 +1,20 @@
|
||||
package com.yovinchen.xlcs.product.service.impl;
|
||||
|
||||
import com.yovinchen.xlcs.model.sys.Ware;
|
||||
import com.yovinchen.xlcs.product.mapper.WareMapper;
|
||||
import com.yovinchen.xlcs.product.service.WareService;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 仓库表 服务实现类
|
||||
* </p>
|
||||
*
|
||||
* @author yovinchen
|
||||
* @since 2023-09-15
|
||||
*/
|
||||
@Service
|
||||
public class WareServiceImpl extends ServiceImpl<WareMapper, Ware> implements WareService {
|
||||
|
||||
}
|
@@ -0,0 +1,45 @@
|
||||
package com.yovinchen.xlcs.product.utils;
|
||||
|
||||
import io.minio.BucketExistsArgs;
|
||||
import io.minio.MakeBucketArgs;
|
||||
import io.minio.MinioClient;
|
||||
import io.minio.UploadObjectArgs;
|
||||
import io.minio.errors.MinioException;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.security.InvalidKeyException;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
|
||||
/**
|
||||
* ClassName: FileUploader
|
||||
* Package: com.yovinchen.xlcs.product.utils
|
||||
*
|
||||
* @author yovinchen
|
||||
* @Create 2023/10/13 17:55
|
||||
*/
|
||||
public class FileUploader {
|
||||
|
||||
public static void main(String[] args) throws IOException, NoSuchAlgorithmException, InvalidKeyException {
|
||||
try {
|
||||
// Create a minioClient with the MinIO server playground, its access key and secret key.
|
||||
MinioClient minioClient = MinioClient.builder().endpoint("http://154.9.228.206:9000").credentials("IaZk6fqBYY66dcE03edv", "6zzVxP6wAuu74Tft22JJZDQGVfnaHtJ221XjAwQu").build();
|
||||
|
||||
// Make 'asiatrip' bucket if not exist.
|
||||
boolean found = minioClient.bucketExists(BucketExistsArgs.builder().bucket("public").build());
|
||||
if (!found) {
|
||||
// Make a new bucket called 'asiatrip'.
|
||||
minioClient.makeBucket(MakeBucketArgs.builder().bucket("public").build());
|
||||
} else {
|
||||
System.out.println("Bucket 'public' already exists.");
|
||||
}
|
||||
|
||||
// Upload '/home/user/Photos/asiaphotos.zip' as object name 'asiaphotos-2015.zip' to bucket
|
||||
// 'asiatrip'.
|
||||
minioClient.uploadObject(UploadObjectArgs.builder().bucket("public").object("credentials.json").filename("C:/Users/lai.huanxiong/Downloads/credentials.json").build());
|
||||
System.out.println("'C:/Users/lai.huanxiong/Downloads/credentials.json' is successfully uploaded as " + "object 'credentials.json' to bucket 'public'.");
|
||||
} catch (MinioException e) {
|
||||
System.out.println("Error occurred: " + e);
|
||||
System.out.println("HTTP trace: " + e.httpTrace());
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,58 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.yovinchen.xlcs.product.mapper.SkuInfoMapper">
|
||||
|
||||
<resultMap id="skuInfoMap" type="com.yovinchen.xlcs.model.product.SkuInfo" autoMapping="true"></resultMap>
|
||||
|
||||
<!--//验证库存-->
|
||||
<select id="checkStock" resultMap="skuInfoMap">
|
||||
select id,
|
||||
category_id,
|
||||
sku_type,
|
||||
sku_name,
|
||||
img_url,
|
||||
per_limit,
|
||||
publish_status,
|
||||
check_status,
|
||||
is_new_person,
|
||||
sort,
|
||||
sku_code,
|
||||
price,
|
||||
market_price,
|
||||
stock,
|
||||
lock_stock,
|
||||
low_stock,
|
||||
sale,
|
||||
ware_id,
|
||||
create_time,
|
||||
update_time,
|
||||
is_deleted
|
||||
from sku_info
|
||||
where id = #{skuId}
|
||||
and stock - lock_stock > #{skuNum} for
|
||||
update
|
||||
</select>
|
||||
|
||||
<!--//锁定库存:update-->
|
||||
<update id="lockStock">
|
||||
update sku_info
|
||||
set lock_stock = lock_stock + #{skuNum}
|
||||
where id = #{skuId}
|
||||
</update>
|
||||
|
||||
<!--//解锁库存-->
|
||||
<update id="unlockStock">
|
||||
update sku_info
|
||||
set lock_stock = lock_stock - #{skuNum}
|
||||
where id = #{skuId}
|
||||
</update>
|
||||
|
||||
<!--减库存-->
|
||||
<update id="minusStock">
|
||||
update sku_info
|
||||
set stock = stock - #{skuNum},
|
||||
lock_stock = lock_stock - #{skuNum},
|
||||
sale = sale + #{skuNum}
|
||||
where id = #{skuId}
|
||||
</update>
|
||||
</mapper>
|
@@ -0,0 +1,11 @@
|
||||
server:
|
||||
port: 8203
|
||||
spring:
|
||||
application:
|
||||
name: service-product
|
||||
cloud:
|
||||
nacos:
|
||||
discovery:
|
||||
server-addr: 82.157.68.223:8848
|
||||
username: nacos
|
||||
password: nacos
|
@@ -0,0 +1,31 @@
|
||||
spring:
|
||||
cloud:
|
||||
nacos:
|
||||
config:
|
||||
namespace: dd5265c5-8290-45bc-9d07-395c14c977d3
|
||||
server-addr: 82.157.68.223:8848
|
||||
group: service
|
||||
username: nacos
|
||||
password: nacos
|
||||
enabled: true
|
||||
file-extension: yml
|
||||
extension-configs:
|
||||
- data-id: common.yml
|
||||
group: common
|
||||
refresh: true
|
||||
- data-id: service-redis.yml
|
||||
group: common
|
||||
refresh: true
|
||||
- data-id: service-rabbitmq.yml
|
||||
group: common
|
||||
refresh: true
|
||||
- data-id: config-rabbitmq.yml
|
||||
group: config
|
||||
refresh: true
|
||||
- data-id: service-openfeign.yml
|
||||
group: common
|
||||
refresh: true
|
||||
- data-id: oss-aliyun.yml
|
||||
group: oss
|
||||
refresh: true
|
||||
|
Reference in New Issue
Block a user