Jelajahi Sumber

青海集中功率预测client项目,回传数据给短期,并从云平台下载气象和短期文件

wangtao 3 tahun lalu
induk
melakukan
566ce946d4
100 mengubah file dengan 1983 tambahan dan 0 penghapusan
  1. 36 0
      ipfcst-client/src/main/java/com/jiayue/client/controller/BackDatasController.java
  2. 28 0
      ipfcst-client/src/main/java/com/jiayue/client/controller/ConsoleController.java
  3. 34 0
      ipfcst-client/src/main/java/com/jiayue/client/job/SendDataToDcJob.java
  4. 187 0
      ipfcst-client/src/main/java/com/jiayue/client/service/QueryDataService.java
  5. 313 0
      ipfcst-client/src/main/java/com/jiayue/client/service/SendDataService.java
  6. 76 0
      ipfcst-client/src/main/java/com/jiayue/client/util/MD5Util.java
  7. 58 0
      ipfcst-client/src/main/resources/logback-spring.xml
  8. 9 0
      ipfcst-client/src/main/resources/static/component/code/css/style.css
  9. 81 0
      ipfcst-client/src/main/resources/static/component/code/index.html
  10. 574 0
      ipfcst-client/src/main/resources/static/component/highlight/highlight.pack.js
  11. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/highlight/styles/brown-papersq.png
  12. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/highlight/styles/pojoaque.jpg
  13. 96 0
      ipfcst-client/src/main/resources/static/component/highlight/styles/purebasic.css
  14. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/highlight/styles/school-book.png
  15. 68 0
      ipfcst-client/src/main/resources/static/component/highlight/styles/vs.css
  16. 115 0
      ipfcst-client/src/main/resources/static/component/highlight/styles/vs2015.css
  17. 104 0
      ipfcst-client/src/main/resources/static/component/highlight/styles/xcode.css
  18. 92 0
      ipfcst-client/src/main/resources/static/component/highlight/styles/xt256.css
  19. 80 0
      ipfcst-client/src/main/resources/static/component/highlight/styles/zenburn.css
  20. 1 0
      ipfcst-client/src/main/resources/static/component/jquery.min.js
  21. 1 0
      ipfcst-client/src/main/resources/static/component/layui/css/layui.css
  22. 1 0
      ipfcst-client/src/main/resources/static/component/layui/css/layui.mobile.css
  23. 2 0
      ipfcst-client/src/main/resources/static/component/layui/css/modules/code.css
  24. 1 0
      ipfcst-client/src/main/resources/static/component/layui/css/modules/laydate/default/laydate.css
  25. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/css/modules/layer/default/icon-ext.png
  26. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/css/modules/layer/default/icon.png
  27. 1 0
      ipfcst-client/src/main/resources/static/component/layui/css/modules/layer/default/layer.css
  28. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/css/modules/layer/default/loading-0.gif
  29. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/css/modules/layer/default/loading-1.gif
  30. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/css/modules/layer/default/loading-2.gif
  31. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/font/iconfont.eot
  32. 25 0
      ipfcst-client/src/main/resources/static/component/layui/font/iconfont.svg
  33. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/font/iconfont.ttf
  34. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/font/iconfont.woff
  35. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/font/iconfont.woff2
  36. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/images/face/0.gif
  37. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/images/face/1.gif
  38. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/images/face/10.gif
  39. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/images/face/11.gif
  40. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/images/face/12.gif
  41. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/images/face/13.gif
  42. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/images/face/14.gif
  43. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/images/face/15.gif
  44. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/images/face/16.gif
  45. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/images/face/17.gif
  46. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/images/face/18.gif
  47. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/images/face/19.gif
  48. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/images/face/2.gif
  49. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/images/face/20.gif
  50. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/images/face/21.gif
  51. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/images/face/22.gif
  52. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/images/face/23.gif
  53. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/images/face/24.gif
  54. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/images/face/25.gif
  55. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/images/face/26.gif
  56. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/images/face/27.gif
  57. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/images/face/28.gif
  58. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/images/face/29.gif
  59. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/images/face/3.gif
  60. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/images/face/30.gif
  61. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/images/face/31.gif
  62. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/images/face/32.gif
  63. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/images/face/33.gif
  64. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/images/face/34.gif
  65. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/images/face/35.gif
  66. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/images/face/36.gif
  67. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/images/face/37.gif
  68. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/images/face/38.gif
  69. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/images/face/39.gif
  70. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/images/face/4.gif
  71. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/images/face/40.gif
  72. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/images/face/41.gif
  73. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/images/face/42.gif
  74. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/images/face/43.gif
  75. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/images/face/44.gif
  76. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/images/face/45.gif
  77. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/images/face/46.gif
  78. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/images/face/47.gif
  79. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/images/face/48.gif
  80. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/images/face/49.gif
  81. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/images/face/5.gif
  82. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/images/face/50.gif
  83. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/images/face/51.gif
  84. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/images/face/52.gif
  85. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/images/face/53.gif
  86. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/images/face/54.gif
  87. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/images/face/55.gif
  88. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/images/face/56.gif
  89. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/images/face/57.gif
  90. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/images/face/58.gif
  91. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/images/face/59.gif
  92. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/images/face/6.gif
  93. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/images/face/60.gif
  94. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/images/face/61.gif
  95. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/images/face/62.gif
  96. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/images/face/63.gif
  97. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/images/face/64.gif
  98. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/images/face/65.gif
  99. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/images/face/66.gif
  100. TEMPAT SAMPAH
      ipfcst-client/src/main/resources/static/component/layui/images/face/67.gif

+ 36 - 0
ipfcst-client/src/main/java/com/jiayue/client/controller/BackDatasController.java

@@ -0,0 +1,36 @@
+package com.jiayue.client.controller;
+
+import cn.hutool.json.JSONUtil;
+import com.jiayue.client.service.SendDataService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 青海集中功率预测手动回传数据控制器
+ */
+
+@RestController
+@Slf4j
+public class BackDatasController {
+
+    @Autowired
+    public SendDataService sendDataService;
+
+    @RequestMapping("/send")
+    public String sendToDc(String startTime, String endTime, String flag) {
+    
+        sendDataService.send(startTime, endTime, flag);
+
+        Map result = new HashMap();
+        result.put("code", 200);
+        result.put("msg", "发送结束");
+        return JSONUtil.toJsonStr(result);
+    }
+
+
+}

+ 28 - 0
ipfcst-client/src/main/java/com/jiayue/client/controller/ConsoleController.java

@@ -0,0 +1,28 @@
+package com.jiayue.client.controller;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import java.util.HashMap;
+
+/**
+ * 青海集中功率预测首页
+ */
+@Controller
+@Slf4j
+public class ConsoleController {
+    @RequestMapping("/common")
+    public String common(HashMap<String, Object> map, Model model) {
+        model.addAttribute("say", "欢迎欢迎,热烈欢迎");
+        map.put("hello", "欢迎进入HTML页面");
+        return "index";
+    }
+
+    @RequestMapping("/callback")
+    public String callback() {
+
+        return "send";
+    }
+}

+ 34 - 0
ipfcst-client/src/main/java/com/jiayue/client/job/SendDataToDcJob.java

@@ -0,0 +1,34 @@
+package com.jiayue.client.job;
+
+import com.jiayue.client.service.SendDataService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Service;
+
+/**
+ * 青海集中功率预测向数据中心回传数据:
+ * 1.实际功率 短期 超短期 气象站 测风塔 风机 等数据
+ * 2.每天凌晨2点执行,回传前一天数据,定时任务失败需要手动触发回传
+ */
+@Service
+@Slf4j
+public class SendDataToDcJob {
+
+    @Autowired
+    public SendDataService sendDataService;
+
+    /**
+     * 每天凌晨2点执行
+     */
+    @Scheduled(cron = "0 0/5 * * * ?")
+    public void sendJob() {
+        log.info("时间 【" + System.currentTimeMillis() + "】 向数据中心发送青海集中功率预测前一天的实际功率等数据。");
+        String startTime = "2021-09-25 00:00:00";
+        String endTime = "2021-09-26 00:00:00";
+
+        sendDataService.send(startTime, endTime, "all");
+
+    }
+
+}

+ 187 - 0
ipfcst-client/src/main/java/com/jiayue/client/service/QueryDataService.java

@@ -0,0 +1,187 @@
+package com.jiayue.client.service;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.stereotype.Repository;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+@Repository
+@Slf4j
+public class QueryDataService {
+    @Autowired
+    private JdbcTemplate jdbcTemplate;
+
+    /**
+     * 查询所有电站信息
+     */
+    public List<Map<String, Object>> getStations() {
+        String stationsSql = "SELECT C_STATION_CODE,C_NAME,C_CAPACITY " +
+                "from t_electric_field ";
+        List<Map<String, Object>> list = jdbcTemplate.queryForList(stationsSql);
+        return list;
+    }
+
+    /**
+     * 查询实际功率
+     *
+     * @param startTime
+     * @param endTime
+     * @param stationCode
+     * @return
+     */
+    public List<Map<String, Object>> getRps(String startTime, String endTime, String stationCode) {
+        String rpsSql = "SELECT C_TIME,C_STATION_CODE,C_REAL_VALUE " +
+                "from t_power_station_status_data where C_STATION_CODE='" + stationCode +
+                "' and C_TIME between '" + startTime + "'and '" + endTime + "'";
+        log.info("实际功率回传数据查询sql:{}", rpsSql);
+        List<Map<String, Object>> list = jdbcTemplate.queryForList(rpsSql);
+        return list;
+    }
+
+    /**
+     * 查询短期数据
+     *
+     * @param startTime
+     * @param endTime
+     * @param stationCode
+     * @return
+     */
+    public List<Map<String, Object>> getDqs(String startTime, String endTime, String stationCode) {
+        String dqsSql = "SELECT C_FORECAST_TIME,C_STATION_CODE,C_ABLE_VALUE " +
+                "from t_forecast_power_short_term_his where C_STATION_CODE='" + stationCode +
+                "' and C_FORECAST_TIME between '" + changStrTimeToLongTime(startTime) +
+                "'and '" + changStrTimeToLongTime(endTime) + "'";
+        log.info("短期回传数据查询sql:{}", dqsSql);
+        List<Map<String, Object>> list = jdbcTemplate.queryForList(dqsSql);
+        return list;
+    }
+
+    /**
+     * 查询超短期数据
+     *
+     * @param startTime
+     * @param endTime
+     * @param stationCode
+     * @return
+     */
+    public List<Map<String, Object>> getCdqs(String startTime, String endTime, String stationCode) {
+        String cdqsSql = "SELECT C_FORECAST_TIME,C_STATION_CODE,C_ABLE_VALUE " +
+                "from t_forecast_power_ultra_short_term_his where C_STATION_CODE='" + stationCode +
+                "' and C_FORECAST_TIME between '" + changStrTimeToLongTime(startTime) +
+                "'and '" + changStrTimeToLongTime(endTime) + "'";
+        log.info("超短期回传数据查询sql:{}", cdqsSql);
+        List<Map<String, Object>> list = jdbcTemplate.queryForList(cdqsSql);
+        return list;
+    }
+
+    /**
+     * 查询环境检测仪数据:时间,设备编号,总辐射,环境温度
+     *
+     * @param startTime
+     * @param endTime
+     * @param equirpmentNo
+     * @return
+     */
+    public List<Map<String, Object>> getWeatherds(String startTime, String endTime, String equirpmentNo) {
+        String wedSql = "SELECT C_TIME,C_EQUIPMENT_NO,C_GLOBALR,C_AIRT " +
+                "from t_weather_station_status_data where C_EQUIPMENT_NO='" + equirpmentNo + "' and C_TIME between '" + startTime + "'and '" + endTime + "'";
+        log.info("超短期回传数据查询sql:{}", wedSql);
+        List<Map<String, Object>> list = jdbcTemplate.queryForList(wedSql);
+        return list;
+    }
+
+    /**
+     * 查询测风塔数据 :时间,设备编号,风速,风向
+     *
+     * @param startTime
+     * @param endTime
+     * @param equirpmentNo
+     * @return
+     */
+    public List<Map<String, Object>> getCfts(String startTime, String endTime, String equirpmentNo) {
+        String cftsSql = "SELECT C_TIME,C_EQUIPMENT_NO,C_WS_INST_HUB_HEIGHT,C_WD_INST_HUB_HEIGHT " +
+                "from t_wind_tower_status_data where C_EQUIPMENT_NO='" + equirpmentNo + "' and C_TIME between '" + startTime + "'and '" + endTime + "'";
+        log.info("测风塔回传数据查询sql:{}", cftsSql);
+
+        List<Map<String, Object>> list = jdbcTemplate.queryForList(cftsSql);
+        return list;
+    }
+
+    /**
+     * 查询风机信息:时间,设备编号,风速,风向
+     *
+     * @param startTime
+     * @param endTime
+     * @param equirpmentNo
+     * @return
+     */
+    public List<Map<String, Object>> getFjs(String startTime, String endTime, String equirpmentNo) {
+        String fjsSql = "SELECT C_TIME,C_EQUIPMENT_NO,C_WS,C_WD " +
+                "from t_wind_turbine_status_data where C_EQUIPMENT_NO='" + equirpmentNo + "' and C_TIME between '" + startTime + "'and '" + endTime + "'";
+        log.info("风机回传数据查询sql:{}", fjsSql);
+        List<Map<String, Object>> list = jdbcTemplate.queryForList(fjsSql);
+        return list;
+    }
+
+
+    public static Long changStrTimeToLongTime(String strTime) {
+        Long resultTime = -1L;
+        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+//设置要读取的时间字符串格式
+        try {
+            Date date = format.parse(strTime);
+            resultTime = date.getTime();
+        } catch (ParseException e) {
+            log.error("转换时间 {} 为Long格式出错:{}", strTime, e);
+        }
+        return resultTime;
+    }
+
+    /**
+     * 查询环境检测仪信息
+     *
+     * @param stationCode
+     * @return
+     */
+    public List<Map<String, Object>> getWeatherStations(String stationCode) {
+        String fjsSql = "SELECT C_ID,C_EQUIPMENT_NO,C_EQUIPMENT_TYPE " +
+                "from t_weather_station_info where C_STATION_CODE='" + stationCode + "' ";
+        log.info("环境检测仪设备信息查询sql:{}", fjsSql);
+        List<Map<String, Object>> list = jdbcTemplate.queryForList(fjsSql);
+        return list;
+    }
+
+    /**
+     * 查询测风塔信息
+     *
+     * @param stationCode
+     * @return
+     */
+    public List<Map<String, Object>> getWindTower(String stationCode) {
+        String fjsSql = "SELECT C_ID,C_EQUIPMENT_NO,C_EQUIPMENT_TYPE " +
+                "from t_wind_tower_info where C_STATION_CODE='" + stationCode + "' ";
+        log.info("测风塔设备信息查询sql:{}", fjsSql);
+        List<Map<String, Object>> list = jdbcTemplate.queryForList(fjsSql);
+        return list;
+    }
+
+    /**
+     * 查询风机信息
+     *
+     * @param stationCode
+     * @return
+     */
+    public List<Map<String, Object>> getWindTurbine(String stationCode) {
+        String fjsSql = "SELECT C_ID,C_EQUIPMENT_NO,C_EQUIPMENT_TYPE " +
+                "from t_wind_turbine_info where C_STATION_CODE='" + stationCode + "' ";
+        log.info("风机设备信息查询sql:{}", fjsSql);
+        List<Map<String, Object>> list = jdbcTemplate.queryForList(fjsSql);
+        return list;
+    }
+}

+ 313 - 0
ipfcst-client/src/main/java/com/jiayue/client/service/SendDataService.java

@@ -0,0 +1,313 @@
+package com.jiayue.client.service;
+
+import cn.hutool.core.convert.Convert;
+import cn.hutool.http.HttpUtil;
+import cn.hutool.json.JSONUtil;
+import com.jiayue.client.util.MD5Util;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Repository;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Repository
+@Slf4j
+public class SendDataService {
+    @Autowired
+    public QueryDataService queryDataService;
+    //青海回传数据通用签名key
+    private final static String qinghaiKey = "Syjy*3377";
+
+    /**
+     * 向数据中心
+     *
+     * @param startTime
+     * @param endTime
+     * @param flag
+     */
+    public void send(String startTime, String endTime, String flag) {
+        try {
+            List<Map<String, Object>> stations = queryDataService.getStations();
+            for (Map<String, Object> station : stations) {
+                String stationCode = Convert.toStr(station.get("C_STATION_CODE"));
+
+                if ("".equals(flag) || "all".equals(flag)) {
+                    sendAll(startTime, endTime, stationCode);
+                } else if ("rp".equals(flag)) {
+                    //1.回传实际功率数据
+                    sendRp(startTime, endTime, stationCode);
+                } else if ("dq".equals(flag)) {
+                    //2.回传短期数据
+                    sendDq(startTime, endTime, stationCode);
+                } else if ("cdq".equals(flag)) {
+                    //3.回传超短期数据
+                    sendCdq(startTime, endTime, stationCode);
+                } else if ("qxz".equals(flag)) {
+                    //4.回传环境检测仪数据
+                    sendHj(startTime, endTime, stationCode);
+                } else if ("cft".equals(flag)) {
+                    //5.回传测风塔数据
+                    sendCft(startTime, endTime, stationCode);
+                } else if ("fj".equals(flag)) {
+                    //6.回传风机数据
+                    sendFj(startTime, endTime, stationCode);
+                }
+
+            }
+
+
+        } catch (Exception e) {
+            log.error("回传青海集中功率预测数据给数据中心失败:{}", e);
+            //TODO 添加微信警告提醒
+        }
+    }
+
+
+    private void sendAll(String startTime, String endTime, String stationCode) {
+        //1.回传实际功率数据
+        sendRp(startTime, endTime, stationCode);
+
+        //2.回传短期数据
+        sendDq(startTime, endTime, stationCode);
+
+        //3.回传超短期数据
+        sendCdq(startTime, endTime, stationCode);
+
+        //4.回传环境检测仪数据
+        sendHj(startTime, endTime, stationCode);
+
+        //5.回传测风塔数据
+        sendCft(startTime, endTime, stationCode);
+
+        //6.回传风机数据
+        sendFj(startTime, endTime, stationCode);
+    }
+
+    /**
+     * 回传实际功率数据
+     *
+     * @param startTime
+     * @param endTime
+     * @param stationCode
+     */
+    private void sendRp(String startTime, String endTime, String stationCode) {
+
+        try {
+            List<Map<String, Object>> rps = queryDataService.getRps(startTime, endTime, stationCode);
+
+            List<Map<String, Object>> valueList = new ArrayList<>();
+            for (Map<String, Object> powerStationStatusData : rps) {
+                Map<String, Object> valueMap = new HashMap<>();
+                valueMap.put("time", powerStationStatusData.get("C_TIME"));
+                valueMap.put("stationCode", powerStationStatusData.get("C_STATION_CODE"));
+                valueMap.put("value", powerStationStatusData.get("C_REAL_VALUE"));
+                valueList.add(valueMap);
+            }
+
+            if (valueList.size() > 0) {
+                createReqAndSend("rp", JSONUtil.toJsonStr(valueList));
+            }
+
+        } catch (Exception e) {
+            log.error("向数据中心发送短期数据出现错误:{}", e);
+            //TODO 微信警告
+        }
+    }
+
+
+    /**
+     * 向数据中心发送短期数据
+     *
+     * @param startTime
+     * @param endTime
+     * @param stationCode
+     * @return
+     */
+    private void sendDq(String startTime, String endTime, String stationCode) {
+        try {
+            List<Map<String, Object>> dqs = queryDataService.getDqs(startTime, endTime, stationCode);
+            List<Map<String, Object>> valueList = new ArrayList<>();
+            for (Map<String, Object> forecastPowerUltraShortTermHis : dqs) {
+                Map<String, Object> valueMap = new HashMap<>();
+                valueMap.put("time", forecastPowerUltraShortTermHis.get("C_FORECAST_TIME"));
+                valueMap.put("value", forecastPowerUltraShortTermHis.get("C_ABLE_VALUE"));
+                valueMap.put("stationCode", forecastPowerUltraShortTermHis.get("C_STATION_CODE"));
+                valueList.add(valueMap);
+            }
+            if (valueList.size() > 0) {
+                createReqAndSend("dq", JSONUtil.toJsonStr(valueList));
+            }
+
+        } catch (Exception e) {
+            log.error("向数据中心发送短期数据出现错误:{}", e);
+            //TODO 微信警告
+        }
+    }
+
+
+    /**
+     * 超短期上报数据回传
+     *
+     * @param startTime
+     * @param endTime
+     * @param stationCode
+     */
+    private void sendCdq(String startTime, String endTime, String stationCode) {
+        try {
+            List<Map<String, Object>> cdqs = queryDataService.getCdqs(startTime, endTime, stationCode);
+            List<Map<String, Object>> valueList = new ArrayList<>();
+            for (Map<String, Object> forecastPowerShortTermHis : cdqs) {
+                Map<String, Object> valueMap = new HashMap<>();
+                valueMap.put("time", forecastPowerShortTermHis.get("C_FORECAST_TIME"));
+                valueMap.put("valueK", forecastPowerShortTermHis.get("C_ABLE_VALUE"));
+                valueMap.put("valueX", forecastPowerShortTermHis.get("C_ABLE_VALUE"));
+                valueMap.put("stationCode", forecastPowerShortTermHis.get("C_STATION_CODE"));
+                valueList.add(valueMap);
+            }
+            if (valueList.size() > 0) {
+                createReqAndSend("cdq", JSONUtil.toJsonStr(valueList));
+            }
+
+        } catch (Exception e) {
+            log.error("向数据中心发送短期数据出现错误:{}", e);
+            //TODO 微信警告
+        }
+    }
+
+    /**
+     * 回传环境检测仪数据
+     *
+     * @param startTime
+     * @param endTime
+     * @param stationCode
+     */
+    private void sendHj(String startTime, String endTime, String stationCode) {
+
+        List<Map<String, Object>> weatherStationInfos = queryDataService.getWeatherStations(stationCode);
+        List<Map<String, Object>> valueList = new ArrayList<>();
+
+        //遍历设备列表
+        for (Map<String, Object> weatherStationInfo : weatherStationInfos) {
+            //判断是否为检测仪设备
+            if (Convert.toStr(weatherStationInfo.get("C_EQUIPMENT_TYPE")).equals("1")) {
+                String equipmentNo = Convert.toStr(weatherStationInfo.get("C_EQUIPMENT_NO"));
+                //根据时间和设备号查询环境检测仪数据
+                List<Map<String, Object>> cdqs = queryDataService.getWeatherds(startTime, endTime, equipmentNo);
+                for (Map<String, Object> weatherStationStatusData : cdqs) {
+                    Map<String, Object> valueMap = new HashMap<>();
+                    valueMap.put("time", weatherStationStatusData.get("C_TIME"));
+                    valueMap.put("wsNo", equipmentNo);
+                    valueMap.put("stationCode", stationCode);
+                    valueMap.put("globalr", weatherStationStatusData.get("C_GLOBALR"));
+                    valueMap.put("airt", weatherStationStatusData.get("C_AIRT"));
+                    valueList.add(valueMap);
+                }
+            }
+        }
+        if (valueList.size() > 0) {
+            createReqAndSend("qxz", JSONUtil.toJsonStr(valueList));
+        }
+
+    }
+
+    /**
+     * 回传测风塔数据
+     * 轮毂风速,风向
+     *
+     * @param startTime
+     * @param endTime
+     * @param stationCode
+     */
+    private void sendCft(String startTime, String endTime, String stationCode) {
+
+        List<Map<String, Object>> windTowerInfos = queryDataService.getWindTower(stationCode);
+        List<Map<String, Object>> valueList = new ArrayList<>();
+
+        //遍历设备列表
+        for (Map<String, Object> windTowerInfo : windTowerInfos) {
+            //判断是否为测风塔设备
+            if (Convert.toStr(windTowerInfo.get("C_EQUIPMENT_TYPE")).equals("3")) {
+                String equipmentNo = Convert.toStr(windTowerInfo.get("C_EQUIPMENT_NO"));
+                //根据时间和设备号查询风速数据
+                List<Map<String, Object>> windTowerStatusDatas = queryDataService.getCfts(startTime, endTime, equipmentNo);
+                for (Map<String, Object> windTowerStatusData : windTowerStatusDatas) {
+                    Map<String, Object> valueMap = new HashMap<>();
+                    valueMap.put("time", windTowerStatusData.get("C_TIME"));
+                    valueMap.put("atNo", equipmentNo);
+                    valueMap.put("stationCode", stationCode);
+                    valueMap.put("speed", windTowerStatusData.get("C_WS_INST_HUB_HEIGHT"));
+                    valueMap.put("direction", windTowerStatusData.get("C_WD_INST_HUB_HEIGHT"));
+                    valueList.add(valueMap);
+                }
+            }
+        }
+        if (valueList.size() > 0) {
+            createReqAndSend("cft", JSONUtil.toJsonStr(valueList));
+        }
+
+    }
+
+    /**
+     * 回传风机数据
+     * 轮毂风速,风向
+     *
+     * @param startTime
+     * @param endTime
+     * @param stationCode
+     */
+    private void sendFj(String startTime, String endTime, String stationCode) {
+
+        List<Map<String, Object>> windTurbineInfos = queryDataService.getWindTurbine(stationCode);
+        List<Map<String, Object>> valueList = new ArrayList<>();
+
+        //遍历设备列表
+        for (Map<String, Object> windTurbineInfo : windTurbineInfos) {
+            //判断是否为测风塔设备
+            if (Convert.toStr(windTurbineInfo.get("C_EQUIPMENT_TYPE")).equals("4")) {
+                String equipmentNo = Convert.toStr(windTurbineInfo.get("C_EQUIPMENT_NO"));
+                //根据时间和设备号查询风速数据
+                List<Map<String, Object>> windTurbineDatas = queryDataService.getFjs(startTime, endTime, equipmentNo);
+                for (Map<String, Object> windTurbineData : windTurbineDatas) {
+                    Map<String, Object> valueMap = new HashMap<>();
+                    valueMap.put("time", windTurbineData.get("C_TIME"));
+                    valueMap.put("atNo", equipmentNo);
+                    valueMap.put("stationCode", stationCode);
+                    valueMap.put("speed", windTurbineData.get("C_WS"));
+                    valueMap.put("direction", windTurbineData.get("C_WD"));
+                    valueList.add(valueMap);
+                }
+            }
+        }
+        if (valueList.size() > 0) {
+            createReqAndSend("fj", JSONUtil.toJsonStr(valueList));
+        }
+    }
+
+    /**
+     * 创建报文并发送请求给数据中心
+     *
+     * @param dataType
+     * @param valueList
+     * @return
+     */
+    private void createReqAndSend(String dataType, String valueList) {
+        Map<String, Object> resultMap = new HashMap<>();
+        resultMap.put("type", dataType);
+        resultMap.put("body", valueList);
+        String sign = MD5Util.encode(valueList + qinghaiKey, "MD5");
+        resultMap.put("sign", sign);
+
+        String reqStr = JSONUtil.toJsonStr(resultMap);
+        log.info("回传数据给数据中心,请求报文:{}", reqStr);
+        String resp = HttpUtil.post("http://localhost:9001/qinghaiComeBackApi/datas", reqStr);
+        if (resp.length() > 0) {
+            if (!"0".equals(JSONUtil.parseObj(resp).get("code"))) {
+                new Exception("回传数据给数据中心错误:" + resp);
+            }
+        }
+        log.info("回传数据给数据中心,获得响应报文:{}", resp);
+    }
+}

+ 76 - 0
ipfcst-client/src/main/java/com/jiayue/client/util/MD5Util.java

@@ -0,0 +1,76 @@
+package com.jiayue.client.util;
+
+import java.security.MessageDigest;
+
+/**
+ * MD5 工具类-建议添油加醋的对入参 str 改造一下
+ *
+ * @author Administrator
+ */
+public class MD5Util {
+
+
+    //工具类不允许被实例化
+    private MD5Util() throws Exception {
+        throw new Exception("异常");
+    }
+
+    public static String encode(String str) {
+        MessageDigest md5 = null;
+        try {
+            md5 = MessageDigest.getInstance("MD5");
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+        char[] charArray = str.toCharArray();
+        byte[] byteArray = new byte[charArray.length];
+
+        for (int i = 0; i < charArray.length; i++) {
+            byteArray[i] = (byte) charArray[i];
+        }
+
+        byte[] md5Bytes = md5.digest(byteArray);
+        StringBuffer hexValue = new StringBuffer();
+        for (int i = 0; i < md5Bytes.length; i++) {
+            int val = ((int) md5Bytes[i]) & 0xff;
+            if (val < 16) {
+                hexValue.append("0");
+            }
+
+            hexValue.append(Integer.toHexString(val));
+        }
+        return hexValue.toString();
+    }
+
+    /**
+     * 字符串的MD5
+     *
+     * @param plainText  内容
+     * @param encryption 加密
+     * @return 加密结果
+     */
+    public static String encode(String plainText, String encryption) {
+        try {
+            MessageDigest md = MessageDigest.getInstance(encryption);
+            md.update(plainText.getBytes());
+            byte b[] = md.digest();
+
+            int i;
+
+            StringBuffer buf = new StringBuffer("");
+            for (int offset = 0; offset < b.length; offset++) {
+                i = b[offset];
+                if (i < 0)
+                    i += 256;
+                if (i < 16)
+                    buf.append("0");
+                buf.append(Integer.toHexString(i));
+            }
+            return buf.toString();
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return "";
+    }
+}

+ 58 - 0
ipfcst-client/src/main/resources/logback-spring.xml

@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+
+<configuration debug="false" scan="false">
+    <springProperty scop="context" name="spring.application.name" source="spring.application.name" defaultValue=""/>
+    <property name="log.path" value="./logs"/>
+    <!-- 彩色日志格式 -->
+    <property name="CONSOLE_LOG_PATTERN"
+              value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
+    <!-- 彩色日志依赖的渲染类 -->
+    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
+    <conversionRule conversionWord="wex"
+                    converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
+    <conversionRule conversionWord="wEx"
+                    converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
+    <!-- Console log output -->
+    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
+        </encoder>
+    </appender>
+
+    <!-- Log file debug output -->
+    <appender name="debug" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${log.path}/client.log</file>
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <fileNamePattern>${log.path}/%d{yyyy-MM, aux}/debug.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
+            <maxFileSize>50MB</maxFileSize>
+            <maxHistory>30</maxHistory>
+        </rollingPolicy>
+        <encoder>
+            <pattern>%date [%thread] %-5level [%logger{50}] %file:%line - %msg%n</pattern>
+        </encoder>
+    </appender>
+
+    <!-- Log file error output -->
+    <appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${log.path}/error.log</file>
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <fileNamePattern>${log.path}/%d{yyyy-MM}/error.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
+            <maxFileSize>50MB</maxFileSize>
+            <maxHistory>30</maxHistory>
+        </rollingPolicy>
+        <encoder>
+            <pattern>%date [%thread] %-5level [%logger{50}] %file:%line - %msg%n</pattern>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+            <level>ERROR</level>
+        </filter>
+    </appender>
+
+    <!-- Level: FATAL 0  ERROR 3  WARN 4  INFO 6  DEBUG 7 -->
+    <root level="debug">
+        <appender-ref ref="console"/>
+        <appender-ref ref="debug"/>
+        <appender-ref ref="error"/>
+    </root>
+</configuration>

+ 9 - 0
ipfcst-client/src/main/resources/static/component/code/css/style.css

@@ -0,0 +1,9 @@
+html,body{background-color: whitesmoke}
+.layui-fluid{margin-top: 15px;}
+.content{min-height: 796px;}
+.nav{text-align: center;}
+.nav button{margin-bottom: 3px;width: 100%;margin-top: 3px;margin-bottom: 3px;border-radius: 1px;}
+.nav button:hover{background-color: #5FB878;border: 1px solid #5FB878;color: white;}
+.layui-card-body .layui-btn+.layui-btn{margin-left: 0px;}
+.code-show{min-height: 454px;}
+.js-show{min-height: 200px;}

+ 81 - 0
ipfcst-client/src/main/resources/static/component/code/index.html

@@ -0,0 +1,81 @@
+<!doctype html>
+<html lang="en">
+	<head>
+		<meta charset="UTF-8">
+		<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
+		<meta http-equiv="X-UA-Compatible" content="ie=edge">
+		<title>layui表单生成器</title>
+		<link rel="stylesheet" href="../pear/css/pear.css">
+		<link rel="stylesheet" href="css/style.css">
+	</head>
+	<body>
+		<div class="layui-fluid">
+			<div class="layui-row layui-col-space10">
+				<div class="layui-col-md1">
+					<div class="layui-card nav click-but">
+						<div class="layui-card-header">长</div>
+						<div class="layui-card-body">
+							<button class="pear-btn pear-btn-sm" plain data-size="block" data-type="text">输入框</button>
+							<button class="pear-btn pear-btn-sm" plain data-size="block" data-type="password">密码框</button>
+							<button class="pear-btn pear-btn-sm" plain data-size="block" data-type="select">选择框</button>
+							<button class="pear-btn pear-btn-sm" plain data-size="block" data-type="checkbox_a">复选框</button>
+							<button class="pear-btn pear-btn-sm" plain data-size="block" data-type="checkbox_b">开关</button>
+							<button class="pear-btn pear-btn-sm" plain data-size="block" data-type="radio">单选框</button>
+							<button class="pear-btn pear-btn-sm" plain data-size="block" data-type="textarea">文本域</button>
+							<button class="pear-btn pear-btn-sm" plain data-size="block" data-type="submit">提交</button>
+						</div>
+					</div>
+					<div class="layui-card nav">
+						<div class="layui-card-header">短</div>
+						<div class="layui-card-body">
+							<button class="pear-btn pear-btn-sm" plain data-size="inline" data-type="text">输入框</button>
+							<button class="pear-btn pear-btn-sm" plain data-size="inline" data-type="password">密码框</button>
+							<button class="pear-btn pear-btn-sm" plain data-size="inline" data-type="select">选择框</button>
+							<button class="pear-btn pear-btn-sm" plain data-size="inline" data-type="checkbox_a">复选框</button>
+							<button class="pear-btn pear-btn-sm" plain data-size="inline" data-type="checkbox_b">开关</button>
+							<button class="pear-btn pear-btn-sm" plain data-size="inline" data-type="radio">单选框</button>
+							<button class="pear-btn pear-btn-sm" plain data-size="inline" data-type="textarea">文本域</button>
+							<button class="pear-btn pear-btn-sm" plain data-size="block" data-type="submit">提交</button>
+						</div>
+					</div>
+					<div class="layui-card nav">
+						<div class="layui-card-body">
+							<button class="pear-btn pear-btn-danger pear-btn-sm del-form" data-type="del"> <i class="layui-icon">&#xe640;</i></button>
+						</div>
+					</div>
+
+				</div>
+				<div class="layui-col-md5">
+					<div class="layui-card content">
+						<div class="layui-card-header">
+							view
+						</div>
+						<div class="layui-card-body code">
+							<form class="layui-form" action="" onsubmit="return false">
+							</form>
+						</div>
+					</div>
+				</div>
+				<div class="layui-col-md6">
+					<div class="layui-card r-code-html">
+						<div class="layui-card-header">html</div>
+						<div class="layui-card-body">
+							<textarea name="" class="layui-textarea code-show"></textarea>
+						</div>
+					</div>
+					<div class="layui-card r-code-js">
+						<div class="layui-card-header">code</div>
+						<div class="layui-card-body">
+							<textarea name="" class="layui-textarea js-show"></textarea>
+						</div>
+					</div>
+				</div>
+			</div>
+		</div>
+	</body>
+	<script type="text/javascript" src="../layui/layui.js"></script>
+	<script type="text/javascript" src="../pear/pear.js"></script>
+	<script>
+		layui.use('design');
+	</script>
+</html>

File diff ditekan karena terlalu besar
+ 574 - 0
ipfcst-client/src/main/resources/static/component/highlight/highlight.pack.js


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/highlight/styles/brown-papersq.png


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/highlight/styles/pojoaque.jpg


+ 96 - 0
ipfcst-client/src/main/resources/static/component/highlight/styles/purebasic.css

@@ -0,0 +1,96 @@
+/*
+
+PureBASIC native IDE style ( version 1.0 - April 2016 )
+
+by Tristano Ajmone <tajmone@gmail.com>
+
+Public Domain
+
+NOTE_1:	PureBASIC code syntax highlighting only applies the following classes:
+			.hljs-comment
+			.hljs-function
+			.hljs-keywords
+			.hljs-string
+			.hljs-symbol
+
+		Other classes are added here for the benefit of styling other languages with the look and feel of PureBASIC native IDE style.
+		If you need to customize a stylesheet for PureBASIC only, remove all non-relevant classes -- PureBASIC-related classes are followed by
+		a "--- used for PureBASIC ... ---" comment on same line.
+
+NOTE_2:	Color names provided in comments were derived using "Name that Color" online tool:
+			http://chir.ag/projects/name-that-color
+*/
+
+.hljs {
+	display: block;
+	overflow-x: auto;
+	padding: 0.5em;
+	background: #FFFFDF; /* Half and Half (approx.) */
+/* --- Uncomment to add PureBASIC native IDE styled font!
+	font-family: Consolas;
+*/
+}
+
+.hljs, /* --- used for PureBASIC base color --- */
+.hljs-type,  /* --- used for PureBASIC Procedures return type --- */
+.hljs-function, /* --- used for wrapping PureBASIC Procedures definitions --- */
+.hljs-name,
+.hljs-number,
+.hljs-attr,
+.hljs-params,
+.hljs-subst {
+	color: #000000; /* Black */
+}
+
+.hljs-comment, /* --- used for PureBASIC Comments --- */
+.hljs-regexp,
+.hljs-section,
+.hljs-selector-pseudo,
+.hljs-addition {
+	color: #00AAAA; /* Persian Green (approx.) */
+}
+
+.hljs-title, /* --- used for PureBASIC Procedures Names --- */
+.hljs-tag,
+.hljs-variable,
+.hljs-code  {
+	color: #006666; /* Blue Stone (approx.) */
+}
+
+.hljs-keyword, /* --- used for PureBASIC Keywords --- */
+.hljs-class,
+.hljs-meta-keyword,
+.hljs-selector-class,
+.hljs-built_in,
+.hljs-builtin-name {
+	color: #006666; /* Blue Stone (approx.) */
+	font-weight: bold;
+}
+
+.hljs-string, /* --- used for PureBASIC Strings --- */
+.hljs-selector-attr {
+	color: #0080FF; /* Azure Radiance (approx.) */
+}
+
+.hljs-symbol, /* --- used for PureBASIC Constants --- */
+.hljs-link,
+.hljs-deletion,
+.hljs-attribute {
+	color: #924B72; /* Cannon Pink (approx.) */
+}
+
+.hljs-meta,
+.hljs-literal,
+.hljs-selector-id {
+	color: #924B72; /* Cannon Pink (approx.) */
+	font-weight: bold;
+}
+
+.hljs-strong,
+.hljs-name {
+	font-weight: bold;
+}
+
+.hljs-emphasis {
+	font-style: italic;
+}

TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/highlight/styles/school-book.png


+ 68 - 0
ipfcst-client/src/main/resources/static/component/highlight/styles/vs.css

@@ -0,0 +1,68 @@
+/*
+
+Visual Studio-like style based on original C# coloring by Jason Diamond <jason@diamond.name>
+
+*/
+.hljs {
+  display: block;
+  overflow-x: auto;
+  padding: 0.5em;
+  background: white;
+  color: black;
+}
+
+.hljs-comment,
+.hljs-quote,
+.hljs-variable {
+  color: #008000;
+}
+
+.hljs-keyword,
+.hljs-selector-tag,
+.hljs-built_in,
+.hljs-name,
+.hljs-tag {
+  color: #00f;
+}
+
+.hljs-string,
+.hljs-title,
+.hljs-section,
+.hljs-attribute,
+.hljs-literal,
+.hljs-template-tag,
+.hljs-template-variable,
+.hljs-type,
+.hljs-addition {
+  color: #a31515;
+}
+
+.hljs-deletion,
+.hljs-selector-attr,
+.hljs-selector-pseudo,
+.hljs-meta {
+  color: #2b91af;
+}
+
+.hljs-doctag {
+  color: #808080;
+}
+
+.hljs-attr {
+  color: #f00;
+}
+
+.hljs-symbol,
+.hljs-bullet,
+.hljs-link {
+  color: #00b0e8;
+}
+
+
+.hljs-emphasis {
+  font-style: italic;
+}
+
+.hljs-strong {
+  font-weight: bold;
+}

+ 115 - 0
ipfcst-client/src/main/resources/static/component/highlight/styles/vs2015.css

@@ -0,0 +1,115 @@
+/*
+ * Visual Studio 2015 dark style
+ * Author: Nicolas LLOBERA <nllobera@gmail.com>
+ */
+
+.hljs {
+  display: block;
+  overflow-x: auto;
+  padding: 0.5em;
+  background: #1E1E1E;
+  color: #DCDCDC;
+}
+
+.hljs-keyword,
+.hljs-literal,
+.hljs-symbol,
+.hljs-name {
+  color: #569CD6;
+}
+.hljs-link {
+  color: #569CD6;
+  text-decoration: underline;
+}
+
+.hljs-built_in,
+.hljs-type {
+  color: #4EC9B0;
+}
+
+.hljs-number,
+.hljs-class {
+  color: #B8D7A3;
+}
+
+.hljs-string,
+.hljs-meta-string {
+  color: #D69D85;
+}
+
+.hljs-regexp,
+.hljs-template-tag {
+  color: #9A5334;
+}
+
+.hljs-subst,
+.hljs-function,
+.hljs-title,
+.hljs-params,
+.hljs-formula {
+  color: #DCDCDC;
+}
+
+.hljs-comment,
+.hljs-quote {
+  color: #57A64A;
+  font-style: italic;
+}
+
+.hljs-doctag {
+  color: #608B4E;
+}
+
+.hljs-meta,
+.hljs-meta-keyword,
+.hljs-tag {
+  color: #9B9B9B;
+}
+
+.hljs-variable,
+.hljs-template-variable {
+  color: #BD63C5;
+}
+
+.hljs-attr,
+.hljs-attribute,
+.hljs-builtin-name {
+  color: #9CDCFE;
+}
+
+.hljs-section {
+  color: gold;
+}
+
+.hljs-emphasis {
+  font-style: italic;
+}
+
+.hljs-strong {
+  font-weight: bold;
+}
+
+/*.hljs-code {
+  font-family:'Monospace';
+}*/
+
+.hljs-bullet,
+.hljs-selector-tag,
+.hljs-selector-id,
+.hljs-selector-class,
+.hljs-selector-attr,
+.hljs-selector-pseudo {
+  color: #D7BA7D;
+}
+
+.hljs-addition {
+  background-color: #144212;
+  display: inline-block;
+  width: 100%;
+}
+
+.hljs-deletion {
+  background-color: #600;
+  display: inline-block;
+  width: 100%;
+}

+ 104 - 0
ipfcst-client/src/main/resources/static/component/highlight/styles/xcode.css

@@ -0,0 +1,104 @@
+/*
+
+XCode style (c) Angel Garcia <angelgarcia.mail@gmail.com>
+
+*/
+
+.hljs {
+  display: block;
+  overflow-x: auto;
+  padding: 0.5em;
+  background: #fff;
+  color: black;
+}
+
+/* Gray DOCTYPE selectors like WebKit */
+.xml .hljs-meta {
+  color: #c0c0c0;
+}
+
+.hljs-comment,
+.hljs-quote {
+  color: #007400;
+}
+
+.hljs-tag,
+.hljs-attribute,
+.hljs-keyword,
+.hljs-selector-tag,
+.hljs-literal,
+.hljs-name {
+  color: #aa0d91;
+}
+
+.hljs-variable,
+.hljs-template-variable {
+  color: #3F6E74;
+}
+
+.hljs-code,
+.hljs-string,
+.hljs-meta-string {
+  color: #c41a16;
+}
+
+.hljs-regexp,
+.hljs-link {
+  color: #0E0EFF;
+}
+
+.hljs-title,
+.hljs-symbol,
+.hljs-bullet,
+.hljs-number {
+  color: #1c00cf;
+}
+
+.hljs-section,
+.hljs-meta {
+  color: #643820;
+}
+
+
+.hljs-class .hljs-title,
+.hljs-type,
+.hljs-built_in,
+.hljs-builtin-name,
+.hljs-params {
+  color: #5c2699;
+}
+
+.hljs-attr {
+  color: #836C28;
+}
+
+.hljs-subst {
+  color: #000;
+}
+
+.hljs-formula {
+  background-color: #eee;
+  font-style: italic;
+}
+
+.hljs-addition {
+  background-color: #baeeba;
+}
+
+.hljs-deletion {
+  background-color: #ffc8bd;
+}
+
+.hljs-selector-id,
+.hljs-selector-class {
+  color: #9b703f;
+}
+
+.hljs-doctag,
+.hljs-strong {
+  font-weight: bold;
+}
+
+.hljs-emphasis {
+  font-style: italic;
+}

+ 92 - 0
ipfcst-client/src/main/resources/static/component/highlight/styles/xt256.css

@@ -0,0 +1,92 @@
+
+/*
+  xt256.css
+
+  Contact: initbar [at] protonmail [dot] ch
+         : github.com/initbar
+*/
+
+.hljs {
+  display: block;
+  overflow-x: auto;
+  color: #eaeaea;
+  background: #000;
+  padding: 0.5em;
+}
+
+.hljs-subst {
+  color: #eaeaea;
+}
+
+.hljs-emphasis {
+  font-style: italic;
+}
+
+.hljs-strong {
+  font-weight: bold;
+}
+
+.hljs-builtin-name,
+.hljs-type {
+  color: #eaeaea;
+}
+
+.hljs-params {
+  color: #da0000;
+}
+
+.hljs-literal,
+.hljs-number,
+.hljs-name {
+  color: #ff0000;
+  font-weight: bolder;
+}
+
+.hljs-comment {
+  color: #969896;
+}
+
+.hljs-selector-id,
+.hljs-quote {
+  color: #00ffff;
+}
+
+.hljs-template-variable,
+.hljs-variable,
+.hljs-title {
+  color: #00ffff;
+  font-weight: bold;
+}
+
+.hljs-selector-class,
+.hljs-keyword,
+.hljs-symbol {
+  color: #fff000;
+}
+
+.hljs-string,
+.hljs-bullet {
+  color: #00ff00;
+}
+
+.hljs-tag,
+.hljs-section {
+  color: #000fff;
+}
+
+.hljs-selector-tag {
+  color: #000fff;
+  font-weight: bold;
+}
+
+.hljs-attribute,
+.hljs-built_in,
+.hljs-regexp,
+.hljs-link {
+  color: #ff00ff;
+}
+
+.hljs-meta {
+  color: #fff;
+  font-weight: bolder;
+}

+ 80 - 0
ipfcst-client/src/main/resources/static/component/highlight/styles/zenburn.css

@@ -0,0 +1,80 @@
+/*
+
+Zenburn style from voldmar.ru (c) Vladimir Epifanov <voldmar@voldmar.ru>
+based on dark.css by Ivan Sagalaev
+
+*/
+
+.hljs {
+  display: block;
+  overflow-x: auto;
+  padding: 0.5em;
+  background: #3f3f3f;
+  color: #dcdcdc;
+}
+
+.hljs-keyword,
+.hljs-selector-tag,
+.hljs-tag {
+  color: #e3ceab;
+}
+
+.hljs-template-tag {
+  color: #dcdcdc;
+}
+
+.hljs-number {
+  color: #8cd0d3;
+}
+
+.hljs-variable,
+.hljs-template-variable,
+.hljs-attribute {
+  color: #efdcbc;
+}
+
+.hljs-literal {
+  color: #efefaf;
+}
+
+.hljs-subst {
+  color: #8f8f8f;
+}
+
+.hljs-title,
+.hljs-name,
+.hljs-selector-id,
+.hljs-selector-class,
+.hljs-section,
+.hljs-type {
+  color: #efef8f;
+}
+
+.hljs-symbol,
+.hljs-bullet,
+.hljs-link {
+  color: #dca3a3;
+}
+
+.hljs-deletion,
+.hljs-string,
+.hljs-built_in,
+.hljs-builtin-name {
+  color: #cc9393;
+}
+
+.hljs-addition,
+.hljs-comment,
+.hljs-quote,
+.hljs-meta {
+  color: #7f9f7f;
+}
+
+
+.hljs-emphasis {
+  font-style: italic;
+}
+
+.hljs-strong {
+  font-weight: bold;
+}

File diff ditekan karena terlalu besar
+ 1 - 0
ipfcst-client/src/main/resources/static/component/jquery.min.js


File diff ditekan karena terlalu besar
+ 1 - 0
ipfcst-client/src/main/resources/static/component/layui/css/layui.css


File diff ditekan karena terlalu besar
+ 1 - 0
ipfcst-client/src/main/resources/static/component/layui/css/layui.mobile.css


+ 2 - 0
ipfcst-client/src/main/resources/static/component/layui/css/modules/code.css

@@ -0,0 +1,2 @@
+/** layui-v2.5.6 MIT License By https://www.layui.com */
+ html #layuicss-skincodecss{display:none;position:absolute;width:1989px}.layui-code-h3,.layui-code-view{position:relative;font-size:12px}.layui-code-view{display:block;margin:10px 0;padding:0;border:1px solid #e2e2e2;border-left-width:6px;background-color:#F2F2F2;color:#333;font-family:Courier New}.layui-code-h3{padding:0 10px;height:32px;line-height:32px;border-bottom:1px solid #e2e2e2}.layui-code-h3 a{position:absolute;right:10px;top:0;color:#999}.layui-code-view .layui-code-ol{position:relative;overflow:auto}.layui-code-view .layui-code-ol li{position:relative;margin-left:45px;line-height:20px;padding:0 5px;border-left:1px solid #e2e2e2;list-style-type:decimal-leading-zero;*list-style-type:decimal;background-color:#fff}.layui-code-view pre{margin:0}.layui-code-notepad{border:1px solid #0C0C0C;border-left-color:#3F3F3F;background-color:#0C0C0C;color:#C2BE9E}.layui-code-notepad .layui-code-h3{border-bottom:none}.layui-code-notepad .layui-code-ol li{background-color:#3F3F3F;border-left:none}

File diff ditekan karena terlalu besar
+ 1 - 0
ipfcst-client/src/main/resources/static/component/layui/css/modules/laydate/default/laydate.css


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/css/modules/layer/default/icon-ext.png


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/css/modules/layer/default/icon.png


File diff ditekan karena terlalu besar
+ 1 - 0
ipfcst-client/src/main/resources/static/component/layui/css/modules/layer/default/layer.css


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/css/modules/layer/default/loading-0.gif


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/css/modules/layer/default/loading-1.gif


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/css/modules/layer/default/loading-2.gif


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/font/iconfont.eot


File diff ditekan karena terlalu besar
+ 25 - 0
ipfcst-client/src/main/resources/static/component/layui/font/iconfont.svg


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/font/iconfont.ttf


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/font/iconfont.woff


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/font/iconfont.woff2


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/images/face/0.gif


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/images/face/1.gif


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/images/face/10.gif


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/images/face/11.gif


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/images/face/12.gif


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/images/face/13.gif


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/images/face/14.gif


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/images/face/15.gif


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/images/face/16.gif


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/images/face/17.gif


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/images/face/18.gif


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/images/face/19.gif


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/images/face/2.gif


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/images/face/20.gif


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/images/face/21.gif


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/images/face/22.gif


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/images/face/23.gif


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/images/face/24.gif


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/images/face/25.gif


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/images/face/26.gif


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/images/face/27.gif


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/images/face/28.gif


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/images/face/29.gif


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/images/face/3.gif


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/images/face/30.gif


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/images/face/31.gif


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/images/face/32.gif


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/images/face/33.gif


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/images/face/34.gif


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/images/face/35.gif


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/images/face/36.gif


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/images/face/37.gif


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/images/face/38.gif


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/images/face/39.gif


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/images/face/4.gif


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/images/face/40.gif


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/images/face/41.gif


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/images/face/42.gif


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/images/face/43.gif


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/images/face/44.gif


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/images/face/45.gif


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/images/face/46.gif


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/images/face/47.gif


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/images/face/48.gif


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/images/face/49.gif


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/images/face/5.gif


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/images/face/50.gif


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/images/face/51.gif


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/images/face/52.gif


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/images/face/53.gif


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/images/face/54.gif


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/images/face/55.gif


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/images/face/56.gif


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/images/face/57.gif


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/images/face/58.gif


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/images/face/59.gif


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/images/face/6.gif


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/images/face/60.gif


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/images/face/61.gif


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/images/face/62.gif


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/images/face/63.gif


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/images/face/64.gif


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/images/face/65.gif


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/images/face/66.gif


TEMPAT SAMPAH
ipfcst-client/src/main/resources/static/component/layui/images/face/67.gif


Beberapa file tidak ditampilkan karena terlalu banyak file yang berubah dalam diff ini