批量退货
							parent
							
								
									914d45a479
								
							
						
					
					
						commit
						104d17606a
					
				| 
						 | 
				
			
			@ -66,4 +66,8 @@ public class AdminCacheConst extends CacheKeyConst {
 | 
			
		|||
        public static final String CUSTOMER_ENTITY = "customer_cache";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static class itemKey {
 | 
			
		||||
        public static final String ITEM_KEY_ENTITY = "item_key_cache";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,11 +1,18 @@
 | 
			
		|||
package net.lab1024.sa.admin.module.business.wms.itemKey.manager;
 | 
			
		||||
 | 
			
		||||
import jakarta.annotation.Resource;
 | 
			
		||||
import lombok.extern.slf4j.Slf4j;
 | 
			
		||||
import net.lab1024.sa.admin.constant.AdminCacheConst;
 | 
			
		||||
import net.lab1024.sa.admin.module.business.wms.base.location.dao.LocationDao;
 | 
			
		||||
import net.lab1024.sa.admin.module.business.wms.base.location.domain.entity.LocationEntity;
 | 
			
		||||
import net.lab1024.sa.admin.module.business.wms.itemKey.domain.entity.ItemKeyEntity;
 | 
			
		||||
import net.lab1024.sa.admin.module.business.wms.itemKey.dao.ItemKeyDao;
 | 
			
		||||
 | 
			
		||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 | 
			
		||||
import net.lab1024.sa.admin.module.business.wms.itemKey.dao.ItemKeyDao;
 | 
			
		||||
import net.lab1024.sa.admin.module.business.wms.itemKey.domain.entity.ItemKeyEntity;
 | 
			
		||||
import org.springframework.cache.annotation.CacheEvict;
 | 
			
		||||
import org.springframework.cache.annotation.Cacheable;
 | 
			
		||||
import org.springframework.stereotype.Service;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
| 
						 | 
				
			
			@ -16,7 +23,22 @@ import org.springframework.stereotype.Service;
 | 
			
		|||
 * @Copyright 友仓
 | 
			
		||||
 */
 | 
			
		||||
@Service
 | 
			
		||||
@Slf4j
 | 
			
		||||
public class ItemKeyManager extends ServiceImpl<ItemKeyDao, ItemKeyEntity> {
 | 
			
		||||
 | 
			
		||||
    @Resource
 | 
			
		||||
    private ItemKeyDao itemKeyDao;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 根据类目id 移除缓存
 | 
			
		||||
     */
 | 
			
		||||
    @CacheEvict(value = {AdminCacheConst.itemKey.ITEM_KEY_ENTITY}, allEntries = true)
 | 
			
		||||
    public void removeCache() {
 | 
			
		||||
        log.info("clear ITEM_KEY_ENTITY");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Cacheable(AdminCacheConst.itemKey.ITEM_KEY_ENTITY)
 | 
			
		||||
    public ItemKeyEntity queryItemKey(Long itemKeyId) {
 | 
			
		||||
        return itemKeyDao.selectById(itemKeyId);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,7 +2,9 @@ package net.lab1024.sa.admin.module.business.wms.itemKey.service;
 | 
			
		|||
 | 
			
		||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 | 
			
		||||
import com.google.common.collect.Maps;
 | 
			
		||||
import jakarta.annotation.Resource;
 | 
			
		||||
import net.lab1024.sa.admin.module.business.wms.base.location.domain.entity.LocationEntity;
 | 
			
		||||
import net.lab1024.sa.admin.module.business.wms.itemKey.dao.ItemKeyDao;
 | 
			
		||||
import net.lab1024.sa.admin.module.business.wms.itemKey.domain.entity.ItemKeyEntity;
 | 
			
		||||
import net.lab1024.sa.admin.module.business.wms.itemKey.domain.form.ItemKeyQueryForm;
 | 
			
		||||
| 
						 | 
				
			
			@ -11,12 +13,16 @@ import net.lab1024.sa.admin.module.business.wms.itemKey.dao.ItemKeyDao;
 | 
			
		|||
import net.lab1024.sa.admin.module.business.wms.itemKey.domain.entity.ItemKeyEntity;
 | 
			
		||||
import net.lab1024.sa.admin.module.business.wms.itemKey.domain.form.ItemKeyQueryForm;
 | 
			
		||||
import net.lab1024.sa.admin.module.business.wms.itemKey.domain.vo.ItemKeyVO;
 | 
			
		||||
import net.lab1024.sa.admin.module.business.wms.itemKey.manager.ItemKeyManager;
 | 
			
		||||
import net.lab1024.sa.base.common.domain.PageResult;
 | 
			
		||||
import net.lab1024.sa.base.common.util.SmartPageUtil;
 | 
			
		||||
import org.apache.commons.collections4.CollectionUtils;
 | 
			
		||||
import org.springframework.stereotype.Service;
 | 
			
		||||
 | 
			
		||||
import java.util.Collections;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
 | 
			
		||||
@Service
 | 
			
		||||
public class ItemKeyQueryService {
 | 
			
		||||
| 
						 | 
				
			
			@ -24,6 +30,9 @@ public class ItemKeyQueryService {
 | 
			
		|||
    @Resource
 | 
			
		||||
    private ItemKeyDao itemKeyDao;
 | 
			
		||||
 | 
			
		||||
    @Resource
 | 
			
		||||
    private ItemKeyManager itemKeyManager;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 分页查询
 | 
			
		||||
     */
 | 
			
		||||
| 
						 | 
				
			
			@ -33,6 +42,27 @@ public class ItemKeyQueryService {
 | 
			
		|||
        return SmartPageUtil.convert2PageResult(page, list);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 根据物料属性ID集合查询物料属性信息
 | 
			
		||||
     *
 | 
			
		||||
     * @param itemKeyIdList 物料属性ID集合
 | 
			
		||||
     * @return Map<Long, ItemKeyEntity>
 | 
			
		||||
     */
 | 
			
		||||
    public Map<Long, ItemKeyEntity> queryItemKeyList(List<Long> itemKeyIdList) {
 | 
			
		||||
        if (CollectionUtils.isEmpty(itemKeyIdList)) {
 | 
			
		||||
            return Collections.emptyMap();
 | 
			
		||||
        }
 | 
			
		||||
        itemKeyIdList = itemKeyIdList.stream().distinct().collect(Collectors.toList());
 | 
			
		||||
        Map<Long, ItemKeyEntity> itemKeyMap = Maps.newHashMap();
 | 
			
		||||
        for (Long itemKeyId : itemKeyIdList) {
 | 
			
		||||
            ItemKeyEntity itemKey = itemKeyManager.queryItemKey(itemKeyId);
 | 
			
		||||
            if (itemKey != null) {
 | 
			
		||||
                itemKeyMap.put(itemKeyId, itemKey);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return itemKeyMap;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public ItemKeyEntity queryItemKey(String orderNumber, Long itemId, String propC1) {
 | 
			
		||||
        LambdaQueryWrapper<ItemKeyEntity> queryWrapper = new LambdaQueryWrapper<>();
 | 
			
		||||
        queryWrapper.eq(ItemKeyEntity::getOrderNumber, orderNumber);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,14 +4,18 @@ 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.admin.module.business.wms.receive.asn.domain.form.BatchReceiveForm;
 | 
			
		||||
import net.lab1024.sa.admin.module.business.wms.receive.asn.domain.form.BatchReturnForm;
 | 
			
		||||
import net.lab1024.sa.base.common.domain.ResponseDTO;
 | 
			
		||||
import net.lab1024.sa.base.common.domain.ValidateList;
 | 
			
		||||
import net.lab1024.sa.base.module.support.operatelog.annotation.OperateLog;
 | 
			
		||||
import org.springframework.web.bind.annotation.PostMapping;
 | 
			
		||||
import org.springframework.web.bind.annotation.RequestBody;
 | 
			
		||||
import org.springframework.web.bind.annotation.RestController;
 | 
			
		||||
 | 
			
		||||
@RestController
 | 
			
		||||
@Tag(name = "收货")
 | 
			
		||||
@OperateLog
 | 
			
		||||
public class ReceiveController {
 | 
			
		||||
 | 
			
		||||
    @Resource
 | 
			
		||||
| 
						 | 
				
			
			@ -20,7 +24,14 @@ public class ReceiveController {
 | 
			
		|||
    @Operation(summary = "批量收货 @author 霍锦")
 | 
			
		||||
    @PostMapping("/receive/batchReceive")
 | 
			
		||||
    @SaCheckPermission("receive:batchReceive")
 | 
			
		||||
    public ResponseDTO<String> batchReceive(@RequestBody ValidateList<Long> idList) {
 | 
			
		||||
        return receiveService.batchReceive(idList);
 | 
			
		||||
    public ResponseDTO<String> batchReceive(@RequestBody BatchReceiveForm batchReceiveForm) {
 | 
			
		||||
        return receiveService.batchReceive(batchReceiveForm);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Operation(summary = "批量退货 @author 霍锦")
 | 
			
		||||
    @PostMapping("/receive/batchReturn")
 | 
			
		||||
    @SaCheckPermission("receive:batchReturn")
 | 
			
		||||
    public ResponseDTO<String> batchReturn(@RequestBody BatchReturnForm batchReturnForm) {
 | 
			
		||||
        return receiveService.batchReturn(batchReturnForm);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -18,7 +18,10 @@ import net.lab1024.sa.admin.module.business.wms.itemKey.domain.entity.ItemKeyEnt
 | 
			
		|||
import net.lab1024.sa.admin.module.business.wms.itemKey.manager.ItemKeyManager;
 | 
			
		||||
import net.lab1024.sa.admin.module.business.wms.itemKey.service.ItemKeyQueryService;
 | 
			
		||||
import net.lab1024.sa.admin.module.business.wms.itemKey.service.ItemKeyService;
 | 
			
		||||
import net.lab1024.sa.admin.module.business.wms.receive.asn.dao.AsnDao;
 | 
			
		||||
import net.lab1024.sa.admin.module.business.wms.receive.asn.domain.entity.AsnEntity;
 | 
			
		||||
import net.lab1024.sa.admin.module.business.wms.receive.asn.domain.form.BatchReceiveForm;
 | 
			
		||||
import net.lab1024.sa.admin.module.business.wms.receive.asn.domain.form.BatchReturnForm;
 | 
			
		||||
import net.lab1024.sa.admin.module.business.wms.receive.asn.service.AsnQueryService;
 | 
			
		||||
import net.lab1024.sa.admin.module.business.wms.receive.asnDetail.domain.entity.AsnDetailEntity;
 | 
			
		||||
import net.lab1024.sa.admin.module.business.wms.receive.asnDetail.domain.vo.AsnDetailVO;
 | 
			
		||||
| 
						 | 
				
			
			@ -29,6 +32,7 @@ import net.lab1024.sa.admin.module.business.wms.task.constant.TaskStatusEnum;
 | 
			
		|||
import net.lab1024.sa.admin.module.business.wms.task.constant.TaskTypeEnum;
 | 
			
		||||
import net.lab1024.sa.admin.module.business.wms.task.domain.entity.TaskEntity;
 | 
			
		||||
import net.lab1024.sa.admin.module.business.wms.task.manager.TaskManager;
 | 
			
		||||
import net.lab1024.sa.admin.module.business.wms.task.service.TaskQueryService;
 | 
			
		||||
import net.lab1024.sa.admin.module.business.wms.task.service.TaskService;
 | 
			
		||||
import net.lab1024.sa.admin.module.business.wms.itemKey.domain.entity.ItemKeyEntity;
 | 
			
		||||
import net.lab1024.sa.admin.module.business.wms.receive.asn.service.AsnQueryService;
 | 
			
		||||
| 
						 | 
				
			
			@ -46,9 +50,12 @@ import org.springframework.transaction.annotation.Transactional;
 | 
			
		|||
 | 
			
		||||
import java.math.BigDecimal;
 | 
			
		||||
import java.util.*;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
 | 
			
		||||
@Service
 | 
			
		||||
public class ReceiveService {
 | 
			
		||||
    @Resource
 | 
			
		||||
    private AsnDao asnDao;
 | 
			
		||||
 | 
			
		||||
    @Resource
 | 
			
		||||
    private AsnDetailManager asnDetailManager;
 | 
			
		||||
| 
						 | 
				
			
			@ -69,10 +76,10 @@ public class ReceiveService {
 | 
			
		|||
    private ItemQueryService itemQueryService;
 | 
			
		||||
 | 
			
		||||
    @Resource
 | 
			
		||||
    private AsnQueryService asnQueryService;
 | 
			
		||||
    private AsnDetailQueryService asnDetailQueryService;
 | 
			
		||||
 | 
			
		||||
    @Resource
 | 
			
		||||
    private AsnDetailQueryService asnDetailQueryService;
 | 
			
		||||
    private TaskQueryService taskQueryService;
 | 
			
		||||
 | 
			
		||||
    @Resource
 | 
			
		||||
    private InventoryQueryService inventoryQueryService;
 | 
			
		||||
| 
						 | 
				
			
			@ -96,25 +103,15 @@ public class ReceiveService {
 | 
			
		|||
    /**
 | 
			
		||||
     * 批量收货
 | 
			
		||||
     *
 | 
			
		||||
     * @param idList 入库明细id集合
 | 
			
		||||
     * @param batchReceiveForm 批量收货参数
 | 
			
		||||
     * @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);
 | 
			
		||||
    public ResponseDTO<String> batchReceive(BatchReceiveForm batchReceiveForm) {
 | 
			
		||||
        List<AsnDetailEntity> asnDetails = asnDetailQueryService.queryAsnDetailList(batchReceiveForm.getAsnDetailIds());
 | 
			
		||||
        if (CollectionUtils.isEmpty(asnDetails)) {
 | 
			
		||||
            return ResponseDTO.userErrorParam(UserErrorCode.PARAM_ERROR.getMsg());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return batchReceive(asnDetails, null, null);
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Transactional(rollbackFor = Exception.class)
 | 
			
		||||
    public synchronized ResponseDTO<String> batchReceive(List<AsnDetailEntity> asnDetails, String stockCode, String locationCode) {
 | 
			
		||||
        //消息提示
 | 
			
		||||
        JoinerResult joiner = JoinerResult.createJoiner();
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -122,28 +119,24 @@ public class ReceiveService {
 | 
			
		|||
        List<Long> itemIds = asnDetails.stream().map(AsnDetailEntity::getItemId).distinct().toList();
 | 
			
		||||
        Map<Long, ItemEntity> itemMap = itemQueryService.queryItemList(itemIds);
 | 
			
		||||
 | 
			
		||||
        //查询入库单
 | 
			
		||||
        List<Long> asnIds = asnDetails.stream().map(AsnDetailEntity::getAsnId).distinct().toList();
 | 
			
		||||
        Map<Long, AsnEntity> asnMap = asnQueryService.queryAsnListToMap(asnIds);
 | 
			
		||||
 | 
			
		||||
        List<AsnDetailEntity> updateToAsnDetail = new ArrayList<>();
 | 
			
		||||
        List<TaskEntity> insertToTask = new ArrayList<>();
 | 
			
		||||
        List<InventoryEntity> insertToInventory = new ArrayList<>();
 | 
			
		||||
        List<InventoryEntity> updateToInventory = new ArrayList<>();
 | 
			
		||||
 | 
			
		||||
        //库位
 | 
			
		||||
        LocationEntity dstLocation = locationQueryService.queryByLocationCode(locationCode);
 | 
			
		||||
        LocationEntity dstLocation = locationQueryService.queryByLocationCode(batchReceiveForm.getLocationCode());
 | 
			
		||||
 | 
			
		||||
        //容器
 | 
			
		||||
        StockEntity dstStock = stockQueryService.queryByStockCode(stockCode);
 | 
			
		||||
        StockEntity dstStock = stockQueryService.queryByStockCode(batchReceiveForm.getStockCode());
 | 
			
		||||
 | 
			
		||||
        //入库单
 | 
			
		||||
        AsnEntity asn = asnDao.selectById(batchReceiveForm.getAsnId());
 | 
			
		||||
 | 
			
		||||
        for (AsnDetailEntity asnDetail : asnDetails) {
 | 
			
		||||
            //物料
 | 
			
		||||
            ItemEntity item = itemMap.get(asnDetail.getItemId());
 | 
			
		||||
 | 
			
		||||
            //入库单
 | 
			
		||||
            AsnEntity asn = asnMap.get(asnDetail.getAsnId());
 | 
			
		||||
 | 
			
		||||
            if (SmartBigDecimalUtil.subtract(asnDetail.getOrderQuantity(), asnDetail.getReceivedQuantity(), 2).compareTo(BigDecimal.ZERO) == 0) {
 | 
			
		||||
                joiner.getErrorMsg().add(item.getItemCode() + "明细已收货");
 | 
			
		||||
                continue;
 | 
			
		||||
| 
						 | 
				
			
			@ -163,9 +156,15 @@ public class ReceiveService {
 | 
			
		|||
 | 
			
		||||
            //生成入库记录
 | 
			
		||||
            TaskEntity task = taskService.createTask(serialNumberService.generate(SerialNumberIdEnum.TASK), TaskStatusEnum.CREATED.getValue(), TaskTypeEnum.ASN.getValue(), asnDetail.getOrderQuantity(), itemKey.getItemKeyId(), asnDetail.getAsnDetailId(), null, null, dstStock, null, dstLocation, null, null);
 | 
			
		||||
            task.setMoveQty(task.getPlanQty());
 | 
			
		||||
            if (SmartBigDecimalUtil.subtract(task.getPlanQty(), task.getMoveQty(), 2).compareTo(BigDecimal.ZERO) == 0) {
 | 
			
		||||
                task.setStatus(TaskStatusEnum.COMPLETED.getValue());
 | 
			
		||||
            } else {
 | 
			
		||||
                task.setStatus(TaskStatusEnum.IN_PROGRESS.getValue());
 | 
			
		||||
            }
 | 
			
		||||
            insertToTask.add(task);
 | 
			
		||||
 | 
			
		||||
            //生成库存
 | 
			
		||||
            //生成库存记录
 | 
			
		||||
            InventoryEntity inventory = inventoryQueryService.queryInventory(itemKey.getItemKeyId());
 | 
			
		||||
            if (inventory == null) {
 | 
			
		||||
                inventory = inventoryService.createInventory(itemKey.getItemKeyId(), dstLocation == null ? null : dstLocation.getLocationId(), dstStock == null ? null : dstStock.getStockId(), asnDetail.getOrderQuantity());
 | 
			
		||||
| 
						 | 
				
			
			@ -176,6 +175,8 @@ public class ReceiveService {
 | 
			
		|||
                updateToInventory.add(inventory);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            //生成库存日志
 | 
			
		||||
 | 
			
		||||
            joiner.getSussMsg().add(item.getItemCode() + "收货成功");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -183,7 +184,7 @@ public class ReceiveService {
 | 
			
		|||
        batchUpdateOrInsert(updateToAsnDetail, insertToTask, insertToInventory, updateToInventory);
 | 
			
		||||
 | 
			
		||||
        //刷新入库单
 | 
			
		||||
        asnIds.forEach(asnDetailService::refreshAsn);
 | 
			
		||||
        asnDetailService.refreshAsn(batchReceiveForm.getAsnId());
 | 
			
		||||
 | 
			
		||||
        return ResponseDTOUtils.buildResponseDTO(joiner);
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -219,5 +220,100 @@ public class ReceiveService {
 | 
			
		|||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 批量退货
 | 
			
		||||
     *
 | 
			
		||||
     * @param batchReturnForm 批量退货参数
 | 
			
		||||
     * @return ResponseDTO<String>
 | 
			
		||||
     */
 | 
			
		||||
    @Transactional(rollbackFor = Exception.class)
 | 
			
		||||
    public ResponseDTO<String> batchReturn(BatchReturnForm batchReturnForm) {
 | 
			
		||||
        List<TaskEntity> tasks = taskQueryService.queryByTaskIds(batchReturnForm.getTaskIds());
 | 
			
		||||
        if (CollectionUtils.isEmpty(tasks)) {
 | 
			
		||||
            return ResponseDTO.userErrorParam(UserErrorCode.PARAM_ERROR.getMsg());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //消息提示
 | 
			
		||||
        JoinerResult joiner = JoinerResult.createJoiner();
 | 
			
		||||
 | 
			
		||||
        //查询Task任务关联的所以入库明细
 | 
			
		||||
        List<Long> asnDetailIds = tasks.stream().map(TaskEntity::getAsnDetailId).collect(Collectors.toList());
 | 
			
		||||
        Map<Long, AsnDetailEntity> asnDetailMap = asnDetailQueryService.queryAsnDetailListToMap(asnDetailIds);
 | 
			
		||||
 | 
			
		||||
        //查询物料
 | 
			
		||||
        List<Long> itemIds = asnDetailMap.values().stream().map(AsnDetailEntity::getItemId).distinct().toList();
 | 
			
		||||
        Map<Long, ItemEntity> itemMap = itemQueryService.queryItemList(itemIds);
 | 
			
		||||
 | 
			
		||||
        List<AsnDetailEntity> updateToAsnDetail = new ArrayList<>();
 | 
			
		||||
        List<TaskEntity> deleteToTask = new ArrayList<>();
 | 
			
		||||
        List<InventoryEntity> updateToInventory = new ArrayList<>();
 | 
			
		||||
        List<InventoryEntity> deleteToInventory = new ArrayList<>();
 | 
			
		||||
 | 
			
		||||
        for (TaskEntity task : tasks) {
 | 
			
		||||
            //物料
 | 
			
		||||
            ItemEntity item = itemMap.get(asnDetailMap.get(task.getAsnDetailId()).getItemId());
 | 
			
		||||
 | 
			
		||||
            //入库明细
 | 
			
		||||
            AsnDetailEntity asnDetail = asnDetailMap.get(task.getAsnDetailId());
 | 
			
		||||
            asnDetail.setReceivedQuantity(BigDecimal.ZERO);
 | 
			
		||||
            updateToAsnDetail.add(asnDetail);
 | 
			
		||||
 | 
			
		||||
            //删除task
 | 
			
		||||
            deleteToTask.add(task);
 | 
			
		||||
 | 
			
		||||
            //库存数退回
 | 
			
		||||
            InventoryEntity inventory = inventoryQueryService.queryInventory(task.getItemKeyId());
 | 
			
		||||
            if (inventory != null) {
 | 
			
		||||
                inventory.setQuantity(SmartBigDecimalUtil.subtract(inventory.getQuantity(), task.getPlanQty(), 2));
 | 
			
		||||
                if (inventory.getQuantity().compareTo(BigDecimal.ZERO) == 0) {
 | 
			
		||||
                    deleteToInventory.add(inventory);
 | 
			
		||||
                } else {
 | 
			
		||||
                    updateToInventory.add(inventory);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            //生成库存日志
 | 
			
		||||
 | 
			
		||||
            joiner.getSussMsg().add(item.getItemCode() + "退货成功");
 | 
			
		||||
        }
 | 
			
		||||
        //批量操作
 | 
			
		||||
        returnUpdateOrInsert(updateToAsnDetail, deleteToTask, updateToInventory, deleteToInventory);
 | 
			
		||||
 | 
			
		||||
        //刷新入库单
 | 
			
		||||
        asnDetailService.refreshAsn(batchReturnForm.getAsnId());
 | 
			
		||||
 | 
			
		||||
        return ResponseDTOUtils.buildResponseDTO(joiner);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 批量更新或新增
 | 
			
		||||
     *
 | 
			
		||||
     * @param updateToAsnDetail 更新入库明细
 | 
			
		||||
     * @param deleteToTask      删除task
 | 
			
		||||
     * @param updateToInventory 更新库存
 | 
			
		||||
     * @param deleteToInventory 删除库存
 | 
			
		||||
     */
 | 
			
		||||
    private void returnUpdateOrInsert(List<AsnDetailEntity> updateToAsnDetail, List<TaskEntity> deleteToTask, List<InventoryEntity> updateToInventory, List<InventoryEntity> deleteToInventory) {
 | 
			
		||||
        //批量更新入库明细
 | 
			
		||||
        if (CollectionUtils.isNotEmpty(updateToAsnDetail)) {
 | 
			
		||||
            asnDetailManager.updateBatchById(updateToAsnDetail);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //批量删除入库记录
 | 
			
		||||
        if (CollectionUtils.isNotEmpty(deleteToTask)) {
 | 
			
		||||
            taskManager.removeBatchByIds(deleteToTask);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //批量更新库存
 | 
			
		||||
        if (CollectionUtils.isNotEmpty(updateToInventory)) {
 | 
			
		||||
            inventoryManager.updateBatchById(updateToInventory);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //批量删除库存
 | 
			
		||||
        if (CollectionUtils.isNotEmpty(deleteToInventory)) {
 | 
			
		||||
            inventoryManager.removeBatchByIds(deleteToInventory);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -12,6 +12,7 @@ import net.lab1024.sa.admin.module.business.wms.receive.asn.service.AsnQueryServ
 | 
			
		|||
import net.lab1024.sa.base.common.domain.RequestUser;
 | 
			
		||||
import net.lab1024.sa.base.common.domain.ValidateList;
 | 
			
		||||
import net.lab1024.sa.base.common.util.SmartRequestUtil;
 | 
			
		||||
import net.lab1024.sa.base.module.support.operatelog.annotation.OperateLog;
 | 
			
		||||
import net.lab1024.sa.base.module.support.serialnumber.constant.SerialNumberIdEnum;
 | 
			
		||||
import net.lab1024.sa.base.module.support.serialnumber.service.SerialNumberService;
 | 
			
		||||
import org.springframework.web.bind.annotation.*;
 | 
			
		||||
| 
						 | 
				
			
			@ -33,6 +34,7 @@ import jakarta.validation.Valid;
 | 
			
		|||
 | 
			
		||||
@RestController
 | 
			
		||||
@Tag(name = "入库单")
 | 
			
		||||
@OperateLog
 | 
			
		||||
public class AsnController {
 | 
			
		||||
 | 
			
		||||
    @Resource
 | 
			
		||||
| 
						 | 
				
			
			@ -41,9 +43,6 @@ public class AsnController {
 | 
			
		|||
    @Resource
 | 
			
		||||
    private AsnQueryService asnQueryService;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    @Operation(summary = "分页查询 @author 霍锦")
 | 
			
		||||
    @PostMapping("/asn/queryPage")
 | 
			
		||||
    @SaCheckPermission("asn:query")
 | 
			
		||||
    public ResponseDTO<PageResult<AsnVO>> queryPage(@RequestBody @Valid AsnQueryForm queryForm) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,28 @@
 | 
			
		|||
package net.lab1024.sa.admin.module.business.wms.receive.asn.domain.form;
 | 
			
		||||
 | 
			
		||||
import io.swagger.v3.oas.annotations.media.Schema;
 | 
			
		||||
import jakarta.validation.constraints.NotNull;
 | 
			
		||||
import lombok.Data;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
@Data
 | 
			
		||||
public class BatchReceiveForm {
 | 
			
		||||
 | 
			
		||||
    @Schema(description = "入库单", requiredMode = Schema.RequiredMode.REQUIRED)
 | 
			
		||||
    @NotNull(message = "入库单 不能为空")
 | 
			
		||||
    private Long asnId;
 | 
			
		||||
 | 
			
		||||
    @Schema(description = "入库明细", requiredMode = Schema.RequiredMode.REQUIRED)
 | 
			
		||||
    @NotNull(message = "入库明细 不能为空")
 | 
			
		||||
    private List<Long> asnDetailIds;
 | 
			
		||||
 | 
			
		||||
    @Schema(description = "容器", requiredMode = Schema.RequiredMode.REQUIRED)
 | 
			
		||||
    @NotNull(message = "容器 不能为空")
 | 
			
		||||
    private String stockCode;
 | 
			
		||||
 | 
			
		||||
    @Schema(description = "库位", requiredMode = Schema.RequiredMode.REQUIRED)
 | 
			
		||||
    @NotNull(message = "库位 不能为空")
 | 
			
		||||
    private String locationCode;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,18 @@
 | 
			
		|||
package net.lab1024.sa.admin.module.business.wms.receive.asn.domain.form;
 | 
			
		||||
 | 
			
		||||
import io.swagger.v3.oas.annotations.media.Schema;
 | 
			
		||||
import jakarta.validation.constraints.NotNull;
 | 
			
		||||
import lombok.Data;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
@Data
 | 
			
		||||
public class BatchReturnForm {
 | 
			
		||||
    @Schema(description = "入库单", requiredMode = Schema.RequiredMode.REQUIRED)
 | 
			
		||||
    @NotNull(message = "入库单 不能为空")
 | 
			
		||||
    private Long asnId;
 | 
			
		||||
 | 
			
		||||
    @Schema(description = "收货明细", requiredMode = Schema.RequiredMode.REQUIRED)
 | 
			
		||||
    @NotNull(message = "收货明细 不能为空")
 | 
			
		||||
    private List<Long> taskIds;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -30,6 +30,8 @@ import net.lab1024.sa.base.common.util.SmartPageUtil;
 | 
			
		|||
import net.lab1024.sa.base.common.domain.ResponseDTO;
 | 
			
		||||
import net.lab1024.sa.base.common.domain.PageResult;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 | 
			
		||||
import net.lab1024.sa.base.module.support.datatracer.constant.DataTracerTypeEnum;
 | 
			
		||||
import net.lab1024.sa.base.module.support.datatracer.service.DataTracerService;
 | 
			
		||||
import net.lab1024.sa.base.module.support.serialnumber.constant.SerialNumberIdEnum;
 | 
			
		||||
import net.lab1024.sa.base.module.support.serialnumber.service.SerialNumberService;
 | 
			
		||||
import org.apache.commons.collections4.CollectionUtils;
 | 
			
		||||
| 
						 | 
				
			
			@ -67,6 +69,9 @@ public class AsnService {
 | 
			
		|||
    @Resource
 | 
			
		||||
    private SerialNumberService serialNumberService;
 | 
			
		||||
 | 
			
		||||
    @Resource
 | 
			
		||||
    private DataTracerService dataTracerService;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 添加
 | 
			
		||||
     *
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -22,6 +22,7 @@ import net.lab1024.sa.base.common.util.SmartPageUtil;
 | 
			
		|||
import org.apache.commons.collections4.CollectionUtils;
 | 
			
		||||
import org.springframework.stereotype.Service;
 | 
			
		||||
 | 
			
		||||
import java.util.Collections;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
| 
						 | 
				
			
			@ -101,8 +102,22 @@ public class AsnDetailQueryService {
 | 
			
		|||
        if (CollectionUtils.isEmpty(idList)) {
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
        LambdaQueryWrapper<AsnDetailEntity> queryWrapper = new LambdaQueryWrapper<>();
 | 
			
		||||
        queryWrapper.in(AsnDetailEntity::getAsnDetailId, idList);
 | 
			
		||||
        return asnDetailDao.selectList(queryWrapper);
 | 
			
		||||
        return asnDetailDao.selectBatchIds(idList);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 根据明细集合查询明细信息
 | 
			
		||||
     *
 | 
			
		||||
     * @param idList 明细集合
 | 
			
		||||
     * @return Map<String, AsnDetailEntity>
 | 
			
		||||
     */
 | 
			
		||||
    public Map<Long, AsnDetailEntity> queryAsnDetailListToMap(List<Long> idList) {
 | 
			
		||||
        if (CollectionUtils.isEmpty(idList)) {
 | 
			
		||||
            return Collections.emptyMap();
 | 
			
		||||
        }
 | 
			
		||||
        List<AsnDetailEntity> asnDetails = queryAsnDetailList(idList);
 | 
			
		||||
        return asnDetails.stream()
 | 
			
		||||
                .collect(Collectors.toMap(AsnDetailEntity::getAsnDetailId, asnDetail -> asnDetail, (existing, replacement) -> existing));
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -38,6 +38,12 @@ public class TaskVO {
 | 
			
		|||
    @Schema(description = "物料序号")
 | 
			
		||||
    private Long itemKeyId;
 | 
			
		||||
 | 
			
		||||
    @Schema(description = "物料编码")
 | 
			
		||||
    private String itemCode;
 | 
			
		||||
 | 
			
		||||
    @Schema(description = "物料名称")
 | 
			
		||||
    private String itemName;
 | 
			
		||||
 | 
			
		||||
    @Schema(description = "收货明细序号")
 | 
			
		||||
    private Long asnDetailId;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -53,21 +59,21 @@ public class TaskVO {
 | 
			
		|||
    @Schema(description = "目标容器")
 | 
			
		||||
    private Long dstStockId;
 | 
			
		||||
 | 
			
		||||
    @Schema(description = "目标容器编码")
 | 
			
		||||
    private String dstStockCode;
 | 
			
		||||
 | 
			
		||||
    @Schema(description = "原点位")
 | 
			
		||||
    private Long srcLocationId;
 | 
			
		||||
 | 
			
		||||
    @Schema(description = "原库位编码")
 | 
			
		||||
    private String srcLocationCode;
 | 
			
		||||
 | 
			
		||||
    @Schema(description = "目标点位")
 | 
			
		||||
    private Long dstLocationId;
 | 
			
		||||
 | 
			
		||||
    @Schema(description = "目标库位编码")
 | 
			
		||||
    private String dstLocationCode;
 | 
			
		||||
 | 
			
		||||
    @Schema(description = "原库位编码")
 | 
			
		||||
    private String srcLocationCode;
 | 
			
		||||
 | 
			
		||||
    @Schema(description = "目标容器编码")
 | 
			
		||||
    private String dstStockCode;
 | 
			
		||||
 | 
			
		||||
    @Schema(description = "库存ID")
 | 
			
		||||
    private Long inventoryId;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -80,16 +86,4 @@ public class TaskVO {
 | 
			
		|||
    @Schema(description = "创建时间")
 | 
			
		||||
    private LocalDateTime createTime;
 | 
			
		||||
 | 
			
		||||
    @Schema(description = "完成时间")
 | 
			
		||||
    private LocalDateTime endTime;
 | 
			
		||||
 | 
			
		||||
    @Schema(description = "创建人ID")
 | 
			
		||||
    private Long createUserId;
 | 
			
		||||
 | 
			
		||||
    @Schema(description = "创建人")
 | 
			
		||||
    private String createUserName;
 | 
			
		||||
 | 
			
		||||
    @Schema(description = "更新时间")
 | 
			
		||||
    private LocalDateTime updateTime;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,7 +2,16 @@ package net.lab1024.sa.admin.module.business.wms.task.service;
 | 
			
		|||
 | 
			
		||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 | 
			
		||||
import jakarta.annotation.Resource;
 | 
			
		||||
import net.lab1024.sa.admin.module.business.wms.base.area.domain.entity.AreaEntity;
 | 
			
		||||
import net.lab1024.sa.admin.module.business.wms.base.item.domain.entity.ItemEntity;
 | 
			
		||||
import net.lab1024.sa.admin.module.business.wms.base.item.service.ItemQueryService;
 | 
			
		||||
import net.lab1024.sa.admin.module.business.wms.base.location.domain.entity.LocationEntity;
 | 
			
		||||
import net.lab1024.sa.admin.module.business.wms.base.stock.domain.vo.StockVO;
 | 
			
		||||
import net.lab1024.sa.admin.module.business.wms.itemKey.domain.entity.ItemKeyEntity;
 | 
			
		||||
import net.lab1024.sa.admin.module.business.wms.itemKey.manager.ItemKeyManager;
 | 
			
		||||
import net.lab1024.sa.admin.module.business.wms.itemKey.service.ItemKeyQueryService;
 | 
			
		||||
import net.lab1024.sa.admin.module.business.wms.task.dao.TaskDao;
 | 
			
		||||
import net.lab1024.sa.admin.module.business.wms.task.domain.entity.TaskEntity;
 | 
			
		||||
import net.lab1024.sa.admin.module.business.wms.task.domain.form.TaskQueryForm;
 | 
			
		||||
import net.lab1024.sa.admin.module.business.wms.task.domain.vo.TaskVO;
 | 
			
		||||
import net.lab1024.sa.base.common.domain.PageResult;
 | 
			
		||||
| 
						 | 
				
			
			@ -10,6 +19,8 @@ import net.lab1024.sa.base.common.util.SmartPageUtil;
 | 
			
		|||
import org.springframework.stereotype.Service;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
 | 
			
		||||
@Service
 | 
			
		||||
public class TaskQueryService {
 | 
			
		||||
| 
						 | 
				
			
			@ -17,14 +28,49 @@ public class TaskQueryService {
 | 
			
		|||
    @Resource
 | 
			
		||||
    private TaskDao taskDao;
 | 
			
		||||
 | 
			
		||||
    @Resource
 | 
			
		||||
    private ItemQueryService itemQueryService;
 | 
			
		||||
 | 
			
		||||
    @Resource
 | 
			
		||||
    private ItemKeyQueryService itemKeyQueryService;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 分页查询
 | 
			
		||||
     */
 | 
			
		||||
    public PageResult<TaskVO> queryPage(TaskQueryForm queryForm) {
 | 
			
		||||
        Page<?> page = SmartPageUtil.convert2PageQuery(queryForm);
 | 
			
		||||
        List<TaskVO> list = taskDao.queryPage(page, queryForm);
 | 
			
		||||
 | 
			
		||||
        // 查询物料属性
 | 
			
		||||
        List<Long> itemKeyIds = list.stream().map(TaskVO::getItemKeyId).distinct().collect(Collectors.toList());
 | 
			
		||||
        Map<Long, ItemKeyEntity> itemKeyMap = itemKeyQueryService.queryItemKeyList(itemKeyIds);
 | 
			
		||||
 | 
			
		||||
        //查询物料
 | 
			
		||||
        List<Long> itemIds = itemKeyMap.values().stream().map(ItemKeyEntity::getItemId).distinct().toList();
 | 
			
		||||
        Map<Long, ItemEntity> itemMap = itemQueryService.queryItemList(itemIds);
 | 
			
		||||
 | 
			
		||||
        list.forEach(TaskVO -> {
 | 
			
		||||
            ItemKeyEntity itemKey = itemKeyMap.get(TaskVO.getItemKeyId());
 | 
			
		||||
            if (itemKey != null) {
 | 
			
		||||
                ItemEntity item = itemMap.get(itemKey.getItemId());
 | 
			
		||||
                if (item != null) {
 | 
			
		||||
                    TaskVO.setItemCode(item.getItemCode());
 | 
			
		||||
                    TaskVO.setItemName(item.getItemName());
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        return SmartPageUtil.convert2PageResult(page, list);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 根据任务ID集合查询
 | 
			
		||||
     * @param taskIds 任务ID集合
 | 
			
		||||
     * @return List<TaskEntity>
 | 
			
		||||
     */
 | 
			
		||||
    public List<TaskEntity> queryByTaskIds(List<Long> taskIds) {
 | 
			
		||||
        return taskDao.selectBatchIds(taskIds);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,7 +4,10 @@
 | 
			
		|||
 | 
			
		||||
    <!-- 查询结果列 -->
 | 
			
		||||
    <sql id="base_columns">
 | 
			
		||||
        t_task.task_id,
 | 
			
		||||
        t_task
 | 
			
		||||
        .
 | 
			
		||||
        task_id
 | 
			
		||||
        ,
 | 
			
		||||
        t_task.bill_code,
 | 
			
		||||
        t_task.status,
 | 
			
		||||
        t_task.task_type,
 | 
			
		||||
| 
						 | 
				
			
			@ -39,7 +42,7 @@
 | 
			
		|||
        <where>
 | 
			
		||||
            <!--入库单-->
 | 
			
		||||
            <if test="queryForm.asnId != null ">
 | 
			
		||||
                AND t_task.asn_detail_id=#{queryForm.asnId}
 | 
			
		||||
                AND t_task.asn_detail_id in (select asn_detail_id from t_asn_detail where asn_id = #{queryForm.asnId})
 | 
			
		||||
            </if>
 | 
			
		||||
        </where>
 | 
			
		||||
    </select>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -35,6 +35,8 @@ public enum DataTracerTypeEnum implements BaseEnum {
 | 
			
		|||
 | 
			
		||||
    ;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    private final Integer value;
 | 
			
		||||
 | 
			
		||||
    private final String desc;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue