|
|
|
@ -4,10 +4,16 @@ import com.gaotao.modules.boxManage.dao.BoxForNotificationMapper; |
|
|
|
import com.gaotao.modules.boxManage.data.SoReceiveBoxRollsData; |
|
|
|
import com.gaotao.modules.boxManage.data.SoReceiveBoxesData; |
|
|
|
import com.gaotao.modules.boxManage.service.BoxForNotificationService; |
|
|
|
import com.gaotao.modules.outboundNotification.entity.OutboundNotificationDetailEntity; |
|
|
|
import com.gaotao.modules.sys.entity.SysUserEntity; |
|
|
|
import com.gaotao.modules.trans.entity.TransNoControl; |
|
|
|
import com.gaotao.modules.trans.service.TransNoControlService; |
|
|
|
import com.gaotao.modules.inventoryStock.dao.InventoryStockMapper; |
|
|
|
import com.gaotao.modules.inventoryStock.entity.InventoryStock; |
|
|
|
import org.apache.shiro.SecurityUtils; |
|
|
|
import org.springframework.beans.factory.annotation.Autowired; |
|
|
|
import org.springframework.stereotype.Service; |
|
|
|
import org.springframework.transaction.annotation.Transactional; |
|
|
|
|
|
|
|
import java.util.List; |
|
|
|
|
|
|
|
@ -43,4 +49,159 @@ public class BoxForNotificationServiceImpl implements BoxForNotificationService |
|
|
|
public SoReceiveBoxesData searchBoxData(SoReceiveBoxesData data){ |
|
|
|
return boxForNotificationMapper.searchBoxData(data); |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public void deleteSoReceiveBoxesData(SoReceiveBoxesData data){ |
|
|
|
List<SoReceiveBoxRollsData> checkData=boxForNotificationMapper.searchBoxRollDetail(data); |
|
|
|
if(!checkData.isEmpty()){ |
|
|
|
throw new RuntimeException("箱内有卷无法删除!"); |
|
|
|
} |
|
|
|
boxForNotificationMapper.deleteSoReceiveBoxesData(data); |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public void updateBoxStatus(SoReceiveBoxesData data){ |
|
|
|
if(data.getFlag()==0){ |
|
|
|
//0是封箱 |
|
|
|
SoReceiveBoxesData checkBox=boxForNotificationMapper.searchBoxData(data); |
|
|
|
if(checkBox==null){ |
|
|
|
throw new RuntimeException("箱号不存在!"); |
|
|
|
} |
|
|
|
if(!checkBox.getStatus().equals("未封箱")){ |
|
|
|
throw new RuntimeException("只有状态为未封箱的箱子可以封箱!"); |
|
|
|
} |
|
|
|
//0是封箱 |
|
|
|
List<SoReceiveBoxRollsData> checkData=boxForNotificationMapper.searchBoxRollDetail(data); |
|
|
|
if(checkData.isEmpty()){ |
|
|
|
throw new RuntimeException("箱内没有卷无法封箱!"); |
|
|
|
} |
|
|
|
data.setStatus("封箱"); |
|
|
|
boxForNotificationMapper.updateBoxStatus(data); |
|
|
|
} |
|
|
|
if(data.getFlag()==1){ |
|
|
|
//1是拆箱 |
|
|
|
SoReceiveBoxesData checkBox=boxForNotificationMapper.searchBoxData(data); |
|
|
|
if(checkBox==null){ |
|
|
|
throw new RuntimeException("箱号不存在!"); |
|
|
|
} |
|
|
|
if(!checkBox.getStatus().equals("已封箱")){ |
|
|
|
throw new RuntimeException("只有状态为已封箱的箱子可以拆箱!"); |
|
|
|
} |
|
|
|
data.setStatus("未封箱"); |
|
|
|
boxForNotificationMapper.updateBoxStatus(data); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
@Transactional |
|
|
|
public void scanBoxRoll(SoReceiveBoxRollsData data){ |
|
|
|
// 参数校验 |
|
|
|
if(data == null || data.getSite() == null || data.getBuNo() == null || data.getBoxNo() == null || data.getFinalRollNo() == null) { |
|
|
|
throw new RuntimeException("参数不完整"); |
|
|
|
} |
|
|
|
// 1. 查箱子状态 |
|
|
|
SoReceiveBoxesData boxQuery = new SoReceiveBoxesData(); |
|
|
|
boxQuery.setSite(data.getSite()); |
|
|
|
boxQuery.setBuNo(data.getBuNo()); |
|
|
|
boxQuery.setBoxNo(data.getBoxNo()); |
|
|
|
SoReceiveBoxesData box = searchBoxData(boxQuery); |
|
|
|
if(box == null) { |
|
|
|
throw new RuntimeException("箱号不存在"); |
|
|
|
} |
|
|
|
if(!"未封箱".equals(box.getStatus()) ) { |
|
|
|
throw new RuntimeException("只有状态为未封箱的箱子可以操作"); |
|
|
|
} |
|
|
|
if(!"Y".equals(box.getcInStockFlag())) { |
|
|
|
throw new RuntimeException("箱子不在仓库中,无法操作"); |
|
|
|
} |
|
|
|
// 2. 查卷状态 |
|
|
|
InventoryStock stock = boxForNotificationMapper.selectByRollNo( |
|
|
|
data.getFinalRollNo(), data.getSite(), data.getBuNo()); |
|
|
|
if(stock == null) { |
|
|
|
throw new RuntimeException("卷不存在"); |
|
|
|
} |
|
|
|
if(!"在库".equals(stock.getStatus())) { |
|
|
|
throw new RuntimeException("卷状态不是在库,无法操作"); |
|
|
|
} |
|
|
|
|
|
|
|
// 添加检查逻辑:检查卷是否已经在其他箱子里 |
|
|
|
if (stock.getParentRollNo() != null && stock.getParentRollNo().startsWith("BOX")) { |
|
|
|
throw new RuntimeException("卷已经在箱子:" + stock.getParentRollNo() + "中,请先取出"); |
|
|
|
} |
|
|
|
List<OutboundNotificationDetailEntity> checkPartNo=boxForNotificationMapper.searchOutboundNotificationDetail(box.getSite(),box.getBuNo(),box.getOrderNo()); |
|
|
|
// 添加校验逻辑:检查checkPartNo中是否至少有一行记录的partNo与卷的partNo相同 |
|
|
|
boolean partNoMatch = checkPartNo.stream() |
|
|
|
.anyMatch(detail -> detail.getPartNo() != null && detail.getPartNo().equals(stock.getPartNo())); |
|
|
|
|
|
|
|
if (!partNoMatch) { |
|
|
|
throw new RuntimeException("该卷的物料编号与销售发货单中的物料编号不匹配"); |
|
|
|
} |
|
|
|
// 检查箱的仓库是否为空,如果为空则更新为卷的仓库,如果不为空则检查是否一致 |
|
|
|
if(box.getWareHouseID()==null||"".equals(box.getWareHouseID())){ |
|
|
|
boxForNotificationMapper.updateBoxWareHouse(data.getSite(),data.getBuNo(),data.getBoxNo(),stock.getWarehouseId()); |
|
|
|
}else if(!box.getWareHouseID().equals(stock.getWarehouseId())){ |
|
|
|
throw new RuntimeException("该卷的仓库与箱的仓库不一致"); |
|
|
|
} |
|
|
|
//改卷上级标签 |
|
|
|
boxForNotificationMapper.updateStockParentRollNo(data.getFinalRollNo(), data.getBoxNo(), data.getSite(), data.getBuNo()); |
|
|
|
SysUserEntity currentUser = (SysUserEntity) SecurityUtils.getSubject().getPrincipal(); |
|
|
|
data.setRollQty(stock.getQtyOnHand()); |
|
|
|
data.setReceivedBy(currentUser.getUsername()); |
|
|
|
data.setWareHouseID(stock.getWarehouseId()); |
|
|
|
data.setPartNo(stock.getPartNo()); |
|
|
|
// 3. 添加卷到箱子 |
|
|
|
boxForNotificationMapper.addBoxRoll(data); |
|
|
|
boxForNotificationMapper.updateBoxRollQty(data.getSite(),data.getBuNo(),data.getBoxNo()); |
|
|
|
|
|
|
|
} |
|
|
|
@Override |
|
|
|
@Transactional |
|
|
|
public void deleteBoxRoll(SoReceiveBoxRollsData data) { |
|
|
|
// 参数校验 |
|
|
|
if(data == null || data.getSite() == null || data.getBuNo() == null || data.getBoxNo() == null || data.getFinalRollNo() == null) { |
|
|
|
throw new RuntimeException("参数不完整"); |
|
|
|
} |
|
|
|
// 1. 查箱子状态 |
|
|
|
SoReceiveBoxesData boxQuery = new SoReceiveBoxesData(); |
|
|
|
boxQuery.setSite(data.getSite()); |
|
|
|
boxQuery.setBuNo(data.getBuNo()); |
|
|
|
boxQuery.setBoxNo(data.getBoxNo()); |
|
|
|
SoReceiveBoxesData box = searchBoxData(boxQuery); |
|
|
|
if(box == null) { |
|
|
|
throw new RuntimeException("箱号不存在"); |
|
|
|
} |
|
|
|
if(!"未封箱".equals(box.getStatus()) ) { |
|
|
|
throw new RuntimeException("只有状态为未封箱的箱子可以删除卷"); |
|
|
|
} |
|
|
|
if(!"Y".equals(box.getcInStockFlag())) { |
|
|
|
throw new RuntimeException("箱子不在仓库中,无法操作"); |
|
|
|
} |
|
|
|
// 2. 查卷状态 |
|
|
|
InventoryStock stock = boxForNotificationMapper.selectByRollNo( |
|
|
|
data.getFinalRollNo(), data.getSite(), data.getBuNo()); |
|
|
|
if(stock == null) { |
|
|
|
throw new RuntimeException("卷不存在"); |
|
|
|
} |
|
|
|
if(!"在库".equals(stock.getStatus())) { |
|
|
|
throw new RuntimeException("卷状态不是在库,无法操作"); |
|
|
|
} |
|
|
|
// 检查卷是否在该箱内 |
|
|
|
List<SoReceiveBoxRollsData> boxRolls = boxForNotificationMapper.searchBoxRollDetail(boxQuery); |
|
|
|
boolean rollInBox = boxRolls.stream() |
|
|
|
.anyMatch(roll -> roll.getFinalRollNo() != null && roll.getFinalRollNo().equals(data.getFinalRollNo())); |
|
|
|
if (!rollInBox) { |
|
|
|
throw new RuntimeException("该卷不在指定的箱子内,无法删除"); |
|
|
|
} |
|
|
|
|
|
|
|
// 3. 删除卷的上级标签 |
|
|
|
boxForNotificationMapper.updateStockParentRollNo(data.getFinalRollNo(), null, data.getSite(), data.getBuNo()); |
|
|
|
// 4. 删除箱子中的卷记录 |
|
|
|
boxForNotificationMapper.deleteBoxRoll(data); |
|
|
|
boxForNotificationMapper.updateBoxRollQty(data.getSite(),data.getBuNo(),data.getBoxNo()); |
|
|
|
// 5. 如果箱里面没有卷了,清空箱的仓库 |
|
|
|
if(box.getRollsQty()==1){ |
|
|
|
//box是删除之前查出来的状态 所以如果是1 那么删除后没卷了 |
|
|
|
boxForNotificationMapper.updateBoxWareHouse(data.getSite(),data.getBuNo(),data.getBoxNo(),null); |
|
|
|
} |
|
|
|
} |
|
|
|
} |