|
@@ -0,0 +1,141 @@
|
|
|
+package com.usky.demo.controller.web;
|
|
|
+
|
|
|
+import com.alibaba.fastjson.JSON;
|
|
|
+import com.alibaba.fastjson.JSONArray;
|
|
|
+import com.alibaba.fastjson.JSONObject;
|
|
|
+import com.usky.demo.Globals;
|
|
|
+import com.usky.demo.service.vo.EnergyRequestVO;
|
|
|
+import com.usky.demo.service.vo.MqttDataInfoVO;
|
|
|
+import com.usky.demo.util.CodeUtil;
|
|
|
+import com.usky.demo.util.HttpClientHelper;
|
|
|
+import com.usky.demo.util.JsonUtil;
|
|
|
+import com.usky.demo.util.StringUtil;
|
|
|
+import org.springframework.web.bind.annotation.*;
|
|
|
+
|
|
|
+import java.text.SimpleDateFormat;
|
|
|
+import java.util.Date;
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.Map;
|
|
|
+
|
|
|
+@RestController
|
|
|
+@RequestMapping("/dataEnergy")
|
|
|
+public class DataEnergyController {
|
|
|
+
|
|
|
+ static String token = "c19ac221e0504552b6c2ebed4b2b069b";
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ // 查询用能电表统计数据信息
|
|
|
+ @GetMapping("/queryEnergyUnitUsed")
|
|
|
+ public String QueryEnergyElectricUsed(@RequestParam(value = "energyUnitId") String energyUnitId,
|
|
|
+ @RequestParam(value = "energyUnitType") String energyUnitType,
|
|
|
+ @RequestParam(value = "energyType") String energyType,
|
|
|
+ @RequestParam(value = "circleType") String circleType,
|
|
|
+ @RequestParam(value = "dataTime") String dataTime) {
|
|
|
+ String result = "";
|
|
|
+
|
|
|
+ getToken();
|
|
|
+
|
|
|
+ HashMap<String, String> map = new HashMap<>();
|
|
|
+ map.put("energyUnitId", energyUnitId);//用能单位编码
|
|
|
+ map.put("energyUnitType",energyUnitType);//用能单位类型(11:企业,12:单位)
|
|
|
+ map.put("energyType",energyType);//能源类型(1:电,2:水)
|
|
|
+ map.put("circleType",circleType);//统计周期(1:小时,2:日,3:月)
|
|
|
+ map.put("dataTime",dataTime);//查询时间(格式 yyyyMMddHH/yyyyMMdd/yyyyMM)
|
|
|
+ try {
|
|
|
+ JSONObject electricObject = queryData("queryEnergyUnitUsed", map, token);
|
|
|
+ String electricData = electricObject.getString("data");
|
|
|
+ JSONArray array = JSON.parseArray(electricData);
|
|
|
+ JSONObject dataObj = JSONObject.parseObject(array.get(0).toString());
|
|
|
+ result = dataObj.toString();
|
|
|
+
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 查询用能电表统计数据信息
|
|
|
+ @GetMapping("/helloWorld")
|
|
|
+ public String helloWorld() {
|
|
|
+ return "hello world";
|
|
|
+ }
|
|
|
+
|
|
|
+ /* 除获取token外的所有请求都需要带有token数据,demo中简单起见未做token的保存处理,实际使用中请自行实现 */
|
|
|
+ public static void getToken() {
|
|
|
+ HashMap<String, String> map = new HashMap<>();
|
|
|
+ map.put("operatorSecret", Globals.OPERATOR_SECRET);
|
|
|
+ try {
|
|
|
+ JSONObject jsonObject = queryData("queryToken", map, null);
|
|
|
+ String data = jsonObject.getString("data");
|
|
|
+ JSONObject dataObject = JSONObject.parseObject(data);
|
|
|
+ token = dataObject.getString("accessToken");
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 请求数据
|
|
|
+ *
|
|
|
+ * @param path 请求接口
|
|
|
+ * @param dataMap 所需的数据Map
|
|
|
+ */
|
|
|
+ public static JSONObject queryData(String path, Map<String, String> dataMap, String token) throws Exception {
|
|
|
+ // 加密data部分
|
|
|
+ String encode = CodeUtil.dataEncode(JSON.toJSONString(dataMap), Globals.DATA_SECRET, Globals.DATA_SECRET_IV);
|
|
|
+ /*组装必要参数 start */
|
|
|
+ String seq = "0001";
|
|
|
+ String timeStamp = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
|
|
|
+ Map<String, String> map = new HashMap<>();
|
|
|
+ map.put("operatorId", Globals.OPERATOR_ID);
|
|
|
+ map.put("data", encode);
|
|
|
+ map.put("timeStamp", timeStamp);
|
|
|
+ map.put("seq", seq);
|
|
|
+ /*组装必要参数 end */
|
|
|
+ if (encode == null) return null;
|
|
|
+
|
|
|
+ /*生成签名 start*/
|
|
|
+ // 为防止+在收发过程中被变成空格,将加密后的密文中的所有空格替换一下
|
|
|
+ // 需要签名的参数: operatorId + 加密后的data + 时间戳 + 自增序列
|
|
|
+ String signSrc = Globals.OPERATOR_ID + encode.replaceAll(" ", "+") + timeStamp + seq;
|
|
|
+ String sig = CodeUtil.getSign(signSrc, Globals.SIGN_KEY);
|
|
|
+ //将签名放入参数Map
|
|
|
+ map.put("sig", sig);
|
|
|
+ /*生成签名 start*/
|
|
|
+ /*执行请求,使用可以附加token的doPost方*/
|
|
|
+ HttpClientHelper instance = HttpClientHelper.getInstance();
|
|
|
+ //token也可以放进参数列表
|
|
|
+ String result = instance.doPost(Globals.URL_PREFIX + (path.startsWith("/") ? path : ("/" + path)), map, token);
|
|
|
+ if (StringUtil.isEmpty(result)) return null;
|
|
|
+
|
|
|
+ /*解析数据 start*/
|
|
|
+ JSONObject jsonObject = JSON.parseObject(result);
|
|
|
+ // 失败
|
|
|
+ if (!"0".equals(jsonObject.getString("ret"))) {
|
|
|
+ printJsonMessage("send Error:", jsonObject);
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ // 验签,注意生成签名的参数顺序应和发送时一样
|
|
|
+ // 为防止'+'在收发过程中被变成' ',将加密后的密文中的所有空格替换一下
|
|
|
+ String resultSigStr = jsonObject.getString("operatorId") + jsonObject.getString("data").replaceAll(" ", "+")
|
|
|
+ + jsonObject.getString("msg") + jsonObject.getString("ret");
|
|
|
+ String resultSig = CodeUtil.getSign(resultSigStr, Globals.SIGN_KEY);
|
|
|
+ if (StringUtil.isNotEmpty(jsonObject.getString("sig")) && jsonObject.getString("sig").equals(resultSig)) {
|
|
|
+ // 解密数据,需要数据秘钥和秘钥初始化向量
|
|
|
+ String data = CodeUtil.dataDecode(jsonObject.getString("data"), Globals.DATA_SECRET, Globals.DATA_SECRET_IV);
|
|
|
+ jsonObject.put("data", data);
|
|
|
+ }
|
|
|
+ /*解析数据 end*/
|
|
|
+ // 打印 or 其他操作
|
|
|
+ printJsonMessage("Send Message:", map);
|
|
|
+ printJsonMessage("Receive Message:", result);
|
|
|
+ printJsonMessage("Decode Message:", jsonObject);
|
|
|
+ return jsonObject;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void printJsonMessage(String prefix, Object obj) {
|
|
|
+ System.out.println(prefix + JsonUtil.JsonFormart(JSON.toJSONString(obj)));
|
|
|
+ }
|
|
|
+}
|