gulimall-ware/src/main/java/site/zhourui/gulimall/ware/config/WareMyBatisConfig.java
新增配置文件 (与gulimall-ware模块的MyBatisConfig配置文件其实是一致的)
package site.zhourui.gulimall.ware.config;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@EnableTransactionManagement
@MapperScan("site.zhourui.gulimall.ware.dao")
@Configuration
public class WareMyBatisConfig {
//引入分页插件
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
// 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求 默认false
// paginationInterceptor.setOverflow(true);
// // 设置最大单页限制数量,默认 500 条,-1 不受限制
// paginationInterceptor.setLimit(1000);
return paginationInterceptor;
}
}
1.启动gulimall-ware解决效果
添加配置文件
server:
port: 11000
spring:
datasource:
username: root
password: root
url: jdbc:mysql://192.168.157.129:3306/gulimall_wms
driver-class-name: com.mysql.jdbc.Driver
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
application:
name: gulimall-ware
jackson:
date-format: yyyy-MM-dd HH:mm:ss
mybatis-plus:
mapper-locations: classpath:/mapper/**
QueryWrapper queryWrapper = new QueryWrapper<>();
String skuId = (String) params.get("skuId");
if(!StringUtils.isEmpty(skuId)){
queryWrapper.eq("sku_id",skuId);
}
String wareId = (String) params.get("wareId");
if(!StringUtils.isEmpty(wareId)){
queryWrapper.eq("ware_id",wareId);
}
IPage page = this.page(
new Query().getPage(params),
queryWrapper
);
return new PageUtils(page);
}
4.采购需求重启gulimall-ware服务测试
原因:商品库存肯定不是手动创建添加的,而是系统增加的
0.采购流程 1.采购需求查询需要增加库存就需要创建采购需求,合并成为采购单,完成采购单商品库存才能增加
gulimall-ware/src/main/java/site/zhourui/gulimall/ware/service/impl/PurchaseDetailServiceImpl.java
修改queryPage方法实现
@Override
public PageUtils queryPage(Map params) {
QueryWrapper queryWrapper = new QueryWrapper();
String key = (String) params.get("key");
if(!StringUtils.isEmpty(key)){
//purchase_id sku_id
queryWrapper.and(w->{
w.eq("purchase_id",key).or().eq("sku_id",key);
});
}
String status = (String) params.get("status");
if(!StringUtils.isEmpty(status)){
//purchase_id sku_id
queryWrapper.eq("status",status);
}
String wareId = (String) params.get("wareId");
if(!StringUtils.isEmpty(wareId)){
//purchase_id sku_id
queryWrapper.eq("ware_id",wareId);
}
IPage page = this.page(
new Query().getPage(params),
queryWrapper
);
return new PageUtils(page);
}
2.合并采购需求实现效果
1.未指定采购单查询采购需求需要合并成为采购单,然后再被分配
合并整单操作就是讲采购需求合并为采购单
合并采购需求时需要可以指定到采购单,需要查询为被领取的采购单采购单
gulimall-ware/src/main/java/site/zhourui/gulimall/ware/service/PurchaseService.java
新增接口
PageUtils queryPageUnreceivePurchase(Mapparams);
gulimall-ware/src/main/java/site/zhourui/gulimall/ware/service/impl/PurchaseServiceImpl.java
新增接口实现
@Override
public PageUtils queryPageUnreceivePurchase(Map params) {
IPage page = this.page(
new Query().getPage(params),
new QueryWrapper().eq("status",0).or().eq("status",1)
);
return new PageUtils(page);
}
2.合并采购单
1.新增MergeVo对象
gulimall-ware/src/main/java/site/zhourui/gulimall/ware/vo/MergeVo.java
package site.zhourui.gulimall.ware.vo;
import lombok.Data;
import java.util.List;
@Data
public class MergeVo {
private Long purchaseId; //整单id
private List items;//[1,2,3,4] //合并项集合
}
2.新增采购相关常量
gulimall-common/src/main/java/site/zhourui/common/constant/WareConstant.java
package site.zhourui.common.constant;
public class WareConstant {
public enum PurchaseStatusEnum{
CREATED(0,"新建"),ASSIGNED(1,"已分配"),
RECEIVE(2,"已领取"),FINISH(3,"已完成"),
HASERROR(4,"有异常");
private int code;
private String msg;
PurchaseStatusEnum(int code,String msg){
this.code = code;
this.msg = msg;
}
public int getCode() {
return code;
}
public String getMsg() {
return msg;
}
}
public enum PurchaseDetailStatusEnum{
CREATED(0,"新建"),ASSIGNED(1,"已分配"),
BUYING(2,"正在采购"),FINISH(3,"已完成"),
HASERROR(4,"采购失败");
private int code;
private String msg;
PurchaseDetailStatusEnum(int code,String msg){
this.code = code;
this.msg = msg;
}
public int getCode() {
return code;
}
public String getMsg() {
return msg;
}
}
}
3.新增合并接口
gulimall-ware/src/main/java/site/zhourui/gulimall/ware/service/PurchaseService.java
新增接口
void mergePurchase(MergeVo mergeVo);
gulimall-ware/src/main/java/site/zhourui/gulimall/ware/service/impl/PurchaseServiceImpl.java
新增接口实现
@Transactional
@Override
public void mergePurchase(MergeVo mergeVo) {
Long purchaseId = mergeVo.getPurchaseId();
if(purchaseId == null){
//1、新建一个
PurchaseEntity purchaseEntity = new PurchaseEntity();
purchaseEntity.setStatus(WareConstant.PurchaseStatusEnum.CREATED.getCode());
purchaseEntity.setCreateTime(new Date());
purchaseEntity.setUpdateTime(new Date());
this.save(purchaseEntity);
purchaseId = purchaseEntity.getId();
}
//TODO 确认采购单状态是0,1才可以合并
List items = mergeVo.getItems();
Long finalPurchaseId = purchaseId;
List collect = items.stream().map(i -> {
PurchaseDetailEntity detailEntity = new PurchaseDetailEntity();
detailEntity.setId(i);
detailEntity.setPurchaseId(finalPurchaseId);
detailEntity.setStatus(WareConstant.PurchaseDetailStatusEnum.ASSIGNED.getCode());
return detailEntity;
}).collect(Collectors.toList());
detailService.updateBatchById(collect);
PurchaseEntity purchaseEntity = new PurchaseEntity();
purchaseEntity.setId(purchaseId);
purchaseEntity.setUpdateTime(new Date());
this.updateById(purchaseEntity);
}
gulimall-ware/src/main/java/site/zhourui/gulimall/ware/controller/PurchaseController.java
@PostMapping("/merge")
public R merge(@RequestBody MergeVo mergeVo){
purchaseService.mergePurchase(mergeVo);
return R.ok();
}
5.采购单
1.采购单查询(此部分视频没有)
gulimall-ware/src/main/java/site/zhourui/gulimall/ware/service/impl/PurchaseServiceImpl.java
修改queryPage方法
@Override
public PageUtils queryPage(Map params) {
QueryWrapper queryWrapper = new QueryWrapper();
String key = (String) params.get("key");
if(!StringUtils.isEmpty(key)){
//purchase_id sku_id
queryWrapper.and(w->{
w.like("assignee_name",key);
});
}
String status = (String) params.get("status");
if(!StringUtils.isEmpty(status)){
//purchase_id sku_id
queryWrapper.eq("status",status);
}
IPage page = this.page(
new Query().getPage(params),
queryWrapper
);
return new PageUtils(page);
}
2.采购单查询前端部分
src/views/modules/ware/purchase.vue
3.领取采购单 1.新增PurchaseItemDoneVo对象此处添加状态值
status: this.dataForm.status,
package site.zhourui.gulimall.ware.vo;
import lombok.Data;
@Data
public class PurchaseItemDoneVo {
//{itemId:1,status:4,reason:""}
private Long itemId;
private Integer status;
private String reason;
}
2.新增PurchaseDoneVo对象
package site.zhourui.gulimall.ware.vo;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.util.List;
@Data
public class PurchaseDoneVo {
@NotNull
private Long id;//采购单id
private List items;
}
3.领取采购单接口
gulimall-ware/src/main/java/site/zhourui/gulimall/ware/service/PurchaseService.java
新增接口
void received(Listids);
gulimall-ware/src/main/java/site/zhourui/gulimall/ware/service/impl/PurchaseServiceImpl.java
新增接口实现
@Override public void received(Listids) { //1、确认当前采购单是新建或者已分配状态 List collect = ids.stream().map(id -> { PurchaseEntity byId = this.getById(id); return byId; }).filter(item -> { if (item.getStatus() == WareConstant.PurchaseStatusEnum.CREATED.getCode() || item.getStatus() == WareConstant.PurchaseStatusEnum.ASSIGNED.getCode()) { return true; } return false; }).map(item->{ item.setStatus(WareConstant.PurchaseStatusEnum.RECEIVE.getCode()); item.setUpdateTime(new Date()); return item; }).collect(Collectors.toList()); //2、改变采购单的状态 this.updateBatchById(collect); //3、改变采购项的状态 collect.forEach((item)->{ List entities = detailService.listDetailByPurchaseId(item.getId()); List detailEntities = entities.stream().map(entity -> { PurchaseDetailEntity entity1 = new PurchaseDetailEntity(); entity1.setId(entity.getId()); entity1.setStatus(WareConstant.PurchaseDetailStatusEnum.BUYING.getCode()); return entity1; }).collect(Collectors.toList()); detailService.updateBatchById(detailEntities); }); }
gulimall-ware/src/main/java/site/zhourui/gulimall/ware/controller/PurchaseController.java
@PostMapping("/received")
public R received(@RequestBody List ids){
purchaseService.received(ids);
return R.ok();
}
4.测试
http://localhost:88/api/ware/purchase/received
4.完成采购 1.远程调用商品服务增加商品库存测试结果
gulimall-ware/src/main/java/site/zhourui/gulimall/ware/feign/ProductFeignService.java
package site.zhourui.gulimall.ware.feign;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import site.zhourui.common.utils.R;
@FeignClient("gulimall-product")
public interface ProductFeignService {
@RequestMapping("/product/skuinfo/info/{skuId}")
public R info(@PathVariable("skuId") Long skuId);
}
2.增加库存接口
gulimall-ware/src/main/java/site/zhourui/gulimall/ware/service/WareSkuService.java
void addStock(Long skuId, Long wareId, Integer skuNum);
gulimall-ware/src/main/java/site/zhourui/gulimall/ware/service/impl/WareSkuServiceImpl.java
@Override
public void addStock(Long skuId, Long wareId, Integer skuNum) {
//1、判断如果还没有这个库存记录新增
List entities = wareSkuDao.selectList(new QueryWrapper().eq("sku_id", skuId).eq("ware_id", wareId));
if(entities == null || entities.size() == 0){
WareSkuEntity skuEntity = new WareSkuEntity();
skuEntity.setSkuId(skuId);
skuEntity.setStock(skuNum);
skuEntity.setWareId(wareId);
skuEntity.setStockLocked(0);
//TODO 远程查询sku的名字,如果失败,整个事务无需回滚
//1、自己catch异常
//TODO 还可以用什么办法让异常出现以后不回滚?高级
try {
R info = productFeignService.info(skuId);
Map data = (Map) info.get("skuInfo");
if(info.getCode() == 0){
skuEntity.setSkuName((String) data.get("skuName"));
}
}catch (Exception e){
}
wareSkuDao.insert(skuEntity);
}else{
wareSkuDao.addStock(skuId,wareId,skuNum);
}
}
3.完成采购接口
gulimall-ware/src/main/java/site/zhourui/gulimall/ware/service/PurchaseService.java
void done(PurchaseDoneVo doneVo);
gulimall-ware/src/main/java/site/zhourui/gulimall/ware/service/impl/PurchaseServiceImpl.java
@Transactional
@Override
public void done(PurchaseDoneVo doneVo) {
Long id = doneVo.getId();
//2、改变采购项的状态
Boolean flag = true;
List items = doneVo.getItems();
List updates = new ArrayList<>();
for (PurchaseItemDoneVo item : items) {
PurchaseDetailEntity detailEntity = new PurchaseDetailEntity();
if(item.getStatus() == WareConstant.PurchaseDetailStatusEnum.HASERROR.getCode()){
flag = false;
detailEntity.setStatus(item.getStatus());
}else{
detailEntity.setStatus(WareConstant.PurchaseDetailStatusEnum.FINISH.getCode());
3、将成功采购的进行入库
PurchaseDetailEntity entity = detailService.getById(item.getItemId());
wareSkuService.addStock(entity.getSkuId(),entity.getWareId(),entity.getSkuNum());
}
detailEntity.setId(item.getItemId());
updates.add(detailEntity);
}
detailService.updateBatchById(updates);
//1、改变采购单状态
PurchaseEntity purchaseEntity = new PurchaseEntity();
purchaseEntity.setId(id);
purchaseEntity.setStatus(flag?WareConstant.PurchaseStatusEnum.FINISH.getCode():WareConstant.PurchaseStatusEnum.HASERROR.getCode());
purchaseEntity.setUpdateTime(new Date());
this.updateById(purchaseEntity);
}
gulimall-ware/src/main/java/site/zhourui/gulimall/ware/controller/PurchaseController.java
///ware/purchase/done
@PostMapping("/done")
public R finish(@RequestBody PurchaseDoneVo doneVo){
purchaseService.done(doneVo);
return R.ok();
}
4.测试
http://localhost:88/api/ware/purchase/done
{ "id": 1, "items": [{"itemId":1,"status":3,"reason":""}] }
6.SPU规格维护 1.点击规格404问题测试结果
解决方案
src/router/index.js 下添加以下代码
{ path: '/product-attrupdate', component: _import('modules/product/attrupdate'), name: 'attr-update', meta: { title: '规格维护', isTab: true } }
2.根据spuid查询属性值查询接口解决效果
gulimall-product/src/main/java/site/zhourui/gulimall/product/controller/AttrController.java
新增接口
ListbaseAttrlistforspu(Long spuId);
gulimall-product/src/main/java/site/zhourui/gulimall/product/service/impl/ProductAttrValueServiceImpl.java
新增接口实现类
@Override
public List baseAttrlistforspu(Long spuId) {
List entities = this.baseMapper.selectList(new QueryWrapper().eq("spu_id", spuId));
return entities;
}
gulimall-product/src/main/java/site/zhourui/gulimall/product/controller/AttrController.java
// /product/attr/base/listforspu/{spuId}
@GetMapping("/base/listforspu/{spuId}")
public R baseAttrlistforspu(@PathVariable("spuId") Long spuId){
List entities = productAttrValueService.baseAttrlistforspu(spuId);
return R.ok().put("data",entities);
}
3.修改spuid对应的属性值接口效果
gulimall-product/src/main/java/site/zhourui/gulimall/product/controller/AttrController.java
新增接口
void updateSpuAttr(Long spuId, Listentities);
gulimall-product/src/main/java/site/zhourui/gulimall/product/service/impl/ProductAttrValueServiceImpl.java
新增接口实现类
@Transactional
@Override
public void updateSpuAttr(Long spuId, List entities) {
//1、删除这个spuId之前对应的所有属性
this.baseMapper.delete(new QueryWrapper().eq("spu_id",spuId));
List collect = entities.stream().map(item -> {
item.setSpuId(spuId);
return item;
}).collect(Collectors.toList());
this.saveBatch(collect);
}
gulimall-product/src/main/java/site/zhourui/gulimall/product/controller/AttrController.java
///product/attr/update/{spuId}
@PostMapping("/update/{spuId}")
public R updateSpuAttr(@PathVariable("spuId") Long spuId,
@RequestBody List entities){
productAttrValueService.updateSpuAttr(spuId,entities);
return R.ok();
}
7.总结效果
机身长度属性修改成功
- 分布式基础概念
- 微服务、注册中心、配置中心、远程调用、Feign、网关
- 基础开发
- SpringBoot2.0、SpringCloud、Mybatis-Plus、Vue组件化、阿里云对象存储
- 环境
- Vagrant、Linux、Docker、MySQL、Redis、逆向工程&人人开源
- 开发规范
- 数据校验JSR303、全局异常处理、全局统一返回、全局跨域处理
- 枚举状态、业务状态码、VO与TO与PO划分、逻辑删除
- Lombok:@Data、@Slf4j



