diff --git a/src/main/java/com/genersoft/iot/vmp/jt1078/bean/JTRectangleArea.java b/src/main/java/com/genersoft/iot/vmp/jt1078/bean/JTRectangleArea.java new file mode 100644 index 000000000..1c5bbb7f7 --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/jt1078/bean/JTRectangleArea.java @@ -0,0 +1,163 @@ +package com.genersoft.iot.vmp.jt1078.bean; + +import com.genersoft.iot.vmp.jt1078.util.BCDUtil; +import com.genersoft.iot.vmp.utils.DateUtil; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.nio.charset.Charset; + +@Schema(description = "矩形区域") +public class JTRectangleArea { + + @Schema(description = "区域 ID") + private long id; + + @Schema(description = "") + private JTAreaAttribute attribute; + + @Schema(description = "左上点纬度") + private Double latitudeForUpperLeft; + + @Schema(description = "左上点经度") + private Double longitudeForUpperLeft; + + @Schema(description = "右下点纬度") + private Double latitudeForLowerRight; + + @Schema(description = "右下点经度") + private Double longitudeForLowerRight; + + @Schema(description = "起始时间, yyyy-MM-dd HH:mm:ss") + private String startTime; + + @Schema(description = "结束时间, yyyy-MM-dd HH:mm:ss") + private String endTime; + + @Schema(description = "最高速度, 单位为千米每小时(km/h)") + private int maxSpeed; + + @Schema(description = "超速持续时间, 单位为秒(s)") + private int overSpeedDuration; + + @Schema(description = "夜间最高速度, 单位为千米每小时(km/h)") + private int nighttimeMaxSpeed; + + @Schema(description = "区域的名称") + private String name; + + public ByteBuf encode(){ + ByteBuf byteBuf = Unpooled.buffer(); + byteBuf.writeInt((int) (id & 0xffffffffL)); + byteBuf.writeBytes(attribute.encode()); + byteBuf.writeInt((int) (Math.round((latitudeForUpperLeft * 1000000)) & 0xffffffffL)); + byteBuf.writeInt((int) (Math.round((longitudeForLowerRight * 1000000)) & 0xffffffffL)); + byteBuf.writeInt((int) (Math.round((latitudeForLowerRight * 1000000)) & 0xffffffffL)); + byteBuf.writeInt((int) (Math.round((longitudeForLowerRight * 1000000)) & 0xffffffffL)); + byteBuf.writeBytes(BCDUtil.transform(DateUtil.yyyy_MM_dd_HH_mm_ssToTimestamp(startTime))); + byteBuf.writeBytes(BCDUtil.transform(DateUtil.yyyy_MM_dd_HH_mm_ssToTimestamp(endTime))); + byteBuf.writeShort((short)(maxSpeed & 0xffff)); + byteBuf.writeByte(overSpeedDuration); + byteBuf.writeShort((short)(nighttimeMaxSpeed & 0xffff)); + byteBuf.writeShort((short)(name.getBytes(Charset.forName("GBK")).length & 0xffff)); + byteBuf.writeCharSequence(name, Charset.forName("GBK")); + return byteBuf; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public JTAreaAttribute getAttribute() { + return attribute; + } + + public void setAttribute(JTAreaAttribute attribute) { + this.attribute = attribute; + } + + public Double getLatitudeForUpperLeft() { + return latitudeForUpperLeft; + } + + public void setLatitudeForUpperLeft(Double latitudeForUpperLeft) { + this.latitudeForUpperLeft = latitudeForUpperLeft; + } + + public Double getLongitudeForUpperLeft() { + return longitudeForUpperLeft; + } + + public void setLongitudeForUpperLeft(Double longitudeForUpperLeft) { + this.longitudeForUpperLeft = longitudeForUpperLeft; + } + + public Double getLatitudeForLowerRight() { + return latitudeForLowerRight; + } + + public void setLatitudeForLowerRight(Double latitudeForLowerRight) { + this.latitudeForLowerRight = latitudeForLowerRight; + } + + public Double getLongitudeForLowerRight() { + return longitudeForLowerRight; + } + + public void setLongitudeForLowerRight(Double longitudeForLowerRight) { + this.longitudeForLowerRight = longitudeForLowerRight; + } + + public String getStartTime() { + return startTime; + } + + public void setStartTime(String startTime) { + this.startTime = startTime; + } + + public String getEndTime() { + return endTime; + } + + public void setEndTime(String endTime) { + this.endTime = endTime; + } + + public int getMaxSpeed() { + return maxSpeed; + } + + public void setMaxSpeed(int maxSpeed) { + this.maxSpeed = maxSpeed; + } + + public int getOverSpeedDuration() { + return overSpeedDuration; + } + + public void setOverSpeedDuration(int overSpeedDuration) { + this.overSpeedDuration = overSpeedDuration; + } + + public int getNighttimeMaxSpeed() { + return nighttimeMaxSpeed; + } + + public void setNighttimeMaxSpeed(int nighttimeMaxSpeed) { + this.nighttimeMaxSpeed = nighttimeMaxSpeed; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/src/main/java/com/genersoft/iot/vmp/jt1078/cmd/JT1078Template.java b/src/main/java/com/genersoft/iot/vmp/jt1078/cmd/JT1078Template.java index d440c21fd..f0d2efff9 100644 --- a/src/main/java/com/genersoft/iot/vmp/jt1078/cmd/JT1078Template.java +++ b/src/main/java/com/genersoft/iot/vmp/jt1078/cmd/JT1078Template.java @@ -32,6 +32,8 @@ public class JT1078Template { private static final String H8500 = "8500"; private static final String H8600 = "8600"; private static final String H8601 = "8601"; + private static final String H8602 = "8602"; + private static final String H8603 = "8603"; private static final String H9101 = "9101"; private static final String H9102 = "9102"; private static final String H9201 = "9201"; @@ -469,4 +471,26 @@ public class JT1078Template { .build(); return SessionManager.INSTANCE.request(cmd, timeOut); } + + public Object setAreaForRectangle(String devId, J8602 j8602, int timeOut) { + Cmd cmd = new Cmd.Builder() + .setDevId(devId) + .setPackageNo(randomInt()) + .setMsgId(H8602) + .setRespId(H0001) + .setRs(j8602) + .build(); + return SessionManager.INSTANCE.request(cmd, timeOut); + } + + public Object deleteAreaForRectangle(String devId, J8603 j8603, int timeOut) { + Cmd cmd = new Cmd.Builder() + .setDevId(devId) + .setPackageNo(randomInt()) + .setMsgId(H8603) + .setRespId(H0001) + .setRs(j8603) + .build(); + return SessionManager.INSTANCE.request(cmd, timeOut); + } } diff --git a/src/main/java/com/genersoft/iot/vmp/jt1078/controller/JT1078Controller.java b/src/main/java/com/genersoft/iot/vmp/jt1078/controller/JT1078Controller.java index 82a34fddf..19918ab35 100644 --- a/src/main/java/com/genersoft/iot/vmp/jt1078/controller/JT1078Controller.java +++ b/src/main/java/com/genersoft/iot/vmp/jt1078/controller/JT1078Controller.java @@ -546,5 +546,71 @@ public class JT1078Controller { } } + + @Operation(summary = "1078-更新矩形区域", security = @SecurityRequirement(name = JwtUtils.HEADER)) + @Parameter(name = "areaParam", description = "设置区域参数", required = true) + @PostMapping("/area/rectangle/update") + public WVPResult updateAreaForRectangle(@RequestBody SetAreaParam areaParam){ + + logger.info("[1078-更新矩形区域] areaParam: {},", areaParam); + int result = service.setAreaForRectangle(0, areaParam.getDeviceId(), areaParam.getRectangleAreas()); + if (result == 0) { + return WVPResult.success(result); + }else { + WVPResult fail = WVPResult.fail(ErrorCode.ERROR100); + fail.setData(result); + return fail; + } + } + + @Operation(summary = "1078-追加矩形区域", security = @SecurityRequirement(name = JwtUtils.HEADER)) + @Parameter(name = "areaParam", description = "设置区域参数", required = true) + @PostMapping("/area/rectangle/add") + public WVPResult addAreaForRectangle(@RequestBody SetAreaParam areaParam){ + + logger.info("[1078-追加矩形区域] areaParam: {},", areaParam); + int result = service.setAreaForRectangle(1, areaParam.getDeviceId(), areaParam.getRectangleAreas()); + if (result == 0) { + return WVPResult.success(result); + }else { + WVPResult fail = WVPResult.fail(ErrorCode.ERROR100); + fail.setData(result); + return fail; + } + } + + @Operation(summary = "1078-修改矩形区域", security = @SecurityRequirement(name = JwtUtils.HEADER)) + @Parameter(name = "areaParam", description = "设置区域参数", required = true) + @PostMapping("/area/rectangle/edit") + public WVPResult editAreaForRectangle(@RequestBody SetAreaParam areaParam){ + + logger.info("[1078-修改矩形区域] areaParam: {},", areaParam); + int result = service.setAreaForRectangle(2, areaParam.getDeviceId(), areaParam.getRectangleAreas()); + if (result == 0) { + return WVPResult.success(result); + }else { + WVPResult fail = WVPResult.fail(ErrorCode.ERROR100); + fail.setData(result); + return fail; + } + } + + @Operation(summary = "1078-删除矩形区域", security = @SecurityRequirement(name = JwtUtils.HEADER)) + @Parameter(name = "deviceId", description = "设备编号", required = true) + @Parameter(name = "ids", description = "待删除圆形区域的id,例如1,2,3", required = true) + @GetMapping("/area/rectangle/delete") + public WVPResult deleteAreaForRectangle(String deviceId, @RequestParam(value = "ids", required = false) List ids){ + + logger.info("[1078-删除矩形区域] deviceId: {}, ids:{}", deviceId, ids); + int result = service.deleteAreaForRectangle(deviceId, ids); + if (result == 0) { + return WVPResult.success(result); + }else { + WVPResult fail = WVPResult.fail(ErrorCode.ERROR100); + fail.setData(result); + return fail; + } + } + } diff --git a/src/main/java/com/genersoft/iot/vmp/jt1078/controller/bean/SetAreaParam.java b/src/main/java/com/genersoft/iot/vmp/jt1078/controller/bean/SetAreaParam.java index e9fc88b04..fe19ab944 100644 --- a/src/main/java/com/genersoft/iot/vmp/jt1078/controller/bean/SetAreaParam.java +++ b/src/main/java/com/genersoft/iot/vmp/jt1078/controller/bean/SetAreaParam.java @@ -2,6 +2,7 @@ package com.genersoft.iot.vmp.jt1078.controller.bean; import com.genersoft.iot.vmp.jt1078.bean.JTCircleArea; import com.genersoft.iot.vmp.jt1078.bean.JTPhoneBookContact; +import com.genersoft.iot.vmp.jt1078.bean.JTRectangleArea; import io.swagger.v3.oas.annotations.media.Schema; import java.util.List; @@ -15,6 +16,9 @@ public class SetAreaParam { @Schema(description = "圆形区域项") private List circleAreaList; + @Schema(description = "矩形区域项") + private List rectangleAreas; + public String getDeviceId() { return deviceId; @@ -32,11 +36,20 @@ public class SetAreaParam { this.circleAreaList = circleAreaList; } + public List getRectangleAreas() { + return rectangleAreas; + } + + public void setRectangleAreas(List rectangleAreas) { + this.rectangleAreas = rectangleAreas; + } + @Override public String toString() { return "SetAreaParam{" + "deviceId='" + deviceId + '\'' + ", circleAreaList=" + circleAreaList + + ", rectangleAreas=" + rectangleAreas + '}'; } } diff --git a/src/main/java/com/genersoft/iot/vmp/jt1078/proc/response/J8602.java b/src/main/java/com/genersoft/iot/vmp/jt1078/proc/response/J8602.java new file mode 100644 index 000000000..9ff6aec1b --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/jt1078/proc/response/J8602.java @@ -0,0 +1,57 @@ +package com.genersoft.iot.vmp.jt1078.proc.response; + +import com.genersoft.iot.vmp.jt1078.annotation.MsgId; +import com.genersoft.iot.vmp.jt1078.bean.JTCircleArea; +import com.genersoft.iot.vmp.jt1078.bean.JTRectangleArea; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; + +import java.util.List; + +/** + * 设置矩形区域 + */ +@MsgId(id = "8602") +public class J8602 extends Rs { + + /** + * 设置属性, 0:更新区域; 1:追加区域; 2:修改区域 + */ + private int attribute; + + /** + * 区域项 + */ + private List rectangleAreas; + + + @Override + public ByteBuf encode() { + ByteBuf buffer = Unpooled.buffer(); + buffer.writeByte(attribute); + buffer.writeByte(rectangleAreas.size()); + if (rectangleAreas.isEmpty()) { + return buffer; + } + for (JTRectangleArea area : rectangleAreas) { + buffer.writeBytes(area.encode()); + } + return buffer; + } + + public int getAttribute() { + return attribute; + } + + public void setAttribute(int attribute) { + this.attribute = attribute; + } + + public List getRectangleAreas() { + return rectangleAreas; + } + + public void setRectangleAreas(List rectangleAreas) { + this.rectangleAreas = rectangleAreas; + } +} diff --git a/src/main/java/com/genersoft/iot/vmp/jt1078/proc/response/J8603.java b/src/main/java/com/genersoft/iot/vmp/jt1078/proc/response/J8603.java new file mode 100644 index 000000000..1d8f1a740 --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/jt1078/proc/response/J8603.java @@ -0,0 +1,44 @@ +package com.genersoft.iot.vmp.jt1078.proc.response; + +import com.genersoft.iot.vmp.jt1078.annotation.MsgId; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; + +import java.util.List; + +/** + * 删除矩形区域 + */ +@MsgId(id = "8603") +public class J8603 extends Rs { + + + /** + * 待删除的区域ID + */ + private List idList; + + + @Override + public ByteBuf encode() { + ByteBuf buffer = Unpooled.buffer(); + if (idList == null || idList.isEmpty()) { + buffer.writeByte(0); + return buffer; + }else { + buffer.writeByte(idList.size()); + } + for (Long id : idList) { + buffer.writeInt((int) (id & 0xffffffffL)); + } + return buffer; + } + + public List getIdList() { + return idList; + } + + public void setIdList(List idList) { + this.idList = idList; + } +} diff --git a/src/main/java/com/genersoft/iot/vmp/jt1078/service/Ijt1078Service.java b/src/main/java/com/genersoft/iot/vmp/jt1078/service/Ijt1078Service.java index 768951f11..ebc9024bb 100644 --- a/src/main/java/com/genersoft/iot/vmp/jt1078/service/Ijt1078Service.java +++ b/src/main/java/com/genersoft/iot/vmp/jt1078/service/Ijt1078Service.java @@ -73,4 +73,8 @@ public interface Ijt1078Service { int setAreaForCircle(int attribute, String deviceId, List circleAreaList); int deleteAreaForCircle(String deviceId, List ids); + + int setAreaForRectangle(int i, String deviceId, List rectangleAreas); + + int deleteAreaForRectangle(String deviceId, List ids); } diff --git a/src/main/java/com/genersoft/iot/vmp/jt1078/service/impl/jt1078ServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/jt1078/service/impl/jt1078ServiceImpl.java index 5370bbf4d..1363d3f9e 100644 --- a/src/main/java/com/genersoft/iot/vmp/jt1078/service/impl/jt1078ServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/jt1078/service/impl/jt1078ServiceImpl.java @@ -624,4 +624,19 @@ public class jt1078ServiceImpl implements Ijt1078Service { j8601.setIdList(ids); return (int)jt1078Template.deleteAreaForCircle(deviceId, j8601, 20); } + + @Override + public int setAreaForRectangle(int attribute, String deviceId, List rectangleAreas) { + J8602 j8602 = new J8602(); + j8602.setAttribute(attribute); + j8602.setRectangleAreas(rectangleAreas); + return (int)jt1078Template.setAreaForRectangle(deviceId, j8602, 20); + } + + @Override + public int deleteAreaForRectangle(String deviceId, List ids) { + J8603 j8603 = new J8603(); + j8603.setIdList(ids); + return (int)jt1078Template.deleteAreaForRectangle(deviceId, j8603, 20); + } }