diff --git a/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/constant/AdminCacheConst.java b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/constant/AdminCacheConst.java index aeade9c..e94bbff 100644 --- a/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/constant/AdminCacheConst.java +++ b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/constant/AdminCacheConst.java @@ -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"; } diff --git a/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/inventory/inventory/service/InventoryQueryService.java b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/inventory/inventory/service/InventoryQueryService.java index ca2737c..e97065b 100644 --- a/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/inventory/inventory/service/InventoryQueryService.java +++ b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/inventory/inventory/service/InventoryQueryService.java @@ -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 queryPage(InventoryQueryForm queryForm) { - Page page = SmartPageUtil.convert2PageQuery(queryForm); - List list = inventoryDao.queryPage(page, queryForm); - // 查询物料属性 - List itemKeyIds = list.stream().map(InventoryVO::getItemKeyId).toList(); - Map itemKeyMap = itemKeyQueryService.queryByItemKeyIds(itemKeyIds); - - //查询物料 - List itemIds = itemKeyMap.values().stream().map(ItemKeyEntity::getItemId).toList(); - Map itemMap = itemQueryService.queryByItemIdsToMap(itemIds); - - //查询容器 - List stockIds = list.stream().map(InventoryVO::getStockId).toList(); - Map stockMap = stockQueryService.queryByStockIdsToMap(stockIds); - - //查询库位 - List locationIds = list.stream().map(InventoryVO::getLocationId).toList(); - Map 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 queryPage(InventoryQueryForm queryForm); /** * @param ItemKeyId 物料 * @return InventoryEntity */ - public InventoryEntity queryInventoryByItemKeyId(Long ItemKeyId) { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(InventoryEntity::getItemKeyId, ItemKeyId); - return inventoryDao.selectOne(queryWrapper); - } + InventoryEntity queryInventoryByItemKeyId(Long ItemKeyId); } diff --git a/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/inventory/inventory/service/InventoryService.java b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/inventory/inventory/service/InventoryService.java index 3f5d649..5245b90 100644 --- a/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/inventory/inventory/service/InventoryService.java +++ b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/inventory/inventory/service/InventoryService.java @@ -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 add(InventoryAddForm addForm) { - InventoryEntity inventoryEntity = SmartBeanUtil.copy(addForm, InventoryEntity.class); - inventoryDao.insert(inventoryEntity); - return ResponseDTO.ok(); - } + ResponseDTO add(InventoryAddForm addForm); /** * 更新 - * */ - @Transactional(rollbackFor = Exception.class) - public ResponseDTO update(InventoryUpdateForm updateForm) { - InventoryEntity inventoryEntity = SmartBeanUtil.copy(updateForm, InventoryEntity.class); - inventoryDao.updateById(inventoryEntity); - return ResponseDTO.ok(); - } + ResponseDTO update(InventoryUpdateForm updateForm); /** * 批量删除 */ - @Transactional(rollbackFor = Exception.class) - public ResponseDTO batchDelete(List idList) { - if (CollectionUtils.isEmpty(idList)){ - return ResponseDTO.userErrorParam(UserErrorCode.PARAM_ERROR.getMsg()); - } - - inventoryManager.removeBatchByIds(idList); - return ResponseDTO.ok(); - } + ResponseDTO batchDelete(List idList); /** * 单个删除 */ - @Transactional(rollbackFor = Exception.class) - public ResponseDTO delete(Long inventoryId) { - if (null == inventoryId){ - return ResponseDTO.userErrorParam(UserErrorCode.PARAM_ERROR.getMsg()); - } + ResponseDTO 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); + } diff --git a/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/inventory/inventory/service/impl/InventoryQueryServiceImpl.java b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/inventory/inventory/service/impl/InventoryQueryServiceImpl.java new file mode 100644 index 0000000..67f8026 --- /dev/null +++ b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/inventory/inventory/service/impl/InventoryQueryServiceImpl.java @@ -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 queryPage(InventoryQueryForm queryForm) { + Page page = SmartPageUtil.convert2PageQuery(queryForm); + List list = inventoryDao.queryPage(page, queryForm); + // 查询物料属性 + List itemKeyIds = list.stream().map(InventoryVO::getItemKeyId).toList(); + Map itemKeyMap = itemKeyQueryService.queryByItemKeyIds(itemKeyIds); + + //查询物料 + List itemIds = itemKeyMap.values().stream().map(ItemKeyEntity::getItemId).toList(); + Map itemMap = itemQueryService.queryByItemIdsToMap(itemIds); + + //查询容器 + List stockIds = list.stream().map(InventoryVO::getStockId).toList(); + Map stockMap = stockQueryService.queryByStockIdsToMap(stockIds); + + //查询库位 + List locationIds = list.stream().map(InventoryVO::getLocationId).toList(); + Map 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 queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(InventoryEntity::getItemKeyId, ItemKeyId); + return inventoryManager.getOne(queryWrapper); + } +} diff --git a/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/inventory/inventory/service/impl/InventoryServiceImpl.java b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/inventory/inventory/service/impl/InventoryServiceImpl.java new file mode 100644 index 0000000..9531e66 --- /dev/null +++ b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/inventory/inventory/service/impl/InventoryServiceImpl.java @@ -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 add(InventoryAddForm addForm) { + InventoryEntity inventoryEntity = SmartBeanUtil.copy(addForm, InventoryEntity.class); + inventoryManager.save(inventoryEntity); + return ResponseDTO.ok(); + } + + /** + * 更新 + */ + @Transactional(rollbackFor = Exception.class) + public ResponseDTO update(InventoryUpdateForm updateForm) { + InventoryEntity inventoryEntity = SmartBeanUtil.copy(updateForm, InventoryEntity.class); + inventoryManager.updateById(inventoryEntity); + return ResponseDTO.ok(); + } + + /** + * 批量删除 + */ + @Transactional(rollbackFor = Exception.class) + public ResponseDTO batchDelete(List idList) { + if (CollectionUtils.isEmpty(idList)) { + return ResponseDTO.userErrorParam(UserErrorCode.PARAM_ERROR.getMsg()); + } + + inventoryManager.removeBatchByIds(idList); + return ResponseDTO.ok(); + } + + /** + * 单个删除 + */ + @Transactional(rollbackFor = Exception.class) + public ResponseDTO 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(); + } +} diff --git a/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/inventory/itemKey/manager/ItemKeyManager.java b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/inventory/itemKey/manager/ItemKeyManager.java index d8d893d..cc82bd9 100644 --- a/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/inventory/itemKey/manager/ItemKeyManager.java +++ b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/inventory/itemKey/manager/ItemKeyManager.java @@ -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 { @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 entities) { + super.updateBatchById(entities); + List itemKeyIds = entities.stream().map(ItemKeyEntity::getItemKeyId).filter(Objects::nonNull).distinct().toList(); + itemKeyIds.forEach(this::clearCache); + } + + /** + * 批量删除物料(清理相关缓存) + */ + @Transactional(rollbackFor = Exception.class) + public void batchDelete(List 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); + } + } + } + + } diff --git a/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/inventory/itemKey/service/ItemKeyQueryService.java b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/inventory/itemKey/service/ItemKeyQueryService.java index b63155f..0d0079d 100644 --- a/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/inventory/itemKey/service/ItemKeyQueryService.java +++ b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/inventory/itemKey/service/ItemKeyQueryService.java @@ -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 queryPage(ItemKeyQueryForm queryForm) { - Page page = SmartPageUtil.convert2PageQuery(queryForm); - List list = itemKeyDao.queryPage(page, queryForm); - return SmartPageUtil.convert2PageResult(page, list); - } + PageResult queryPage(ItemKeyQueryForm queryForm); /** * 根据物料属性ID集合查询物料属性信息 @@ -43,30 +22,15 @@ public class ItemKeyQueryService { * @param itemKeyIdList 物料属性ID集合 * @return Map */ - public Map queryByItemKeyIds(List itemKeyIdList) { - if (CollectionUtils.isEmpty(itemKeyIdList)) { - return Collections.emptyMap(); - } - itemKeyIdList = itemKeyIdList.stream().filter(Objects::nonNull).distinct().toList(); - Map itemKeyMap = Maps.newHashMap(); - for (Long itemKeyId : itemKeyIdList) { - ItemKeyEntity itemKey = itemKeyManager.queryItemKey(itemKeyId); - if (itemKey != null) { - itemKeyMap.put(itemKeyId, itemKey); - } - } - return itemKeyMap; - } + Map queryByItemKeyIds(List itemKeyIdList); - public ItemKeyEntity queryItemKey(String orderNumber, Long itemId, String propC1) { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(ItemKeyEntity::getOrderNumber, orderNumber); - queryWrapper.eq(ItemKeyEntity::getItemId, itemId); - queryWrapper.eq(ItemKeyEntity::getPropC1, propC1); - List itemKeys = itemKeyManager.list(queryWrapper); - if (CollectionUtils.isEmpty(itemKeys)) { - return null; - } - return itemKeys.get(0); - } + /** + * 根据订单号、物料ID、属性C1查询物料属性信息 + * + * @param orderNumber 订单号 + * @param itemId 物料 + * @param propC1 批次 + * @return ItemKeyEntity + */ + ItemKeyEntity queryItemKey(String orderNumber, Long itemId, String propC1); } diff --git a/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/inventory/itemKey/service/ItemKeyService.java b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/inventory/itemKey/service/ItemKeyService.java index 84771be..eb9cee9 100644 --- a/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/inventory/itemKey/service/ItemKeyService.java +++ b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/inventory/itemKey/service/ItemKeyService.java @@ -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 add(ItemKeyAddForm addForm) { - ItemKeyEntity itemKeyEntity = SmartBeanUtil.copy(addForm, ItemKeyEntity.class); - itemKeyManager.save(itemKeyEntity); - return ResponseDTO.ok(); - } + ResponseDTO add(ItemKeyAddForm addForm); /** * 更新 */ - @Transactional(rollbackFor = Exception.class) - public ResponseDTO update(ItemKeyUpdateForm updateForm) { - ItemKeyEntity itemKeyEntity = SmartBeanUtil.copy(updateForm, ItemKeyEntity.class); - itemKeyManager.updateById(itemKeyEntity); - return ResponseDTO.ok(); - } + ResponseDTO update(ItemKeyUpdateForm updateForm); /** * 批量删除 */ - @Transactional(rollbackFor = Exception.class) - public ResponseDTO batchDelete(List idList) { - if (CollectionUtils.isEmpty(idList)) { - return ResponseDTO.userErrorParam(UserErrorCode.PARAM_ERROR.getMsg()); - } - - itemKeyManager.removeBatchByIds(idList); - return ResponseDTO.ok(); - } + ResponseDTO batchDelete(List idList); /** * 单个删除 */ - @Transactional(rollbackFor = Exception.class) - public ResponseDTO delete(Long itemKeyId) { - if (null == itemKeyId) { - return ResponseDTO.userErrorParam(UserErrorCode.PARAM_ERROR.getMsg()); - } - - itemKeyManager.removeById(itemKeyId); - return ResponseDTO.ok(); - } + ResponseDTO 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); } diff --git a/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/inventory/itemKey/service/impl/ItemKeyQueryServiceImpl.java b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/inventory/itemKey/service/impl/ItemKeyQueryServiceImpl.java new file mode 100644 index 0000000..0e9f8ba --- /dev/null +++ b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/inventory/itemKey/service/impl/ItemKeyQueryServiceImpl.java @@ -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 queryPage(ItemKeyQueryForm queryForm) { + Page page = SmartPageUtil.convert2PageQuery(queryForm); + List list = itemKeyDao.queryPage(page, queryForm); + return SmartPageUtil.convert2PageResult(page, list); + } + + /** + * 根据物料属性ID集合查询物料属性信息 + * + * @param itemKeyIdList 物料属性ID集合 + * @return Map + */ + public Map queryByItemKeyIds(List itemKeyIdList) { + if (CollectionUtils.isEmpty(itemKeyIdList)) { + return Collections.emptyMap(); + } + itemKeyIdList = itemKeyIdList.stream().filter(Objects::nonNull).distinct().toList(); + Map 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 queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(ItemKeyEntity::getOrderNumber, orderNumber); + queryWrapper.eq(ItemKeyEntity::getItemId, itemId); + queryWrapper.eq(ItemKeyEntity::getPropC1, propC1); + List itemKeys = itemKeyManager.list(queryWrapper); + if (CollectionUtils.isEmpty(itemKeys)) { + return null; + } + return itemKeys.get(0); + } +} diff --git a/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/inventory/itemKey/service/impl/ItemKeyServiceImpl.java b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/inventory/itemKey/service/impl/ItemKeyServiceImpl.java new file mode 100644 index 0000000..36c53e9 --- /dev/null +++ b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/inventory/itemKey/service/impl/ItemKeyServiceImpl.java @@ -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 add(ItemKeyAddForm addForm) { + ItemKeyEntity itemKeyEntity = SmartBeanUtil.copy(addForm, ItemKeyEntity.class); + itemKeyManager.save(itemKeyEntity); + return ResponseDTO.ok(); + } + + /** + * 更新 + */ + @Transactional(rollbackFor = Exception.class) + public ResponseDTO update(ItemKeyUpdateForm updateForm) { + ItemKeyEntity itemKeyEntity = SmartBeanUtil.copy(updateForm, ItemKeyEntity.class); + itemKeyManager.update(itemKeyEntity); + return ResponseDTO.ok(); + } + + /** + * 批量删除 + */ + @Transactional(rollbackFor = Exception.class) + public ResponseDTO batchDelete(List idList) { + if (CollectionUtils.isEmpty(idList)) { + return ResponseDTO.userErrorParam(UserErrorCode.PARAM_ERROR.getMsg()); + } + + itemKeyManager.batchDelete(idList); + return ResponseDTO.ok(); + } + + /** + * 单个删除 + */ + @Transactional(rollbackFor = Exception.class) + public ResponseDTO 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; + } +} diff --git a/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/receive/asn/constant/AsnOrderStatusEnum.java b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/receive/asn/constant/AsnOrderStatusEnum.java index 8be408d..b717843 100644 --- a/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/receive/asn/constant/AsnOrderStatusEnum.java +++ b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/receive/asn/constant/AsnOrderStatusEnum.java @@ -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; diff --git a/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/receive/asn/constant/AsnOrderTypeEnum.java b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/receive/asn/constant/AsnOrderTypeEnum.java index d5045ae..bdff925 100644 --- a/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/receive/asn/constant/AsnOrderTypeEnum.java +++ b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/receive/asn/constant/AsnOrderTypeEnum.java @@ -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; diff --git a/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pick/constant/PickOrderStatusEnum.java b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pick/constant/PickOrderStatusEnum.java new file mode 100644 index 0000000..e25b56b --- /dev/null +++ b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pick/constant/PickOrderStatusEnum.java @@ -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; + } +} diff --git a/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pick/constant/PickOrderTypeEnum.java b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pick/constant/PickOrderTypeEnum.java new file mode 100644 index 0000000..b6071d1 --- /dev/null +++ b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pick/constant/PickOrderTypeEnum.java @@ -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 1024创新实验室 + */ +@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; +} diff --git a/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pick/controller/PickController.java b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pick/controller/PickController.java new file mode 100644 index 0000000..5f0aae8 --- /dev/null +++ b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pick/controller/PickController.java @@ -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> queryPage(@RequestBody @Valid PickQueryForm queryForm) { + return ResponseDTO.ok(pickQueryService.queryPage(queryForm)); + } + + @Operation(summary = "添加 @author 霍锦") + @PostMapping("/pick/add") + @SaCheckPermission("pick:add") + public ResponseDTO add(@RequestBody @Valid PickAddForm addForm) { + return pickService.add(addForm); + } + + @Operation(summary = "更新 @author 霍锦") + @PostMapping("/pick/update") + @SaCheckPermission("pick:update") + public ResponseDTO update(@RequestBody @Valid PickUpdateForm updateForm) { + return pickService.update(updateForm); + } + + @Operation(summary = "批量删除 @author 霍锦") + @PostMapping("/pick/batchDelete") + @SaCheckPermission("pick:delete") + public ResponseDTO batchDelete(@RequestBody ValidateList idList) { + return pickService.batchDelete(idList); + } + + @Operation(summary = "单个删除 @author 霍锦") + @GetMapping("/pick/delete/{pickId}") + @SaCheckPermission("pick:delete") + public ResponseDTO batchDelete(@PathVariable Long pickId) { + return pickService.delete(pickId); + } +} diff --git a/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pick/dao/PickDao.java b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pick/dao/PickDao.java new file mode 100644 index 0000000..ae1b0d3 --- /dev/null +++ b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pick/dao/PickDao.java @@ -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 { + + /** + * 分页 查询 + * + * @param page + * @param queryForm + * @return + */ + List queryPage(Page page, @Param("queryForm") PickQueryForm queryForm); + +} diff --git a/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pick/domain/entity/PickEntity.java b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pick/domain/entity/PickEntity.java new file mode 100644 index 0000000..c70757f --- /dev/null +++ b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pick/domain/entity/PickEntity.java @@ -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; + +} diff --git a/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pick/domain/form/PickAddForm.java b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pick/domain/form/PickAddForm.java new file mode 100644 index 0000000..6e86523 --- /dev/null +++ b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pick/domain/form/PickAddForm.java @@ -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; + +} \ No newline at end of file diff --git a/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pick/domain/form/PickQueryForm.java b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pick/domain/form/PickQueryForm.java new file mode 100644 index 0000000..67f7330 --- /dev/null +++ b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pick/domain/form/PickQueryForm.java @@ -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 { + +} diff --git a/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pick/domain/form/PickUpdateForm.java b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pick/domain/form/PickUpdateForm.java new file mode 100644 index 0000000..7add18c --- /dev/null +++ b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pick/domain/form/PickUpdateForm.java @@ -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; + +} \ No newline at end of file diff --git a/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pick/domain/vo/PickVO.java b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pick/domain/vo/PickVO.java new file mode 100644 index 0000000..f91e9d4 --- /dev/null +++ b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pick/domain/vo/PickVO.java @@ -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; + +} diff --git a/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pick/manager/PickManager.java b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pick/manager/PickManager.java new file mode 100644 index 0000000..e6a5ef5 --- /dev/null +++ b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pick/manager/PickManager.java @@ -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 { + + +} diff --git a/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pick/service/PickQueryService.java b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pick/service/PickQueryService.java new file mode 100644 index 0000000..4ef70f4 --- /dev/null +++ b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pick/service/PickQueryService.java @@ -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 queryPage(PickQueryForm queryForm); + + /** + * 根据客户订单号查询入库单 + * + * @param customerNumber 客户订单号 + * @return AsnEntity + */ + PickEntity queryByCustomerNumber(String customerNumber); + + /** + * 根据ids查询出库 + * + * @param idList 出库集合 + * @return List + */ + List queryByPickIds(List idList); + +} diff --git a/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pick/service/PickService.java b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pick/service/PickService.java new file mode 100644 index 0000000..48a8591 --- /dev/null +++ b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pick/service/PickService.java @@ -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 add(PickAddForm addForm); + + /** + * 更新 + */ + ResponseDTO update(PickUpdateForm updateForm); + + /** + * 批量删除 + */ + ResponseDTO batchDelete(List idList); + + /** + * 单个删除 + */ + ResponseDTO delete(Long pickId); +} diff --git a/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pick/service/impl/PickQueryServiceImpl.java b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pick/service/impl/PickQueryServiceImpl.java new file mode 100644 index 0000000..a9c7d20 --- /dev/null +++ b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pick/service/impl/PickQueryServiceImpl.java @@ -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 queryPage(PickQueryForm queryForm) { + Page page = SmartPageUtil.convert2PageQuery(queryForm); + List 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 queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(PickEntity::getCustomerNumber, customerNumber); + return pickManager.getOne(queryWrapper); + } + + /** + * 根据ids查询出库 + * + * @param idList 出库集合 + * @return List + */ + public List queryByPickIds(List idList) { + if (CollectionUtils.isEmpty(idList)) { + return Collections.emptyList(); + } + //去重 + idList = idList.stream().filter(Objects::nonNull).distinct().toList(); + return pickManager.listByIds(idList); + } + + +} diff --git a/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pick/service/impl/PickServiceImpl.java b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pick/service/impl/PickServiceImpl.java new file mode 100644 index 0000000..b57380e --- /dev/null +++ b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pick/service/impl/PickServiceImpl.java @@ -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 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 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 batchDelete(List idList) { + if (CollectionUtils.isEmpty(idList)) { + return ResponseDTO.userErrorParam(UserErrorCode.PARAM_ERROR.getMsg()); + } + JoinerResult resultMsg = JoinerResult.createJoiner(); + + //查询批量订单 + List pickList = pickQueryService.queryByPickIds(idList); + + //将订单按状态分组;已创建的一组;非已创建的一组。 + Map> partitionedAsnList = pickList.stream() + .collect(Collectors.partitioningBy(pick -> PickOrderStatusEnum.CREATED.getValue().equals(pick.getStatus()))); + //已创建的订单允许删除 + List createAsnList = partitionedAsnList.get(true); + //出库单集合 + List pickIds = createAsnList.stream().map(PickEntity::getPickId).toList(); + //根据出库单ID集合查询出库明细 + List details = pickDetailQueryService.queryPickDetailByPickIds(pickIds); + if (CollectionUtils.isNotEmpty(details)) { + pickDetailManager.removeBatchByIds(details); + } + if (CollectionUtils.isNotEmpty(createAsnList)) { + Set pickCodes = createAsnList.stream().map(PickEntity::getPickNumber).collect(Collectors.toSet()); + pickManager.removeBatchByIds(createAsnList); + resultMsg.getSussMsg().add(pickCodes + "订单删除成功"); + } + + //非已创建的订单不允许删除 + List noCreateAsnList = partitionedAsnList.get(false); + if (CollectionUtils.isNotEmpty(noCreateAsnList)) { + Set pickCodes = noCreateAsnList.stream().map(PickEntity::getPickNumber).collect(Collectors.toSet()); + resultMsg.getErrorMsg().add(pickCodes + "订单不允许删除"); + } + + return ResponseDTOUtil.buildResponseDTO(resultMsg); + } + + /** + * 单个删除 + */ + @Transactional(rollbackFor = Exception.class) + public ResponseDTO 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 details = pickDetailQueryService.queryPickDetailByPickId(pickId); + if (CollectionUtils.isNotEmpty(details)) { + pickDetailManager.removeBatchByIds(details); + } + pickManager.removeById(pickId); + return ResponseDTO.ok(); + } +} diff --git a/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pick/sql/PickMenu.sql b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pick/sql/PickMenu.sql new file mode 100644 index 0000000..4532f06 --- /dev/null +++ b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pick/sql/PickMenu.sql @@ -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 ); diff --git a/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pickDetail/controller/PickDetailController.java b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pickDetail/controller/PickDetailController.java new file mode 100644 index 0000000..26484b1 --- /dev/null +++ b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pickDetail/controller/PickDetailController.java @@ -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> queryPage(@RequestBody @Valid PickDetailQueryForm queryForm) { + return ResponseDTO.ok(pickDetailQueryService.queryPage(queryForm)); + } + + @Operation(summary = "添加 @author 霍锦") + @PostMapping("/pickDetail/add") + @SaCheckPermission("pickDetail:add") + public ResponseDTO add(@RequestBody @Valid PickDetailAddForm addForm) { + return pickDetailService.add(addForm); + } + + @Operation(summary = "更新 @author 霍锦") + @PostMapping("/pickDetail/update") + @SaCheckPermission("pickDetail:update") + public ResponseDTO update(@RequestBody @Valid PickDetailUpdateForm updateForm) { + return pickDetailService.update(updateForm); + } + + @Operation(summary = "批量删除 @author 霍锦") + @PostMapping("/pickDetail/batchDelete") + @SaCheckPermission("pickDetail:delete") + public ResponseDTO batchDelete(@RequestBody ValidateList idList) { + return pickDetailService.batchDelete(idList); + } + + @Operation(summary = "单个删除 @author 霍锦") + @GetMapping("/pickDetail/delete/{pickDetailId}") + @SaCheckPermission("pickDetail:delete") + public ResponseDTO batchDelete(@PathVariable Long pickDetailId) { + return pickDetailService.delete(pickDetailId); + } +} diff --git a/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pickDetail/dao/PickDetailDao.java b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pickDetail/dao/PickDetailDao.java new file mode 100644 index 0000000..0d86214 --- /dev/null +++ b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pickDetail/dao/PickDetailDao.java @@ -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 { + + /** + * 分页 查询 + * + * @param page + * @param queryForm + * @return + */ + List queryPage(Page page, @Param("queryForm") PickDetailQueryForm queryForm); + +} diff --git a/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pickDetail/domain/entity/PickDetailEntity.java b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pickDetail/domain/entity/PickDetailEntity.java new file mode 100644 index 0000000..28bb9e5 --- /dev/null +++ b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pickDetail/domain/entity/PickDetailEntity.java @@ -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; + +} diff --git a/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pickDetail/domain/form/PickDetailAddForm.java b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pickDetail/domain/form/PickDetailAddForm.java new file mode 100644 index 0000000..c732dbb --- /dev/null +++ b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pickDetail/domain/form/PickDetailAddForm.java @@ -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; + +} \ No newline at end of file diff --git a/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pickDetail/domain/form/PickDetailQueryForm.java b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pickDetail/domain/form/PickDetailQueryForm.java new file mode 100644 index 0000000..c052ff4 --- /dev/null +++ b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pickDetail/domain/form/PickDetailQueryForm.java @@ -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 { + +} diff --git a/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pickDetail/domain/form/PickDetailUpdateForm.java b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pickDetail/domain/form/PickDetailUpdateForm.java new file mode 100644 index 0000000..707d079 --- /dev/null +++ b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pickDetail/domain/form/PickDetailUpdateForm.java @@ -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; + +} \ No newline at end of file diff --git a/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pickDetail/domain/vo/PickDetailVO.java b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pickDetail/domain/vo/PickDetailVO.java new file mode 100644 index 0000000..78ff474 --- /dev/null +++ b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pickDetail/domain/vo/PickDetailVO.java @@ -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; + +} diff --git a/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pickDetail/manager/PickDetailManager.java b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pickDetail/manager/PickDetailManager.java new file mode 100644 index 0000000..e924c07 --- /dev/null +++ b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pickDetail/manager/PickDetailManager.java @@ -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 { + + +} diff --git a/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pickDetail/service/PickDetailQueryService.java b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pickDetail/service/PickDetailQueryService.java new file mode 100644 index 0000000..a1b011e --- /dev/null +++ b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pickDetail/service/PickDetailQueryService.java @@ -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 queryPage(PickDetailQueryForm queryForm); + + /** + * 根据入库单id查询入库单详情 + * + * @param pickId 出库单id + * @return List + */ + List queryPickDetailByPickId(Long pickId); + + /** + * 根据出库单ids查询出库单详情 + * + * @param pickIds 出库单ids + * @return List + */ + List queryPickDetailByPickIds(List pickIds); + + /** + * 根据ids查询入库明细 + * + * @param idList 入库明细集合 + * @return List + */ + List queryByPickDetailIds(List idList); + + /** + * 根据明细集合查询明细信息 + * + * @param idList 明细集合 + * @return Map + */ + Map queryByPickDetailIdsToMap(List idList); + +} diff --git a/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pickDetail/service/PickDetailService.java b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pickDetail/service/PickDetailService.java new file mode 100644 index 0000000..47e40d2 --- /dev/null +++ b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pickDetail/service/PickDetailService.java @@ -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 add(PickDetailAddForm addForm); + + /** + * 更新 + */ + ResponseDTO update(PickDetailUpdateForm updateForm); + + /** + * 批量删除 + */ + ResponseDTO batchDelete(List idList); + + /** + * 单个删除 + */ + ResponseDTO delete(Long pickDetailId); +} diff --git a/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pickDetail/service/impl/PickDetailQueryServiceImpl.java b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pickDetail/service/impl/PickDetailQueryServiceImpl.java new file mode 100644 index 0000000..d1b383f --- /dev/null +++ b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pickDetail/service/impl/PickDetailQueryServiceImpl.java @@ -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 queryPage(PickDetailQueryForm queryForm) { + Page page = SmartPageUtil.convert2PageQuery(queryForm); + List list = pickDetailDao.queryPage(page, queryForm); + return SmartPageUtil.convert2PageResult(page, list); + } + + /** + * 根据入库单id查询出库单详情 + * + * @param pickId 出库单id + * @return List + */ + public List queryPickDetailByPickId(Long pickId) { + if (pickId == null) { + return null; + } + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(PickDetailEntity::getPickId, pickId); + return pickDetailManager.list(queryWrapper); + } + + /** + * 根据入库单ids查询出库单详情 + * + * @param pickIds 出库单id + * @return List + */ + public List queryPickDetailByPickIds(List pickIds) { + if (CollectionUtils.isEmpty(pickIds)) { + return Collections.emptyList(); + } + //去重 + pickIds = pickIds.stream().filter(Objects::nonNull).distinct().toList(); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.in(PickDetailEntity::getPickId, pickIds); + return pickDetailManager.list(queryWrapper); + } + + /** + * 根据ids查询出库明细 + * + * @param idList 出库明细集合 + * @return List + */ + public List queryByPickDetailIds(List idList) { + if (CollectionUtils.isEmpty(idList)) { + return Collections.emptyList(); + } + //去重 + idList = idList.stream().filter(Objects::nonNull).distinct().toList(); + return pickDetailManager.listByIds(idList); + } + + /** + * 根据明细集合查询明细信息 + * + * @param idList 明细集合 + * @return Map + */ + public Map queryByPickDetailIdsToMap(List idList) { + if (CollectionUtils.isEmpty(idList)) { + return Collections.emptyMap(); + } + //查询明细 + List pickDetails = queryByPickDetailIds(idList); + //封装map + Map pickDetailMap = Maps.newHashMap(); + for (PickDetailEntity pickDetail : pickDetails) { + pickDetailMap.put(pickDetail.getPickDetailId(), pickDetail); + } + return pickDetailMap; + } + + +} diff --git a/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pickDetail/service/impl/PickDetailServiceImpl.java b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pickDetail/service/impl/PickDetailServiceImpl.java new file mode 100644 index 0000000..f7cb562 --- /dev/null +++ b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pickDetail/service/impl/PickDetailServiceImpl.java @@ -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 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 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 batchDelete(List idList) { + if (CollectionUtils.isEmpty(idList)) { + return ResponseDTO.userErrorParam(UserErrorCode.PARAM_ERROR.getMsg()); + } + //消息提示 + JoinerResult resultMsg = JoinerResult.createJoiner(); + + //查询出库明细 + List pickDetails = pickDetailQueryService.queryByPickDetailIds(idList); + + //获取出库明细去重后的入库单ID集合 + List pickIds = pickDetails.stream().filter(Objects::nonNull).map(PickDetailEntity::getPickId).distinct().toList(); + + //获取物料id集合 + List itemIds = pickDetails.stream().map(PickDetailEntity::getItemId).toList(); + + //查询物料 + Map mapItem = itemQueryService.queryByItemIdsToMap(itemIds); + + List 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 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 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); + + } +} diff --git a/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pickDetail/sql/PickDetailMenu.sql b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pickDetail/sql/PickDetailMenu.sql new file mode 100644 index 0000000..a6fd1bf --- /dev/null +++ b/nc_wms_java/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/wms/shipping/pickDetail/sql/PickDetailMenu.sql @@ -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 ); diff --git a/nc_wms_java/sa-admin/src/main/resources/mapper/business/wms/shipping/pick/PickMapper.xml b/nc_wms_java/sa-admin/src/main/resources/mapper/business/wms/shipping/pick/PickMapper.xml new file mode 100644 index 0000000..87718ed --- /dev/null +++ b/nc_wms_java/sa-admin/src/main/resources/mapper/business/wms/shipping/pick/PickMapper.xml @@ -0,0 +1,32 @@ + + + + + + + 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 + + + + + + + diff --git a/nc_wms_java/sa-admin/src/main/resources/mapper/business/wms/shipping/pickDetail/PickDetailMapper.xml b/nc_wms_java/sa-admin/src/main/resources/mapper/business/wms/shipping/pickDetail/PickDetailMapper.xml new file mode 100644 index 0000000..0095fc9 --- /dev/null +++ b/nc_wms_java/sa-admin/src/main/resources/mapper/business/wms/shipping/pickDetail/PickDetailMapper.xml @@ -0,0 +1,30 @@ + + + + + + + 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 + + + + + + + diff --git a/nc_wms_java/sa-base/src/main/java/net/lab1024/sa/base/config/RedisConfig.java b/nc_wms_java/sa-base/src/main/java/net/lab1024/sa/base/config/RedisConfig.java index bba3d67..d6336c8 100644 --- a/nc_wms_java/sa-base/src/main/java/net/lab1024/sa/base/config/RedisConfig.java +++ b/nc_wms_java/sa-base/src/main/java/net/lab1024/sa/base/config/RedisConfig.java @@ -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))); diff --git a/nc_wms_java/sa-base/src/main/java/net/lab1024/sa/base/module/support/datatracer/constant/DataTracerTypeEnum.java b/nc_wms_java/sa-base/src/main/java/net/lab1024/sa/base/module/support/datatracer/constant/DataTracerTypeEnum.java index 9d0df37..372970b 100644 --- a/nc_wms_java/sa-base/src/main/java/net/lab1024/sa/base/module/support/datatracer/constant/DataTracerTypeEnum.java +++ b/nc_wms_java/sa-base/src/main/java/net/lab1024/sa/base/module/support/datatracer/constant/DataTracerTypeEnum.java @@ -38,6 +38,11 @@ public enum DataTracerTypeEnum implements BaseEnum { */ ASN(4, "入库"), + /** + * 入库 + */ + PICK(5, "出库"), + ; diff --git a/nc_wms_java/sa-base/src/main/java/net/lab1024/sa/base/module/support/serialnumber/constant/SerialNumberIdEnum.java b/nc_wms_java/sa-base/src/main/java/net/lab1024/sa/base/module/support/serialnumber/constant/SerialNumberIdEnum.java index 3bc8933..462b5b1 100644 --- a/nc_wms_java/sa-base/src/main/java/net/lab1024/sa/base/module/support/serialnumber/constant/SerialNumberIdEnum.java +++ b/nc_wms_java/sa-base/src/main/java/net/lab1024/sa/base/module/support/serialnumber/constant/SerialNumberIdEnum.java @@ -25,7 +25,9 @@ public enum SerialNumberIdEnum implements BaseEnum { ASN(4, "入库单编号"), - TASK(5, "任务编号"), + PICK(5, "出库单编号"), + + TASK(6, "任务编号"), ; diff --git a/nc_wms_java/sa-base/src/main/resources/banner.txt b/nc_wms_java/sa-base/src/main/resources/banner.txt index ca2b651..64cc68f 100644 --- a/nc_wms_java/sa-base/src/main/resources/banner.txt +++ b/nc_wms_java/sa-base/src/main/resources/banner.txt @@ -10,10 +10,5 @@ 热爱代码 热爱生活 ! 永远年轻 永远前行 ! -SmartAdmin v3.X ,作者:1024创新实验室 @copyright:【 1024lab 】 - -SmartAdmin 文档地址:https://smartadmin.vip - -1024创新实验室:https://www.1024lab.net ${AnsiColor.DEFAULT} \ No newline at end of file diff --git a/nc_wms_java/sa-base/src/main/resources/prod/sa-base.yaml b/nc_wms_java/sa-base/src/main/resources/prod/sa-base.yaml index a5d4e9e..71b3313 100644 --- a/nc_wms_java/sa-base/src/main/resources/prod/sa-base.yaml +++ b/nc_wms_java/sa-base/src/main/resources/prod/sa-base.yaml @@ -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