diff --git a/src/main/java/com/zhgd/xmgl/modules/mechanicalequipmentposition/controller/MechanicalEquipmentPositionDataController.java b/src/main/java/com/zhgd/xmgl/modules/mechanicalequipmentposition/controller/MechanicalEquipmentPositionDataController.java index 13732e9a8..34384a936 100644 --- a/src/main/java/com/zhgd/xmgl/modules/mechanicalequipmentposition/controller/MechanicalEquipmentPositionDataController.java +++ b/src/main/java/com/zhgd/xmgl/modules/mechanicalequipmentposition/controller/MechanicalEquipmentPositionDataController.java @@ -23,6 +23,7 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.MapUtils; import org.simpleframework.xml.core.Validate; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Lazy; import org.springframework.web.bind.annotation.*; import springfox.documentation.annotations.ApiIgnore; @@ -48,6 +49,8 @@ public class MechanicalEquipmentPositionDataController { @Lazy @Autowired private IMockMechanicalEquipmentPositionDataConfigService mockMechanicalEquipmentPositionDataConfigService; + @Value("${shantuiAesSecret:}") + private String shantuiAesSecret; /** * 分页列表查询 @@ -239,4 +242,5 @@ public class MechanicalEquipmentPositionDataController { return Result.ok(); } + } diff --git a/src/main/java/com/zhgd/xmgl/modules/mechanicalequipmentposition/controller/ShantuiController.java b/src/main/java/com/zhgd/xmgl/modules/mechanicalequipmentposition/controller/ShantuiController.java new file mode 100644 index 000000000..e7b8e9320 --- /dev/null +++ b/src/main/java/com/zhgd/xmgl/modules/mechanicalequipmentposition/controller/ShantuiController.java @@ -0,0 +1,60 @@ +package com.zhgd.xmgl.modules.mechanicalequipmentposition.controller; + +import cn.hutool.core.convert.Convert; +import cn.hutool.core.date.DateUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.zhgd.xmgl.modules.mechanicalequipmentposition.entity.MechanicalEquipmentPositionData; +import com.zhgd.xmgl.modules.mechanicalequipmentposition.entity.dto.ShantuiMechanicalEquipmentMsg; +import com.zhgd.xmgl.modules.mechanicalequipmentposition.service.IMechanicalEquipmentPositionDataService; +import com.zhgd.xmgl.util.shantui.AESUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.MapUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import springfox.documentation.annotations.ApiIgnore; + +import java.util.HashMap; +import java.util.Objects; + +@RestController +@RequestMapping("/") +@Slf4j +@Api(tags = "山推相关Api") +public class ShantuiController { + @Autowired + private IMechanicalEquipmentPositionDataService mechanicalEquipmentPositionDataService; + @Value("${shantuiAesSecret:}") + private String shantuiAesSecret; + + @ApiOperation(value = "山推添加机械设备定位-实时和报警数据信息", notes = "山推添加机械设备定位-实时和报警数据信息", httpMethod = "POST") + @PostMapping(value = "/notice/push") + public String addDataBySt(@ApiIgnore @RequestBody HashMap param) { + log.debug("山推添加机械设备定位-实时和报警数据信息:{}", JSON.toJSONString(param)); + try { + String cipher = MapUtils.getString(param, "cipher"); + String decrypt = AESUtil.decrypt(cipher, shantuiAesSecret); + ShantuiMechanicalEquipmentMsg equipmentMsg = JSONObject.parseObject(decrypt, ShantuiMechanicalEquipmentMsg.class); + ShantuiMechanicalEquipmentMsg.StaticAttr staticAttr = equipmentMsg.getStaticAttr(); + MechanicalEquipmentPositionData positionData = new MechanicalEquipmentPositionData(); + positionData.setDevSn(staticAttr.getDeviceCode()); + ShantuiMechanicalEquipmentMsg.DynamicAttr dynamicAttr = equipmentMsg.getDynamicAttr(); + positionData.setLatitude(Convert.toDouble(dynamicAttr.getLatitude())); + positionData.setLongitude(Convert.toDouble(dynamicAttr.getLongitude())); + positionData.setUploadTime(DateUtil.parse(equipmentMsg.getTimedetail(), "yyyyMMddHHmmssSSS")); + positionData.setSpeed(Convert.toDouble(dynamicAttr.getGps_speed())); + positionData.setWorkStatus(Objects.equals(dynamicAttr.getAcc_flag(), "0") ? 2 : 1); + positionData.setMileage(Convert.toDouble(dynamicAttr.getTotal_miles())); + mechanicalEquipmentPositionDataService.add(positionData); + } catch (Exception e) { + return "{\"code\":1, \"msg\":\"" + e.getMessage() + "\"}"; + } + return "{\"code\":0, \"msg\":\"success\"}"; + } +} diff --git a/src/main/java/com/zhgd/xmgl/modules/mechanicalequipmentposition/entity/dto/ShantuiMechanicalEquipmentMsg.java b/src/main/java/com/zhgd/xmgl/modules/mechanicalequipmentposition/entity/dto/ShantuiMechanicalEquipmentMsg.java new file mode 100644 index 000000000..9a16ec72e --- /dev/null +++ b/src/main/java/com/zhgd/xmgl/modules/mechanicalequipmentposition/entity/dto/ShantuiMechanicalEquipmentMsg.java @@ -0,0 +1,79 @@ +package com.zhgd.xmgl.modules.mechanicalequipmentposition.entity.dto; + +import lombok.Data; +import java.util.List; + +@Data +public class ShantuiMechanicalEquipmentMsg { + private String tid; + private String protocolCode; + private String cmdCode; + private String commSign; + private String transactionID; + private String version; + private String timedetail; + private Integer did; + + private StaticAttr staticAttr; + private DynamicAttr dynamicAttr; + + @Data + public static class StaticAttr { + private String deviceType; + private String terminalNo; + private String productId; + private String commSign; + private String deviceCode; + private String deviceName; + private String tid; + private String iccid; + private String createTime; + private String deviceSeries; + private String deviceModel; + private String id; + private String simNo; + private String dataSource; + private String did; + } + + @Data + public static class DynamicAttr { + private String timedetail; + private String serial_no; + private String subversion; + private String hardware_version; + private String out_sensor_oil_height_real; + private String out_sensor_oil_height; + private String gps_valid_flag; + private String gps_lat_flag; + private String gps_long_flag; + private String gps_connect_flag; + private String longitude; + private String latitude; + private String acc_flag; + private String out_voltage; + private String inner_voltage; + private String gps_speed; + private String gps_direction; + private String gps_height_mm; + private String today_hours; + private String total_hours; + private String today_miles; + private String total_miles; + private String engine_working_hours; + private String today_fuel_consume; + private String wake_up_flag; + private String row_vibrate_data; + private String column_vibrate_data; + private String rtk_positioning_mode; + private String g_sensor_temperature; + private String acceleration_x; + private String acceleration_y; + private String acceleration_z; + private String fuel_select_canid_count; + private List fuel_select_canid_list; + private String hour_select_canid_count; + private List hour_select_canid_list; + private String firmware_version_full; + } +} diff --git a/src/main/java/com/zhgd/xmgl/security/WebSecurityConfig.java b/src/main/java/com/zhgd/xmgl/security/WebSecurityConfig.java index 3d32ccab9..3b7fb4928 100644 --- a/src/main/java/com/zhgd/xmgl/security/WebSecurityConfig.java +++ b/src/main/java/com/zhgd/xmgl/security/WebSecurityConfig.java @@ -78,6 +78,7 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { http.authorizeRequests() //请求路径允许访问 + .antMatchers("/notice/push").permitAll() .antMatchers("/xmgl/electricalData/addByJj").permitAll() .antMatchers("/xmgl/cache/clearAll").permitAll() .antMatchers("/xmgl/videoScreenshot/captureScreenshotSync").permitAll() diff --git a/src/main/java/com/zhgd/xmgl/util/shantui/AESUtil.java b/src/main/java/com/zhgd/xmgl/util/shantui/AESUtil.java new file mode 100644 index 000000000..2682b367f --- /dev/null +++ b/src/main/java/com/zhgd/xmgl/util/shantui/AESUtil.java @@ -0,0 +1,74 @@ +package com.zhgd.xmgl.util.shantui; + +import javax.crypto.Cipher; +import javax.crypto.spec.SecretKeySpec; + +public class AESUtil { + private static final String KEY_AES = "AES"; + + public static String encrypt(String src, String key) throws Exception { + if (key == null || key.length() != 16) { + throw new Exception("key不满足条件"); + } + byte[] raw = key.getBytes(); + SecretKeySpec skeySpec = new SecretKeySpec(raw, KEY_AES); + Cipher cipher = Cipher.getInstance(KEY_AES); + cipher.init(Cipher.ENCRYPT_MODE, skeySpec); + byte[] encrypted = cipher.doFinal(src.getBytes()); + return byte2hex(encrypted); + } + + public static String decrypt(String src, String key) throws Exception { + if (key == null || key.length() != 16) { + throw new Exception("key不满足条件"); + } + byte[] raw = key.getBytes(); + SecretKeySpec skeySpec = new SecretKeySpec(raw, KEY_AES); + Cipher cipher = Cipher.getInstance(KEY_AES); + cipher.init(Cipher.DECRYPT_MODE, skeySpec); + byte[] encrypted1 = hex2byte(src); + byte[] original = cipher.doFinal(encrypted1); + String originalString = new String(original); + return originalString; + } + + public static byte[] hex2byte(String strhex) { + if (strhex == null) { + return null; + } + int l = strhex.length(); + if (l % 2 == 1) { + return null; + } + byte[] b = new byte[l / 2]; + for (int i = 0; i != l / 2; i++) { + b[i] = (byte) Integer.parseInt(strhex.substring(i * 2, i * 2 + 2), + 16); + } + return b; + } + + public static String byte2hex(byte[] b) { + String hs = ""; + String stmp = ""; + for (int n = 0; n < b.length; n++) { + stmp = (java.lang.Integer.toHexString(b[n] & 0XFF)); + if (stmp.length() == 1) { + hs = hs + "0" + stmp; + } else { + hs = hs + stmp; + } + } + return hs.toUpperCase(); + } + + public static void main(String[] args) { + try { + String decrypt = decrypt("69C96AE281AECBBBEC4926B60B9C7A0823025CA88C7B60AE0A861FC2D00DC8D762A7E6642EF2D8444B4C587D3F631A02BEE64E60469F413B3552900A46230BCA00C8D89713616977C8C0271FA212F4E353B40AF8F0DFDCFD46BE7A88B36D8FB4C5177C123ADF8DCB317C61CF5695B525C3449524D73FED10604BC285B536EEF02BA5172CC558BBA2CB8B889F0F1C8486FF897D76915C19C537A4F1B2ABAAE726F80406C884F349571D86ACEF5CC6E5B7C012858D6AB36FF858D196EDCD8B5203236213647E33A963F030E804A180C65A1B1DE78E519E5B4357BCBAAFD3A6D24C398C4D8E765F749DCE845336BDC4D8CD39DA072769821FA7715520F1B1ADE8AAC76A0758162D5E2B88C02624697524A67CBE5633064FEFBC9A7DD0E2C66166EA00C8D89713616977C8C0271FA212F4E3E87569470435CF48B00A2000CA22F33E4B2C110A13797B529B7D32E11569FDD2C067ACCBB0CC275F6E5846F576316FE1DE0CCF4E39E83C7B7CA98E80A41C3EE432023EBB3390439DD7C6CAD865F3436885193F700FA92BFEB47CF731E9020019815634DA5D0BBC1E831CED045DF882A81ED51B48F74416FBEF1C9703AAC276A7858BF905E48A671DAC0CC23BF4CE298FB412EEC384C741EC679D2EFA320676785B051072582F2C06ACD49AC2A48E051E33087C1A1FE6C938B20E79E0AAC71B048CE8CB6C86A482FF0931C8D8E26C985F9C7E2B79B6801A0A191B88D0C0942CA8FCE8DAC5AD0BFB52CFB2C481094B133EB1CC1C20E647CFBF10AC14D337068820DC5E5D1313D0C311F72345926BB0C211DF583521FEE56CD878008BFB80BBE21A04A6FD181C37231A265FDDE1B32EDAA0A4D5F21AE4D75AA3667C34193F578EF602A89236F12F4026CCC5D4C810DCB0BF79169B65BF1236800931000517599FBBABA54CF8FEBEC9E686A3EFC0F526A9BCC5E26F390B6635646ACAA97B71D508A69E88300543A468438D6C885ED574FF7F22A77F4CBE68DA3242D8769B331EAD7034A3C992F7F79F74BC859B1BEE1D3FD1A2B5D98FEAB8A7ECDC022C7B6FE6FD1B5A7F1386CD46807F89DA2EA6F854F7478AA28335DD2C274ACB80944B6C051ECC05B94D94F8BC4F4C306353E62648D91092F71B43E56BA575F97567D4ADA9095D0A5D58A24DA6E0986485616FBA722215427EFE41BEB302C5B6F7BBE5B289076F02D434334045F72E3E574651EEA7E41F1F545AE2A034C2A16C4D519380D5E1C75AFF471A4FF036C3FD02B607733558A92146EAFD4F4EF87B65A8DB7D5688122087780E53366A9DBB6E4DC9E5BF890F51AAA1EC186F03D4E689B58235219CBA8FF380BEB18F5CD7F03562E64649E93AE8D53F0851ACD840E850B7EC9997FBF51D663781E0A055CF201EF40CE68CA5D311F212B03575C0A9425F8FDDBCA5A77906D6C6D1F21D93EF1342D509559764B9BEC5E5761A8746EA227F5ED8E85A29B0F11F0F7EB347BCC7D1B6CBA7E9BEC773009A3052FD34A12AEDE6AABFF6AE0F54AA52480CAB665067422244C6B366218BA59C7047EBC4FE69BB69667B9B440663BDA1849C9D55D4D4025D5E2ACAFEEB57880FCAEC7EB449C930DDDE4241BB2D59E29FD56C985DCFFBC6EE3BF9D7BC486647C2C7FD67693DE2D2F4611C7E00095CA0B8D3AA35B665DC996BEC3D04F31F46F56258190F376960CF3F45C2533546EBE3EA44AD8AFA102596E853941258E3EDF7044B88718F1FFABB1BC0E8E3A92EFD5224B7E48E3E4EEEEFF8EA953D9F33FE6A7E81BB0D1CDA4FFCC4128222EC2E3BB5298C6658360453ABB9BE472772F6195A337BBF788D655BD77306B0D726D2D05D7FEDC17F5A097F75B6BE4BD30CD38FA785F9B106B9AACF95481A4BEA47A6E3F5965561631EE245A49F900924851135324809E3A081ED08D807C05FD1A09CEF06B2BC0025DBF2EC951ECDDC7F1D7A816E2DC4CEB89E4DB28AFD92C9AF060728D1F58B3EADEEA3CD0E1342A422DD1C6EA739413B396BB5768CDBAB1ED2D850417E3509DBFE2125ADD3848CAB2A7EAC9E34B53778E160324579D76FB77B165999E7D7DFF21F3E60FC33E4CF4B561EFDF75ACDFDD704F8D995D417E03EC3619E65A3E0EC4CCEFE6DAB187EB6B7176130FF49F27CA997DCD87C0006C5A0501CF5B09BB7ED5FD1C531B37182ADD4EB24F1C5A49844E52CECAE86C955002C1DBF7230C7", + "GTDcnpLW6rDKzHbL"); + System.out.println(decrypt); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/resources/application-gsx-other-env-show.properties b/src/main/resources/application-gsx-other-env-show.properties index 09817fb81..c252dfe35 100644 --- a/src/main/resources/application-gsx-other-env-show.properties +++ b/src/main/resources/application-gsx-other-env-show.properties @@ -107,3 +107,4 @@ upload.image.url.prefix=http://192.168.34.221:9111/image/ supplierResubmitApplicationUrl=http://192.168.34.175:88/#/workspace/contractorApply #管控清单危险源的区域二维码的前缀 riskListSourceRegionQrCode=http://localhost:8088/app/#/pages/projectEnd/safeSame/riskGradingControlList/riskGradingControlList?id= +shantuiAesSecret=GTDcnpLW6rDKzHbL