Description or Example
# 核心代码
```java
@RequestMapping("/merge")
public R mergePurchaseDetailToPurchase(@RequestBody PurchaseMergeVO purchaseMergeVO) {
purchaseService.merge(purchaseMergeVO);
return R.ok();
}
```
```java
@Override
@Transactional
public void merge(PurchaseMergeVO purchaseMergeVO) {
Long purchaseId = purchaseMergeVO.getPurchaseId();
if (purchaseId == null || purchaseId == 0L) { // 不存在采购单
// 不存在采购单就手动创建一个采购单
PurchaseEntity purchaseEntity = new PurchaseEntity();
purchaseEntity.setCreateTime(new Date())
.setUpdateTime(new Date())
.setPriority(ProductConstant.Priority.DEFAULT_PRIORITY.getCode())
.setStatus(WareConstant.PurchaseStatus.PURCHASE_NEW.getCode());
this.save(purchaseEntity);
purchaseId = purchaseEntity.getId(); // 赋值采购单ID
}else {
// 有了采购单, 但不一定是合法的采购单
PurchaseEntity purchaseEntity = this.getById(purchaseId);
Integer status = purchaseEntity.getStatus();
if (WareConstant.PurchaseStatus.PURCHASE_ALLOCATION.getCode() < status) {
// 采购单状态码大于已分配状态码, 说明一定是不合法装填
throw new RuntimeException("采购单状态不合法");
}
// 更新采购单的更新时间
this.updateById(purchaseEntity.setUpdateTime(new Date()));
}
// 无论如何, 这里的采购单id都存在
Long finalPurchaseId = purchaseId;
if (purchaseMergeVO.getItems() != null) {
List<PurchaseDetailEntity> purchaseDetailEntities = Arrays.stream(purchaseMergeVO.getItems()).map(purchaseDetailId -> {
PurchaseDetailEntity purchaseDetailEntity = new PurchaseDetailEntity();
purchaseDetailEntity.setPurchaseId(finalPurchaseId)
.setStatus(WareConstant.PurchaseDetailStatus.PURCHASE_DETAIL_ALLOCATION.getCode()) // 更新状态
.setId(purchaseDetailId); // 更新需要id
return purchaseDetailEntity;
}).collect(Collectors.toList());
purchaseDetailService.updateBatchById(purchaseDetailEntities);
}
}
```
# 扩展知识
## 为什么还需要判断采购单的合法性?
> 我们由前面的逻辑可知, 页面查询出来的采购单一定是合法的, 但不能保证永远都是合法的, 即因为管理系统不可能是单人应用, 在我们查询出合法采购单的时候, 可能有人会将采购单领取了, 查询出来的采购单就不合法了, 因此, 还需要判断采购单的状态