From 77c4d810a14d160c228cac8472a58efd068350cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B8=B8=E7=86=9F=E5=90=B4=E5=BD=A6=E7=A5=96?= Date: Wed, 3 Sep 2025 14:21:24 +0800 Subject: [PATCH] =?UTF-8?q?=E7=94=9F=E4=BA=A7=E8=AE=A2=E5=8D=95=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BoxForNotificationController.java | 41 +++++ .../dao/BoxForNotificationMapper.java | 19 +++ .../boxManage/data/SoReceiveBoxesData.java | 2 +- .../service/BoxForNotificationService.java | 8 + .../impl/BoxForNotificationServiceImpl.java | 161 ++++++++++++++++++ .../boxManage/BoxForNotificationMapper.xml | 59 +++++++ 6 files changed, 289 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/gaotao/modules/boxManage/controller/BoxForNotificationController.java b/src/main/java/com/gaotao/modules/boxManage/controller/BoxForNotificationController.java index 32b4ba6..7a73060 100644 --- a/src/main/java/com/gaotao/modules/boxManage/controller/BoxForNotificationController.java +++ b/src/main/java/com/gaotao/modules/boxManage/controller/BoxForNotificationController.java @@ -58,4 +58,45 @@ public class BoxForNotificationController { SoReceiveBoxesData row = srmSupplierService.searchBoxData(data); return R.ok().put("rows", rows).put("row", row); } + + @PostMapping(value="/deleteSoReceiveBoxesData") + @ResponseBody + public R deleteSoReceiveBoxesData(@RequestBody SoReceiveBoxesData data) { + srmSupplierService.deleteSoReceiveBoxesData(data); + return R.ok(); + } + @PostMapping(value="/updateBoxStatus") + @ResponseBody + public R updateBoxStatus(@RequestBody SoReceiveBoxesData data) { + srmSupplierService.updateBoxStatus(data); + return R.ok(); + } + + /** + * + * @description 扫描卷 + * @author 常熟吴彦祖 + * @date 2025/9/2 17:38 + * @return R + */ + @PostMapping(value="/scanBoxRoll") + @ResponseBody + public R scanBoxRoll(@RequestBody SoReceiveBoxRollsData data) { + srmSupplierService.scanBoxRoll(data); + return R.ok(); + } + /** + * + * @description 删除卷 + * @author 常熟吴彦祖 + * @date 2025/9/2 17:38 + * @return R + */ + @PostMapping(value="/deleteBoxRoll") + @ResponseBody + public R deleteBoxRoll(@RequestBody SoReceiveBoxRollsData data) { + srmSupplierService.deleteBoxRoll(data); + return R.ok(); + } + } diff --git a/src/main/java/com/gaotao/modules/boxManage/dao/BoxForNotificationMapper.java b/src/main/java/com/gaotao/modules/boxManage/dao/BoxForNotificationMapper.java index d79dd46..f3c2aec 100644 --- a/src/main/java/com/gaotao/modules/boxManage/dao/BoxForNotificationMapper.java +++ b/src/main/java/com/gaotao/modules/boxManage/dao/BoxForNotificationMapper.java @@ -2,7 +2,10 @@ package com.gaotao.modules.boxManage.dao; import com.gaotao.modules.boxManage.data.SoReceiveBoxRollsData; import com.gaotao.modules.boxManage.data.SoReceiveBoxesData; +import com.gaotao.modules.inventoryStock.entity.InventoryStock; +import com.gaotao.modules.outboundNotification.entity.OutboundNotificationDetailEntity; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -16,4 +19,20 @@ public interface BoxForNotificationMapper { List searchBoxRollDetail(SoReceiveBoxesData data); SoReceiveBoxesData searchBoxData(SoReceiveBoxesData data); + + void deleteSoReceiveBoxesData(SoReceiveBoxesData data); + + void updateBoxStatus(SoReceiveBoxesData data); + + InventoryStock selectByRollNo(@Param("rollNo") String rollNo, + @Param("site") String site, + @Param("buNo") String buNo); + + void updateStockParentRollNo(@Param("rollNo") String rollNo,@Param("parentRollNo")String parentRollNo,@Param("site")String site,@Param("buNo")String buNo); + + void addBoxRoll(SoReceiveBoxRollsData data); + void updateBoxRollQty(@Param("site") String site,@Param("buNo") String buNo,@Param("boxNo") String boxNo); + List searchOutboundNotificationDetail( @Param("site") String site, @Param("buNo") String buNo, @Param("orderNo") String orderNo); + void updateBoxWareHouse( @Param("site") String site, @Param("buNo") String buNo, @Param("boxNo") String boxNo, @Param("warehouseId") String warehouseId); + void deleteBoxRoll( SoReceiveBoxRollsData inData); } diff --git a/src/main/java/com/gaotao/modules/boxManage/data/SoReceiveBoxesData.java b/src/main/java/com/gaotao/modules/boxManage/data/SoReceiveBoxesData.java index 1c565c0..42afc32 100644 --- a/src/main/java/com/gaotao/modules/boxManage/data/SoReceiveBoxesData.java +++ b/src/main/java/com/gaotao/modules/boxManage/data/SoReceiveBoxesData.java @@ -8,5 +8,5 @@ import org.apache.ibatis.type.Alias; @Alias("SoReceiveBoxesData") public class SoReceiveBoxesData extends SoReceiveBoxesDto { private String wareHouseName; - + private Integer flag; } diff --git a/src/main/java/com/gaotao/modules/boxManage/service/BoxForNotificationService.java b/src/main/java/com/gaotao/modules/boxManage/service/BoxForNotificationService.java index f455011..6c42225 100644 --- a/src/main/java/com/gaotao/modules/boxManage/service/BoxForNotificationService.java +++ b/src/main/java/com/gaotao/modules/boxManage/service/BoxForNotificationService.java @@ -12,4 +12,12 @@ public interface BoxForNotificationService { List searchBoxRollDetail(SoReceiveBoxesData data); SoReceiveBoxesData searchBoxData(SoReceiveBoxesData data); + + void deleteSoReceiveBoxesData(SoReceiveBoxesData data); + + void updateBoxStatus(SoReceiveBoxesData data); + + void scanBoxRoll(SoReceiveBoxRollsData data); + + void deleteBoxRoll(SoReceiveBoxRollsData data); } diff --git a/src/main/java/com/gaotao/modules/boxManage/service/impl/BoxForNotificationServiceImpl.java b/src/main/java/com/gaotao/modules/boxManage/service/impl/BoxForNotificationServiceImpl.java index 978aea0..7cf2521 100644 --- a/src/main/java/com/gaotao/modules/boxManage/service/impl/BoxForNotificationServiceImpl.java +++ b/src/main/java/com/gaotao/modules/boxManage/service/impl/BoxForNotificationServiceImpl.java @@ -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 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 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 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 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); + } + } } diff --git a/src/main/resources/mapper/boxManage/BoxForNotificationMapper.xml b/src/main/resources/mapper/boxManage/BoxForNotificationMapper.xml index 5b73c32..106015d 100644 --- a/src/main/resources/mapper/boxManage/BoxForNotificationMapper.xml +++ b/src/main/resources/mapper/boxManage/BoxForNotificationMapper.xml @@ -60,5 +60,64 @@ from so_receive_boxes a where a.site= #{site} and a.box_no= #{boxNo} and a.bu_no= #{buNo} + + delete from so_receive_boxes + where id=#{id} + + + update so_receive_boxes + set [status]=#{status} + where id=#{id} + + + + + UPDATE inventory_stock + SET parent_roll_no = #{parentRollNo} + WHERE roll_no = #{rollNo} + AND site = #{site} + AND bu_no = #{buNo} + + + insert into so_receive_box_rolls(site,box_no,final_roll_no,roll_qty,received_by,received_date,WareHouseID,part_no,bu_no) + values(#{site},#{boxNo},#{finalRollNo},#{rollQty},#{receivedBy},GetDate(),#{wareHouseID},#{partNo},#{buNo}) + + + + update so_receive_boxes + set rolls_qty =isnull((select count(1) from so_receive_box_rolls where box_no = #{boxNo} and site=#{site} and bu_no= #{buNo}),0) + where site = #{site} + and box_no = #{boxNo} + and bu_no = #{buNo} + + + + + + update so_receive_boxes + set WareHouseID = #{warehouseId} + where site = #{site} + and box_no = #{boxNo} + and bu_no = #{buNo} + + + + delete from so_receive_box_rolls + where site = #{site} + and box_no = #{boxNo} + and bu_no = #{buNo} + and final_roll_no = #{finalRollNo} + \ No newline at end of file