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"; 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+"×tamp="+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+"×tamp="+timestamp+"&sign="+getSign(timestamp,secret), JSONObject.toJSONString(content),"application/json",false); } } 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){ //ä¿¡ä»»ææsslè¯ä¹¦åä¸»æº 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(); } } } 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; 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; } 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; } 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()); } 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; /** * ç«ç¹ä¿¡æ¯è¡¨Serviceå®ç° @@ -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(); //é头æ£å¸¸å车æ°é 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; } } } } 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("æä½æå");