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 70fcdb5..1d59173 100644 --- a/src/main/java/com/gaotao/modules/boxManage/controller/BoxForNotificationController.java +++ b/src/main/java/com/gaotao/modules/boxManage/controller/BoxForNotificationController.java @@ -4,12 +4,15 @@ import com.gaotao.common.utils.R; import com.gaotao.modules.boxManage.data.SoReceiveBoxRollsData; import com.gaotao.modules.boxManage.data.SoReceiveBoxesData; import com.gaotao.modules.boxManage.data.SoReceiveCasesData; +import com.gaotao.modules.boxManage.data.SoReceivePalletBoxesData; +import com.gaotao.modules.boxManage.data.SoReceivePalletsData; import com.gaotao.modules.boxManage.service.BoxForNotificationService; import com.gaotao.modules.outboundNotification.entity.vo.OutboundNotificationHeadVo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.List; +import java.util.Map; @RestController @RequestMapping("/boxForNotification") @@ -184,4 +187,103 @@ public class BoxForNotificationController { srmSupplierService.updateOrderStatus(data); return R.ok(); } + + // ==================== 托清单相关API ==================== + + /** + * 查询托清单列表 + * @param data 查询条件 + * @return R + */ + @PostMapping(value="/searchPalletList") + @ResponseBody + public R searchPalletList(@RequestBody SoReceivePalletsData data) { + List rows = srmSupplierService.searchSoReceivePalletsData(data); + return R.ok().put("rows", rows); + } + + /** + * 新增托 + * @param data 托数据 + * @return R + */ + @PostMapping(value="/newPallet") + @ResponseBody + public R newPallet(@RequestBody SoReceivePalletsData data) { + String palletNo = srmSupplierService.newSoReceivePalletsData(data); + return R.ok().put("palletNo", palletNo); + } + + /** + * 查询托明细 + * @param data 查询条件 + * @return R + */ + @PostMapping(value="/searchPalletDetail") + @ResponseBody + public R searchPalletDetail(@RequestBody SoReceivePalletsData data) { + List rows = srmSupplierService.searchPalletBoxDetail(data); + SoReceivePalletsData row = srmSupplierService.searchPalletData(data); + return R.ok().put("rows", rows).put("row", row); + } + + /** + * 删除托 + * @param data 托数据 + * @return R + */ + @PostMapping(value="/deletePallet") + @ResponseBody + public R deletePallet(@RequestBody SoReceivePalletsData data) { + srmSupplierService.deleteSoReceivePalletsData(data); + return R.ok(); + } + + /** + * 更新托状态(封托/拆托) + * @param data 托数据 + * @return R + */ + @PostMapping(value="/updatePalletStatus") + @ResponseBody + public R updatePalletStatus(@RequestBody SoReceivePalletsData data) { + srmSupplierService.updatePalletStatus(data); + return R.ok(); + } + + /** + * 扫描装托(扫描箱号) + * @param params 包含托箱明细信息 + * @return R + */ + @PostMapping(value="/scanPalletBox") + @ResponseBody + public R scanPalletBox(@RequestBody Map params) { + try { + SoReceivePalletBoxesData data = new SoReceivePalletBoxesData(); + data.setSite((String) params.get("site")); + data.setBuNo((String) params.get("buNo")); + data.setPalletNo((String) params.get("palletNo")); + data.setBoxNo((String) params.get("boxNo")); + data.setReceivedBy((String) params.get("receivedBy")); + data.setBoxesQty(1); // 默认为1 + + srmSupplierService.scanPalletBox(data); + return R.ok().put("code", 0).put("msg", "装托成功"); + } catch (Exception e) { + return R.error(e.getMessage()); + } + } + + /** + * 删除托中的箱 + * @param data 托箱明细数据 + * @return R + */ + @PostMapping(value="/deletePalletBox") + @ResponseBody + public R deletePalletBox(@RequestBody SoReceivePalletBoxesData data) { + srmSupplierService.deletePalletBox(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 dd79b9d..870627a 100644 --- a/src/main/java/com/gaotao/modules/boxManage/dao/BoxForNotificationMapper.java +++ b/src/main/java/com/gaotao/modules/boxManage/dao/BoxForNotificationMapper.java @@ -3,6 +3,8 @@ package com.gaotao.modules.boxManage.dao; import com.gaotao.modules.boxManage.data.SoReceiveBoxRollsData; import com.gaotao.modules.boxManage.data.SoReceiveBoxesData; import com.gaotao.modules.boxManage.data.SoReceiveCasesData; +import com.gaotao.modules.boxManage.data.SoReceivePalletBoxesData; +import com.gaotao.modules.boxManage.data.SoReceivePalletsData; import com.gaotao.modules.inventoryStock.entity.InventoryStock; import com.gaotao.modules.outboundNotification.entity.OutboundNotificationDetailEntity; import com.gaotao.modules.outboundNotification.entity.vo.OutboundNotificationHeadVo; @@ -66,4 +68,88 @@ public interface BoxForNotificationMapper { * @param orderStatus 订单状态 */ void updateOrderStatus(@Param("site") String site, @Param("buNo") String buNo, @Param("orderNo") String orderNo, @Param("orderStatus") String orderStatus); + + // ==================== 托清单相关方法 ==================== + + /** + * 查询托清单列表 + * @param data 查询条件 + * @return 托清单列表 + */ + List searchSoReceivePalletsData(SoReceivePalletsData data); + + /** + * 新增托 + * @param data 托数据 + */ + void newSoReceivePalletsData(SoReceivePalletsData data); + + /** + * 查询托明细列表 + * @param data 查询条件 + * @return 托明细列表 + */ + List searchPalletBoxDetail(SoReceivePalletsData data); + + /** + * 查询托数据 + * @param data 查询条件 + * @return 托数据 + */ + SoReceivePalletsData searchPalletData(SoReceivePalletsData data); + + /** + * 删除托 + * @param data 托数据 + */ + void deleteSoReceivePalletsData(SoReceivePalletsData data); + + /** + * 更新托状态 + * @param data 托数据 + */ + void updatePalletStatus(SoReceivePalletsData data); + + /** + * 根据箱号查询箱信息(用于装托扫描) + * @param data 箱数据 + * @return 箱信息 + */ + SoReceiveBoxesData selectBoxByBoxNo(SoReceiveBoxesData data); + + /** + * 装托:添加箱到托 + * @param data 托箱明细数据 + */ + void addBoxToPallet(SoReceivePalletBoxesData data); + + /** + * 拆托:从托中删除箱 + * @param data 托箱明细数据 + */ + void deleteBoxFromPallet(SoReceivePalletBoxesData data); + + /** + * 更新托的箱数量 + * @param data 托数据 + */ + void updatePalletBoxesQty(SoReceivePalletsData data); + + /** + * 检查箱是否在托中 + * @param site 站点 + * @param buNo BU号 + * @param boxNo 箱号 + * @return 托箱明细列表 + */ + List checkBoxInPallet(@Param("site") String site, @Param("buNo") String buNo, @Param("boxNo") String boxNo); + + /** + * 检查卷是否已装箱 + * @param site 站点 + * @param buNo BU号 + * @param rollNo 卷号 + * @return 箱卷明细列表 + */ + List checkRollInBox(@Param("site") String site, @Param("buNo") String buNo, @Param("rollNo") String rollNo); } diff --git a/src/main/java/com/gaotao/modules/boxManage/data/SoReceivePalletBoxesData.java b/src/main/java/com/gaotao/modules/boxManage/data/SoReceivePalletBoxesData.java new file mode 100644 index 0000000..df0351a --- /dev/null +++ b/src/main/java/com/gaotao/modules/boxManage/data/SoReceivePalletBoxesData.java @@ -0,0 +1,60 @@ +package com.gaotao.modules.boxManage.data; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.apache.ibatis.type.Alias; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +@Data +@Alias("SoReceivePalletBoxesData") +public class SoReceivePalletBoxesData { + /** + * 主键ID + */ + private Integer id; + + /** + * 序号 + */ + private Integer orderId; + + /** + * 仓库ID + */ + private String site; + + /** + * 事业部编号 + */ + private String buNo; + + /** + * 托盘号 + */ + private String palletNo; + + /** + * 箱号 + */ + private String boxNo; + + /** + * 箱数量 + */ + private Integer boxesQty; + + /** + * 装托人 + */ + private String receivedBy; + + /** + * 装托时间 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm", timezone = "GMT+8") + private Date receivedDate; +} + diff --git a/src/main/java/com/gaotao/modules/boxManage/data/SoReceivePalletsData.java b/src/main/java/com/gaotao/modules/boxManage/data/SoReceivePalletsData.java new file mode 100644 index 0000000..f8f0a32 --- /dev/null +++ b/src/main/java/com/gaotao/modules/boxManage/data/SoReceivePalletsData.java @@ -0,0 +1,12 @@ +package com.gaotao.modules.boxManage.data; + +import com.gaotao.modules.boxManage.entity.SoReceivePalletsDto; +import lombok.Data; +import org.apache.ibatis.type.Alias; + +@Data +@Alias("SoReceivePalletsData") +public class SoReceivePalletsData extends SoReceivePalletsDto { + private Integer flag; +} + diff --git a/src/main/java/com/gaotao/modules/boxManage/entity/SoReceivePalletsDto.java b/src/main/java/com/gaotao/modules/boxManage/entity/SoReceivePalletsDto.java new file mode 100644 index 0000000..5075817 --- /dev/null +++ b/src/main/java/com/gaotao/modules/boxManage/entity/SoReceivePalletsDto.java @@ -0,0 +1,195 @@ +package com.gaotao.modules.boxManage.entity; + +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +public class SoReceivePalletsDto { + /** + * 主键ID + */ + private Integer id; + + /** + * 仓库ID + */ + private String site; + + /** + * 事业部编号 + */ + private String buNo; + + /** + * 托盘号 + */ + private String palletNo; + + /** + * 销售发货单号 + */ + private String orderNo; + + /** + * 状态(未封托/已封托) + */ + private String status; + + /** + * 箱数量 + */ + private Integer boxesQty; + + /** + * 托盘类型 + */ + private String palletType; + + /** + * 是否在库 + */ + private String cInStockFlag; + + /** + * 创建时间 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm", timezone = "GMT+8") + private Date createdDate; + + /** + * 创建人 + */ + private String createdBy; + + /** + * 更新时间 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm", timezone = "GMT+8") + private Date updateDate; + + /** + * 更新人 + */ + private String updateBy; + + /** + * 版本号 + */ + private Integer version; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getSite() { + return site; + } + + public void setSite(String site) { + this.site = site; + } + + public String getBuNo() { + return buNo; + } + + public void setBuNo(String buNo) { + this.buNo = buNo; + } + + public String getPalletNo() { + return palletNo; + } + + public void setPalletNo(String palletNo) { + this.palletNo = palletNo; + } + + public String getOrderNo() { + return orderNo; + } + + public void setOrderNo(String orderNo) { + this.orderNo = orderNo; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public Integer getBoxesQty() { + return boxesQty; + } + + public void setBoxesQty(Integer boxesQty) { + this.boxesQty = boxesQty; + } + + public String getPalletType() { + return palletType; + } + + public void setPalletType(String palletType) { + this.palletType = palletType; + } + + public String getcInStockFlag() { + return cInStockFlag; + } + + public void setcInStockFlag(String cInStockFlag) { + this.cInStockFlag = cInStockFlag; + } + + public Date getCreatedDate() { + return createdDate; + } + + public void setCreatedDate(Date createdDate) { + this.createdDate = createdDate; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public Date getUpdateDate() { + return updateDate; + } + + public void setUpdateDate(Date updateDate) { + this.updateDate = updateDate; + } + + public String getUpdateBy() { + return updateBy; + } + + public void setUpdateBy(String updateBy) { + this.updateBy = updateBy; + } + + public Integer getVersion() { + return version; + } + + public void setVersion(Integer version) { + this.version = version; + } +} + 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 97fd48b..f1123bd 100644 --- a/src/main/java/com/gaotao/modules/boxManage/service/BoxForNotificationService.java +++ b/src/main/java/com/gaotao/modules/boxManage/service/BoxForNotificationService.java @@ -3,6 +3,8 @@ package com.gaotao.modules.boxManage.service; import com.gaotao.modules.boxManage.data.SoReceiveBoxRollsData; import com.gaotao.modules.boxManage.data.SoReceiveBoxesData; import com.gaotao.modules.boxManage.data.SoReceiveCasesData; +import com.gaotao.modules.boxManage.data.SoReceivePalletBoxesData; +import com.gaotao.modules.boxManage.data.SoReceivePalletsData; import com.gaotao.modules.outboundNotification.entity.vo.OutboundNotificationHeadVo; import java.util.List; @@ -43,4 +45,58 @@ public interface BoxForNotificationService { * @param data 包含 site, buNo, orderNo */ void updateOrderStatus(OutboundNotificationHeadVo data); + + // ==================== 托清单相关方法 ==================== + + /** + * 查询托清单列表 + * @param data 查询条件 + * @return 托清单列表 + */ + List searchSoReceivePalletsData(SoReceivePalletsData data); + + /** + * 新增托 + * @param data 托数据 + * @return 托盘号 + */ + String newSoReceivePalletsData(SoReceivePalletsData data); + + /** + * 查询托明细列表 + * @param data 查询条件 + * @return 托明细列表 + */ + List searchPalletBoxDetail(SoReceivePalletsData data); + + /** + * 查询托数据 + * @param data 查询条件 + * @return 托数据 + */ + SoReceivePalletsData searchPalletData(SoReceivePalletsData data); + + /** + * 删除托 + * @param data 托数据 + */ + void deleteSoReceivePalletsData(SoReceivePalletsData data); + + /** + * 更新托状态 + * @param data 托数据 + */ + void updatePalletStatus(SoReceivePalletsData data); + + /** + * 扫描装托(扫描箱号) + * @param data 托箱明细数据 + */ + void scanPalletBox(SoReceivePalletBoxesData data); + + /** + * 删除托中的箱 + * @param data 托箱明细数据 + */ + void deletePalletBox(SoReceivePalletBoxesData 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 00b662f..1494b19 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,6 +4,8 @@ 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.data.SoReceiveCasesData; +import com.gaotao.modules.boxManage.data.SoReceivePalletBoxesData; +import com.gaotao.modules.boxManage.data.SoReceivePalletsData; import com.gaotao.modules.boxManage.service.BoxForNotificationService; import com.gaotao.modules.outboundNotification.entity.OutboundNotificationDetailEntity; import com.gaotao.modules.outboundNotification.entity.vo.OutboundNotificationHeadVo; @@ -59,6 +61,17 @@ public class BoxForNotificationServiceImpl implements BoxForNotificationService if(!checkData.isEmpty()){ throw new RuntimeException("箱内有卷无法删除!"); } + + // 检查箱是否已经在托中 + List palletBoxList = boxForNotificationMapper.checkBoxInPallet( + data.getSite(), + data.getBuNo(), + data.getBoxNo() + ); + if(palletBoxList != null && !palletBoxList.isEmpty()){ + throw new RuntimeException("箱已在托中,无法删除!"); + } + boxForNotificationMapper.deleteSoReceiveBoxesData(data); } @@ -250,6 +263,16 @@ public class BoxForNotificationServiceImpl implements BoxForNotificationService .orElse(null); if (caseData != null) { + // 检查卷是否已经装箱 + List boxRollList = boxForNotificationMapper.checkRollInBox( + data.getSite(), + data.getBuNo(), + caseData.getRollNo() + ); + if(boxRollList != null && !boxRollList.isEmpty()){ + throw new RuntimeException("卷已装箱,无法删除!"); + } + // 恢复库存的原始上级标签(将 ori_parent_roll_no 和 ori_parent_roll_type 的值赋回给 parent_roll_no 和 parent_roll_type) boxForNotificationMapper.restoreStockParentRollType( caseData.getRollNo(), @@ -359,4 +382,99 @@ public class BoxForNotificationServiceImpl implements BoxForNotificationService // 更新订单状态为"待出库" boxForNotificationMapper.updateOrderStatus(data.getSite(), data.getBuNo(), data.getOrderNo(), "待出库"); } + + // ==================== 托清单相关方法实现 ==================== + + @Override + public List searchSoReceivePalletsData(SoReceivePalletsData data) { + return boxForNotificationMapper.searchSoReceivePalletsData(data); + } + + @Override + @Transactional + public String newSoReceivePalletsData(SoReceivePalletsData inData) { + // 获取托盘号 + TransNoControl transNo = transNoService.getTransNo(inData.getSite(), "PALLET", inData.getBuNo()); + if (transNo == null) { + throw new RuntimeException("托盘号生成失败,请联系管理员!"); + } + inData.setPalletNo(transNo.getNewTransNo()); + boxForNotificationMapper.newSoReceivePalletsData(inData); + return transNo.getNewTransNo(); + } + + @Override + public List searchPalletBoxDetail(SoReceivePalletsData inData) { + return boxForNotificationMapper.searchPalletBoxDetail(inData); + } + + @Override + public SoReceivePalletsData searchPalletData(SoReceivePalletsData inData) { + return boxForNotificationMapper.searchPalletData(inData); + } + + @Override + @Transactional + public void deleteSoReceivePalletsData(SoReceivePalletsData inData) { + // 1. 先删除托明细表中的数据 + SoReceivePalletBoxesData palletBoxData = new SoReceivePalletBoxesData(); + palletBoxData.setSite(inData.getSite()); + palletBoxData.setBuNo(inData.getBuNo()); + palletBoxData.setPalletNo(inData.getPalletNo()); + boxForNotificationMapper.deleteBoxFromPallet(palletBoxData); + + // 2. 再删除托主表数据 + boxForNotificationMapper.deleteSoReceivePalletsData(inData); + } + + @Override + @Transactional + public void updatePalletStatus(SoReceivePalletsData inData) { + boxForNotificationMapper.updatePalletStatus(inData); + } + + @Override + @Transactional + public void scanPalletBox(SoReceivePalletBoxesData inData) { + // 1. 验证箱号是否存在(不校验状态) + SoReceiveBoxesData boxData = new SoReceiveBoxesData(); + boxData.setSite(inData.getSite()); + boxData.setBuNo(inData.getBuNo()); + boxData.setBoxNo(inData.getBoxNo()); + + SoReceiveBoxesData boxInfo = boxForNotificationMapper.selectBoxByBoxNo(boxData); + if (boxInfo == null) { + throw new RuntimeException("箱号不存在!"); + } + + // 2. 校验箱内是否有卷,空箱不允许装托 + List boxRolls = boxForNotificationMapper.searchBoxRollDetail(boxData); + if (boxRolls == null || boxRolls.isEmpty()) { + throw new RuntimeException("箱内没有卷,不允许装托!"); + } + + // 3. 添加箱到托 + boxForNotificationMapper.addBoxToPallet(inData); + + // 4. 更新托的箱数量 + SoReceivePalletsData palletData = new SoReceivePalletsData(); + palletData.setSite(inData.getSite()); + palletData.setBuNo(inData.getBuNo()); + palletData.setPalletNo(inData.getPalletNo()); + boxForNotificationMapper.updatePalletBoxesQty(palletData); + } + + @Override + @Transactional + public void deletePalletBox(SoReceivePalletBoxesData inData) { + // 1. 删除箱 + boxForNotificationMapper.deleteBoxFromPallet(inData); + + // 2. 更新托的箱数量 + SoReceivePalletsData palletData = new SoReceivePalletsData(); + palletData.setSite(inData.getSite()); + palletData.setBuNo(inData.getBuNo()); + palletData.setPalletNo(inData.getPalletNo()); + boxForNotificationMapper.updatePalletBoxesQty(palletData); + } } diff --git a/src/main/resources/mapper/boxManage/BoxForNotificationMapper.xml b/src/main/resources/mapper/boxManage/BoxForNotificationMapper.xml index c7768d6..636ab4a 100644 --- a/src/main/resources/mapper/boxManage/BoxForNotificationMapper.xml +++ b/src/main/resources/mapper/boxManage/BoxForNotificationMapper.xml @@ -183,7 +183,7 @@ c.batch_no, c.location_id from so_receive_boxes a - left join so_receive_box_rolls b on a.site = b.site and a.box_no = b.box_no and a.bu_no = b.bu_no + INNER join so_receive_box_rolls b on a.site = b.site and a.box_no = b.box_no and a.bu_no = b.bu_no left join inventory_stock c on b.site = c.site and b.final_roll_no = c.roll_no and b.bu_no = c.bu_no where a.site = #{site} and a.order_no = #{orderNo} and a.bu_no = #{buNo} @@ -406,4 +406,136 @@ AND bu_no = #{buNo} AND order_no = #{orderNo} + + + + + + + + + INSERT INTO so_receive_pallets + (site, pallet_no, order_no, [status], boxes_qty, pallet_type, c_in_stock_flag, created_date, created_by, + version, bu_no) + VALUES + (#{site}, #{palletNo}, #{orderNo}, #{status}, #{boxesQty}, #{palletType}, 'Y', GETDATE(), #{createdBy}, + 0, #{buNo}) + + + + + + + + + + + DELETE FROM so_receive_pallets + WHERE id = #{id} + + + + + UPDATE so_receive_pallets + SET [status] = #{status} + WHERE id = #{id} + + + + + + + + INSERT INTO so_receive_pallet_boxes + (site, bu_no, pallet_no, box_no, boxes_qty, received_by, received_date) + VALUES + (#{site}, #{buNo}, #{palletNo}, #{boxNo}, #{boxesQty}, #{receivedBy}, GETDATE()) + + + + + DELETE FROM so_receive_pallet_boxes + WHERE site = #{site} + AND bu_no = #{buNo} + AND pallet_no = #{palletNo} + + AND box_no = #{boxNo} + + + + + + UPDATE so_receive_pallets + SET boxes_qty = ( + SELECT COUNT(*) + FROM so_receive_pallet_boxes + WHERE site = #{site} + AND bu_no = #{buNo} + AND pallet_no = #{palletNo} + ) + WHERE site = #{site} + AND bu_no = #{buNo} + AND pallet_no = #{palletNo} + + + + + + + \ No newline at end of file