Browse Source

【功能迭代】义务计量大学接入校车

yjj 2 years ago
parent
commit
7d9cd70345

+ 1 - 0
health-code.iml

@@ -203,5 +203,6 @@
     <orderEntry type="library" name="Maven: cn.superfw:crypto-gmsm:1.0" level="project" />
     <orderEntry type="library" name="Maven: org.bouncycastle:bcprov-jdk15on:1.60" level="project" />
     <orderEntry type="library" name="Maven: org.bouncycastle:bcprov-ext-jdk15on:1.60" level="project" />
+    <orderEntry type="library" name="Maven: com.github.ben-manes.caffeine:caffeine:2.8.8" level="project" />
   </component>
 </module>

+ 6 - 0
pom.xml

@@ -214,6 +214,12 @@
             <artifactId>crypto-gmsm</artifactId>
             <version>1.0</version>
         </dependency>
+
+        <dependency>
+            <groupId>com.github.ben-manes.caffeine</groupId>
+            <artifactId>caffeine</artifactId>
+            <version>${caffeine.version}</version>
+        </dependency>
     </dependencies>
 
     <build>

+ 114 - 0
src/main/java/com/yixin/ms/boot/cache/DefaultCacheManager.java

@@ -0,0 +1,114 @@
+package com.yixin.ms.boot.cache;
+
+import com.github.benmanes.caffeine.cache.Cache;
+import com.github.benmanes.caffeine.cache.Caffeine;
+
+import java.util.Objects;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * <B>主类名称:</B>DefaultCacheManager<BR>
+ * <B>概要说明:</B>DefaultCacheManager<BR>
+ *
+ * @author lejingjing
+ * @since 2022年12月17日 上午12:02:47
+ */
+public class DefaultCacheManager {
+
+    private DefaultCacheManager() {
+    }
+
+    public static final String INTERNAL_SHCHOOL_CACHE = "INTERNAL_SHCHOOL_CACHE";
+
+    private final ConcurrentHashMap<String, Cache<String, ?>> cacheMap = new ConcurrentHashMap<>();
+
+    private static class SingletonHolder {
+        private static final DefaultCacheManager INSTANCE = new DefaultCacheManager();
+    }
+
+    public static DefaultCacheManager getInstance() {
+        return SingletonHolder.INSTANCE;
+    }
+
+    /**
+     * <B>方法名称:</B>create<BR>
+     * <B>概要说明:</B>根据一个全局的缓存ID 创建一个Caffeine缓存对象<BR>
+     *
+     * @param <V>
+     * @param cacheId
+     * @return
+     * @author lejingjing
+     * @since 2021年12月17日 上午12:09:29
+     */
+    @SuppressWarnings("unchecked")
+    public <V> Cache<String, V> create(String cacheId) {
+        Cache<String, V> cache = Caffeine.newBuilder().build();
+        cacheMap.put(cacheId, cache);
+        return (Cache<String, V>) cacheMap.get(cacheId);
+    }
+
+    /**
+     ** <B>方法名称:</B>get<BR>
+     *  <B>概要说明:</B><BR>
+     * @author lejingjing
+     * @since 2022年11月28日 18:01:36
+     * @param: cacheId
+     * @param: key
+     * @return: java.lang.Object
+     * @throws
+     */
+    public Object get(String cacheId, String key) {
+		Cache<String, Object> cache = (Cache)cacheMap.get(cacheId);
+		if(Objects.isNull(cache)){
+            return null;
+        }
+		return cache.getIfPresent(key);
+	}
+
+    /**
+     * <B>方法名称:</B>remove<BR>
+     * <B>概要说明:</B>根据cacheId 和对应的真正Caffeine缓存key 删除一个Caffeine缓存对象<BR>
+     *
+     * @param <V>
+     * @param cacheId
+     * @param key
+     * @author lejingjing
+     * @since 2021年12月17日 上午12:11:17
+     */
+    public <V> void remove(String cacheId, String key) {
+        @SuppressWarnings("unchecked")
+        Cache<String, V> cache = (Cache<String, V>) cacheMap.get(cacheId);
+        if (cache != null) {
+            cache.invalidate(key);
+        }
+    }
+
+    /**
+     * <B>方法名称:</B>remove<BR>
+     * <B>概要说明:</B>根据全局的缓存id 删除这个Caffeine缓存对象<BR>
+     *
+     * @param <V>
+     * @param cacheId
+     * @author lejingjing
+     * @since 2021年12月17日 上午12:12:08
+     */
+    public <V> void removeAll(String cacheId) {
+        @SuppressWarnings("unchecked")
+        Cache<String, V> cache = (Cache<String, V>) cacheMap.get(cacheId);
+        if (cache != null) {
+            cache.invalidateAll();
+        }
+    }
+
+    /**
+     * <B>方法名称:</B>cleanAll<BR>
+     * <B>概要说明:</B>清空所有的缓存<BR>
+     *
+     * @author lejingjing
+     * @since 2021年12月17日 上午12:13:13
+     */
+    public void cleanAll() {
+        cacheMap.values().forEach(cache -> cache.invalidateAll());
+    }
+
+}

+ 70 - 0
src/main/java/com/yixin/ms/boot/uitls/InternalBusUtils.java

@@ -0,0 +1,70 @@
+package com.yixin.ms.boot.uitls;
+
+import cn.hutool.http.HttpRequest;
+import cn.hutool.http.HttpResponse;
+import cn.hutool.http.HttpUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.yixin.ms.boot.cache.DefaultCacheManager;
+import com.yixin.ms.server.vo.JiliangCanPassVO;
+import org.springframework.stereotype.Component;
+
+/**
+ * <B>项目名称:</B>face-server<BR>
+ * <B>包名称:  </B>com.yx.face.boot.uitls<BR>
+ * <B>主类名称:</B>InternalCarUtils<BR>
+ * <B>概要说明:</B>InternalCarUtils<BR>
+ *
+ * @author ljj
+ * @since 2022年11月28日 18:15:16
+ */
+@Component
+public class InternalBusUtils {
+
+    public static final String ACCESS_KEY = "ACCESS_KEY";
+
+    public static final String TOKEN_URL = "https://test-api.teamcube.cn/teamcube-coop/app-platform/api/rest/api_token?appKey=SnNOJW1cx&appSecret=43f97444e459668c3e19e7bef47491873ba15477";
+
+    public static final String PUSH_URL = "https://test-api.teamcube.cn/teamcube-coop/app-platform/api/rest/update_op/zhgl/bcyy/scjyjk";
+
+    public static final Integer SUCCESS = 200;
+
+    public String getAccessKey(){
+        DefaultCacheManager defaultCacheManager = DefaultCacheManager.getInstance();
+        String value  = String.valueOf(defaultCacheManager.get(DefaultCacheManager.INTERNAL_SHCHOOL_CACHE,ACCESS_KEY));
+        if(value.equals("null")){
+            HttpRequest httpRequest = HttpUtil.createPost(TOKEN_URL);
+            HttpResponse httpResponse = httpRequest.execute();
+            JSONObject jsonObject = JSONObject.parseObject(httpResponse.body());
+            Integer code = jsonObject.getInteger("code");
+            value = String.valueOf(jsonObject.get("data"));
+            if(!code.equals(SUCCESS)){
+                return null;
+            }
+            if(value.equals("null")){
+                return null;
+            }
+            defaultCacheManager.create(DefaultCacheManager.INTERNAL_SHCHOOL_CACHE).put(ACCESS_KEY,value);
+        }
+        return value;
+    }
+
+    public JiliangCanPassVO checkPass(String accessKey, String sn, String idCard){
+        HttpRequest httpRequest = HttpUtil.createPost(PUSH_URL);
+        JSONObject data = new JSONObject();
+        data.put("rlsbsbbm",sn);
+        data.put("bcyyid","SFZ-".concat(idCard));
+        JSONObject param = new JSONObject();
+        param.put("data",data);
+        httpRequest.header("x-access-token",accessKey);
+        httpRequest.body(param.toJSONString());
+        HttpResponse httpResponse = httpRequest.execute();
+        JSONObject jsonObject = JSONObject.parseObject(httpResponse.body());
+        JiliangCanPassVO jiliangCanPassVO = null;
+        if(jsonObject.getInteger("code").equals(SUCCESS)){
+            jiliangCanPassVO = JSON.parseObject(String.valueOf(jsonObject.get("data")),JiliangCanPassVO.class);
+        }
+        return jiliangCanPassVO;
+    }
+
+}

+ 18 - 0
src/main/java/com/yixin/ms/server/JiliangUniversityServer.java

@@ -43,6 +43,9 @@ public class JiliangUniversityServer {
     @Value("${jiliang.canPassUrl}")
     private String canPassUrl;
 
+    @Value("${jiliang.checkIsSchoolBusUrl}")
+    private String checkIsSchoolBusUrl;
+
     /**
      * 请求密钥有效时间为 一天 12H
      *
@@ -102,4 +105,19 @@ public class JiliangUniversityServer {
 
         return resultVO.getData();
     }
+
+    public Boolean checkIsSchoolBus(String sn){
+        Boolean result = Boolean.FALSE;
+        try {
+            String body = HttpUtil.createGet(checkIsSchoolBusUrl.concat("?sn="+sn)).execute().body();
+            log.info("--->计量大学开放平台获取通过结果响应内容:{}", body);
+            JSONObject jsonObject = JSON.parseObject(body);
+            if (jsonObject.getInteger("code").equals(Integer.valueOf(RestCode.SUCCESS.getCode()))) {
+                result = jsonObject.getBoolean("data");
+            }
+        }catch (Exception e){
+            throw new ServiceException("学校开放接口服务异常,请联系工作人员");
+        }
+        return result;
+    }
 }

+ 11 - 0
src/main/java/com/yixin/ms/service/impl/HealthCodeServiceImpl.java

@@ -14,6 +14,7 @@ import com.yixin.ms.boot.restful.RestResponse;
 import com.yixin.ms.boot.restful.RestResult;
 import com.yixin.ms.boot.restful.ServiceException;
 import com.yixin.ms.boot.uitls.DESUtil;
+import com.yixin.ms.boot.uitls.InternalBusUtils;
 import com.yixin.ms.boot.uitls.OkHttpUtils;
 import com.yixin.ms.boot.uitls.RedisUtil;
 import com.yixin.ms.model.dto.HealthCodeDTO;
@@ -34,6 +35,7 @@ import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.Resource;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -50,6 +52,9 @@ public class HealthCodeServiceImpl implements HealthCodeService {
     @Autowired
     private HealthServer healthServer;
 
+    @Resource
+    private InternalBusUtils internalBusUtils;
+
     @Override
     public HealtCodeUserVO getShortTermCertificate(ShortTermDTO shortTermDTO) {
         HealtCodeUserVO shortTermUser = null;
@@ -125,6 +130,12 @@ public class HealthCodeServiceImpl implements HealthCodeService {
             shortTermDTO.setName(jiliangCanPassVO.getName());
         }
 
+        if(StrUtil.isNotBlank(shortTermDTO.getSn())&&StrUtil.isNotBlank(shortTermDTO.getIdNumber())
+                   &&jiliangUniversityServer.checkIsSchoolBus(shortTermDTO.getSn())){
+            String accessKey = internalBusUtils.getAccessKey();
+            jiliangCanPassVO = internalBusUtils.checkPass(accessKey,shortTermDTO.getSn(),shortTermDTO.getIdNumber());
+        }
+
         if (jiliangCanPassVO != null
                 && StrUtil.isNotEmpty(jiliangCanPassVO.getCanPass())
                 && jiliangCanPassVO.getCanPass().equals(CanPassEnum.NOT_THROUGH.getCode())) {

+ 2 - 1
src/main/resources/application-prod-48922.yml

@@ -122,6 +122,7 @@ health:
     savePlaceRecordUrl: https://172.16.100.42:8088/yx-fyzd/api/open/savePlaceRecord
     getTokenUrl: https://172.16.100.42:8088/yx-fyzd/api/open/getToken
     checkUserBlackListURL: http://172.16.100.42:8088/yx-fyzd/healthCode/checkUserBlackList
+
 #省共享IRS数据资源
 irs:
   appKey: A330104242107202107000001
@@ -154,4 +155,4 @@ jiliang:
   appSecret: 62efd908c142f4b2e2b2f0eca0c735a75ea9d4a0
   getTokenUrl: https://icampus.ldxk.edu.cn/teamcube-coop/app-platform/api/rest/api_token
   canPassUrl: https://icampus.ldxk.edu.cn/teamcube-coop/app-platform/api/rest/update_op/yqfkgl/xym/Dzjjk
-
+  checkIsSchoolBus: https://face.ldxk.edu.cn:8901/ywjl-fyzd/admin/face/checkIsSchoolBus

+ 3 - 1
src/main/resources/application-prod.yml

@@ -122,6 +122,8 @@ health:
     queryPlaceInfoBySnUrl: https://noise.hz-hanghui.com:8088/yx-fyzd/api/open/queryPlaceInfoBySn
     savePlaceRecordUrl: https://noise.hz-hanghui.com:8088/yx-fyzd/api/open/savePlaceRecord
 
+
+
 #省共享IRS数据资源
 irs:
   appKey: A330104242107202107000001
@@ -154,4 +156,4 @@ jiliang:
   appSecret: 62efd908c142f4b2e2b2f0eca0c735a75ea9d4a0
   getTokenUrl: https://icampus.ldxk.edu.cn/teamcube-coop/app-platform/api/rest/api_token
   canPassUrl: https://icampus.ldxk.edu.cn/teamcube-coop/app-platform/api/rest/update_op/yqfkgl/xym/Dzjjk
-
+  checkIsSchoolBusUrl: https://face.ldxk.edu.cn:8901/ywjl-fyzd/admin/face/checkIsSchoolBus

+ 2 - 1
src/main/resources/application-test.yml

@@ -121,6 +121,7 @@ health:
     queryPlaceInfoBySnUrl: http://127.0.0.1:9100/yx-fyzd/api/open/queryPlaceInfoBySn
     savePlaceRecordUrl: http://127.0.0.1:9100/yx-fyzd/api/open/savePlaceRecord
 
+
 #省共享IRS数据资源
 irs:
   appKey: A330104242107202107000001
@@ -164,4 +165,4 @@ jiliang:
   appSecret: 43f97444e459668c3e19e7bef47491873ba15477
   getTokenUrl: https://test-api.teamcube.cn/teamcube-coop/app-platform/api/rest/api_token
   canPassUrl: https://test-api.teamcube.cn/teamcube-coop/app-platform/api/rest/update_op/yqfkgl/xym/Dzjjk
-
+  checkIsSchoolBus: https://face.ldxk.edu.cn:8901/ywjl-fyzd/admin/face/checkIsSchoolBus