仓储服务
前言
本文继续记录B站谷粒商城项目视频 P95-99 的内容,做到知识点的梳理和总结的作用,接口文档地址:gulimall接口文档
一、整合仓储服务
1.1 注册中心和配置中心配置
#服务注册发现地址
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
application:
name: gulimall-ware
#配置中心地址
spring.application.name=gulimall-ware
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
@EnableTransactionManagement
@MapperScan("com.atguigu.gulimall.ware.dao")
//开启服务注册发现功能注解
@EnableDiscoveryClient
@SpringBootApplication
public class GulimallWareApplication {
public static void main(String[] args) {
SpringApplication.run(GulimallWareApplication.class, args);
}
}
#网关gateway路由规则配置
spring:
cloud:
gateway:
routes:
- id: ware_route
uri: lb://gulimall-ware
predicates:
- Path=/api/ware/**
filters:
- RewritePath=/api/(?<segment>.*),/$\{segment}
重启 ware 服务,得利于逆向工程仓库维护基本的增删改查代码能够正常使用,如下图所示
1.2 仓库信息模糊检索功能
1.2.1 需求描述:点击仓库维护模块,输入要查询的参数名,后端能够根据参数名做模糊检索的功能。模糊检索描述:仓库id等于传入的参数值,或者仓库名称包含传入的参数值,或者仓库地址包含传入的参数值以及区域编码等于传入的参数值。 提示:视频中的区域编码是使用模糊匹配检索,个人理解这个检索不太恰当,应该使用 eq 精准匹配
。
@Override
public PageUtils queryPage(Map<String, Object> params) {
QueryWrapper<WareInfoEntity> wrapper = new QueryWrapper<>();
String key = (String) params.get("key");
if (!StringUtils.isEmpty(key)){
wrapper.eq("id", key)
.or().like("name", key)
.or().like("address", key)
.eq("areacode", key);
}
IPage<WareInfoEntity> page = this.page(
new Query<WareInfoEntity>().getPage(params),
wrapper
);
return new PageUtils(page);
}
实现效果如下图
二、查询库存与新建采购单
2.1 仓库管理查询库存功能
1.3.1 需求描述:点击库存管理,选择仓库编号以及skuId能够查询出库存信息(前端除了会带上基本的分页字段外,还带上skuId: 27,wareId: 1信息)。
@Override
public PageUtils queryPage(Map<String, Object> params) {
/**
* 前端发送商品库存查询请求会自动带上这两个字段
* skuId: 1
* wareId: 1
*/
QueryWrapper<WareSkuEntity> wrapper = new QueryWrapper<WareSkuEntity>();
String skuId = (String) params.get("skuId");
if (!StringUtils.isEmpty(skuId)){
wrapper.eq("sku_id ", skuId);
}
String wareId = (String) params.get("wareId");
if (!StringUtils.isEmpty(wareId)){
wrapper.eq("ware_id ", wareId);
}
IPage<WareSkuEntity> page = this.page(
new Query<WareSkuEntity>().getPage(params),
wrapper
);
return new PageUtils(page);
}
2.2 仓库管理查询采购单功能
2.1.1 采购简要流程图如下图所示
2.2.2 需求描述:点击采购单维护,选择采购需求我们可以根据仓库编号,采购需求状态以及关键字进行采购需求的搜索功能。
//采购需求PurchaseDetailServiceImpl
@Override
public PageUtils queryPage(Map<String, Object> params) {
/**
* key:
* status: 1
* wareId: 1
*/
QueryWrapper<PurchaseDetailEntity> wrapper = new QueryWrapper<PurchaseDetailEntity>();
String key = (String) params.get("key");
if (!StringUtils.isEmpty(key)){
//purchase_id采购单id sku_id skuId
wrapper.and(w->{
w.eq("purchase_id", key).or().eq("sku_id", key);
});
}
String status = (String) params.get("status");
if (!StringUtils.isEmpty(status)){
wrapper.eq("status", status);
}
String wareId = (String) params.get("wareId");
if (!StringUtils.isEmpty(wareId)){
wrapper.eq("ware_id", wareId);
}
IPage<PurchaseDetailEntity> page = this.page(
new Query<PurchaseDetailEntity>().getPage(params),
wrapper
);
return new PageUtils(page);
}
2.3 合并采购单需求
2.3.1 需求描述:选中采购需求id,点击批量操作的合并整单可以将我们的采购需求合并到新建或已分配的采购单上,如下图所示。
管理员列表新增两个采购人员,如下图所示。
新建采购单将采购单分配给采购人员,如下图所示。
点击确定后前端会发送采购需求id以及要合并的采购单id,如下图所示(若合并到整单不选中任何采购单id的话,系统会默认创建新的采购单)。
代码实现
@Data
public class MergeVO {
/**
* items:[1, 2] 采购项
* purchaseId:1 采购单id
*/
private List<Long> items;
private Long purchaseId;
}
/**
* 合并采购单
*/
@PostMapping("/merge")
public R mergePurchase(@RequestBody MergeVO mergeVO){
purchaseService.mergePurchase(mergeVO);
return R.ok();
}
@Transactional
@Override
public void mergePurchase(MergeVO mergeVO) {
Long purchaseId = mergeVO.getPurchaseId();
//如果采购单是空的就新建一个采购单,并设置默认的采购单状态,采购单创建及更新日期
if (purchaseId == null){
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<Long> items = mergeVO.getItems();
Long finalPurchaseId = purchaseId;
List<PurchaseDetailEntity> detailEntityList = items.stream().map(m -> {
PurchaseDetailEntity detailEntity = new PurchaseDetailEntity();
detailEntity.setId(m);
detailEntity.setPurchaseId(finalPurchaseId);
detailEntity.setStatus(WareConstant.PurchaseDetailStatusEnum.ASSIGNED.getCode());
return detailEntity;
}).collect(Collectors.toList());
purchaseDetailService.updateBatchById(detailEntityList);
PurchaseEntity purchaseEntity = new PurchaseEntity();
purchaseEntity.setId(purchaseId);
purchaseEntity.setUpdateTime(new Date());
this.updateById(purchaseEntity);
}