Просмотр исходного кода

Merge branch 'dev' of http://120.79.166.78:19005/zhongzheng-edu/saas_entrepot into dev

he2802 3 лет назад
Родитель
Сommit
a27883bfe8

+ 9 - 0
zhongzheng-admin/src/main/java/com/zhongzheng/controller/grade/ClassGradeController.java

@@ -554,4 +554,13 @@ public class ClassGradeController extends BaseController {
     public AjaxResult<Void> OpenQdyAccount(@RequestBody OpenQdyAccountBo bo) {
         return toAjax(iClassGradeService.OpenQdyAccount(bo) ? 1 : 0);
     }
+
+    /**
+     * 发送验证码
+     */
+    @ApiOperation("发送验证码")
+    @PostMapping("/sendCode")
+    public AjaxResult<Void> OpenQdyAccount() {
+        return toAjax(iClassGradeService.sendCode() ? 1 : 0);
+    }
 }

+ 96 - 1
zhongzheng-common/src/main/java/com/zhongzheng/common/utils/http/HttpUtils.java

@@ -12,13 +12,21 @@ import javax.net.ssl.TrustManager;
 import javax.net.ssl.X509TrustManager;
 
 
-import org.apache.http.NameValuePair;
+import org.apache.http.Consts;
+import org.apache.http.Header;
+import cn.hutool.core.lang.Validator;
+import org.apache.http.*;
+import org.apache.http.client.config.RequestConfig;
 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.client.methods.HttpUriRequest;
+import org.apache.http.client.params.AllClientPNames;
+import org.apache.http.entity.ContentType;
+import org.apache.http.entity.StringEntity;
 import org.apache.http.impl.client.CloseableHttpClient;
 import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.http.impl.client.HttpClients;
 import org.apache.http.message.BasicNameValuePair;
 import org.apache.http.util.EntityUtils;
 import org.slf4j.Logger;
@@ -36,6 +44,7 @@ public class HttpUtils
     private static final Logger log = LoggerFactory.getLogger(HttpUtils.class);
     private static final String UTF8 = "UTF-8";
     private static final String APPLICATION_FORM_URLENCODED = "application/x-www-form-urlencoded; charset=UTF-8";
+    private static final CloseableHttpClient httpclient = HttpClients.createDefault();
 
     /**
      * 向指定 URL 发送GET方法的请求
@@ -417,4 +426,90 @@ public class HttpUtils
     private static void collectAPISpendTime(String url, long startTime, long endTime) {
         log.debug("HTTP请求耗时分析,请求URL: {} , 耗时: {} ms", url, endTime - startTime);
     }
+
+    /**
+     * 向指定 URL 发送POST方法的请求
+     *
+     * @param url 发送请求的 URL
+     * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
+     * @param headersMap 请求头
+     * @return 所代表远程资源的响应结果
+     */
+    public static CloseableHttpResponse sendPostHeader(String url, String param, Map<String, String> headersMap)
+    {
+        // 字符串编码
+        StringEntity entity = new StringEntity(param, Consts.UTF_8);
+        // 设置content-type
+        entity.setContentType("application/json");
+        HttpPost httpPost = new HttpPost(url);
+        // 防止被当成攻击添加的
+        httpPost.setHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1");
+        // 接收参数设置
+        httpPost.setHeader("connection", "Keep-Alive");
+        httpPost.setHeader("Accept", "application/json");
+        httpPost.setHeader("Accept-Charset", "utf-8");
+        httpPost.setHeader("contentType", "utf-8");
+        headersMap.forEach(httpPost::setHeader);
+        httpPost.setEntity(entity);
+        CloseableHttpResponse response = null;
+        try {
+            response = httpclient.execute(httpPost);
+            Header[] headers = response.getHeaders("Set-Cookie");
+            Arrays.stream(headers).forEach(httpPost::addHeader);
+        } catch (IOException e) {
+            log.error(e.getMessage());
+        }
+        return response;
+    }
+
+    public static String postFormBodyHeader(String url, Map<String, String> paramMap, Map<String, String> headersMap, Header[] header) throws IOException{
+        return postHearder(url, paramMap, null, headersMap, header);
+
+    }
+
+    /**
+     * 向url发送post请求表单提交数据
+     * @param url 请求url
+     * @param paramMap 表单数据
+     * @param encoding 编码
+     * @param headersMap 请求头
+     * @return 请求返回的数据
+     * @throws IOException 读写异常
+     */
+    private static String postHearder(String url, Map<String, String> paramMap, String encoding, Map<String, String> headersMap, Header[] header) throws IOException {
+        log.debug("http 请求 url: {} , 请求参数: {}", url, appendUrl("", paramMap).replace("?", ""));
+        encoding = encoding == null ? UTF8 : encoding;
+        // 创建post方式请求对象
+        HttpPost httpPost = new HttpPost(url);
+        // 装填参数
+        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
+        if (paramMap != null) {
+            for (Map.Entry<String, String> entry : paramMap.entrySet()) {
+                String value = entry.getValue();
+                //去掉如下判断会造成String类型的value为null时
+                if (value != null) {
+                    nameValuePairs.add(new BasicNameValuePair(entry.getKey(), value));
+                }
+            }
+        }
+        // 设置参数到请求对象中
+        httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs, encoding));
+        // 设置header信息
+        // 指定报文头【Content-type】、【User-Agent】
+        httpPost.setHeader("Content-type", APPLICATION_FORM_URLENCODED);
+        httpPost.setHeader("Accept", "*/*");
+        httpPost.setHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1");
+        headersMap.forEach(httpPost::setHeader);
+        Arrays.stream(header).forEach(head->{
+            httpPost.addHeader("Cookie", head.getValue());
+        });
+        //Arrays.stream(header).forEach(httpPost::addHeader);
+        return post(url, httpPost, encoding, new DataParse<String>() {
+            @Override
+            public String parseData(HttpEntity httpEntity, String encoding) throws IOException {
+                return EntityUtils.toString(httpEntity, encoding);
+            }
+        });
+    }
+
 }

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/IClassGradeService.java

@@ -76,4 +76,6 @@ public interface IClassGradeService extends IService<ClassGrade> {
 	Integer getConsoleGradeUserPeriodNum(ConsoleQueryBo bo);
 
 	boolean OpenQdyAccount(OpenQdyAccountBo bo);
+
+    boolean sendCode();
 }

+ 109 - 43
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/impl/ClassGradeServiceImpl.java

@@ -8,6 +8,7 @@ import cn.hutool.http.HttpResponse;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.zhongzheng.common.exception.CustomException;
 import com.zhongzheng.common.exception.user.UserPasswordNotMatchException;
 import com.zhongzheng.common.utils.DateUtils;
@@ -45,8 +46,15 @@ import com.zhongzheng.modules.user.service.IUserStudyRecordService;
 import com.zhongzheng.modules.user.service.IUserUpdateService;
 import com.zhongzheng.modules.user.vo.SubjectStudyRecordVo;
 import com.zhongzheng.modules.user.vo.UserVo;
+import io.netty.handler.codec.http.cookie.Cookie;
+import org.apache.http.Header;
+import org.apache.http.HttpEntity;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.util.EntityUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.cloud.client.discovery.event.HeartbeatEvent;
 import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -522,45 +530,66 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public boolean OpenQdyAccount(OpenQdyAccountBo bo) {
         int falseCount = 0;
-        // post 请求 传递json参数
+
+        //头信息
+        Map<String, String> hearders = new HashMap<>();
+        hearders.put("Origin", "https://zjzyk.etledu.com");
+        hearders.put("Referer", "https://zjzyk.etledu.com");
+        hearders.put("X-Requested-With", "XMLHttpRequest");
+        hearders.put("Host", "zjzyk.etledu.com");
+
+        //登录
         String postLoginRequestUrl = "https://zjzyk.etledu.com/Account/GetLoginInfo";
         // 参数
-        Map<String, String> paramMap =new HashMap<>();
-        paramMap.put("userCode", "gdxiangyue");
-        paramMap.put("passWord", bo.getPassword());
-        paramMap.put("typeId", "2");
-        paramMap.put("yzm", bo.getYzm());
-        paramMap.put("phoneNum", "15602322262");
+        JSONObject loginJsonObject = new JSONObject();
+        loginJsonObject.put("userCode", "gdxiangyue");
+        loginJsonObject.put("passWord", bo.getPassword());
+        loginJsonObject.put("typeId", "2");
+        loginJsonObject.put("yzm", bo.getYzm());
+        loginJsonObject.put("phoneNum", "15602322262");
         String loginHttpResponse = "";
+        CloseableHttpResponse loginResponse = HttpUtils.sendPostHeader(postLoginRequestUrl, loginJsonObject.toString(), hearders);
+        Header[] headers = loginResponse.getHeaders("Set-Cookie");
         try {
-            String param = HttpUtils.appendUrl("", paramMap);
-            loginHttpResponse = HttpUtils.sendPost(postLoginRequestUrl, param.substring(1));
-            JSONObject ob = JSONObject.parseObject(loginHttpResponse);
-        }catch (UnsupportedEncodingException e) {
+            loginHttpResponse = EntityUtils.toString(loginResponse.getEntity());
+        }catch (IOException e) {
             e.printStackTrace();
+        }finally {
+            // 关闭CloseableHttpResponse
+            if (loginResponse != null) {
+                try {
+                    loginResponse.close();
+                } catch (IOException e) {
+                    log.error(e.getMessage());
+                }
+            }
         }
 
-        if (loginHttpResponse.contains("{\"\"success\"\":true")) {
+        if (loginHttpResponse.contains("{\"Result\":true")) {
             List<StudyAccountStatusQueryBo> studyAccountStatusList = bo.getStudyAccountStatusQueryBos();
             if (Validator.isNotEmpty(studyAccountStatusList)) {
                 List<Long> ids = new ArrayList<>();
                 for (StudyAccountStatusQueryBo studyAccountStatusQueryBo : studyAccountStatusList) {
                     //查询学员url
                     String getInfoRequestUrl = "https://zjzyk.etledu.com/Student/GetCertInfos";
-                    paramMap.clear();
+                    Map<String, String> paramMap = new HashMap<>();
                     paramMap.put("personalId", studyAccountStatusQueryBo.getIdCard());
                     String getInfoHttpResponse = "";
                     try {
-                        getInfoHttpResponse = HttpUtils.postFormBody(getInfoRequestUrl, paramMap);
+                        hearders.put("Referer", "https://zjzyk.etledu.com/Student/TrainInfo");
+                        getInfoHttpResponse = HttpUtils.postFormBodyHeader(getInfoRequestUrl, paramMap, hearders, headers);
                     }catch (IOException e) {
                         e.printStackTrace();
                     }
-                    if (getInfoHttpResponse.contains("{\"\"success\"\":true")) {
-                        PersonRoot personRoot = com.alibaba.fastjson.JSONObject.parseObject(getInfoHttpResponse, PersonRoot.class);
+                    if (getInfoHttpResponse.contains("{\"success\":true")) {
+                        PersonRoot personRoot = JSONObject.parseObject(getInfoHttpResponse, PersonRoot.class);
+                        if (ObjectUtils.isEmpty(personRoot)) {
+                            throw new CustomException(studyAccountStatusQueryBo.getRealname() + "学员信息为空");
+                        }
                         CertInfoListItem certInfoListItem = personRoot.getCertInfoList().get(0);
-                        TrainInfosItem trainInfosItem = certInfoListItem.getTrainInfos().get(0);
                         //查询继教产品url
                         paramMap.clear();
                         String getProductUrl = "https://zjzyk.etledu.com/Student/GetProducts";
@@ -569,20 +598,21 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
                         paramMap.put("trainYear", bo.getTrainYear());
                         String getProductHttpResponse = "";
                         try {
-                            getProductHttpResponse = HttpUtils.postFormBody(getProductUrl, paramMap);
+                            hearders.put("Referer", "https://zjzyk.etledu.com/Student/TrainInfo");
+                            getProductHttpResponse = HttpUtils.postFormBodyHeader(getProductUrl, paramMap, hearders, headers);
                         }catch (IOException e) {
                             e.printStackTrace();
                         }
-                        if (getProductHttpResponse.contains("{\"\"success\"\":true")) {
-                            ProductRoot productRoot = com.alibaba.fastjson.JSONObject.parseObject(getProductHttpResponse, ProductRoot.class);
-                            if (Validator.isEmpty(productRoot)) {
-                                throw new CustomException("未获取到相关继教商品信息");
+                        if (getProductHttpResponse.contains("{\"success\":true")) {
+                            ProductRoot productRoot = JSONObject.parseObject(getProductHttpResponse, ProductRoot.class);
+                            if (ObjectUtils.isEmpty(productRoot)) {
+                                throw new CustomException(studyAccountStatusQueryBo.getRealname() + "继教商品信息为空");
                             }
                             ProductsItem productsItem = productRoot.getProducts().get(0);
-                            //学员开通url
-                            String postOpenRequestUrl = "https://zjzyk.etledu.com/Student/SubmitProject";
+                            //学员报名url
+                            String sumitRequestUrl = "https://zjzyk.etledu.com/Student/SubmitProject";
                             paramMap.clear();
-                            paramMap.put("CertNumber", studyAccountStatusQueryBo.getIdCard());
+                            paramMap.put("CertNumber", certInfoListItem.getCertNumber());
                             paramMap.put("CertState", certInfoListItem.getCertState().toString());
                             paramMap.put("CertTime", certInfoListItem.getCertTime());
                             paramMap.put("Name", studyAccountStatusQueryBo.getRealname());
@@ -593,47 +623,83 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
                             paramMap.put("WorkTypeCode", certInfoListItem.getWorkTypeCode());
                             paramMap.put("WorkTypeName", certInfoListItem.getWorkTypeName());
                             paramMap.put("productId", productsItem.getId().toString());
-                            paramMap.put("trainPeriodDate", trainInfosItem.getTrainPeriodTime());
+                            certInfoListItem.getTrainInfos().forEach(trainInfo->{
+                                if (bo.getTrainYear().equals(trainInfo.getTrainYear())){
+                                    paramMap.put("trainPeriodDate", trainInfo.getTrainStartTime());
+                                }
+                            });
                             paramMap.put("period", "0");
-                            paramMap.put("IsBuyBook", "1");
+                            paramMap.put("IsBuyBook", "0");
                             paramMap.put("GetMethod", "1");
                             String sumitHttpResponse = "";
                             try {
-                                sumitHttpResponse = HttpUtils.postFormBody(getProductUrl, paramMap);
+                                hearders.put("Referer", "");
+                                sumitHttpResponse = HttpUtils.postFormBodyHeader(sumitRequestUrl, paramMap, hearders, headers);
                             }catch (IOException e) {
                                 e.printStackTrace();
                             }
-                            com.alibaba.fastjson.JSONObject.parseObject(sumitHttpResponse.toString(), ClassGradeUserQueryBo.class);
-                            //开通成功同步修改本地库learnStatus状态
-                            if (sumitHttpResponse.contains("{\"\"success\"\":true")) {
+
+                            if (sumitHttpResponse.contains("{\"success\":true")) {
                                 ids.add(studyAccountStatusQueryBo.getId());
                             } else {
                                 falseCount++;
                             }
-                        } else {
-                            throw new CustomException("获取相关继教商品信息失败");
                         }
-                    } else {
-                        throw new CustomException("根据身份证未获取相关数据失败");
                     }
+                    //同步修改本地库learnStatus状态
+                    Long[] id = new Long[]{};
+                    id = ids.toArray(id);
+                    ClassGradeUserEditBo classGradeUserEditBo = new ClassGradeUserEditBo();
+                    classGradeUserEditBo.setId(id);
+                    classGradeUserEditBo.setLearnStatus(1);
+                    iClassGradeUserService.updateByEditBo(classGradeUserEditBo);
                 }
-                Long[] id = new Long[]{};
-                id = ids.toArray(id);
-                ClassGradeUserEditBo classGradeUserEditBo = new ClassGradeUserEditBo();
-                classGradeUserEditBo.setId(id);
-                classGradeUserEditBo.setLearnStatus(1);
-                iClassGradeUserService.updateByEditBo(classGradeUserEditBo);
-            } else {
-                throw new UserPasswordNotMatchException();
             }
             if (falseCount > 0) {
                 throw new CustomException(falseCount + "个开通失败");
             }
+        }else {
+            throw new CustomException("登录官网失败,请检查信息");
         }
 
         return true;
     }
 
+    @Override
+    public boolean sendCode() {
+        //头信息
+        Map<String, String> hearders = new HashMap<>();
+        hearders.put("Origin", "https://zjzyk.etledu.com");
+        hearders.put("Referer", "https://zjzyk.etledu.com");
+        hearders.put("X-Requested-With", "XMLHttpRequest");
+        hearders.put("Host", "zjzyk.etledu.com");
+
+        //发送验证码
+        String sendCodeUrl = "https://zjzyk.etledu.com/Account/SendMessageForgetPwd";
+        JSONObject codeJsonObject = new JSONObject();
+        codeJsonObject.put("phoneNumber", "15602322262");
+        String codeHttpResponse = "";
+        CloseableHttpResponse codeResponse = HttpUtils.sendPostHeader(sendCodeUrl, codeJsonObject.toString(), hearders);
+        try {
+            codeHttpResponse = EntityUtils.toString(codeResponse.getEntity());
+        }catch (IOException e) {
+            e.printStackTrace();
+        }finally {
+            // 关闭CloseableHttpResponse
+            if (codeResponse != null) {
+                try {
+                    codeResponse.close();
+                } catch (IOException e) {
+                    log.error(e.getMessage());
+                }
+            }
+        }
+        if (!codeHttpResponse.contains("{\"Result\":true")) {
+            throw new CustomException("验证码发送失败");
+        }
+        return true;
+    }
+
     /**
      * 实体类转化成视图对象
      *

+ 2 - 2
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/domain/CertInfoListItem.java

@@ -35,8 +35,8 @@ public class CertInfoListItem implements Comparable<CertInfoListItem> {
 	@ApiModelProperty("工作类型")
 	private String workTypeName;
 
-	@Excel(name = "身份证号码")
-	@ApiModelProperty("身份证号码")
+	@Excel(name = "证号码")
+	@ApiModelProperty("证号码")
 	private String certNumber;
 
 	@Excel(name = "工作类型编号")

+ 5 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/domain/ProductsItem.java

@@ -75,13 +75,17 @@ public class ProductsItem implements Comparable<ProductsItem> {
 	@ApiModelProperty("学习类型")
 	private Integer learnType;
 
+	@Excel(name = "区域代码")
+	@ApiModelProperty("区域代码")
+	private String areaCode;
+
 	@Excel(name = "区域名称")
 	@ApiModelProperty("区域名称")
 	private String areaName;
 
 	@Excel(name = "组织机构代码")
 	@ApiModelProperty("组织机构代码")
-	private String organizationcode;
+	private String organizationCode;
 
 	@Excel(name = "组织机构名称")
 	@ApiModelProperty("组织机构名称")

+ 1 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/domain/TrainInfosItem.java

@@ -27,7 +27,7 @@ public class TrainInfosItem implements Comparable<TrainInfosItem> {
 
 	@Excel(name = "培训年限")
 	@ApiModelProperty("培训年限")
-	private Integer TrainYear;
+	private String TrainYear;
 
 
 	@Override