Merge remote-tracking branch 'origin/test' into dev
# Conflicts: # AGENTS.md # scripts/agents-index-contract.ps1
This commit is contained in:
@@ -401,6 +401,21 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ba
|
||||
Candidate candidate(@Param("planId") long planId,@Param("warehouseId") long warehouseId,
|
||||
@Param("inboundId") long inboundId,@Param("detailId") long detailId);
|
||||
|
||||
@Select("""
|
||||
SELECT SUM(i.package_count)
|
||||
FROM fl_inbound_measurement m
|
||||
JOIN fl_inbound_measurement_item i
|
||||
ON i.tenant_id=m.tenant_id AND i.measurement_id=m.id
|
||||
WHERE m.tenant_id=#{accountId} AND m.inbound_id=#{inboundId} AND m.status='APPROVED'
|
||||
AND m.id=(SELECT MAX(m2.id) FROM fl_inbound_measurement m2
|
||||
WHERE m2.tenant_id=m.tenant_id AND m2.inbound_id=m.inbound_id
|
||||
AND m2.status='APPROVED')
|
||||
AND i.inbound_detail_id=#{detailId} AND i.package_count>0
|
||||
""")
|
||||
Integer measuredPackageCount(@Param("accountId") long accountId,
|
||||
@Param("inboundId") long inboundId,
|
||||
@Param("detailId") long detailId);
|
||||
|
||||
@lombok.Getter @lombok.Setter class ChannelContainerCountRow {
|
||||
private String channelCode;
|
||||
private Long availableContainerCount;
|
||||
|
||||
@@ -65,6 +65,9 @@ public class SmartLoadingRepository {
|
||||
public Candidate candidate(long planId, long warehouseId, long inboundId, long detailId) {
|
||||
return candidates.candidate(planId, warehouseId, inboundId, detailId);
|
||||
}
|
||||
public Integer measuredPackageCount(long accountId, long inboundId, long detailId) {
|
||||
return candidates.measuredPackageCount(accountId, inboundId, detailId);
|
||||
}
|
||||
public InboundOrderEntity inbound(long accountId, long inboundId) {
|
||||
return inbounds.selectOne(new LambdaQueryWrapper<InboundOrderEntity>()
|
||||
.eq(InboundOrderEntity::getTenantId, accountId)
|
||||
|
||||
@@ -1429,7 +1429,7 @@ public class SmartLoadingService {
|
||||
int picked = task.pickedByPlanItem().getOrDefault(item.getId(), 0);
|
||||
item.setPickedPackageCount(picked);
|
||||
item.setMinPackageCount(Math.max(1, picked));
|
||||
int total = adjustmentTotal(p.getId(), b.getWarehouseId(), item);
|
||||
int total = adjustmentTotal(item);
|
||||
item.setTotalPackageCount(total);
|
||||
item.setRemainingPackageCount(Math.max(0, total - item.getPackageCount()));
|
||||
item.setCanAdjust(mutable);
|
||||
@@ -1441,18 +1441,21 @@ public class SmartLoadingService {
|
||||
b.getContainerNo(),b.getVoyageNo(),p.getVersion(),mutable,mutable,blockedReason,finalStatus,
|
||||
task.taskId(),task.taskStatus(),task.taskVersion(),planCoLoadGroups(p.getId()),items);
|
||||
}
|
||||
private int adjustmentTotal(long planId, long warehouseId, LoadingPlanItemEntity item) {
|
||||
private int adjustmentTotal(LoadingPlanItemEntity item) {
|
||||
int current = item.getPackageCount() == null ? 0 : item.getPackageCount();
|
||||
Candidate measured = repository.candidate(planId, warehouseId, item.getInboundId(), item.getInboundDetailId());
|
||||
if (measured != null) {
|
||||
return current + Math.max(0, measured.availablePackageCount() == null
|
||||
? 0 : measured.availablePackageCount());
|
||||
}
|
||||
InboundOrderEntity inbound = repository.inbound(item.getAccountId(), item.getInboundId());
|
||||
if (inbound == null || !Set.of("PREPARING", "WAIT_MEASURE", "MEASURING", "MEASURE_PENDING",
|
||||
"MEASURE_REJECTED", "WAIT_PRICING", "FEE_CONFIRMING", "INBOUNDING")
|
||||
.contains(inbound.getProcessStatus())) return current;
|
||||
try {
|
||||
if (item.getAccountId() == null || item.getInboundId() == null
|
||||
|| item.getInboundDetailId() == null) return current;
|
||||
InboundOrderEntity inbound = repository.inbound(item.getAccountId(), item.getInboundId());
|
||||
if (inbound == null) return current;
|
||||
if (Set.of("WAIT_SPLIT", "LOADING").contains(inbound.getProcessStatus())) {
|
||||
Integer measured = repository.measuredPackageCount(item.getAccountId(), item.getInboundId(),
|
||||
item.getInboundDetailId());
|
||||
return Math.max(current, measured == null ? 0 : measured);
|
||||
}
|
||||
if (!Set.of("PREPARING", "WAIT_MEASURE", "MEASURING", "MEASURE_PENDING",
|
||||
"MEASURE_REJECTED", "WAIT_PRICING", "FEE_CONFIRMING", "INBOUNDING")
|
||||
.contains(inbound.getProcessStatus()) || item.getOrderId() == null) return current;
|
||||
OrderCargoClient.CargoBinding cargo = loadCargo(item.getAccountId(), item.getOrderId(), item.getInboundDetailId());
|
||||
return Math.max(current, cargo.originalPackageCount() == null ? 0 : cargo.originalPackageCount());
|
||||
} catch (RuntimeException ignored) {
|
||||
|
||||
@@ -738,7 +738,7 @@ CREATE TABLE IF NOT EXISTS fl_inbound_pallet_allocation (
|
||||
PRIMARY KEY (id),
|
||||
UNIQUE KEY uk_pallet_allocation_no (tenant_id, inbound_id, allocation_no),
|
||||
UNIQUE KEY uk_pallet_allocation_slot (tenant_id, inbound_id, block_id, slot_no),
|
||||
UNIQUE KEY uk_pallet_allocation_weight (tenant_id, weight_result_id),
|
||||
UNIQUE KEY uk_pallet_allocation_weight (tenant_id, inbound_id, weight_result_id),
|
||||
KEY idx_allocation_location (tenant_id, warehouse_id, location_id, allocation_status),
|
||||
KEY idx_allocation_reservation (reservation_id),
|
||||
CONSTRAINT fk_allocation_inbound FOREIGN KEY (inbound_id) REFERENCES fl_inbound_order (id)
|
||||
|
||||
@@ -2210,7 +2210,7 @@ components:
|
||||
items: {type: string, pattern: '^[1-9][0-9]*$'}
|
||||
SmartLoadingPlanItem:
|
||||
type: object
|
||||
required: [id, packageCount, version, pickedPackageCount, minPackageCount, canAdjust, canRemove]
|
||||
required: [id, packageCount, totalPackageCount, remainingPackageCount, version, pickedPackageCount, minPackageCount, canAdjust, canRemove]
|
||||
properties:
|
||||
id: {type: string}
|
||||
inboundId: {type: string}
|
||||
@@ -2222,6 +2222,8 @@ components:
|
||||
internalRemark: {type: string, nullable: true, readOnly: true, description: 来源为订单最新内部备注,不使用 cargoRemark}
|
||||
warehouseRemark: {type: string, nullable: true, description: 仓库人员逐条维护,可在 EDITING/LOADING 修改}
|
||||
packageCount: {type: integer, minimum: 1}
|
||||
totalPackageCount: {type: integer, minimum: 1, description: 当前入仓明细可在计划内分配的总箱数,包含已用与未用箱数}
|
||||
remainingPackageCount: {type: integer, minimum: 0, description: 当前入仓明细尚未分配到本计划的箱数}
|
||||
version: {type: integer, minimum: 0, description: itemVersion,调整/删除写请求使用此值}
|
||||
pickedPackageCount: {type: integer, minimum: 0}
|
||||
minPackageCount: {type: integer, minimum: 1}
|
||||
|
||||
Reference in New Issue
Block a user