package doumeemes.service.ext.impl; 
 | 
  
 | 
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 
 | 
import doumeemes.core.constants.ResponseStatus; 
 | 
import doumeemes.core.exception.BusinessException; 
 | 
import doumeemes.core.model.LoginUserInfo; 
 | 
import doumeemes.core.model.PageData; 
 | 
import doumeemes.core.model.PageWrap; 
 | 
import doumeemes.core.utils.Constants; 
 | 
import doumeemes.dao.business.WOutboundDetailMapper; 
 | 
import doumeemes.dao.business.WStockMapper; 
 | 
import doumeemes.dao.business.WarehouseMapper; 
 | 
import doumeemes.dao.business.model.*; 
 | 
import doumeemes.dao.ext.WOutboundDetailExtMapper; 
 | 
import doumeemes.dao.ext.dto.QueryWStockRecordExtDTO; 
 | 
import doumeemes.dao.ext.vo.WStockRecordExtListVO; 
 | 
import doumeemes.service.ext.WStockRecordExtService; 
 | 
import doumeemes.dao.ext.WStockRecordExtMapper; 
 | 
import com.github.pagehelper.PageHelper; 
 | 
import com.github.pagehelper.PageInfo; 
 | 
import org.apache.commons.lang3.StringUtils; 
 | 
import org.apache.xpath.operations.String; 
 | 
import org.springframework.beans.factory.annotation.Autowired; 
 | 
import org.springframework.stereotype.Service; 
 | 
import org.springframework.transaction.annotation.Transactional; 
 | 
  
 | 
import java.math.BigDecimal; 
 | 
import java.util.Date; 
 | 
import java.util.List; 
 | 
import java.util.Objects; 
 | 
  
 | 
/** 
 | 
 * 物料库存余额变动记录表ExtService实现 
 | 
 * @author 江蹄蹄 
 | 
 * @date 2022/09/23 14:39 
 | 
 */ 
 | 
@Service 
 | 
public class WStockRecordExtServiceImpl implements WStockRecordExtService { 
 | 
  
 | 
    @Autowired 
 | 
    private WStockRecordExtMapper wStockRecordExtMapper; 
 | 
    @Autowired 
 | 
    private WOutboundDetailMapper wOutboundDetailMapper; 
 | 
    @Autowired 
 | 
    private WarehouseMapper warehouseMapper; 
 | 
    @Autowired 
 | 
    private WStockMapper wStockMapper; 
 | 
  
 | 
    @Override 
 | 
    public void insertWStockRecord(WStockRecord wStockRecord){ 
 | 
        wStockRecordExtMapper.insert(wStockRecord); 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public PageData<WStockRecordExtListVO> findPage(PageWrap<QueryWStockRecordExtDTO> pageWrap) { 
 | 
        PageHelper.startPage(pageWrap.getPage(), pageWrap.getCapacity()); 
 | 
        List<WStockRecordExtListVO> result = wStockRecordExtMapper.selectList(pageWrap.getModel()); 
 | 
        return PageData.from(new PageInfo<>(result)); 
 | 
    } 
 | 
  
 | 
  
 | 
    /** 
 | 
     * 库存变动记录通用类 
 | 
     * @param optType 操作类别:0 - 出库 ;1 入库 
 | 
     * @param detailId 操作行项目主键 
 | 
     */ 
 | 
    @Transactional(rollbackFor = Exception.class) 
 | 
    @Override 
 | 
    public void saveRecord(Integer optType, Integer detailId, LoginUserInfo userInfo){ 
 | 
        WOutboundDetail wOutboundDetail = wOutboundDetailMapper.selectById(detailId); 
 | 
        Warehouse warehouse =warehouseMapper.selectById(wOutboundDetail.getWarehouseId()); 
 | 
        QueryWrapper wrapper = new QueryWrapper<WStock>(); 
 | 
        wrapper.eq("ROOT_DEPART_ID", wOutboundDetail.getRootDepartId()); 
 | 
        wrapper.eq("MATERIAL_ID", wOutboundDetail.getMaterialId()); 
 | 
        wrapper.eq("WAREHOUSE_ID", wOutboundDetail.getWarehouseId()); 
 | 
        wrapper.eq("QUALITY_TYPE", wOutboundDetail.getQualityType()); 
 | 
        wrapper.eq(!Objects.isNull(wOutboundDetail.getProcedureId()),"procedure_id",wOutboundDetail.getProcedureId()); 
 | 
        wrapper.apply(Objects.isNull(wOutboundDetail.getProcedureId())," procedure_id is null "); 
 | 
        if(StringUtils.isNotBlank(wOutboundDetail.getBatch())){ 
 | 
            wrapper.eq("BATCH" , wOutboundDetail.getBatch()); 
 | 
        }else{ 
 | 
            wrapper.apply("BATCH is null "); 
 | 
        } 
 | 
        wrapper.eq(!Objects.isNull(wOutboundDetail.getLocationId())&&warehouse.getUseLocation()==Constants.ONE,"LOCATION_ID", wOutboundDetail.getLocationId()); 
 | 
        wrapper.eq("DELETED",0); 
 | 
        WStock wStock = new WStock(); 
 | 
        List<WStock> wStockList = wStockMapper.selectList(wrapper); 
 | 
        if(optType==Constants.ZERO){ 
 | 
            if(Objects.isNull(wStockList)||wStockList.size()==Constants.ZERO){ 
 | 
                throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "库存信息异常:【" + warehouse.getId() + "】 - 【" + wOutboundDetail.getLocationId() + "】 - 【" + wOutboundDetail.getMaterialId() + "】- 【" + wOutboundDetail.getBatch() + "】"); 
 | 
            }else{ 
 | 
                wStock = wStockList.get(0); 
 | 
            } 
 | 
        }else{ 
 | 
            if(Objects.isNull(wStockList)||wStockList.size()==Constants.ZERO){ 
 | 
                WStock newWStock = new WStock(); 
 | 
                newWStock.setCreateTime(new Date()); 
 | 
                newWStock.setCreateUser(userInfo.getId()); 
 | 
                newWStock.setRootDepartId(wOutboundDetail.getRootDepartId()); 
 | 
                newWStock.setWarehouseId(wOutboundDetail.getWarehouseId()); 
 | 
                newWStock.setQualityType(wOutboundDetail.getQualityType()); 
 | 
                if(!Objects.isNull(wOutboundDetail.getProcedureId())){ 
 | 
                    newWStock.setProcedureId(wOutboundDetail.getProcedureId()); 
 | 
                } 
 | 
                //此仓库 开启仓位 
 | 
                if(warehouse.getUseLocation()==Constants.ONE){ 
 | 
                    newWStock.setLocationId(wOutboundDetail.getLocationId()); 
 | 
                } 
 | 
                newWStock.setMaterialId(wOutboundDetail.getMaterialId()); 
 | 
                newWStock.setBatch(wOutboundDetail.getBatch()); 
 | 
                newWStock.setUnitId(wOutboundDetail.getUnitId()); 
 | 
                newWStock.setNum(BigDecimal.ZERO); 
 | 
                wStockMapper.insert(newWStock); 
 | 
                wStock = newWStock; 
 | 
            }else{ 
 | 
                wStock = wStockList.get(0); 
 | 
            } 
 | 
        } 
 | 
        WStockRecord wStockRecord = new WStockRecord(); 
 | 
        wStockRecord.setId(null); 
 | 
        wStockRecord.setDeleted(wStock.getDeleted()); 
 | 
        wStockRecord.setCreateUser(userInfo.getId()); 
 | 
        wStockRecord.setCreateTime(new Date()); 
 | 
        wStockRecord.setRootDepartId(wStock.getRootDepartId()); 
 | 
        wStockRecord.setDepartId(warehouse.getDepartId()); 
 | 
        wStockRecord.setMaterialId(wStock.getMaterialId()); 
 | 
        wStockRecord.setUnitId(wStock.getUnitId()); 
 | 
        wStockRecord.setLocationId(wStock.getLocationId()); 
 | 
        wStockRecord.setWarehouseId(wStock.getWarehouseId()); 
 | 
        if(StringUtils.isNotBlank(wStock.getBatch())){ 
 | 
            wStockRecord.setBatch(wStock.getBatch()); 
 | 
        } 
 | 
        if(!Objects.isNull(wStock.getProcedureId())){ 
 | 
            wStockRecord.setProcedureId(wStock.getProcedureId()); 
 | 
        } 
 | 
        wStockRecord.setQualityType(wStock.getQualityType()); 
 | 
        wStockRecord.setChangeType(optType); 
 | 
        wStockRecord.setNum(wOutboundDetail.getDoneNum()); 
 | 
        wStockRecord.setBeforNum(wStock.getNum()); 
 | 
        if(optType == Constants.ZERO){ 
 | 
            wStockRecord.setAfterNum(wStock.getNum().subtract(wOutboundDetail.getDoneNum())); 
 | 
        }else{ 
 | 
            wStockRecord.setAfterNum(wStock.getNum().add(wOutboundDetail.getDoneNum())); 
 | 
        } 
 | 
        wStockRecord.setDetailId(detailId); 
 | 
        wStockRecord.setOutboundId(wOutboundDetail.getOutboundId()); 
 | 
        wStockRecord.setWStockId(wStock.getId()); 
 | 
        this.wStockRecordExtMapper.insert(wStockRecord); 
 | 
    } 
 | 
  
 | 
  
 | 
    /** 
 | 
     * 库存变动记录(记录无货位)通用类 
 | 
     * @param optType 操作类别:0 - 出库 ;1 入库 
 | 
     * @param detailId 操作行项目主键 
 | 
     */ 
 | 
    @Transactional(rollbackFor = Exception.class) 
 | 
    @Override 
 | 
    public void saveRecordNoLocationId(Integer optType, Integer detailId, LoginUserInfo userInfo,Integer locationId){ 
 | 
        WOutboundDetail wOutboundDetail = wOutboundDetailMapper.selectById(detailId); 
 | 
        Warehouse warehouse =warehouseMapper.selectById(wOutboundDetail.getWarehouseId()); 
 | 
        QueryWrapper wrapper = new QueryWrapper<WStock>(); 
 | 
        wrapper.eq("ROOT_DEPART_ID", wOutboundDetail.getRootDepartId()); 
 | 
        wrapper.eq("MATERIAL_ID", wOutboundDetail.getMaterialId()); 
 | 
        wrapper.eq("WAREHOUSE_ID", wOutboundDetail.getWarehouseId()); 
 | 
        wrapper.eq("QUALITY_TYPE", wOutboundDetail.getQualityType()); 
 | 
        wrapper.eq(!Objects.isNull(wOutboundDetail.getProcedureId()),"procedure_id",wOutboundDetail.getProcedureId()); 
 | 
        wrapper.apply(Objects.isNull(wOutboundDetail.getProcedureId())," procedure_id is null "); 
 | 
        if(StringUtils.isNotBlank(wOutboundDetail.getBatch())){ 
 | 
            wrapper.eq("BATCH" , wOutboundDetail.getBatch()); 
 | 
        }else{ 
 | 
            wrapper.apply("BATCH is null "); 
 | 
        } 
 | 
        wrapper.eq(!Objects.isNull(locationId)&&warehouse.getUseLocation()==Constants.ONE,"LOCATION_ID", locationId); 
 | 
        wrapper.eq("DELETED",0); 
 | 
        WStock wStock = new WStock(); 
 | 
        List<WStock> wStockList = wStockMapper.selectList(wrapper); 
 | 
        if(optType==Constants.ZERO){ 
 | 
            if(Objects.isNull(wStockList)||wStockList.size()==Constants.ZERO){ 
 | 
                throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "库存信息异常:【" + warehouse.getId() + "】 - 【" + locationId + "】 - 【" + wOutboundDetail.getMaterialId() + "】- 【" + wOutboundDetail.getBatch() + "】"); 
 | 
            }else{ 
 | 
                wStock = wStockList.get(0); 
 | 
            } 
 | 
        }else{ 
 | 
            if(Objects.isNull(wStockList)||wStockList.size()==Constants.ZERO){ 
 | 
                WStock newWStock = new WStock(); 
 | 
                newWStock.setCreateTime(new Date()); 
 | 
                newWStock.setCreateUser(userInfo.getId()); 
 | 
                newWStock.setRootDepartId(wOutboundDetail.getRootDepartId()); 
 | 
                newWStock.setWarehouseId(wOutboundDetail.getWarehouseId()); 
 | 
                newWStock.setQualityType(wOutboundDetail.getQualityType()); 
 | 
                if(!Objects.isNull(wOutboundDetail.getProcedureId())){ 
 | 
                    newWStock.setProcedureId(wOutboundDetail.getProcedureId()); 
 | 
                } 
 | 
                //此仓库 开启仓位 
 | 
                if(warehouse.getUseLocation()==Constants.ONE){ 
 | 
                    newWStock.setLocationId(locationId); 
 | 
                } 
 | 
                newWStock.setMaterialId(wOutboundDetail.getMaterialId()); 
 | 
                newWStock.setBatch(wOutboundDetail.getBatch()); 
 | 
                newWStock.setUnitId(wOutboundDetail.getUnitId()); 
 | 
                newWStock.setNum(BigDecimal.ZERO); 
 | 
                wStockMapper.insert(newWStock); 
 | 
                wStock = newWStock; 
 | 
            }else{ 
 | 
                wStock = wStockList.get(0); 
 | 
            } 
 | 
        } 
 | 
        WStockRecord wStockRecord = new WStockRecord(); 
 | 
        wStockRecord.setId(null); 
 | 
        wStockRecord.setDeleted(wStock.getDeleted()); 
 | 
        wStockRecord.setCreateUser(userInfo.getId()); 
 | 
        wStockRecord.setCreateTime(new Date()); 
 | 
        wStockRecord.setRootDepartId(wStock.getRootDepartId()); 
 | 
        wStockRecord.setDepartId(warehouse.getDepartId()); 
 | 
        wStockRecord.setMaterialId(wStock.getMaterialId()); 
 | 
        wStockRecord.setUnitId(wStock.getUnitId()); 
 | 
        wStockRecord.setLocationId(wStock.getLocationId()); 
 | 
        wStockRecord.setWarehouseId(wStock.getWarehouseId()); 
 | 
        if(StringUtils.isNotBlank(wStock.getBatch())){ 
 | 
            wStockRecord.setBatch(wStock.getBatch()); 
 | 
        } 
 | 
        if(!Objects.isNull(wStock.getProcedureId())){ 
 | 
            wStockRecord.setProcedureId(wStock.getProcedureId()); 
 | 
        } 
 | 
        wStockRecord.setQualityType(wStock.getQualityType()); 
 | 
        wStockRecord.setChangeType(optType); 
 | 
        wStockRecord.setNum(wOutboundDetail.getNum()); 
 | 
        wStockRecord.setBeforNum(wStock.getNum()); 
 | 
        if(optType == Constants.ZERO){ 
 | 
            wStockRecord.setAfterNum(wStock.getNum().subtract(wOutboundDetail.getDoneNum())); 
 | 
        }else{ 
 | 
            wStockRecord.setAfterNum(wStock.getNum().add(wOutboundDetail.getDoneNum())); 
 | 
        } 
 | 
        wStockRecord.setDetailId(detailId); 
 | 
        wStockRecord.setOutboundId(wOutboundDetail.getOutboundId()); 
 | 
        wStockRecord.setWStockId(wStock.getId()); 
 | 
        this.wStockRecordExtMapper.insert(wStockRecord); 
 | 
    } 
 | 
} 
 |