头行结构数据的增删改查
总结
数据库中的主键都是系统生成的(某种算法或系统自增等)。而头行结构中,行数据需要保存所属头数据的字段(行数据保存头ID)。
-
新建
头行结构保存时,先保存头数据,头数据的id 系统自动生成,
根据订单编号,再次查询头数据
遍历每一行数据,设置行数据中的headerId为头数据的headerId
保存行数据 -
修改
前台对行数据做出修改(修改、新增、删除),后端进行更新
对每一行数据设置一个相应的状态
传入后台的是状态码+订单编号
判断状态码,根据订单编号进行操作。 -
其他逻辑
后台可以根据传入数据的id进行判断,没有id就是新增,有id就是修改
一些场景中,前台可以做成多选框,只传入后台需要的数据.
1、接口分析
从增删改查的角度来看,只需要以下六个接口即可完成CRUD。
其中接口1、4都需要做成分页查询;接口2根据传入的数据(头行)进行判断:创建(头id为null),修改(头id不为null);5和6做成批量删除
- 头表汇总查询
- 创建头/修改头行
- 详情页——头信息查询
- 详情页——根据头id查询行信息
- 批量删除头
- 批量删除行
2、头表汇总查询
//controller
@ApiOperation(value = "入库单头表列表")
@Permission(level = ResourceLevel.ORGANIZATION)
@ProcessLovValue(targetField = BaseConstants.FIELD_BODY)
@GetMapping
public ResponseEntity<Page<YnjtSpucWarehouseEntryHeaderDTO>> list(@PathVariable Long organizationId,YnjtSpucWarehouseEntryHeaderDTO entryHeaderDTO,
@ApiIgnore @SortDefault(value = YnjtSpucWarehouseEntryHeader.FIELD_WAREHOUSE_ENTRY_HEADER_ID,
direction = Sort.Direction.DESC) PageRequest pageRequest) {
return Results.success(ynjtSpucWarehouseEntryHeaderService.selectWarehouseEntryHeaders(organizationId,pageRequest, entryHeaderDTO));
}
//service
Page<YnjtSpucWarehouseEntryHeaderDTO> selectWarehouseEntryHeaders(Long tenantId, PageRequest pageRequest, YnjtSpucWarehouseEntryHeaderDTO entryHeaderDTO);
//serviceImpl
@Override
public Page<YnjtSpucWarehouseEntryHeaderDTO> selectWarehouseEntryHeaders(Long tenantId, PageRequest pageRequest, YnjtSpucWarehouseEntryHeaderDTO entryHeaderDTO) {
return ynjtSpucWarehouseEntryHeaderRepository.selectWarehouseEntryHeaders(tenantId, pageRequest, entryHeaderDTO);
}
//Repository
Page<YnjtSpucWarehouseEntryHeaderDTO> selectWarehouseEntryHeaders(Long tenantId, PageRequest pageRequest, YnjtSpucWarehouseEntryHeaderDTO entryHeaderDTO);
//RepositoryImpl
@Override
public Page<YnjtSpucWarehouseEntryHeaderDTO> selectWarehouseEntryHeaders(Long tenantId, PageRequest pageRequest, YnjtSpucWarehouseEntryHeaderDTO entryHeaderDTO) {
return PageHelper.doPageAndSort(pageRequest,()->ynjtSpucWarehouseEntryHeaderMapper.selectWarehouseEntryHeaders(tenantId,entryHeaderDTO));
}
//mapper
List<YnjtSpucWarehouseEntryHeaderDTO> selectWarehouseEntryHeaders(Long tenantId, YnjtSpucWarehouseEntryHeaderDTO entryHeaderDTO);
3、创建头/修改头行
//controller
@ApiOperation(value = "创建/修改入库单头表")
@Permission(level = ResourceLevel.ORGANIZATION)
@PostMapping
public ResponseEntity<YnjtSpucWarehouseEntryHeaderAndLineDTO> createOrupdate(@PathVariable Long organizationId,@RequestBody YnjtSpucWarehouseEntryHeaderAndLineDTO headerAndLineDTO) {
headerAndLineDTO.getHeader().setTenantId(organizationId);
return Results.success(ynjtSpucWarehouseEntryHeaderService.createOrupdate(headerAndLineDTO));
}
//service
YnjtSpucWarehouseEntryHeaderAndLineDTO createOrupdate(YnjtSpucWarehouseEntryHeaderAndLineDTO headerAndLineDTO);
//serviceImpl
@Override
public YnjtSpucWarehouseEntryHeaderAndLineDTO createOrupdate(YnjtSpucWarehouseEntryHeaderAndLineDTO headerAndLineDTO) {
YnjtSpucWarehouseEntryHeader header = headerAndLineDTO.getHeader();
if(null == header.getWarehouseEntryHeaderId()){
return this.create(headerAndLineDTO);
}
return this.update(headerAndLineDTO);
}
//create
@Override
public YnjtSpucWarehouseEntryHeaderAndLineDTO create(YnjtSpucWarehouseEntryHeaderAndLineDTO headerAndLineDTO) {
YnjtSpucWarehouseEntryHeader header = headerAndLineDTO.getHeader();
validObject(header);
header.generateCode(codeRuleBuilder);
header.setVoucher(DetailsHelper.getUserDetails().getUserId());
header.setWarehouseEntryStatus(WarehouseEntryHeaderConstants.WarehouseEntryStatus.EDITING);
if(ynjtSpucWarehouseEntryHeaderRepository.insertSelective(header) != 1){
throw new CommonException("error.create_WarehouseEntryHeader", new Object[0]);
}else {
headerAndLineDTO.setHeader(ynjtSpucWarehouseEntryHeaderRepository.selectByPrimaryKey(header.getWarehouseEntryHeaderId()));
return headerAndLineDTO;
}
}
//update
@Override
@Transactional(rollbackFor = Exception.class)
public YnjtSpucWarehouseEntryHeaderAndLineDTO update(YnjtSpucWarehouseEntryHeaderAndLineDTO headerAndLineDTO) {
//处理头信息
YnjtSpucWarehouseEntryHeader header = headerAndLineDTO.getHeader();
SecurityTokenHelper.validToken(header);
if(!WarehouseEntryHeaderConstants.WarehouseEntryStatus.EDITING.equals(header.getWarehouseEntryStatus())){
header.setWarehouseEntryStatus(WarehouseEntryHeaderConstants.WarehouseEntryStatus.EDITING);
}
ynjtSpucWarehouseEntryHeaderRepository.updateByPrimaryKeySelective(header);
//处理物料行信息,有新增有修改
List<YnjtSpucWarehouseEntryLine> itemLines = headerAndLineDTO.getItemLines();
List<YnjtSpucWarehouseEntryLine> itemInsertList = itemLines.stream().filter(e -> null == e.getWarehouseEntryLineId()).collect(Collectors.toList());
List<YnjtSpucWarehouseEntryLine> itemUpdateList = itemLines.stream().filter(e -> null != e.getWarehouseEntryLineId()).collect(Collectors.toList());
ynjtSpucWarehouseEntryLineService.create(itemInsertList);
ynjtSpucWarehouseEntryLineService.update(itemUpdateList);
return headerAndLineDTO;
}
//lineServiceImple
@Override
public List<YnjtSpucWarehousePriceLine> update(List<YnjtSpucWarehousePriceLine> line) {
if(CollectionUtils.isNotEmpty(line)){
line.forEach(e -> {
e.handleAmountAndPrice();
e.handleBalanceProject(ynjtSpucWarehousePriceLineRepository);
});
ynjtSpucWarehousePriceLineRepository.batchUpdateByPrimaryKeySelective(line);
}
return line;
}
//对应到实体类中
public class XXXX{
//....
public void handleBalanceProject(YnjtSpucWarehousePriceLineRepository ynjtSpucWarehousePriceLineRepository){
//逻辑
}
/**
* 根据物资单价、数量和税率,计算不含税金额、含税单价、税额、含税金额 四舍五入保留4位有效数字
*/
public void handleAmountAndPrice(){
//计算逻辑及设置参数set方法
}
//....
}
4、批量删除
//controller
@ApiOperation(value = "删除出库头表")
@Permission(level = ResourceLevel.ORGANIZATION)
@DeleteMapping
public ResponseEntity<?> remove(@RequestBody List<YnjtSpucWarehouseExitHeader> ynjtSpucWarehouseExitHeaders) {
ynjtSpucWarehouseExitHeaderService.remove(ynjtSpucWarehouseExitHeaders);
return Results.success();
}
//service
void remove(List<YnjtSpucWarehouseExitHeader> ynjtSpucWarehouseExitHeaders);
//serviceImpl
@Override
@Transactional(rollbackFor = Exception.class)
public void remove(List<YnjtSpucWarehouseExitHeader> ynjtSpucWarehouseExitHeaders) {
//校验状态是否可删除
List<YnjtSpucWarehouseExitHeader> collect = ynjtSpucWarehouseExitHeaders.stream()
.filter(header -> header.getWarehouseExitStatus().equals(YnjtWarehouseConstants.WarehouseExitStatusCode.WAREHOUSE_EXIT_EDIT))
.collect(Collectors.toList());
if(collect.size()<ynjtSpucWarehouseExitHeaders.size()){
throw new CommonException("error.remove_WarehouseEntryHeader,status_invalid");
}
//批量删除头
ynjtSpucWarehouseExitHeaderRepository.batchDeleteByPrimaryKey(ynjtSpucWarehouseExitHeaders);
//删除所有头对应的行
ynjtSpucWarehouseExitHeaders.stream().forEach(header->{
List<YnjtSpucWarehouseExitLine> ynjtSpucWarehouseExitLines = ynjtSpucWarehouseExitLineRepository.selectByCondition(Condition.builder(YnjtSpucWarehouseExitLine.class)
.andWhere(
Sqls.custom().andEqualTo(YnjtSpucWarehouseExitLine.FIELD_WAREHOUSE_EXIT_HEADER_ID, header.getWarehouseExitHeaderId())
).build());
ynjtSpucWarehouseExitLineRepository.batchDeleteByPrimaryKey(ynjtSpucWarehouseExitLines);
}
);
}