✅P99_仓库管理-完成采购
大约 2 分钟
需求分析
完成采购的步骤:
- 判断所有采购需求的状态,采购需求全部完成时,采购单状态才为完成
- 采购项完成的时候,增加库存(调用远程获取skuName)
- 加上分页插件
接口信息
接口地址
POST:/ware/purchase/done
请求参数
{
id: 123,//采购单id
items: [{itemId:1,status:4,reason:""}]//完成/失败的需求详情
}
响应数据
{
"msg": "success",
"code": 0
}
后端代码
Controller
cfmall-ware/src/main/java/com/gyz/cfmall/ware/controller/PurchaseController.java
/**
* 完成采购单
* @param doneVo
* @return
*/
@PostMapping(value = "/done")
public R finish(@RequestBody PurchaseDoneVo doneVo) {
purchaseService.done(doneVo);
return R.ok();
}
cfmall-ware/src/main/java/com/gyz/cfmall/ware/vo/PurchaseDoneVo.java
@Data
public class PurchaseDoneVo {
@NotNull(message = "id不允许为空")
private Long id;
private List<PurchaseItemDoneVo> items;
}
cfmall-ware/src/main/java/com/gyz/cfmall/ware/vo/PurchaseItemDoneVo.java
@Data
public class PurchaseItemDoneVo {
private Long itemId;
private Integer status;
private String reason;
}
cfmall-ware/src/main/java/com/gyz/cfmall/ware/service/impl/PurchaseServiceImpl.java
/**
* 完成采购单
* @param doneVo
*/
@Override
public void done(PurchaseDoneVo doneVo) {
Long id = doneVo.getId();
//1、改变采购项的状态
Boolean flag = true;
List<PurchaseItemDoneVo> items = doneVo.getItems();
List<PurchaseDetailEntity> updates = 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());
//3、将成功采购的进行入库
//查出当前采购项的详细信息
//PurchaseDetailEntity entity = purchaseDetailService.getById(item.getItemId());
PurchaseDetailEntity entity = purchaseDetailService.getById(item.getItemId());
wareSkuService.addStock(entity.getSkuId(),entity.getWareId(),entity.getSkuNum());
}
purchaseDetailEntity.setId(item.getItemId());
updates.add(purchaseDetailEntity);
}
//批量更新
purchaseDetailService.updateBatchById(updates);
//2、改变采购单状态
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);
}
cfmall-ware/src/main/java/com/gyz/cfmall/ware/service/WareSkuService.java
/**
* 添加库存
* @param skuId
* @param wareId
* @param skuNum
*/
void addStock(Long skuId, Long wareId, Integer skuNum);
cfmall-ware/src/main/java/com/gyz/cfmall/ware/service/impl/WareSkuServiceImpl.java
@Transactional(rollbackFor = Exception.class)
@Override
public void addStock(Long skuId, Long wareId, Integer skuNum) {
//1、判读如果没有这个库存记录新增
List<WareSkuEntity> wareSkuEntities = wareSkuDao.selectList(
new QueryWrapper<WareSkuEntity>().eq("sku_id", skuId).eq("ware_id", wareId));
if (wareSkuEntities == null || wareSkuEntities.size() == 0) {
WareSkuEntity wareSkuEntity = new WareSkuEntity();
wareSkuEntity.setSkuId(skuId);
wareSkuEntity.setStock(skuNum);
wareSkuEntity.setWareId(wareId);
wareSkuEntity.setStockLocked(0);
// 远程查询sku的名字,如果失败整个事务无需回滚
//1、自己catch异常
try{
R info = productFeignService.info(skuId);
Map<String,Object> data = (Map<String, Object>) info.get("skuInfo");
if (info.getCode() == 0) {
wareSkuEntity.setSkuName((String) data.get("skuName"));
}
} catch (Exception e) {
}
//添加库存信息
wareSkuDao.insert(wareSkuEntity);
} else {
//修改库存信息
wareSkuDao.addStock(skuId,wareId,skuNum);
}
}
远程调用商品服务
@FeignClient(value = "cfmall-product")
public interface ProductFeignService {
/**
* /product/skuinfo/info/{skuId}
*
*
* 1)、让所有请求过网关;
* 1、@FeignClient("cfmall-gateway"):给gulimall-gateway所在的机器发请求
* 2、/api/product/skuinfo/info/{skuId}
* 2)、直接让后台指定服务处理
* 1、@FeignClient("cfmall-product")
* 2、/product/skuinfo/info/{skuId}
*
* @return
*/
@RequestMapping("/product/skuinfo/info/{skuId}")
R info(@PathVariable("skuId") Long skuId);
}
/**
* 信息
*/
@RequestMapping("/info/{skuId}")
//@RequiresPermissions("product:skuinfo:info")
public R info(@PathVariable("skuId") Long skuId){
SkuInfoEntity skuInfo = skuInfoService.getById(skuId);
return R.ok().put("skuInfo", skuInfo);
}
分页插件
cfmall-ware/src/main/java/com/gyz/cfmall/ware/config/MyBatisConfig.java
@Configuration
@EnableTransactionManagement //开启使用
@MapperScan("com.gyz.cfmall.ware.dao")
public class MyBatisConfig {
//引入分页插件(旧版)
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
// 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求 默认false
paginationInterceptor.setOverflow(true);
// 设置最大单页限制数量,默认 500 条,-1 不受限制
paginationInterceptor.setLimit(1000);
return paginationInterceptor;
}
}