no message
parent
1f2cc6c64c
commit
7adee5771f
|
|
@ -5,6 +5,9 @@ import net.lab1024.sa.admin.module.business.wms.inventory.inventory.domain.form.
|
||||||
import net.lab1024.sa.admin.module.business.wms.inventory.inventory.domain.vo.InventoryVO;
|
import net.lab1024.sa.admin.module.business.wms.inventory.inventory.domain.vo.InventoryVO;
|
||||||
import net.lab1024.sa.base.common.domain.PageResult;
|
import net.lab1024.sa.base.common.domain.PageResult;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
public interface InventoryQueryService {
|
public interface InventoryQueryService {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -13,8 +16,15 @@ public interface InventoryQueryService {
|
||||||
PageResult<InventoryVO> queryPage(InventoryQueryForm queryForm);
|
PageResult<InventoryVO> queryPage(InventoryQueryForm queryForm);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param ItemKeyId 物料
|
* @param ItemKeyId 物料属性
|
||||||
* @return InventoryEntity
|
* @return InventoryEntity
|
||||||
*/
|
*/
|
||||||
InventoryEntity queryInventoryByItemKeyId(Long ItemKeyId);
|
InventoryEntity queryInventoryByItemKeyId(Long ItemKeyId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param itemIds 物料
|
||||||
|
* @return InventoryEntity
|
||||||
|
*/
|
||||||
|
List<InventoryEntity> queryInventoryByItemIds(List<Long> itemIds);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@ package net.lab1024.sa.admin.module.business.wms.inventory.inventory.service.imp
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
|
import com.google.common.collect.Maps;
|
||||||
import jakarta.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
import net.lab1024.sa.admin.module.business.wms.base.item.domain.entity.ItemEntity;
|
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.item.service.ItemQueryService;
|
||||||
|
|
@ -19,10 +20,13 @@ import net.lab1024.sa.admin.module.business.wms.inventory.itemKey.domain.entity.
|
||||||
import net.lab1024.sa.admin.module.business.wms.inventory.itemKey.service.ItemKeyQueryService;
|
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.domain.PageResult;
|
||||||
import net.lab1024.sa.base.common.util.SmartPageUtil;
|
import net.lab1024.sa.base.common.util.SmartPageUtil;
|
||||||
|
import org.apache.commons.collections4.CollectionUtils;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
public class InventoryQueryServiceImpl implements InventoryQueryService {
|
public class InventoryQueryServiceImpl implements InventoryQueryService {
|
||||||
|
|
@ -90,7 +94,7 @@ public class InventoryQueryServiceImpl implements InventoryQueryService {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param ItemKeyId 物料
|
* @param ItemKeyId 物料属性
|
||||||
* @return InventoryEntity
|
* @return InventoryEntity
|
||||||
*/
|
*/
|
||||||
public InventoryEntity queryInventoryByItemKeyId(Long ItemKeyId) {
|
public InventoryEntity queryInventoryByItemKeyId(Long ItemKeyId) {
|
||||||
|
|
@ -98,4 +102,22 @@ public class InventoryQueryServiceImpl implements InventoryQueryService {
|
||||||
queryWrapper.eq(InventoryEntity::getItemKeyId, ItemKeyId);
|
queryWrapper.eq(InventoryEntity::getItemKeyId, ItemKeyId);
|
||||||
return inventoryManager.getOne(queryWrapper);
|
return inventoryManager.getOne(queryWrapper);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param itemIds 物料
|
||||||
|
* @return List<InventoryEntity>
|
||||||
|
*/
|
||||||
|
public List<InventoryEntity> queryInventoryByItemIds(List<Long> itemIds) {
|
||||||
|
if (CollectionUtils.isEmpty(itemIds)) {
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
|
List<ItemKeyEntity> itemKeys = itemKeyQueryService.queryItemKeys(itemIds);
|
||||||
|
if (CollectionUtils.isEmpty(itemKeys)) {
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
|
List<Long> itemKeyIds = itemKeys.stream().map(ItemKeyEntity::getItemKeyId).toList();
|
||||||
|
LambdaQueryWrapper<InventoryEntity> queryWrapper = new LambdaQueryWrapper<>();
|
||||||
|
queryWrapper.in(InventoryEntity::getItemKeyId, itemKeyIds).apply("quantity - queued_quantity > 0");;
|
||||||
|
return inventoryManager.list(queryWrapper);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -33,4 +33,13 @@ public interface ItemKeyQueryService {
|
||||||
* @return ItemKeyEntity
|
* @return ItemKeyEntity
|
||||||
*/
|
*/
|
||||||
ItemKeyEntity queryItemKey(String orderNumber, Long itemId, String propC1);
|
ItemKeyEntity queryItemKey(String orderNumber, Long itemId, String propC1);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据物料ID查询物料属性信息
|
||||||
|
*
|
||||||
|
* @param itemIds 物料
|
||||||
|
* @return List<ItemKeyEntity>
|
||||||
|
*/
|
||||||
|
List<ItemKeyEntity> queryItemKeys(List<Long> itemIds);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -70,4 +70,14 @@ public class ItemKeyQueryServiceImpl implements ItemKeyQueryService {
|
||||||
}
|
}
|
||||||
return itemKeys.get(0);
|
return itemKeys.get(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<ItemKeyEntity> queryItemKeys(List<Long> itemIds) {
|
||||||
|
if (CollectionUtils.isEmpty(itemIds)){
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
|
itemIds = itemIds.stream().filter(Objects::nonNull).distinct().toList();
|
||||||
|
LambdaQueryWrapper<ItemKeyEntity> queryWrapper = new LambdaQueryWrapper<>();
|
||||||
|
queryWrapper.in(ItemKeyEntity::getItemId, itemIds);
|
||||||
|
return itemKeyManager.list(queryWrapper);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,9 +4,9 @@ import cn.dev33.satoken.annotation.SaCheckPermission;
|
||||||
import io.swagger.v3.oas.annotations.Operation;
|
import io.swagger.v3.oas.annotations.Operation;
|
||||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
import jakarta.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
|
import net.lab1024.sa.admin.module.business.wms.receive.form.BatchReceiveForm;
|
||||||
|
import net.lab1024.sa.admin.module.business.wms.receive.form.BatchReturnForm;
|
||||||
import net.lab1024.sa.admin.module.business.wms.receive.service.ReceiveService;
|
import net.lab1024.sa.admin.module.business.wms.receive.service.ReceiveService;
|
||||||
import net.lab1024.sa.admin.module.business.wms.receive.asn.domain.form.BatchReceiveForm;
|
|
||||||
import net.lab1024.sa.admin.module.business.wms.receive.asn.domain.form.BatchReturnForm;
|
|
||||||
import net.lab1024.sa.base.common.domain.ResponseDTO;
|
import net.lab1024.sa.base.common.domain.ResponseDTO;
|
||||||
import net.lab1024.sa.base.module.support.operatelog.annotation.OperateLog;
|
import net.lab1024.sa.base.module.support.operatelog.annotation.OperateLog;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,9 @@
|
||||||
package net.lab1024.sa.admin.module.business.wms.receive.asn.domain.form;
|
package net.lab1024.sa.admin.module.business.wms.receive.form;
|
||||||
|
|
||||||
import io.swagger.v3.oas.annotations.media.Schema;
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
import jakarta.validation.constraints.NotNull;
|
import jakarta.validation.constraints.NotNull;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package net.lab1024.sa.admin.module.business.wms.receive.asn.domain.form;
|
package net.lab1024.sa.admin.module.business.wms.receive.form;
|
||||||
|
|
||||||
import io.swagger.v3.oas.annotations.media.Schema;
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
import jakarta.validation.constraints.NotNull;
|
import jakarta.validation.constraints.NotNull;
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
package net.lab1024.sa.admin.module.business.wms.receive.service;
|
package net.lab1024.sa.admin.module.business.wms.receive.service;
|
||||||
|
|
||||||
import net.lab1024.sa.admin.module.business.wms.receive.asn.domain.form.BatchReceiveForm;
|
import net.lab1024.sa.admin.module.business.wms.receive.form.BatchReceiveForm;
|
||||||
import net.lab1024.sa.admin.module.business.wms.receive.asn.domain.form.BatchReturnForm;
|
import net.lab1024.sa.admin.module.business.wms.receive.form.BatchReturnForm;
|
||||||
import net.lab1024.sa.base.common.domain.ResponseDTO;
|
import net.lab1024.sa.base.common.domain.ResponseDTO;
|
||||||
|
|
||||||
public interface ReceiveService {
|
public interface ReceiveService {
|
||||||
|
|
|
||||||
|
|
@ -15,13 +15,13 @@ import net.lab1024.sa.admin.module.business.wms.inventory.inventory.service.Inve
|
||||||
import net.lab1024.sa.admin.module.business.wms.inventory.itemKey.domain.entity.ItemKeyEntity;
|
import net.lab1024.sa.admin.module.business.wms.inventory.itemKey.domain.entity.ItemKeyEntity;
|
||||||
import net.lab1024.sa.admin.module.business.wms.inventory.itemKey.service.ItemKeyService;
|
import net.lab1024.sa.admin.module.business.wms.inventory.itemKey.service.ItemKeyService;
|
||||||
import net.lab1024.sa.admin.module.business.wms.receive.asn.domain.entity.AsnEntity;
|
import net.lab1024.sa.admin.module.business.wms.receive.asn.domain.entity.AsnEntity;
|
||||||
import net.lab1024.sa.admin.module.business.wms.receive.asn.domain.form.BatchReceiveForm;
|
|
||||||
import net.lab1024.sa.admin.module.business.wms.receive.asn.domain.form.BatchReturnForm;
|
|
||||||
import net.lab1024.sa.admin.module.business.wms.receive.asn.manager.AsnManager;
|
import net.lab1024.sa.admin.module.business.wms.receive.asn.manager.AsnManager;
|
||||||
import net.lab1024.sa.admin.module.business.wms.receive.asnDetail.domain.entity.AsnDetailEntity;
|
import net.lab1024.sa.admin.module.business.wms.receive.asnDetail.domain.entity.AsnDetailEntity;
|
||||||
import net.lab1024.sa.admin.module.business.wms.receive.asnDetail.manager.AsnDetailManager;
|
import net.lab1024.sa.admin.module.business.wms.receive.asnDetail.manager.AsnDetailManager;
|
||||||
import net.lab1024.sa.admin.module.business.wms.receive.asnDetail.service.AsnDetailQueryService;
|
import net.lab1024.sa.admin.module.business.wms.receive.asnDetail.service.AsnDetailQueryService;
|
||||||
import net.lab1024.sa.admin.module.business.wms.receive.asnDetail.service.AsnDetailService;
|
import net.lab1024.sa.admin.module.business.wms.receive.asnDetail.service.AsnDetailService;
|
||||||
|
import net.lab1024.sa.admin.module.business.wms.receive.form.BatchReceiveForm;
|
||||||
|
import net.lab1024.sa.admin.module.business.wms.receive.form.BatchReturnForm;
|
||||||
import net.lab1024.sa.admin.module.business.wms.receive.service.ReceiveService;
|
import net.lab1024.sa.admin.module.business.wms.receive.service.ReceiveService;
|
||||||
import net.lab1024.sa.admin.module.business.wms.task.constant.TaskStatusEnum;
|
import net.lab1024.sa.admin.module.business.wms.task.constant.TaskStatusEnum;
|
||||||
import net.lab1024.sa.admin.module.business.wms.task.constant.TaskTypeEnum;
|
import net.lab1024.sa.admin.module.business.wms.task.constant.TaskTypeEnum;
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,29 @@
|
||||||
|
package net.lab1024.sa.admin.module.business.wms.shipping.controller;
|
||||||
|
|
||||||
|
import cn.dev33.satoken.annotation.SaCheckPermission;
|
||||||
|
import io.swagger.v3.oas.annotations.Operation;
|
||||||
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
|
import jakarta.annotation.Resource;
|
||||||
|
import net.lab1024.sa.admin.module.business.wms.shipping.form.AllocationForm;
|
||||||
|
import net.lab1024.sa.admin.module.business.wms.shipping.service.ShippingService;
|
||||||
|
import net.lab1024.sa.base.common.domain.ResponseDTO;
|
||||||
|
import net.lab1024.sa.base.module.support.operatelog.annotation.OperateLog;
|
||||||
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestBody;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
@RestController
|
||||||
|
@Tag(name = "发货")
|
||||||
|
public class ShippingController {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private ShippingService shippingService;
|
||||||
|
|
||||||
|
@Operation(summary = "分配明细 @author 霍锦")
|
||||||
|
@PostMapping("/shipping/allocationPickDetail")
|
||||||
|
@SaCheckPermission("shipping:allocationPickDetail")
|
||||||
|
@OperateLog
|
||||||
|
public ResponseDTO<String> allocationPickDetail(@RequestBody AllocationForm allocationForm) {
|
||||||
|
return shippingService.allocationPickDetail(allocationForm);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,20 @@
|
||||||
|
package net.lab1024.sa.admin.module.business.wms.shipping.form;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import jakarta.validation.constraints.NotNull;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class AllocationForm {
|
||||||
|
|
||||||
|
@Schema(description = "出库单", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||||
|
@NotNull(message = "出库单 不能为空")
|
||||||
|
private Long pickId;
|
||||||
|
|
||||||
|
@Schema(description = "出库明细", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||||
|
@NotNull(message = "出库明细 不能为空")
|
||||||
|
private List<Long> pickDetailIds;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
package net.lab1024.sa.admin.module.business.wms.shipping.form;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import jakarta.validation.constraints.NotNull;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class BatchReturnForm {
|
||||||
|
@Schema(description = "入库单", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||||
|
@NotNull(message = "入库单 不能为空")
|
||||||
|
private Long asnId;
|
||||||
|
|
||||||
|
@Schema(description = "收货明细", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||||
|
@NotNull(message = "收货明细 不能为空")
|
||||||
|
private List<Long> taskIds;
|
||||||
|
}
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
package net.lab1024.sa.admin.module.business.wms.shipping.pick.domain.form;
|
package net.lab1024.sa.admin.module.business.wms.shipping.pick.domain.form;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
import net.lab1024.sa.base.common.domain.PageParam;
|
import net.lab1024.sa.base.common.domain.PageParam;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
@ -15,5 +16,13 @@ import lombok.EqualsAndHashCode;
|
||||||
@Data
|
@Data
|
||||||
@EqualsAndHashCode(callSuper = false)
|
@EqualsAndHashCode(callSuper = false)
|
||||||
public class PickQueryForm extends PageParam {
|
public class PickQueryForm extends PageParam {
|
||||||
|
@Schema(description = "客户订单号")
|
||||||
|
private String customerNumber;
|
||||||
|
|
||||||
|
@Schema(description = "状态")
|
||||||
|
private String status;
|
||||||
|
|
||||||
|
@Schema(description = "单据类型")
|
||||||
|
private String orderType;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
import net.lab1024.sa.base.common.domain.PageParam;
|
import net.lab1024.sa.base.common.domain.PageParam;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
|
import org.hibernate.validator.constraints.Length;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 出库明细 分页查询表单
|
* 出库明细 分页查询表单
|
||||||
|
|
@ -20,6 +21,7 @@ public class PickDetailQueryForm extends PageParam {
|
||||||
@Schema(description = "出库单")
|
@Schema(description = "出库单")
|
||||||
private Long pickId;
|
private Long pickId;
|
||||||
|
|
||||||
@Schema(description = "物料")
|
@Schema(description = "关键字")
|
||||||
private Long itemId;
|
@Length(max = 200, message = "关键字最多200字符")
|
||||||
|
private String keywords;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -35,4 +35,10 @@ public interface PickDetailService {
|
||||||
* 单个删除
|
* 单个删除
|
||||||
*/
|
*/
|
||||||
ResponseDTO<String> delete(Long pickDetailId);
|
ResponseDTO<String> delete(Long pickDetailId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 刷新出库单
|
||||||
|
* @param pickId 出库单ID
|
||||||
|
*/
|
||||||
|
void refreshPick(Long pickId);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,14 @@
|
||||||
|
package net.lab1024.sa.admin.module.business.wms.shipping.service;
|
||||||
|
|
||||||
|
import net.lab1024.sa.admin.module.business.wms.shipping.form.AllocationForm;
|
||||||
|
import net.lab1024.sa.base.common.domain.ResponseDTO;
|
||||||
|
|
||||||
|
public interface ShippingService {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 分配明细
|
||||||
|
* @return String
|
||||||
|
*/
|
||||||
|
ResponseDTO<String> allocationPickDetail(AllocationForm allocationForm);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,182 @@
|
||||||
|
package net.lab1024.sa.admin.module.business.wms.shipping.service.impl;
|
||||||
|
|
||||||
|
import jakarta.annotation.Resource;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
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.base.location.domain.entity.LocationEntity;
|
||||||
|
import net.lab1024.sa.admin.module.business.wms.base.location.manager.LocationManager;
|
||||||
|
import net.lab1024.sa.admin.module.business.wms.base.stock.domain.entity.StockEntity;
|
||||||
|
import net.lab1024.sa.admin.module.business.wms.base.stock.manager.StockManager;
|
||||||
|
import net.lab1024.sa.admin.module.business.wms.inventory.inventory.domain.entity.InventoryEntity;
|
||||||
|
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.shipping.form.AllocationForm;
|
||||||
|
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.manager.PickDetailManager;
|
||||||
|
import net.lab1024.sa.admin.module.business.wms.shipping.pickDetail.service.PickDetailService;
|
||||||
|
import net.lab1024.sa.admin.module.business.wms.shipping.service.ShippingService;
|
||||||
|
import net.lab1024.sa.admin.module.business.wms.task.constant.TaskStatusEnum;
|
||||||
|
import net.lab1024.sa.admin.module.business.wms.task.constant.TaskTypeEnum;
|
||||||
|
import net.lab1024.sa.admin.module.business.wms.task.domain.entity.TaskEntity;
|
||||||
|
import net.lab1024.sa.admin.module.business.wms.task.manager.TaskManager;
|
||||||
|
import net.lab1024.sa.admin.module.business.wms.task.service.TaskService;
|
||||||
|
import net.lab1024.sa.admin.util.JoinerResult;
|
||||||
|
import net.lab1024.sa.admin.util.ResponseDTOUtil;
|
||||||
|
import net.lab1024.sa.base.common.domain.ResponseDTO;
|
||||||
|
import net.lab1024.sa.base.common.util.SmartBigDecimalUtil;
|
||||||
|
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.math.BigDecimal;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
@Slf4j
|
||||||
|
public class ShippingServiceImpl implements ShippingService {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private LocationManager locationManager;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private StockManager stockManager;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private PickManager pickManager;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private PickDetailManager pickDetailManager;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private TaskManager taskManager;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private InventoryManager inventoryManager;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private ItemQueryService itemQueryService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private InventoryQueryService inventoryQueryService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private PickDetailService pickDetailService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private TaskService taskService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private SerialNumberService serialNumberService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private DataTracerService dataTracerService;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 分配明细
|
||||||
|
*
|
||||||
|
* @param allocationForm 分配明细参数
|
||||||
|
* @return resultMsg
|
||||||
|
*/
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
public ResponseDTO<String> allocationPickDetail(AllocationForm allocationForm) {
|
||||||
|
Long startTime = System.currentTimeMillis();
|
||||||
|
|
||||||
|
//消息提示
|
||||||
|
JoinerResult resultMsg = JoinerResult.createJoiner();
|
||||||
|
|
||||||
|
//出库单
|
||||||
|
PickEntity pick = pickManager.getById(allocationForm.getPickId());
|
||||||
|
|
||||||
|
//出库单明细
|
||||||
|
List<PickDetailEntity> pickDetails = pickDetailManager.listByIds(allocationForm.getPickDetailIds());
|
||||||
|
|
||||||
|
//查询物料
|
||||||
|
List<Long> itemIds = pickDetails.stream().map(PickDetailEntity::getItemId).toList();
|
||||||
|
Map<Long, ItemEntity> itemMap = itemQueryService.queryByItemIdsToMap(itemIds);
|
||||||
|
|
||||||
|
//查询库存
|
||||||
|
List<InventoryEntity> inventoryList = inventoryQueryService.queryInventoryByItemIds(itemIds);
|
||||||
|
if (inventoryList.isEmpty()) {
|
||||||
|
List<String> codes = itemMap.values().stream().map(ItemEntity::getItemCode).toList();
|
||||||
|
resultMsg.getErrorMsg().add(codes + "物料库存不足,请先补充库存!");
|
||||||
|
return ResponseDTOUtil.buildResponseDTO(resultMsg);
|
||||||
|
}
|
||||||
|
|
||||||
|
List<InventoryEntity> updateToInventory = new ArrayList<>();
|
||||||
|
List<PickDetailEntity> updateToPickDetail = new ArrayList<>();
|
||||||
|
List<TaskEntity> createToTask = new ArrayList<>();
|
||||||
|
|
||||||
|
for (PickDetailEntity pickDetail : pickDetails) {
|
||||||
|
//物料
|
||||||
|
ItemEntity item = itemMap.get(pickDetail.getItemId());
|
||||||
|
|
||||||
|
BigDecimal unQty = SmartBigDecimalUtil.subtract(pickDetail.getOrderQuantity(), pickDetail.getAllocatedQuantity(), 2);
|
||||||
|
if (unQty.compareTo(BigDecimal.ZERO) == 0) {
|
||||||
|
resultMsg.getErrorMsg().add(item.getItemCode() + "物料已分配,请勿重复操作!");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
//分配数量
|
||||||
|
BigDecimal allocateQty = BigDecimal.ZERO;
|
||||||
|
|
||||||
|
//库存
|
||||||
|
for (InventoryEntity inventory : inventoryList) {
|
||||||
|
//库存可用数量
|
||||||
|
allocateQty = SmartBigDecimalUtil.subtract(inventory.getQuantity(), inventory.getQueuedQuantity(), 2);
|
||||||
|
if (allocateQty.compareTo(BigDecimal.ZERO) <= 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (unQty.compareTo(allocateQty) < 0) {
|
||||||
|
allocateQty = unQty;
|
||||||
|
}
|
||||||
|
//更新库存占用数量
|
||||||
|
inventory.setQueuedQuantity(SmartBigDecimalUtil.add(inventory.getQueuedQuantity(), allocateQty, 2));
|
||||||
|
updateToInventory.add(inventory);
|
||||||
|
//更新明细分配数量
|
||||||
|
pickDetail.setAllocatedQuantity(SmartBigDecimalUtil.add(pickDetail.getAllocatedQuantity(), allocateQty, 2));
|
||||||
|
updateToPickDetail.add(pickDetail);
|
||||||
|
//容器
|
||||||
|
StockEntity stock = stockManager.queryStock(inventory.getStockId());
|
||||||
|
//库位
|
||||||
|
LocationEntity location = locationManager.queryLocation(inventory.getLocationId());
|
||||||
|
//生成分配任务
|
||||||
|
TaskEntity task = taskService.createTask(serialNumberService.generate(SerialNumberIdEnum.TASK), TaskStatusEnum.CREATED.getValue(), TaskTypeEnum.PICK.getValue(), pickDetail.getOrderQuantity(), inventory.getItemKeyId(), null, pickDetail.getPickDetailId(), stock, null, location, null, null, null);
|
||||||
|
createToTask.add(task);
|
||||||
|
unQty = SmartBigDecimalUtil.subtract(unQty, allocateQty, 2);
|
||||||
|
}
|
||||||
|
if (unQty.compareTo(BigDecimal.ZERO) > 0) {
|
||||||
|
resultMsg.getErrorMsg().add(item.getItemCode() + "物料库存不足,无法完成分配!");
|
||||||
|
} else {
|
||||||
|
resultMsg.getSussMsg().add(item.getItemCode() + "物料分配成功");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//批量操作
|
||||||
|
if (CollectionUtils.isNotEmpty(updateToInventory)) {
|
||||||
|
inventoryManager.updateBatchById(updateToInventory);
|
||||||
|
}
|
||||||
|
if (CollectionUtils.isNotEmpty(updateToPickDetail)) {
|
||||||
|
pickDetailManager.updateBatchById(updateToPickDetail);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (CollectionUtils.isNotEmpty(createToTask)) {
|
||||||
|
taskManager.saveBatch(createToTask);
|
||||||
|
}
|
||||||
|
|
||||||
|
//刷新出库单
|
||||||
|
pickDetailService.refreshPick(pick.getPickId());
|
||||||
|
|
||||||
|
Long endTime = System.currentTimeMillis();
|
||||||
|
log.info("分配明细耗时:{}ms", endTime - startTime);
|
||||||
|
return ResponseDTOUtil.buildResponseDTO(resultMsg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -28,7 +28,7 @@
|
||||||
<where>
|
<where>
|
||||||
<!--客户订单号-->
|
<!--客户订单号-->
|
||||||
<if test="queryForm.customerNumber != null and queryForm.customerNumber != ''">
|
<if test="queryForm.customerNumber != null and queryForm.customerNumber != ''">
|
||||||
AND INSTR(t_asn.customer_number,#{queryForm.customerNumber})
|
AND t_asn.customer_number LIKE CONCAT(#{queryForm.customerNumber},'%')
|
||||||
</if>
|
</if>
|
||||||
<!--单据类型-->
|
<!--单据类型-->
|
||||||
<if test="queryForm.orderType != null and queryForm.orderType != ''">
|
<if test="queryForm.orderType != null and queryForm.orderType != ''">
|
||||||
|
|
|
||||||
|
|
@ -15,47 +15,23 @@
|
||||||
<!-- 分页查询 -->
|
<!-- 分页查询 -->
|
||||||
<select id="queryPage"
|
<select id="queryPage"
|
||||||
resultType="net.lab1024.sa.admin.module.business.wms.receive.asnDetail.domain.vo.AsnDetailVO">
|
resultType="net.lab1024.sa.admin.module.business.wms.receive.asnDetail.domain.vo.AsnDetailVO">
|
||||||
<choose>
|
|
||||||
<when test="queryForm.keywords != null and queryForm.keywords != ''">
|
|
||||||
SELECT
|
SELECT
|
||||||
<include refid="base_columns"/>
|
<include refid="base_columns"/>
|
||||||
FROM t_asn_detail
|
FROM t_asn_detail
|
||||||
JOIN t_item ON t_asn_detail.item_id = t_item.item_id
|
<if test="queryForm.keywords != null and queryForm.keywords != ''">
|
||||||
|
LEFT JOIN t_item ON t_asn_detail.item_id = t_item.item_id
|
||||||
|
</if>
|
||||||
<where>
|
<where>
|
||||||
|
<if test="queryForm.asnId != null">
|
||||||
|
AND t_asn_detail.asn_id = #{queryForm.asnId}
|
||||||
|
</if>
|
||||||
|
<if test="queryForm.keywords != null and queryForm.keywords != ''">
|
||||||
|
AND (
|
||||||
t_item.item_code LIKE CONCAT(#{queryForm.keywords}, '%')
|
t_item.item_code LIKE CONCAT(#{queryForm.keywords}, '%')
|
||||||
<if test="queryForm.asnId != null">
|
OR t_item.item_name LIKE CONCAT(#{queryForm.keywords}, '%')
|
||||||
AND t_asn_detail.asn_id = #{queryForm.asnId}
|
|
||||||
</if>
|
|
||||||
</where>
|
|
||||||
UNION ALL
|
|
||||||
SELECT
|
|
||||||
<include refid="base_columns"/>
|
|
||||||
FROM t_asn_detail
|
|
||||||
JOIN t_item ON t_asn_detail.item_id = t_item.item_id
|
|
||||||
<where>
|
|
||||||
t_item.item_name LIKE CONCAT(#{queryForm.keywords}, '%')
|
|
||||||
<if test="queryForm.asnId != null">
|
|
||||||
AND t_asn_detail.asn_id = #{queryForm.asnId}
|
|
||||||
</if>
|
|
||||||
AND NOT EXISTS (
|
|
||||||
SELECT 1
|
|
||||||
FROM t_item
|
|
||||||
WHERE t_item.item_id = t_asn_detail.item_id
|
|
||||||
AND t_item.item_code LIKE CONCAT(#{queryForm.keywords}, '%')
|
|
||||||
)
|
)
|
||||||
</where>
|
|
||||||
</when>
|
|
||||||
<otherwise>
|
|
||||||
SELECT
|
|
||||||
<include refid="base_columns"/>
|
|
||||||
FROM t_asn_detail
|
|
||||||
<where>
|
|
||||||
<if test="queryForm.asnId != null">
|
|
||||||
t_asn_detail.asn_id = #{queryForm.asnId}
|
|
||||||
</if>
|
</if>
|
||||||
</where>
|
</where>
|
||||||
</otherwise>
|
|
||||||
</choose>
|
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -27,6 +27,21 @@
|
||||||
SELECT
|
SELECT
|
||||||
<include refid="base_columns"/>
|
<include refid="base_columns"/>
|
||||||
FROM t_pick
|
FROM t_pick
|
||||||
|
<where>
|
||||||
|
<!--客户订单号-->
|
||||||
|
<if test="queryForm.customerNumber != null and queryForm.customerNumber != ''">
|
||||||
|
AND t_pick.customer_number LIKE CONCAT(#{queryForm.customerNumber},'%')
|
||||||
|
</if>
|
||||||
|
<!--单据类型-->
|
||||||
|
<if test="queryForm.orderType != null and queryForm.orderType != ''">
|
||||||
|
AND t_pick.order_type=#{queryForm.orderType}
|
||||||
|
</if>
|
||||||
|
<!--状态-->
|
||||||
|
<if test="queryForm.status != null and queryForm.status != ''">
|
||||||
|
AND t_pick.status=#{queryForm.status}
|
||||||
|
</if>
|
||||||
|
</where>
|
||||||
|
ORDER BY t_pick.pick_id DESC
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,20 @@
|
||||||
SELECT
|
SELECT
|
||||||
<include refid="base_columns"/>
|
<include refid="base_columns"/>
|
||||||
FROM t_pick_detail
|
FROM t_pick_detail
|
||||||
|
<if test="queryForm.keywords != null and queryForm.keywords != ''">
|
||||||
|
LEFT JOIN t_item ON t_pick_detail.item_id = t_item.item_id
|
||||||
|
</if>
|
||||||
|
<where>
|
||||||
|
<if test="queryForm.pickId != null">
|
||||||
|
AND t_pick_detail.pick_id = #{queryForm.pickId}
|
||||||
|
</if>
|
||||||
|
<if test="queryForm.keywords != null and queryForm.keywords != ''">
|
||||||
|
AND (
|
||||||
|
t_item.item_code LIKE CONCAT(#{queryForm.keywords}, '%')
|
||||||
|
OR t_item.item_name LIKE CONCAT(#{queryForm.keywords}, '%')
|
||||||
|
)
|
||||||
|
</if>
|
||||||
|
</where>
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -32,21 +32,40 @@
|
||||||
SELECT
|
SELECT
|
||||||
<include refid="base_columns"/>
|
<include refid="base_columns"/>
|
||||||
FROM t_task
|
FROM t_task
|
||||||
|
<!--入库单-->
|
||||||
|
<if test="queryForm.asnId != null ">
|
||||||
|
LEFT JOIN t_asn_detail on t_asn_detail.asn_detail_id = t_task.asn_detail_id
|
||||||
|
LEFT JOIN t_item on t_item.item_id = t_asn_detail.item_id
|
||||||
|
</if>
|
||||||
|
<!--出库单-->
|
||||||
|
<if test="queryForm.pickId != null ">
|
||||||
|
LEFT JOIN t_pick_detail on t_pick_detail.pick_detail_id = t_task.pick_detail_id
|
||||||
|
LEFT JOIN t_item on t_item.item_id = t_pick_detail.item_id
|
||||||
|
</if>
|
||||||
<where>
|
<where>
|
||||||
<!--入库单-->
|
<!--入库单-->
|
||||||
<if test="queryForm.asnId != null ">
|
<if test="queryForm.asnId != null ">
|
||||||
AND t_task.asn_detail_id in (select asn_detail_id from t_asn_detail where asn_id = #{queryForm.asnId})
|
AND t_asn_detail.asn_id= #{queryForm.asnId}
|
||||||
</if>
|
</if>
|
||||||
|
|
||||||
<!--出库单-->
|
<!--出库单-->
|
||||||
<if test="queryForm.pickId != null ">
|
<if test="queryForm.pickId != null ">
|
||||||
AND t_task.pick_detail_id in (select pick_detail_id from t_pick_detail where pick_id =#{queryForm.pickId})
|
AND t_pick_detail.pick_id= #{queryForm.pickId}
|
||||||
</if>
|
</if>
|
||||||
|
|
||||||
<!--任务类型-->
|
<!--任务类型-->
|
||||||
<if test="queryForm.taskType != null and queryForm.taskType != ''">
|
<if test="queryForm.taskType != null and queryForm.taskType != ''">
|
||||||
AND t_task.task_type = #{queryForm.taskType}
|
AND t_task.task_type = #{queryForm.taskType}
|
||||||
</if>
|
</if>
|
||||||
|
|
||||||
|
<!--关键字-->
|
||||||
|
<if test="queryForm.asnId != null and queryForm.keywords !=null and queryForm.keywords!= ''">
|
||||||
|
AND (t_item.item_code LIKE CONCAT(#{queryForm.keywords}, '%')
|
||||||
|
OR t_item.item_name LIKE CONCAT(#{queryForm.keywords}, '%')
|
||||||
|
OR t_task.dst_location_code LIKE CONCAT(#{queryForm.keywords}, '%')
|
||||||
|
OR t_task.dst_stock_code LIKE CONCAT(#{queryForm.keywords}, '%')
|
||||||
|
)
|
||||||
|
</if>
|
||||||
</where>
|
</where>
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue