From 33029502c75c8b20595e0a9323a05508c0477380 Mon Sep 17 00:00:00 2001 From: "HUOJIN\\92525" Date: Mon, 31 Mar 2025 17:25:36 +0800 Subject: [PATCH] =?UTF-8?q?=E6=89=B9=E9=87=8F=E6=94=B6=E8=B4=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../business/receive/ReceiveController.java | 26 +++++ .../business/receive/ReceiveService.java | 109 ++++++++++++++++++ .../domain/entity/AsnDetailEntity.java | 7 ++ .../asnDetail/domain/vo/AsnDetailVO.java | 6 + .../service/AsnDetailQueryService.java | 20 ++++ .../asnDetail/service/AsnDetailService.java | 63 +++++++--- 6 files changed, 215 insertions(+), 16 deletions(-) create mode 100644 smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/receive/ReceiveController.java create mode 100644 smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/receive/ReceiveService.java diff --git a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/receive/ReceiveController.java b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/receive/ReceiveController.java new file mode 100644 index 0000000..920e354 --- /dev/null +++ b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/receive/ReceiveController.java @@ -0,0 +1,26 @@ +package net.lab1024.sa.admin.module.business.receive; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import net.lab1024.sa.base.common.domain.ResponseDTO; +import net.lab1024.sa.base.common.domain.ValidateList; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@Tag(name = "收货") +public class ReceiveController { + + @Resource + private ReceiveService receiveService; + + @Operation(summary = "批量收货 @author 霍锦") + @PostMapping("/receive/batchReceive") + @SaCheckPermission("receive:batchReceive") + public ResponseDTO batchReceive(@RequestBody ValidateList idList) { + return receiveService.batchReceive(idList); + } +} diff --git a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/receive/ReceiveService.java b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/receive/ReceiveService.java new file mode 100644 index 0000000..9dd15d4 --- /dev/null +++ b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/receive/ReceiveService.java @@ -0,0 +1,109 @@ +package net.lab1024.sa.admin.module.business.receive; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import jakarta.annotation.Resource; +import net.lab1024.sa.admin.module.business.base.item.domain.entity.ItemEntity; +import net.lab1024.sa.admin.module.business.base.item.service.ItemQueryService; +import net.lab1024.sa.admin.module.business.receive.asnDetail.domain.entity.AsnDetailEntity; +import net.lab1024.sa.admin.module.business.receive.asnDetail.domain.vo.AsnDetailVO; +import net.lab1024.sa.admin.module.business.receive.asnDetail.manager.AsnDetailManager; +import net.lab1024.sa.admin.module.business.receive.asnDetail.service.AsnDetailQueryService; +import net.lab1024.sa.admin.module.business.receive.asnDetail.service.AsnDetailService; +import net.lab1024.sa.admin.util.JoinerResult; +import net.lab1024.sa.admin.util.ResponseDTOUtils; +import net.lab1024.sa.base.common.code.UserErrorCode; +import net.lab1024.sa.base.common.domain.ResponseDTO; +import net.lab1024.sa.base.common.util.SmartBigDecimalUtil; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.util.*; + +@Service +public class ReceiveService { + + @Resource + private AsnDetailManager asnDetailManager; + + @Resource + private ItemQueryService itemQueryService; + + @Resource + private AsnDetailService asnDetailService; + + + @Resource + private AsnDetailQueryService asnDetailQueryService; + + /** + * 批量收货 + * + * @param idList 入库明细id集合 + * @return ResponseDTO + */ + @Transactional(rollbackFor = Exception.class) + public ResponseDTO batchReceive(List idList) { + if (CollectionUtils.isEmpty(idList)) { + return ResponseDTO.userErrorParam(UserErrorCode.PARAM_ERROR.getMsg()); + } + List asnDetails = asnDetailQueryService.queryAsnDetailList(idList); + if (CollectionUtils.isEmpty(asnDetails)) { + return ResponseDTO.userErrorParam(UserErrorCode.PARAM_ERROR.getMsg()); + } + + return batchReceive(asnDetails, null); + + } + + @Transactional(rollbackFor = Exception.class) + public ResponseDTO batchReceive(List asnDetails, Long locationId) { + //消息提示 + JoinerResult joiner = JoinerResult.createJoiner(); + //查询物料 + List itemIds = asnDetails.stream().map(AsnDetailEntity::getItemId).distinct().toList(); + Map itemMap = itemQueryService.queryItemList(itemIds); + List updateToAsnDetail = new ArrayList<>(); + Set asnIds = new HashSet<>(); + for (AsnDetailEntity asnDetail : asnDetails) { + ItemEntity item = itemMap.get(asnDetail.getItemId()); + if (SmartBigDecimalUtil.subtract(asnDetail.getOrderQuantity(), asnDetail.getReceivedQuantity(), 2).compareTo(BigDecimal.ZERO) == 0) { + joiner.getErrorMsg().add(item.getItemCode() + "明细已收货"); + continue; + } + if (asnDetail.getReceivedQuantity().compareTo(asnDetail.getOrderQuantity()) > 0) { + joiner.getErrorMsg().add(item.getItemCode() + "收货数量不能大于订单数量"); + continue; + } + if (locationId == null || locationId <= 0) { + //默认库位 + locationId = 1L; + } + + //更新入库明细 + asnDetail.setReceivedQuantity(SmartBigDecimalUtil.subtract(asnDetail.getOrderQuantity(), asnDetail.getReceivedQuantity(), 2)); + updateToAsnDetail.add(asnDetail); + joiner.getSussMsg().add(item.getItemCode() + "收货成功"); + + asnIds.add(asnDetail.getAsnId()); + } + + //生成itemKey + + //生成入库记录 + + //生成库存 + + //批量更新入库明细 + if (CollectionUtils.isNotEmpty(updateToAsnDetail)) { + asnDetailManager.updateBatchById(updateToAsnDetail); + } + + //更新入库单 + asnIds.forEach(asnDetailService::refreshAsn); + + return ResponseDTOUtils.buildResponseDTO(joiner); + } + +} diff --git a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/receive/asnDetail/domain/entity/AsnDetailEntity.java b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/receive/asnDetail/domain/entity/AsnDetailEntity.java index eb4ea92..d16a76a 100644 --- a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/receive/asnDetail/domain/entity/AsnDetailEntity.java +++ b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/receive/asnDetail/domain/entity/AsnDetailEntity.java @@ -7,7 +7,11 @@ import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import java.math.BigDecimal; import java.time.LocalDateTime; + +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; +import lombok.NoArgsConstructor; /** * 入库明细 实体类 @@ -18,6 +22,9 @@ import lombok.Data; */ @Data +@Builder +@AllArgsConstructor +@NoArgsConstructor @TableName("t_asn_detail") public class AsnDetailEntity { diff --git a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/receive/asnDetail/domain/vo/AsnDetailVO.java b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/receive/asnDetail/domain/vo/AsnDetailVO.java index 04ff2cb..fc93ccf 100644 --- a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/receive/asnDetail/domain/vo/AsnDetailVO.java +++ b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/receive/asnDetail/domain/vo/AsnDetailVO.java @@ -5,7 +5,10 @@ import io.swagger.v3.oas.annotations.media.Schema; import java.math.BigDecimal; import java.time.LocalDateTime; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; +import lombok.NoArgsConstructor; /** * 入库明细 列表VO @@ -16,6 +19,9 @@ import lombok.Data; */ @Data +@Builder +@AllArgsConstructor +@NoArgsConstructor public class AsnDetailVO { diff --git a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/receive/asnDetail/service/AsnDetailQueryService.java b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/receive/asnDetail/service/AsnDetailQueryService.java index fb95c1c..9a6e880 100644 --- a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/receive/asnDetail/service/AsnDetailQueryService.java +++ b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/receive/asnDetail/service/AsnDetailQueryService.java @@ -4,14 +4,19 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import jakarta.annotation.Resource; import net.lab1024.sa.admin.module.business.base.address.domain.entity.AddressEntity; +import net.lab1024.sa.admin.module.business.base.area.domain.entity.AreaEntity; import net.lab1024.sa.admin.module.business.base.customer.domain.entity.CustomerEntity; import net.lab1024.sa.admin.module.business.base.item.domain.entity.ItemEntity; +import net.lab1024.sa.admin.module.business.base.item.manager.ItemManager; import net.lab1024.sa.admin.module.business.base.item.service.ItemQueryService; +import net.lab1024.sa.admin.module.business.base.location.domain.entity.LocationEntity; +import net.lab1024.sa.admin.module.business.base.location.domain.vo.LocationVO; import net.lab1024.sa.admin.module.business.receive.asn.domain.vo.AsnVO; import net.lab1024.sa.admin.module.business.receive.asnDetail.dao.AsnDetailDao; import net.lab1024.sa.admin.module.business.receive.asnDetail.domain.entity.AsnDetailEntity; import net.lab1024.sa.admin.module.business.receive.asnDetail.domain.form.AsnDetailQueryForm; import net.lab1024.sa.admin.module.business.receive.asnDetail.domain.vo.AsnDetailVO; +import net.lab1024.sa.admin.module.business.receive.asnDetail.manager.AsnDetailManager; import net.lab1024.sa.base.common.domain.PageResult; import net.lab1024.sa.base.common.util.SmartPageUtil; import org.springframework.stereotype.Service; @@ -26,6 +31,9 @@ public class AsnDetailQueryService { @Resource private AsnDetailDao asnDetailDao; + @Resource + private ItemManager itemManager; + @Resource private ItemQueryService itemQueryService; @@ -63,4 +71,16 @@ public class AsnDetailQueryService { queryWrapper.eq(AsnDetailEntity::getAsnId, asnId); return asnDetailDao.selectList(queryWrapper); } + + /** + * 根据ids查询入库明细 + * + * @param idList 入库明细集合 + * @return List + */ + public List queryAsnDetailList(List idList) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.in(AsnDetailEntity::getAsnDetailId, idList); + return asnDetailDao.selectList(queryWrapper); + } } diff --git a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/receive/asnDetail/service/AsnDetailService.java b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/receive/asnDetail/service/AsnDetailService.java index 43463f6..bd5b03a 100644 --- a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/receive/asnDetail/service/AsnDetailService.java +++ b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/receive/asnDetail/service/AsnDetailService.java @@ -1,10 +1,12 @@ package net.lab1024.sa.admin.module.business.receive.asnDetail.service; import java.math.BigDecimal; -import java.util.HashSet; -import java.util.List; -import java.util.Set; +import java.util.*; +import net.lab1024.sa.admin.module.business.base.item.dao.ItemDao; +import net.lab1024.sa.admin.module.business.base.item.domain.entity.ItemEntity; +import net.lab1024.sa.admin.module.business.base.item.service.ItemQueryService; +import net.lab1024.sa.admin.module.business.base.item.service.ItemService; import net.lab1024.sa.admin.module.business.receive.asn.constant.AsnOrderStatusEnum; import net.lab1024.sa.admin.module.business.receive.asn.dao.AsnDao; import net.lab1024.sa.admin.module.business.receive.asn.domain.entity.AsnEntity; @@ -13,6 +15,8 @@ import net.lab1024.sa.admin.module.business.receive.asnDetail.domain.entity.AsnD import net.lab1024.sa.admin.module.business.receive.asnDetail.domain.form.AsnDetailAddForm; import net.lab1024.sa.admin.module.business.receive.asnDetail.domain.form.AsnDetailUpdateForm; import net.lab1024.sa.admin.module.business.receive.asnDetail.manager.AsnDetailManager; +import net.lab1024.sa.admin.util.JoinerResult; +import net.lab1024.sa.admin.util.ResponseDTOUtils; import net.lab1024.sa.base.common.code.UserErrorCode; import net.lab1024.sa.base.common.util.SmartBeanUtil; import net.lab1024.sa.base.common.domain.ResponseDTO; @@ -37,12 +41,18 @@ public class AsnDetailService { @Resource private AsnDao asnDao; + @Resource + private ItemDao itemDao; + @Resource private AsnDetailDao asnDetailDao; @Resource private AsnDetailManager asnDetailManager; + @Resource + private ItemQueryService itemQueryService; + @Resource private AsnDetailQueryService asnDetailQueryService; @@ -83,24 +93,38 @@ public class AsnDetailService { * @param idList id集合 * @return ResponseDTO */ + + @Transactional(rollbackFor = Exception.class) public ResponseDTO batchDelete(List idList) { if (CollectionUtils.isEmpty(idList)) { return ResponseDTO.userErrorParam(UserErrorCode.PARAM_ERROR.getMsg()); } + JoinerResult joiner = JoinerResult.createJoiner(); Set asnIds = new HashSet<>(); - for (Long id : idList) { - AsnDetailEntity asnDetail = asnDetailDao.selectById(id); + List toDeleteList = new ArrayList<>(); + List asnDetails = asnDetailQueryService.queryAsnDetailList(idList); + List itemIds = asnDetails.stream().map(AsnDetailEntity::getItemId).toList(); + Map mapItem = itemQueryService.queryItemList(itemIds); + for (AsnDetailEntity asnDetail : asnDetails) { + ItemEntity item = mapItem.get(asnDetail.getItemId()); + if (asnDetail.getReceivedQuantity().compareTo(BigDecimal.ZERO) > 0) { + joiner.getErrorMsg().add(item.getItemCode() + "明细已收货"); + continue; + } + toDeleteList.add(asnDetail.getAsnDetailId()); asnIds.add(asnDetail.getAsnId()); + joiner.getSussMsg().add(item.getItemCode() + "明细删除成功"); + } + + if (CollectionUtils.isNotEmpty(toDeleteList)) { + //批量删除 + asnDetailManager.removeBatchByIds(toDeleteList); } - asnDetailManager.removeBatchByIds(idList); //刷新出库单 - if (CollectionUtils.isNotEmpty(asnIds)) { - for (Long asnId : asnIds) { - refreshAsn(asnId); - } - } - return ResponseDTO.ok(); + asnIds.forEach(this::refreshAsn); + + return ResponseDTOUtils.buildResponseDTO(joiner); } /** @@ -109,17 +133,27 @@ public class AsnDetailService { * @param asnDetailId id * @return ResponseDTO */ + @Transactional(rollbackFor = Exception.class) public ResponseDTO delete(Long asnDetailId) { if (null == asnDetailId) { return ResponseDTO.userErrorParam(UserErrorCode.PARAM_ERROR.getMsg()); } + JoinerResult joiner = JoinerResult.createJoiner(); AsnDetailEntity asnDetail = asnDetailDao.selectById(asnDetailId); + ItemEntity item = itemDao.selectById(asnDetail.getItemId()); + if (asnDetail.getReceivedQuantity().compareTo(BigDecimal.ZERO) > 0) { + joiner.getErrorMsg().add(item.getItemCode() + "明细已收货"); + return ResponseDTOUtils.buildResponseDTO(joiner); + } + Long asnId = asnDetail.getAsnId(); asnDetailDao.deleteById(asnDetailId); + joiner.getSussMsg().add(item.getItemCode() + "删除成功"); + //刷新出库单 refreshAsn(asnId); - return ResponseDTO.ok(); + return ResponseDTOUtils.buildResponseDTO(joiner); } public void refreshAsn(Long asnId) { @@ -128,9 +162,6 @@ public class AsnDetailService { //获取订单明细 List asnDetails = asnDetailQueryService.queryByAsnId(asnId); - if (CollectionUtils.isEmpty(asnDetails)) { - return; - } //订单数量 BigDecimal orderQuantity = asnDetails.stream().map(AsnDetailEntity::getOrderQuantity).reduce(BigDecimal.ZERO, BigDecimal::add);