111
k94314517
2023-10-11 945a278393bef3adc650fba5bc050b82535d5f19
111
已添加2个文件
已修改7个文件
314 ■■■■■ 文件已修改
server/services/src/main/java/com/doumee/core/constants/Constants.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/dingding/DingDingNotice.java 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/utils/HttpsUtil.java 135 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/business/web/request/RepairRequest.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/BikeRepairService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/SitesService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/BikeRepairServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/SitesServiceImpl.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/web/src/main/java/com/doumee/api/web/BusinessApi.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
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+"&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);
    }
}
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("操作成功");