批量收货
							parent
							
								
									f24d64d601
								
							
						
					
					
						commit
						33029502c7
					
				| 
						 | 
				
			
			@ -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<String> batchReceive(@RequestBody ValidateList<Long> idList) {
 | 
			
		||||
        return receiveService.batchReceive(idList);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -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<String>
 | 
			
		||||
     */
 | 
			
		||||
    @Transactional(rollbackFor = Exception.class)
 | 
			
		||||
    public ResponseDTO<String> batchReceive(List<Long> idList) {
 | 
			
		||||
        if (CollectionUtils.isEmpty(idList)) {
 | 
			
		||||
            return ResponseDTO.userErrorParam(UserErrorCode.PARAM_ERROR.getMsg());
 | 
			
		||||
        }
 | 
			
		||||
        List<AsnDetailEntity> 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<String> batchReceive(List<AsnDetailEntity> asnDetails, Long locationId) {
 | 
			
		||||
        //消息提示
 | 
			
		||||
        JoinerResult joiner = JoinerResult.createJoiner();
 | 
			
		||||
        //查询物料
 | 
			
		||||
        List<Long> itemIds = asnDetails.stream().map(AsnDetailEntity::getItemId).distinct().toList();
 | 
			
		||||
        Map<Long, ItemEntity> itemMap = itemQueryService.queryItemList(itemIds);
 | 
			
		||||
        List<AsnDetailEntity> updateToAsnDetail = new ArrayList<>();
 | 
			
		||||
        Set<Long> 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);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -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 {
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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 {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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<AsnDetailEntity>
 | 
			
		||||
     */
 | 
			
		||||
    public List<AsnDetailEntity> queryAsnDetailList(List<Long> idList) {
 | 
			
		||||
        LambdaQueryWrapper<AsnDetailEntity> queryWrapper = new LambdaQueryWrapper<>();
 | 
			
		||||
        queryWrapper.in(AsnDetailEntity::getAsnDetailId, idList);
 | 
			
		||||
        return asnDetailDao.selectList(queryWrapper);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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<String>
 | 
			
		||||
     */
 | 
			
		||||
 | 
			
		||||
    @Transactional(rollbackFor = Exception.class)
 | 
			
		||||
    public ResponseDTO<String> batchDelete(List<Long> idList) {
 | 
			
		||||
        if (CollectionUtils.isEmpty(idList)) {
 | 
			
		||||
            return ResponseDTO.userErrorParam(UserErrorCode.PARAM_ERROR.getMsg());
 | 
			
		||||
        }
 | 
			
		||||
        JoinerResult joiner = JoinerResult.createJoiner();
 | 
			
		||||
        Set<Long> asnIds = new HashSet<>();
 | 
			
		||||
        for (Long id : idList) {
 | 
			
		||||
            AsnDetailEntity asnDetail = asnDetailDao.selectById(id);
 | 
			
		||||
        List<Long> toDeleteList = new ArrayList<>();
 | 
			
		||||
        List<AsnDetailEntity> asnDetails = asnDetailQueryService.queryAsnDetailList(idList);
 | 
			
		||||
        List<Long> itemIds = asnDetails.stream().map(AsnDetailEntity::getItemId).toList();
 | 
			
		||||
        Map<Long, ItemEntity> 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<String>
 | 
			
		||||
     */
 | 
			
		||||
    @Transactional(rollbackFor = Exception.class)
 | 
			
		||||
    public ResponseDTO<String> 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<AsnDetailEntity> asnDetails = asnDetailQueryService.queryByAsnId(asnId);
 | 
			
		||||
        if (CollectionUtils.isEmpty(asnDetails)) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //订单数量
 | 
			
		||||
        BigDecimal orderQuantity = asnDetails.stream().map(AsnDetailEntity::getOrderQuantity).reduce(BigDecimal.ZERO, BigDecimal::add);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue