From 945a278393bef3adc650fba5bc050b82535d5f19 Mon Sep 17 00:00:00 2001
From: k94314517 <8417338+k94314517@user.noreply.gitee.com>
Date: 星期三, 11 十月 2023 10:31:15 +0800
Subject: [PATCH] 111

---
 server/services/src/main/java/com/doumee/service/business/impl/SitesServiceImpl.java      |   60 ++++++++++
 server/services/src/main/java/com/doumee/service/business/impl/BikeRepairServiceImpl.java |   12 +
 server/web/src/main/java/com/doumee/api/web/BusinessApi.java                              |    2 
 server/services/src/main/java/com/doumee/dao/business/web/request/RepairRequest.java      |    5 
 server/services/src/main/java/com/doumee/core/constants/Constants.java                    |   11 +
 server/services/src/main/java/com/doumee/service/business/SitesService.java               |    7 +
 server/services/src/main/java/com/doumee/core/dingding/DingDingNotice.java                |   80 +++++++++++++
 server/services/src/main/java/com/doumee/core/utils/HttpsUtil.java                        |  135 ++++++++++++++++++++++
 server/services/src/main/java/com/doumee/service/business/BikeRepairService.java          |    2 
 9 files changed, 310 insertions(+), 4 deletions(-)

diff --git a/server/services/src/main/java/com/doumee/core/constants/Constants.java b/server/services/src/main/java/com/doumee/core/constants/Constants.java
index 3f9acf4..ccee564 100644
--- a/server/services/src/main/java/com/doumee/core/constants/Constants.java
+++ b/server/services/src/main/java/com/doumee/core/constants/Constants.java
@@ -23,6 +23,7 @@
   public static final String FALSE = "f";
   public static final String TOKEN ="TOKEN" ;
     public static final String SYSTEM ="SYSTEM" ;
+    public static final String DINGDING ="DINGDING" ;
     public static final String MINI_PROGRAMME ="MINI_PROGRAMME" ;
     public static final String IMG_DIR = "IMG_DIR";
     public static final String FILE_DIR ="FILE_DIR" ;
@@ -109,6 +110,16 @@
         //灏忕▼搴忔瘡鏃ユ湇鍔$粨鏉熸椂闂�
         public static final String BUSINESS_ENDTIME = "BUSINESS_ENDTIME";
 
+        //閽夐拤閫氱煡鍦板潃
+        public static final String DINGDING_URL = "DINGDING_URL";
+        //閽夐拤绛惧悕
+        public static final String DINGDING_SECRET = "DINGDING_SECRET";
+
+        //灏忕▼搴忔弧杞介璀�(%)鏈�澶у��
+        public static final String WARN_MAX = "WARN_MAX";
+        //灏忕▼搴忔弧杞介璀�(%)鏈�灏忓��
+        public static final String WARN_MIN = "WARN_MIN";
+
 
         public static final String FILES_DIR = "FILES_DIR";
         public static final String SCRATCH_REDIRECT_URL = "SCRATCH_REDIRECT_URL";
diff --git a/server/services/src/main/java/com/doumee/core/dingding/DingDingNotice.java b/server/services/src/main/java/com/doumee/core/dingding/DingDingNotice.java
new file mode 100644
index 0000000..2eab145
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/core/dingding/DingDingNotice.java
@@ -0,0 +1,80 @@
+package com.doumee.core.dingding;
+
+import com.alibaba.fastjson.JSONObject;
+import com.doumee.core.constants.Constants;
+import com.doumee.core.utils.HttpsUtil;
+import com.doumee.dao.business.model.BikeRepair;
+import com.doumee.dao.business.web.request.RepairRequest;
+import org.apache.commons.codec.binary.Base64;
+
+import javax.crypto.Mac;
+import javax.crypto.spec.SecretKeySpec;
+import java.math.BigDecimal;
+import java.net.URLEncoder;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Created by IntelliJ IDEA.
+ *
+ * @Author : Rk
+ * @create 2022/12/7 11:16
+ */
+public class DingDingNotice {
+
+
+    /**
+     * 閽夐拤鏈哄櫒浜� 鍔犵
+     * @param timestamp
+     * @param secret
+     * @return
+     * @throws Exception
+     */
+    public static String getSign(Long timestamp, String secret)  throws Exception{
+        String stringToSign = timestamp + "\n" + secret;
+        Mac mac = Mac.getInstance("HmacSHA256");
+        mac.init(new SecretKeySpec(secret.getBytes("UTF-8"), "HmacSHA256"));
+        byte[] signData = mac.doFinal(stringToSign.getBytes("UTF-8"));
+        String sign = URLEncoder.encode(new String(Base64.encodeBase64(signData)),"UTF-8");
+        return sign;
+    }
+
+
+    /**
+     * 閽夐拤閫氱煡 - 杞﹁締寮傚父涓婃姤
+     * @param repairRequest
+     * @param ddUrl
+     * @throws Exception
+     */
+    public static void bikeRepair(RepairRequest repairRequest, String ddUrl , String secret)  throws Exception{
+        Long timestamp = System.currentTimeMillis();
+        Map<String,Object> content = new HashMap<>();
+        content.put("msgtype","text");
+        Map<String,String> text = new HashMap<>();
+        text.put("content","銆愭晠闅滀笂鎶ャ�戣溅杈嗙紪鍙凤細"+repairRequest.getBikeCode()+"锛屼綅缃細"+repairRequest.getAddr()+"锛岃仈绯荤數璇濓細"+repairRequest.getLinkphone()+"锛岃鍙婃椂鏌ョ湅澶勭悊銆�");
+        content.put("text",text);
+        HttpsUtil.post(ddUrl+"&timestamp="+timestamp+"&sign="+getSign(timestamp,secret), JSONObject.toJSONString(content),"application/json",false);
+    }
+
+
+    /**
+     * 閽夐拤閫氱煡 - 绔欑偣鍌ㄨ溅鍛婅
+     * @param siteName
+     * @param ddUrl
+     * @param secret
+     * @param type 0=瓒呭嚭 1=浣庝簬
+     * @param warnVal 鎶ヨ鍊�
+     * @throws Exception
+     */
+    public static void reservesNotice(String siteName, String ddUrl , String secret, Integer type, BigDecimal warnVal)  throws Exception{
+        Long timestamp = System.currentTimeMillis();
+        Map<String,Object> content = new HashMap<>();
+        content.put("msgtype","text");
+        Map<String,String> text = new HashMap<>();
+        //text.put("content","銆愮珯鐐瑰偍杞﹀憡璀︺��"+siteName+"锛屽偍杞﹂噺瓒呰繃80%/浣庝簬20%锛岃鍙婃椂杩涜杞﹁締璋冮厤");
+
+        text.put("content","銆愮珯鐐瑰偍杞﹀憡璀︺��"+siteName+"锛屽偍杞﹂噺"+(type.equals(Constants.ZERO)?"瓒呭嚭":"浣庝簬")+warnVal+"%锛岃鍙婃椂杩涜杞﹁締璋冮厤");
+        content.put("text",text);
+        HttpsUtil.post(ddUrl+"&timestamp="+timestamp+"&sign="+getSign(timestamp,secret), JSONObject.toJSONString(content),"application/json",false);
+    }
+}
diff --git a/server/services/src/main/java/com/doumee/core/utils/HttpsUtil.java b/server/services/src/main/java/com/doumee/core/utils/HttpsUtil.java
new file mode 100644
index 0000000..09bea1e
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/core/utils/HttpsUtil.java
@@ -0,0 +1,135 @@
+package com.doumee.core.utils;
+
+import javax.net.ssl.*;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URL;
+import java.security.KeyManagementException;
+import java.security.NoSuchAlgorithmException;
+import java.security.SecureRandom;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+
+public class HttpsUtil {
+
+    public static String get(String url,boolean ignoreSSL) {
+        return connection(url, "GET", null, null,ignoreSSL);
+    }
+
+    public static String post(String url, String data, String contentType, boolean ignoreSSL) {
+        return connection(url, "POST", data, contentType, ignoreSSL);
+    }
+
+    public static String connection(String url,String method,String data,String contentType,boolean ignoreSSL){
+        HttpsURLConnection connection = null;
+        try {
+            URL _url = new URL(url);
+            connection = (HttpsURLConnection) _url.openConnection();
+            connection.setRequestMethod(method);
+            connection.setDoOutput(true);
+            connection.setDoInput(true);
+            connection.setUseCaches(false);
+            if(contentType != null){
+                connection.setRequestProperty("Content-Type", contentType);
+            }
+
+            if(ignoreSSL){
+                //淇′换鎵�鏈塻sl璇佷功鍜屼富鏈�
+                TrustManager[] trustManagers = {new HttpsTrustManager()};
+                SSLContext context = SSLContext.getInstance("TLS");
+                context.init(null, trustManagers, new SecureRandom());
+                connection.setSSLSocketFactory(context.getSocketFactory());
+                connection.setHostnameVerifier(new HostnameVerifier() {
+                    @Override
+                    public boolean verify(String hostname, SSLSession session) {
+                        return true;
+                    }
+                });
+            }
+
+
+            connection.connect();
+
+            if(data != null){
+                OutputStream outputStream = connection.getOutputStream();
+                outputStream.write(data.getBytes("utf-8"));
+                outputStream.close();
+            }
+
+            int responseCode = connection.getResponseCode();
+            if (responseCode == HttpsURLConnection.HTTP_OK) {
+                InputStream is = connection.getInputStream();
+                byte[] b = new byte[4096];
+                ByteArrayOutputStream baos = new ByteArrayOutputStream(b.length);
+                int len;
+                while ((len = is.read(b)) != -1) {
+                    baos.write(b, 0, len);
+                }
+                is.close();
+                return baos.toString("utf-8");
+            }
+            return connection.getResponseMessage();
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if(connection != null){
+                connection.disconnect();
+            }
+        }
+        return null;
+    }
+
+
+    public static void main(String[] args) {
+        //灞�閮ㄤ俊浠绘墍鏈夎瘉涔﹀拰涓绘満
+        String result = HttpsUtil.get("https://127.0.0.1:8443/ssl-test/test01.do",true);
+        System.out.println(result);
+
+        //澶栭儴淇′换鎵�鏈夎瘉涔﹀拰涓绘満
+        HttpsTrustManager.allowAllSSL();
+        String response = HttpsUtil.get("https://127.0.0.1:8443/ssl-test/test01.do", false);
+        System.out.println(result);
+
+    }
+}
+
+class HttpsTrustManager implements X509TrustManager {
+
+    private static TrustManager[] trustManagers = {new HttpsTrustManager()};
+
+    @Override
+    public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
+        // TODO Auto-generated method stub
+
+    }
+
+    @Override
+    public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
+        // TODO Auto-generated method stub
+
+    }
+
+    @Override
+    public X509Certificate[] getAcceptedIssuers() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public static void allowAllSSL() {
+        try {
+            SSLContext context = SSLContext.getInstance("TLS");
+            context.init(null, trustManagers, new SecureRandom());
+            HttpsURLConnection.setDefaultSSLSocketFactory(context.getSocketFactory());
+            HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
+                @Override
+                public boolean verify(String hostname, SSLSession session) {
+                    return true;
+                }
+            });
+        } catch (NoSuchAlgorithmException | KeyManagementException e) {
+            e.printStackTrace();
+        }
+    }
+
+}
diff --git a/server/services/src/main/java/com/doumee/dao/business/web/request/RepairRequest.java b/server/services/src/main/java/com/doumee/dao/business/web/request/RepairRequest.java
index f76ba33..b62c6fb 100644
--- a/server/services/src/main/java/com/doumee/dao/business/web/request/RepairRequest.java
+++ b/server/services/src/main/java/com/doumee/dao/business/web/request/RepairRequest.java
@@ -19,9 +19,12 @@
 @ApiModel("鎶ヤ慨涓氬姟璇锋眰绫�")
 public class RepairRequest {
 
-    @ApiModelProperty(value = "杞﹁締缂栫爜")
+    @ApiModelProperty(value = "杞﹁締涓婚敭")
     private String binkeId;
 
+    @ApiModelProperty(value = "杞﹁締缂栫爜")
+    private String bikeCode;
+
     @ApiModelProperty(value = "缁忓害", example = "1")
     private BigDecimal longitude;
 
diff --git a/server/services/src/main/java/com/doumee/service/business/BikeRepairService.java b/server/services/src/main/java/com/doumee/service/business/BikeRepairService.java
index c5efe34..cab1ff4 100644
--- a/server/services/src/main/java/com/doumee/service/business/BikeRepairService.java
+++ b/server/services/src/main/java/com/doumee/service/business/BikeRepairService.java
@@ -107,5 +107,5 @@
      */
     long count(BikeRepair bikeRepair);
 
-    void saveRepair(RepairRequest repairRequest);
+    void saveRepair(RepairRequest repairRequest)  throws Exception;
 }
diff --git a/server/services/src/main/java/com/doumee/service/business/SitesService.java b/server/services/src/main/java/com/doumee/service/business/SitesService.java
index 6d6f7c9..52c1306 100644
--- a/server/services/src/main/java/com/doumee/service/business/SitesService.java
+++ b/server/services/src/main/java/com/doumee/service/business/SitesService.java
@@ -94,4 +94,11 @@
      * @return long
      */
     long count(Sites sites);
+
+    /**
+     * 绔欑偣棰勮
+     * @param siteId
+     * @throws Exception
+     */
+    void siteReservesNotice(String siteId) throws Exception;
 }
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/BikeRepairServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/BikeRepairServiceImpl.java
index e75b451..29cc504 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/BikeRepairServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/BikeRepairServiceImpl.java
@@ -2,7 +2,9 @@
 import com.doumee.biz.system.SystemDictDataBiz;
 import com.google.common.collect.Lists;
 
+import com.doumee.biz.system.SystemDictDataBiz;
 import com.doumee.core.constants.Constants;
+import com.doumee.core.dingding.DingDingNotice;
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
 import com.doumee.core.utils.Utils;
@@ -49,6 +51,9 @@
 
     @Autowired
     private MultifileMapper multifileMapper;
+
+    @Autowired
+    private SystemDictDataBiz systemDictDataBiz;
 
     @Override
     public String create(BikeRepair bikeRepair) {
@@ -179,7 +184,7 @@
 
 
     @Override
-    public void saveRepair(RepairRequest repairRequest){
+    public void saveRepair(RepairRequest repairRequest) throws Exception{
         BikeRepair bikeRepair = new BikeRepair();
         BeanUtils.copyProperties(repairRequest,bikeRepair);
         bikeRepair.setCreateDate(new Date());
@@ -200,6 +205,11 @@
                 multifileMapper.insert(multifile);
             }
         }
+        //鍙戦�侀拤閽夐�氱煡
+        DingDingNotice.bikeRepair(repairRequest,
+                systemDictDataBiz.queryByCode(Constants.DINGDING,Constants.DINGDING_URL).getCode(),
+                systemDictDataBiz.queryByCode(Constants.DINGDING,Constants.DINGDING_SECRET).getCode());
+
     }
 
 
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/SitesServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/SitesServiceImpl.java
index 24230ce..7e7b37e 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/SitesServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/SitesServiceImpl.java
@@ -1,5 +1,8 @@
 package com.doumee.service.business.impl;
 
+import com.doumee.biz.system.SystemDictDataBiz;
+import com.doumee.core.constants.Constants;
+import com.doumee.core.dingding.DingDingNotice;
 import com.doumee.core.constants.Constants;
 import com.doumee.core.constants.ResponseStatus;
 import com.doumee.core.exception.BusinessException;
@@ -7,20 +10,28 @@
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
 import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.LocksMapper;
 import com.doumee.dao.business.SitesMapper;
+import com.doumee.dao.business.model.Locks;
 import com.doumee.dao.business.model.Sites;
 import com.doumee.service.business.SitesService;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.checkerframework.checker.units.qual.C;
 import org.apache.shiro.SecurityUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
 
+import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
 
 /**
  * 绔欑偣淇℃伅琛⊿ervice瀹炵幇
@@ -32,6 +43,12 @@
 
     @Autowired
     private SitesMapper sitesMapper;
+
+    @Autowired
+    private LocksMapper locksMapper;
+
+    @Autowired
+    private SystemDictDataBiz systemDictDataBiz;
 
     @Override
     public String create(Sites sites) {
@@ -179,4 +196,47 @@
         QueryWrapper<Sites> wrapper = new QueryWrapper<>(sites);
         return sitesMapper.selectCount(wrapper);
     }
+
+    @Async
+    @Override
+    public void siteReservesNotice(String siteId) throws Exception{
+        //绔欑偣淇℃伅鏌ヨ
+        Sites sites = sitesMapper.selectById(siteId);
+        if(Objects.isNull(sites)){
+            return;
+        }
+        //鏌ヨ绔欑偣涓嬮攣澶存暟閲�
+        List<Locks> locksList = locksMapper.selectList(new QueryWrapper<Locks>().eq("status", Constants.ZERO).eq("site_id",siteId));
+        if(Objects.isNull(locksList)||locksList.size()==Constants.ZERO){
+            return;
+        }
+        //鑾峰彇绌洪攣澶存暟閲�
+        Integer empLocks =  locksList.stream().filter(l -> StringUtils.isEmpty(l.getBikeCode())).collect(Collectors.toList()).size();
+        //閿佸ご姝e父瀛樿溅鏁伴噺
+        Integer unEmpLocks = locksList.size() - empLocks;
+        BigDecimal warnMax = new BigDecimal(String.valueOf(systemDictDataBiz.queryByCode(Constants.MINI_PROGRAMME,Constants.WARN_MAX)));
+        BigDecimal warnMin = new BigDecimal(String.valueOf(systemDictDataBiz.queryByCode(Constants.MINI_PROGRAMME,Constants.WARN_MIN)));
+        //瓒呭嚭棰勮鏈�澶у��
+        if(empLocks>Constants.ZERO){
+            if(BigDecimal.valueOf(empLocks).divide(BigDecimal.valueOf(locksList.size())).multiply(BigDecimal.valueOf(100)).compareTo(warnMax)>Constants.ZERO){
+                DingDingNotice.reservesNotice(sites.getName(),
+                        systemDictDataBiz.queryByCode(Constants.DINGDING,Constants.DINGDING_URL).getCode(),
+                        systemDictDataBiz.queryByCode(Constants.DINGDING,Constants.DINGDING_SECRET).getCode(),
+                        Constants.ZERO,warnMax);
+                return;
+            };
+        }
+        //浣庝簬棰勮鏈�灏忓��
+        if(unEmpLocks>Constants.ZERO){
+            if(BigDecimal.valueOf(unEmpLocks).divide(BigDecimal.valueOf(locksList.size())).multiply(BigDecimal.valueOf(100)).compareTo(warnMin)<Constants.ZERO){
+                DingDingNotice.reservesNotice(sites.getName(),
+                        systemDictDataBiz.queryByCode(Constants.DINGDING,Constants.DINGDING_URL).getCode(),
+                        systemDictDataBiz.queryByCode(Constants.DINGDING,Constants.DINGDING_SECRET).getCode(),
+                        Constants.ONE,warnMin);
+                return;
+            }
+        }
+    }
+
+
 }
diff --git a/server/web/src/main/java/com/doumee/api/web/BusinessApi.java b/server/web/src/main/java/com/doumee/api/web/BusinessApi.java
index 0b481b2..f714118 100644
--- a/server/web/src/main/java/com/doumee/api/web/BusinessApi.java
+++ b/server/web/src/main/java/com/doumee/api/web/BusinessApi.java
@@ -135,7 +135,7 @@
     @ApiImplicitParams({
             @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true)
     })
-    public ApiResponse transactionsPage (@RequestBody RepairRequest repairRequest) {
+    public ApiResponse transactionsPage (@RequestBody RepairRequest repairRequest) throws Exception{
         repairRequest.setMemberId(getMemberId());
         bikeRepairService.saveRepair(repairRequest);
         return ApiResponse.success("鎿嶄綔鎴愬姛");

--
Gitblit v1.9.3