批量退货

main
HUOJIN\92525 2025-04-08 17:59:10 +08:00
parent 914d45a479
commit 104d17606a
14 changed files with 327 additions and 54 deletions

View File

@ -66,4 +66,8 @@ public class AdminCacheConst extends CacheKeyConst {
public static final String CUSTOMER_ENTITY = "customer_cache"; public static final String CUSTOMER_ENTITY = "customer_cache";
} }
public static class itemKey {
public static final String ITEM_KEY_ENTITY = "item_key_cache";
}
} }

View File

@ -1,11 +1,18 @@
package net.lab1024.sa.admin.module.business.wms.itemKey.manager; 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.domain.entity.ItemKeyEntity;
import net.lab1024.sa.admin.module.business.wms.itemKey.dao.ItemKeyDao; import net.lab1024.sa.admin.module.business.wms.itemKey.dao.ItemKeyDao;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 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.dao.ItemKeyDao;
import net.lab1024.sa.admin.module.business.wms.itemKey.domain.entity.ItemKeyEntity; 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; import org.springframework.stereotype.Service;
/** /**
@ -16,7 +23,22 @@ import org.springframework.stereotype.Service;
* @Copyright * @Copyright
*/ */
@Service @Service
@Slf4j
public class ItemKeyManager extends ServiceImpl<ItemKeyDao, ItemKeyEntity> { 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);
}
} }

View File

@ -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.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.google.common.collect.Maps;
import jakarta.annotation.Resource; 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.dao.ItemKeyDao;
import net.lab1024.sa.admin.module.business.wms.itemKey.domain.entity.ItemKeyEntity; 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.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.entity.ItemKeyEntity;
import net.lab1024.sa.admin.module.business.wms.itemKey.domain.form.ItemKeyQueryForm; 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.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.domain.PageResult;
import net.lab1024.sa.base.common.util.SmartPageUtil; import net.lab1024.sa.base.common.util.SmartPageUtil;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Service @Service
public class ItemKeyQueryService { public class ItemKeyQueryService {
@ -24,6 +30,9 @@ public class ItemKeyQueryService {
@Resource @Resource
private ItemKeyDao itemKeyDao; private ItemKeyDao itemKeyDao;
@Resource
private ItemKeyManager itemKeyManager;
/** /**
* *
*/ */
@ -33,6 +42,27 @@ public class ItemKeyQueryService {
return SmartPageUtil.convert2PageResult(page, list); 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) { public ItemKeyEntity queryItemKey(String orderNumber, Long itemId, String propC1) {
LambdaQueryWrapper<ItemKeyEntity> queryWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<ItemKeyEntity> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(ItemKeyEntity::getOrderNumber, orderNumber); queryWrapper.eq(ItemKeyEntity::getOrderNumber, orderNumber);

View File

@ -4,14 +4,18 @@ import cn.dev33.satoken.annotation.SaCheckPermission;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource; 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.ResponseDTO;
import net.lab1024.sa.base.common.domain.ValidateList; 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.PostMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
@RestController @RestController
@Tag(name = "收货") @Tag(name = "收货")
@OperateLog
public class ReceiveController { public class ReceiveController {
@Resource @Resource
@ -20,7 +24,14 @@ public class ReceiveController {
@Operation(summary = "批量收货 @author 霍锦") @Operation(summary = "批量收货 @author 霍锦")
@PostMapping("/receive/batchReceive") @PostMapping("/receive/batchReceive")
@SaCheckPermission("receive:batchReceive") @SaCheckPermission("receive:batchReceive")
public ResponseDTO<String> batchReceive(@RequestBody ValidateList<Long> idList) { public ResponseDTO<String> batchReceive(@RequestBody BatchReceiveForm batchReceiveForm) {
return receiveService.batchReceive(idList); return receiveService.batchReceive(batchReceiveForm);
}
@Operation(summary = "批量退货 @author 霍锦")
@PostMapping("/receive/batchReturn")
@SaCheckPermission("receive:batchReturn")
public ResponseDTO<String> batchReturn(@RequestBody BatchReturnForm batchReturnForm) {
return receiveService.batchReturn(batchReturnForm);
} }
} }

View File

@ -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.manager.ItemKeyManager;
import net.lab1024.sa.admin.module.business.wms.itemKey.service.ItemKeyQueryService; 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.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.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.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.entity.AsnDetailEntity;
import net.lab1024.sa.admin.module.business.wms.receive.asnDetail.domain.vo.AsnDetailVO; 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.constant.TaskTypeEnum;
import net.lab1024.sa.admin.module.business.wms.task.domain.entity.TaskEntity; 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.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.task.service.TaskService;
import net.lab1024.sa.admin.module.business.wms.itemKey.domain.entity.ItemKeyEntity; import net.lab1024.sa.admin.module.business.wms.itemKey.domain.entity.ItemKeyEntity;
import net.lab1024.sa.admin.module.business.wms.receive.asn.service.AsnQueryService; 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.math.BigDecimal;
import java.util.*; import java.util.*;
import java.util.stream.Collectors;
@Service @Service
public class ReceiveService { public class ReceiveService {
@Resource
private AsnDao asnDao;
@Resource @Resource
private AsnDetailManager asnDetailManager; private AsnDetailManager asnDetailManager;
@ -69,10 +76,10 @@ public class ReceiveService {
private ItemQueryService itemQueryService; private ItemQueryService itemQueryService;
@Resource @Resource
private AsnQueryService asnQueryService; private AsnDetailQueryService asnDetailQueryService;
@Resource @Resource
private AsnDetailQueryService asnDetailQueryService; private TaskQueryService taskQueryService;
@Resource @Resource
private InventoryQueryService inventoryQueryService; private InventoryQueryService inventoryQueryService;
@ -96,25 +103,15 @@ public class ReceiveService {
/** /**
* *
* *
* @param idList id * @param batchReceiveForm
* @return ResponseDTO<String> * @return ResponseDTO<String>
*/ */
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public ResponseDTO<String> batchReceive(List<Long> idList) { public ResponseDTO<String> batchReceive(BatchReceiveForm batchReceiveForm) {
if (CollectionUtils.isEmpty(idList)) { List<AsnDetailEntity> asnDetails = asnDetailQueryService.queryAsnDetailList(batchReceiveForm.getAsnDetailIds());
return ResponseDTO.userErrorParam(UserErrorCode.PARAM_ERROR.getMsg());
}
List<AsnDetailEntity> asnDetails = asnDetailQueryService.queryAsnDetailList(idList);
if (CollectionUtils.isEmpty(asnDetails)) { if (CollectionUtils.isEmpty(asnDetails)) {
return ResponseDTO.userErrorParam(UserErrorCode.PARAM_ERROR.getMsg()); 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(); JoinerResult joiner = JoinerResult.createJoiner();
@ -122,28 +119,24 @@ public class ReceiveService {
List<Long> itemIds = asnDetails.stream().map(AsnDetailEntity::getItemId).distinct().toList(); List<Long> itemIds = asnDetails.stream().map(AsnDetailEntity::getItemId).distinct().toList();
Map<Long, ItemEntity> itemMap = itemQueryService.queryItemList(itemIds); 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<AsnDetailEntity> updateToAsnDetail = new ArrayList<>();
List<TaskEntity> insertToTask = new ArrayList<>(); List<TaskEntity> insertToTask = new ArrayList<>();
List<InventoryEntity> insertToInventory = new ArrayList<>(); List<InventoryEntity> insertToInventory = new ArrayList<>();
List<InventoryEntity> updateToInventory = 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) { for (AsnDetailEntity asnDetail : asnDetails) {
//物料 //物料
ItemEntity item = itemMap.get(asnDetail.getItemId()); ItemEntity item = itemMap.get(asnDetail.getItemId());
//入库单
AsnEntity asn = asnMap.get(asnDetail.getAsnId());
if (SmartBigDecimalUtil.subtract(asnDetail.getOrderQuantity(), asnDetail.getReceivedQuantity(), 2).compareTo(BigDecimal.ZERO) == 0) { if (SmartBigDecimalUtil.subtract(asnDetail.getOrderQuantity(), asnDetail.getReceivedQuantity(), 2).compareTo(BigDecimal.ZERO) == 0) {
joiner.getErrorMsg().add(item.getItemCode() + "明细已收货"); joiner.getErrorMsg().add(item.getItemCode() + "明细已收货");
continue; 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); 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); insertToTask.add(task);
//生成库存 //生成库存记录
InventoryEntity inventory = inventoryQueryService.queryInventory(itemKey.getItemKeyId()); InventoryEntity inventory = inventoryQueryService.queryInventory(itemKey.getItemKeyId());
if (inventory == null) { if (inventory == null) {
inventory = inventoryService.createInventory(itemKey.getItemKeyId(), dstLocation == null ? null : dstLocation.getLocationId(), dstStock == null ? null : dstStock.getStockId(), asnDetail.getOrderQuantity()); 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); updateToInventory.add(inventory);
} }
//生成库存日志
joiner.getSussMsg().add(item.getItemCode() + "收货成功"); joiner.getSussMsg().add(item.getItemCode() + "收货成功");
} }
@ -183,7 +184,7 @@ public class ReceiveService {
batchUpdateOrInsert(updateToAsnDetail, insertToTask, insertToInventory, updateToInventory); batchUpdateOrInsert(updateToAsnDetail, insertToTask, insertToInventory, updateToInventory);
//刷新入库单 //刷新入库单
asnIds.forEach(asnDetailService::refreshAsn); asnDetailService.refreshAsn(batchReceiveForm.getAsnId());
return ResponseDTOUtils.buildResponseDTO(joiner); 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);
}
}
} }

View File

@ -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.RequestUser;
import net.lab1024.sa.base.common.domain.ValidateList; import net.lab1024.sa.base.common.domain.ValidateList;
import net.lab1024.sa.base.common.util.SmartRequestUtil; 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.constant.SerialNumberIdEnum;
import net.lab1024.sa.base.module.support.serialnumber.service.SerialNumberService; import net.lab1024.sa.base.module.support.serialnumber.service.SerialNumberService;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@ -33,6 +34,7 @@ import jakarta.validation.Valid;
@RestController @RestController
@Tag(name = "入库单") @Tag(name = "入库单")
@OperateLog
public class AsnController { public class AsnController {
@Resource @Resource
@ -41,9 +43,6 @@ public class AsnController {
@Resource @Resource
private AsnQueryService asnQueryService; private AsnQueryService asnQueryService;
@Operation(summary = "分页查询 @author 霍锦")
@PostMapping("/asn/queryPage") @PostMapping("/asn/queryPage")
@SaCheckPermission("asn:query") @SaCheckPermission("asn:query")
public ResponseDTO<PageResult<AsnVO>> queryPage(@RequestBody @Valid AsnQueryForm queryForm) { public ResponseDTO<PageResult<AsnVO>> queryPage(@RequestBody @Valid AsnQueryForm queryForm) {

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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.ResponseDTO;
import net.lab1024.sa.base.common.domain.PageResult; import net.lab1024.sa.base.common.domain.PageResult;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 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.constant.SerialNumberIdEnum;
import net.lab1024.sa.base.module.support.serialnumber.service.SerialNumberService; import net.lab1024.sa.base.module.support.serialnumber.service.SerialNumberService;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
@ -67,6 +69,9 @@ public class AsnService {
@Resource @Resource
private SerialNumberService serialNumberService; private SerialNumberService serialNumberService;
@Resource
private DataTracerService dataTracerService;
/** /**
* *
* *

View File

@ -22,6 +22,7 @@ import net.lab1024.sa.base.common.util.SmartPageUtil;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -101,8 +102,22 @@ public class AsnDetailQueryService {
if (CollectionUtils.isEmpty(idList)) { if (CollectionUtils.isEmpty(idList)) {
return null; return null;
} }
LambdaQueryWrapper<AsnDetailEntity> queryWrapper = new LambdaQueryWrapper<>(); return asnDetailDao.selectBatchIds(idList);
queryWrapper.in(AsnDetailEntity::getAsnDetailId, idList); }
return asnDetailDao.selectList(queryWrapper);
/**
*
*
* @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));
} }
} }

View File

@ -38,6 +38,12 @@ public class TaskVO {
@Schema(description = "物料序号") @Schema(description = "物料序号")
private Long itemKeyId; private Long itemKeyId;
@Schema(description = "物料编码")
private String itemCode;
@Schema(description = "物料名称")
private String itemName;
@Schema(description = "收货明细序号") @Schema(description = "收货明细序号")
private Long asnDetailId; private Long asnDetailId;
@ -53,21 +59,21 @@ public class TaskVO {
@Schema(description = "目标容器") @Schema(description = "目标容器")
private Long dstStockId; private Long dstStockId;
@Schema(description = "目标容器编码")
private String dstStockCode;
@Schema(description = "原点位") @Schema(description = "原点位")
private Long srcLocationId; private Long srcLocationId;
@Schema(description = "原库位编码")
private String srcLocationCode;
@Schema(description = "目标点位") @Schema(description = "目标点位")
private Long dstLocationId; private Long dstLocationId;
@Schema(description = "目标库位编码") @Schema(description = "目标库位编码")
private String dstLocationCode; private String dstLocationCode;
@Schema(description = "原库位编码")
private String srcLocationCode;
@Schema(description = "目标容器编码")
private String dstStockCode;
@Schema(description = "库存ID") @Schema(description = "库存ID")
private Long inventoryId; private Long inventoryId;
@ -80,16 +86,4 @@ public class TaskVO {
@Schema(description = "创建时间") @Schema(description = "创建时间")
private LocalDateTime createTime; private LocalDateTime createTime;
@Schema(description = "完成时间")
private LocalDateTime endTime;
@Schema(description = "创建人ID")
private Long createUserId;
@Schema(description = "创建人")
private String createUserName;
@Schema(description = "更新时间")
private LocalDateTime updateTime;
} }

View File

@ -2,7 +2,16 @@ package net.lab1024.sa.admin.module.business.wms.task.service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import jakarta.annotation.Resource; 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.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.form.TaskQueryForm;
import net.lab1024.sa.admin.module.business.wms.task.domain.vo.TaskVO; import net.lab1024.sa.admin.module.business.wms.task.domain.vo.TaskVO;
import net.lab1024.sa.base.common.domain.PageResult; 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 org.springframework.stereotype.Service;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Service @Service
public class TaskQueryService { public class TaskQueryService {
@ -17,14 +28,49 @@ public class TaskQueryService {
@Resource @Resource
private TaskDao taskDao; private TaskDao taskDao;
@Resource
private ItemQueryService itemQueryService;
@Resource
private ItemKeyQueryService itemKeyQueryService;
/** /**
* *
*/ */
public PageResult<TaskVO> queryPage(TaskQueryForm queryForm) { public PageResult<TaskVO> queryPage(TaskQueryForm queryForm) {
Page<?> page = SmartPageUtil.convert2PageQuery(queryForm); Page<?> page = SmartPageUtil.convert2PageQuery(queryForm);
List<TaskVO> list = taskDao.queryPage(page, 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); return SmartPageUtil.convert2PageResult(page, list);
} }
/**
* ID
* @param taskIds ID
* @return List<TaskEntity>
*/
public List<TaskEntity> queryByTaskIds(List<Long> taskIds) {
return taskDao.selectBatchIds(taskIds);
}
} }

View File

@ -4,7 +4,10 @@
<!-- 查询结果列 --> <!-- 查询结果列 -->
<sql id="base_columns"> <sql id="base_columns">
t_task.task_id, t_task
.
task_id
,
t_task.bill_code, t_task.bill_code,
t_task.status, t_task.status,
t_task.task_type, t_task.task_type,
@ -39,7 +42,7 @@
<where> <where>
<!--入库单--> <!--入库单-->
<if test="queryForm.asnId != null "> <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> </if>
</where> </where>
</select> </select>

View File

@ -35,6 +35,8 @@ public enum DataTracerTypeEnum implements BaseEnum {
; ;
private final Integer value; private final Integer value;
private final String desc; private final String desc;