增加出库模块 出库单、出库明细管理

main
HUOJIN\92525 2025-04-25 15:18:48 +08:00
parent 728129555c
commit 7692f42934
47 changed files with 2147 additions and 289 deletions

View File

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

View File

@ -1,96 +1,20 @@
package net.lab1024.sa.admin.module.business.wms.inventory.inventory.service;
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.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.location.service.LocationQueryService;
import net.lab1024.sa.admin.module.business.wms.base.stock.domain.entity.StockEntity;
import net.lab1024.sa.admin.module.business.wms.base.stock.service.StockQueryService;
import net.lab1024.sa.admin.module.business.wms.inventory.inventory.dao.InventoryDao;
import net.lab1024.sa.admin.module.business.wms.inventory.inventory.domain.entity.InventoryEntity;
import net.lab1024.sa.admin.module.business.wms.inventory.inventory.domain.form.InventoryQueryForm;
import net.lab1024.sa.admin.module.business.wms.inventory.inventory.domain.vo.InventoryVO;
import net.lab1024.sa.admin.module.business.wms.inventory.itemKey.domain.entity.ItemKeyEntity;
import net.lab1024.sa.admin.module.business.wms.inventory.itemKey.service.ItemKeyQueryService;
import net.lab1024.sa.base.common.domain.PageResult;
import net.lab1024.sa.base.common.util.SmartPageUtil;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
@Service
public class InventoryQueryService {
@Resource
private InventoryDao inventoryDao;
@Resource
private ItemQueryService itemQueryService;
@Resource
private StockQueryService stockQueryService;
@Resource
private LocationQueryService locationQueryService;
@Resource
private ItemKeyQueryService itemKeyQueryService;
public interface InventoryQueryService {
/**
*
*/
public PageResult<InventoryVO> queryPage(InventoryQueryForm queryForm) {
Page<?> page = SmartPageUtil.convert2PageQuery(queryForm);
List<InventoryVO> list = inventoryDao.queryPage(page, queryForm);
// 查询物料属性
List<Long> itemKeyIds = list.stream().map(InventoryVO::getItemKeyId).toList();
Map<Long, ItemKeyEntity> itemKeyMap = itemKeyQueryService.queryByItemKeyIds(itemKeyIds);
//查询物料
List<Long> itemIds = itemKeyMap.values().stream().map(ItemKeyEntity::getItemId).toList();
Map<Long, ItemEntity> itemMap = itemQueryService.queryByItemIdsToMap(itemIds);
//查询容器
List<Long> stockIds = list.stream().map(InventoryVO::getStockId).toList();
Map<Long, StockEntity> stockMap = stockQueryService.queryByStockIdsToMap(stockIds);
//查询库位
List<Long> locationIds = list.stream().map(InventoryVO::getLocationId).toList();
Map<Long, LocationEntity> locationMap = locationQueryService.queryByLocationIdsToMap(locationIds);
list.forEach(InventoryVO -> {
ItemKeyEntity itemKey = itemKeyMap.get(InventoryVO.getItemKeyId());
if (itemKey != null) {
ItemEntity item = itemMap.get(itemKey.getItemId());
if (item != null) {
InventoryVO.setItemCode(item.getItemCode());
InventoryVO.setItemName(item.getItemName());
}
}
StockEntity stock = stockMap.get(InventoryVO.getStockId());
if (stock != null) {
InventoryVO.setStockCode(stock.getStockCode());
}
LocationEntity location = locationMap.get(InventoryVO.getLocationId());
if (location != null) {
InventoryVO.setLocationCode(location.getLocationCode());
}
});
return SmartPageUtil.convert2PageResult(page, list);
}
PageResult<InventoryVO> queryPage(InventoryQueryForm queryForm);
/**
* @param ItemKeyId
* @return InventoryEntity
*/
public InventoryEntity queryInventoryByItemKeyId(Long ItemKeyId) {
LambdaQueryWrapper<InventoryEntity> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(InventoryEntity::getItemKeyId, ItemKeyId);
return inventoryDao.selectOne(queryWrapper);
}
InventoryEntity queryInventoryByItemKeyId(Long ItemKeyId);
}

View File

@ -2,20 +2,11 @@ package net.lab1024.sa.admin.module.business.wms.inventory.inventory.service;
import java.math.BigDecimal;
import java.util.List;
import net.lab1024.sa.admin.module.business.wms.inventory.inventory.dao.InventoryDao;
import net.lab1024.sa.admin.module.business.wms.inventory.inventory.domain.entity.InventoryEntity;
import net.lab1024.sa.admin.module.business.wms.inventory.inventory.domain.form.InventoryAddForm;
import net.lab1024.sa.admin.module.business.wms.inventory.inventory.domain.form.InventoryUpdateForm;
import net.lab1024.sa.admin.module.business.wms.inventory.inventory.manager.InventoryManager;
import net.lab1024.sa.base.common.code.UserErrorCode;
import net.lab1024.sa.base.common.util.SmartBeanUtil;
import net.lab1024.sa.base.common.domain.ResponseDTO;
import net.lab1024.sa.base.common.util.SmartRequestUtil;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.stereotype.Service;
import jakarta.annotation.Resource;
import org.springframework.transaction.annotation.Transactional;
/**
* Service
@ -24,72 +15,29 @@ import org.springframework.transaction.annotation.Transactional;
* @Date 2024-12-06 17:24:53
* @Copyright
*/
@Service
public class InventoryService {
@Resource
private InventoryDao inventoryDao;
@Resource
private InventoryManager inventoryManager;
public interface InventoryService {
/**
*
*/
@Transactional(rollbackFor = Exception.class)
public ResponseDTO<String> add(InventoryAddForm addForm) {
InventoryEntity inventoryEntity = SmartBeanUtil.copy(addForm, InventoryEntity.class);
inventoryDao.insert(inventoryEntity);
return ResponseDTO.ok();
}
ResponseDTO<String> add(InventoryAddForm addForm);
/**
*
*
*/
@Transactional(rollbackFor = Exception.class)
public ResponseDTO<String> update(InventoryUpdateForm updateForm) {
InventoryEntity inventoryEntity = SmartBeanUtil.copy(updateForm, InventoryEntity.class);
inventoryDao.updateById(inventoryEntity);
return ResponseDTO.ok();
}
ResponseDTO<String> update(InventoryUpdateForm updateForm);
/**
*
*/
@Transactional(rollbackFor = Exception.class)
public ResponseDTO<String> batchDelete(List<Long> idList) {
if (CollectionUtils.isEmpty(idList)){
return ResponseDTO.userErrorParam(UserErrorCode.PARAM_ERROR.getMsg());
}
inventoryManager.removeBatchByIds(idList);
return ResponseDTO.ok();
}
ResponseDTO<String> batchDelete(List<Long> idList);
/**
*
*/
@Transactional(rollbackFor = Exception.class)
public ResponseDTO<String> delete(Long inventoryId) {
if (null == inventoryId){
return ResponseDTO.userErrorParam(UserErrorCode.PARAM_ERROR.getMsg());
}
ResponseDTO<String> delete(Long inventoryId);
inventoryDao.deleteById(inventoryId);
return ResponseDTO.ok();
}
public InventoryEntity createInventory(Long itemKeyId, Long locationId, Long stockId, BigDecimal quantity) {
return InventoryEntity.builder()
.itemKeyId(itemKeyId)
.locationId(locationId)
.stockId(stockId)
.quantity(quantity)
.queuedQuantity(BigDecimal.ZERO)
.createUserId(SmartRequestUtil.getRequestUser().getUserId())
.createUserName(SmartRequestUtil.getRequestUser().getUserName())
.build();
}
InventoryEntity createInventory(Long itemKeyId, Long locationId, Long stockId, BigDecimal quantity);
}

View File

@ -0,0 +1,101 @@
package net.lab1024.sa.admin.module.business.wms.inventory.inventory.service.impl;
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.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.location.service.LocationQueryService;
import net.lab1024.sa.admin.module.business.wms.base.stock.domain.entity.StockEntity;
import net.lab1024.sa.admin.module.business.wms.base.stock.service.StockQueryService;
import net.lab1024.sa.admin.module.business.wms.inventory.inventory.dao.InventoryDao;
import net.lab1024.sa.admin.module.business.wms.inventory.inventory.domain.entity.InventoryEntity;
import net.lab1024.sa.admin.module.business.wms.inventory.inventory.domain.form.InventoryQueryForm;
import net.lab1024.sa.admin.module.business.wms.inventory.inventory.domain.vo.InventoryVO;
import net.lab1024.sa.admin.module.business.wms.inventory.inventory.manager.InventoryManager;
import net.lab1024.sa.admin.module.business.wms.inventory.inventory.service.InventoryQueryService;
import net.lab1024.sa.admin.module.business.wms.inventory.itemKey.domain.entity.ItemKeyEntity;
import net.lab1024.sa.admin.module.business.wms.inventory.itemKey.service.ItemKeyQueryService;
import net.lab1024.sa.base.common.domain.PageResult;
import net.lab1024.sa.base.common.util.SmartPageUtil;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
@Service
public class InventoryQueryServiceImpl implements InventoryQueryService {
@Resource
private InventoryDao inventoryDao;
@Resource
private InventoryManager inventoryManager;
@Resource
private ItemQueryService itemQueryService;
@Resource
private StockQueryService stockQueryService;
@Resource
private LocationQueryService locationQueryService;
@Resource
private ItemKeyQueryService itemKeyQueryService;
/**
*
*/
public PageResult<InventoryVO> queryPage(InventoryQueryForm queryForm) {
Page<?> page = SmartPageUtil.convert2PageQuery(queryForm);
List<InventoryVO> list = inventoryDao.queryPage(page, queryForm);
// 查询物料属性
List<Long> itemKeyIds = list.stream().map(InventoryVO::getItemKeyId).toList();
Map<Long, ItemKeyEntity> itemKeyMap = itemKeyQueryService.queryByItemKeyIds(itemKeyIds);
//查询物料
List<Long> itemIds = itemKeyMap.values().stream().map(ItemKeyEntity::getItemId).toList();
Map<Long, ItemEntity> itemMap = itemQueryService.queryByItemIdsToMap(itemIds);
//查询容器
List<Long> stockIds = list.stream().map(InventoryVO::getStockId).toList();
Map<Long, StockEntity> stockMap = stockQueryService.queryByStockIdsToMap(stockIds);
//查询库位
List<Long> locationIds = list.stream().map(InventoryVO::getLocationId).toList();
Map<Long, LocationEntity> locationMap = locationQueryService.queryByLocationIdsToMap(locationIds);
list.forEach(InventoryVO -> {
ItemKeyEntity itemKey = itemKeyMap.get(InventoryVO.getItemKeyId());
if (itemKey != null) {
ItemEntity item = itemMap.get(itemKey.getItemId());
if (item != null) {
InventoryVO.setItemCode(item.getItemCode());
InventoryVO.setItemName(item.getItemName());
}
}
StockEntity stock = stockMap.get(InventoryVO.getStockId());
if (stock != null) {
InventoryVO.setStockCode(stock.getStockCode());
}
LocationEntity location = locationMap.get(InventoryVO.getLocationId());
if (location != null) {
InventoryVO.setLocationCode(location.getLocationCode());
}
});
return SmartPageUtil.convert2PageResult(page, list);
}
/**
* @param ItemKeyId
* @return InventoryEntity
*/
public InventoryEntity queryInventoryByItemKeyId(Long ItemKeyId) {
LambdaQueryWrapper<InventoryEntity> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(InventoryEntity::getItemKeyId, ItemKeyId);
return inventoryManager.getOne(queryWrapper);
}
}

View File

@ -0,0 +1,84 @@
package net.lab1024.sa.admin.module.business.wms.inventory.inventory.service.impl;
import jakarta.annotation.Resource;
import net.lab1024.sa.admin.module.business.wms.inventory.inventory.dao.InventoryDao;
import net.lab1024.sa.admin.module.business.wms.inventory.inventory.domain.entity.InventoryEntity;
import net.lab1024.sa.admin.module.business.wms.inventory.inventory.domain.form.InventoryAddForm;
import net.lab1024.sa.admin.module.business.wms.inventory.inventory.domain.form.InventoryUpdateForm;
import net.lab1024.sa.admin.module.business.wms.inventory.inventory.manager.InventoryManager;
import net.lab1024.sa.admin.module.business.wms.inventory.inventory.service.InventoryService;
import net.lab1024.sa.base.common.code.UserErrorCode;
import net.lab1024.sa.base.common.domain.ResponseDTO;
import net.lab1024.sa.base.common.util.SmartBeanUtil;
import net.lab1024.sa.base.common.util.SmartRequestUtil;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.List;
@Service
public class InventoryServiceImpl implements InventoryService {
@Resource
private InventoryManager inventoryManager;
/**
*
*/
@Transactional(rollbackFor = Exception.class)
public ResponseDTO<String> add(InventoryAddForm addForm) {
InventoryEntity inventoryEntity = SmartBeanUtil.copy(addForm, InventoryEntity.class);
inventoryManager.save(inventoryEntity);
return ResponseDTO.ok();
}
/**
*
*/
@Transactional(rollbackFor = Exception.class)
public ResponseDTO<String> update(InventoryUpdateForm updateForm) {
InventoryEntity inventoryEntity = SmartBeanUtil.copy(updateForm, InventoryEntity.class);
inventoryManager.updateById(inventoryEntity);
return ResponseDTO.ok();
}
/**
*
*/
@Transactional(rollbackFor = Exception.class)
public ResponseDTO<String> batchDelete(List<Long> idList) {
if (CollectionUtils.isEmpty(idList)) {
return ResponseDTO.userErrorParam(UserErrorCode.PARAM_ERROR.getMsg());
}
inventoryManager.removeBatchByIds(idList);
return ResponseDTO.ok();
}
/**
*
*/
@Transactional(rollbackFor = Exception.class)
public ResponseDTO<String> delete(Long inventoryId) {
if (null == inventoryId) {
return ResponseDTO.userErrorParam(UserErrorCode.PARAM_ERROR.getMsg());
}
inventoryManager.removeById(inventoryId);
return ResponseDTO.ok();
}
public InventoryEntity createInventory(Long itemKeyId, Long locationId, Long stockId, BigDecimal quantity) {
return InventoryEntity.builder()
.itemKeyId(itemKeyId)
.locationId(locationId)
.stockId(stockId)
.quantity(quantity)
.queuedQuantity(BigDecimal.ZERO)
.createUserId(SmartRequestUtil.getRequestUser().getUserId())
.createUserName(SmartRequestUtil.getRequestUser().getUserName())
.build();
}
}

View File

@ -3,13 +3,21 @@ package net.lab1024.sa.admin.module.business.wms.inventory.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.item.domain.entity.ItemEntity;
import net.lab1024.sa.admin.module.business.wms.inventory.itemKey.domain.entity.ItemKeyEntity;
import net.lab1024.sa.admin.module.business.wms.inventory.itemKey.dao.ItemKeyDao;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.cache.Cache;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Objects;
/**
* Manager
@ -20,21 +28,68 @@ import org.springframework.stereotype.Service;
*/
@Service
@Slf4j
@CacheConfig(cacheNames = AdminCacheConst.ItemKey.ITEM_KEY_ENTITY)
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");
}
@Resource
private CacheManager cacheManager;
@Cacheable(AdminCacheConst.itemKey.ITEM_KEY_ENTITY)
@Cacheable(key = "#itemKeyId", unless = "#result == null")
public ItemKeyEntity queryItemKey(Long itemKeyId) {
return itemKeyDao.selectById(itemKeyId);
}
/**
*
*/
@Transactional(rollbackFor = Exception.class)
@CacheEvict(key = "#entity.itemKeyId")
public void update(ItemKeyEntity entity) {
super.updateById(entity);
}
/**
*
*/
@Transactional(rollbackFor = Exception.class)
@CacheEvict(key = "#itemKeyId")
public void deleteById(Long itemKeyId) {
super.removeById(itemKeyId);
}
/**
*
*/
@Transactional(rollbackFor = Exception.class)
public void batchUpdate(List<ItemKeyEntity> entities) {
super.updateBatchById(entities);
List<Long> itemKeyIds = entities.stream().map(ItemKeyEntity::getItemKeyId).filter(Objects::nonNull).distinct().toList();
itemKeyIds.forEach(this::clearCache);
}
/**
*
*/
@Transactional(rollbackFor = Exception.class)
public void batchDelete(List<Long> itemKeyIds) {
super.removeByIds(itemKeyIds);
itemKeyIds.forEach(this::clearCache);
}
/**
*
*/
public void clearCache(Long itemId) {
if (itemId != null) {
Cache cache = cacheManager.getCache(AdminCacheConst.ItemKey.ITEM_KEY_ENTITY);
if (cache != null) {
cache.evict(itemId);
}
}
}
}

View File

@ -1,41 +1,20 @@
package net.lab1024.sa.admin.module.business.wms.inventory.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.inventory.itemKey.domain.entity.ItemKeyEntity;
import net.lab1024.sa.admin.module.business.wms.inventory.itemKey.domain.vo.ItemKeyVO;
import net.lab1024.sa.admin.module.business.wms.inventory.itemKey.manager.ItemKeyManager;
import net.lab1024.sa.admin.module.business.wms.inventory.itemKey.dao.ItemKeyDao;
import net.lab1024.sa.admin.module.business.wms.inventory.itemKey.domain.form.ItemKeyQueryForm;
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.Objects;
@Service
public class ItemKeyQueryService {
@Resource
private ItemKeyDao itemKeyDao;
@Resource
private ItemKeyManager itemKeyManager;
public interface ItemKeyQueryService {
/**
*
*/
public PageResult<ItemKeyVO> queryPage(ItemKeyQueryForm queryForm) {
Page<?> page = SmartPageUtil.convert2PageQuery(queryForm);
List<ItemKeyVO> list = itemKeyDao.queryPage(page, queryForm);
return SmartPageUtil.convert2PageResult(page, list);
}
PageResult<ItemKeyVO> queryPage(ItemKeyQueryForm queryForm);
/**
* ID
@ -43,30 +22,15 @@ public class ItemKeyQueryService {
* @param itemKeyIdList ID
* @return Map<Long, ItemKeyEntity>
*/
public Map<Long, ItemKeyEntity> queryByItemKeyIds(List<Long> itemKeyIdList) {
if (CollectionUtils.isEmpty(itemKeyIdList)) {
return Collections.emptyMap();
}
itemKeyIdList = itemKeyIdList.stream().filter(Objects::nonNull).distinct().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;
}
Map<Long, ItemKeyEntity> queryByItemKeyIds(List<Long> itemKeyIdList);
public ItemKeyEntity queryItemKey(String orderNumber, Long itemId, String propC1) {
LambdaQueryWrapper<ItemKeyEntity> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(ItemKeyEntity::getOrderNumber, orderNumber);
queryWrapper.eq(ItemKeyEntity::getItemId, itemId);
queryWrapper.eq(ItemKeyEntity::getPropC1, propC1);
List<ItemKeyEntity> itemKeys = itemKeyManager.list(queryWrapper);
if (CollectionUtils.isEmpty(itemKeys)) {
return null;
}
return itemKeys.get(0);
}
/**
* IDC1
*
* @param orderNumber
* @param itemId
* @param propC1
* @return ItemKeyEntity
*/
ItemKeyEntity queryItemKey(String orderNumber, Long itemId, String propC1);
}

View File

@ -24,60 +24,27 @@ import org.springframework.transaction.annotation.Transactional;
* @Copyright
*/
@Service
public class ItemKeyService {
@Resource
private ItemKeyManager itemKeyManager;
@Resource
private ItemKeyQueryService itemKeyQueryService;
public interface ItemKeyService {
/**
*
*/
@Transactional(rollbackFor = Exception.class)
public ResponseDTO<String> add(ItemKeyAddForm addForm) {
ItemKeyEntity itemKeyEntity = SmartBeanUtil.copy(addForm, ItemKeyEntity.class);
itemKeyManager.save(itemKeyEntity);
return ResponseDTO.ok();
}
ResponseDTO<String> add(ItemKeyAddForm addForm);
/**
*
*/
@Transactional(rollbackFor = Exception.class)
public ResponseDTO<String> update(ItemKeyUpdateForm updateForm) {
ItemKeyEntity itemKeyEntity = SmartBeanUtil.copy(updateForm, ItemKeyEntity.class);
itemKeyManager.updateById(itemKeyEntity);
return ResponseDTO.ok();
}
ResponseDTO<String> update(ItemKeyUpdateForm updateForm);
/**
*
*/
@Transactional(rollbackFor = Exception.class)
public ResponseDTO<String> batchDelete(List<Long> idList) {
if (CollectionUtils.isEmpty(idList)) {
return ResponseDTO.userErrorParam(UserErrorCode.PARAM_ERROR.getMsg());
}
itemKeyManager.removeBatchByIds(idList);
return ResponseDTO.ok();
}
ResponseDTO<String> batchDelete(List<Long> idList);
/**
*
*/
@Transactional(rollbackFor = Exception.class)
public ResponseDTO<String> delete(Long itemKeyId) {
if (null == itemKeyId) {
return ResponseDTO.userErrorParam(UserErrorCode.PARAM_ERROR.getMsg());
}
itemKeyManager.removeById(itemKeyId);
return ResponseDTO.ok();
}
ResponseDTO<String> delete(Long itemKeyId);
/**
* itemKey
@ -87,20 +54,5 @@ public class ItemKeyService {
* @param propC1
* @return ItemKeyEntity
*/
@Transactional(rollbackFor = Exception.class)
public ItemKeyEntity createItemKey(String orderNumber, Long itemId, String propC1) {
ItemKeyEntity itemKey = itemKeyQueryService.queryItemKey(orderNumber, itemId, propC1);
if (itemKey != null) {
return itemKey;
}
itemKey = ItemKeyEntity.builder()
.orderNumber(orderNumber)
.itemId(itemId)
.propC1(propC1)
.createUserId(SmartRequestUtil.getRequestUser().getUserId())
.createUserName(SmartRequestUtil.getRequestUser().getUserName())
.build();
itemKeyManager.save(itemKey);
return itemKey;
}
ItemKeyEntity createItemKey(String orderNumber, Long itemId, String propC1);
}

View File

@ -0,0 +1,73 @@
package net.lab1024.sa.admin.module.business.wms.inventory.itemKey.service.impl;
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.inventory.itemKey.dao.ItemKeyDao;
import net.lab1024.sa.admin.module.business.wms.inventory.itemKey.domain.entity.ItemKeyEntity;
import net.lab1024.sa.admin.module.business.wms.inventory.itemKey.domain.form.ItemKeyQueryForm;
import net.lab1024.sa.admin.module.business.wms.inventory.itemKey.domain.vo.ItemKeyVO;
import net.lab1024.sa.admin.module.business.wms.inventory.itemKey.manager.ItemKeyManager;
import net.lab1024.sa.admin.module.business.wms.inventory.itemKey.service.ItemKeyQueryService;
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.Objects;
@Service
public class ItemKeyQueryServiceImpl implements ItemKeyQueryService {
@Resource
private ItemKeyDao itemKeyDao;
@Resource
private ItemKeyManager itemKeyManager;
/**
*
*/
public PageResult<ItemKeyVO> queryPage(ItemKeyQueryForm queryForm) {
Page<?> page = SmartPageUtil.convert2PageQuery(queryForm);
List<ItemKeyVO> list = itemKeyDao.queryPage(page, queryForm);
return SmartPageUtil.convert2PageResult(page, list);
}
/**
* ID
*
* @param itemKeyIdList ID
* @return Map<Long, ItemKeyEntity>
*/
public Map<Long, ItemKeyEntity> queryByItemKeyIds(List<Long> itemKeyIdList) {
if (CollectionUtils.isEmpty(itemKeyIdList)) {
return Collections.emptyMap();
}
itemKeyIdList = itemKeyIdList.stream().filter(Objects::nonNull).distinct().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);
queryWrapper.eq(ItemKeyEntity::getItemId, itemId);
queryWrapper.eq(ItemKeyEntity::getPropC1, propC1);
List<ItemKeyEntity> itemKeys = itemKeyManager.list(queryWrapper);
if (CollectionUtils.isEmpty(itemKeys)) {
return null;
}
return itemKeys.get(0);
}
}

View File

@ -0,0 +1,99 @@
package net.lab1024.sa.admin.module.business.wms.inventory.itemKey.service.impl;
import jakarta.annotation.Resource;
import net.lab1024.sa.admin.module.business.wms.inventory.itemKey.domain.entity.ItemKeyEntity;
import net.lab1024.sa.admin.module.business.wms.inventory.itemKey.domain.form.ItemKeyAddForm;
import net.lab1024.sa.admin.module.business.wms.inventory.itemKey.domain.form.ItemKeyUpdateForm;
import net.lab1024.sa.admin.module.business.wms.inventory.itemKey.manager.ItemKeyManager;
import net.lab1024.sa.admin.module.business.wms.inventory.itemKey.service.ItemKeyQueryService;
import net.lab1024.sa.admin.module.business.wms.inventory.itemKey.service.ItemKeyService;
import net.lab1024.sa.base.common.code.UserErrorCode;
import net.lab1024.sa.base.common.domain.ResponseDTO;
import net.lab1024.sa.base.common.util.SmartBeanUtil;
import net.lab1024.sa.base.common.util.SmartRequestUtil;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@Service
public class ItemKeyServiceImpl implements ItemKeyService {
@Resource
private ItemKeyManager itemKeyManager;
@Resource
private ItemKeyQueryService itemKeyQueryService;
/**
*
*/
@Transactional(rollbackFor = Exception.class)
public ResponseDTO<String> add(ItemKeyAddForm addForm) {
ItemKeyEntity itemKeyEntity = SmartBeanUtil.copy(addForm, ItemKeyEntity.class);
itemKeyManager.save(itemKeyEntity);
return ResponseDTO.ok();
}
/**
*
*/
@Transactional(rollbackFor = Exception.class)
public ResponseDTO<String> update(ItemKeyUpdateForm updateForm) {
ItemKeyEntity itemKeyEntity = SmartBeanUtil.copy(updateForm, ItemKeyEntity.class);
itemKeyManager.update(itemKeyEntity);
return ResponseDTO.ok();
}
/**
*
*/
@Transactional(rollbackFor = Exception.class)
public ResponseDTO<String> batchDelete(List<Long> idList) {
if (CollectionUtils.isEmpty(idList)) {
return ResponseDTO.userErrorParam(UserErrorCode.PARAM_ERROR.getMsg());
}
itemKeyManager.batchDelete(idList);
return ResponseDTO.ok();
}
/**
*
*/
@Transactional(rollbackFor = Exception.class)
public ResponseDTO<String> delete(Long itemKeyId) {
if (null == itemKeyId) {
return ResponseDTO.userErrorParam(UserErrorCode.PARAM_ERROR.getMsg());
}
itemKeyManager.deleteById(itemKeyId);
return ResponseDTO.ok();
}
/**
* itemKey
*
* @param orderNumber
* @param itemId
* @param propC1
* @return ItemKeyEntity
*/
@Transactional(rollbackFor = Exception.class)
public ItemKeyEntity createItemKey(String orderNumber, Long itemId, String propC1) {
ItemKeyEntity itemKey = itemKeyQueryService.queryItemKey(orderNumber, itemId, propC1);
if (itemKey != null) {
return itemKey;
}
itemKey = ItemKeyEntity.builder()
.orderNumber(orderNumber)
.itemId(itemId)
.propC1(propC1)
.createUserId(SmartRequestUtil.getRequestUser().getUserId())
.createUserName(SmartRequestUtil.getRequestUser().getUserName())
.build();
itemKeyManager.save(itemKey);
return itemKey;
}
}

View File

@ -7,37 +7,19 @@ import net.lab1024.sa.base.common.enumeration.BaseEnum;
@AllArgsConstructor
@Getter
public enum AsnOrderStatusEnum implements BaseEnum {
/**
* 1
*/
CREATED("CREATED", "已创建"),
/**
* 2
*/
APPROVING("APPROVING", "已提交"),
/**
* 3
*/
APPROVED("APPROVED", "已审核"),
/**
* 4
*/
IN_PROGRESS("IN_PROGRESS", "入库中"),
/**
* 5
*/
COMPLETED("COMPLETED", "已完成"),
/**
* 6
*/
CANCELLED("CANCELLED", "已取消"),
;
private final String value;

View File

@ -6,7 +6,7 @@ import lombok.Getter;
import net.lab1024.sa.base.common.enumeration.BaseEnum;
/**
*
*
*
* @Author 1024:
* @Date 2021-10-25 20:26:54
@ -18,22 +18,12 @@ import net.lab1024.sa.base.common.enumeration.BaseEnum;
@Getter
public enum AsnOrderTypeEnum implements BaseEnum {
/**
* 1
*/
PURCHASE("PURCHASE", "采购入库"),
/**
* 2 退
*/
RETURN("RETURN", "退货入库"),
/**
* 3
*/
OTHER("OTHER", "其他入库"),
;
private final String value;

View File

@ -0,0 +1,46 @@
package net.lab1024.sa.admin.module.business.wms.shipping.pick.constant;
import lombok.AllArgsConstructor;
import lombok.Getter;
import net.lab1024.sa.base.common.enumeration.BaseEnum;
@AllArgsConstructor
@Getter
public enum PickOrderStatusEnum implements BaseEnum {
CREATED("CREATED", "已创建"),
APPROVING("APPROVING", "已提交"),
APPROVED("APPROVED", "已审核"),
PARTIALLY_ALLOCATED("PARTIALLY_ALLOCATED", "部分分配"),
ALLOCATED("ALLOCATED", "已分配"),
PARTIALLY_PICKED("PARTIALLY_PICKED", "部分拣货"),
COMPLETED("COMPLETED", "已完成"),
CANCELLED("CANCELLED", "已取消"),
;
private final String value;
private final String desc;
/**
* value desc
* @param value
* @return null
*/
public static String getDescByValue(String value) {
for (PickOrderStatusEnum status : PickOrderStatusEnum.values()) {
if (status.getValue().equals(value)) {
return status.getDesc();
}
}
return null;
}
}

View File

@ -0,0 +1,35 @@
package net.lab1024.sa.admin.module.business.wms.shipping.pick.constant;
import lombok.AllArgsConstructor;
import lombok.Getter;
import net.lab1024.sa.base.common.enumeration.BaseEnum;
/**
*
*
* @Author 1024:
* @Date 2021-10-25 20:26:54
* @Wechat zhuoda1024
* @Email lab1024@163.com
* @Copyright <a href="https://1024lab.net">1024</a>
*/
@AllArgsConstructor
@Getter
public enum PickOrderTypeEnum implements BaseEnum {
SALES("SALES", "销售出库"),
TRANSFER("TRANSFER", "调拨出库"),
RETURN_OUT("RETURN_OUT", "退货出库"),
OTHER("OTHER", "其他出库"),
;
private final String value;
private final String desc;
}

View File

@ -0,0 +1,76 @@
package net.lab1024.sa.admin.module.business.wms.shipping.pick.controller;
import net.lab1024.sa.admin.module.business.wms.shipping.pick.domain.entity.PickEntity;
import net.lab1024.sa.admin.module.business.wms.shipping.pick.domain.form.PickAddForm;
import net.lab1024.sa.admin.module.business.wms.shipping.pick.domain.form.PickQueryForm;
import net.lab1024.sa.admin.module.business.wms.shipping.pick.domain.form.PickUpdateForm;
import net.lab1024.sa.admin.module.business.wms.shipping.pick.domain.vo.PickVO;
import net.lab1024.sa.admin.module.business.wms.shipping.pick.service.PickQueryService;
import net.lab1024.sa.admin.module.business.wms.shipping.pick.service.PickService;
import net.lab1024.sa.base.common.domain.ValidateList;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import net.lab1024.sa.base.common.domain.ResponseDTO;
import net.lab1024.sa.base.common.domain.PageResult;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Operation;
import cn.dev33.satoken.annotation.SaCheckPermission;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
/**
* Controller
*
* @Author
* @Date 2024-12-26 15:42:11
* @Copyright
*/
@RestController
@Tag(name = "出库单")
public class PickController {
@Resource
private PickService pickService;
@Resource
private PickQueryService pickQueryService;
@Operation(summary = "分页查询 @author 霍锦")
@PostMapping("/pick/queryPage")
@SaCheckPermission("pick:query")
public ResponseDTO<PageResult<PickVO>> queryPage(@RequestBody @Valid PickQueryForm queryForm) {
return ResponseDTO.ok(pickQueryService.queryPage(queryForm));
}
@Operation(summary = "添加 @author 霍锦")
@PostMapping("/pick/add")
@SaCheckPermission("pick:add")
public ResponseDTO<PickEntity> add(@RequestBody @Valid PickAddForm addForm) {
return pickService.add(addForm);
}
@Operation(summary = "更新 @author 霍锦")
@PostMapping("/pick/update")
@SaCheckPermission("pick:update")
public ResponseDTO<PickEntity> update(@RequestBody @Valid PickUpdateForm updateForm) {
return pickService.update(updateForm);
}
@Operation(summary = "批量删除 @author 霍锦")
@PostMapping("/pick/batchDelete")
@SaCheckPermission("pick:delete")
public ResponseDTO<String> batchDelete(@RequestBody ValidateList<Long> idList) {
return pickService.batchDelete(idList);
}
@Operation(summary = "单个删除 @author 霍锦")
@GetMapping("/pick/delete/{pickId}")
@SaCheckPermission("pick:delete")
public ResponseDTO<String> batchDelete(@PathVariable Long pickId) {
return pickService.delete(pickId);
}
}

View File

@ -0,0 +1,33 @@
package net.lab1024.sa.admin.module.business.wms.shipping.pick.dao;
import java.util.List;
import net.lab1024.sa.admin.module.business.wms.shipping.pick.domain.entity.PickEntity;
import net.lab1024.sa.admin.module.business.wms.shipping.pick.domain.form.PickQueryForm;
import net.lab1024.sa.admin.module.business.wms.shipping.pick.domain.vo.PickVO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Component;
/**
* Dao
*
* @Author
* @Date 2024-12-26 15:42:11
* @Copyright
*/
@Mapper
public interface PickDao extends BaseMapper<PickEntity> {
/**
*
*
* @param page
* @param queryForm
* @return
*/
List<PickVO> queryPage(Page page, @Param("queryForm") PickQueryForm queryForm);
}

View File

@ -0,0 +1,133 @@
package net.lab1024.sa.admin.module.business.wms.shipping.pick.domain.entity;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import lombok.Data;
import net.lab1024.sa.admin.module.business.wms.receive.asn.constant.AsnOrderStatusEnum;
import net.lab1024.sa.admin.module.business.wms.receive.asn.constant.AsnOrderTypeEnum;
import net.lab1024.sa.base.module.support.datatracer.annoation.DataTracerFieldEnum;
import net.lab1024.sa.base.module.support.datatracer.annoation.DataTracerFieldLabel;
/**
*
*
* @Author
* @Date 2024-12-26 15:42:11
* @Copyright
*/
@Data
@TableName("t_pick")
public class PickEntity {
/**
* id
*/
@TableId(type = IdType.AUTO)
private Long pickId;
/**
*
*/
@DataTracerFieldLabel("入库单号")
private String pickNumber;
/**
*
*/
@DataTracerFieldLabel("客户订单号")
private String customerNumber;
/**
*
*/
@DataTracerFieldLabel("单据类型")
@DataTracerFieldEnum(enumClass = AsnOrderTypeEnum.class)
private String orderType;
/**
*
*
*/
@DataTracerFieldLabel("状态")
@DataTracerFieldEnum(enumClass = AsnOrderStatusEnum.class)
private String status;
/**
*
*/
@DataTracerFieldLabel("收货单位")
private Long addressId;
/**
*
*/
@DataTracerFieldLabel("联系人")
private String person;
/**
*
*/
@DataTracerFieldLabel("电话")
private String telephone;
/**
*
*/
@DataTracerFieldLabel("地址")
private String address;
/**
*
*/
private BigDecimal orderQuantity;
/**
*
*/
private BigDecimal allocatedQuantity;
/**
*
*/
private BigDecimal pickedQuantity;
/**
*
*/
private BigDecimal shippedQuantity;
/**
*
*/
private LocalDateTime orderDate;
/**
*
*/
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
/**
* ID
*/
private Long createUserId;
/**
*
*/
private String createUserName;
/**
*
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
}

View File

@ -0,0 +1,68 @@
package net.lab1024.sa.admin.module.business.wms.shipping.pick.domain.form;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import java.time.LocalDate;
import java.time.LocalDateTime;
import lombok.Data;
import net.lab1024.sa.admin.module.business.wms.receive.asn.constant.AsnOrderStatusEnum;
import net.lab1024.sa.admin.module.business.wms.receive.asn.constant.AsnOrderTypeEnum;
import net.lab1024.sa.base.common.swagger.SchemaEnum;
import net.lab1024.sa.base.common.validator.enumeration.CheckEnum;
/**
*
*
* @Author
* @Date 2024-12-26 15:42:11
* @Copyright
*/
@Data
public class PickAddForm {
@Schema(description = "出库单号")
private String pickNumber;
@SchemaEnum(AsnOrderStatusEnum.class)
@CheckEnum(message = "状态", value = AsnOrderStatusEnum.class)
private String status;
@Schema(description = "客户", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "客户 不能为空")
private Long customerId;
@Schema(description = "客户订单号", requiredMode = Schema.RequiredMode.REQUIRED)
@NotBlank(message = "客户订单号 不能为空")
private String customerNumber;
@SchemaEnum(AsnOrderTypeEnum.class)
@CheckEnum(message = "单据类型", value = AsnOrderTypeEnum.class, required = true)
private String orderType;
@Schema(description = "收货单位", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "收货单位 不能为空")
private Long addressId;
@Schema(description = "联系人")
private String person;
@Schema(description = "电话")
private String telephone;
@Schema(description = "地址")
private String address;
@Schema(description = "订单日期", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "订单日期 不能为空")
private LocalDate orderDate;
@Schema(hidden = true)
private Long createUserId;
@Schema(hidden = true)
private String createUserName;
}

View File

@ -0,0 +1,19 @@
package net.lab1024.sa.admin.module.business.wms.shipping.pick.domain.form;
import net.lab1024.sa.base.common.domain.PageParam;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
*
*
* @Author
* @Date 2024-12-26 15:42:11
* @Copyright
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class PickQueryForm extends PageParam {
}

View File

@ -0,0 +1,23 @@
package net.lab1024.sa.admin.module.business.wms.shipping.pick.domain.form;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import net.lab1024.sa.admin.module.business.wms.receive.asn.domain.form.AsnAddForm;
/**
*
*
* @Author
* @Date 2024-12-26 15:42:11
* @Copyright
*/
@Data
public class PickUpdateForm extends PickAddForm {
@Schema(description = "出库单id", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "出库单id 不能为空")
private Long pickId;
}

View File

@ -0,0 +1,56 @@
package net.lab1024.sa.admin.module.business.wms.shipping.pick.domain.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import lombok.Data;
/**
* VO
*
* @Author
* @Date 2024-12-26 15:42:11
* @Copyright
*/
@Data
public class PickVO {
@Schema(description = "出库单id")
private Long pickId;
@Schema(description = "出库单号")
private String pickNumber;
@Schema(description = "客户订单号")
private String customerNumber;
@Schema(description = "单据类型")
private String orderType;
@Schema(description = "状态")
private String status;
@Schema(description = "收货地址")
private Long addressId;
@Schema(description = "订单数量")
private BigDecimal orderQuantity;
@Schema(description = "分配数量")
private BigDecimal allocatedQuantity;
@Schema(description = "拣货数量")
private BigDecimal pickedQuantity;
@Schema(description = "发运数量")
private BigDecimal shippedQuantity;
@Schema(description = "订单日期")
private LocalDateTime orderDate;
@Schema(description = "创建时间")
private LocalDateTime createTime;
}

View File

@ -0,0 +1,20 @@
package net.lab1024.sa.admin.module.business.wms.shipping.pick.manager;
import net.lab1024.sa.admin.module.business.wms.shipping.pick.dao.PickDao;
import net.lab1024.sa.admin.module.business.wms.shipping.pick.domain.entity.PickEntity;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* Manager
*
* @Author
* @Date 2024-12-26 15:42:11
* @Copyright
*/
@Service
public class PickManager extends ServiceImpl<PickDao, PickEntity> {
}

View File

@ -0,0 +1,33 @@
package net.lab1024.sa.admin.module.business.wms.shipping.pick.service;
import net.lab1024.sa.admin.module.business.wms.receive.asn.domain.entity.AsnEntity;
import net.lab1024.sa.admin.module.business.wms.shipping.pick.domain.entity.PickEntity;
import net.lab1024.sa.admin.module.business.wms.shipping.pick.domain.form.PickQueryForm;
import net.lab1024.sa.admin.module.business.wms.shipping.pick.domain.vo.PickVO;
import net.lab1024.sa.base.common.domain.PageResult;
import java.util.List;
public interface PickQueryService {
/**
*
*/
PageResult<PickVO> queryPage(PickQueryForm queryForm);
/**
*
*
* @param customerNumber
* @return AsnEntity
*/
PickEntity queryByCustomerNumber(String customerNumber);
/**
* ids
*
* @param idList
* @return List<PickEntity>
*/
List<PickEntity> queryByPickIds(List<Long> idList);
}

View File

@ -0,0 +1,39 @@
package net.lab1024.sa.admin.module.business.wms.shipping.pick.service;
import java.util.List;
import net.lab1024.sa.admin.module.business.wms.shipping.pick.domain.entity.PickEntity;
import net.lab1024.sa.admin.module.business.wms.shipping.pick.domain.form.PickAddForm;
import net.lab1024.sa.admin.module.business.wms.shipping.pick.domain.form.PickUpdateForm;
import net.lab1024.sa.base.common.domain.ResponseDTO;
/**
* Service
*
* @Author
* @Date 2024-12-26 15:42:11
* @Copyright
*/
public interface PickService {
/**
*
*/
ResponseDTO<PickEntity> add(PickAddForm addForm);
/**
*
*/
ResponseDTO<PickEntity> update(PickUpdateForm updateForm);
/**
*
*/
ResponseDTO<String> batchDelete(List<Long> idList);
/**
*
*/
ResponseDTO<String> delete(Long pickId);
}

View File

@ -0,0 +1,73 @@
package net.lab1024.sa.admin.module.business.wms.shipping.pick.service.impl;
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.wms.receive.asn.domain.entity.AsnEntity;
import net.lab1024.sa.admin.module.business.wms.shipping.pick.dao.PickDao;
import net.lab1024.sa.admin.module.business.wms.shipping.pick.domain.entity.PickEntity;
import net.lab1024.sa.admin.module.business.wms.shipping.pick.domain.form.PickQueryForm;
import net.lab1024.sa.admin.module.business.wms.shipping.pick.domain.vo.PickVO;
import net.lab1024.sa.admin.module.business.wms.shipping.pick.manager.PickManager;
import net.lab1024.sa.admin.module.business.wms.shipping.pick.service.PickQueryService;
import net.lab1024.sa.base.common.domain.PageResult;
import net.lab1024.sa.base.common.util.SmartPageUtil;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
@Service
public class PickQueryServiceImpl implements PickQueryService {
@Resource
private PickDao pickDao;
@Resource
private PickManager pickManager;
/**
*
*/
public PageResult<PickVO> queryPage(PickQueryForm queryForm) {
Page<?> page = SmartPageUtil.convert2PageQuery(queryForm);
List<PickVO> list = pickDao.queryPage(page, queryForm);
return SmartPageUtil.convert2PageResult(page, list);
}
/**
*
*
* @param customerNumber
* @return PickEntity
*/
@Override
public PickEntity queryByCustomerNumber(String customerNumber) {
if (StringUtils.isBlank(customerNumber)) {
return null;
}
LambdaQueryWrapper<PickEntity> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(PickEntity::getCustomerNumber, customerNumber);
return pickManager.getOne(queryWrapper);
}
/**
* ids
*
* @param idList
* @return List<PickEntity>
*/
public List<PickEntity> queryByPickIds(List<Long> idList) {
if (CollectionUtils.isEmpty(idList)) {
return Collections.emptyList();
}
//去重
idList = idList.stream().filter(Objects::nonNull).distinct().toList();
return pickManager.listByIds(idList);
}
}

View File

@ -0,0 +1,160 @@
package net.lab1024.sa.admin.module.business.wms.shipping.pick.service.impl;
import com.amazonaws.partitions.PartitionRegionImpl;
import jakarta.annotation.Resource;
import net.lab1024.sa.admin.module.business.wms.receive.asn.constant.AsnOrderStatusEnum;
import net.lab1024.sa.admin.module.business.wms.receive.asn.domain.entity.AsnEntity;
import net.lab1024.sa.admin.module.business.wms.receive.asnDetail.domain.entity.AsnDetailEntity;
import net.lab1024.sa.admin.module.business.wms.shipping.pick.constant.PickOrderStatusEnum;
import net.lab1024.sa.admin.module.business.wms.shipping.pick.domain.entity.PickEntity;
import net.lab1024.sa.admin.module.business.wms.shipping.pick.domain.form.PickAddForm;
import net.lab1024.sa.admin.module.business.wms.shipping.pick.domain.form.PickUpdateForm;
import net.lab1024.sa.admin.module.business.wms.shipping.pick.manager.PickManager;
import net.lab1024.sa.admin.module.business.wms.shipping.pick.service.PickQueryService;
import net.lab1024.sa.admin.module.business.wms.shipping.pick.service.PickService;
import net.lab1024.sa.admin.module.business.wms.shipping.pickDetail.domain.entity.PickDetailEntity;
import net.lab1024.sa.admin.module.business.wms.shipping.pickDetail.manager.PickDetailManager;
import net.lab1024.sa.admin.module.business.wms.shipping.pickDetail.service.PickDetailQueryService;
import net.lab1024.sa.admin.util.JoinerResult;
import net.lab1024.sa.admin.util.ResponseDTOUtil;
import net.lab1024.sa.base.common.code.UserErrorCode;
import net.lab1024.sa.base.common.domain.ResponseDTO;
import net.lab1024.sa.base.common.exception.BusinessException;
import net.lab1024.sa.base.common.util.SmartBeanUtil;
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;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
@Service
public class PickServiceImpl implements PickService {
@Resource
private PickManager pickManager;
@Resource
private PickDetailManager pickDetailManager;
@Resource
private PickQueryService pickQueryService;
@Resource
private PickDetailQueryService pickDetailQueryService;
@Resource
private SerialNumberService serialNumberService;
@Resource
private DataTracerService dataTracerService;
/**
*
*/
@Transactional(rollbackFor = Exception.class)
public ResponseDTO<PickEntity> add(PickAddForm addForm) {
PickEntity exitPick = pickQueryService.queryByCustomerNumber(addForm.getCustomerNumber());
if (exitPick != null) {
throw new BusinessException(addForm.getCustomerNumber() + "客户订单号已存在");
}
//自动生成出库编号
addForm.setPickNumber(serialNumberService.generate(SerialNumberIdEnum.PICK));
//默认已创建
addForm.setStatus(PickOrderStatusEnum.CREATED.getValue());
PickEntity pickEntity = SmartBeanUtil.copy(addForm, PickEntity.class);
pickManager.save(pickEntity);
//操作记录
dataTracerService.addTrace(pickEntity.getPickId(), DataTracerTypeEnum.PICK, "新建出库单:" + pickEntity.getPickNumber(), null, pickEntity);
return ResponseDTO.ok(pickEntity);
}
/**
*
*/
@Transactional(rollbackFor = Exception.class)
public ResponseDTO<PickEntity> update(PickUpdateForm updateForm) {
PickEntity exitPick = pickQueryService.queryByCustomerNumber(updateForm.getCustomerNumber());
if (exitPick != null && !exitPick.getPickId().equals(updateForm.getPickId())) {
throw new BusinessException(updateForm.getCustomerNumber() + "客户订单号已存在");
}
PickEntity pickEntity = SmartBeanUtil.copy(updateForm, PickEntity.class);
pickManager.updateById(pickEntity);
//业务操作记录
dataTracerService.addTrace(updateForm.getPickId(), DataTracerTypeEnum.PICK, "编辑出库单:" + pickEntity.getPickNumber(), exitPick, pickEntity);
return ResponseDTO.ok(pickEntity);
}
/**
*
*/
@Transactional(rollbackFor = Exception.class)
public ResponseDTO<String> batchDelete(List<Long> idList) {
if (CollectionUtils.isEmpty(idList)) {
return ResponseDTO.userErrorParam(UserErrorCode.PARAM_ERROR.getMsg());
}
JoinerResult resultMsg = JoinerResult.createJoiner();
//查询批量订单
List<PickEntity> pickList = pickQueryService.queryByPickIds(idList);
//将订单按状态分组;已创建的一组;非已创建的一组。
Map<Boolean, List<PickEntity>> partitionedAsnList = pickList.stream()
.collect(Collectors.partitioningBy(pick -> PickOrderStatusEnum.CREATED.getValue().equals(pick.getStatus())));
//已创建的订单允许删除
List<PickEntity> createAsnList = partitionedAsnList.get(true);
//出库单集合
List<Long> pickIds = createAsnList.stream().map(PickEntity::getPickId).toList();
//根据出库单ID集合查询出库明细
List<PickDetailEntity> details = pickDetailQueryService.queryPickDetailByPickIds(pickIds);
if (CollectionUtils.isNotEmpty(details)) {
pickDetailManager.removeBatchByIds(details);
}
if (CollectionUtils.isNotEmpty(createAsnList)) {
Set<String> pickCodes = createAsnList.stream().map(PickEntity::getPickNumber).collect(Collectors.toSet());
pickManager.removeBatchByIds(createAsnList);
resultMsg.getSussMsg().add(pickCodes + "订单删除成功");
}
//非已创建的订单不允许删除
List<PickEntity> noCreateAsnList = partitionedAsnList.get(false);
if (CollectionUtils.isNotEmpty(noCreateAsnList)) {
Set<String> pickCodes = noCreateAsnList.stream().map(PickEntity::getPickNumber).collect(Collectors.toSet());
resultMsg.getErrorMsg().add(pickCodes + "订单不允许删除");
}
return ResponseDTOUtil.buildResponseDTO(resultMsg);
}
/**
*
*/
@Transactional(rollbackFor = Exception.class)
public ResponseDTO<String> delete(Long pickId) {
if (pickId == null) {
return ResponseDTO.userErrorParam(UserErrorCode.PARAM_ERROR.getMsg());
}
PickEntity asn = pickManager.getById(pickId);
String status = asn.getStatus();
// 只有已创建的订单才允许删除
if (!PickOrderStatusEnum.CREATED.getValue().equals(status)) {
return ResponseDTO.userErrorParam(AsnOrderStatusEnum.getDescByValue(status) + "的订单不允许删除");
}
List<PickDetailEntity> details = pickDetailQueryService.queryPickDetailByPickId(pickId);
if (CollectionUtils.isNotEmpty(details)) {
pickDetailManager.removeBatchByIds(details);
}
pickManager.removeById(pickId);
return ResponseDTO.ok();
}
}

View File

@ -0,0 +1,22 @@
# 默认是按前端工程文件的 /views/business 文件夹的路径作为前端组件路径,如果你没把生成的 .vue 前端代码放在 /views/business 下,
# 那就根据自己实际情况修改下面 SQL 的 path,component 字段值,避免执行 SQL 后菜单无法访问。
# 如果你一切都是按照默认,那么下面的 SQL 基本不用改
INSERT INTO t_menu ( menu_name, menu_type, parent_id, path, component, frame_flag, cache_flag, visible_flag, disabled_flag, perms_type, create_user_id )
VALUES ( '出库单', 2, 0, '/pick/list', '/business/pick/pick-list.vue', false, false, true, false, 1, 1 );
# 按菜单名称查询该菜单的 menu_id 作为按钮权限的 父菜单ID 与 功能点关联菜单ID
SET @parent_id = NULL;
SELECT t_menu.menu_id INTO @parent_id FROM t_menu WHERE t_menu.menu_name = '出库单';
INSERT INTO t_menu ( menu_name, menu_type, parent_id, frame_flag, cache_flag, visible_flag, disabled_flag, perms_type, api_perms, web_perms, context_menu_id, create_user_id )
VALUES ( '查询', 3, @parent_id, false, false, true, false, 1, 'pick:query', 'pick:query', @parent_id, 1 );
INSERT INTO t_menu ( menu_name, menu_type, parent_id, frame_flag, cache_flag, visible_flag, disabled_flag, perms_type, api_perms, web_perms, context_menu_id, create_user_id )
VALUES ( '添加', 3, @parent_id, false, false, true, false, 1, 'pick:add', 'pick:add', @parent_id, 1 );
INSERT INTO t_menu ( menu_name, menu_type, parent_id, frame_flag, cache_flag, visible_flag, disabled_flag, perms_type, api_perms, web_perms, context_menu_id, create_user_id )
VALUES ( '更新', 3, @parent_id, false, false, true, false, 1, 'pick:update', 'pick:update', @parent_id, 1 );
INSERT INTO t_menu ( menu_name, menu_type, parent_id, frame_flag, cache_flag, visible_flag, disabled_flag, perms_type, api_perms, web_perms, context_menu_id, create_user_id )
VALUES ( '删除', 3, @parent_id, false, false, true, false, 1, 'pick:delete', 'pick:delete', @parent_id, 1 );

View File

@ -0,0 +1,75 @@
package net.lab1024.sa.admin.module.business.wms.shipping.pickDetail.controller;
import net.lab1024.sa.admin.module.business.wms.shipping.pickDetail.domain.form.PickDetailAddForm;
import net.lab1024.sa.admin.module.business.wms.shipping.pickDetail.domain.form.PickDetailQueryForm;
import net.lab1024.sa.admin.module.business.wms.shipping.pickDetail.domain.form.PickDetailUpdateForm;
import net.lab1024.sa.admin.module.business.wms.shipping.pickDetail.domain.vo.PickDetailVO;
import net.lab1024.sa.admin.module.business.wms.shipping.pickDetail.service.PickDetailQueryService;
import net.lab1024.sa.admin.module.business.wms.shipping.pickDetail.service.PickDetailService;
import net.lab1024.sa.base.common.domain.ValidateList;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import net.lab1024.sa.base.common.domain.ResponseDTO;
import net.lab1024.sa.base.common.domain.PageResult;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Operation;
import cn.dev33.satoken.annotation.SaCheckPermission;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
/**
* Controller
*
* @Author
* @Date 2025-01-06 11:04:32
* @Copyright
*/
@RestController
@Tag(name = "出库明细")
public class PickDetailController {
@Resource
private PickDetailService pickDetailService;
@Resource
private PickDetailQueryService pickDetailQueryService;
@Operation(summary = "分页查询 @author 霍锦")
@PostMapping("/pickDetail/queryPage")
@SaCheckPermission("pickDetail:query")
public ResponseDTO<PageResult<PickDetailVO>> queryPage(@RequestBody @Valid PickDetailQueryForm queryForm) {
return ResponseDTO.ok(pickDetailQueryService.queryPage(queryForm));
}
@Operation(summary = "添加 @author 霍锦")
@PostMapping("/pickDetail/add")
@SaCheckPermission("pickDetail:add")
public ResponseDTO<String> add(@RequestBody @Valid PickDetailAddForm addForm) {
return pickDetailService.add(addForm);
}
@Operation(summary = "更新 @author 霍锦")
@PostMapping("/pickDetail/update")
@SaCheckPermission("pickDetail:update")
public ResponseDTO<String> update(@RequestBody @Valid PickDetailUpdateForm updateForm) {
return pickDetailService.update(updateForm);
}
@Operation(summary = "批量删除 @author 霍锦")
@PostMapping("/pickDetail/batchDelete")
@SaCheckPermission("pickDetail:delete")
public ResponseDTO<String> batchDelete(@RequestBody ValidateList<Long> idList) {
return pickDetailService.batchDelete(idList);
}
@Operation(summary = "单个删除 @author 霍锦")
@GetMapping("/pickDetail/delete/{pickDetailId}")
@SaCheckPermission("pickDetail:delete")
public ResponseDTO<String> batchDelete(@PathVariable Long pickDetailId) {
return pickDetailService.delete(pickDetailId);
}
}

View File

@ -0,0 +1,33 @@
package net.lab1024.sa.admin.module.business.wms.shipping.pickDetail.dao;
import java.util.List;
import net.lab1024.sa.admin.module.business.wms.shipping.pickDetail.domain.entity.PickDetailEntity;
import net.lab1024.sa.admin.module.business.wms.shipping.pickDetail.domain.form.PickDetailQueryForm;
import net.lab1024.sa.admin.module.business.wms.shipping.pickDetail.domain.vo.PickDetailVO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Component;
/**
* Dao
*
* @Author
* @Date 2025-01-06 11:04:32
* @Copyright
*/
@Mapper
public interface PickDetailDao extends BaseMapper<PickDetailEntity> {
/**
*
*
* @param page
* @param queryForm
* @return
*/
List<PickDetailVO> queryPage(Page page, @Param("queryForm") PickDetailQueryForm queryForm);
}

View File

@ -0,0 +1,93 @@
package net.lab1024.sa.admin.module.business.wms.shipping.pickDetail.domain.entity;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import lombok.Data;
/**
*
*
* @Author
* @Date 2025-01-06 11:04:32
* @Copyright
*/
@Data
@TableName("t_pick_detail")
public class PickDetailEntity {
/**
* id
*/
@TableId(type = IdType.AUTO)
private Long pickDetailId;
/**
* id
*/
private Long pickId;
/**
* id
*/
private Long itemId;
/**
*
*/
private String propC1;
/**
*
*/
private LocalDate propD1;
/**
*
*/
private BigDecimal orderQuantity;
/**
*
*/
private BigDecimal allocatedQuantity;
/**
*
*/
private BigDecimal pickedQuantity;
/**
*
*/
private BigDecimal shippedQuantity;
/**
*
*/
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
/**
* ID
*/
private Long createUserId;
/**
*
*/
private String createUserName;
/**
*
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
}

View File

@ -0,0 +1,42 @@
package net.lab1024.sa.admin.module.business.wms.shipping.pickDetail.domain.form;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.DecimalMin;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import lombok.Data;
/**
*
*
* @Author
* @Date 2025-01-06 11:04:32
* @Copyright
*/
@Data
public class PickDetailAddForm {
@Schema(description = "出库单", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "出库单 不能为空")
private Long pickId;
@Schema(description = "物料", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "物料 不能为空")
private Long itemId;
@Schema(description = "订单数量")
@NotNull(message = "订单数量不能为空")
@DecimalMin(value = "1", message = "订单数量最低1")
private BigDecimal orderQuantity;
@Schema(hidden = true)
private Long createUserId;
@Schema(hidden = true)
private String createUserName;
}

View File

@ -0,0 +1,19 @@
package net.lab1024.sa.admin.module.business.wms.shipping.pickDetail.domain.form;
import net.lab1024.sa.base.common.domain.PageParam;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
*
*
* @Author
* @Date 2025-01-06 11:04:32
* @Copyright
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class PickDetailQueryForm extends PageParam {
}

View File

@ -0,0 +1,22 @@
package net.lab1024.sa.admin.module.business.wms.shipping.pickDetail.domain.form;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
/**
*
*
* @Author
* @Date 2025-01-06 11:04:32
* @Copyright
*/
@Data
public class PickDetailUpdateForm extends PickDetailAddForm{
@Schema(description = "出库明细id", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "出库明细id 不能为空")
private Long pickDetailId;
}

View File

@ -0,0 +1,51 @@
package net.lab1024.sa.admin.module.business.wms.shipping.pickDetail.domain.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import lombok.Data;
/**
* VO
*
* @Author
* @Date 2025-01-06 11:04:32
* @Copyright
*/
@Data
public class PickDetailVO {
@Schema(description = "出库明细id")
private Long pickDetailId;
@Schema(description = "出库单id")
private Long pickId;
@Schema(description = "物料id")
private Long itemId;
@Schema(description = "批次号")
private String propC1;
@Schema(description = "生产日期")
private LocalDate propD1;
@Schema(description = "订单数量")
private BigDecimal orderQuantity;
@Schema(description = "分配数量")
private BigDecimal allocatedQuantity;
@Schema(description = "拣货数量")
private BigDecimal pickedQuantity;
@Schema(description = "发运数量")
private BigDecimal shippedQuantity;
@Schema(description = "创建时间")
private LocalDateTime createTime;
}

View File

@ -0,0 +1,20 @@
package net.lab1024.sa.admin.module.business.wms.shipping.pickDetail.manager;
import net.lab1024.sa.admin.module.business.wms.shipping.pickDetail.dao.PickDetailDao;
import net.lab1024.sa.admin.module.business.wms.shipping.pickDetail.domain.entity.PickDetailEntity;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* Manager
*
* @Author
* @Date 2025-01-06 11:04:32
* @Copyright
*/
@Service
public class PickDetailManager extends ServiceImpl<PickDetailDao, PickDetailEntity> {
}

View File

@ -0,0 +1,50 @@
package net.lab1024.sa.admin.module.business.wms.shipping.pickDetail.service;
import net.lab1024.sa.admin.module.business.wms.receive.asnDetail.domain.entity.AsnDetailEntity;
import net.lab1024.sa.admin.module.business.wms.shipping.pickDetail.domain.entity.PickDetailEntity;
import net.lab1024.sa.admin.module.business.wms.shipping.pickDetail.domain.form.PickDetailQueryForm;
import net.lab1024.sa.admin.module.business.wms.shipping.pickDetail.domain.vo.PickDetailVO;
import net.lab1024.sa.base.common.domain.PageResult;
import java.util.List;
import java.util.Map;
public interface PickDetailQueryService {
/**
*
*/
PageResult<PickDetailVO> queryPage(PickDetailQueryForm queryForm);
/**
* id
*
* @param pickId id
* @return List<PickDetailEntity>
*/
List<PickDetailEntity> queryPickDetailByPickId(Long pickId);
/**
* ids
*
* @param pickIds ids
* @return List<PickDetailEntity>
*/
List<PickDetailEntity> queryPickDetailByPickIds(List<Long> pickIds);
/**
* ids
*
* @param idList
* @return List<PickDetailEntity>
*/
List<PickDetailEntity> queryByPickDetailIds(List<Long> idList);
/**
*
*
* @param idList
* @return Map<String, PickDetailEntity>
*/
Map<Long, PickDetailEntity> queryByPickDetailIdsToMap(List<Long> idList);
}

View File

@ -0,0 +1,38 @@
package net.lab1024.sa.admin.module.business.wms.shipping.pickDetail.service;
import java.util.List;
import net.lab1024.sa.admin.module.business.wms.shipping.pickDetail.domain.form.PickDetailAddForm;
import net.lab1024.sa.admin.module.business.wms.shipping.pickDetail.domain.form.PickDetailUpdateForm;
import net.lab1024.sa.base.common.domain.ResponseDTO;
/**
* Service
*
* @Author
* @Date 2025-01-06 11:04:32
* @Copyright
*/
public interface PickDetailService {
/**
*
*/
ResponseDTO<String> add(PickDetailAddForm addForm);
/**
*
*/
ResponseDTO<String> update(PickDetailUpdateForm updateForm);
/**
*
*/
ResponseDTO<String> batchDelete(List<Long> idList);
/**
*
*/
ResponseDTO<String> delete(Long pickDetailId);
}

View File

@ -0,0 +1,109 @@
package net.lab1024.sa.admin.module.business.wms.shipping.pickDetail.service.impl;
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.shipping.pickDetail.dao.PickDetailDao;
import net.lab1024.sa.admin.module.business.wms.shipping.pickDetail.domain.entity.PickDetailEntity;
import net.lab1024.sa.admin.module.business.wms.shipping.pickDetail.domain.form.PickDetailQueryForm;
import net.lab1024.sa.admin.module.business.wms.shipping.pickDetail.domain.vo.PickDetailVO;
import net.lab1024.sa.admin.module.business.wms.shipping.pickDetail.manager.PickDetailManager;
import net.lab1024.sa.admin.module.business.wms.shipping.pickDetail.service.PickDetailQueryService;
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.Objects;
@Service
public class PickDetailQueryServiceImpl implements PickDetailQueryService {
@Resource
private PickDetailDao pickDetailDao;
@Resource
private PickDetailManager pickDetailManager;
/**
*
*/
public PageResult<PickDetailVO> queryPage(PickDetailQueryForm queryForm) {
Page<?> page = SmartPageUtil.convert2PageQuery(queryForm);
List<PickDetailVO> list = pickDetailDao.queryPage(page, queryForm);
return SmartPageUtil.convert2PageResult(page, list);
}
/**
* id
*
* @param pickId id
* @return List<PickDetailEntity>
*/
public List<PickDetailEntity> queryPickDetailByPickId(Long pickId) {
if (pickId == null) {
return null;
}
LambdaQueryWrapper<PickDetailEntity> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(PickDetailEntity::getPickId, pickId);
return pickDetailManager.list(queryWrapper);
}
/**
* ids
*
* @param pickIds id
* @return List<PickDetailEntity>
*/
public List<PickDetailEntity> queryPickDetailByPickIds(List<Long> pickIds) {
if (CollectionUtils.isEmpty(pickIds)) {
return Collections.emptyList();
}
//去重
pickIds = pickIds.stream().filter(Objects::nonNull).distinct().toList();
LambdaQueryWrapper<PickDetailEntity> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.in(PickDetailEntity::getPickId, pickIds);
return pickDetailManager.list(queryWrapper);
}
/**
* ids
*
* @param idList
* @return List<PickDetailEntity>
*/
public List<PickDetailEntity> queryByPickDetailIds(List<Long> idList) {
if (CollectionUtils.isEmpty(idList)) {
return Collections.emptyList();
}
//去重
idList = idList.stream().filter(Objects::nonNull).distinct().toList();
return pickDetailManager.listByIds(idList);
}
/**
*
*
* @param idList
* @return Map<String, AsnDetailEntity>
*/
public Map<Long, PickDetailEntity> queryByPickDetailIdsToMap(List<Long> idList) {
if (CollectionUtils.isEmpty(idList)) {
return Collections.emptyMap();
}
//查询明细
List<PickDetailEntity> pickDetails = queryByPickDetailIds(idList);
//封装map
Map<Long, PickDetailEntity> pickDetailMap = Maps.newHashMap();
for (PickDetailEntity pickDetail : pickDetails) {
pickDetailMap.put(pickDetail.getPickDetailId(), pickDetail);
}
return pickDetailMap;
}
}

View File

@ -0,0 +1,211 @@
package net.lab1024.sa.admin.module.business.wms.shipping.pickDetail.service.impl;
import jakarta.annotation.Resource;
import net.lab1024.sa.admin.module.business.wms.base.item.domain.entity.ItemEntity;
import net.lab1024.sa.admin.module.business.wms.base.item.manager.ItemManager;
import net.lab1024.sa.admin.module.business.wms.base.item.service.ItemQueryService;
import net.lab1024.sa.admin.module.business.wms.shipping.pick.constant.PickOrderStatusEnum;
import net.lab1024.sa.admin.module.business.wms.shipping.pick.domain.entity.PickEntity;
import net.lab1024.sa.admin.module.business.wms.shipping.pick.manager.PickManager;
import net.lab1024.sa.admin.module.business.wms.shipping.pickDetail.domain.entity.PickDetailEntity;
import net.lab1024.sa.admin.module.business.wms.shipping.pickDetail.domain.form.PickDetailAddForm;
import net.lab1024.sa.admin.module.business.wms.shipping.pickDetail.domain.form.PickDetailUpdateForm;
import net.lab1024.sa.admin.module.business.wms.shipping.pickDetail.manager.PickDetailManager;
import net.lab1024.sa.admin.module.business.wms.shipping.pickDetail.service.PickDetailQueryService;
import net.lab1024.sa.admin.module.business.wms.shipping.pickDetail.service.PickDetailService;
import net.lab1024.sa.admin.util.JoinerResult;
import net.lab1024.sa.admin.util.ResponseDTOUtil;
import net.lab1024.sa.base.common.code.UserErrorCode;
import net.lab1024.sa.base.common.domain.ResponseDTO;
import net.lab1024.sa.base.common.util.SmartBeanUtil;
import net.lab1024.sa.base.common.util.SmartBigDecimalUtil;
import net.lab1024.sa.base.module.support.datatracer.constant.DataTracerTypeEnum;
import net.lab1024.sa.base.module.support.datatracer.service.DataTracerService;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@Service
public class PickDetailServiceImpl implements PickDetailService {
@Resource
private ItemManager itemManager;
@Resource
private PickManager pickManager;
@Resource
private PickDetailManager pickDetailManager;
@Resource
private ItemQueryService itemQueryService;
@Resource
private PickDetailQueryService pickDetailQueryService;
@Resource
private DataTracerService dataTracerService;
/**
*
*/
@Transactional(rollbackFor = Exception.class)
public ResponseDTO<String> add(PickDetailAddForm addForm) {
PickDetailEntity pickDetailEntity = SmartBeanUtil.copy(addForm, PickDetailEntity.class);
pickDetailManager.save(pickDetailEntity);
//刷新出库单
refreshPick(addForm.getPickId());
//业务操作记录
ItemEntity item = itemManager.queryItem(addForm.getItemId());
dataTracerService.addTrace(pickDetailEntity.getPickId(), DataTracerTypeEnum.PICK, "添加:" + item.getItemCode() + "物料明细", null, pickDetailEntity);
return ResponseDTO.ok();
}
/**
*
*/
public ResponseDTO<String> update(PickDetailUpdateForm updateForm) {
PickDetailEntity originEntity = pickDetailManager.getById(updateForm.getPickDetailId());
PickDetailEntity pickDetailEntity = SmartBeanUtil.copy(updateForm, PickDetailEntity.class);
pickDetailManager.updateById(pickDetailEntity);
//刷新出库单
refreshPick(updateForm.getPickId());
ItemEntity item = itemManager.queryItem(updateForm.getItemId());
dataTracerService.addTrace(pickDetailEntity.getPickId(), DataTracerTypeEnum.PICK, "编辑:" + item.getItemCode() + "物料明细", originEntity, pickDetailEntity);
return ResponseDTO.ok();
}
/**
*
*/
@Transactional(rollbackFor = Exception.class)
public ResponseDTO<String> batchDelete(List<Long> idList) {
if (CollectionUtils.isEmpty(idList)) {
return ResponseDTO.userErrorParam(UserErrorCode.PARAM_ERROR.getMsg());
}
//消息提示
JoinerResult resultMsg = JoinerResult.createJoiner();
//查询出库明细
List<PickDetailEntity> pickDetails = pickDetailQueryService.queryByPickDetailIds(idList);
//获取出库明细去重后的入库单ID集合
List<Long> pickIds = pickDetails.stream().filter(Objects::nonNull).map(PickDetailEntity::getPickId).distinct().toList();
//获取物料id集合
List<Long> itemIds = pickDetails.stream().map(PickDetailEntity::getItemId).toList();
//查询物料
Map<Long, ItemEntity> mapItem = itemQueryService.queryByItemIdsToMap(itemIds);
List<Long> toDeleteList = new ArrayList<>();
for (PickDetailEntity pickDetail : pickDetails) {
ItemEntity item = mapItem.get(pickDetail.getItemId());
if (pickDetail.getAllocatedQuantity().compareTo(BigDecimal.ZERO) > 0) {
resultMsg.getErrorMsg().add(item.getItemCode() + "明细已分配");
continue;
}
toDeleteList.add(pickDetail.getPickDetailId());
resultMsg.getSussMsg().add(item.getItemCode() + "明细删除成功");
}
if (CollectionUtils.isNotEmpty(toDeleteList)) {
//批量删除
pickDetailManager.removeBatchByIds(toDeleteList);
//操作记录
dataTracerService.addTrace(pickIds.get(0), DataTracerTypeEnum.PICK, "批量删除:" + resultMsg.getSussMsg().toString() + resultMsg.getErrorMsg().toString());
}
//刷新出库单
pickIds.forEach(this::refreshPick);
return ResponseDTOUtil.buildResponseDTO(resultMsg);
}
/**
*
*/
public ResponseDTO<String> delete(Long pickDetailId) {
if (null == pickDetailId) {
return ResponseDTO.userErrorParam(UserErrorCode.PARAM_ERROR.getMsg());
}
//消息提示
JoinerResult resultMsg = JoinerResult.createJoiner();
//出库明细
PickDetailEntity pickDetail = pickDetailManager.getById(pickDetailId);
//物料
ItemEntity item = itemManager.queryItem(pickDetail.getItemId());
if (pickDetail.getAllocatedQuantity().compareTo(BigDecimal.ZERO) > 0) {
resultMsg.getErrorMsg().add(item.getItemCode() + "明细已分配");
return ResponseDTOUtil.buildResponseDTO(resultMsg);
}
Long pickId = pickDetail.getPickId();
pickDetailManager.removeById(pickDetailId);
resultMsg.getSussMsg().add(item.getItemCode() + "删除成功");
//刷新出库单
refreshPick(pickId);
//操作记录
dataTracerService.addTrace(pickId, DataTracerTypeEnum.PICK, "删除:" + resultMsg.getSussMsg().toString() + resultMsg.getErrorMsg().toString());
return ResponseDTOUtil.buildResponseDTO(resultMsg);
}
public void refreshPick(Long pickId) {
//出库单
PickEntity pick = pickManager.getById(pickId);
//获取订单明细
List<PickDetailEntity> pickDetails = pickDetailQueryService.queryPickDetailByPickId(pickId);
//订单数量
BigDecimal orderQuantity = pickDetails.stream().map(PickDetailEntity::getOrderQuantity).reduce(BigDecimal.ZERO, BigDecimal::add);
//分配数量
BigDecimal allocatedQuantity = pickDetails.stream().map(PickDetailEntity::getAllocatedQuantity).reduce(BigDecimal.ZERO, BigDecimal::add);
//拣货数量
BigDecimal pickedQuantity = pickDetails.stream().map(PickDetailEntity::getPickedQuantity).reduce(BigDecimal.ZERO, BigDecimal::add);
//当前状态
String status = pick.getStatus();
if (orderQuantity.compareTo(BigDecimal.ZERO) >= 0 && allocatedQuantity.compareTo(BigDecimal.ZERO) == 0 && pickedQuantity.compareTo(BigDecimal.ZERO) == 0) {
status = PickOrderStatusEnum.CREATED.getValue();
} else if (SmartBigDecimalUtil.subtract(orderQuantity, allocatedQuantity, 2).compareTo(BigDecimal.ZERO) > 0 && allocatedQuantity.compareTo(BigDecimal.ZERO) > 0 && pickedQuantity.compareTo(BigDecimal.ZERO) == 0) {
status = PickOrderStatusEnum.PARTIALLY_ALLOCATED.getValue();
} else if (SmartBigDecimalUtil.subtract(orderQuantity, allocatedQuantity, 2).compareTo(BigDecimal.ZERO) == 0 && allocatedQuantity.compareTo(BigDecimal.ZERO) > 0 && pickedQuantity.compareTo(BigDecimal.ZERO) == 0) {
status = PickOrderStatusEnum.ALLOCATED.getValue();
}else if(SmartBigDecimalUtil.subtract(orderQuantity, pickedQuantity, 2).compareTo(BigDecimal.ZERO) > 0 && allocatedQuantity.compareTo(BigDecimal.ZERO) > 0 && pickedQuantity.compareTo(BigDecimal.ZERO) > 0){
status = PickOrderStatusEnum.PARTIALLY_PICKED.getValue();
}else if(SmartBigDecimalUtil.subtract(orderQuantity, pickedQuantity, 2).compareTo(BigDecimal.ZERO) == 0 && allocatedQuantity.compareTo(BigDecimal.ZERO) > 0 && pickedQuantity.compareTo(BigDecimal.ZERO) > 0){
status = PickOrderStatusEnum.COMPLETED.getValue();
}
pick.setOrderQuantity(orderQuantity);
pick.setAllocatedQuantity(allocatedQuantity);
pick.setPickedQuantity(pickedQuantity);
pick.setStatus(status);
pickManager.updateById(pick);
}
}

View File

@ -0,0 +1,22 @@
# 默认是按前端工程文件的 /views/business 文件夹的路径作为前端组件路径,如果你没把生成的 .vue 前端代码放在 /views/business 下,
# 那就根据自己实际情况修改下面 SQL 的 path,component 字段值,避免执行 SQL 后菜单无法访问。
# 如果你一切都是按照默认,那么下面的 SQL 基本不用改
INSERT INTO t_menu ( menu_name, menu_type, parent_id, path, component, frame_flag, cache_flag, visible_flag, disabled_flag, perms_type, create_user_id )
VALUES ( '出库明细', 2, 0, '/pick-detail/list', '/business/pick-detail/pick-detail-list.vue', false, false, true, false, 1, 1 );
# 按菜单名称查询该菜单的 menu_id 作为按钮权限的 父菜单ID 与 功能点关联菜单ID
SET @parent_id = NULL;
SELECT t_menu.menu_id INTO @parent_id FROM t_menu WHERE t_menu.menu_name = '出库明细';
INSERT INTO t_menu ( menu_name, menu_type, parent_id, frame_flag, cache_flag, visible_flag, disabled_flag, perms_type, api_perms, web_perms, context_menu_id, create_user_id )
VALUES ( '查询', 3, @parent_id, false, false, true, false, 1, 'pickDetail:query', 'pickDetail:query', @parent_id, 1 );
INSERT INTO t_menu ( menu_name, menu_type, parent_id, frame_flag, cache_flag, visible_flag, disabled_flag, perms_type, api_perms, web_perms, context_menu_id, create_user_id )
VALUES ( '添加', 3, @parent_id, false, false, true, false, 1, 'pickDetail:add', 'pickDetail:add', @parent_id, 1 );
INSERT INTO t_menu ( menu_name, menu_type, parent_id, frame_flag, cache_flag, visible_flag, disabled_flag, perms_type, api_perms, web_perms, context_menu_id, create_user_id )
VALUES ( '更新', 3, @parent_id, false, false, true, false, 1, 'pickDetail:update', 'pickDetail:update', @parent_id, 1 );
INSERT INTO t_menu ( menu_name, menu_type, parent_id, frame_flag, cache_flag, visible_flag, disabled_flag, perms_type, api_perms, web_perms, context_menu_id, create_user_id )
VALUES ( '删除', 3, @parent_id, false, false, true, false, 1, 'pickDetail:delete', 'pickDetail:delete', @parent_id, 1 );

View File

@ -0,0 +1,32 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="net.lab1024.sa.admin.module.business.wms.shipping.pick.dao.PickDao">
<!-- 查询结果列 -->
<sql id="base_columns">
t_pick.pick_id,
t_pick.pick_number,
t_pick.customer_number,
t_pick.order_type,
t_pick.status,
t_pick.address_id,
t_pick.order_quantity,
t_pick.allocated_quantity,
t_pick.picked_quantity,
t_pick.shipped_quantity,
t_pick.order_date,
t_pick.create_time,
t_pick.create_user_id,
t_pick.create_user_name,
t_pick.update_time
</sql>
<!-- 分页查询 -->
<select id="queryPage" resultType="net.lab1024.sa.admin.module.business.wms.shipping.pick.domain.vo.PickVO">
SELECT
<include refid="base_columns"/>
FROM t_pick
</select>
</mapper>

View File

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="net.lab1024.sa.admin.module.business.wms.shipping.pickDetail.dao.PickDetailDao">
<!-- 查询结果列 -->
<sql id="base_columns">
t_pick_detail.pick_detail_id,
t_pick_detail.pick_id,
t_pick_detail.item_id,
t_pick_detail.prop_C1,
t_pick_detail.prop_D1,
t_pick_detail.order_quantity,
t_pick_detail.allocated_quantity,
t_pick_detail.picked_quantity,
t_pick_detail.shipped_quantity,
t_pick_detail.create_time,
t_pick_detail.create_user_id,
t_pick_detail.create_user_name,
t_pick_detail.update_time
</sql>
<!-- 分页查询 -->
<select id="queryPage" resultType="net.lab1024.sa.admin.module.business.wms.shipping.pickDetail.domain.vo.PickDetailVO">
SELECT
<include refid="base_columns"/>
FROM t_pick_detail
</select>
</mapper>

View File

@ -89,6 +89,7 @@ public class RedisConfig {
// 1. 高频查询且更新不频繁的数据
configMap.put("item_cache", defaultConfig.entryTtl(Duration.ofHours(12)));
configMap.put("item_key_cache", defaultConfig.entryTtl(Duration.ofHours(12)));
configMap.put("customer_cache", defaultConfig.entryTtl(Duration.ofHours(8)));
configMap.put("address_cache", defaultConfig.entryTtl(Duration.ofHours(24)));

View File

@ -38,6 +38,11 @@ public enum DataTracerTypeEnum implements BaseEnum {
*/
ASN(4, "入库"),
/**
*
*/
PICK(5, "出库"),
;

View File

@ -25,7 +25,9 @@ public enum SerialNumberIdEnum implements BaseEnum {
ASN(4, "入库单编号"),
TASK(5, "任务编号"),
PICK(5, "出库单编号"),
TASK(6, "任务编号"),
;

View File

@ -10,10 +10,5 @@
热爱代码 热爱生活 !
永远年轻 永远前行 !
SmartAdmin v3.X 作者1024创新实验室 @copyright【 1024lab 】
SmartAdmin 文档地址https://smartadmin.vip
1024创新实验室https://www.1024lab.net
${AnsiColor.DEFAULT}

View File

@ -1,7 +1,7 @@
spring:
# 数据库连接信息
datasource:
url: jdbc:p6spy:mysql://123.60.65.29:3306/nc_wms?autoReconnect=true&useServerPreparedStmts=false&rewriteBatchedStatements=true&characterEncoding=UTF-8&useSSL=false&allowMultiQueries=true&serverTimezone=Asia/Shanghai
url: jdbc:p6spy:mysql://localhost:3306/nc_wms?autoReconnect=true&useServerPreparedStmts=false&rewriteBatchedStatements=true&characterEncoding=UTF-8&useSSL=false&allowMultiQueries=true&serverTimezone=Asia/Shanghai
username: root
password: root
driver-class-name: com.p6spy.engine.spy.P6SpyDriver
@ -24,7 +24,7 @@ spring:
data:
redis:
database: 1
host: 123.60.65.29
host: 127.0.0.1
port: 6379
password: 123456
timeout: 10000ms