document
API test

完成采购

POST
http://localhost:88/api/ware/purchase/done

API description

完成采购

Request Parameters

parameter
type
description
required
id
int
示例:8
required
items
array
数据列表
required
itemId
int
示例:3
required
status
int
示例:3
required
reason
string
示例:
required

Response Parameters

parameter
type
description
required
msg
string
示例:success
required
code
int
示例:0
required

Description or Example

# 核心代码 ```java @RequestMapping("/done") public R donePurchase(@RequestBody PurchaseDoneVO purchaseDoneVO) { purchaseService.donePurchase(purchaseDoneVO); return R.ok(); } ``` ```java @Override @Transactional public void donePurchase(PurchaseDoneVO purchaseDoneVO) { // 完成采购之前需要判断采购状态 Integer curStatus = this.getById(purchaseDoneVO.getId()).getStatus(); if (curStatus != WareConstant.PurchaseStatus.PURCHASE_RECEIVE.getCode()) throw new RuntimeException("该采购尚未被领取"); // 不是已被领取的采购状态, 不能完成采购 // 1. 更新采购需求状态 List<PurchaseDoneVO.PDStatus> items = purchaseDoneVO.getItems(); // 获取采购需求的更新数据, 有校验, 一定不为空 boolean isSuccess = purchaseDetailService.updateBatchById(items); // 根据采购需求, 更新采购单, 只有采购需求全部成功, 采购单才可以成功 Long purchaseId = purchaseDoneVO.getId(); Integer status = isSuccess ? WareConstant.PurchaseStatus.PURCHASE_FINISH.getCode() : WareConstant.PurchaseStatus.PURCHASE_ERROR.getCode(); PurchaseEntity purchaseEntity = new PurchaseEntity().setId(purchaseId) .setStatus(status); this.updateById(purchaseEntity); } ``` ```java @Override public boolean updateBatchById(List<PurchaseDoneVO.PDStatus> items) { AtomicBoolean isSuccess = new AtomicBoolean(true); // 存储采购需求失败id的集合 Set<Long> fatalSet = new HashSet<>(); List<PurchaseDetailEntity> purchaseDetailEntities = items.stream().map(item -> { // 封装, 完成更新 PurchaseDetailEntity purchaseDetailEntity = new PurchaseDetailEntity(); Integer status = item.getStatus(); // 如果采购失败, 保存失败原因 if (status == WareConstant.PurchaseDetailStatus.PURCHASE_DETAIL_ERROR.getCode()) { purchaseDetailEntity.setReason(item.getReason()); isSuccess.set(false); fatalSet.add(item.getItemId()); // 添加失败集合 } return purchaseDetailEntity.setId(item.getItemId()) .setStatus(item.getStatus()); }).collect(Collectors.toList()); this.updateBatchById(purchaseDetailEntities); // 批量更新 // 获取采购需求的详细信息 List<Long> detailIds = items.stream().map(PurchaseDoneVO.PDStatus::getItemId).collect(Collectors.toList()); purchaseDetailEntities = this.baseMapper.selectBatchIds(detailIds); // 2. 将采购需求添加库存 成功才添加 purchaseDetailEntities.forEach(purchaseDetailEntity -> { // 如果失败就不添加库存 if (!fatalSet.contains(purchaseDetailEntity.getId())) { WareSkuEntity wareSkuEntity = new WareSkuEntity(); wareSkuEntity.setSkuId(purchaseDetailEntity.getSkuId()) .setWareId(purchaseDetailEntity.getWareId()); // 尝试去查找该记录 boolean isExist = wareSkuService.getWareBySkuIdAndWareId(wareSkuEntity); if (isExist) { // 需要对空进行额外判断 int pre = wareSkuEntity.getStock() == null ? 0 : wareSkuEntity.getStock(); int add = purchaseDetailEntity.getSkuNum() == null ? 0 : purchaseDetailEntity.getSkuNum(); int curStock = pre + add; wareSkuService.updateById(wareSkuEntity.setStock(curStock)); }else { Long skuId = purchaseDetailEntity.getSkuId(); R info = skuInfoService.infoName(skuId); if (info.getCode() != 0) { throw new RuntimeException("获取SKU名字失败"); } String skuName = (String) info.get("skuName"); wareSkuEntity.setStock(purchaseDetailEntity.getSkuNum()) .setStockLocked(0) .setSkuName(skuName); wareSkuService.save(wareSkuEntity); } } }); return isSuccess.get(); } ``` ```java @Override public boolean getWareBySkuIdAndWareId(WareSkuEntity wareSkuEntity) { LambdaQueryWrapper<WareSkuEntity> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(WareSkuEntity::getWareId, wareSkuEntity.getWareId()) .eq(WareSkuEntity::getSkuId, wareSkuEntity.getSkuId()); WareSkuEntity skuEntity = this.getOne(queryWrapper); if (skuEntity == null) return false; else { // 注意不要引用的拷贝, 这里是局部变量, 不会改变对象本身 BeanUtils.copyProperties(skuEntity, wareSkuEntity); return true; } } ``` # 扩展知识 ## 为什么过滤掉没有错误的reason, 不存空串? > 因为一旦存储空串, `varchar`会记录长度, 造成磁盘空间的浪费