二期内容提交
This commit is contained in:
@@ -0,0 +1,60 @@
|
||||
package com.baiyue.order.controller;
|
||||
|
||||
import com.baiyue.common.core.api.ApiResponse;
|
||||
import com.baiyue.common.core.api.ResultCode;
|
||||
import com.baiyue.common.core.exception.BizException;
|
||||
import com.baiyue.order.entity.OrderCargoEntity;
|
||||
import com.baiyue.order.repository.OrderRepository;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.RequestHeader;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.security.MessageDigest;
|
||||
|
||||
/** 供头程履约服务校验入仓单所关联订单货物明细。 */
|
||||
@RestController
|
||||
@RequestMapping("/internal/order/v1/cargoes")
|
||||
public class InternalOrderCargoController {
|
||||
private final OrderRepository orders;
|
||||
private final byte[] expectedToken;
|
||||
|
||||
public InternalOrderCargoController(OrderRepository orders,
|
||||
@Value("${baiyue.security.internal-service-token}") String token) {
|
||||
this.orders = orders;
|
||||
this.expectedToken = token.getBytes(StandardCharsets.UTF_8);
|
||||
}
|
||||
|
||||
@GetMapping("/{tenantId}/{orderId}/{cargoId}")
|
||||
public ApiResponse<CargoBinding> detail(
|
||||
@RequestHeader(value = "X-Internal-Service-Token", required = false) String token,
|
||||
@PathVariable long tenantId,
|
||||
@PathVariable long orderId,
|
||||
@PathVariable long cargoId) {
|
||||
requireToken(token);
|
||||
if (tenantId <= 0 || orderId <= 0 || cargoId <= 0) {
|
||||
throw new BizException(ResultCode.BAD_REQUEST, "租户、订单和货物明细ID必须大于0");
|
||||
}
|
||||
OrderCargoEntity cargo = orders.findCargo(tenantId, orderId, cargoId);
|
||||
if (cargo == null) {
|
||||
throw new BizException(ResultCode.NOT_FOUND, "订单货物明细不存在或不属于该订单");
|
||||
}
|
||||
return ApiResponse.success(new CargoBinding(cargo.getId(), cargo.getOrderId(), cargo.getItemNo(),
|
||||
cargo.getCargoName(), cargo.getPackageCount(), cargo.getGrossWeightKg(), cargo.getVolumeCbm()));
|
||||
}
|
||||
|
||||
private void requireToken(String token) {
|
||||
if (token == null || !MessageDigest.isEqual(expectedToken, token.getBytes(StandardCharsets.UTF_8))) {
|
||||
throw new BizException(ResultCode.FORBIDDEN, "内部服务凭证无效");
|
||||
}
|
||||
}
|
||||
|
||||
public record CargoBinding(Long cargoId, Long orderId, Integer itemNo, String cargoName,
|
||||
Integer originalPackageCount,
|
||||
java.math.BigDecimal originalGrossWeightKg,
|
||||
java.math.BigDecimal originalVolumeCbm) {
|
||||
}
|
||||
}
|
||||
@@ -106,6 +106,14 @@ public class OrderRepository {
|
||||
.orderByAsc(OrderCargoEntity::getItemNo));
|
||||
}
|
||||
|
||||
public OrderCargoEntity findCargo(long tenantId, long orderId, long cargoId) {
|
||||
return cargoMapper.selectOne(new LambdaQueryWrapper<OrderCargoEntity>()
|
||||
.eq(OrderCargoEntity::getTenantId, tenantId)
|
||||
.eq(OrderCargoEntity::getOrderId, orderId)
|
||||
.eq(OrderCargoEntity::getId, cargoId)
|
||||
.eq(OrderCargoEntity::getDeleted, false));
|
||||
}
|
||||
|
||||
public List<OrderPartyEntity> findParties(long tenantId, long orderId) {
|
||||
return partyMapper.selectList(new LambdaQueryWrapper<OrderPartyEntity>()
|
||||
.eq(OrderPartyEntity::getTenantId, tenantId).eq(OrderPartyEntity::getOrderId, orderId));
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
package com.baiyue.order.controller;
|
||||
|
||||
import com.baiyue.common.core.exception.BizException;
|
||||
import com.baiyue.order.entity.OrderCargoEntity;
|
||||
import com.baiyue.order.repository.OrderRepository;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.assertj.core.api.Assertions.assertThatThrownBy;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
class InternalOrderCargoControllerTest {
|
||||
private final OrderRepository orders = mock(OrderRepository.class);
|
||||
private final InternalOrderCargoController controller =
|
||||
new InternalOrderCargoController(orders, "internal-token");
|
||||
|
||||
@Test
|
||||
void 只返回指定租户订单下的已有货物明细() {
|
||||
OrderCargoEntity cargo = new OrderCargoEntity();
|
||||
cargo.setId(31L);
|
||||
cargo.setOrderId(21L);
|
||||
cargo.setItemNo(1);
|
||||
cargo.setCargoName("测试货物");
|
||||
cargo.setPackageCount(50);
|
||||
when(orders.findCargo(11L, 21L, 31L)).thenReturn(cargo);
|
||||
|
||||
var response = controller.detail("internal-token", 11L, 21L, 31L);
|
||||
|
||||
assertThat(response.successful()).isTrue();
|
||||
assertThat(response.data().cargoId()).isEqualTo(31L);
|
||||
assertThat(response.data().itemNo()).isEqualTo(1);
|
||||
verify(orders).findCargo(11L, 21L, 31L);
|
||||
}
|
||||
|
||||
@Test
|
||||
void 内部令牌错误时拒绝查询() {
|
||||
assertThatThrownBy(() -> controller.detail("bad-token", 11L, 21L, 31L))
|
||||
.isInstanceOf(BizException.class)
|
||||
.hasMessageContaining("凭证无效");
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user