头行结构数据的增删改查

总结

数据库中的主键都是系统生成的(某种算法或系统自增等)。而头行结构中,行数据需要保存所属头数据的字段(行数据保存头ID)。

  1. 新建
    头行结构保存时,先保存头数据,头数据的id 系统自动生成,
    根据订单编号,再次查询头数据
    遍历每一行数据,设置行数据中的headerId为头数据的headerId
    保存行数据

  2. 修改
    前台对行数据做出修改(修改、新增、删除),后端进行更新
    对每一行数据设置一个相应的状态
    传入后台的是状态码+订单编号
    判断状态码,根据订单编号进行操作。

  3. 其他逻辑
    后台可以根据传入数据的id进行判断,没有id就是新增,有id就是修改
    一些场景中,前台可以做成多选框,只传入后台需要的数据.

1、接口分析

从增删改查的角度来看,只需要以下六个接口即可完成CRUD。
其中接口1、4都需要做成分页查询;接口2根据传入的数据(头行)进行判断:创建(头id为null),修改(头id不为null);5和6做成批量删除

  1. 头表汇总查询
  2. 创建头/修改头行
  3. 详情页——头信息查询
  4. 详情页——根据头id查询行信息
  5. 批量删除头
  6. 批量删除行

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);
            }
    );
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值