浏览代码

新增华润一体化内网接口

zhangchenglong 2 年之前
父节点
当前提交
b1b8eac6d4
共有 23 个文件被更改,包括 1323 次插入2 次删除
  1. 19 0
      in-passback/pom.xml
  2. 125 0
      in-passback/src/main/java/com/jiayue/passback/constants/CommonStant.java
  3. 221 0
      in-passback/src/main/java/com/jiayue/passback/controller/InApiController.java
  4. 26 0
      in-passback/src/main/java/com/jiayue/passback/entity/AbstractForecastPower.java
  5. 8 2
      in-passback/src/main/java/com/jiayue/passback/entity/AbstractForecastPowerBase.java
  6. 18 0
      in-passback/src/main/java/com/jiayue/passback/entity/ForecastPowerShortTerm.java
  7. 31 0
      in-passback/src/main/java/com/jiayue/passback/entity/ForecastPowerUltraShortTerm.java
  8. 46 0
      in-passback/src/main/java/com/jiayue/passback/entity/SysParameter.java
  9. 40 0
      in-passback/src/main/java/com/jiayue/passback/entity/eunm/PredictionModelEnum.java
  10. 7 0
      in-passback/src/main/java/com/jiayue/passback/mapper/ForecastPowerShortTermMapper.java
  11. 7 0
      in-passback/src/main/java/com/jiayue/passback/mapper/ForecastPowerUltraShortTermMapper.java
  12. 7 0
      in-passback/src/main/java/com/jiayue/passback/mapper/SystemParameterMapper.java
  13. 1 0
      in-passback/src/main/java/com/jiayue/passback/service/ForecastPowerShortTermHisService.java
  14. 9 0
      in-passback/src/main/java/com/jiayue/passback/service/ForecastPowerShortTermService.java
  15. 8 0
      in-passback/src/main/java/com/jiayue/passback/service/ForecastPowerUltraShortTermService.java
  16. 48 0
      in-passback/src/main/java/com/jiayue/passback/service/InApiService.java
  17. 7 0
      in-passback/src/main/java/com/jiayue/passback/service/SystemParameterService.java
  18. 20 0
      in-passback/src/main/java/com/jiayue/passback/service/impl/ForecastPowerShortTermServiceImpl.java
  19. 20 0
      in-passback/src/main/java/com/jiayue/passback/service/impl/ForecastPowerUltraShortTermServiceImpl.java
  20. 450 0
      in-passback/src/main/java/com/jiayue/passback/service/impl/InApiServiceImpl.java
  21. 15 0
      in-passback/src/main/java/com/jiayue/passback/service/impl/SystemParameterServiceImpl.java
  22. 18 0
      in-passback/src/main/java/com/jiayue/passback/util/CacheUtil.java
  23. 172 0
      in-passback/src/main/java/com/jiayue/passback/util/JsonResultUtil.java

+ 19 - 0
in-passback/pom.xml

@@ -59,6 +59,25 @@
             <artifactId>lombok</artifactId>
             <version>1.18.22</version>
         </dependency>
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>5.8.10</version>
+            <scope>compile</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>net.jodah</groupId>
+            <artifactId>expiringmap</artifactId>
+            <version>0.5.8</version>
+        </dependency>
+
+        <dependency>
+            <groupId>io.jsonwebtoken</groupId>
+            <artifactId>jjwt</artifactId>
+            <version>0.9.0</version>
+            <scope>compile</scope>
+        </dependency>
 
     </dependencies>
 

+ 125 - 0
in-passback/src/main/java/com/jiayue/passback/constants/CommonStant.java

@@ -0,0 +1,125 @@
+package com.jiayue.passback.constants;
+
+/**
+ * 通用常量
+ *
+ * @author yh
+ * @version 1.0
+ * @since 2022/5/22 11:29
+ */
+public interface CommonStant {
+
+    /**
+     * 日志类型:下拉原始数据
+     */
+    String RECORD_TYPE_PULL_INIT = "PULL_INIT";
+
+    /**
+     * 日志类型:推送原始
+     */
+    String RECORD_TYPE_PUSH_INIT = "PUSH_INIT";
+
+    /**
+     * 日志类型:下拉修正数据
+     */
+    String RECORD_TYPE_PULL_CORRECT = "PULL_CORRECT";
+
+    /**
+     * 日志类型:下拉修正数据
+     */
+    String RECORD_TYPE_PUSH_CORRECT_TO_MIN_IO = "PUSH_CORRECT_TO_MIN_IO";
+
+    /**
+     * 日志类型:交互权限
+     */
+    String RECORD_TYPE_COM_PERMISSON = "COM_PERMISSON";
+
+    /**
+     * 换行
+     */
+    String LINE_CONSTANT = "\n";
+    /**
+     * 空格1
+     */
+    String SPACE1_CONSTANT = " ";
+    /**
+     * 空格2
+     */
+    String SPACE2_CONSTANT = "  ";
+    /**
+     * 空格3
+     */
+    String SPACE3_CONSTANT = "   ";
+    /**
+     * 空格4
+     */
+    String SPACE4_CONSTANT = "    ";
+
+    /**
+     * 冒号
+     */
+    String CHARACTER_COLON = ":";
+
+    /**
+     * 秒补0
+     */
+    String CHARACTER_TIME_ZERO = ":00";
+
+    /**
+     * 光伏
+     */
+    String ET_PHOTOVOLTAIC = "E1";
+
+    /**
+     * 风电
+     */
+    String ET_WIND = "E2";
+
+    /**
+     * 上午
+     */
+    String AM_DAY = "AM";
+    /**
+     * 下午
+     */
+    String PM_DAY = "PM";
+    /**
+     * 定时任务类型:公有
+     */
+    String JOB_TYPE_PUBLIC = "PUBLIC";
+    /**
+     * 定时任务类型:私有 (公司所有)
+     */
+    String JOB_TYPE_PRIVATE = "PRIVATE";
+
+    /**
+     * redis 中存放用于token验证的用户及密码
+     */
+    String REDIS_USERS = "integration:cloud:users";
+    /**
+     * redis 中存放用户的token
+     */
+    String REDIS_USER_TOKEN = "integration:cloud:userToken";
+
+    /**
+     * 请求的用户名
+     */
+    String REQUEST_USER_NAME = "requestUserName";
+
+    /**
+     * 请求的密码
+     */
+    String REQUEST_USER_PASS = "requestUserPass";
+
+    /**
+     * token
+     */
+    String TOKEN = "token";
+
+    /**
+     * 授权
+     */
+    String AUTHORIZATION = "Authorization";
+
+
+}

+ 221 - 0
in-passback/src/main/java/com/jiayue/passback/controller/InApiController.java

@@ -0,0 +1,221 @@
+package com.jiayue.passback.controller;
+
+import cn.hutool.json.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.jiayue.passback.constants.CommonStant;
+import com.jiayue.passback.entity.ElectricField;
+import com.jiayue.passback.mapper.ElectricFieldMapper;
+import com.jiayue.passback.service.InApiService;
+import com.jiayue.passback.util.CacheUtil;
+import com.jiayue.passback.util.JsonResultUtil;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+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 javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * 对外接口
+ * ApiController
+ *
+ * @author zcl
+ * @date 2023-03-24 15:48:48
+ */
+@RestController
+@RequiredArgsConstructor
+@Slf4j
+@RequestMapping("/pfserver")
+public class InApiController {
+    @Autowired
+    InApiService apiService;
+    @Resource
+    public ElectricFieldMapper electricFieldMapper;
+
+    /**
+     * 获取token
+     *
+     * @param request
+     * @return
+     */
+    @PostMapping("/token")
+    public JSONObject getToken(HttpServletRequest request) {
+        //校验授权信息并返回用户名及密码
+        JSONObject checkResult = checkAuthorization(request);
+        // 如果校验结果为失败
+        if (JsonResultUtil.Type.failure.value().equals(checkResult.get(JsonResultUtil.CODE_TAG))) {
+            log.info("获取用户信息失败");
+            return JsonResultUtil.failure();
+        }
+        // 根据用户名密码获取token
+        JSONObject result = apiService.getToken(checkResult.getJSONObject(JsonResultUtil.DATA_TAG));
+        return result;
+    }
+
+    /**
+     * 获取短期原始数据
+     *
+     * @param request
+     * @return
+     */
+    @PostMapping("/getShortWpfData")
+    public JSONObject getShortWpfData(HttpServletRequest request, @RequestBody JSONObject data) {
+        // 入参验证
+        JSONObject checkResult = checkRequest(request,data);
+        // 如果校验结果为失败
+        if (JsonResultUtil.Type.failure.value().equals(checkResult.get(JsonResultUtil.CODE_TAG))) {
+            return JsonResultUtil.failure();
+        }
+        // 返回短期数据json格式
+        JSONObject result = apiService.getShortWpfData(data);
+        return result;
+    }
+
+    /**
+     * 接收短期预测修正数据
+     *
+     * @param request
+     * @return
+     */
+    @PostMapping("/putShortWpfData")
+    public JSONObject putShortWpfData(HttpServletRequest request, @RequestBody JSONObject data) {
+        // 入参验证
+        JSONObject checkResult = checkRequest(request,data);
+        // 如果校验结果为失败
+        if (JsonResultUtil.Type.failure.value().equals(checkResult.get(JsonResultUtil.CODE_TAG))) {
+            return JsonResultUtil.failure();
+        }
+        JSONObject result = apiService.putShortWpfData(data);
+        // 返回短期数据json格式
+        return result;
+    }
+
+    /**
+     * 获取超短期原始数据
+     *
+     * @param request
+     * @return
+     */
+    @PostMapping("/getSShortWpfData")
+    public JSONObject getSShortWpfData(HttpServletRequest request, @RequestBody JSONObject data) {
+        //校验token
+        JSONObject checkResult = checkToken(request);
+        // 如果校验结果为失败
+        if (JsonResultUtil.Type.failure.value().equals(checkResult.get(JsonResultUtil.CODE_TAG))) {
+            return JsonResultUtil.failure();
+        }
+        // 返回超短期数据json格式
+        return apiService.getSShortWpfData(data);
+    }
+
+    /**
+     * 接收超短期预测修正数据
+     *
+     * @param request
+     * @return
+     */
+    @PostMapping("/putSShortWpfData")
+    public JSONObject putSShortWpfData(HttpServletRequest request, @RequestBody JSONObject data) {
+        //校验token
+        JSONObject checkResult = checkToken(request);
+        // 如果校验结果为失败
+        if (JsonResultUtil.Type.failure.value().equals(checkResult.get(JsonResultUtil.CODE_TAG))) {
+            return JsonResultUtil.failure();
+        }
+        // 返回短期数据json格式
+        return apiService.putSShortWpfData(data);
+    }
+
+    /**
+     * 校验授权信息并返回用户名密码
+     *
+     * @return
+     */
+    public JSONObject checkAuthorization(HttpServletRequest request) {
+        // 获取授权信息
+        String authorization = request.getHeader(CommonStant.AUTHORIZATION);
+        // 如果授权信息不存在,返回失败
+        if (authorization == null) {
+            return JsonResultUtil.failure();
+        }
+        // 将"用户名:密码"格式的数据拆分
+        String[] authorizationArr = authorization.split(CommonStant.CHARACTER_COLON);
+        // 如果根据冒号拆分后的数据长度小于2,则返回失败
+        if (authorizationArr.length < 2) {
+            return JsonResultUtil.failure();
+        }
+        // 放入用户信息
+        JSONObject userInfo = new JSONObject();
+        // 请求的用户名
+        userInfo.set(CommonStant.REQUEST_USER_NAME, authorizationArr[0]);
+        // 请求的密码
+        userInfo.set(CommonStant.REQUEST_USER_PASS, authorizationArr[1]);
+        return JsonResultUtil.success(userInfo);
+    }
+
+    /**
+     * 校验授权信息并返回用户名密码
+     *
+     * @return
+     */
+    public JSONObject checkToken(HttpServletRequest request) {
+        // 授权校验结果
+        JSONObject checkResult = checkAuthorization(request);
+        // 如果校验结果为失败
+        if (JsonResultUtil.Type.failure.value().equals(checkResult.get(JsonResultUtil.CODE_TAG))) {
+            return JsonResultUtil.failure();
+        }
+        // 如果授权格式校验成功,获取用户名和token
+        JSONObject userInfo = checkResult.getJSONObject(JsonResultUtil.DATA_TAG);
+        // 用户传入的token
+        String requestToken = userInfo.getStr(CommonStant.REQUEST_USER_PASS);
+        // 校验token
+        String requestUserName = userInfo.getStr(CommonStant.REQUEST_USER_NAME);
+        // redis中存的token
+        String token = CacheUtil.cacheMap.get(requestUserName);
+        // 如果token不同,校验失败
+        if (!requestToken.equals(token)) {
+            log.error("====================token验证失败====================");
+            return JsonResultUtil.failure();
+        }
+        return JsonResultUtil.success();
+    }
+
+    /**
+     * 入参校验
+     *
+     * @return
+     */
+    public JSONObject checkRequest(HttpServletRequest httpRequest,JSONObject requestJson) {
+        // 验证token
+        JSONObject tokenResult = checkToken(httpRequest);
+        if (JsonResultUtil.Type.failure.value().equals(tokenResult.get(JsonResultUtil.CODE_TAG))) {
+            return JsonResultUtil.failure();
+        }
+        // 如果入参为空
+        if (requestJson == null) {
+            log.info("接收到的数据为空");
+            return JsonResultUtil.failure();
+        }
+        // 获取场站id
+        String stationCode = requestJson.getStr("wfId");
+        // 如果场站id为空
+        if (stationCode == null || "".equals(stationCode)) {
+            log.info("场站id为空");
+            return JsonResultUtil.failure();
+        }
+        // 根据场站编号查询场站信息
+        QueryWrapper<ElectricField> wrapper = new QueryWrapper();
+        wrapper.eq("C_STATION_CODE",stationCode);
+        ElectricField electricField = electricFieldMapper.selectOne(wrapper);
+        // 如果场站信息为空
+        if (electricField == null) {
+            log.info("场站信息为空");
+            return JsonResultUtil.failure();
+        }
+        return JsonResultUtil.success();
+    }
+}

+ 26 - 0
in-passback/src/main/java/com/jiayue/passback/entity/AbstractForecastPower.java

@@ -0,0 +1,26 @@
+package com.jiayue.passback.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import java.math.BigDecimal;
+
+/**
+ * 实时预测功率抽象实体
+ *
+ * @author zzy
+ * @version 1.0
+ * @since 2019/11/28 16:04
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class AbstractForecastPower
+		extends AbstractForecastPowerBase {
+
+	/**
+	 * 预测功率(MW)
+	 */
+	@TableField("C_FP_VALUE")
+	private BigDecimal fpValue;
+
+}

+ 8 - 2
in-passback/src/main/java/com/jiayue/passback/entity/AbstractForecastPowerBase.java

@@ -1,7 +1,9 @@
 package com.jiayue.passback.entity;
 
+import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
+import com.jiayue.passback.entity.eunm.PredictionModelEnum;
 import lombok.Data;
 import java.io.Serializable;
 import java.util.Date;
@@ -18,7 +20,7 @@ public class AbstractForecastPowerBase implements Serializable {
 
     private static final long serialVersionUID = 1L;
 
-    @TableId("C_ID")
+    @TableId(value="C_ID",type = IdType.AUTO)
     private Integer id;
 
     /**
@@ -33,6 +35,10 @@ public class AbstractForecastPowerBase implements Serializable {
     @TableField("C_FORECAST_TIME")
     private Long forecastTime;
 
-
+    /**
+     * 预测模型
+     */
+    @TableField("C_PREDICTION_MODEL_ENUM")
+    private PredictionModelEnum predictionModelEnum;
 
 }

+ 18 - 0
in-passback/src/main/java/com/jiayue/passback/entity/ForecastPowerShortTerm.java

@@ -0,0 +1,18 @@
+package com.jiayue.passback.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 短期预测功率实体
+ *
+ * @author zzy
+ * @version 1.0
+ * @since 2018/10/23 9:17
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+@TableName("t_forecast_power_short_term")
+public class ForecastPowerShortTerm extends AbstractForecastPower {
+}

+ 31 - 0
in-passback/src/main/java/com/jiayue/passback/entity/ForecastPowerUltraShortTerm.java

@@ -0,0 +1,31 @@
+package com.jiayue.passback.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import java.math.BigDecimal;
+
+/**
+ * 超短期预测功率实体
+ *
+ * @author zzy
+ * @version 1.0
+ * @since 2019/8/1 10:56
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+@TableName("t_forecast_power_ultra_short_term")
+public class ForecastPowerUltraShortTerm extends AbstractForecastPower {
+    /**
+     * 由差值计算出来的超短期(MW)
+     */
+    @TableField("C_DIFFERENCE_VALUE")
+    private BigDecimal DifferenceValue;
+
+    /**
+     * 由短期*系数计算出来的超短期(MW)
+     */
+    @TableField("C_COEFFICIENT_VALUE")
+    private BigDecimal CoefficientValue;
+}

+ 46 - 0
in-passback/src/main/java/com/jiayue/passback/entity/SysParameter.java

@@ -0,0 +1,46 @@
+package com.jiayue.passback.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+/**
+ * 参数实体
+ *
+ * @author zcl
+ * @version 1.0
+ * @since 2023/04/10 11:29
+ */
+@Data
+@TableName("t_sys_parameter")
+public class SysParameter extends AbstractBaseEntity {
+
+    @TableId("C_ID")
+    private Integer id;
+
+    /**
+     * 参数标识
+     */
+    @TableField("C_SYS_KEY")
+    private String sysKey;
+
+    /**
+     * 参数值
+     */
+    @TableField("C_SYS_VALUE")
+    private String sysValue;
+
+    /**
+     * 参数描述
+     */
+    @TableField("C_DESCRIBE")
+    private String describes;
+
+    /**
+     * 场站标识
+     */
+    @TableField("C_STATION_CODE")
+    private String stationCode;
+
+}

+ 40 - 0
in-passback/src/main/java/com/jiayue/passback/entity/eunm/PredictionModelEnum.java

@@ -0,0 +1,40 @@
+package com.jiayue.passback.entity.eunm;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 预测模型枚举
+ *
+ * @author zzy
+ * @version 1.0
+ * @since 2019/9/27 9:39
+ */
+@Getter
+@AllArgsConstructor
+public enum PredictionModelEnum {
+	// 云端预测结果
+	E1(1, "云端模型"),
+	// 本地物理模型
+	E2(2, "物理模型"),
+	// 本地统计模型
+	E3(3, "统计模型"),
+	// 本地补录数据
+	E4(4, "补录数据"),
+	// 本地差值模型
+	E5(5, "差值模型"),
+	// 人工干预模型
+	E6(6, "干预模型"),
+	// 上下限修正
+	E7(7, "上下限修正"),
+	// 更新短期
+	E8(8, "更新短期"),
+	// 短期乘系数
+	E9(9, "短期乘系数"),
+	// 人工干预系数
+	E10(10, "干预系数模型"),
+
+	E11(11,"一体化修正形");
+	private Integer code;
+	private String message;
+}

+ 7 - 0
in-passback/src/main/java/com/jiayue/passback/mapper/ForecastPowerShortTermMapper.java

@@ -0,0 +1,7 @@
+package com.jiayue.passback.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jiayue.passback.entity.ForecastPowerShortTerm;
+
+public interface ForecastPowerShortTermMapper extends BaseMapper<ForecastPowerShortTerm> {
+}

+ 7 - 0
in-passback/src/main/java/com/jiayue/passback/mapper/ForecastPowerUltraShortTermMapper.java

@@ -0,0 +1,7 @@
+package com.jiayue.passback.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jiayue.passback.entity.ForecastPowerUltraShortTerm;
+
+public interface ForecastPowerUltraShortTermMapper extends BaseMapper<ForecastPowerUltraShortTerm> {
+}

+ 7 - 0
in-passback/src/main/java/com/jiayue/passback/mapper/SystemParameterMapper.java

@@ -0,0 +1,7 @@
+package com.jiayue.passback.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jiayue.passback.entity.SysParameter;
+
+public interface SystemParameterMapper extends BaseMapper<SysParameter> {
+}

+ 1 - 0
in-passback/src/main/java/com/jiayue/passback/service/ForecastPowerShortTermHisService.java

@@ -4,4 +4,5 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.jiayue.passback.entity.ForecastPowerShortTermHis;
 
 public interface ForecastPowerShortTermHisService extends IService<ForecastPowerShortTermHis>,GenerateDataService {
+
 }

+ 9 - 0
in-passback/src/main/java/com/jiayue/passback/service/ForecastPowerShortTermService.java

@@ -0,0 +1,9 @@
+package com.jiayue.passback.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.jiayue.passback.entity.ForecastPowerShortTerm;
+import com.jiayue.passback.entity.ForecastPowerShortTermHis;
+
+public interface ForecastPowerShortTermService extends IService<ForecastPowerShortTerm> {
+
+}

+ 8 - 0
in-passback/src/main/java/com/jiayue/passback/service/ForecastPowerUltraShortTermService.java

@@ -0,0 +1,8 @@
+package com.jiayue.passback.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.jiayue.passback.entity.ForecastPowerUltraShortTerm;
+import com.jiayue.passback.entity.ForecastPowerUltraShortTermHis;
+
+public interface ForecastPowerUltraShortTermService extends IService<ForecastPowerUltraShortTerm> {
+}

+ 48 - 0
in-passback/src/main/java/com/jiayue/passback/service/InApiService.java

@@ -0,0 +1,48 @@
+package com.jiayue.passback.service;
+
+import cn.hutool.json.JSONObject;
+
+/**
+ * 预测数据业务接口
+ *
+ * @author yh
+ * @version 1.0
+ * @since 2022/5/22 11:29
+ */
+public interface InApiService {
+
+    /**
+     * 获取token
+     * @param userInfo
+     * @return
+     */
+    JSONObject getToken(JSONObject userInfo);
+
+    /**
+     * 获取短期原始json数据
+     * @param requestJson
+     * @return
+     */
+    JSONObject getShortWpfData(JSONObject requestJson);
+
+    /**
+     * 获取短期修正数据json
+     * @param requestJson
+     * @return
+     */
+    JSONObject putShortWpfData(JSONObject requestJson);
+
+    /**
+     * 获取超短期原始json数据
+     * @param requestJson
+     * @return
+     */
+    JSONObject getSShortWpfData(JSONObject requestJson);
+
+    /**
+     * 获取短期修正数据json
+     * @param requestJson
+     * @return
+     */
+    JSONObject putSShortWpfData(JSONObject requestJson);
+}

+ 7 - 0
in-passback/src/main/java/com/jiayue/passback/service/SystemParameterService.java

@@ -0,0 +1,7 @@
+package com.jiayue.passback.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.jiayue.passback.entity.SysParameter;
+
+public interface SystemParameterService extends IService<SysParameter> {
+}

+ 20 - 0
in-passback/src/main/java/com/jiayue/passback/service/impl/ForecastPowerShortTermServiceImpl.java

@@ -0,0 +1,20 @@
+package com.jiayue.passback.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jiayue.passback.entity.ForecastPowerShortTerm;
+import com.jiayue.passback.entity.ForecastPowerShortTermHis;
+import com.jiayue.passback.mapper.ForecastPowerShortTermHisMapper;
+import com.jiayue.passback.mapper.ForecastPowerShortTermMapper;
+import com.jiayue.passback.service.ForecastPowerShortTermHisService;
+import com.jiayue.passback.service.ForecastPowerShortTermService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Service
+@Slf4j
+public class ForecastPowerShortTermServiceImpl extends ServiceImpl<ForecastPowerShortTermMapper, ForecastPowerShortTerm> implements ForecastPowerShortTermService {
+
+}

+ 20 - 0
in-passback/src/main/java/com/jiayue/passback/service/impl/ForecastPowerUltraShortTermServiceImpl.java

@@ -0,0 +1,20 @@
+package com.jiayue.passback.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jiayue.passback.entity.ForecastPowerUltraShortTerm;
+import com.jiayue.passback.entity.ForecastPowerUltraShortTermHis;
+import com.jiayue.passback.mapper.ForecastPowerUltraShortTermHisMapper;
+import com.jiayue.passback.mapper.ForecastPowerUltraShortTermMapper;
+import com.jiayue.passback.service.ForecastPowerUltraShortTermHisService;
+import com.jiayue.passback.service.ForecastPowerUltraShortTermService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Service
+@Slf4j
+public class ForecastPowerUltraShortTermServiceImpl extends ServiceImpl<ForecastPowerUltraShortTermMapper, ForecastPowerUltraShortTerm> implements ForecastPowerUltraShortTermService {
+}

+ 450 - 0
in-passback/src/main/java/com/jiayue/passback/service/impl/InApiServiceImpl.java

@@ -0,0 +1,450 @@
+package com.jiayue.passback.service.impl;
+
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.json.JSONArray;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.jiayue.passback.constants.CommonStant;
+import com.jiayue.passback.entity.ForecastPowerShortTerm;
+import com.jiayue.passback.entity.ForecastPowerUltraShortTerm;
+import com.jiayue.passback.entity.SysParameter;
+import com.jiayue.passback.entity.eunm.PredictionModelEnum;
+import com.jiayue.passback.mapper.ForecastPowerShortTermMapper;
+import com.jiayue.passback.mapper.ForecastPowerUltraShortTermMapper;
+import com.jiayue.passback.mapper.SystemParameterMapper;
+import com.jiayue.passback.service.ForecastPowerShortTermService;
+import com.jiayue.passback.service.ForecastPowerUltraShortTermService;
+import com.jiayue.passback.service.InApiService;
+import com.jiayue.passback.util.CacheUtil;
+import com.jiayue.passback.util.JsonResultUtil;
+import io.jsonwebtoken.JwtBuilder;
+import io.jsonwebtoken.Jwts;
+import io.jsonwebtoken.SignatureAlgorithm;
+import lombok.extern.slf4j.Slf4j;
+import net.jodah.expiringmap.ExpirationPolicy;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.interceptor.TransactionAspectSupport;
+import org.springframework.util.DigestUtils;
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.ChronoUnit;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * 预测数据业务实现
+ *
+ * @author yh
+ * @version 1.0
+ * @since 2022/5/22 11:29
+ */
+@Slf4j
+@Service
+public class InApiServiceImpl implements InApiService {
+    @Resource
+    private SystemParameterMapper systemParameterMapper;
+    @Resource
+    private ForecastPowerShortTermMapper forecastPowerShortTermMapper;
+    @Resource
+    private ForecastPowerShortTermService forecastPowerShortTermService;
+    @Resource
+    private ForecastPowerUltraShortTermMapper forecastPowerUltraShortTermMapper;
+    @Resource
+    private ForecastPowerUltraShortTermService forecastPowerUltraShortTermService;
+
+    /**
+     * 获取token
+     *
+     * @param userInfo
+     * @return
+     */
+    @Override
+    public JSONObject getToken(JSONObject userInfo) {
+        CacheUtil.cacheMap.entrySet().forEach(entry ->log.info("==========user:" + entry.getKey() + "token" + entry.getValue()+"=========="));
+        JSONObject result;
+        //获取用户名密码
+        String requestUserName = userInfo.getStr(CommonStant.REQUEST_USER_NAME);
+        String requestUserPass = userInfo.getStr(CommonStant.REQUEST_USER_PASS);
+        // 设置参数
+        QueryWrapper<SysParameter> wrapper = new QueryWrapper();
+        wrapper.eq("C_SYS_KEY", "TOKEN_USER");
+        SysParameter systemParameter = systemParameterMapper.selectOne(wrapper);
+        if (systemParameter == null || systemParameter.getSysValue() == null || "".equals(systemParameter.getSysValue()) || systemParameter.getSysValue().split(CommonStant.CHARACTER_COLON).length != 2) {
+            log.error("系统参数TOKEN_USER不正常");
+            return JsonResultUtil.failure();
+        }
+        String tokenUser = systemParameter.getSysValue();
+        // 根据用户名获取密码
+        String userName = tokenUser.split(CommonStant.CHARACTER_COLON)[0];
+        String userPassWord = tokenUser.split(CommonStant.CHARACTER_COLON)[1];
+        // 加密后的密码
+        String passwordMD5t = DigestUtils.md5DigestAsHex(userPassWord.getBytes()).toUpperCase();
+        // 如果用户名或密码不匹配
+        if (!requestUserName.equals(userName) || !requestUserPass.equals(passwordMD5t)) {
+            log.error("账户密码不匹配");
+            return JsonResultUtil.failure();
+        }
+        // 根据用户名去缓存中获取token,如果token已存在,则返回token,如果token不存在,则创建新token并返回
+        // 根据用户名获取token
+        String token = CacheUtil.cacheMap.get(userName);
+
+        // 如果token不存在,则生成token
+        if (token == null || "".equals(token) || "null".equals(token)) {
+            // 生成token
+            JwtBuilder builder = Jwts.builder()
+                    .setSubject(requestUserName)
+                    //用于设置签发时间
+                    .setIssuedAt(new Date())
+                    //用于设置签名秘钥
+                    .signWith(SignatureAlgorithm.HS256, requestUserPass);
+            // 获取token
+            result = JsonResultUtil.success();
+            token = builder.compact();
+            result.set(CommonStant.TOKEN, token);
+            // 将生成的token放入缓存中
+            CacheUtil.cacheMap.put(userName, token, ExpirationPolicy.CREATED, 1440, TimeUnit.MINUTES);
+            CacheUtil.cacheMap.entrySet().forEach(entry ->log.info("==========user:" + entry.getKey() + "token" + entry.getValue()+"=========="));
+        } else {
+            // 将缓存中查到的token返回
+            result = JsonResultUtil.success();
+            result.set(CommonStant.TOKEN, token);
+        }
+        // 返回结果
+        return result;
+    }
+
+    /**
+     * 获取短期数据并返回json格式
+     *
+     * @param requestJson
+     * @return
+     */
+    @Override
+    public JSONObject getShortWpfData(JSONObject requestJson) {
+        // 获取场站id
+        String stationCode = requestJson.getStr("wfId");
+        // 获取明日短期预测数据
+        List<ForecastPowerShortTerm> shortList = getShortArr();
+        //解析短期文件
+        JSONObject result = fileAnalysis(stationCode, shortList, null, "dq", requestJson.getStr("beginDate"), requestJson.getStr("endDate"));
+        return result;
+    }
+
+    /**
+     * 接收修正短期数据
+     *
+     * @param requestJson
+     * @return
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public JSONObject putShortWpfData(JSONObject requestJson) {
+        // 功率json
+        JSONObject values = JSONUtil.parseObj(requestJson.getJSONArray("values").get(0));
+        if (values == null || values.getJSONArray("datas").size() == 0) {
+            return JsonResultUtil.failure();
+        }
+        // 明日修正后数据Arr
+        JSONArray datas = values.getJSONArray("datas");
+        // 将修正后的明日的一体化数据数据转化为List
+        List<ForecastPowerShortTerm> dqList = getDqListMap(datas);
+        if (dqList == null || dqList.size() == 0 || dqList.size() > 96) {
+            log.error("修正数据大于96条");
+            return JsonResultUtil.failure();
+        }
+        // 更新
+        updateShortTerm(dqList);
+        return JsonResultUtil.success();
+    }
+
+    /**
+     * 获取超短期文件并解析返回json格式
+     *
+     * @param requestJson
+     * @return
+     */
+    @Override
+    public JSONObject getSShortWpfData(JSONObject requestJson) {
+        String stationCode = requestJson.getStr("wfId");
+        List<ForecastPowerUltraShortTerm> ultraShortList = getUltraShortArr(requestJson.getStr("beginDate"), requestJson.getStr("endDate"));
+        //解析短期文件
+        JSONObject result = fileAnalysis(stationCode, null, ultraShortList, "cdq", requestJson.getStr("beginDate"), requestJson.getStr("endDate"));
+        return result;
+    }
+
+    /**
+     * 接收修正超短期数据
+     *
+     * @param requestJson
+     * @return
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public JSONObject putSShortWpfData(JSONObject requestJson) {
+        // 功率json
+        JSONObject values = JSONUtil.parseObj(requestJson.getJSONArray("values").get(0));
+        // 所有日期的数据Arr
+        JSONArray datas = values.getJSONArray("datas");
+        if (datas.size() == 0) {
+            return JsonResultUtil.failure();
+        }
+        // 将json数据转化为ListMap
+        List<ForecastPowerUltraShortTerm> cdqListMap = getCdqListMap(datas);
+        // 更新
+        updateUltraShortTerm(cdqListMap);
+        return JsonResultUtil.success();
+    }
+
+    /**
+     * 解析预测数据并返回规定格式的json
+     *
+     * @param startDate
+     * @param endDate
+     * @return
+     */
+    public JSONObject fileAnalysis(String stationCode, List<ForecastPowerShortTerm> shortList, List<ForecastPowerUltraShortTerm> ultraShortList, String type, String startDate, String endDate) {
+        JSONArray resultArr = new JSONArray();
+        boolean jx = true;
+        String compareDate = "";
+        // 获取短期文件生成日期
+        String recDate = DateTimeFormatter.ofPattern("yyyy-MM-dd").format(LocalDateTime.now());
+        // 获取当前时间
+        // 如果当前时间>=13点,则为pm(下午),否则为上午
+        LocalDateTime now = LocalDateTime.now();
+        int nowHour = now.getHour();
+        String version = "AM";
+        if (nowHour >= 13) {
+            version = "PM";
+        }
+        // 超短期起始时间
+        String cdqFileStartTime;
+        try {
+            // 日数据
+            JSONObject dayInfoJson = new JSONObject();
+            //一天中的96条数据信息
+            JSONArray valuesArr = new JSONArray();
+            JSONObject oneJson;
+            JSONArray datas = new JSONArray();
+            SimpleDateFormat sdfDate = new SimpleDateFormat("yyyy-MM-dd");
+            SimpleDateFormat sdfDateTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            // 如果是短期
+            if ("dq".equals(type)) {
+                for (int i = 0; i < shortList.size(); i++) {
+                    ForecastPowerShortTerm shortTerm = shortList.get(i);
+                    //当条的日期
+                    String thisDate = sdfDate.format(new Date(shortTerm.getForecastTime()));
+                    // 如果当条的日期和上调日期不一致,新建dayInfoJson(日数据json)
+                    if (!thisDate.equals(compareDate)) {
+                        // 如果不是第一条,且和上一条日期不是同一天,则将上条日期的96条数据放入日json数据
+                        if (!"".equals(compareDate)) {
+                            dayInfoJson.set("datas", datas);
+                            valuesArr.add(dayInfoJson);
+                            datas = new JSONArray();
+                        }
+                        // 将当条日期放入compareDate
+                        compareDate = thisDate;
+                        // 新建日json数据
+                        dayInfoJson = new JSONObject();
+                        dayInfoJson.set("version", version);
+                        dayInfoJson.set("date", thisDate);
+                        dayInfoJson.set("recDate", recDate);
+                    }
+                    // 每一条数据的json,放入预测数据和预测时间
+                    oneJson = new JSONObject();
+                    oneJson.set("data", shortTerm.getFpValue().multiply(new BigDecimal("1000")));
+                    oneJson.set("time", sdfDateTime.format(shortTerm.getForecastTime()));
+                    // 将一每条数据放入datas(一天的json)中
+                    datas.add(oneJson);
+                }
+                // 将最后一日数据放入valuesArr
+                dayInfoJson.set("datas", datas);
+                valuesArr.add(dayInfoJson);
+                // 将短期预测数据放入powerJson中
+                JSONObject powerJson = new JSONObject();
+                powerJson.set("values", valuesArr);
+                powerJson.set("wfId", stationCode);
+                powerJson.set("type", "power");
+                //返回短期数据JSONArray
+                resultArr.add(powerJson);
+            } else if ("cdq".equals(type)) {
+                if(ultraShortList==null || ultraShortList.size()==0){
+                    return JsonResultUtil.failure();
+                }
+                cdqFileStartTime = sdfDateTime.format(ultraShortList.get(0).getForecastTime());
+                datas = new JSONArray();
+                dayInfoJson = new JSONObject();
+                dayInfoJson.set("date", cdqFileStartTime);
+                for (int i = 0; i < ultraShortList.size(); i++) {
+                    ForecastPowerUltraShortTerm ultraShortTerm = ultraShortList.get(i);
+                    // 每一条数据的json,放入预测数据和预测时间
+                    oneJson = new JSONObject();
+                    oneJson.set("time", sdfDateTime.format(ultraShortTerm.getForecastTime()));
+                    oneJson.set("data", ultraShortTerm.getFpValue().multiply(new BigDecimal("1000")));
+                    // 将一每条数据放入datas(一天的json)中
+                    datas.add(oneJson);
+                }
+                // 将最后一日数据放入vaulesArr
+                dayInfoJson.set("datas", datas);
+                valuesArr.add(dayInfoJson);
+                // 将短期预测数据放入powerJson中
+                JSONObject powerJson = new JSONObject();
+                powerJson.set("wfId", stationCode);
+                powerJson.set("values", valuesArr);
+                powerJson.set("type", "power");
+                //返回短期数据JSONArray
+                resultArr.add(powerJson);
+            }
+        } catch (Exception e) {
+            log.error(stationCode + " 解析当天DQ文件错误:", e);
+            return JsonResultUtil.failure();
+        }
+        //如果解析成功
+        return JsonResultUtil.success(resultArr);
+
+    }
+
+    /**
+     * 将修正后的短期数据转为list
+     *
+     * @param dqDate
+     * @return
+     */
+    public List<ForecastPowerShortTerm> getDqListMap(JSONArray dqDate) {
+        // 短期预测数据
+        List<ForecastPowerShortTerm> shortTermList = new ArrayList<>();
+
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
+        Date now = new Date();
+        try {
+            // 循环短期数据
+            for (int i = 0; i < dqDate.size(); i++) {
+                JSONObject oneJson = dqDate.getJSONObject(i);
+                ForecastPowerShortTerm forecastPowerShortTerm = new ForecastPowerShortTerm();
+                // 初始化短期数据实体
+                forecastPowerShortTerm.setPredictionModelEnum(PredictionModelEnum.E11);
+                forecastPowerShortTerm.setForecastTime(sdf.parse(oneJson.getStr("time")).getTime());
+                forecastPowerShortTerm.setGenDate(now);
+                forecastPowerShortTerm.setFpValue(new BigDecimal(oneJson.getStr("data")).divide(new BigDecimal("1000"),2,BigDecimal.ROUND_HALF_UP));
+                shortTermList.add(forecastPowerShortTerm);
+            }
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        return shortTermList;
+    }
+
+    /**
+     * 将修正后的超短期数据转为list
+     *
+     * @param dqDate
+     * @return
+     */
+    public List<ForecastPowerUltraShortTerm> getCdqListMap(JSONArray dqDate) {
+        Date now = new Date();
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
+        List<ForecastPowerUltraShortTerm> ultraShortTermList = new ArrayList<>();
+        try {
+            for (int i = 0; i < dqDate.size(); i++) {
+                JSONObject oneJson = dqDate.getJSONObject(i);
+                ForecastPowerUltraShortTerm forecastPowerUltraShortTerm = new ForecastPowerUltraShortTerm();
+                // 初始化短期数据实体
+                forecastPowerUltraShortTerm.setGenDate(now);
+                forecastPowerUltraShortTerm.setForecastTime(sdf.parse(oneJson.getStr("time")).getTime());
+                forecastPowerUltraShortTerm.setFpValue(new BigDecimal(oneJson.getStr("data")).divide(new BigDecimal("1000"),2,BigDecimal.ROUND_HALF_UP));
+                forecastPowerUltraShortTerm.setPredictionModelEnum(PredictionModelEnum.E11);
+                ultraShortTermList.add(forecastPowerUltraShortTerm);
+            }
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        return ultraShortTermList;
+    }
+
+    /**
+     * 获取短期预测数据
+     *
+     * @return
+     */
+    public List<ForecastPowerShortTerm> getShortArr() {
+        // 获取短期预测数据
+        LambdaQueryWrapper<ForecastPowerShortTerm> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+        // 获取明天0点到23:59:59的预测数据
+        long startTime = DateUtil.beginOfDay(DateUtil.tomorrow()).getTime();
+        long endTime = DateUtil.endOfDay(DateUtil.tomorrow()).getTime();
+        lambdaQueryWrapper.between(ForecastPowerShortTerm::getForecastTime, startTime,endTime);
+        List<ForecastPowerShortTerm> shortList = forecastPowerShortTermMapper.selectList(lambdaQueryWrapper);
+        return shortList;
+    }
+
+    /**
+     * 根据开始时间和结束时间获取短期数据
+     *
+     * @param beginDate
+     * @param endDate
+     * @return
+     */
+    public List<ForecastPowerUltraShortTerm> getUltraShortArr(String beginDate, String endDate) {
+        // 获取短期预测数据
+        LambdaQueryWrapper<ForecastPowerUltraShortTerm> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
+        long beginDateL = 0;
+        long endDateL = 0;
+        try {
+            beginDateL = sdf.parse(beginDate).getTime();
+            endDateL = sdf.parse(endDate).getTime()-1;
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        // 获取明天日期
+        lambdaQueryWrapper.between(ForecastPowerUltraShortTerm::getForecastTime, beginDateL, endDateL);
+        List<ForecastPowerUltraShortTerm> ultraShortList = forecastPowerUltraShortTermMapper.selectList(lambdaQueryWrapper);
+        return ultraShortList;
+    }
+
+    /**
+     * 将修正后明日数据更新到短期实时表中
+     *
+     * @return
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public JSONObject updateShortTerm(List<ForecastPowerShortTerm> shortTermList) {
+        // 获取明天开始时间和结束时间
+        long startTime = DateUtil.beginOfDay(DateUtil.tomorrow()).getTime();
+        long endTime = DateUtil.endOfDay(DateUtil.tomorrow()).getTime();
+        // 根据开始时间和结束时间作为删除的查询条件
+        LambdaQueryWrapper<ForecastPowerShortTerm> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+        lambdaQueryWrapper.between(ForecastPowerShortTerm::getForecastTime, startTime,endTime);
+        // 删除明天的预测数据
+        forecastPowerShortTermMapper.delete(lambdaQueryWrapper);
+        // 保存明天的预测数据
+        forecastPowerShortTermService.saveBatch(shortTermList);
+        return JsonResultUtil.success();
+    }
+
+    /**
+     * 将修正后的超短期数据更新到超短期实时表中
+     *
+     * @return
+     */
+    @Transactional
+    public JSONObject updateUltraShortTerm(List<ForecastPowerUltraShortTerm> ultraShortTermList) {
+        LambdaQueryWrapper<ForecastPowerUltraShortTerm> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+        long startTimeL = ultraShortTermList.stream().mapToLong(ForecastPowerUltraShortTerm::getForecastTime).min().getAsLong();
+        long endTimeL = ultraShortTermList.stream().mapToLong(ForecastPowerUltraShortTerm::getForecastTime).max().getAsLong();
+        if(ultraShortTermList.size()>16){
+            log.info("====================超短期个数大于16====================");
+            return JsonResultUtil.failure();
+        }
+        lambdaQueryWrapper.between(ForecastPowerUltraShortTerm::getForecastTime, startTimeL, endTimeL);
+        forecastPowerUltraShortTermMapper.delete(lambdaQueryWrapper);
+        forecastPowerUltraShortTermService.saveBatch(ultraShortTermList);
+        return JsonResultUtil.success();
+    }
+}

+ 15 - 0
in-passback/src/main/java/com/jiayue/passback/service/impl/SystemParameterServiceImpl.java

@@ -0,0 +1,15 @@
+package com.jiayue.passback.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jiayue.passback.entity.ElectricField;
+import com.jiayue.passback.entity.SysParameter;
+import com.jiayue.passback.mapper.ElectricFieldMapper;
+import com.jiayue.passback.mapper.SystemParameterMapper;
+import com.jiayue.passback.service.ElectricFieldService;
+import com.jiayue.passback.service.SystemParameterService;
+import org.springframework.stereotype.Service;
+
+@Service
+public class SystemParameterServiceImpl extends ServiceImpl<SystemParameterMapper, SysParameter> implements SystemParameterService {
+
+}

+ 18 - 0
in-passback/src/main/java/com/jiayue/passback/util/CacheUtil.java

@@ -0,0 +1,18 @@
+package com.jiayue.passback.util;
+
+import net.jodah.expiringmap.ExpirationPolicy;
+import net.jodah.expiringmap.ExpiringMap;
+
+/**
+ * 缓存工具
+ *
+ * @author zcl
+ * @version 1.0
+ * @since 2023/4/10 16:22
+ */
+
+public class CacheUtil {
+    public static ExpiringMap<String, String> cacheMap = ExpiringMap.builder().variableExpiration()
+            .expirationPolicy(ExpirationPolicy.CREATED)
+            .build();
+}

+ 172 - 0
in-passback/src/main/java/com/jiayue/passback/util/JsonResultUtil.java

@@ -0,0 +1,172 @@
+package com.jiayue.passback.util;
+
+import cn.hutool.json.JSONObject;
+
+/**
+ * 返回json结果记录
+ *
+ * @author zcl
+ * @version 1.0
+ * @since 2023/3/28 16:22
+ */
+
+public class JsonResultUtil {
+
+    /** 状态码 */
+    public static final String CODE_TAG = "code";
+
+    /** 返回内容 */
+    public static final String MSG_TAG = "msg";
+
+    /** 数据对象 */
+    public static final String DATA_TAG = "data";
+
+    /**
+     * 状态类型
+     */
+    public enum Type
+    {
+        /** 成功 */
+        success("1","success"),
+        /** 忽略 */
+        ignore("666","ignore"),
+        /** 警告 */
+        warn("301","warn"),
+        /** 失败 */
+        failure("0","failure"),
+        /** 错误 */
+        error("-1","error");
+
+        private final String value;
+        private final String msg;
+
+        Type(String value , String msg)
+        {
+            this.value = value;
+            this.msg = msg;
+        }
+
+        public String value()
+        {
+            return this.value;
+        }
+
+        public String msg()
+        {
+            return this.msg;
+        }
+    }
+
+    /**
+     * 存入code和msg
+     *
+     * @param type 状态类型
+     */
+    public static JSONObject jsonResult(Type type)
+    {
+        JSONObject result = new JSONObject();
+        result.set(CODE_TAG,type.value);
+        result.set(MSG_TAG,type.msg);
+        return result;
+    }
+
+    /**
+     * 存入code、data
+     *
+     * @param type 状态类型
+     * @param data 数据对象
+     */
+    public static JSONObject jsonResult(Type type, Object data)
+    {
+        JSONObject result = new JSONObject();
+        result.set(CODE_TAG, type.value);
+        result.set(MSG_TAG, type.msg);
+        if (data != null) {
+            result.set(DATA_TAG, data);
+        }
+        return result;
+    }
+
+    /**
+     * 返回成功消息
+     *
+     * @return 成功消息
+     */
+    public static JSONObject success()
+    {
+        return success(null);
+    }
+
+    /**
+     * 返回成功数据
+     *
+     * @return 成功消息
+     */
+    public static JSONObject success(Object data)
+    {
+        return jsonResult(Type.success, data);
+    }
+
+    /**
+     * 返回警告消息
+     *
+     * @return 警告消息
+     */
+    public static JSONObject warn()
+    {
+        return warn(null);
+    }
+
+    /**
+     * 返回警告消息
+     *
+     * @param data 数据对象
+     * @return 警告消息
+     */
+    public static JSONObject warn(Object data)
+    {
+        return jsonResult(Type.warn, data);
+    }
+
+    /**
+     * 返回错误消息
+     *
+     * @return
+     */
+    public static JSONObject error()
+    {
+        return error(null);
+    }
+
+    /**
+     * 返回错误消息
+     *
+     * @param data 数据对象
+     * @return 警告消息
+     */
+    public static JSONObject error(Object data)
+    {
+        return jsonResult(Type.error,data);
+    }
+
+    /**
+     * 返回错误消息
+     *
+     * @return
+     */
+    public static JSONObject failure()
+    {
+        return failure(null);
+    }
+
+    /**
+     * 返回错误消息
+     *
+     * @param data 数据对象
+     * @return 警告消息
+     */
+    public static JSONObject failure(Object data)
+    {
+        return jsonResult(Type.failure,data);
+    }
+}