feat(order): 添加配送范围电子围栏校验功能

- 在订单创建流程中集成电子围栏校验机制
- 实现不信任前端坐标的地址表坐标验证策略
- 添加多种格式的围栏points解析支持(JSON、分号分隔等)
- 实现射线投射算法进行点在多边形内判断
- 添加自提和无需物流订单的围栏校验跳过逻辑
- 实现坐标缺失和异常情况的错误处理机制
- 添加围栏配置异常时的订单拒绝保护机制
- 创建GeoFenceUtil工具类提供完整的围栏功能支持
This commit is contained in:
2026-02-09 11:16:04 +08:00
parent efe7904755
commit 3b4f8a29d8
7 changed files with 469 additions and 9 deletions

View File

@@ -0,0 +1,36 @@
package com.gxwebsoft.shop.util;
import org.junit.jupiter.api.Test;
import java.util.List;
import static org.junit.jupiter.api.Assertions.*;
class GeoFenceUtilTest {
@Test
void parsePoints_semicolonPairs() {
List<GeoFenceUtil.Point> pts = GeoFenceUtil.parsePolygonPoints("0,0;10,0;10,10;0,10");
assertEquals(4, pts.size());
assertEquals(0.0, pts.get(0).lng, 1e-9);
assertEquals(0.0, pts.get(0).lat, 1e-9);
}
@Test
void parsePoints_jsonArray() {
List<GeoFenceUtil.Point> pts = GeoFenceUtil.parsePolygonPoints("[[0,0],[10,0],[10,10],[0,10]]");
assertEquals(4, pts.size());
assertEquals(10.0, pts.get(2).lng, 1e-9);
assertEquals(10.0, pts.get(2).lat, 1e-9);
}
@Test
void containsInclusive_insideOutsideAndBoundary() {
List<GeoFenceUtil.Point> square = GeoFenceUtil.parsePolygonPoints("0,0;10,0;10,10;0,10");
assertTrue(GeoFenceUtil.containsInclusive(square, 5, 5), "inside");
assertFalse(GeoFenceUtil.containsInclusive(square, 15, 5), "outside");
assertTrue(GeoFenceUtil.containsInclusive(square, 0, 5), "on edge");
assertTrue(GeoFenceUtil.containsInclusive(square, 0, 0), "on vertex");
}
}