package com.chinaztt.mes.warehouse.service.impl; import cn.hutool.core.collection.CollectionUtil; import com.baomidou.mybatisplus.core.injector.methods.DeleteById; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.toolkit.SqlHelper; import com.chinaztt.mes.warehouse.entity.ReverseStockApply; import com.chinaztt.mes.warehouse.entity.ReverseStockApplyDetail; import com.chinaztt.mes.warehouse.entity.Stock; import com.chinaztt.mes.warehouse.mapper.ReverseStockApplyDetailMapper; import com.chinaztt.mes.warehouse.mapper.ReverseStockApplyMapper; import com.chinaztt.mes.warehouse.mapper.StockMapper; import com.chinaztt.mes.warehouse.service.ReverseStockApplyDetailService; import com.chinaztt.mes.warehouse.state.constant.ReverseApplyState; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; /** * @Author: Zero * @Date: 2022/9/19 13:47 * @Description: */ @Service @Transactional(rollbackFor = Exception.class) public class ReverseStockApplyDetailServiceImpl extends ServiceImpl implements ReverseStockApplyDetailService { @Autowired private ReverseStockApplyDetailMapper reverseStockApplyDetailMapper; @Autowired private StockMapper stockMapper; @Autowired private ReverseStockApplyMapper reverseStockApplyMapper; @Override public Boolean insertApplyDetail(List applyDetailList) { applyDetailList.forEach(applyDetail -> applyDetail.setState(ReverseApplyState.NEW.getCode())); return saveBatch(applyDetailList); } @Override public Boolean updateApplyDetail(ReverseStockApplyDetail applyDetail) { Stock stock = stockMapper.selectById(applyDetail.getStockId()); if (stock.getAvailableStockQuantity().compareTo(applyDetail.getReverseQuantity()) < 0) { throw new RuntimeException("退料数量不能大于剩余可用库存数量"); } return updateById(applyDetail); } @Override public Boolean batchUpdateDetail(List applyDetailList) { return updateBatchById(applyDetailList); } @Override public List getLockStockIds() { return reverseStockApplyDetailMapper.getLockStockIds(ReverseApplyState.NEW.getCode()); } @Override public String deleteApplyDetail(Long id) { ReverseStockApplyDetail applyDetail = getById(id); if (!StringUtils.equals(ReverseApplyState.NEW.getCode(), applyDetail.getState())) { throw new RuntimeException("只能删除新建状态的退料详情"); } reverseStockApplyDetailMapper.deleteById(id); List applyDetailList = reverseStockApplyDetailMapper.selectList(Wrappers.lambdaQuery() .eq(ReverseStockApplyDetail::getReverseApplyId, applyDetail.getReverseApplyId())); long newStateDetailCount = applyDetailList.stream().filter(d -> StringUtils.equals(ReverseApplyState.NEW.getCode(), d.getState())).count(); String state = ReverseApplyState.DRAFT.getCode(); // 当前申请单下仍然有退料详情 if (CollectionUtil.isNotEmpty(applyDetailList)) { // 有退料详情,无新建状态详情,说明全部都为已执行 if (newStateDetailCount == 0) { state = ReverseApplyState.PROCESSED.getCode(); }else if (newStateDetailCount < applyDetailList.size()) { // 退料详情新建条数小于总条数,说明此时已执行和新建状态详情都有,则主表为执行中 state = ReverseApplyState.PROCESSING.getCode(); } } reverseStockApplyMapper.update(null, Wrappers.lambdaUpdate().eq(ReverseStockApply::getId, applyDetail.getReverseApplyId()).set(ReverseStockApply::getState, state)); return state; } }