修正项目

This commit is contained in:
2024-01-07 01:10:08 +08:00
parent 2f29241806
commit b22014e976
943 changed files with 27699 additions and 28227 deletions

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}
}

View File

@@ -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);
}
}
}

View File

@@ -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 {
}

View File

@@ -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);
}
}
}

View File

@@ -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 {
}

View File

@@ -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 {
}

View File

@@ -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);
}
}
}

View File

@@ -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 {
}

View File

@@ -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 {
}

View File

@@ -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 {
}

View File

@@ -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 {
}

View File

@@ -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 {
}

View File

@@ -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);
}
}
}

View File

@@ -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 {
}

View File

@@ -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 {
}

View File

@@ -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 {
}

View File

@@ -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> {
}

View File

@@ -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> {
}

View File

@@ -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> {
}

View File

@@ -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> {
}

View File

@@ -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> {
}

View File

@@ -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> {
}

View File

@@ -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> {
}

View File

@@ -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> {
}

View File

@@ -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> {
}

View File

@@ -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> {
}

View File

@@ -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> {
}

View File

@@ -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);
}

View File

@@ -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> {
}

View File

@@ -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> {
}

View File

@@ -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> {
}

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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);
}
}

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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> {
}

View File

@@ -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();
}

View File

@@ -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> {
}

View File

@@ -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> {
}

View File

@@ -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;
}

View File

@@ -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> {
}

View File

@@ -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> {
}

View File

@@ -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);
}

View File

@@ -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> {
}

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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> {
}

View File

@@ -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> {
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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 {
}

View File

@@ -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);
}
}

View File

@@ -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 {
}

View File

@@ -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 {
}

View File

@@ -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;
}
}
}

View File

@@ -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 {
}

View File

@@ -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 {
}

View File

@@ -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));
}
}

View File

@@ -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 {
}

View File

@@ -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));
}
}

View File

@@ -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;
}
}

View File

@@ -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));
}
}

View File

@@ -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 {
}

View File

@@ -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 {
}

View File

@@ -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());
}
}
}

View File

@@ -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>

View File

@@ -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

View File

@@ -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