/**
* 边顶加大孔移位
* @param orderHeader 订单头
* @param json 获取数据(含有修改后的坐标点)
* @return 边顶加大孔移位后数据
*/
public PlateBuilder expandMoveHole(OrderHeader orderHeader, String json){
//只有b2b并且没有上传资料的
if (!orderHeader.getSourceType().contains("B2B")|| DataUtils.isB2BUploadDraw(orderHeader, json)) {
return this;
}
//改后的数据为空的
JsonNode holeArray = JsonUtils.readNode(json);
if (!holeArray.isArray()) {
return this;
}
//大水口
if (orderHeader.getModelStyle().matches("S..")){
for (JsonNode node : holeArray) {
String nodeJson = node.toString();
List<String> plateNames = JsonUtils.json2List(JsonUtils.path(nodeJson, "plate").toString(), String.class);
String propStr = JsonUtils.path(nodeJson, "prop").toString();
String proc = JsonUtils.pathString(nodeJson, "proc");
String desc = JsonUtils.pathString(nodeJson, "desc");
//判断是否含有要修改的板
if (!proc.contains("gz99_c031")||!plateNames.contains(plateInfo.plateName)) {
continue;
}
Map<String, Object> propMap = JsonUtils.jsonString2Map(propStr);
// 标准直径大小
float std = MapUtils.getFloat(propMap, "STD", 0f);
// 加大后直径大小
float gpD = MapUtils.getFloat(propMap, "GP_D", 0f);
float tolerance = gpD - std;
if (tolerance > 0) {
//大水口只做AB板
if (!plateInfo.plateName.matches("A.*|B.*")){
return this;
}
plateInfo.sideList.forEach(side ->{
//只从反面开始处理
if (PlateSideEnum.反.equals(side.sideName)){
//获取孔数据
for (AbsProcess absProcess : side.procList){
//是否为空类型
if (!(absProcess instanceof Hole)) {
continue;
}
Hole hole = (Hole) absProcess;
//是否未标准孔
if (!StringUtils.equalsIgnoreCase(hole.sourceType, "BOM")) {
continue;
}
//只做带托通孔
if(!hole.ncName.matches("带托通孔")){
continue;
}
//孔坐标不为空
if (CollectionUtils.isEmpty(hole.pointList)) {
continue;
}
String holeType = plateInfo.plateName.contains("A板") ? "托司孔" : "边钉-针板边孔";
HoleDM stdHole = NcTypeTl.getHoleDm("带托通孔", holeType, Integer.toString((int) gpD));
//找偏移坐标
Point2D.Float deviatedPoint = findDeviatedHole(hole.pointList);
// === 因为摆放方式不一样是这个数据竖摆的,数据中心是横摆的 最后返回是横摆的 所以 GP_X换成GP_Y
//偏移后x绝对值
Float gpx = MapUtils.getFloat(propMap, "GP_Y", 0f);
//偏移后y绝对值
Float gpy = MapUtils.getFloat(propMap, "GP_X", 0f);
Float gpx1 = MapUtils.getFloat(propMap, "GP_Y1", 0f);
Float gpy1 = MapUtils.getFloat(propMap, "GP_X1", 0f);
for (Point2D.Float point : hole.pointList) {
if (!Objects.isNull(deviatedPoint) && Math.abs(point.x) == Math.abs(deviatedPoint.x)
&& Math.abs(point.y) == Math.abs(deviatedPoint.y)){
if (Objects.isNull(gpx1)|| gpx1 == 0f){
point.y = point.y > 0 ? gpy1 : (point.y == 0f ? 0f: -gpy1);
point.x = point.x > 0 ? gpx : (point.x == 0f ? 0f: -gpx);
}else {
point.x = point.x > 0 ? gpx1 : (point.x == 0f ? 0f: -gpx1);
point.y = point.y > 0 ? gpy : (point.y == 0f ? 0f: -gpy);
}
}else {
point.x = point.x > 0 ? gpx : (point.x == 0f ? 0f: -gpx);
point.y = point.y > 0 ? gpy : (point.y == 0f ? 0f: -gpy);
}
}
hole.d = stdHole.getD();
hole.spec = stdHole.getSpec();
hole.h = plateInfo.plateThick - stdHole.getH2();
hole.D = stdHole.getD2();
hole.H = stdHole.getH2();
hole.holeSpec = holeType;
hole.holeSize = hole.spec;
}
}
});
}
}
}else if (orderHeader.getModelStyle().matches("[FG]..")){
//简化型细水口
for (JsonNode node : holeArray) {
String nodeJson = node.toString();
List<String> plateNames = JsonUtils.json2List(JsonUtils.path(nodeJson, "plate").toString(), String.class);
String propStr = JsonUtils.path(nodeJson, "prop").toString();
String proc = JsonUtils.pathString(nodeJson, "proc");
//判断是否含有要修改的板
if (!proc.contains("gz99_c031")||!plateNames.contains(plateInfo.plateName)) {
continue;
}
Map<String, Object> propMap = JsonUtils.jsonString2Map(propStr);
// 标准直径大小
float std = MapUtils.getFloat(propMap, "STD", 0f);
// 加大后直径大小
float gpD = MapUtils.getFloat(propMap, "GP_D", 0f);
float tolerance = gpD - std;
if (tolerance > 0) {
String tempName = DataUtils.plateNameHandle(plateInfo.plateName);
//简化型细水口 包含的板类
if (!TEMPLATE_PATTERN.matcher(tempName).matches()){
return this;
}
plateInfo.sideList.forEach(side ->{
//只从反面开始处理
if (PlateSideEnum.反.equals(side.sideName)){
//获取孔数据
for (AbsProcess absProcess : side.procList){
//是否为空类型
if (!(absProcess instanceof Hole)) {
continue;
}
Hole hole = (Hole) absProcess;
//是否为标准孔
if (!StringUtils.equalsIgnoreCase(hole.sourceType, "BOM")) {
continue;
}
//孔坐标不为空
if (CollectionUtils.isEmpty(hole.pointList)) {
continue;
}
Map<String, Object> resultMap = buildParam(plateInfo.plateName, propMap, hole);
if (MapUtils.isEmpty(resultMap)){
continue;
}
HoleDM stdHole = (HoleDM)MapUtils.getObject(resultMap,"holeDM");
String attr = MapUtils.getString(resultMap,"attr");
String holeType = MapUtils.getString(resultMap,"holeType");
if (attr.matches("gpD")){
//找偏移坐标
Point2D.Float deviatedPoint = findDeviatedHole(hole.pointList);
// === 因为摆放方式不一样是这个数据竖摆的,数据中心是横摆的 最后返回是横摆的 所以 GP_X换成GP_Y
//偏移后x绝对值
Float gpx = MapUtils.getFloat(propMap, "GP_Y", 0f);
//偏移后y绝对值
Float gpy = MapUtils.getFloat(propMap, "GP_X", 0f);
Float gpx1 = MapUtils.getFloat(propMap, "GP_Y1", 0f);
Float gpy1 = MapUtils.getFloat(propMap, "GP_X1", 0f);
for (Point2D.Float point : hole.pointList) {
if (!Objects.isNull(deviatedPoint) && Math.abs(point.x) == Math.abs(deviatedPoint.x)
&& Math.abs(point.y) == Math.abs(deviatedPoint.y)){
if (Objects.isNull(gpx1)|| gpx1 == 0f){
point.y = point.y > 0 ? gpy1 : (point.y == 0f ? 0f: -gpy1);
point.x = point.x > 0 ? gpx : (point.x == 0f ? 0f: -gpx);
}else {
point.x = point.x > 0 ? gpx1 : (point.x == 0f ? 0f: -gpx1);
point.y = point.y > 0 ? gpy : (point.y == 0f ? 0f: -gpy);
}
}else {
point.x = point.x > 0 ? gpx : (point.x == 0f ? 0f: -gpx);
point.y = point.y > 0 ? gpy : (point.y == 0f ? 0f: -gpy);
}
}
} else if (attr.matches("sD")) {
Float gpx = MapUtils.getFloat(propMap, "S_X", 0f);
//偏移后y绝对值
Float gpy = MapUtils.getFloat(propMap, "S_Y", 0f);
for (Point2D.Float point : hole.pointList) {
point.x = point.x > 0 ? gpx : (point.x == 0f ? 0f: -gpx);
point.y = point.y > 0 ? gpy : (point.y == 0f ? 0f: -gpy);
}
} else if (attr.matches("sfD")){
Float gpx = MapUtils.getFloat(propMap, "S_X", 0f);
//偏移后y绝对值
Float gpy = MapUtils.getFloat(propMap, "SF_Y", 0f);
for (Point2D.Float point : hole.pointList) {
point.x = point.x > 0 ? gpx : (point.x == 0f ? 0f: -gpx);
point.y = point.y > 0 ? gpy : (point.y == 0f ? 0f: -gpy);
}
} else if (attr.matches("rpD")){
Float gpx = MapUtils.getFloat(propMap, "RP_X", 0f);
//偏移后y绝对值
Float gpy = MapUtils.getFloat(propMap, "RP_Y", 0f);
for (Point2D.Float point : hole.pointList) {
point.x = point.x > 0 ? gpx : (point.x == 0f ? 0f: -gpx);
point.y = point.y > 0 ? gpy : (point.y == 0f ? 0f: -gpy);
}
}
hole.d = stdHole.getD();
hole.spec = stdHole.getSpec();
hole.h = plateInfo.plateThick - stdHole.getH2();
hole.D = stdHole.getD2();
hole.H = stdHole.getH2();
hole.holeSpec = holeType;
hole.holeSize = hole.spec;
}
}
});
}
}
}
return this;
}
/**
* 找出偏移孔的位置
* @param point2DList 偏移孔的位置
* @return 偏移孔的位置
*/
private Point2D.Float findDeviatedHole(List<Point2D.Float> point2DList){
// 检查空列表
if (point2DList == null || point2DList.isEmpty()) {
return null;
}
// 查找唯一的x值(保留原始符号)
Optional<Float> uniqueX = point2DList.stream()
.collect(Collectors.groupingBy(p->
Math.abs(p.getX()),
Collectors.counting()
))
.entrySet().stream()
.filter(entry -> entry.getValue() == 1)
.findFirst()// 返回 Optional<Map.Entry<Float, Long>>
.map(entry -> entry.getKey().floatValue()); // 转换为 Optional<Float>
// 查找唯一的y值(保留原始符号)
Optional<Float> uniqueY = point2DList.stream()
.collect(Collectors.groupingBy(p->
Math.abs(p.getY()),
Collectors.counting()
))
.entrySet().stream()
.filter(entry -> entry.getValue() == 1)
.findFirst() // 返回 Optional<Map.Entry<Float, Long>>
.map(entry -> entry.getKey().floatValue()); // 转换为 Optional<Float>
// 检查是否存在偏移孔
if (!uniqueX.isPresent() && !uniqueY.isPresent()) {
return null;
}
// 创建结果点
Point2D.Float result = new Point2D.Float();
// 设置x坐标(如果有偏移则用唯一值,否则用第一个点的x值)
result.x = uniqueX.orElse(point2DList.get(0).x);
// 设置y坐标(如果有偏移则用唯一值,否则用第一个点的y值)
result.y = uniqueY.orElse(point2DList.get(0).y);
return result;
}
public Map<String, Object> buildParam(String plateName, Map<String, Object> propMap, Hole hole){
float gpD = MapUtils.getFloat(propMap, "GP_D", 0f);
float rpD = MapUtils.getFloat(propMap, "RP_D", 0f);
float sD = MapUtils.getFloat(propMap, "S_D", 0f);
float sfD = MapUtils.getFloat(propMap, "SF_D", 0f);
String attr = null;
String holeType = null;
HoleDM holeDM = new HoleDM();
switch (plateName){
case "A板":
if (hole.ncName.matches("带托通孔")){
holeDM = NcTypeTl.getHoleDm("带托通孔", "托司孔", Integer.toString((int) gpD));
attr = "gpD";
holeType = "托司孔";
}
break;
case "B板":
if (hole.ncName.matches("带托通孔")){
holeDM = NcTypeTl.getHoleDm("带托通孔", "托司孔", Integer.toString((int) gpD));
attr = "gpD";
holeType = "托司孔";
} else if (hole.ncName.matches("牙孔")) {
holeDM = NcTypeTl.getHoleDm("牙孔", "牙孔", "M"+sD);
attr = "sD";
holeType = "牙孔";
} else if (hole.ncName.matches("精通孔")){
//使用回针孔的数据
holeDM = NcTypeTl.getHoleDm("带托通孔", "回针孔", Integer.toString((int)rpD));
attr = "rpD";
holeType = "精通孔";
}
break;
case "面板":
if (hole.ncName.matches("带托通孔")){
holeDM = NcTypeTl.getHoleDm("带托通孔", "水口边-简化边孔", Integer.toString((int) gpD));
attr = "gpD";
holeType = "水口边-简化边孔";
}
break;
case "水口推板":
if (hole.ncName.matches("精通孔")){
holeDM = NcTypeTl.getHoleDm("精通孔", "直司", Integer.toString((int) gpD));
attr = "gpD";
holeType = "直司";
}
break;
case "底板":
String proc = MapUtils.getString(propMap, "proc");
if (hole.ncName.matches("胚头孔")){
holeDM = NcTypeTl.getHoleDm("胚头孔", "胚头孔", "M"+sfD);
attr = "sfD";
holeType = "胚头孔";
}else if (StringUtils.isNotBlank(proc) && proc.equals("overDb")){
// 底板识别有“底板加工避空”位置按图字样
// 底板需增加此坐标加工:加工参数:通孔 直径按:34
}
break;
case "面针板":
if (hole.ncName.matches("带托通孔")){
holeDM = NcTypeTl.getHoleDm("带托通孔", "回针孔", Integer.toString((int)rpD));
attr = "rpD";
holeType = "回针孔";
}
break;
default:
break;
}
Map<String, Object> map = new HashMap<>();
map.put("attr", attr);
map.put("holeType", holeType);
map.put("holeDM", holeDM);
return map;
}优化代码