feat(receive): 添加库存报废功能接口

- 新增库存报废查询对象 InventoryScrappingQO
- 创建 OAController 提供库存报废接口
- 实现库存报废业务逻辑,包括库存校验和出库操作
- 新增库存报废记录实体 WmsInventoryScrappingRecord
- 添加库存报废记录服务接口及实现类
- 集成 FIFO 库存获取和批量出库功能
This commit is contained in:
曹鹏飞 2026-06-25 18:47:07 +08:00
parent 971b2a05ca
commit 828d33a724
6 changed files with 226 additions and 0 deletions

View File

@ -0,0 +1,64 @@
package com.nflg.wms.repository.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* <p>
* 库存报废记录
* </p>
*
* @author 代码生成器生成
* @since 2025
*/
@Getter
@Setter
@ToString
@Accessors(chain = true)
@TableName("wms_inventory_scrapping_record")
public class WmsInventoryScrappingRecord implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.ASSIGN_ID)
private Long id;
/**
* 物料编号
*/
private String materialNo;
/**
* 工厂编号
*/
private String factoryNo;
/**
* 仓库编号
*/
private String warehouseNo;
/**
* 数量
*/
private BigDecimal num;
/**
* 备注
*/
private String remark;
/**
* 创建时间
*/
private LocalDateTime createTime;
}

View File

@ -0,0 +1,16 @@
package com.nflg.wms.repository.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.nflg.wms.repository.entity.WmsInventoryScrappingRecord;
/**
* <p>
* Mapper 接口
* </p>
*
* @author 代码生成器生成
* @since 2025
*/
public interface WmsInventoryScrappingRecordMapper extends BaseMapper<WmsInventoryScrappingRecord> {
}

View File

@ -0,0 +1,16 @@
package com.nflg.wms.repository.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.nflg.wms.repository.entity.WmsInventoryScrappingRecord;
/**
* <p>
* 服务类
* </p>
*
* @author 代码生成器生成
* @since 2025
*/
public interface IWmsInventoryScrappingRecordService extends IService<WmsInventoryScrappingRecord> {
}

View File

@ -0,0 +1,20 @@
package com.nflg.wms.repository.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.nflg.wms.repository.entity.WmsInventoryScrappingRecord;
import com.nflg.wms.repository.mapper.WmsInventoryScrappingRecordMapper;
import com.nflg.wms.repository.service.IWmsInventoryScrappingRecordService;
import org.springframework.stereotype.Service;
/**
* <p>
* 服务实现类
* </p>
*
* @author 代码生成器生成
* @since 2025
*/
@Service
public class WmsInventoryScrappingRecordServiceImpl extends ServiceImpl<WmsInventoryScrappingRecordMapper, WmsInventoryScrappingRecord> implements IWmsInventoryScrappingRecordService {
}

View File

@ -0,0 +1,70 @@
package com.nflg.wms.srm.receive.controller;
import com.nflg.wms.common.pojo.ApiResult;
import com.nflg.wms.common.pojo.dto.InventoryOutDTO;
import com.nflg.wms.common.util.VUtil;
import com.nflg.wms.repository.entity.WmsInventory;
import com.nflg.wms.repository.entity.WmsInventoryScrappingRecord;
import com.nflg.wms.repository.service.IWmsInventoryScrappingRecordService;
import com.nflg.wms.repository.service.IWmsInventoryService;
import com.nflg.wms.srm.receive.pojo.qo.InventoryScrappingQO;
import com.nflg.wms.starter.BaseController;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotNull;
import lombok.extern.slf4j.Slf4j;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
/**
* 接收oa推送数据
*/
@Slf4j
@RestController
@RequestMapping("/oa")
public class OAController extends BaseController {
@Resource
private IWmsInventoryService inventoryService;
@Resource
private IWmsInventoryScrappingRecordService inventoryScrappingRecordService;
/**
* 库存报废
*/
@Transactional
@PostMapping("/inventory/scrapping")
public ApiResult<Void> inventoryScrapping(@Valid @RequestBody @NotNull InventoryScrappingQO qo) {
List<WmsInventory> inventories = inventoryService.getForOutFIFO(qo.getFactoryNo(), qo.getWarehouseNo(), List.of(qo.getMaterialNo()));
VUtil.trueThrowBusinessError(inventories.stream().map(WmsInventory::getNum).reduce(BigDecimal.ZERO, BigDecimal::add).compareTo(qo.getNum()) < 0)
.throwMessage("库存不足");
inventoryService.out(inventories.stream()
.map(inventory -> new InventoryOutDTO()
.setFactoryNo(inventory.getFactoryNo())
.setWarehouseNo(inventory.getWarehouseNo())
.setBatchNo(inventory.getBatchNo())
.setBinLocation(inventory.getBinLocation())
.setSerialNo(inventory.getSerialNo())
.setNum(qo.getNum())
)
.toList()
);
inventoryScrappingRecordService.save(new WmsInventoryScrappingRecord()
.setFactoryNo(qo.getFactoryNo())
.setWarehouseNo(qo.getWarehouseNo())
.setMaterialNo(qo.getMaterialNo())
.setNum(qo.getNum())
.setRemark(qo.getRemark())
.setCreateTime(LocalDateTime.now())
);
return ApiResult.success();
}
}

View File

@ -0,0 +1,40 @@
package com.nflg.wms.srm.receive.pojo.qo;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class InventoryScrappingQO {
/**
* 工厂编码
*/
@NotBlank
private String factoryNo;
/**
* 仓库编码
*/
@NotBlank
private String warehouseNo;
/**
* 物料编码
*/
@NotBlank
private String materialNo;
/**
* 数量
*/
@NotNull
private BigDecimal num;
/**
* 备注
*/
private String remark;
}