liulin
6 天以前 bcf8c46e009d5d825a7bf07b9eac46fb7432418b
src/main/java/com/fengdu/gas/service/TestInfoService.java
@@ -1,5 +1,6 @@
package com.fengdu.gas.service;
import com.fengdu.gas.entity.request.test.TestPayVO;
import com.fengdu.gas.repository.po.TestInfoPO;
import com.fengdu.gas.service.convert.TestInfoConvert;
import com.fengdu.gas.common.ExecutedResult;
@@ -15,10 +16,30 @@
import com.fengdu.gas.entity.search.SearchTestInfo;
import com.fengdu.gas.repository.impl.TestInfoMapperImpl;
import com.fengdu.gas.repository.vo.TestInfoVO;
import com.google.gson.Gson;
import org.apache.commons.lang3.BooleanUtils;
import org.apache.http.HttpStatus;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.KeyStore;
import java.security.NoSuchAlgorithmException;
import java.security.Signature;
import java.security.interfaces.RSAPrivateCrtKey;
import java.util.*;
import java.util.stream.Collectors;
@@ -29,222 +50,104 @@
public class TestInfoService extends BaseService {
    @Autowired
    private TestInfoMapperImpl mapper;
    //私钥
   private final static String PRIVATE_KEY="";
    private final static String PASSWORD="";
    public ExecutedResult<Long> create(ReqCreateTestInfo request) {
        // 转换po
        TestInfoPO item = TestInfoConvert.INSTANCE.toCreate(request);
        // 设置状态
        item.setStatus(EState.NORMAL.getValue());
        // 设置记录创建时间
        item.setCreateTime(LocalDateTimeUtil.nowTimeStamp());
        // 非逻辑删除
        item.setIsDelete(EYesOrNo.NO.getValue());
        int rowCount = mapper.insert(item);
        if (rowCount != 1) {
            return ExecutedResult.failed("创建[测试信息]失败。");
        }
        return ExecutedResult.success(item.getId());
    /**
     * AES256加密
     * @param data
     * @return
     * @throws Exception
     */
    public String AES256(String data) throws Exception {
        KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
        keyGenerator.init(256); // 初始化密钥生成器,指定AES-256
        SecretKey key = keyGenerator.generateKey();
        Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
        cipher.init(Cipher.ENCRYPT_MODE, key);
        byte[] encrypted = cipher.doFinal(data.getBytes("UTF-8"));
        return Base64.getEncoder().encodeToString(encrypted);
    }
    public ExecutedResult<String> modify(ReqModifyTestInfo request) {
        // 验证记录是否存在
        ExecutedResult<TestInfoPO> checkExists = this.check4Id(request.getId());
        if (checkExists.isFailed()) {
            return ExecutedResult.failed(checkExists.getMsg());
        }
        // 转换po
        TestInfoPO item = TestInfoConvert.INSTANCE.toModify(request);
        int rowCount = mapper.updateById(item);
        if (rowCount != 1) {
            return ExecutedResult.failed("编辑[测试信息]失败。");
        }
        return ExecutedResult.success();
    /**
     * Base64加密
     * @param data
     * @return
     */
    public String Base64(String data) {
        String encodedString = Base64.getEncoder().encodeToString(data.getBytes());
        return encodedString;
    }
    public ExecutedResult<TestInfoVO> get(Long id) {
        TestInfoVO result = new TestInfoVO();
        TestInfoPO find = mapper.selectById(id);
        if (null != find) {
            result = TestInfoConvert.INSTANCE.toVo(find);
        }
        return ExecutedResult.success(result);
    }
    public ExecutedResult<String> stop(Long id) {
        // 验证记录是否存在
        ExecutedResult<TestInfoPO> checkExists = this.check4Id(id);
        if (checkExists.isFailed()) {
            return ExecutedResult.failed(checkExists.getMsg());
        }
        TestInfoPO item = new TestInfoPO();
        item.setId(id);
        item.setStatus(EState.DISABLED.getValue());
        int rowCount = mapper.updateById(item);
        if (rowCount != 1) {
            return ExecutedResult.failed("停用[测试信息]失败。");
        }
        return ExecutedResult.success();
    }
    public ExecutedResult<String> enable(Long id) {
        // 验证记录是否存在
        ExecutedResult<TestInfoPO> checkExists = this.check4Id(id);
        if (checkExists.isFailed()) {
            return ExecutedResult.failed(checkExists.getMsg());
        }
        TestInfoPO item = new TestInfoPO();
        item.setId(id);
        item.setStatus(EState.NORMAL.getValue());
        int rowCount = mapper.updateById(item);
        if (rowCount != 1) {
            return ExecutedResult.failed("启用[测试信息]失败。");
        }
        return ExecutedResult.success();
    }
    public ExecutedResult<String> setSort(ReqSetSort request) {
        // 验证记录是否存在
        ExecutedResult<TestInfoPO> checkExists = this.check4Id(request.getId());
        if (checkExists.isFailed()) {
            return ExecutedResult.failed(checkExists.getMsg());
        }
        TestInfoPO item = new TestInfoPO();
        item.setId(request.getId());
        item.setSort(request.getSort());
        int rowCount = mapper.updateById(item);
        if (rowCount != 1) {
            return ExecutedResult.failed("[测试信息]设置排序值失败。");
        }
        return ExecutedResult.success();
    }
    public ExecutedResult<String> listSetSort(ReqListSetSort request) {
        // id列表
        List<Long> listId = request.getList().stream().map(ReqSetSort::getId).collect(Collectors.toList());
        // 验证记录是否存在
        ExecutedResult<List<TestInfoPO>> checkExists = this.check4Id(listId);
        if (checkExists.isFailed()) {
            return ExecutedResult.failed(checkExists.getMsg());
        }
        List<TestInfoPO> listUpdate = request.getList().stream()
                .map(c -> {
                    TestInfoPO item = new TestInfoPO();
                    item.setId(c.getId());
                    item.setSort(c.getSort());
                    return item;
                })
                .collect(Collectors.toList());
        Boolean result = mapper.modifyList(listUpdate);
        if (result) {
            return ExecutedResult.success();
        }
        return ExecutedResult.failed("[测试信息]设置排序值失败");
    }
    public ExecutedResult<String> remove(Long id) {
        // 验证记录是否存在
        ExecutedResult<TestInfoPO> checkExists = this.check4Id(id);
        if (checkExists.isFailed()) {
            return ExecutedResult.failed(checkExists.getMsg());
        }
        Boolean result = mapper.deleteLogic(id);
        if (BooleanUtils.isFalse(result)) {
            return ExecutedResult.failed("删除[测试信息]失败。");
        }
        return ExecutedResult.success();
    }
    public ExecutedResult<String> removeList(List<Long> listId) {
        // 验证记录是否存在
        ExecutedResult<List<TestInfoPO>> checkExists = this.check4Id(listId);
        if (checkExists.isFailed()) {
            return ExecutedResult.failed(checkExists.getMsg());
        }
        Boolean result = mapper.deleteLogic(listId);
        if (BooleanUtils.isFalse(result)) {
            return ExecutedResult.failed("删除[测试信息]失败。");
        }
        return ExecutedResult.success();
    }
    public ExecutedResult<List<TestInfoVO>> getList(List<Long> listId) {
        List<TestInfoVO> result = new ArrayList<>();
        List<TestInfoPO> list = mapper.getList(listId);
        if (ListUtil.isNotNullOrEmpty(list)) {
            result = CopierUtil.mapTo(list, TestInfoVO.class);
        }
        return ExecutedResult.success(result);
    }
    public ExecutedResult<PagerResult<TestInfoVO>> search(SearchTestInfo search) {
        // 处理创建时间范围-查询参数
        Tuple<String, String> createTimeRange = ParameterUtil.getTimeRange(search.getCreateTimeRange());
        if (StringUtil.isNotNullOrEmpty(createTimeRange.getItem1())) {
            search.setCreateTimeStart(LocalDateTimeUtil.getTimeStamp(createTimeRange.getItem1()).getTime());
        }
        if (StringUtil.isNotNullOrEmpty(createTimeRange.getItem2())) {
            search.setCreateTimeEnd(LocalDateTimeUtil.getTimeStamp(createTimeRange.getItem2()).getTime());
        }
        PagerResult<TestInfoPO> pageList = mapper.search(search);
        List<TestInfoVO> listVo = new ArrayList<>();
        List<TestInfoPO> list = pageList.getList();
        if (ListUtil.isNotNullOrEmpty(list)) {
            pageList.setLastId(list.get(list.size() - 1).getId());
            // 转换vo
            listVo = TestInfoConvert.INSTANCE.toVo(list);
        }
        PagerResult<TestInfoVO> result = new PagerResult<>(pageList.getLimit(), pageList.getPage(), pageList.getTotal(), listVo);
        result.setLastId(pageList.getLastId());
        return ExecutedResult.success(result);
    }
    protected ExecutedResult<TestInfoPO> check4Id(Long id) {
        TestInfoPO exists = mapper.get(id);
        if (Objects.isNull(exists)) {
            return ExecutedResult.failed("[测试信息]不存在:" + id);
        }
        return ExecutedResult.success(exists);
    }
    protected ExecutedResult<List<TestInfoPO>> check4Id(List<Long> listId) {
        // 从数据库查找测试信息
        List<TestInfoPO> list = mapper.getList(listId);
        if (ListUtil.isNullOrEmpty(list)) {
            return ExecutedResult.failed("[测试信息]不存在." + listId);
        }
        // 数据库找到的id列表
        List<Long> listIdFind = list.stream().map(TestInfoPO::getId).collect(Collectors.toList());
        // 数量不一致
        if (listId.size() != listIdFind.size()) {
            // 筛选数据库不存在的测试信息
            List<Long> listIdNotFound = listId.stream().filter(c -> !listIdFind.contains(c)).collect(Collectors.toList());
            if (ListUtil.isNullOrEmpty(list)) {
                return ExecutedResult.failed("[测试信息]不存在." + listIdNotFound);
    public static String getKeyAndValueStr(Map<String, String> map) {
        String result = "";
        try {
            List<Map.Entry<String, String>> infoIds = new ArrayList<>(map.entrySet());
            // 对所有传入参数按照字段名的 ASCII 码从小到大排序(字典序)
            Collections.sort(infoIds, Comparator.comparing(Map.Entry::getKey));
            // 构造签名键值对的格式
            StringBuilder sb = new StringBuilder();
            for (Map.Entry<String, String> item : infoIds) {
                if (item.getKey() != null && item.getKey() != "") {
                    String key = item.getKey();
                    String val = item.getValue();
                    if (!(val == "" || val == null)) {
                        sb.append(key + "=" + val + "&");
                    }
                }
            }
            result = sb.toString().substring(0, sb.length() - 1);
        } catch (Exception e) {
            return null;
        }
        return ExecutedResult.success(list);
        return result;
    }
    protected Map<Long, TestInfoPO> getMap4Id(List<Long> listId) {
        List<TestInfoPO> list = mapper.getList(listId);
        if (ListUtil.isNullOrEmpty(list)) {
            return new HashMap<>(0);
        }
        return list.stream().collect(Collectors.toMap(TestInfoPO::getId, c -> c));
    }
    /**
     * 签名处理
     * @param privateKeyPath:私钥
     * @param plaintext:原始字符串
     * @param passWord:证书密码
     * @param charset :UTF-8
     * @return
     */
    public String signMsg(String plaintext, String privateKeyPath, String passWord, String charset) {
        try {
            InputStream keyFile = new FileInputStream(new File(privateKeyPath));
            KeyStore ks = KeyStore.getInstance("PKCS12");
            try {
                ks.load(keyFile, passWord.toCharArray());
            } catch (Throwable ex) {
                if (keyFile != null)
                    keyFile.close();
                throw new RuntimeException("加载私钥失败",ex);
            }
            Enumeration<String> myEnum = ks.aliases();
            String keyAlias = null;
            RSAPrivateCrtKey prikey = null;
            /* IBM JDK必须使用While循环取最后一个别名,才能得到个人私钥别名 */
            while (myEnum.hasMoreElements()) {
                keyAlias = myEnum.nextElement();
                if (ks.isKeyEntry(keyAlias)) {
                    prikey = (RSAPrivateCrtKey) ks.getKey(keyAlias, passWord.toCharArray());
                    break;
                }
            }
            if (prikey == null) {
                throw new RuntimeException("没有找到匹配私钥");
            } else {
                Signature sign = Signature.getInstance("SHA256withRSA");
                sign.initSign(prikey);
                sign.update(plaintext.getBytes(charset));
                return org.apache.commons.codec.binary.Base64.encodeBase64String(sign.sign());
            }
        } catch (RuntimeException e) {
            throw e;
        } catch (Throwable e) {
            throw new RuntimeException("签名失败",e);
        }
    }
}