优化
This commit is contained in:
+10
-11
@@ -5,11 +5,10 @@ import com.baiyue.common.core.api.ApiResponse;
|
||||
import com.baiyue.common.core.api.ResultCode;
|
||||
import com.baiyue.common.core.exception.BizException;
|
||||
import com.baiyue.common.security.AuthenticatedUser;
|
||||
import com.baiyue.firstleg.loading.coload.model.ColoadGroupModels.BatchQueryRequest;
|
||||
import com.baiyue.firstleg.loading.coload.model.ColoadGroupModels.BusinessSummary;
|
||||
import com.baiyue.firstleg.loading.coload.model.ColoadGroupModels.CancelRequest;
|
||||
import com.baiyue.firstleg.loading.coload.model.ColoadGroupModels.CreateRequest;
|
||||
import com.baiyue.firstleg.loading.coload.model.ColoadGroupModels.GroupSnapshot;
|
||||
import com.baiyue.firstleg.loading.coload.model.ColoadGroupModels.OrderGroupInfo;
|
||||
import com.baiyue.firstleg.loading.coload.service.ColoadGroupService;
|
||||
import com.baiyue.firstleg.service.FirstlegScopeGuard;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
@@ -17,9 +16,11 @@ import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import jakarta.annotation.Resource;
|
||||
import jakarta.validation.Valid;
|
||||
import jakarta.validation.constraints.Min;
|
||||
import jakarta.validation.constraints.Size;
|
||||
import org.springframework.security.access.prepost.PreAuthorize;
|
||||
import org.springframework.security.core.annotation.AuthenticationPrincipal;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
@@ -27,8 +28,6 @@ import org.springframework.web.bind.annotation.RequestHeader;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/** 平台订单列表使用的同柜不可拆组管理接口。 */
|
||||
@Validated
|
||||
@RestController
|
||||
@@ -69,15 +68,15 @@ public class PlatformColoadGroupController {
|
||||
idempotencyKey, user.userId(), user.username()));
|
||||
}
|
||||
|
||||
@PostMapping("/batch-query")
|
||||
@PreAuthorize("hasAuthority('platform:firstleg:smart-loading:assign')")
|
||||
@Operation(summary = "按订单ID批量查询同柜不可拆组",
|
||||
description = "供平台订单列表批量补齐组号、状态、全体成员和整组满箱数;最多200个订单。")
|
||||
public ApiResponse<List<OrderGroupInfo>> batchQuery(
|
||||
@GetMapping("/by-inbound-code/{inboundCode}")
|
||||
@PreAuthorize("hasAuthority('platform:firstleg:smart-loading:list')")
|
||||
@Operation(summary = "按入仓码查询同柜组业务摘要",
|
||||
description = "仅返回业务状态、有效成员数及去重后的全部成员入仓码;内部组ID和组号不作为页面识别键。")
|
||||
public ApiResponse<BusinessSummary> byInboundCode(
|
||||
@AuthenticationPrincipal AuthenticatedUser user,
|
||||
@Valid @RequestBody BatchQueryRequest request) {
|
||||
@PathVariable @Size(min = 1, max = 40) String inboundCode) {
|
||||
requirePlatform(user);
|
||||
return ApiResponse.success(service.queryByOrderIds(request.orderIds()));
|
||||
return ApiResponse.success(service.queryByInboundCode(inboundCode));
|
||||
}
|
||||
|
||||
private static void requirePlatform(AuthenticatedUser user) {
|
||||
|
||||
+12
-8
@@ -24,11 +24,6 @@ public final class ColoadGroupModels {
|
||||
) {
|
||||
}
|
||||
|
||||
public record BatchQueryRequest(
|
||||
@NotEmpty @Size(max = 200) List<@NotNull @Min(1) Long> orderIds
|
||||
) {
|
||||
}
|
||||
|
||||
public record Member(
|
||||
long tenantId,
|
||||
long orderId,
|
||||
@@ -65,9 +60,18 @@ public final class ColoadGroupModels {
|
||||
}
|
||||
}
|
||||
|
||||
public record OrderGroupInfo(
|
||||
long orderId,
|
||||
GroupSnapshot group
|
||||
public record BusinessMember(String inboundCode) {
|
||||
}
|
||||
|
||||
/** 页面只读业务摘要;内部组标识不作为用户识别键。 */
|
||||
public record BusinessSummary(
|
||||
String status,
|
||||
int memberCount,
|
||||
List<BusinessMember> members
|
||||
) {
|
||||
public BusinessSummary {
|
||||
members = members == null ? List.of() : List.copyOf(members);
|
||||
memberCount = members.size();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+21
-8
@@ -85,15 +85,28 @@ public interface ColoadGroupMapper {
|
||||
GroupRow activeGroupByInbound(@Param("tenantId") long tenantId,
|
||||
@Param("inboundId") long inboundId);
|
||||
|
||||
@Select({"<script>", """
|
||||
SELECT member.order_id orderId,member.group_id groupId
|
||||
FROM fl_coload_group_member member
|
||||
@Select("""
|
||||
SELECT DISTINCT group_row.id groupId,group_row.group_status groupStatus
|
||||
FROM fl_inbound_order requested
|
||||
JOIN fl_coload_group_member member
|
||||
ON member.tenant_id=requested.tenant_id AND member.inbound_id=requested.id
|
||||
JOIN fl_coload_group group_row ON group_row.id=member.group_id
|
||||
WHERE member.order_id IN
|
||||
""", "<foreach collection='orderIds' item='orderId' open='(' separator=',' close=')'>",
|
||||
"#{orderId}", "</foreach>",
|
||||
"AND group_row.group_status<>'CANCELLED' ORDER BY member.order_id,group_row.created_at DESC", "</script>"})
|
||||
List<OrderGroupLinkRow> linksByOrderIds(@Param("orderIds") List<Long> orderIds);
|
||||
WHERE requested.deleted=0 AND requested.inbound_code=#{inboundCode}
|
||||
AND group_row.group_status IN ('ACTIVE','LOCKED','CONSUMED')
|
||||
ORDER BY group_row.id
|
||||
""")
|
||||
List<InboundGroupLookupRow> groupsByInboundCode(@Param("inboundCode") String inboundCode);
|
||||
|
||||
@Select("""
|
||||
SELECT DISTINCT inbound.inbound_code inboundCode
|
||||
FROM fl_coload_group_member member
|
||||
JOIN fl_inbound_order inbound
|
||||
ON inbound.tenant_id=member.tenant_id AND inbound.id=member.inbound_id
|
||||
WHERE member.group_id=#{groupId} AND inbound.deleted=0
|
||||
AND inbound.inbound_code IS NOT NULL AND TRIM(inbound.inbound_code)<>''
|
||||
ORDER BY inbound.inbound_code
|
||||
""")
|
||||
List<MemberCodeRow> effectiveMemberCodes(@Param("groupId") long groupId);
|
||||
|
||||
@Update("""
|
||||
UPDATE fl_coload_group
|
||||
|
||||
+8
-2
@@ -49,9 +49,15 @@ public final class ColoadPersistenceRows {
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
public static class OrderGroupLinkRow {
|
||||
private Long orderId;
|
||||
public static class InboundGroupLookupRow {
|
||||
private Long groupId;
|
||||
private String groupStatus;
|
||||
}
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
public static class MemberCodeRow {
|
||||
private String inboundCode;
|
||||
}
|
||||
|
||||
@Getter
|
||||
|
||||
+23
-11
@@ -5,7 +5,8 @@ import com.baiyue.common.core.api.ResultCode;
|
||||
import com.baiyue.common.core.exception.BizException;
|
||||
import com.baiyue.firstleg.loading.coload.model.ColoadGroupModels.GroupSnapshot;
|
||||
import com.baiyue.firstleg.loading.coload.model.ColoadGroupModels.Member;
|
||||
import com.baiyue.firstleg.loading.coload.model.ColoadGroupModels.OrderGroupInfo;
|
||||
import com.baiyue.firstleg.loading.coload.model.ColoadGroupModels.BusinessMember;
|
||||
import com.baiyue.firstleg.loading.coload.model.ColoadGroupModels.BusinessSummary;
|
||||
import com.baiyue.firstleg.loading.coload.persistence.ColoadGroupMapper;
|
||||
import com.baiyue.firstleg.loading.coload.persistence.ColoadPersistenceRows.CommandRow;
|
||||
import com.baiyue.firstleg.loading.coload.persistence.ColoadPersistenceRows.GroupRow;
|
||||
@@ -89,17 +90,28 @@ public class ColoadGroupService implements ColoadGroupAssignmentPort {
|
||||
}
|
||||
|
||||
@Transactional(readOnly = true)
|
||||
public List<OrderGroupInfo> queryByOrderIds(List<Long> requestedOrderIds) {
|
||||
List<Long> orderIds = normalizedOrderIds(requestedOrderIds, 1, 200);
|
||||
Map<Long, OrderGroupInfo> latest = new LinkedHashMap<>();
|
||||
Map<Long, GroupSnapshot> groups = new LinkedHashMap<>();
|
||||
for (var link : mapper.linksByOrderIds(orderIds)) {
|
||||
if (latest.containsKey(link.getOrderId())) continue;
|
||||
GroupSnapshot group = groups.computeIfAbsent(link.getGroupId(), this::requiredSnapshot);
|
||||
if (!CURRENT_GROUP_STATUSES.contains(group.status())) continue;
|
||||
latest.put(link.getOrderId(), new OrderGroupInfo(link.getOrderId(), group));
|
||||
public BusinessSummary queryByInboundCode(String inboundCode) {
|
||||
String code = trim(inboundCode);
|
||||
if (code == null || code.length() > 40) throw badRequest("inboundCode不能为空且不能超过40字符");
|
||||
var groups = mapper.groupsByInboundCode(code).stream()
|
||||
.filter(row -> row.getGroupId() != null && CURRENT_GROUP_STATUSES.contains(row.getGroupStatus()))
|
||||
.toList();
|
||||
long distinctGroups = groups.stream().map(row -> row.getGroupId()).distinct().limit(2).count();
|
||||
if (distinctGroups == 0) {
|
||||
throw new BizException(ResultCode.NOT_FOUND, "入仓码未关联有效同柜不可拆组");
|
||||
}
|
||||
return orderIds.stream().map(latest::get).filter(Objects::nonNull).toList();
|
||||
if (distinctGroups > 1) throw conflict("入仓码关联多个有效同柜不可拆组");
|
||||
long groupId = groups.get(0).getGroupId();
|
||||
String status = groups.get(0).getGroupStatus();
|
||||
List<BusinessMember> members = mapper.effectiveMemberCodes(groupId).stream()
|
||||
.map(row -> trim(row.getInboundCode()))
|
||||
.filter(Objects::nonNull)
|
||||
.distinct()
|
||||
.sorted()
|
||||
.map(BusinessMember::new)
|
||||
.toList();
|
||||
if (members.isEmpty()) throw conflict("同柜不可拆组不存在有效入仓片段");
|
||||
return new BusinessSummary(status, members.size(), members);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
Reference in New Issue
Block a user