| 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); | 
|     } | 
| } |