在初级篇里:只有这些模块(仓库维护,商品库存,采购需求,采购单)
谷粒商城接口文档:https://easydoc.net/doc/75716633/ZUqEdvA4/hKJTcbfd
这里我没有依赖注入所以某些对象要自己注入,如果你是跟着谷粒商城项目敲过来,那么我写的对象你肯定知道怎么来的。
仓库维护模块
这里就是简单的增删改查,在这里不做多叙述
合并采购项
- 获取采购单信息(采购单状态是 ’ 未领取 ‘)
接口: /ware/purchase/unreceive/list
controller层
查询未领取的采购单
@GetMapping(value = "/unreceive/list")
public R unreceiveList(@RequestParam Map<String, Object> params){
PageUtils page = purchaseService.queryPageUnreceive(params);
return R.ok().put("page", page);
}
service层
@Override
public PageUtils queryPageUnreceive(Map<String, Object> params) {
IPage<PurchaseEntity> page = this.page(
new Query<PurchaseEntity>().getPage(params),
new QueryWrapper<PurchaseEntity>().eq("status",0).or().eq("status",1)
);
return new PageUtils(page);
}
- 合并采购需求-》变为采购单
注意:如果前台没有传采购单id,则说明,我们后台需要自己创建一个采购单,如果传了采购单id则就正常修改状态即可
注意:系统人员他不会一个一个点击采购项,他会点击全选然后提交,这里就有一个问题,这里的采购项不止有新建,已分配还有已完成等等等,所有我们在后台要过滤新建和已分配的采购项
接口: /ware/purchase/merge
Vo实体类
@Data
public class MergeVo {
private Long purchaseId;//采购单id
private List<Long> items;//采购需求id
}
controller层
合并采购需求,post请求 /ware/purchase/merge
@PostMapping(value = "/merge")
public R merge(@RequestBody MergeVo mergeVo) {
purchaseService.mergePurchase(mergeVo);
return R.ok();
}
service层 注意我们这里需要添加事务:因为有添加操作
//合并采购项
@Transactional(rollbackFor = Exception.class)
@Override
public void mergePurchase(MergeVo mergeVo) {
1. 首先判断该采购单是否存在,如果不存在就新增采购单,状态未新建状态,并提取采购单id(因为后面采购项中有使用),
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();
}
2.过滤采购项未新建和已分配数据
List<Long> items = mergeVo.getItems();
//采购需求只有是0或1才可以分配
Collection<PurchaseDetailEntity> purchaseDetailEntities = purchaseDetailService.listByIds(items);
purchaseDetailEntities.forEach((item) -> {
if (!item.getStatus().equals(WareConstant.PurchaseDetailStatusEnum.CREATED.getCode())
&& !item.getStatus().equals(WareConstant.PurchaseDetailStatusEnum.ASSIGNED.getCode())) {
throw new IllegalArgumentException("正在采购,无法进行分配");
}
});
3.遍历采购项,并将采购需求设置为已分配
Long finalPurchaseId = purchaseId;//为什么不可以直接给purchaseId放入PurchaseDetailEntity表中
List<PurchaseDetailEntity> collect = items.stream().map((i) -> {
PurchaseDetailEntity entity = new PurchaseDetailEntity();
entity.setId(i);
entity.setPurchaseId(finalPurchaseId);
entity.setStatus(WareConstant.PurchaseDetailStatusEnum.ASSIGNED.getCode());
return entity;
}).collect(Collectors.toList());
purchaseDetailService.updateBatchById(collect);
4.更新时间PurchaseEntity表中数据修改时间
PurchaseEntity purchaseEntity = new PurchaseEntity();
purchaseEntity.setId(purchaseId);
purchaseEntity.setUpdateTime(new Date());
this.updateById(purchaseEntity);
}
领取采购单
我们后台需要将采购单和采购需求的状态变为 ’ 已分配 ‘。
注意:工作人员不会一个一个点击采购单,他会点击全选,然后领取采购单,所以我们要过滤状态为新建和已分配的数据
接口: /ware/purchase/received
controller
领取采购单 post请求 /ware/purchase/merge
@PostMapping(value = "/received")
public R received(@RequestBody List<Long> ids) {
purchaseService.received(ids);
return R.ok();
}
service层
@Override
public void received(List<Long> ids) {
//前台传的状态可能有多种,已领取,已完成啊...所有我们要根据传过来的id过滤出新建和已分配
1.遍历采购单id,选出状态为新建和已分配的采购单
List<PurchaseEntity> 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());
this.updateBatchById(collect);
2.改变采购项的状态
collect.forEach((item) -> {
List<PurchaseDetailEntity> list = purchaseDetailService.listDetailByPurchaseId(item.getId());
List<PurchaseDetailEntity> detailEntities = list.stream().map(entity -> {
PurchaseDetailEntity purchaseDetailEntity = new PurchaseDetailEntity();
purchaseDetailEntity.setId(entity.getId());
purchaseDetailEntity.setStatus(WareConstant.PurchaseDetailStatusEnum.BUYING.getCode());
return purchaseDetailEntity;
}).collect(Collectors.toList());
purchaseDetailService.updateBatchById(detailEntities);
});
}
完成采购单
我们不仅需要修改采购单和采购项的状态,还需要将已购买的商品存入库存
在这里不将异常(这里的异常:购买的商品不足,或者购买的商品数据为0)状态的采购项商品存入库存,如果你硬是将有异常(够买了商品,但没有到达指定购买数量)状态的数据存入库存中:解决:1、给数据库添加字段(已购买,reson),然后我们根据已购买的数据更新库存商品,解决步骤:前端参数(采购单id,{采购项:id,status,num,reson}),遍历前端传来采购项数据(采购项状态为已完成的,则正常修改采购单和采购项的状态,如果采购项状态异常,1、得到采购项购买商品数量,并将已购买字段数据更新,然后将库存更新)
接口: ware/purchase/done
Vo实体类
@Data
public class PurchaseDoneVo {
@NotNull(message = "id不允许为空")
private Long id;//采购单id
private List<PurchaseItemDoneVo> items;//完成/失败的需求详情
}
@Data
public class PurchaseItemDoneVo {
private Long itemId;//采购项id
private Integer status;
private String reason;
}
controller层
完成采购单 post请求
@PostMapping("/done")
public R finish(@RequestBody PurchaseDoneVo doneVo) {
System.out.println("提交采购单");
purchaseService.done(doneVo);
return R.ok();
}
service层
@Transactional
@Override
public void done(PurchaseDoneVo doneVo) {
1.修改采购项状态,更新库存
boolean flag=true;
List<PurchaseItemDoneVo> items = doneVo.getItems();
ArrayList<PurchaseDetailEntity> objects = new ArrayList<>();
for (PurchaseItemDoneVo item : items) {
PurchaseDetailEntity purchaseDetailEntity = new PurchaseDetailEntity();
//设置状态
if(item.getStatus()==WareConstant.PurchaseDetailStatusEnum.HASERROR.getCode()){
//采购失败
flag=false;
purchaseDetailEntity.setStatus(item.getStatus());
}else {
purchaseDetailEntity.setStatus(WareConstant.PurchaseDetailStatusEnum.FINISH.getCode());
//修改库存:在这里修改是因为,反正已经得到了对象,那就直接修改库存数据
PurchaseDetailEntity entity = purchaseDetailService.getById(item.getItemId());
//修改数据:要判断数据库中是否存在数据,有就修改数据,没有就添加数据
wareSkuService.addStock(entity.getSkuId(),entity.getWareId(),entity.getSkuNum());
}
//设置采购项id
purchaseDetailEntity.setId(item.getItemId());
objects.add(purchaseDetailEntity);
}
purchaseDetailService.updateBatchById(objects);
2.修改采购单状态
PurchaseEntity purchaseEntity = new PurchaseEntity();
purchaseEntity.setId(doneVo.getId());
purchaseEntity.setStatus(flag?WareConstant.PurchaseStatusEnum.FINISH.getCode():WareConstant.PurchaseStatusEnum.HASERROR.getCode());
purchaseEntity.setUpdateTime(new Date());
this.updateById(purchaseEntity);
}
spu商品修改规格
会发生404错误,解决给数据库(gulimall_admin)添加一个数据
INSERT INTO sys_menu ( menu_id, parent_id, NAME, url, perms, type, icon, order_num )
VALUES
( 76, 37, '规格维护', 'product/attrupdate', NULL, 2, 'log', 0 );
然后就是正常的增删改查了
接口 /product/attr/base/listforspu/{spuId}
获取spu规格
controller
//获取spu规格
@GetMapping("/base/listforspu/{spuId}")
public R baseAttrlistforspu(@PathVariable("spuId") Long spuId){
System.out.println("获取spu规格数据");
List<ProductAttrValueEntity> entities = productAttrValueService.baseAttrListforspu(spuId);
return R.ok().put("data",entities);
}
service层
获取ProductAttrValueEntity
@Override
public List<ProductAttrValueEntity> baseAttrListforspu(Long spuId) {
List<ProductAttrValueEntity> entities = this.baseMapper.selectList(new QueryWrapper<ProductAttrValueEntity>()
.eq("spu_id", spuId));
return entities;
}
修改spu
接口 /product/attr/update/{spuId}
controller层
Vo 实体类//修改spu规格
@PostMapping("/update/{spuId}")
public R updateSpuAttr(@PathVariable("spuId") Long spuId,
@RequestBody List<ProductAttrValueEntity> entities){
productAttrValueService.updateSpuAttr(spuId,entities);
return R.ok();
}
service层
注意:将之前存入的数据全部删除,再插入新数据即可
@Override
public void updateSpuAttr(Long spuId, List<ProductAttrValueEntity> entities) {
this.baseMapper.delete(new QueryWrapper<ProductAttrValueEntity>()
.eq("spu_id",spuId));
//2、添加商品规格信息
List<ProductAttrValueEntity> collect = entities.stream().map(item -> {
item.setSpuId(spuId);
return item;
}).collect(Collectors.toList());
//批量新增
this.saveBatch(collect);
}
版权声明:本文为m0_50574545原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。