commit e8e6c3bf222df50cce71681491f3f36e723035b2 Author: RuicyWu <1063154311@qq.com> Date: Thu Jan 15 17:35:00 2026 +0800 初始化 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1e2867e --- /dev/null +++ b/.gitignore @@ -0,0 +1,39 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store +/config/ diff --git a/extLib/chinaumsdk/.gitignore b/extLib/chinaumsdk/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/extLib/chinaumsdk/.gitignore @@ -0,0 +1 @@ +/target diff --git a/extLib/chinaumsdk/.idea/.gitignore b/extLib/chinaumsdk/.idea/.gitignore new file mode 100644 index 0000000..a0ccf77 --- /dev/null +++ b/extLib/chinaumsdk/.idea/.gitignore @@ -0,0 +1,5 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Environment-dependent path to Maven home directory +/mavenHomeManager.xml diff --git a/extLib/chinaumsdk/.idea/compiler.xml b/extLib/chinaumsdk/.idea/compiler.xml new file mode 100644 index 0000000..9cc5329 --- /dev/null +++ b/extLib/chinaumsdk/.idea/compiler.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/extLib/chinaumsdk/.idea/encodings.xml b/extLib/chinaumsdk/.idea/encodings.xml new file mode 100644 index 0000000..aa00ffa --- /dev/null +++ b/extLib/chinaumsdk/.idea/encodings.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/extLib/chinaumsdk/.idea/jarRepositories.xml b/extLib/chinaumsdk/.idea/jarRepositories.xml new file mode 100644 index 0000000..c7ea920 --- /dev/null +++ b/extLib/chinaumsdk/.idea/jarRepositories.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/extLib/chinaumsdk/.idea/misc.xml b/extLib/chinaumsdk/.idea/misc.xml new file mode 100644 index 0000000..d5cd614 --- /dev/null +++ b/extLib/chinaumsdk/.idea/misc.xml @@ -0,0 +1,12 @@ + + + + + + + + \ No newline at end of file diff --git a/extLib/chinaumsdk/chinaumsdk.jar b/extLib/chinaumsdk/chinaumsdk.jar new file mode 100644 index 0000000..5633aa8 Binary files /dev/null and b/extLib/chinaumsdk/chinaumsdk.jar differ diff --git a/extLib/chinaumsdk/pom.xml b/extLib/chinaumsdk/pom.xml new file mode 100644 index 0000000..a6f774a --- /dev/null +++ b/extLib/chinaumsdk/pom.xml @@ -0,0 +1,52 @@ + + 4.0.0 + com.chinaums.open + open-api-sdk + jar + 1.0-SNAPSHOT + open-api-sdk + http://maven.apache.org + + UTF-8 + + + + net.sf.json-lib + json-lib + 2.4 + jdk15 + + + commons-logging + commons-logging + 1.1.1 + + + com.squareup.okhttp3 + okhttp + 3.5.0 + + + org.apache.commons + commons-lang3 + 3.4 + + + com.google.guava + guava + 19.0 + + + junit + junit + 4.11 + test + + + commons-codec + commons-codec + 1.15 + + + diff --git a/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/DefaultOpenApiClient.java b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/DefaultOpenApiClient.java new file mode 100644 index 0000000..84e212d --- /dev/null +++ b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/DefaultOpenApiClient.java @@ -0,0 +1,105 @@ +package com.chinaums.open.api; + +import com.chinaums.open.api.constants.ConfigBean; +import com.chinaums.open.api.internal.util.OpenApiLogger; +import com.chinaums.open.api.internal.util.http.HttpTransport; +import com.chinaums.open.api.parser.json.ObjectJsonParser; +import org.apache.commons.lang3.StringUtils; + +import java.util.UUID; + +/** + * Created with IntelliJ IDEA. + * User: ZHANGWEI + * Date: 2016/12/2 + * Time: 14:22 + * 所属模块: + * 功能说明:开放平台客户端 + */ +public class DefaultOpenApiClient implements OpenApiClient { + private static final String constant_classname=DefaultOpenApiClient.class.getSimpleName(); + /** + * 开放平台URL + */ + private String serverUrl; + /** + * appId + */ + private String appId; + /** + * appKey + */ + private String appKey; + /** + * 字符集格式 + */ + private String encodeCharSet; + + public DefaultOpenApiClient(String serverUrl, String appId, String appKey) { + this.serverUrl = serverUrl; + this.appId = appId; + this.appKey = appKey; + } + + public DefaultOpenApiClient(String serverUrl, String appId, String appKey, String encodeCharSet) { + this.serverUrl = serverUrl; + this.appId = appId; + this.appKey = appKey; + this.encodeCharSet = encodeCharSet; + } + + public T execute(OpenApiRequest openApiRequest) throws OpenApiException { + return execute(openApiRequest,null,null); + } + + public T execute(OpenApiRequest openApiRequest, String token) throws OpenApiException { + return execute(openApiRequest,token,null); + } + + public T execute(OpenApiRequest openApiRequest, String token,String encodeCharSet) throws OpenApiException { + OpenApiParser openApiParser = new ObjectJsonParser(openApiRequest.responseClass()); + return execute_(openApiRequest,openApiParser,token,encodeCharSet); + } + + public T execute_(OpenApiRequest openApiRequest,OpenApiParser openApiParser,String token,String encodeCharSet){ + ConfigBean configBean = new ConfigBean(); + OpenApiContext context = new OpenApiContext(); + T trsp = null; + String response = ""; + try { + if(StringUtils.isBlank(serverUrl)) throw new OpenApiException("通讯地址未设置"); + if(StringUtils.isBlank(appId)) throw new OpenApiException("开发者appId未设置"); + if(StringUtils.isBlank(appKey)) throw new OpenApiException("开发者appKey未设置"); + String request = openApiParser.validRequest(openApiRequest); + context.setStartTime(System.currentTimeMillis()); + context.setRequestId(UUID.randomUUID().toString().replace("-","")); + context.setOpenServUrl(serverUrl); + String url = serverUrl.concat(openApiRequest.apiVersion()).concat(openApiRequest.serviceCode()); + context.setApiServiceUrl(url); + context.setApiMethodName(openApiRequest.apiMethodName()); + context.setVersion(openApiRequest.apiVersion()); + context.setAppId(appId); + context.setAppKey(appKey); + context.setConfigBean(configBean); + context.setServiceCode(openApiRequest.serviceCode()); + if(openApiRequest.needToken()){ + OpenApiCache.getCurrentToken(context); + response = HttpTransport.getInstance().doPost(context,request); + }else{ + response = HttpTransport.getInstance().doPost(configBean.isProd(),url,token,request); + } + if(StringUtils.isBlank(response)) throw new OpenApiException("服务提供方未返回"); + if(StringUtils.isNotBlank(encodeCharSet)){ + //encodeCharSet = configBean.getCharSet(); + trsp = openApiParser.parse(new String(response.getBytes(),encodeCharSet)); + }else{ + trsp = openApiParser.parse(response); + } + } catch (Exception e) { + OpenApiLogger.logError(constant_classname +" SDK异常:"+e.getStackTrace()); + e.printStackTrace(); + } + context.setEndTime(System.currentTimeMillis()); + return trsp; + } +} diff --git a/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/OpenApiCache.java b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/OpenApiCache.java new file mode 100644 index 0000000..ddf99ec --- /dev/null +++ b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/OpenApiCache.java @@ -0,0 +1,40 @@ +package com.chinaums.open.api; + +import com.chinaums.open.api.internal.util.OpenTokenUtil; +import com.chinaums.open.api.response.TokenResponse; +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; + +import java.util.concurrent.TimeUnit; + +/** + * Created with IntelliJ IDEA. + * User: ZHANGWEI + * Date: 2016/12/6 + * Time: 11:01 + * 所属模块: + * 功能说明:cache缓存 + */ +public class OpenApiCache { + + public final static int MAX_PROCESS_TIMEOUT = 3600; + + public static Cache contextCache = CacheBuilder.newBuilder() + .expireAfterWrite(MAX_PROCESS_TIMEOUT, TimeUnit.SECONDS).build(); + + /** + * 获取当前有效的token + * @param context + * @return + */ + public static TokenResponse getCurrentToken(OpenApiContext context){ + String appId = context.getAppId(); + TokenResponse token = (TokenResponse)contextCache.getIfPresent(appId); + if(token==null){ + token = OpenTokenUtil.getToken(context); + contextCache.put(context.getAppId(), token); + } + context.setCurrentToken(token); + return token; + } +} diff --git a/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/OpenApiClient.java b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/OpenApiClient.java new file mode 100644 index 0000000..c326c1e --- /dev/null +++ b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/OpenApiClient.java @@ -0,0 +1,13 @@ +package com.chinaums.open.api; + +/** + * Created with IntelliJ IDEA. + * User: ZHANGWEI + * Date: 2016/12/2 + * Time: 14:18 + * 所属模块: + * 功能说明: + */ +public abstract interface OpenApiClient { + public abstract T execute(OpenApiRequest openApiRequest) throws OpenApiException; +} diff --git a/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/OpenApiContext.java b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/OpenApiContext.java new file mode 100644 index 0000000..03ed7c1 --- /dev/null +++ b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/OpenApiContext.java @@ -0,0 +1,151 @@ +package com.chinaums.open.api; + +import com.chinaums.open.api.constants.ConfigBean; +import com.chinaums.open.api.response.TokenResponse; + +import java.util.Map; + +/** + * Created with IntelliJ IDEA. + * User: ZHANGWEI + * Date: 2016/12/6 + * Time: 10:17 + * 所属模块: + * 功能说明:api 处理报文上下文 + */ +public class OpenApiContext { + private String requestId; + private TokenResponse currentToken; + private long startTime; + private long endTime; + private String request; + private String response; + private Map params; + private String apiMethodName; + private String serviceCode; + private String openServUrl; + private String version; + private String appId; + private String appKey; + private ConfigBean configBean; + private String apiServiceUrl; + public String getRequestId() { + return requestId; + } + + public void setRequestId(String requestId) { + this.requestId = requestId; + } + + public TokenResponse getCurrentToken() { + return currentToken; + } + + public void setCurrentToken(TokenResponse currentToken) { + this.currentToken = currentToken; + } + + public long getStartTime() { + return startTime; + } + + public void setStartTime(long startTime) { + this.startTime = startTime; + } + + public long getEndTime() { + return endTime; + } + + public void setEndTime(long endTime) { + this.endTime = endTime; + } + + public String getRequest() { + return request; + } + + public void setRequest(String request) { + this.request = request; + } + + public String getResponse() { + return response; + } + + public void setResponse(String response) { + this.response = response; + } + + public Map getParams() { + return params; + } + + public void setParams(Map params) { + this.params = params; + } + + public String getServiceCode() { + return serviceCode; + } + + public void setServiceCode(String serviceCode) { + this.serviceCode = serviceCode; + } + + public String getApiMethodName() { + return apiMethodName; + } + + public void setApiMethodName(String apiMethodName) { + this.apiMethodName = apiMethodName; + } + + public String getOpenServUrl() { + return openServUrl; + } + + public void setOpenServUrl(String openServUrl) { + this.openServUrl = openServUrl; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public String getAppId() { + return appId; + } + + public void setAppId(String appId) { + this.appId = appId; + } + + public String getAppKey() { + return appKey; + } + + public void setAppKey(String appKey) { + this.appKey = appKey; + } + + public ConfigBean getConfigBean() { + return configBean; + } + + public void setConfigBean(ConfigBean configBean) { + this.configBean = configBean; + } + + public String getApiServiceUrl() { + return apiServiceUrl; + } + + public void setApiServiceUrl(String apiServiceUrl) { + this.apiServiceUrl = apiServiceUrl; + } +} diff --git a/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/OpenApiException.java b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/OpenApiException.java new file mode 100644 index 0000000..8bbd6cd --- /dev/null +++ b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/OpenApiException.java @@ -0,0 +1,49 @@ +package com.chinaums.open.api; + +import java.io.Serializable; + +/** + * Created with IntelliJ IDEA. + * User: ZHANGWEI + * Date: 2016/12/2 + * Time: 10:11 + * 所属模块: + * 功能说明: + */ +public class OpenApiException extends Exception implements Serializable{ + private String errCode; + private String errInfo; + public OpenApiException() {} + + public OpenApiException(String message, Throwable cause) + { + super(message, cause); + } + + public OpenApiException(String message) + { + super(message); + } + + public OpenApiException(Throwable cause) + { + super(cause); + } + + public OpenApiException(String errCode, String errInfo) + { + super(errCode + ":" + errInfo); + this.errCode = errCode; + this.errInfo = errInfo; + } + + public String getErrCode() + { + return this.errCode; + } + + public String getErrMsg() + { + return this.errInfo; + } +} diff --git a/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/OpenApiParser.java b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/OpenApiParser.java new file mode 100644 index 0000000..81e38c8 --- /dev/null +++ b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/OpenApiParser.java @@ -0,0 +1,27 @@ +package com.chinaums.open.api; + +/** + * Created with IntelliJ IDEA. + * User: ZHANGWEI + * Date: 2016/12/2 + * Time: 14:27 + * 所属模块: + * 功能说明: + */ +public abstract interface OpenApiParser { + /** + * 返回内容格式转换 + * @param paramString + * @return + * @throws OpenApiException + */ + public abstract T parse(String paramString) throws OpenApiException; + + /** + * 请求参数检查 + * @param openApiRequest + * @return + * @throws OpenApiException + */ + public abstract String validRequest(OpenApiRequest openApiRequest) throws OpenApiException; +} diff --git a/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/OpenApiRequest.java b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/OpenApiRequest.java new file mode 100644 index 0000000..c83335b --- /dev/null +++ b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/OpenApiRequest.java @@ -0,0 +1,25 @@ +package com.chinaums.open.api; + +/** + * Created by ZHANGWEI on 2016/12/2. + */ +public abstract interface OpenApiRequest { + public abstract Class responseClass(); + /* + api版本号 + */ + public abstract String apiVersion(); + /* + api接口名称定义 + */ + public abstract String apiMethodName(); + /* + 开放平台分配servicecode + */ + public abstract String serviceCode(); + + /* + 是否需要获取token + */ + public abstract boolean needToken(); +} diff --git a/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/OpenApiResponse.java b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/OpenApiResponse.java new file mode 100644 index 0000000..c7b8bf7 --- /dev/null +++ b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/OpenApiResponse.java @@ -0,0 +1,27 @@ +package com.chinaums.open.api; + +import java.io.Serializable; + +/** + * Created by ZHANGWEI on 2016/12/2. + */ +public abstract class OpenApiResponse implements Serializable{ + private String errCode; + private String errInfo; + + public String getErrCode() { + return errCode; + } + + public void setErrCode(String errCode) { + this.errCode = errCode; + } + + public String getErrInfo() { + return errInfo; + } + + public void setErrInfo(String errInfo) { + this.errInfo = errInfo; + } +} diff --git a/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/annotation/ApiField.java b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/annotation/ApiField.java new file mode 100644 index 0000000..864d0a6 --- /dev/null +++ b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/annotation/ApiField.java @@ -0,0 +1,22 @@ +package com.chinaums.open.api.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Created by ZHANGWEI on 2016/12/2. + */ +@Target({ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) +public @interface ApiField { + String key() default ""; + String name() default ""; + boolean required() default false; + int length() default -1; + int minLength() default -1; + int maxLength() default -1; + String index() default "0"; + String desc() default ""; +} diff --git a/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/constants/ConfigBean.java b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/constants/ConfigBean.java new file mode 100644 index 0000000..add43c1 --- /dev/null +++ b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/constants/ConfigBean.java @@ -0,0 +1,82 @@ +package com.chinaums.open.api.constants; + +/** + * Created with IntelliJ IDEA. + * User: ZHANGWEI + * Date: 2016/12/4 + * Time: 21:22 + * 所属模块: + * 功能说明: + */ +public class ConfigBean { + /* + 字符集格式 + */ + private String charSet = "UTF-8"; + /* + 是否是生产环境 + */ + private boolean isProd = false; + + private String version = "v2"; + /** + * token申请失效后,重试次数 + */ + private int tokenAcquireReties = 3; + /** + * token提前申请的时间 + */ + private int tokenAcquireAheadInterval = 600; + /* + 获取token servicecode + */ + private String tokenServiceCode="/token/access"; + + public String getCharSet() { + return charSet; + } + + public void setCharSet(String charSet) { + this.charSet = charSet; + } + + public boolean isProd() { + return isProd; + } + + public void setProd(boolean prod) { + isProd = prod; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public int getTokenAcquireReties() { + return tokenAcquireReties; + } + + public void setTokenAcquireReties(int tokenAcquireReties) { + this.tokenAcquireReties = tokenAcquireReties; + } + + public int getTokenAcquireAheadInterval() { + return tokenAcquireAheadInterval; + } + + public void setTokenAcquireAheadInterval(int tokenAcquireAheadInterval) { + this.tokenAcquireAheadInterval = tokenAcquireAheadInterval; + } + + public String getTokenServiceCode() { + return tokenServiceCode; + } + + public void setTokenServiceCode(String tokenServiceCode) { + this.tokenServiceCode = tokenServiceCode; + } +} diff --git a/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/constants/Constants.java b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/constants/Constants.java new file mode 100644 index 0000000..28aae83 --- /dev/null +++ b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/constants/Constants.java @@ -0,0 +1,24 @@ +package com.chinaums.open.api.constants; + +/** + * Created with IntelliJ IDEA. + * User: ZHANGWEI + * Date: 2016/12/5 + * Time: 18:46 + * 所属模块: + * 功能说明: + */ +public class Constants { + public static class ERR_CODE { + public static final String NORMAL = "0000"; + public static final String ILLEGAL_CALL = "9000"; + public static final String ILLEGAL_PARAMETER = "9001"; + public static final String FATAL = "9999"; + } + public static class ERR_INFO { + public static final String NORMAL = "正常"; + public static final String ILLEGAL_CALL = "非法访问"; + public static final String ILLEGAL_PARAMETER = "请求参数校验失败"; + public static final String FATAL = "系统错误"; + } +} diff --git a/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/internal/util/DateUtils.java b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/internal/util/DateUtils.java new file mode 100644 index 0000000..b61ef29 --- /dev/null +++ b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/internal/util/DateUtils.java @@ -0,0 +1,40 @@ +/** + * Project:TODO ADD PROJECT NAME + * Modify Information: + * ================================================================ + * Author Date Description + * ------------ ---------- -------------------------------- + * wmshen 2022/10/20 TODO: + * ================================================================ + * Copyright (c) 银联商务股份有限公司 www.chinaums.com + */ +package com.chinaums.open.api.internal.util; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * Desc: TODO ADD DESC + *

+ * Function: + *

+ *
核心功能点1
+ *
核心功能点1说明
+ *
核心功能点2
+ *
核心功能点2说明
+ *
+ * + * @app <服务名称英文缩写> + * @layer <代码所在分层> + * @refApp <依赖服务的英文缩写> + * @author wmshen + * @since 2022/10/20 + * @version 2022/10/20 + */ +public class DateUtils { + public static String getFormatDate(){ + Date date = new Date(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); + return sdf.format(date); + } +} diff --git a/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/internal/util/FieldUtils.java b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/internal/util/FieldUtils.java new file mode 100644 index 0000000..dd87b6e --- /dev/null +++ b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/internal/util/FieldUtils.java @@ -0,0 +1,203 @@ +package com.chinaums.open.api.internal.util; + +import net.sf.json.JSONArray; +import net.sf.json.JSONObject; + +import java.lang.reflect.Field; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.math.BigDecimal; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * Created with IntelliJ IDEA. + * User: ZHANGWEI + * Date: 2016/12/2 + * Time: 16:17 + * 所属模块: + * 功能说明: + */ +public class FieldUtils { + public static Object getFieldValueByTypeAndFormat(Field field, Object bean, + String format) throws ParseException, IllegalArgumentException, + IllegalAccessException { + field.setAccessible(true); + Object objValue = field.get(bean); + Object ret = null; + if (objValue == null) + return ret; + String type = field.getType().getName(); + if ("java.lang.String".equals(type)) { + ret = field.get(bean).toString().trim(); + } else if ("java.lang.Integer".equals(type) || "int".equals(type)) { + if (objValue instanceof Integer) { + ret = ((Integer) objValue).toString(); + } + } else if ("java.lang.Float".equals(type) || "float".equals(type)) { + if (objValue instanceof Float) { + ret = ((Float) objValue).toString(); + } + } else if ("java.lang.Double".equals(type) || "double".equals(type)) { + if (objValue instanceof Double) { + ret = ((Double) objValue).toString(); + } + } else if ("java.math.BigDecimal".equals(type)) { + if (objValue instanceof BigDecimal) { + ret = ((BigDecimal) objValue).toString(); + } + } else if ("java.util.Date".equals(type)) { + if (objValue instanceof Date) { + Date dateValue = (Date) objValue; + ret = new SimpleDateFormat(format).format(dateValue); + } + } else if ("java.lang.Boolean".equals(type)) { + if (objValue instanceof Boolean) { + ret = ((Boolean) objValue).toString(); + } + } else if ("java.lang.Long".equals(type) || "long".equals(type)) { + if (objValue instanceof Long) { + ret = ((Long) objValue).toString(); + } + } else { + ret = objValue; + } + return ret; + } + + public static void setFieldValueByType(Field field, Object bean, + String value) throws IllegalArgumentException, + IllegalAccessException, ParseException, ClassNotFoundException { + setFieldValueByTypeAndFormat(field,bean,value,null); + } + + public static void setFieldValueByTypeAndFormat(Field field, Object bean, + String value, String format) throws IllegalArgumentException, + IllegalAccessException, ParseException, ClassNotFoundException { + if (value == null) + return; + field.setAccessible(true); + String type = field.getType().getName(); + if ("java.lang.String".equals(type)) { + field.set(bean, value); + } else if ("java.lang.Integer".equals(type)) { + field.set(bean, Integer.valueOf(value)); + } else if ("int".equals(type)) { + field.set(bean, Integer.valueOf(value).intValue()); + } else if ("java.lang.Float".equals(type)) { + field.set(bean, Float.valueOf(value)); + } else if ("float".equals(type)) { + field.set(bean, Float.valueOf(value).floatValue()); + } else if ("java.lang.Double".equals(type)) { + field.set(bean, Double.valueOf(value)); + } else if ("double".equals(type)) { + field.set(bean, Double.valueOf(value).doubleValue()); + } else if ("java.math.BigDecimal".equals(type)) { + field.set(bean, new BigDecimal(value)); + } else if ("java.util.Date".equals(type)) { + Date date = new SimpleDateFormat(format).parse(value.toString()); + field.set(bean, date); + } else if ("java.lang.Boolean".equals(type)) { + field.set(bean, Boolean.valueOf(value)); + } else if ("java.lang.Long".equals(type)) { + field.set(bean, Long.valueOf(value)); + } else if ("java.lang.Object".equals(type)) { + field.set(bean, value); + } else if ("long".equals(type)) { + field.set(bean, Long.valueOf(value).longValue()); + } else if ("java.util.Map".equals(type)) { + JSONObject mapObj = JSONObject.fromObject(value); + field.set(bean,mapObj); + } else if ("java.util.List".equals(type)) { + JSONArray arr = JSONArray.fromObject(value); + ParameterizedType genericType = (ParameterizedType) field.getGenericType(); + Type listType = genericType.getActualTypeArguments()[0]; + if (listType instanceof ParameterizedType) { + ParameterizedType paraType = (ParameterizedType) listType; + if ("java.util.Map".equals(((Class)paraType.getRawType()).getName())) { + List> list = new ArrayList>(); + for (int i = 0; i < arr.size(); i++) { + Map classMap = new HashMap(); + Map map = (Map) JSONObject + .toBean(JSONObject.fromObject(arr.optString(i)), + Map.class, classMap); + list.add(map); + } + field.set(bean, list); + } + } else if(List.class.isAssignableFrom(field.getType())){ + String argCalssName = listType.toString().substring(listType.toString().lastIndexOf(" ") + 1); + Class clazz = Class.forName(argCalssName); + List list = new ArrayList(); + for (int index = 0; index < arr.size(); index++) { + Object element = arr.get(index); + if (clazz == element.getClass()) { + list.add(element); + } else { + Object obj = JSONObject.toBean(JSONObject.fromObject(arr.optString(index)), clazz); + list.add(obj); + } + } + field.set(bean, list); + } else { + field.set(bean, arr); + } + } + + } + + public static Field getFieldByName(Object obj, String key) { + if (obj == null || key == null) + return null; + for (Class clazz = obj.getClass(); !clazz.getName().equals(Object.class.getName()); clazz = clazz + .getSuperclass()) { + Field[] fields = clazz.getDeclaredFields(); + for (Field f : fields) { + if (f.getName().equals(key)) { + return f; + } + } + } + return null; + + } + + public static Field getFieldByNameIgnoreCase(Class clazz, String key) { + if (clazz == null || key == null) + return null; + for (; !clazz.getName().equals(Object.class.getName()); clazz = clazz + .getSuperclass()) { + Field[] fields = clazz.getDeclaredFields(); + for (Field f : fields) { + if (f.getName().equalsIgnoreCase(key)) { + return f; + } + } + } + return null; + + } + + public static Object getFieldValueByNameIgnoreCase(Object obj, String key) { + if (obj == null || key == null) + return null; + Class clazz = obj.getClass(); + for (; !clazz.getName().equals(Object.class.getName()); clazz = clazz + .getSuperclass()) { + Field[] fields = clazz.getDeclaredFields(); + for (Field f : fields) { + if (f.getName().equalsIgnoreCase(key)) { + f.setAccessible(true); + try { + return f.get(obj); + } catch (Exception e) { + + } + } + } + } + return null; + } + +} diff --git a/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/internal/util/OpenApiLogger.java b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/internal/util/OpenApiLogger.java new file mode 100644 index 0000000..a361805 --- /dev/null +++ b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/internal/util/OpenApiLogger.java @@ -0,0 +1,56 @@ +package com.chinaums.open.api.internal.util; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.TimeZone; + +/** + * Created with IntelliJ IDEA. + * User: ZHANGWEI + * Date: 2016/12/2 + * Time: 10:21 + * 所属模块: + * 功能说明: + */ +public class OpenApiLogger { + private static final Log blog = LogFactory.getLog("sdk.biz.err"); + private static final Log clog = LogFactory.getLog("sdk.biz.info"); + private static boolean needEnableLogger = true; + + public static void logInfo(String rsp){ + DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + df.setTimeZone(TimeZone.getTimeZone("GMT+8")); + StringBuilder sb = new StringBuilder(); + sb.append(df.format(new Date())); + sb.append("#"); + sb.append(rsp); + clog.info(sb.toString()); + } + + public static void logError(String rsp) + { + if (!needEnableLogger) { + return; + } + DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + df.setTimeZone(TimeZone.getTimeZone("GMT+8")); + StringBuilder sb = new StringBuilder(); + sb.append(df.format(new Date())); + sb.append("###"); + sb.append(rsp); + blog.error(sb.toString()); + } + + public static void logError(Throwable t) + { + if (!needEnableLogger) { + return; + } + blog.error(t); + } + +} diff --git a/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/internal/util/OpenBodySigUtil.java b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/internal/util/OpenBodySigUtil.java new file mode 100644 index 0000000..07b0131 --- /dev/null +++ b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/internal/util/OpenBodySigUtil.java @@ -0,0 +1,68 @@ +package com.chinaums.open.api.internal.util; + +import com.chinaums.open.api.OpenApiContext; +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.codec.digest.DigestUtils; + +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.net.URLEncoder; +import java.security.InvalidKeyException; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.UUID; + +/** + * Created with IntelliJ IDEA. + * User: + * Date: + * Time: + * 所属模块: + * 功能说明:Open body sig相关 + */ +public class OpenBodySigUtil { + + /** + * open-body-sig算法 + * @param context + * @param request + * @param method + * @return + */ + public static String generateSignature(OpenApiContext context, String request,String method) { + + try { + String appId=context.getAppId(); + String appKey=context.getAppKey(); + String timestamp = new SimpleDateFormat("yyyyMMddHHmmss") + .format(new Date()); + String nonce = UUID.randomUUID().toString().replace("-", ""); + String testSH = DigestUtils.sha256Hex(request); + + String s1 = appId+timestamp+nonce+testSH; + + String algorithm = "HmacSHA256"; + Mac mac = Mac.getInstance(algorithm); + mac.init(new SecretKeySpec(appKey.getBytes(), algorithm)); + byte[] localSignature =mac.doFinal(s1.getBytes("utf-8")); + + String localSignatureStr = Base64.encodeBase64String(localSignature); + OpenApiLogger.logInfo("SHA256(签名内容):"+testSH); + OpenApiLogger.logInfo("s1"+s1); + + if(method.equals("POST")){ + OpenApiLogger.logInfo( "OPEN-BODY-SIG AppId=" + "\"" + appId + "\"" + ", Timestamp=" + "\"" + timestamp + "\"" + ", Nonce=" + "\"" + nonce + "\"" + ", Signature=" + "\"" + localSignatureStr + "\""); + return "OPEN-BODY-SIG AppId=" + "\"" + appId + "\"" + ", Timestamp=" + "\"" + timestamp + "\"" + ", Nonce=" + "\"" + nonce + "\"" + ", Signature=" + "\"" + localSignatureStr + "\""; + } + return "authorization=OPEN-FORM-PARAM" + "&appId=" + appId + "×tamp=" + timestamp + "&nonce=" + nonce + "&content=" + URLEncoder.encode(request.toString(), "UTF-8") + "&signature=" + URLEncoder.encode(localSignatureStr, "UTF-8"); + } catch (Exception e) { + OpenApiLogger.logError(e.getCause()); + return ""; + } + } + +} diff --git a/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/internal/util/OpenTokenUtil.java b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/internal/util/OpenTokenUtil.java new file mode 100644 index 0000000..bb5a1bc --- /dev/null +++ b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/internal/util/OpenTokenUtil.java @@ -0,0 +1,135 @@ +package com.chinaums.open.api.internal.util; + +import com.chinaums.open.api.OpenApiContext; +import com.chinaums.open.api.constants.ConfigBean; +import com.chinaums.open.api.internal.util.converter.Converter; +import com.chinaums.open.api.internal.util.converter.JsonConverter; +import com.chinaums.open.api.internal.util.http.HttpTransport; +import com.chinaums.open.api.request.TokenRequest; +import com.chinaums.open.api.response.TokenResponse; +import net.sf.json.JSONObject; +import org.apache.commons.lang3.StringUtils; + +import java.security.MessageDigest; +import java.util.Date; + +/** + * Created with IntelliJ IDEA. + * User: ZHANGWEI + * Date: 2016/12/5 + * Time: 15:41 + * 所属模块: + * 功能说明:Open Token相关 + */ +public class OpenTokenUtil { + private static final String constant_classname=OpenTokenUtil.class.getSimpleName(); + + /** + * token sha256签名算法 + * @param appId + * @param timestamp + * @param nonce + * @param appKey + * @return + */ + public static String generateSignature(String appId, String timestamp, + String nonce, String appKey) { + String plaintext = appId + timestamp + nonce + appKey; + try { + MessageDigest digest = MessageDigest.getInstance("SHA-256"); + digest.update(plaintext.getBytes()); + byte messageDigest[] = digest.digest(); + StringBuffer hexString = new StringBuffer(); + for (int i = 0; i < messageDigest.length; i++) { + String shaHex = Integer.toHexString(messageDigest[i] & 0xFF); + if (shaHex.length() < 2) { + hexString.append(0); + } + hexString.append(shaHex); + } + return hexString.toString(); + + } catch (Exception e) { + OpenApiLogger.logError(e.getCause()); + } + return ""; + } + + + + /** + * 获取token + * @param context + * @return + */ + public static TokenResponse getToken(OpenApiContext context){ + int retry = 0; + ConfigBean configBean = context.getConfigBean(); + TokenResponse acquiredToken = null; + if (isTokenValid(context.getCurrentToken()) + && !isTokenTimeout(context.getCurrentToken())) { + return context.getCurrentToken(); + } + while (retry++ < configBean.getTokenAcquireReties()) { + acquiredToken = acquireAccessToken(context); + if (null != acquiredToken) { //如果想根据请求token是否成功 用于重试 判断用if (null != acquiredToken.getAccessToken()) + break; + } else if (retry < configBean.getTokenAcquireReties()) { + try { + Thread.sleep(200); + } catch (Exception e) { + OpenApiLogger.logError(constant_classname +" 重试token申请出错:"+e.getCause()); + } + } else { + OpenApiLogger.logError(constant_classname +" 申请token超过重试次数 bye-bye"); + break; + } + } + return acquiredToken; + } + + private static TokenResponse acquireAccessToken(OpenApiContext context){ + String appId = context.getAppId(); + String appKey = context.getAppKey(); + ConfigBean configBean = context.getConfigBean(); + TokenRequest tokenRequest = new TokenRequest(appId,appKey); + JSONObject jsonObj = JSONObject.fromObject(tokenRequest); + TokenResponse tokenResponse; + String url = context.getOpenServUrl().concat(configBean.getVersion()).concat(configBean.getTokenServiceCode()); + try { + String response = HttpTransport.getInstance().doPost(configBean.isProd(),url,null,jsonObj.toString()); + if(StringUtils.isBlank(response)) throw new Exception(constant_classname+":服务提供方未返回"); + Converter converter = new JsonConverter(); + tokenResponse = converter.toResponse(response,TokenResponse.class); + tokenResponse.setEffectTime(new Date()); + tokenResponse.setTimeout(tokenResponse.getExpiresIn()); + tokenResponse.setAheadInterval(configBean.getTokenAcquireAheadInterval()); + return tokenResponse; + } catch (Exception e) { + OpenApiLogger.logError(constant_classname +" exception:"+e.getCause()); + } + return null; + } + + private static boolean isTokenValid(TokenResponse tokenBean) { + return (null != tokenBean + && org.apache.commons.lang.StringUtils.isNotBlank(tokenBean.getAccessToken()) + && null != tokenBean.getEffectTime() + && tokenBean.getTimeout() > 0 + && tokenBean.getAheadInterval() > 0 && tokenBean.getTimeout() > tokenBean + .getAheadInterval()); + } + + private static boolean isTokenTimeout(TokenResponse tokenBean) { + int elapseInterval = (int) ((new Date().getTime() - tokenBean + .getEffectTime().getTime()) / 1000); + int maxEffectiveInterval = tokenBean.getTimeout() + - tokenBean.getAheadInterval(); + boolean isTimeout = (elapseInterval > maxEffectiveInterval); + if (isTimeout) { + OpenApiLogger.logError(constant_classname +" exception:token过期了"); + } + return isTimeout; + } + +} diff --git a/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/internal/util/converter/Converter.java b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/internal/util/converter/Converter.java new file mode 100644 index 0000000..1f23918 --- /dev/null +++ b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/internal/util/converter/Converter.java @@ -0,0 +1,14 @@ +package com.chinaums.open.api.internal.util.converter; + +import com.chinaums.open.api.OpenApiException; +import com.chinaums.open.api.OpenApiResponse; + +import java.text.ParseException; + +/** + * Created by ZHANGWEI on 2016/12/2. + */ +public abstract interface Converter { + public abstract T toResponse(String paramString, Class paramClass) + throws OpenApiException, IllegalAccessException, InstantiationException, ParseException, ClassNotFoundException; +} diff --git a/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/internal/util/converter/JsonConverter.java b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/internal/util/converter/JsonConverter.java new file mode 100644 index 0000000..d0c0e2c --- /dev/null +++ b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/internal/util/converter/JsonConverter.java @@ -0,0 +1,37 @@ +package com.chinaums.open.api.internal.util.converter; + +import com.chinaums.open.api.OpenApiException; +import com.chinaums.open.api.OpenApiResponse; +import com.chinaums.open.api.internal.util.FieldUtils; +import net.sf.json.JSONObject; + +import java.lang.reflect.Field; +import java.text.ParseException; + +/** + * Created with IntelliJ IDEA. + * User: ZHANGWEI + * Date: 2016/12/2 + * Time: 14:50 + * 所属模块: + * 功能说明: + */ +public class JsonConverter implements Converter { + public T toResponse(String paramString, Class paramClass) throws OpenApiException, IllegalAccessException, InstantiationException, ParseException, ClassNotFoundException { + JSONObject jsonObj = JSONObject.fromObject(paramString); + Object bean = paramClass.newInstance(); + for (Class clazz = bean.getClass(); !clazz.getName().equals( + Object.class.getName()); clazz = clazz.getSuperclass()) { + Field[] fields = clazz.getDeclaredFields(); + for (Field field : fields) { + String fieldName = field.getName(); + String name = fieldName; + String key = fieldName; + String value = jsonObj.get(key) == null ? null : jsonObj + .get(key).toString().trim(); + FieldUtils.setFieldValueByTypeAndFormat(field, bean, value, null); + } + } + return (T) bean; + } +} diff --git a/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/internal/util/http/HttpTransport.java b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/internal/util/http/HttpTransport.java new file mode 100644 index 0000000..b069ce6 --- /dev/null +++ b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/internal/util/http/HttpTransport.java @@ -0,0 +1,160 @@ +package com.chinaums.open.api.internal.util.http; + +import com.chinaums.open.api.OpenApiContext; +import com.chinaums.open.api.constants.ConfigBean; +import com.chinaums.open.api.internal.util.OpenApiLogger; +import com.chinaums.open.api.response.TokenResponse; +import okhttp3.*; +import org.apache.commons.lang3.StringUtils; + +import static com.chinaums.open.api.internal.util.OpenBodySigUtil.generateSignature; + +/** + * Created with IntelliJ IDEA. + * User: ZHANGWEI + * Date: 2016/12/5 + * Time: 13:56 + * 所属模块: + * 功能说明:http通用处理 + */ +public class HttpTransport implements IHttpTransport { + + private static OkHttpClient okHttpClient; + private static HttpTransport httpUtils; + public static final MediaType JSON=MediaType.parse("application/json; charset=utf-8"); + + private HttpTransport() { + } + + public static synchronized HttpTransport getInstance() { + if (httpUtils == null) { + httpUtils = new HttpTransport(); + initialize(); + } + return httpUtils; + } + + private static void initialize() { + okHttpClient = new OkHttpClient(); + } + + /** + * http post + * @param isProd + * @param url + * @param token + * @param requestString + * @return + */ + public String doPost(boolean isProd,String url, String token, String requestString) throws Exception { + Request request = null; + RequestBody requestBody = RequestBody.create(JSON,requestString); + Response response; + String responseInfo = ""; + if(!isProd){ + OpenApiLogger.logInfo("url:"+url); + OpenApiLogger.logInfo("requst params:"+requestString); + } + if(StringUtils.isNotBlank(token)){ + request = new Request.Builder().url(url).addHeader("Authorization", "OPEN-ACCESS-TOKEN AccessToken=" + token).post(requestBody).build(); + }else{ + request = new Request.Builder().url(url).post(requestBody).build(); + } + try { + response = okHttpClient.newCall(request).execute(); + responseInfo = response.body().source().readUtf8(); + OpenApiLogger.logInfo("response :"+responseInfo); + return responseInfo; + } catch (Exception e) { + OpenApiLogger.logError("通讯网络异常: "+e.getStackTrace()); + throw e; + } + } + + + /** + * http post token方式 + * @param context + * @param resquest_ + * @return + * @throws Throwable + */ + public String doPost(OpenApiContext context, String resquest_) throws Exception { + String url = context.getApiServiceUrl(); + String appId=context.getAppId(); + ConfigBean configBean = context.getConfigBean(); + context.setRequest(resquest_); + Request request = null; + RequestBody requestBody = RequestBody.create(JSON,resquest_); + Response response; + String responseInfo = ""; + if(!configBean.isProd()){ + OpenApiLogger.logInfo("url:"+url); + OpenApiLogger.logInfo("requst params:"+resquest_); + + } + TokenResponse token = context.getCurrentToken(); + request = new Request.Builder().url(url). + addHeader("Authorization","OPEN-ACCESS-TOKEN AccessToken=" + token.getAccessToken()+",AppId="+appId) +// .addHeader("X-Access-Model","NEW") + .post(requestBody).build(); + OpenApiLogger.logInfo("requst header:"+"OPEN-ACCESS-TOKEN AccessToken=" + token.getAccessToken()+",AppId="+appId); + try { + response = okHttpClient.newCall(request).execute(); + OpenApiLogger.logInfo("服务端返回code:"+response.code()+" message:"+response.message()); + responseInfo = response.body().source().readUtf8(); + context.setResponse(responseInfo); + OpenApiLogger.logInfo("response :"+responseInfo); + return responseInfo; + } catch (Exception e) { + OpenApiLogger.logError("通讯网络异常: "+e.getStackTrace()); + throw e; + } + } + + + /** + * http post signature方式 + * @param context + * @param resquest_ + * @return + * @throws Throwable + */ + public String doPostSignature(OpenApiContext context, String resquest_) throws Exception { + String url = context.getApiServiceUrl(); + ConfigBean configBean = context.getConfigBean(); + context.setRequest(resquest_); + Request request = null; + RequestBody requestBody = RequestBody.create(JSON,resquest_); + Response response; + String responseInfo = ""; + if(!configBean.isProd()){ + OpenApiLogger.logInfo("url:"+url); + OpenApiLogger.logInfo("requst params:"+resquest_); + + } + String authoriztion=generateSignature(context,resquest_,"POST"); + request = new Request.Builder().url(url). + addHeader("Authorization",authoriztion) + .post(requestBody).build(); + OpenApiLogger.logInfo("requst header:"+authoriztion); + try { + response = okHttpClient.newCall(request).execute(); + OpenApiLogger.logInfo("服务端返回code:"+response.code()+" message:"+response.message()); + responseInfo = response.body().source().readUtf8(); + context.setResponse(responseInfo); + OpenApiLogger.logInfo("response :"+responseInfo); + return responseInfo; + } catch (Exception e) { + OpenApiLogger.logError("通讯网络异常: "+e.getStackTrace()); + throw e; + } + } + + public String doGet(OpenApiContext context, String request) { + String url = context.getApiServiceUrl(); + String authoriztion=generateSignature(context,request,"GET"); + OpenApiLogger.logInfo("拼接的url :"+url+"?"+authoriztion); + return url+"?"+authoriztion; + } +} diff --git a/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/internal/util/http/IHttpTransport.java b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/internal/util/http/IHttpTransport.java new file mode 100644 index 0000000..3b091ad --- /dev/null +++ b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/internal/util/http/IHttpTransport.java @@ -0,0 +1,11 @@ +package com.chinaums.open.api.internal.util.http; + +import com.chinaums.open.api.OpenApiContext; + +/** + * Created by ZHANGWEI on 2016/12/4. + */ +public interface IHttpTransport { + public abstract String doPost(boolean isDebug,String url, String token, String request) throws Throwable; + public abstract String doPost(OpenApiContext context, String request) throws Throwable; +} diff --git a/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/parser/json/ObjectJsonParser.java b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/parser/json/ObjectJsonParser.java new file mode 100644 index 0000000..3efe00c --- /dev/null +++ b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/parser/json/ObjectJsonParser.java @@ -0,0 +1,100 @@ +package com.chinaums.open.api.parser.json; + +import com.chinaums.open.api.OpenApiException; +import com.chinaums.open.api.OpenApiParser; +import com.chinaums.open.api.OpenApiRequest; +import com.chinaums.open.api.OpenApiResponse; +import com.chinaums.open.api.annotation.ApiField; +import com.chinaums.open.api.internal.util.OpenApiLogger; +import com.chinaums.open.api.internal.util.converter.Converter; +import com.chinaums.open.api.internal.util.converter.JsonConverter; +import net.sf.json.JSONObject; +import org.apache.commons.lang.StringUtils; + +import java.lang.reflect.Field; +import java.text.ParseException; + +/** + * Created with IntelliJ IDEA. + * User: ZHANGWEI + * Date: 2016/12/2 + * Time: 14:37 + * 所属模块: + * 功能说明: + */ +public class ObjectJsonParser implements OpenApiParser { + + private Class class_; + + public ObjectJsonParser(Class tClass) { + this.class_ = tClass; + } + + public T parse(String paramString) throws OpenApiException { + Converter converter = new JsonConverter(); + try { + return converter.toResponse(paramString,this.class_); + } catch (IllegalAccessException e) { + OpenApiLogger.logError(e.getCause()); + } catch (InstantiationException e) { + OpenApiLogger.logError(e.getCause()); + } catch (ParseException e) { + OpenApiLogger.logError(e.getCause()); + } catch (ClassNotFoundException e) { + OpenApiLogger.logError(e.getCause()); + } + return null; + } + + public String validRequest(OpenApiRequest openApiRequest) throws OpenApiException { + JSONObject jsonObj = JSONObject.fromObject(openApiRequest); + for (Class clazz = openApiRequest.getClass(); !clazz.getName().equals( + Object.class.getName()); clazz = clazz.getSuperclass()) { + Field[] fields = clazz.getDeclaredFields(); + for (Field field : fields) { + String fieldName = field.getName(); + String name = fieldName; + String key = fieldName; + boolean required = false; + int length = -1; + int minLength = -1; + int maxLength = -1; + if (field.isAnnotationPresent(ApiField.class)) { + ApiField requestMark = field + .getAnnotation(ApiField.class); + String markKey = requestMark.key(); + if (markKey != null && !markKey.equals("")) { + key = markKey; + } + name = requestMark.name(); + required = requestMark.required(); + length = requestMark.length(); + minLength = requestMark.minLength(); + maxLength = requestMark.maxLength(); + String value = jsonObj.get(key) == null ? null : jsonObj + .get(key).toString().trim(); + if (StringUtils.isBlank(value) && required) + throw new OpenApiException(name + "[" + key + "]不能为空"); + if (StringUtils.isNotBlank(value)) { + if (length != -1) { + if (value.length() != length) + throw new OpenApiException(name + "[" + key + + "]长度必须为:" + length); + } + if (minLength != -1) { + if (value.length() < minLength) + throw new OpenApiException(name + "[" + key + + "]长度必须大于等于:" + minLength); + } + if (maxLength != -1) { + if (value.length() > maxLength) + throw new OpenApiException(name + "[" + key + + "]长度必须小于等于:" + maxLength); + } + } + } + } + } + return jsonObj.toString(); + } +} diff --git a/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/request/AcpInstallmentRequest.java b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/request/AcpInstallmentRequest.java new file mode 100644 index 0000000..4a30401 --- /dev/null +++ b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/request/AcpInstallmentRequest.java @@ -0,0 +1,95 @@ +package com.chinaums.open.api.request; + +import com.chinaums.open.api.OpenApiRequest; +import com.chinaums.open.api.annotation.ApiField; +import com.chinaums.open.api.response.AcpInstallmentResponse; + +/** + * Created with IntelliJ IDEA. + * User: ZHANGWEI + * Date: 2017/12/12 + * Time: 14:51 + * To change this template use File | Settings | File Templates. + */ +public class AcpInstallmentRequest implements OpenApiRequest { + @ApiField(key = "merchantCode",required = true,desc = "商户号") + private String merchantCode; + @ApiField(key = "terminalCode",required = true,desc = "终端号") + private String terminalCode; + @ApiField(key = "systemTraceNum",required = true,desc = "系统跟踪号") + private String systemTraceNum; + @ApiField(key = "transactionAmount",required = true,desc = "交易金额") + private String transactionAmount; + @ApiField(key = "transactionCurrencyCode",required = true,desc = "交易币种") + private String transactionCurrencyCode; + @ApiField(key = "encryptedData",required = true,desc = "加密数据") + private String encryptedData; + + public Class responseClass() { + return AcpInstallmentResponse.class; + } + + public String apiVersion() { + return "v1"; + } + + public String apiMethodName() { + return "一次性分期"; + } + + public String serviceCode() { + return "/unionpay/acp/installment/request"; + } + + public boolean needToken() { + return true; + } + + public String getMerchantCode() { + return merchantCode; + } + + public void setMerchantCode(String merchantCode) { + this.merchantCode = merchantCode; + } + + public String getTerminalCode() { + return terminalCode; + } + + public void setTerminalCode(String terminalCode) { + this.terminalCode = terminalCode; + } + + public String getSystemTraceNum() { + return systemTraceNum; + } + + public void setSystemTraceNum(String systemTraceNum) { + this.systemTraceNum = systemTraceNum; + } + + public String getTransactionAmount() { + return transactionAmount; + } + + public void setTransactionAmount(String transactionAmount) { + this.transactionAmount = transactionAmount; + } + + public String getTransactionCurrencyCode() { + return transactionCurrencyCode; + } + + public void setTransactionCurrencyCode(String transactionCurrencyCode) { + this.transactionCurrencyCode = transactionCurrencyCode; + } + + public String getEncryptedData() { + return encryptedData; + } + + public void setEncryptedData(String encryptedData) { + this.encryptedData = encryptedData; + } +} diff --git a/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/request/BankVerifyRequest.java b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/request/BankVerifyRequest.java new file mode 100644 index 0000000..8ca01f5 --- /dev/null +++ b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/request/BankVerifyRequest.java @@ -0,0 +1,46 @@ +package com.chinaums.open.api.request; + +import com.chinaums.open.api.OpenApiRequest; +import com.chinaums.open.api.response.BankVerifyResponse; +import com.chinaums.open.api.annotation.ApiField; + +/** + * Created with IntelliJ IDEA. + * User: ZHANGWEI + * Date: 2016/12/2 + * Time: 14:17 + * 所属模块: + * 功能说明:银行卡验证 + */ +public class BankVerifyRequest implements OpenApiRequest { + + @ApiField(key = "data",required = true,desc = "json格式字符") + private Object data; + + public Class responseClass() { + return BankVerifyResponse.class; + } + + public String apiVersion() { + return "v1"; + } + + public String apiMethodName() { + return "银行卡实名认证"; + } + + public String serviceCode() { + return "/datacenter/smartverification/bankcard/verify"; + } + + public boolean needToken() { + return true; + } + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } +} diff --git a/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/request/CourtQueryRequest.java b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/request/CourtQueryRequest.java new file mode 100644 index 0000000..adfdffe --- /dev/null +++ b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/request/CourtQueryRequest.java @@ -0,0 +1,44 @@ +package com.chinaums.open.api.request; + +import com.chinaums.open.api.OpenApiRequest; +import com.chinaums.open.api.annotation.ApiField; +import com.chinaums.open.api.response.CourtQueryResponse; + +/** + * Created with IntelliJ IDEA. + * User: ZHANGWEI + * Date: 2017/6/6 + * Time: 15:21 + * 所属模块: + * 功能说明:法院信息查询 + */ +public class CourtQueryRequest implements OpenApiRequest { + @ApiField(key = "data",required = true,desc = "json格式字符") + private Object data; + public Class responseClass() { + return CourtQueryResponse.class; + } + + public String apiVersion() { + return "v1"; + } + + public String apiMethodName() { + return "法院信息查询"; + } + + public String serviceCode() { + return "/datacenter/smartverification/court/query"; + } + + public boolean needToken() { + return true; + } + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } +} diff --git a/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/request/EducationInfoVerifyRequest.java b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/request/EducationInfoVerifyRequest.java new file mode 100644 index 0000000..2f1063e --- /dev/null +++ b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/request/EducationInfoVerifyRequest.java @@ -0,0 +1,45 @@ +package com.chinaums.open.api.request; + +import com.chinaums.open.api.OpenApiRequest; +import com.chinaums.open.api.annotation.ApiField; +import com.chinaums.open.api.response.EducationInfoVerifyResponse; + +/** + * Created with IntelliJ IDEA. + * User: ZHANGWEI + * Date: 2017/5/8 + * Time: 17:02 + * 所属模块: + * 功能说明:学历信息验证 + */ +public class EducationInfoVerifyRequest implements OpenApiRequest { + @ApiField(key = "data",required = true,desc = "json格式字符") + private Object data; + public Class responseClass() { + return EducationInfoVerifyResponse.class; + } + + public String apiVersion() { + return "v1"; + } + + public String apiMethodName() { + return "学历信息验证查询"; + } + + public String serviceCode() { + return "/datacenter/smartverification/education/query"; + } + + public boolean needToken() { + return true; + } + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } +} diff --git a/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/request/FacerecognitionParamComposeRequest.java b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/request/FacerecognitionParamComposeRequest.java new file mode 100644 index 0000000..c5a181b --- /dev/null +++ b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/request/FacerecognitionParamComposeRequest.java @@ -0,0 +1,44 @@ +package com.chinaums.open.api.request; + +import com.chinaums.open.api.OpenApiRequest; +import com.chinaums.open.api.annotation.ApiField; +import com.chinaums.open.api.response.FacerecognitionParamComposeResponse; + +/** + * Created with IntelliJ IDEA. + * User: ZHANGWEI + * Date: 2017/6/5 + * Time: 14:33 + * 所属模块: + * 功能说明:人脸识别参数拼装 + */ +public class FacerecognitionParamComposeRequest implements OpenApiRequest { + @ApiField(key = "data",required = true,desc = "json格式字符") + private Object data; + public Class responseClass() { + return FacerecognitionParamComposeResponse.class; + } + + public String apiVersion() { + return "v1"; + } + + public String apiMethodName() { + return "人脸识别参数拼装"; + } + + public String serviceCode() { + return "/datacenter/smartverification/facerecognition/param/compose"; + } + + public boolean needToken() { + return true; + } + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } +} diff --git a/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/request/FacerecognitionParamResultQueryRequest.java b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/request/FacerecognitionParamResultQueryRequest.java new file mode 100644 index 0000000..7f30cf0 --- /dev/null +++ b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/request/FacerecognitionParamResultQueryRequest.java @@ -0,0 +1,44 @@ +package com.chinaums.open.api.request; + +import com.chinaums.open.api.OpenApiRequest; +import com.chinaums.open.api.annotation.ApiField; +import com.chinaums.open.api.response.FacerecognitionParamResultQueryResponse; + +/** + * Created with IntelliJ IDEA. + * User: ZHANGWEI + * Date: 2017/6/5 + * Time: 14:34 + * 所属模块: + * 功能说明:人脸识别结果查询 + */ +public class FacerecognitionParamResultQueryRequest implements OpenApiRequest { + @ApiField(key = "data",required = true,desc = "json格式字符") + private Object data; + public Class responseClass() { + return FacerecognitionParamResultQueryResponse.class; + } + + public String apiVersion() { + return "v1"; + } + + public String apiMethodName() { + return "人脸识别结果查询"; + } + + public String serviceCode() { + return "/datacenter/smartverification/facerecognition/result/query"; + } + + public boolean needToken() { + return true; + } + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } +} diff --git a/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/request/FacerecognitionParamResultSetRequest.java b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/request/FacerecognitionParamResultSetRequest.java new file mode 100644 index 0000000..bd95830 --- /dev/null +++ b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/request/FacerecognitionParamResultSetRequest.java @@ -0,0 +1,44 @@ +package com.chinaums.open.api.request; + +import com.chinaums.open.api.OpenApiRequest; +import com.chinaums.open.api.annotation.ApiField; +import com.chinaums.open.api.response.FacerecognitionParamResultSetResponse; + +/** + * Created with IntelliJ IDEA. + * User: ZHANGWEI + * Date: 2017/6/5 + * Time: 14:35 + * 所属模块: + * 功能说明:人脸识别结果获取 + */ +public class FacerecognitionParamResultSetRequest implements OpenApiRequest { + @ApiField(key = "data",required = true,desc = "json格式字符") + private Object data; + public Class responseClass() { + return FacerecognitionParamResultSetResponse.class; + } + + public String apiVersion() { + return "v1"; + } + + public String apiMethodName() { + return "人脸识别结果获取"; + } + + public String serviceCode() { + return "/datacenter/smartverification/facerecognition/result/set"; + } + + public boolean needToken() { + return true; + } + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } +} diff --git a/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/request/GenericTagQueryRequest.java b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/request/GenericTagQueryRequest.java new file mode 100644 index 0000000..13f086e --- /dev/null +++ b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/request/GenericTagQueryRequest.java @@ -0,0 +1,45 @@ +package com.chinaums.open.api.request; + +import com.chinaums.open.api.OpenApiRequest; +import com.chinaums.open.api.annotation.ApiField; +import com.chinaums.open.api.response.GenericTagQueryResponse; + +/** + * Created with IntelliJ IDEA. + * User: ZHANGWEI + * Date: 2017/6/6 + * Time: 15:18 + * 所属模块: + * 功能说明:实时标签查询 + */ +public class GenericTagQueryRequest implements OpenApiRequest{ + @ApiField(key = "data",required = true,desc = "json格式字符") + private Object data; + public Class responseClass() { + return GenericTagQueryResponse.class; + } + + public String apiVersion() { + return "v1"; + } + + public String apiMethodName() { + return "实时标签查询"; + } + + public String serviceCode() { + return "/datacenter/smartverification/tag/generic/query"; + } + + public boolean needToken() { + return true; + } + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } +} diff --git a/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/request/IdCardVerifyRequest.java b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/request/IdCardVerifyRequest.java new file mode 100644 index 0000000..aa49063 --- /dev/null +++ b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/request/IdCardVerifyRequest.java @@ -0,0 +1,46 @@ +package com.chinaums.open.api.request; + +import com.chinaums.open.api.OpenApiRequest; +import com.chinaums.open.api.annotation.ApiField; +import com.chinaums.open.api.response.IdCardVerifyResponse; + +/** + * Created with IntelliJ IDEA. + * User: ZHANGWEI + * Date: 2016/12/13 + * Time: 14:07 + * 所属模块: + * 功能说明:身份证核查 + */ +public class IdCardVerifyRequest implements OpenApiRequest{ + + @ApiField(key = "data",required = true,desc = "json格式字符") + private Object data; + public Class responseClass() { + return IdCardVerifyResponse.class; + } + + public String apiVersion() { + return "v1"; + } + + public String apiMethodName() { + return "身份证核查(政通实名认证)"; + } + + public String serviceCode() { + return "/datacenter/smartverification/idcard/verify"; + } + + public boolean needToken() { + return true; + } + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } +} diff --git a/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/request/IdCheckSimpleInfoRequest.java b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/request/IdCheckSimpleInfoRequest.java new file mode 100644 index 0000000..90597f0 --- /dev/null +++ b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/request/IdCheckSimpleInfoRequest.java @@ -0,0 +1,56 @@ +package com.chinaums.open.api.request; + +import com.chinaums.open.api.OpenApiRequest; +import com.chinaums.open.api.annotation.ApiField; +import com.chinaums.open.api.response.IdCheckSimpleInfoResponse; + +/** + * Created with IntelliJ IDEA. + * User: ZHANGWEI + * Date: 2017/2/21 + * Time: 14:49 + * 所属模块: + * 功能说明:简项公民身份证信息核查请求报文 + */ +public class IdCheckSimpleInfoRequest implements OpenApiRequest { + + @ApiField(name = "certifId",required = true ,desc = "公民身份号码") + private String certifId; + @ApiField(name = "name",required = true ,desc = "姓名") + private String name; + public Class responseClass() { + return IdCheckSimpleInfoResponse.class; + } + + public String apiVersion() { + return "v1"; + } + + public String apiMethodName() { + return "身份证验证"; + } + + public String serviceCode() { + return "/creditcheck/idcheck/simpleinfo"; + } + + public boolean needToken() { + return true; + } + + public String getCertifId() { + return certifId; + } + + public void setCertifId(String certifId) { + this.certifId = certifId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/request/Mobile3factorVerifyRequest.java b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/request/Mobile3factorVerifyRequest.java new file mode 100644 index 0000000..5f6cac2 --- /dev/null +++ b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/request/Mobile3factorVerifyRequest.java @@ -0,0 +1,47 @@ +package com.chinaums.open.api.request; + +import com.chinaums.open.api.OpenApiRequest; +import com.chinaums.open.api.annotation.ApiField; +import com.chinaums.open.api.response.Mobile3factorVerifyResponse; + +/** + * Created with IntelliJ IDEA. + * User: ZHANGWEI + * Date: 2016/12/13 + * Time: 14:11 + * 所属模块: + * 功能说明:运营商三要素验证 + */ +public class Mobile3factorVerifyRequest implements OpenApiRequest{ + + @ApiField(key = "data",required = true,desc = "json格式字符") + private Object data; + + public Class responseClass() { + return Mobile3factorVerifyResponse.class; + } + + public String apiVersion() { + return "v1"; + } + + public String apiMethodName() { + return "运营商三要素验证"; + } + + public String serviceCode() { + return "/datacenter/smartverification/mobile/3factor/verify"; + } + + public boolean needToken() { + return true; + } + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } +} diff --git a/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/request/NyBankCardTagRequest.java b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/request/NyBankCardTagRequest.java new file mode 100644 index 0000000..8ce65c6 --- /dev/null +++ b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/request/NyBankCardTagRequest.java @@ -0,0 +1,46 @@ +package com.chinaums.open.api.request; + +import com.chinaums.open.api.OpenApiRequest; +import com.chinaums.open.api.annotation.ApiField; +import com.chinaums.open.api.response.NyBankCardTagResponse; + +/** + * Created with IntelliJ IDEA. + * User: ZHANGWEI + * Date: 2017/3/21 + * Time: 18:07 + * 所属模块: + * 功能说明:楠云银行卡标签提取 + */ +public class NyBankCardTagRequest implements OpenApiRequest { + @ApiField(key = "data",required = true,desc = "json格式字符") + private Object data; + + public Class responseClass() { + return NyBankCardTagResponse.class; + } + + public String apiVersion() { + return "v1"; + } + + public String apiMethodName() { + return "楠云银行卡标签提取查询"; + } + + public String serviceCode() { + return "/datacenter/smartverification/bankcardtag/query"; + } + + public boolean needToken() { + return true; + } + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } +} diff --git a/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/request/RealNameVerifyRequest.java b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/request/RealNameVerifyRequest.java new file mode 100644 index 0000000..e6b9506 --- /dev/null +++ b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/request/RealNameVerifyRequest.java @@ -0,0 +1,46 @@ +package com.chinaums.open.api.request; + +import com.chinaums.open.api.OpenApiRequest; +import com.chinaums.open.api.response.RealNameVerifyResponse; +import com.chinaums.open.api.annotation.ApiField; + +/** + * Created with IntelliJ IDEA. + * User: ZHANGWEI + * Date: 2016/12/6 + * Time: 15:23 + * 所属模块: + * 功能说明:实名认证 + */ +public class RealNameVerifyRequest implements OpenApiRequest { + @ApiField(key = "data",required = true,desc = "json格式字符") + private Object data; + + public Class responseClass() { + return RealNameVerifyResponse.class; + } + + public String apiVersion() { + return "v1"; + } + + public String apiMethodName() { + return "实名认证"; + } + + public String serviceCode() { + return "/datacenter/smartverification/realname/verify"; + } + + public boolean needToken() { + return true; + } + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } +} diff --git a/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/request/TokenRequest.java b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/request/TokenRequest.java new file mode 100644 index 0000000..0476259 --- /dev/null +++ b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/request/TokenRequest.java @@ -0,0 +1,111 @@ +package com.chinaums.open.api.request; + +import com.chinaums.open.api.OpenApiRequest; +import com.chinaums.open.api.annotation.ApiField; +import com.chinaums.open.api.internal.util.OpenTokenUtil; +import com.chinaums.open.api.response.TokenResponse; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.UUID; + +/** + * Created with IntelliJ IDEA. + * User: ZHANGWEI + * Date: 2016/12/5 + * Time: 15:42 + * 所属模块: + * 功能说明:token + */ +public class TokenRequest implements OpenApiRequest { + @ApiField(name = "appId",required = true ,desc = "开放平台开发者id") + private String appId; + @ApiField(name = "appKey",required = true,desc = "开放平台开发者key") + private String appKey; + @ApiField(name = "时间戳",required = true) + private String timestamp; + @ApiField(name = "随机数",required = true) + private String nonce; + @ApiField(name = "加密方法",required = true) + private String signMethod; + @ApiField(name = "SHA256签名字符",required = true) + private String signature; + + public Class responseClass() { + return TokenResponse.class; + } + + public String apiVersion() { + return "v2"; + } //新入驻商户需要使用v2方式 + + public String apiMethodName() { + return "获取开放平台token"; + } + + public String serviceCode() { + return "/token/access"; + } + + public boolean needToken() { + return false; + } + + public TokenRequest(String appId, String appKey) { + this.appId = appId; + this.appKey = appKey; + this.timestamp = new SimpleDateFormat("yyyyMMddHHmmss") + .format(new Date()); + this.nonce = UUID.randomUUID().toString(); + this.signMethod = "SHA256"; + this.signature = OpenTokenUtil.generateSignature(getAppId(),getTimestamp(),getNonce(),getAppKey()); + } + + public String getAppId() { + return appId; + } + + public void setAppId(String appId) { + this.appId = appId; + } + + public String getAppKey() { + return appKey; + } + + public void setAppKey(String appKey) { + this.appKey = appKey; + } + + public String getTimestamp() { + return timestamp; + } + + public void setTimestamp(String timestamp) { + this.timestamp = timestamp; + } + + public String getNonce() { + return nonce; + } + + public void setNonce(String nonce) { + this.nonce = nonce; + } + + public String getSignMethod() { + return signMethod; + } + + public void setSignMethod(String signMethod) { + this.signMethod = signMethod; + } + + public String getSignature() { + return signature; + } + + public void setSignature(String signature) { + this.signature = signature; + } +} diff --git a/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/request/YsBankCardTagRequest.java b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/request/YsBankCardTagRequest.java new file mode 100644 index 0000000..7e55ef8 --- /dev/null +++ b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/request/YsBankCardTagRequest.java @@ -0,0 +1,46 @@ +package com.chinaums.open.api.request; + +import com.chinaums.open.api.OpenApiRequest; +import com.chinaums.open.api.annotation.ApiField; +import com.chinaums.open.api.response.YsBankCardTagResponse; + +/** + * Created with IntelliJ IDEA. + * User: ZHANGWEI + * Date: 2017/5/3 + * Time: 18:21 + * 所属模块: + * 功能说明:盐商科技用户标签查询 + */ +public class YsBankCardTagRequest implements OpenApiRequest { + + @ApiField(key = "data",required = true,desc = "json格式字符") + private Object data; + + public Class responseClass() { + return YsBankCardTagResponse.class; + } + + public String apiVersion() { + return "v1"; + } + + public String apiMethodName() { + return "盐商科技用户标签查询"; + } + + public String serviceCode() { + return "/datacenter/smartverification/ysbankcardtag/query"; + } + + public boolean needToken() { + return true; + } + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } +} diff --git a/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/response/AcpInstallmentResponse.java b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/response/AcpInstallmentResponse.java new file mode 100644 index 0000000..5425cc4 --- /dev/null +++ b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/response/AcpInstallmentResponse.java @@ -0,0 +1,89 @@ +package com.chinaums.open.api.response; + +import com.chinaums.open.api.OpenApiResponse; + +/** + * Created with IntelliJ IDEA. + * User: ZHANGWEI + * Date: 2017/12/12 + * Time: 14:51 + * To change this template use File | Settings | File Templates. + */ +public class AcpInstallmentResponse extends OpenApiResponse { + /** + * 错误代码 + */ + private String errCode; + /** + * 错误信息 + */ + private String errInfo; + /** + * 交易时间 HHmmss + */ + private String transactionTime; + /** + * 交易日期 MMdd + */ + private String transactionDate; + /** + * 结算日期 MMdd + */ + private String settlementDate; + /** + * 检索参考号 + */ + private String retrievalRefNum; + + @Override + public String getErrCode() { + return errCode; + } + + @Override + public void setErrCode(String errCode) { + this.errCode = errCode; + } + + @Override + public String getErrInfo() { + return errInfo; + } + + @Override + public void setErrInfo(String errInfo) { + this.errInfo = errInfo; + } + + public String getTransactionTime() { + return transactionTime; + } + + public void setTransactionTime(String transactionTime) { + this.transactionTime = transactionTime; + } + + public String getTransactionDate() { + return transactionDate; + } + + public void setTransactionDate(String transactionDate) { + this.transactionDate = transactionDate; + } + + public String getSettlementDate() { + return settlementDate; + } + + public void setSettlementDate(String settlementDate) { + this.settlementDate = settlementDate; + } + + public String getRetrievalRefNum() { + return retrievalRefNum; + } + + public void setRetrievalRefNum(String retrievalRefNum) { + this.retrievalRefNum = retrievalRefNum; + } +} diff --git a/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/response/BankVerifyResponse.java b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/response/BankVerifyResponse.java new file mode 100644 index 0000000..096d855 --- /dev/null +++ b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/response/BankVerifyResponse.java @@ -0,0 +1,40 @@ +package com.chinaums.open.api.response; + +import com.chinaums.open.api.OpenApiResponse; + +/** + * Created with IntelliJ IDEA. + * User: ZHANGWEI + * Date: 2016/12/2 + * Time: 14:14 + * 所属模块: + * 功能说明:银行卡验证 + */ +public class BankVerifyResponse extends OpenApiResponse { + private String resultCode; + private String resultInfo; + private Object data; + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + + public String getResultCode() { + return resultCode; + } + + public void setResultCode(String resultCode) { + this.resultCode = resultCode; + } + + public String getResultInfo() { + return resultInfo; + } + + public void setResultInfo(String resultInfo) { + this.resultInfo = resultInfo; + } + +} diff --git a/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/response/CourtQueryResponse.java b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/response/CourtQueryResponse.java new file mode 100644 index 0000000..61861a4 --- /dev/null +++ b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/response/CourtQueryResponse.java @@ -0,0 +1,42 @@ +package com.chinaums.open.api.response; + +import com.chinaums.open.api.OpenApiResponse; + +/** + * Created with IntelliJ IDEA. + * User: ZHANGWEI + * Date: 2017/6/6 + * Time: 15:21 + * 所属模块: + * 功能说明:法院信息查询 + */ +public class CourtQueryResponse extends OpenApiResponse { + private String resultCode; + private String resultInfo; + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + private Object data; + + public String getResultCode() { + return resultCode; + } + + public void setResultCode(String resultCode) { + this.resultCode = resultCode; + } + + public String getResultInfo() { + return resultInfo; + } + + public void setResultInfo(String resultInfo) { + this.resultInfo = resultInfo; + } +} diff --git a/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/response/EducationInfoVerifyResponse.java b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/response/EducationInfoVerifyResponse.java new file mode 100644 index 0000000..7b80add --- /dev/null +++ b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/response/EducationInfoVerifyResponse.java @@ -0,0 +1,42 @@ +package com.chinaums.open.api.response; + +import com.chinaums.open.api.OpenApiResponse; + +/** + * Created with IntelliJ IDEA. + * User: ZHANGWEI + * Date: 2017/5/8 + * Time: 17:03 + * 所属模块: + * 功能说明:学历信息验证 + */ +public class EducationInfoVerifyResponse extends OpenApiResponse { + private String resultCode; + private String resultInfo; + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + private Object data; + + public String getResultCode() { + return resultCode; + } + + public void setResultCode(String resultCode) { + this.resultCode = resultCode; + } + + public String getResultInfo() { + return resultInfo; + } + + public void setResultInfo(String resultInfo) { + this.resultInfo = resultInfo; + } +} \ No newline at end of file diff --git a/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/response/FacerecognitionParamComposeResponse.java b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/response/FacerecognitionParamComposeResponse.java new file mode 100644 index 0000000..e9b5b76 --- /dev/null +++ b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/response/FacerecognitionParamComposeResponse.java @@ -0,0 +1,42 @@ +package com.chinaums.open.api.response; + +import com.chinaums.open.api.OpenApiResponse; + +/** + * Created with IntelliJ IDEA. + * User: ZHANGWEI + * Date: 2017/6/5 + * Time: 14:34 + * 所属模块: + * 功能说明:人脸识别参数拼装 + */ +public class FacerecognitionParamComposeResponse extends OpenApiResponse { + private String resultCode; + private String resultInfo; + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + private Object data; + + public String getResultCode() { + return resultCode; + } + + public void setResultCode(String resultCode) { + this.resultCode = resultCode; + } + + public String getResultInfo() { + return resultInfo; + } + + public void setResultInfo(String resultInfo) { + this.resultInfo = resultInfo; + } +} diff --git a/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/response/FacerecognitionParamResultQueryResponse.java b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/response/FacerecognitionParamResultQueryResponse.java new file mode 100644 index 0000000..3aad3f0 --- /dev/null +++ b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/response/FacerecognitionParamResultQueryResponse.java @@ -0,0 +1,42 @@ +package com.chinaums.open.api.response; + +import com.chinaums.open.api.OpenApiResponse; + +/** + * Created with IntelliJ IDEA. + * User: ZHANGWEI + * Date: 2017/6/5 + * Time: 14:34 + * 所属模块: + * 功能说明:人脸识别结果查询 + */ +public class FacerecognitionParamResultQueryResponse extends OpenApiResponse { + private String resultCode; + private String resultInfo; + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + private Object data; + + public String getResultCode() { + return resultCode; + } + + public void setResultCode(String resultCode) { + this.resultCode = resultCode; + } + + public String getResultInfo() { + return resultInfo; + } + + public void setResultInfo(String resultInfo) { + this.resultInfo = resultInfo; + } +} diff --git a/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/response/FacerecognitionParamResultSetResponse.java b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/response/FacerecognitionParamResultSetResponse.java new file mode 100644 index 0000000..ce081b9 --- /dev/null +++ b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/response/FacerecognitionParamResultSetResponse.java @@ -0,0 +1,42 @@ +package com.chinaums.open.api.response; + +import com.chinaums.open.api.OpenApiResponse; + +/** + * Created with IntelliJ IDEA. + * User: ZHANGWEI + * Date: 2017/6/5 + * Time: 14:35 + * 所属模块: + * 功能说明:人脸识别结果获取 + */ +public class FacerecognitionParamResultSetResponse extends OpenApiResponse { + private String resultCode; + private String resultInfo; + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + private Object data; + + public String getResultCode() { + return resultCode; + } + + public void setResultCode(String resultCode) { + this.resultCode = resultCode; + } + + public String getResultInfo() { + return resultInfo; + } + + public void setResultInfo(String resultInfo) { + this.resultInfo = resultInfo; + } +} \ No newline at end of file diff --git a/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/response/GenericTagQueryResponse.java b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/response/GenericTagQueryResponse.java new file mode 100644 index 0000000..67e9ff6 --- /dev/null +++ b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/response/GenericTagQueryResponse.java @@ -0,0 +1,42 @@ +package com.chinaums.open.api.response; + +import com.chinaums.open.api.OpenApiResponse; + +/** + * Created with IntelliJ IDEA. + * User: ZHANGWEI + * Date: 2017/6/6 + * Time: 15:18 + * 所属模块: + * 功能说明:实时标签查询 + */ +public class GenericTagQueryResponse extends OpenApiResponse { + private String resultCode; + private String resultInfo; + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + private Object data; + + public String getResultCode() { + return resultCode; + } + + public void setResultCode(String resultCode) { + this.resultCode = resultCode; + } + + public String getResultInfo() { + return resultInfo; + } + + public void setResultInfo(String resultInfo) { + this.resultInfo = resultInfo; + } +} diff --git a/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/response/IdCardVerifyResponse.java b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/response/IdCardVerifyResponse.java new file mode 100644 index 0000000..c1f0b2c --- /dev/null +++ b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/response/IdCardVerifyResponse.java @@ -0,0 +1,42 @@ +package com.chinaums.open.api.response; + +import com.chinaums.open.api.OpenApiResponse; + +/** + * Created with IntelliJ IDEA. + * User: ZHANGWEI + * Date: 2016/12/13 + * Time: 14:06 + * 所属模块: + * 功能说明:身份证核查 + */ +public class IdCardVerifyResponse extends OpenApiResponse { + private String resultCode; + private String resultInfo; + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + private Object data; + + public String getResultCode() { + return resultCode; + } + + public void setResultCode(String resultCode) { + this.resultCode = resultCode; + } + + public String getResultInfo() { + return resultInfo; + } + + public void setResultInfo(String resultInfo) { + this.resultInfo = resultInfo; + } +} diff --git a/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/response/IdCheckSimpleInfoResponse.java b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/response/IdCheckSimpleInfoResponse.java new file mode 100644 index 0000000..513f4de --- /dev/null +++ b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/response/IdCheckSimpleInfoResponse.java @@ -0,0 +1,52 @@ +package com.chinaums.open.api.response; + +import com.chinaums.open.api.OpenApiResponse; + +/** + * Created with IntelliJ IDEA. + * User: ZHANGWEI + * Date: 2017/2/21 + * Time: 14:49 + * 所属模块: + * 功能说明:核查平台-身份证验证 + */ +public class IdCheckSimpleInfoResponse extends OpenApiResponse { + /** + * 公民身份号码核查结果 + */ + private String resultCertifId; + + /** + * 姓名核查结果 + */ + private String resultName; + + /** + * base64编码的照片 + */ + private String photo; + + public String getResultCertifId() { + return resultCertifId; + } + + public void setResultCertifId(String resultCertifId) { + this.resultCertifId = resultCertifId; + } + + public String getResultName() { + return resultName; + } + + public void setResultName(String resultName) { + this.resultName = resultName; + } + + public String getPhoto() { + return photo; + } + + public void setPhoto(String photo) { + this.photo = photo; + } +} diff --git a/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/response/Mobile3factorVerifyResponse.java b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/response/Mobile3factorVerifyResponse.java new file mode 100644 index 0000000..cd5d418 --- /dev/null +++ b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/response/Mobile3factorVerifyResponse.java @@ -0,0 +1,42 @@ +package com.chinaums.open.api.response; + +import com.chinaums.open.api.OpenApiResponse; + +/** + * Created with IntelliJ IDEA. + * User: ZHANGWEI + * Date: 2016/12/13 + * Time: 16:58 + * 所属模块: + * 功能说明:运营商三要素验证 + */ +public class Mobile3factorVerifyResponse extends OpenApiResponse { + private String resultCode; + private String resultInfo; + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + private Object data; + + public String getResultCode() { + return resultCode; + } + + public void setResultCode(String resultCode) { + this.resultCode = resultCode; + } + + public String getResultInfo() { + return resultInfo; + } + + public void setResultInfo(String resultInfo) { + this.resultInfo = resultInfo; + } +} diff --git a/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/response/NyBankCardTagResponse.java b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/response/NyBankCardTagResponse.java new file mode 100644 index 0000000..5bf3e9e --- /dev/null +++ b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/response/NyBankCardTagResponse.java @@ -0,0 +1,42 @@ +package com.chinaums.open.api.response; + +import com.chinaums.open.api.OpenApiResponse; + +/** + * Created with IntelliJ IDEA. + * User: ZHANGWEI + * Date: 2017/3/21 + * Time: 18:07 + * 所属模块: + * 功能说明:楠云银行卡标签提取 + */ +public class NyBankCardTagResponse extends OpenApiResponse { + private String resultCode; + private String resultInfo; + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + private Object data; + + public String getResultCode() { + return resultCode; + } + + public void setResultCode(String resultCode) { + this.resultCode = resultCode; + } + + public String getResultInfo() { + return resultInfo; + } + + public void setResultInfo(String resultInfo) { + this.resultInfo = resultInfo; + } +} diff --git a/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/response/RealNameVerifyResponse.java b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/response/RealNameVerifyResponse.java new file mode 100644 index 0000000..296ca75 --- /dev/null +++ b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/response/RealNameVerifyResponse.java @@ -0,0 +1,42 @@ +package com.chinaums.open.api.response; + +import com.chinaums.open.api.OpenApiResponse; + +/** + * Created with IntelliJ IDEA. + * User: ZHANGWEI + * Date: 2016/12/6 + * Time: 15:23 + * 所属模块: + * 功能说明: + */ +public class RealNameVerifyResponse extends OpenApiResponse{ + private String resultCode; + private String resultInfo; + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + private Object data; + + public String getResultCode() { + return resultCode; + } + + public void setResultCode(String resultCode) { + this.resultCode = resultCode; + } + + public String getResultInfo() { + return resultInfo; + } + + public void setResultInfo(String resultInfo) { + this.resultInfo = resultInfo; + } +} diff --git a/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/response/TokenResponse.java b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/response/TokenResponse.java new file mode 100644 index 0000000..3a7365e --- /dev/null +++ b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/response/TokenResponse.java @@ -0,0 +1,78 @@ +package com.chinaums.open.api.response; + +import com.chinaums.open.api.OpenApiResponse; + +import java.util.Date; + +/** + * Created with IntelliJ IDEA. + * User: ZHANGWEI + * Date: 2016/12/5 + * Time: 15:42 + * 所属模块: + * 功能说明: + */ +public class TokenResponse extends OpenApiResponse{ + /** + * 服务授权令牌 + */ + private String accessToken; + /** + * 有效期 + */ + private int expiresIn; + /** + * 令牌开始生效的时间,以收到时间为准 + */ + private Date effectTime; + + /** + * 令牌的过期时间,单位为秒,由数据中心返回 + */ + private int timeout; + + /** + * 在令牌过期前,要提前重新申请 + */ + private int aheadInterval; + + public String getAccessToken() { + return accessToken; + } + + public void setAccessToken(String accessToken) { + this.accessToken = accessToken; + } + + public int getExpiresIn() { + return expiresIn; + } + + public void setExpiresIn(int expiresIn) { + this.expiresIn = expiresIn; + } + + public Date getEffectTime() { + return effectTime; + } + + public void setEffectTime(Date effectTime) { + this.effectTime = effectTime; + } + + public int getTimeout() { + return timeout; + } + + public void setTimeout(int timeout) { + this.timeout = timeout; + } + + public int getAheadInterval() { + return aheadInterval; + } + + public void setAheadInterval(int aheadInterval) { + this.aheadInterval = aheadInterval; + } +} diff --git a/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/response/YsBankCardTagResponse.java b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/response/YsBankCardTagResponse.java new file mode 100644 index 0000000..afb94eb --- /dev/null +++ b/extLib/chinaumsdk/src/main/java/com/chinaums/open/api/response/YsBankCardTagResponse.java @@ -0,0 +1,42 @@ +package com.chinaums.open.api.response; + +import com.chinaums.open.api.OpenApiResponse; + +/** + * Created with IntelliJ IDEA. + * User: ZHANGWEI + * Date: 2017/5/3 + * Time: 18:21 + * 所属模块: + * 功能说明:盐商科技用户标签查询 + */ +public class YsBankCardTagResponse extends OpenApiResponse { + private String resultCode; + private String resultInfo; + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + private Object data; + + public String getResultCode() { + return resultCode; + } + + public void setResultCode(String resultCode) { + this.resultCode = resultCode; + } + + public String getResultInfo() { + return resultInfo; + } + + public void setResultInfo(String resultInfo) { + this.resultInfo = resultInfo; + } +} diff --git a/extLib/chinaumsdk/src/test/java/com/chinaums/open/api/internal/util/http/HttpTransportTest.java b/extLib/chinaumsdk/src/test/java/com/chinaums/open/api/internal/util/http/HttpTransportTest.java new file mode 100644 index 0000000..7cd2346 --- /dev/null +++ b/extLib/chinaumsdk/src/test/java/com/chinaums/open/api/internal/util/http/HttpTransportTest.java @@ -0,0 +1,49 @@ +package com.chinaums.open.api.internal.util.http; + +import com.chinaums.open.api.OpenApiCache; +import com.chinaums.open.api.OpenApiContext; +import com.chinaums.open.api.constants.ConfigBean; +import org.junit.Test; + +import java.util.HashMap; +import java.util.UUID; + +import static org.junit.Assert.*; + +/** + * Project:TODO ADD PROJECT NAME + * Modify Information: + * ================================================================ + * Author Date Description + * ------------ ---------- -------------------------------- + * wmshen 2022/10/20 TODO: + * ================================================================ + * Copyright (c) 银联商务股份有限公司 www.chinaums.com + */ +public class HttpTransportTest { + + @Test + public void doGet() throws Exception { + + String url = "https://test-api-open.chinaums.com/v1/netpay/trade/h5-pay"; + //开发者ID + String appId = "10037e6f6a4e6da4016a670fd4530012"; + //开发者秘钥 + String appKey = "f7a74b6c02ae4e1e94aaba311c04acf2"; + //实例化客户端 + ConfigBean configBean = new ConfigBean(); + OpenApiContext context = new OpenApiContext(); + String request = "{\"tid\":\"88880001\",\"totalAmount\":\"1\",\"mid\":\"898310148160568\",\"merOrderId\":\"wf12421741298471284\"}"; + context.setStartTime(System.currentTimeMillis()); + context.setRequestId(UUID.randomUUID().toString().replace("-", "")); + context.setOpenServUrl(url.split("/v")[0].concat("/")); + context.setApiServiceUrl(url); + context.setVersion(url.split("/")[3]); + context.setAppId(appId); + context.setAppKey(appKey); + context.setConfigBean(configBean); + context.setServiceCode(url.split("/v")[1].substring(1)); + OpenApiCache.getCurrentToken(context); + System.out.println(HttpTransport.getInstance().doGet(context, request)); + } +} \ No newline at end of file diff --git a/extLib/chinaumsdk/src/test/java/com/chinaums/test/BankCardTagTestCase.java b/extLib/chinaumsdk/src/test/java/com/chinaums/test/BankCardTagTestCase.java new file mode 100644 index 0000000..6c3171a --- /dev/null +++ b/extLib/chinaumsdk/src/test/java/com/chinaums/test/BankCardTagTestCase.java @@ -0,0 +1,49 @@ +package com.chinaums.test; + +import com.chinaums.open.api.DefaultOpenApiClient; +import com.chinaums.open.api.OpenApiClient; +import com.chinaums.open.api.OpenApiException; +import com.chinaums.open.api.request.NyBankCardTagRequest; +import com.chinaums.open.api.request.YsBankCardTagRequest; +import com.chinaums.open.api.response.NyBankCardTagResponse; +import com.chinaums.open.api.response.YsBankCardTagResponse; + +/** + * Created with IntelliJ IDEA. + * User: ZHANGWEI + * Date: 2017/3/21 + * Time: 19:08 + * 所属模块: + * 功能说明:标签查询相关testcase + */ +public class BankCardTagTestCase { + @org.junit.Test + public void testNyBankCardTag() throws OpenApiException { + String url = "https://api-mop.chinaums.com/"; + String appId = ""; + String appKey = ""; + OpenApiClient openApiClient = new DefaultOpenApiClient(url,appId,appKey); + NyBankCardTagRequest nyBankCardTagRequest = new NyBankCardTagRequest(); + nyBankCardTagRequest.setData("{\"userNo\":\"\",\"priAcctNo\":\"\",\"riskflag\":\"1\"}"); + NyBankCardTagResponse nyBankCardTagResponse; + nyBankCardTagResponse = openApiClient.execute(nyBankCardTagRequest); + System.out.println(nyBankCardTagResponse.getData()); + System.out.println(nyBankCardTagResponse.getResultCode()); + System.out.println(nyBankCardTagResponse.getResultInfo()); + } + + @org.junit.Test + public void testYsBankCardTag() throws OpenApiException { + String url = "https://api-mop.chinaums.com/"; + String appId = ""; + String appKey = ""; + OpenApiClient openApiClient = new DefaultOpenApiClient(url,appId,appKey); + YsBankCardTagRequest ysBankCardTagRequest = new YsBankCardTagRequest(); + ysBankCardTagRequest.setData("{\"phoneNo\":\"\",\"priAcctNo\":\"\"}"); + YsBankCardTagResponse ysBankCardTagResponse; + ysBankCardTagResponse = openApiClient.execute(ysBankCardTagRequest); + System.out.println(ysBankCardTagResponse.getData()); + System.out.println(ysBankCardTagResponse.getResultCode()); + System.out.println(ysBankCardTagResponse.getResultInfo()); + } +} diff --git a/extLib/chinaumsdk/src/test/java/com/chinaums/test/FacerecognitionTest.java b/extLib/chinaumsdk/src/test/java/com/chinaums/test/FacerecognitionTest.java new file mode 100644 index 0000000..6965f73 --- /dev/null +++ b/extLib/chinaumsdk/src/test/java/com/chinaums/test/FacerecognitionTest.java @@ -0,0 +1,57 @@ +package com.chinaums.test; + +import com.chinaums.open.api.DefaultOpenApiClient; +import com.chinaums.open.api.OpenApiClient; +import com.chinaums.open.api.OpenApiException; +import com.chinaums.open.api.request.FacerecognitionParamComposeRequest; +import com.chinaums.open.api.request.FacerecognitionParamResultQueryRequest; +import com.chinaums.open.api.request.FacerecognitionParamResultSetRequest; +import com.chinaums.open.api.response.FacerecognitionParamComposeResponse; +import com.chinaums.open.api.response.FacerecognitionParamResultQueryResponse; +import com.chinaums.open.api.response.FacerecognitionParamResultSetResponse; + +/** + * Created with IntelliJ IDEA. + * User: ZHANGWEI + * Date: 2017/6/5 + * Time: 14:41 + * 所属模块: + * 功能说明:人脸识别相关测试案例 + */ +public class FacerecognitionTest { + @org.junit.Test + public void testFacerecognitionParamCompose() throws OpenApiException { + String url = "https://api-mop.chinaums.com/"; + String appId = ""; + String appKey = ""; + OpenApiClient openApiClient = new DefaultOpenApiClient(url,appId,appKey); + FacerecognitionParamComposeRequest facerecognitionParamComposeRequest = new FacerecognitionParamComposeRequest(); + facerecognitionParamComposeRequest.setData("{\"certNo\" : \"\",\"idCardUserName\" : \"\",\"orderId\" : '',\"orderDate\" : '',\"deviceID\" : '',\"deviceOs\" : ''}"); + FacerecognitionParamComposeResponse response = openApiClient.execute(facerecognitionParamComposeRequest); + System.out.println(response.getErrCode()); + } + + @org.junit.Test + public void testFacerecognitionParamResultQuery() throws OpenApiException { + String url = "https://api-mop.chinaums.com/"; + String appId = ""; + String appKey = ""; + OpenApiClient openApiClient = new DefaultOpenApiClient(url,appId,appKey); + FacerecognitionParamResultQueryRequest request = new FacerecognitionParamResultQueryRequest(); + request.setData("{\"orderId\":\"\",\"deviceID\":\"\",\"orderDate\":\"\"}"); + FacerecognitionParamResultQueryResponse response = openApiClient.execute(request); + System.out.println(response.getErrCode()); + } + + @org.junit.Test + public void testFacerecognitionParamResultSet() throws OpenApiException { + String url = "https://api-mop.chinaums.com/"; + String appId = ""; + String appKey = ""; + OpenApiClient openApiClient = new DefaultOpenApiClient(url,appId,appKey); + FacerecognitionParamResultSetRequest request = new FacerecognitionParamResultSetRequest(); + request.setData("{\"signature\":\"\",\"merNo\":\"\",\"respData\":\"\"}"); + FacerecognitionParamResultSetResponse response = openApiClient.execute(request); + System.out.println(response.getErrCode()); + } +} diff --git a/extLib/chinaumsdk/src/test/java/com/chinaums/test/IdCheckSimpleInfoTestCase.java b/extLib/chinaumsdk/src/test/java/com/chinaums/test/IdCheckSimpleInfoTestCase.java new file mode 100644 index 0000000..05723e3 --- /dev/null +++ b/extLib/chinaumsdk/src/test/java/com/chinaums/test/IdCheckSimpleInfoTestCase.java @@ -0,0 +1,63 @@ +package com.chinaums.test; + +import com.chinaums.open.api.DefaultOpenApiClient; +import com.chinaums.open.api.OpenApiClient; +import com.chinaums.open.api.OpenApiException; +import com.chinaums.open.api.request.EducationInfoVerifyRequest; +import com.chinaums.open.api.request.IdCheckSimpleInfoRequest; +import com.chinaums.open.api.response.EducationInfoVerifyResponse; +import com.chinaums.open.api.response.IdCheckSimpleInfoResponse; + +/** + * Created with IntelliJ IDEA. + * User: ZHANGWEI + * Date: 2017/2/21 + * Time: 15:00 + * 所属模块: + * 功能说明: + */ +public class IdCheckSimpleInfoTestCase { + @org.junit.Test + public void testIdCheck() throws OpenApiException { + String url = "https://api-mop.chinaums.com/"; + String appId = ""; + String appKey = ""; + OpenApiClient openApiClient = new DefaultOpenApiClient(url,appId,appKey); + IdCheckSimpleInfoRequest request = new IdCheckSimpleInfoRequest(); + request.setCertifId(""); + request.setName(""); + IdCheckSimpleInfoResponse response = openApiClient.execute(request); + System.out.println(response.getErrCode()); + } + + + @org.junit.Test + public void testEducation() throws OpenApiException { + String url = "https://api-mop.chinaums.com/"; + String appId = ""; + String appKey = ""; + OpenApiClient openApiClient = new DefaultOpenApiClient(url,appId,appKey); + EducationInfoVerifyRequest ysBankCardTagRequest = new EducationInfoVerifyRequest(); + ysBankCardTagRequest.setData("{\"certNo\":\"\",\"name\":\"\"}"); + EducationInfoVerifyResponse ysBankCardTagResponse; + ysBankCardTagResponse = openApiClient.execute(ysBankCardTagRequest); + System.out.println(ysBankCardTagResponse.getData()); + System.out.println(ysBankCardTagResponse.getResultCode()); + System.out.println(ysBankCardTagResponse.getResultInfo()); + } + + @org.junit.Test + public void testface001() throws OpenApiException { + String url = "https://api-mop.chinaums.com/"; + String appId = ""; + String appKey = ""; + OpenApiClient openApiClient = new DefaultOpenApiClient(url,appId,appKey); + EducationInfoVerifyRequest ysBankCardTagRequest = new EducationInfoVerifyRequest(); + ysBankCardTagRequest.setData("{\"orderId\":\"\",\"deviceID\":\"\"}"); + EducationInfoVerifyResponse ysBankCardTagResponse; + ysBankCardTagResponse = openApiClient.execute(ysBankCardTagRequest); + System.out.println(ysBankCardTagResponse.getData()); + System.out.println(ysBankCardTagResponse.getResultCode()); + System.out.println(ysBankCardTagResponse.getResultInfo()); + } +} diff --git a/extLib/chinaumsdk/src/test/java/com/chinaums/test/InstallmentTest.java b/extLib/chinaumsdk/src/test/java/com/chinaums/test/InstallmentTest.java new file mode 100644 index 0000000..46c842f --- /dev/null +++ b/extLib/chinaumsdk/src/test/java/com/chinaums/test/InstallmentTest.java @@ -0,0 +1,33 @@ +package com.chinaums.test; + +import com.chinaums.open.api.DefaultOpenApiClient; +import com.chinaums.open.api.OpenApiClient; +import com.chinaums.open.api.OpenApiException; +import com.chinaums.open.api.request.AcpInstallmentRequest; +import com.chinaums.open.api.response.AcpInstallmentResponse; + +/** + * Created with IntelliJ IDEA. + * User: ZHANGWEI + * Date: 2017/12/12 + * Time: 15:05 + * To change this template use File | Settings | File Templates. + */ +public class InstallmentTest { + @org.junit.Test + public void testVerifyBankCard() throws OpenApiException { + String url = "https://api-mop.chinaums.com/"; + String appId = ""; + String appKey = ""; + OpenApiClient openApiClient = new DefaultOpenApiClient(url, appId, appKey); + AcpInstallmentRequest acpInstallmentRequest = new AcpInstallmentRequest(); + acpInstallmentRequest.setMerchantCode(""); + acpInstallmentRequest.setTerminalCode(""); + acpInstallmentRequest.setSystemTraceNum(""); + acpInstallmentRequest.setTransactionCurrencyCode("156"); + acpInstallmentRequest.setTransactionAmount(""); + acpInstallmentRequest.setEncryptedData(""); + AcpInstallmentResponse acpInstallmentResponse = openApiClient.execute(acpInstallmentRequest); + System.out.println(acpInstallmentResponse.getErrCode()); + } +} diff --git a/extLib/chinaumsdk/src/test/java/com/chinaums/test/PosLinkTestCase.java b/extLib/chinaumsdk/src/test/java/com/chinaums/test/PosLinkTestCase.java new file mode 100644 index 0000000..16b0541 --- /dev/null +++ b/extLib/chinaumsdk/src/test/java/com/chinaums/test/PosLinkTestCase.java @@ -0,0 +1,36 @@ +package com.chinaums.test; + +import com.chinaums.open.api.DefaultOpenApiClient; +import com.chinaums.open.api.OpenApiClient; +import com.chinaums.open.api.OpenApiException; +import com.chinaums.open.api.request.TokenRequest; +import com.chinaums.open.api.response.TokenResponse; +import org.junit.Test; + +import java.util.Random; + +/** + * Created with IntelliJ IDEA. + * User: ZHANGWEI + * Date: 2017/8/2 + * Time: 11:06 + * To change this template use File | Settings | File Templates. + */ +public class PosLinkTestCase { + @org.junit.Test + public void testGetToken() throws OpenApiException { + String url = "https://api-mop.chinaums.com/"; + String appId = ""; + String appKey = ""; + OpenApiClient openApiClient = new DefaultOpenApiClient(url,appId,appKey); + TokenRequest tokenRequest = new TokenRequest(appId,appKey); + TokenResponse response = openApiClient.execute(tokenRequest); + System.out.print(response.getAccessToken()); + } + @Test + public void testCreateRadom(){ + Random random = new Random(); + System.out.println(System.currentTimeMillis()+random.nextInt()); + System.out.println((int)((Math.random()*9+1)*100000)); + } +} diff --git a/extLib/chinaumsdk/src/test/java/com/chinaums/test/RealNameVerifyTestCase.java b/extLib/chinaumsdk/src/test/java/com/chinaums/test/RealNameVerifyTestCase.java new file mode 100644 index 0000000..517bb80 --- /dev/null +++ b/extLib/chinaumsdk/src/test/java/com/chinaums/test/RealNameVerifyTestCase.java @@ -0,0 +1,78 @@ +package com.chinaums.test; + +import com.chinaums.open.api.DefaultOpenApiClient; +import com.chinaums.open.api.OpenApiClient; +import com.chinaums.open.api.OpenApiException; +import com.chinaums.open.api.request.BankVerifyRequest; +import com.chinaums.open.api.request.IdCardVerifyRequest; +import com.chinaums.open.api.request.Mobile3factorVerifyRequest; +import com.chinaums.open.api.request.RealNameVerifyRequest; +import com.chinaums.open.api.response.BankVerifyResponse; +import com.chinaums.open.api.response.IdCardVerifyResponse; +import com.chinaums.open.api.response.Mobile3factorVerifyResponse; +import com.chinaums.open.api.response.RealNameVerifyResponse; +import org.junit.Test; +/** + * Created with IntelliJ IDEA. + * User: ZHANGWEI + * Date: 2016/12/13 + * Time: 17:10 + * 所属模块: + * 功能说明: + */ +public class RealNameVerifyTestCase { + @Test + public void testVerifyBankCard() throws OpenApiException { + String url = "https://api-mop.chinaums.com/"; + String appId = ""; + String appKey = ""; + OpenApiClient openApiClient = new DefaultOpenApiClient(url,appId,appKey); + BankVerifyRequest bankVerifyRequest = new BankVerifyRequest(); + bankVerifyRequest.setData("{\"cardNo\":\"\",\"phoneNo\":\"\"}"); + BankVerifyResponse bankVerifyResponse; + for(int i=0;i<5;i++){ + bankVerifyResponse = openApiClient.execute(bankVerifyRequest); + System.out.println(bankVerifyResponse.getData()); + System.out.println(bankVerifyResponse.getResultCode()); + System.out.println(bankVerifyResponse.getResultInfo()); + } + } + + @Test + public void testRealNameVerify() throws OpenApiException { + String url = "http://116.228.21.162:29015/"; + String appId = "10037e6f57c304d2015824085de80058"; + String appKey = "4e921d76ffc045d98e14999a1f67d1ea"; + OpenApiClient openApiClient = new DefaultOpenApiClient(url,appId,appKey); + RealNameVerifyRequest realNameVerifyRequest = new RealNameVerifyRequest(); + realNameVerifyRequest.setData("{\"userNo\":\"370203\",\"acctNo\":\"6214852107267879\",\"acctName\":\"李铁柱\",\"certNo\":\"370203199809012323\",\"certType\":\"00\",\"phone\":\"18970718908\"}"); + RealNameVerifyResponse realNameVerifyResponse = openApiClient.execute(realNameVerifyRequest); + } + @Test + public void carreopratorVerify() throws OpenApiException { + String url = "http://116.228.21.162:29015/"; + String appId = "10037e6f57c304d2015824085de80058"; + String appKey = "4e921d76ffc045d98e14999a1f67d1ea"; + OpenApiClient openApiClient = new DefaultOpenApiClient(url,appId,appKey); + Mobile3factorVerifyRequest request = new Mobile3factorVerifyRequest(); + request.setData("{\"userNo\":\"370203\",\"userName\":\"李铁柱\",\"certCode\":\"370203199809012323\",\"certType\":\"01\",\"phoneNo\":\"18970718908\"}"); + Mobile3factorVerifyResponse response = openApiClient.execute(request); + System.out.println(response.getData()); + System.out.println(response.getResultInfo()); + System.out.println(response.getResultInfo()); + } + + @Test + public void idcardVerify() throws OpenApiException { + String url = "https://api-mop.chinaums.com/"; + String appId = "9ed4dfed9540423fa04842916c54e0d1"; + String appKey = "20f00a8b37aa4ddda56e7eed2ef6fe2b"; + OpenApiClient openApiClient = new DefaultOpenApiClient(url,appId,appKey); + IdCardVerifyRequest request = new IdCardVerifyRequest(); + request.setData("{\"userNo\":\"370203\",\"userName\":\"李铁柱\",\"certCode\":\"370203199809012323\"}"); + IdCardVerifyResponse response = openApiClient.execute(request); + System.out.println(response.getData()); + System.out.println(response.getResultInfo()); + System.out.println(response.getResultInfo()); + } +} diff --git a/extLib/chinaumsdk/src/test/java/com/chinaums/test/SmartverificationTestCase.java b/extLib/chinaumsdk/src/test/java/com/chinaums/test/SmartverificationTestCase.java new file mode 100644 index 0000000..0427abe --- /dev/null +++ b/extLib/chinaumsdk/src/test/java/com/chinaums/test/SmartverificationTestCase.java @@ -0,0 +1,152 @@ +package com.chinaums.test; + +import com.chinaums.open.api.DefaultOpenApiClient; +import com.chinaums.open.api.OpenApiClient; +import com.chinaums.open.api.OpenApiException; +import com.chinaums.open.api.request.*; +import com.chinaums.open.api.response.*; +import org.junit.*; +import org.junit.Test; + +/** + * Created with IntelliJ IDEA. + * User: ZHANGWEI + * Date: 2017/6/5 + * Time: 16:18 + * 所属模块: + * 功能说明:智慧验证相关接口验证测试 + */ +public class SmartverificationTestCase { + + /** + * 银行卡验证 + * @throws OpenApiException + */ + @org.junit.Test + public void testVerifyBankCard() throws OpenApiException { + String url = "https://api-mop.chinaums.com/"; + String appId = ""; + String appKey = ""; + OpenApiClient openApiClient = new DefaultOpenApiClient(url, appId, appKey); + BankVerifyRequest bankVerifyRequest = new BankVerifyRequest(); + bankVerifyRequest.setData("{\"userNo\":\"\",\"acctNo\":\"\",\"acctName\":\"\",\"certNo\":\"\",\"certType\":\"\",\"phone\":\"\"}"); + BankVerifyResponse bankVerifyResponse; + for (int i = 0; i < 5; i++) { + bankVerifyResponse = openApiClient.execute(bankVerifyRequest); + System.out.println(bankVerifyResponse.getData()); + System.out.println(bankVerifyResponse.getResultCode()); + System.out.println(bankVerifyResponse.getResultInfo()); + } + } + + /** + * 实名验证 + * @throws OpenApiException + */ + @org.junit.Test + public void testRealNameVerify() throws OpenApiException { + String url = "https://api-mop.chinaums.com/"; + String appId = "9ed4dfed9540423fa04842916c54e0d1"; + String appKey = "20f00a8b37aa4ddda56e7eed2ef6fe2b"; + OpenApiClient openApiClient = new DefaultOpenApiClient(url, appId, appKey); + RealNameVerifyRequest request = new RealNameVerifyRequest(); + request.setData("{\"userNo\":\"370203\",\"acctNo\":\"6214852107267879\",\"acctName\":\"李铁柱\",\"certNo\":\"370203199809012323\",\"certType\":\"00\",\"phone\":\"18970718908\"}"); + RealNameVerifyResponse response; + for (int i = 0; i < 5; i++) { + response = openApiClient.execute(request); + System.out.println(response.getData()); + System.out.println(response.getResultCode()); + System.out.println(response.getResultInfo()); + } + } + + /** + * 移动3要素 + * @throws OpenApiException + */ + @Test + public void carreopratorVerify() throws OpenApiException { + String url = "https://api-mop.chinaums.com/"; + String appId = "9ed4dfed9540423fa04842916c54e0d1"; + String appKey = "20f00a8b37aa4ddda56e7eed2ef6fe2b"; + OpenApiClient openApiClient = new DefaultOpenApiClient(url,appId,appKey); + Mobile3factorVerifyRequest request = new Mobile3factorVerifyRequest(); + request.setData("{\"userNo\":\"370203\",\"userName\":\"李铁柱\",\"certCode\":\"370203199809012323\",\"certType\":\"01\",\"phoneNo\":\"18970718908\"}"); + Mobile3factorVerifyResponse response = openApiClient.execute(request); + System.out.println(response.getData()); + System.out.println(response.getResultInfo()); + System.out.println(response.getResultInfo()); + } + + /** + * 身份证验证 + * @throws OpenApiException + */ + @Test + public void idcardVerify() throws OpenApiException { + String url = "https://api-mop.chinaums.com/"; + String appId = "9ed4dfed9540423fa04842916c54e0d1"; + String appKey = "20f00a8b37aa4ddda56e7eed2ef6fe2b"; + OpenApiClient openApiClient = new DefaultOpenApiClient(url,appId,appKey); + IdCardVerifyRequest request = new IdCardVerifyRequest(); + request.setData("{\"userNo\":\"370203\",\"userName\":\"李铁柱\",\"certCode\":\"370203199809012323\"}"); + IdCardVerifyResponse response = openApiClient.execute(request); + System.out.println(response.getData()); + System.out.println(response.getResultInfo()); + System.out.println(response.getResultInfo()); + } + + /** + * 楠云标签查询 + * @throws OpenApiException + */ + @org.junit.Test + public void testNyBankCardTag() throws OpenApiException { + String url = "https://api-mop.chinaums.com/"; + String appId = "9ed4dfed9540423fa04842916c54e0d1"; + String appKey = "20f00a8b37aa4ddda56e7eed2ef6fe2b"; + OpenApiClient openApiClient = new DefaultOpenApiClient(url,appId,appKey); + NyBankCardTagRequest nyBankCardTagRequest = new NyBankCardTagRequest(); + nyBankCardTagRequest.setData("{\"userNo\":\"000000003\",\"priAcctNo\":\"6228480028307505074\",\"riskflag\":\"1\"}"); + NyBankCardTagResponse nyBankCardTagResponse; + nyBankCardTagResponse = openApiClient.execute(nyBankCardTagRequest); + System.out.println(nyBankCardTagResponse.getData()); + System.out.println(nyBankCardTagResponse.getResultCode()); + System.out.println(nyBankCardTagResponse.getResultInfo()); + } + + /** + * 盐商标签查询 + * @throws OpenApiException + */ + @org.junit.Test + public void testYsBankCardTag() throws OpenApiException { + String url = "https://api-mop.chinaums.com/"; + String appId = "9ed4dfed9540423fa04842916c54e0d1"; + String appKey = "20f00a8b37aa4ddda56e7eed2ef6fe2b"; + OpenApiClient openApiClient = new DefaultOpenApiClient(url,appId,appKey); + YsBankCardTagRequest ysBankCardTagRequest = new YsBankCardTagRequest(); + ysBankCardTagRequest.setData("{\"phoneNo\":\"18771059056\",\"priAcctNo\":\"3568570112914437\"}"); + YsBankCardTagResponse ysBankCardTagResponse; + ysBankCardTagResponse = openApiClient.execute(ysBankCardTagRequest); + System.out.println(ysBankCardTagResponse.getData()); + System.out.println(ysBankCardTagResponse.getResultCode()); + System.out.println(ysBankCardTagResponse.getResultInfo()); + } + + + @org.junit.Test + public void testEducation() throws OpenApiException { + String url = "https://api-mop.chinaums.com/"; + String appId = "9ed4dfed9540423fa04842916c54e0d1"; + String appKey = "20f00a8b37aa4ddda56e7eed2ef6fe2b"; + OpenApiClient openApiClient = new DefaultOpenApiClient(url,appId,appKey); + EducationInfoVerifyRequest ysBankCardTagRequest = new EducationInfoVerifyRequest(); + ysBankCardTagRequest.setData("{\"certNo\":\"342529198702131248\",\"name\":\"徐紫燕\"}"); + EducationInfoVerifyResponse ysBankCardTagResponse; + ysBankCardTagResponse = openApiClient.execute(ysBankCardTagRequest); + System.out.println(ysBankCardTagResponse.getData()); + System.out.println(ysBankCardTagResponse.getResultCode()); + System.out.println(ysBankCardTagResponse.getResultInfo()); + } +} \ No newline at end of file diff --git a/extLib/chinaumsdk/src/test/java/com/chinaums/test/TokenTestCase.java b/extLib/chinaumsdk/src/test/java/com/chinaums/test/TokenTestCase.java new file mode 100644 index 0000000..125f243 --- /dev/null +++ b/extLib/chinaumsdk/src/test/java/com/chinaums/test/TokenTestCase.java @@ -0,0 +1,29 @@ +package com.chinaums.test; + +import com.chinaums.open.api.DefaultOpenApiClient; +import com.chinaums.open.api.OpenApiClient; +import com.chinaums.open.api.OpenApiException; +import com.chinaums.open.api.response.TokenResponse; +import com.chinaums.open.api.request.TokenRequest; +import org.junit.Test; + +/** + * Created with IntelliJ IDEA. + * User: ZHANGWEI + * Date: 2016/12/5 + * Time: 17:05 + * 所属模块: + * 功能说明: + */ +public class TokenTestCase { + @Test + public void getToken() throws OpenApiException { + String url = "https://api-mop.chinaums.com/"; + String appId = ""; + String appKey = ""; + OpenApiClient openApiClient = new DefaultOpenApiClient(url,appId,appKey); + TokenRequest tokenRequest = new TokenRequest(appId,appKey); + TokenResponse response = openApiClient.execute(tokenRequest); + System.out.print(response.getAccessToken()); + } +} diff --git a/extLib/chinaumsdk/src/test/java/com/chinaums/test/TokenTestCaseDev.java b/extLib/chinaumsdk/src/test/java/com/chinaums/test/TokenTestCaseDev.java new file mode 100644 index 0000000..6b751e0 --- /dev/null +++ b/extLib/chinaumsdk/src/test/java/com/chinaums/test/TokenTestCaseDev.java @@ -0,0 +1,29 @@ +package com.chinaums.test; + +import com.chinaums.open.api.DefaultOpenApiClient; +import com.chinaums.open.api.OpenApiClient; +import com.chinaums.open.api.OpenApiException; +import com.chinaums.open.api.request.TokenRequest; +import com.chinaums.open.api.response.TokenResponse; +import org.junit.Test; + +/** + * Created with IntelliJ IDEA. + * User: ZHANGWEI + * Date: 2016/12/5 + * Time: 17:05 + * 所属模块: + * 功能说明: + */ +public class TokenTestCaseDev { + @Test + public void getToken() throws OpenApiException { + String url = "https://api-mop.chinaums.com/"; + String appId = ""; + String appKey = ""; + OpenApiClient openApiClient = new DefaultOpenApiClient(url,appId,appKey); + TokenRequest tokenRequest = new TokenRequest(appId,appKey); + TokenResponse response = openApiClient.execute(tokenRequest); + System.out.print(response.getAccessToken()); + } +} diff --git a/extLib/chinaumsdk/src/test/java/com/chinaums/test/UniqueTestCase.java b/extLib/chinaumsdk/src/test/java/com/chinaums/test/UniqueTestCase.java new file mode 100644 index 0000000..489448b --- /dev/null +++ b/extLib/chinaumsdk/src/test/java/com/chinaums/test/UniqueTestCase.java @@ -0,0 +1,33 @@ +package com.chinaums.test; + +import com.chinaums.open.api.DefaultOpenApiClient; +import com.chinaums.open.api.OpenApiClient; +import com.chinaums.open.api.OpenApiException; +import com.chinaums.open.api.request.BankVerifyRequest; +import com.chinaums.open.api.response.BankVerifyResponse; + +/** + * Created with IntelliJ IDEA. + * User: ZHANGWEI + * Date: 2017/2/13 + * Time: 14:13 + * 所属模块: + * 功能说明: + */ +public class UniqueTestCase { + public static void main(String[]args) throws OpenApiException { + String url = "https://api-mop.chinaums.com/"; + String appId = ""; + String appKey = ""; + OpenApiClient openApiClient = new DefaultOpenApiClient(url,appId,appKey); + BankVerifyRequest bankVerifyRequest = new BankVerifyRequest(); + bankVerifyRequest.setData("{\"cardNo\":\"\",\"phoneNo\":\"\"}"); + BankVerifyResponse bankVerifyResponse; + for(int i=0;i<5;i++){ + bankVerifyResponse = openApiClient.execute(bankVerifyRequest); + System.out.println(bankVerifyResponse.getData()); + System.out.println(bankVerifyResponse.getResultCode()); + System.out.println(bankVerifyResponse.getResultInfo()); + } + } +} diff --git a/extLib/commons-codec-1.9.jar b/extLib/commons-codec-1.9.jar new file mode 100644 index 0000000..ef35f1c Binary files /dev/null and b/extLib/commons-codec-1.9.jar differ diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..5adc37a --- /dev/null +++ b/pom.xml @@ -0,0 +1,241 @@ + + + 4.0.0 + + org.chenyon + qichenrent + 1.0-SNAPSHOT + + + 8 + 8 + UTF-8 + 1.8 + + + + + org.rcy.framework + framework-dependencies + 1.0-SNAPSHOT + pom + import + + + + + + org.rcy.framework + framework-data + + + + + + + org.springframework.boot + spring-boot-starter-test + test + + + org.rcy.framework + framework-utils + + + org.springframework.boot + spring-boot-starter-web + + + junit + junit + test + + + com.maxmind.geoip2 + geoip2 + 2.12.0 + + + org.lionsoul + ip2region + 1.7.2 + + + com.chinaums.open + open-api-sdk + 1.0-SNAPSHOT + system + ${project.basedir}/extLib/chinaumsdk/chinaumsdk.jar + + + org.apache + commons-codec + 1.9 + system + ${project.basedir}/extLib/commons-codec-1.9.jar + + + + + qichenrent + + + + src/main/java + + **/*.xml + + + + + + config + config + + **/*.properties + **/*.yml + **/*.xml + + + + src/main/resources + + + install + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + + + + + + org.apache.maven.plugins + maven-resources-plugin + 3.2.0 + + + + copy-jar + package + + copy-resources + + + ${project.build.directory}/qichenrent + + + ${project.build.directory} + + ${project.build.finalName}.jar + + + + + + + + + copy-scripts + package + + copy-resources + + + ${project.build.directory}/qichenrent/bin + + + src/main/scripts + + *.sh + *.bat + + + + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + ${java.version} + ${java.version} + ${project.build.sourceEncoding} + + -parameters + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.22.2 + + true + + + + org.apache.maven.plugins + maven-javadoc-plugin + + 128m + 512m + + 3.1.1 + + + org.apache.maven.plugins + maven-jar-plugin + 3.1.2 + + + org.apache.maven.plugins + maven-war-plugin + 3.2.3 + + + org.apache.maven.plugins + maven-source-plugin + 3.1.0 + + + org.apache.maven.plugins + maven-scm-plugin + 1.9.5 + + + org.apache.maven.plugins + maven-antrun-plugin + 1.8 + + + org.apache.maven.plugins + maven-dependency-plugin + 3.1.1 + + + org.springframework.boot + spring-boot-maven-plugin + 2.2.5.RELEASE + + + + + \ No newline at end of file diff --git a/src/main/java/org/chenyon/WepApplication.java b/src/main/java/org/chenyon/WepApplication.java new file mode 100644 index 0000000..0f4bfab --- /dev/null +++ b/src/main/java/org/chenyon/WepApplication.java @@ -0,0 +1,13 @@ +package org.chenyon; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class WepApplication { + + public static void main(String[] args) { + System.out.println("Current working dir: " + System.getProperty("user.dir")); + SpringApplication.run(WepApplication.class,args); + } +} \ No newline at end of file diff --git a/src/main/java/org/chenyon/assets/AssetsController.java b/src/main/java/org/chenyon/assets/AssetsController.java new file mode 100644 index 0000000..c935b33 --- /dev/null +++ b/src/main/java/org/chenyon/assets/AssetsController.java @@ -0,0 +1,66 @@ +package org.chenyon.assets; + +import org.chenyon.assets.vo.AssetsPageQueryCondition; +import org.chenyon.assets.vo.AssetsVo; +import org.chenyon.user.LoginCheck; +import org.chenyon.user.UserContext; +import org.rcy.framework.api.entity.PageResult; +import org.rcy.framework.api.entity.ResultMessage; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; + +/** + * 资产查询 + */ +@RestController +@RequestMapping("/assets") +public class AssetsController { + + private static final Logger log = LoggerFactory.getLogger(AssetsController.class); + @Autowired + private AssetsQueryService assetsQueryService; + + @PostMapping("/queryPage") + public ResultMessage pageQueryAssets(@RequestBody AssetsPageQueryCondition condition) { + try { + PageResult pageResult = assetsQueryService.pageQueryAssets(condition); + return ResultMessage.success(pageResult); + }catch (Exception e) { + log.error(e.getMessage(),e); + } + return ResultMessage.success(new PageResult<>()); + } + + @PostMapping("/getMyAssetsList") + @LoginCheck + public ResultMessage getMyAssetsList(@RequestBody AssetsPageQueryCondition condition){ + try { + UserContext userContext = UserContext.get(); + if (userContext == null || userContext.getCusNo() == null) { + return ResultMessage.success(new PageResult()); + } + condition.setCusNo(userContext.getCusNo()); + PageResult pageResult = assetsQueryService.pageQueryAssets(condition); + return ResultMessage.success(pageResult); + }catch (Exception e) { + log.error(e.getMessage(),e); + } + return ResultMessage.success(new PageResult()); + } + + @GetMapping("/detail") + public ResultMessage getDetail(@RequestParam("id") String id) { + try { + AssetsVo assetsVo = assetsQueryService.getAssetsById(id); + return ResultMessage.success(assetsVo); + }catch (Exception e) { + log.error(e.getMessage(),e); + } + return ResultMessage.success(new AssetsVo()); + } + +} diff --git a/src/main/java/org/chenyon/assets/AssetsQueryService.java b/src/main/java/org/chenyon/assets/AssetsQueryService.java new file mode 100644 index 0000000..203c42b --- /dev/null +++ b/src/main/java/org/chenyon/assets/AssetsQueryService.java @@ -0,0 +1,88 @@ +package org.chenyon.assets; + +import org.apache.commons.lang3.StringUtils; +import org.chenyon.assets.vo.AssetsPageQueryCondition; +import org.chenyon.assets.vo.AssetsVo; +import org.chenyon.contract.RentFeeInfo; +import org.chenyon.file.OaFileHandlerService; +import org.chenyon.file.OaFileLocalRefVo; +import org.chenyon.file.OaFileVo; +import org.chenyon.oa.OaAssetService; +import org.chenyon.oa.asset.OaAssetsVo; +import org.rcy.framework.api.entity.PageResult; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + + +@Service +public class AssetsQueryService { + + @Autowired + private OaAssetService oaAssetService; + @Autowired + private OaFileHandlerService oaFileHandlerService; + + public PageResult pageQueryAssets(AssetsPageQueryCondition condition) throws Exception { + //调用OA接口查询 + PageResult pageResultOa = oaAssetService.pageQueryAssets(condition); + PageResult pageResult = new PageResult<>(); + pageResult.setPageNo(pageResultOa.getPageNo()); + pageResult.setPageSize(pageResultOa.getPageSize()); + pageResult.setRecordTotal(pageResultOa.getRecordTotal()); + List assetsVoList = new ArrayList<>(); + for (OaAssetsVo oaAssetsVo : pageResultOa.getResult()) { + AssetsVo assetsVo = new AssetsVo(); + assetsVo.setAssetsNo(oaAssetsVo.getAssetsNo()); + assetsVo.setAssetsType(oaAssetsVo.getAssetsType()); + RentFeeInfo rentFeeInfo = new RentFeeInfo(); + if(StringUtils.isNotBlank(oaAssetsVo.getRentFee())){ + rentFeeInfo.setRentFee(Double.parseDouble(oaAssetsVo.getRentFee())); + } + assetsVo.setFootPrint(oaAssetsVo.getFootPrint()); + assetsVo.setAssetsName(oaAssetsVo.getAssetsName()); + assetsVo.setDetailImgs(oaFileHandlerService.getUrls(true,oaAssetsVo.getAssetsNo(), oaAssetsVo.getFormId(),"AssetsDetailImg",oaAssetsVo.getDetailImg())); + assetsVo.setVrImgs(oaFileHandlerService.getUrls(true,oaAssetsVo.getAssetsNo(), oaAssetsVo.getFormId(),"AssetsVrImg",oaAssetsVo.getVrImg())); + if(assetsVo.getDetailImgs() != null && assetsVo.getDetailImgs().size() > 1) { + assetsVo.setCoverImgUrl(assetsVo.getDetailImgs().get(0)); + } + assetsVoList.add(assetsVo); + } + pageResult.setResult(assetsVoList); + return pageResult; + } + + public AssetsVo getAssetsById(String id) throws Exception { + OaAssetsVo oaAssetsVo = oaAssetService.queryAssetsDetail(id); + AssetsVo assetsVo = new AssetsVo(); + assetsVo.setAssetsNo(oaAssetsVo.getAssetsNo()); + assetsVo.setAssetsType(oaAssetsVo.getAssetsType()); + RentFeeInfo rentFeeInfo = new RentFeeInfo(); + if(StringUtils.isNotBlank(oaAssetsVo.getRentFee())){ + rentFeeInfo.setRentFee(Double.parseDouble(oaAssetsVo.getRentFee())); + } + assetsVo.setFeeInfo(rentFeeInfo); + assetsVo.setFootPrint(oaAssetsVo.getFootPrint()); + assetsVo.setAssetsName(oaAssetsVo.getAssetsName()); + assetsVo.setAssetsStatus(oaAssetsVo.getAssetsStatus()); + assetsVo.setAssetsAddress(oaAssetsVo.getAssetsAddress()); + assetsVo.setAssetsDesc(oaAssetsVo.getAssetsDesc()); + assetsVo.setFloorNo(oaAssetsVo.getFloorNo()); + assetsVo.setRoomNo(oaAssetsVo.getRoomNo()); + assetsVo.setHasLift(oaAssetsVo.getHasLift()); + assetsVo.setLatitude(oaAssetsVo.getLatitude()); + assetsVo.setLongitude(oaAssetsVo.getLongitude()); + assetsVo.setLayout(oaAssetsVo.getLayout()); + assetsVo.setUnitNo(oaAssetsVo.getUnitNo()); + assetsVo.setManagerName(oaAssetsVo.getManagerName()); + assetsVo.setManagerPhone(oaAssetsVo.getManagerPhone()); + assetsVo.setDetailImgs(oaFileHandlerService.getUrls(true,oaAssetsVo.getAssetsNo(), oaAssetsVo.getFormId(),"AssetsDetailImg",oaAssetsVo.getDetailImg())); + assetsVo.setVrImgs(oaFileHandlerService.getUrls(true,oaAssetsVo.getAssetsNo(), oaAssetsVo.getFormId(),"AssetsVrImg",oaAssetsVo.getVrImg())); + if(assetsVo.getDetailImgs() != null) { + assetsVo.setCoverImgUrl(assetsVo.getDetailImgs().get(0)); + } + return assetsVo; + } +} diff --git a/src/main/java/org/chenyon/assets/vo/AssetsPageQueryCondition.java b/src/main/java/org/chenyon/assets/vo/AssetsPageQueryCondition.java new file mode 100644 index 0000000..4bfc8bb --- /dev/null +++ b/src/main/java/org/chenyon/assets/vo/AssetsPageQueryCondition.java @@ -0,0 +1,88 @@ +package org.chenyon.assets.vo; + +import org.rcy.framework.api.entity.PageQueryRequest; + +public class AssetsPageQueryCondition extends PageQueryRequest { + + private String assetsNo;//资产编号 + private String assetsType;//资产类型 + private String city;//所属城市 + private String orderByColumn; //排序字段 + private String isAsc; //排序方式、 + private String assetsStatus;//资产状态 + private String assetsName;//资产名称 + private String cusNo; //客商编码 + private String keyWord; //关键字 + + public String getAssetsType() { + return assetsType; + } + + public void setAssetsType(String assetsType) { + this.assetsType = assetsType; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public String getOrderByColumn() { + return orderByColumn; + } + + public void setOrderByColumn(String orderByColumn) { + this.orderByColumn = orderByColumn; + } + + public String getIsAsc() { + return isAsc; + } + + public void setIsAsc(String isAsc) { + this.isAsc = isAsc; + } + + public String getAssetsStatus() { + return assetsStatus; + } + + public void setAssetsStatus(String assetsStatus) { + this.assetsStatus = assetsStatus; + } + + public String getAssetsName() { + return assetsName; + } + + public void setAssetsName(String assetsName) { + this.assetsName = assetsName; + } + + public String getCusNo() { + return cusNo; + } + + public void setCusNo(String cusNo) { + this.cusNo = cusNo; + } + + public String getAssetsNo() { + return assetsNo; + } + + public void setAssetsNo(String assetsNo) { + this.assetsNo = assetsNo; + } + + public String getKeyWord() { + return keyWord; + } + + public void setKeyWord(String keyWord) { + this.keyWord = keyWord; + } +} diff --git a/src/main/java/org/chenyon/assets/vo/AssetsVo.java b/src/main/java/org/chenyon/assets/vo/AssetsVo.java new file mode 100644 index 0000000..5d889d2 --- /dev/null +++ b/src/main/java/org/chenyon/assets/vo/AssetsVo.java @@ -0,0 +1,199 @@ +package org.chenyon.assets.vo; + +import org.chenyon.contract.RentFeeInfo; + +import java.io.Serializable; +import java.util.List; + +public class AssetsVo implements Serializable { + + private String assetsNo; // 资产编号 + private String assetsName; // 资产名称 + private String assetsType; //资产类型 + private String assetsStatus; //资产状态 + private String footPrint; //占地大小 + private String coverImgUrl; //封面图片 + private List detailImgs; //详情图片 + private List vrImgs; //vr图 + private String assetsDesc; //资产描述 + private RentFeeInfo feeInfo; //租赁费用信息 + private String latitude; //纬度 + private String longitude; //经度 + private String managerName; //管理员 + private String managerPhone; //管理员电话 + private String unitNo; //单元号 + private String floorNo; //楼层号 + private String roomNo; //房间号 + private Boolean hasLift;//有无电梯 + private String layout; //户型 + private String orientation; //朝向 + private String assetsAddress; //资产地址 + + public String getManagerName() { + return managerName; + } + + public void setManagerName(String managerName) { + this.managerName = managerName; + } + + public String getManagerPhone() { + return managerPhone; + } + + public void setManagerPhone(String managerPhone) { + this.managerPhone = managerPhone; + } + + public String getAssetsName() { + return assetsName; + } + + public void setAssetsName(String assetsName) { + this.assetsName = assetsName; + } + + public String getAssetsType() { + return assetsType; + } + + public void setAssetsType(String assetsType) { + this.assetsType = assetsType; + } + + public String getAssetsStatus() { + return assetsStatus; + } + + public void setAssetsStatus(String assetsStatus) { + this.assetsStatus = assetsStatus; + } + + public String getFootPrint() { + return footPrint; + } + + public void setFootPrint(String footPrint) { + this.footPrint = footPrint; + } + + public String getCoverImgUrl() { + return coverImgUrl; + } + + public void setCoverImgUrl(String coverImgUrl) { + this.coverImgUrl = coverImgUrl; + } + + public String getAssetsDesc() { + return assetsDesc; + } + + public void setAssetsDesc(String assetsDesc) { + this.assetsDesc = assetsDesc; + } + + public String getAssetsNo() { + return assetsNo; + } + + public void setAssetsNo(String assetsNo) { + this.assetsNo = assetsNo; + } + + public List getDetailImgs() { + return detailImgs; + } + + public void setDetailImgs(List detailImgs) { + this.detailImgs = detailImgs; + } + + public List getVrImgs() { + return vrImgs; + } + + public void setVrImgs(List vrImgs) { + this.vrImgs = vrImgs; + } + + public RentFeeInfo getFeeInfo() { + return feeInfo; + } + + public void setFeeInfo(RentFeeInfo feeInfo) { + this.feeInfo = feeInfo; + } + + public String getLatitude() { + return latitude; + } + + public void setLatitude(String latitude) { + this.latitude = latitude; + } + + public String getLongitude() { + return longitude; + } + + public void setLongitude(String longitude) { + this.longitude = longitude; + } + + public String getUnitNo() { + return unitNo; + } + + public void setUnitNo(String unitNo) { + this.unitNo = unitNo; + } + + public String getFloorNo() { + return floorNo; + } + + public void setFloorNo(String floorNo) { + this.floorNo = floorNo; + } + + public String getRoomNo() { + return roomNo; + } + + public void setRoomNo(String roomNo) { + this.roomNo = roomNo; + } + + public Boolean getHasLift() { + return hasLift; + } + + public void setHasLift(Boolean hasLift) { + this.hasLift = hasLift; + } + + public String getLayout() { + return layout; + } + + public void setLayout(String layout) { + this.layout = layout; + } + + public String getOrientation() { + return orientation; + } + + public void setOrientation(String orientation) { + this.orientation = orientation; + } + + public String getAssetsAddress() { + return assetsAddress; + } + + public void setAssetsAddress(String assetsAddress) { + this.assetsAddress = assetsAddress; + } +} diff --git a/src/main/java/org/chenyon/auth/AuthController.java b/src/main/java/org/chenyon/auth/AuthController.java new file mode 100644 index 0000000..34f90dd --- /dev/null +++ b/src/main/java/org/chenyon/auth/AuthController.java @@ -0,0 +1,51 @@ +package org.chenyon.auth; + +import org.apache.commons.lang3.StringUtils; +import org.chenyon.file.OaFileHandlerService; +import org.chenyon.user.UserService; +import org.chenyon.user.UserVo; +import org.chenyon.wx.WxUserSession; +import org.chenyon.wx.WxUserSessionService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletRequest; + +@RestController +@RequestMapping("/auth") +public class AuthController { + + @Autowired + private UserService userService; + @Autowired + private WxUserSessionService wxUserSessionService; + @Autowired + private OaFileHandlerService oaFileHandlerService; + + @GetMapping("/resourceCheck") + public ResponseEntity resourceCheck(HttpServletRequest request) { + String path = request.getHeader("X-Original-Path"); + String uri = request.getHeader("X-Original-URI"); + + if (uri.startsWith("/private")) { + String token = request.getHeader("X-Token"); + String userType = request.getHeader("USERTYPE"); + if(StringUtils.isAnyBlank(token, userType)) { + return ResponseEntity.status(403).build(); + } + WxUserSession session = wxUserSessionService.getSessionInfoByThirdSession(token); + if (session == null) { + return ResponseEntity.status(403).build(); + } + UserVo userVo = userService.findByOpenIdAndUserType(session.getOpenId(), userType); + String owner = oaFileHandlerService.findOwnerByUrl(uri); + if(owner == null || !owner.equals(userVo.getCusNo())) { + return ResponseEntity.status(403).build(); + } + } + return ResponseEntity.ok().build(); + } +} \ No newline at end of file diff --git a/src/main/java/org/chenyon/bill/BillController.java b/src/main/java/org/chenyon/bill/BillController.java new file mode 100644 index 0000000..73f17e0 --- /dev/null +++ b/src/main/java/org/chenyon/bill/BillController.java @@ -0,0 +1,98 @@ +package org.chenyon.bill; + +import org.chenyon.user.LoginCheck; +import org.chenyon.user.UserContext; +import org.rcy.framework.api.entity.PageResult; +import org.rcy.framework.api.entity.ResultMessage; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/bill") +public class BillController { + + private static final Logger log = LoggerFactory.getLogger(BillController.class); + + @Autowired + private BillService billService; + + @LoginCheck + @PostMapping("/pageQueryContractBill") + public ResultMessage pageQueryContractBill(@RequestBody BillQueryCondition condition) { + try { + UserContext userContext = UserContext.get(); + if(userContext == null || userContext.getCusNo() == null) { + return ResultMessage.success(new PageResult()); + } + condition.setCusNo(userContext.getCusNo()); + return ResultMessage.success(billService.pageQueryContractBill(condition)); + }catch (Exception e) { + log.error(e.getMessage(),e); + } + return ResultMessage.success(new PageResult()); + } + + @LoginCheck + @PostMapping("/pageQueryWaeBill") + public ResultMessage pageQueryWaeBill(@RequestBody BillQueryCondition condition){ + try { + UserContext userContext = UserContext.get(); + if(userContext == null || userContext.getCusNo() == null) { + return ResultMessage.success(new PageResult()); + } + condition.setCusNo(userContext.getCusNo()); + return ResultMessage.success(billService.pageQueryWaeBill(condition)); + }catch (Exception e) { + log.error(e.getMessage(),e); + } + return ResultMessage.success(new PageResult()); + } + + @PostMapping("/pageQueryPayRecord") + @LoginCheck + public ResultMessage pageQueryWaePayRecord(@RequestBody PayRecordQueryConditon condition) { + try { + UserContext userContext = UserContext.get(); + if(userContext == null || userContext.getCusNo() == null) { + return ResultMessage.success(new PageResult()); + } + condition.setCusNo(userContext.getCusNo()); + return ResultMessage.success(billService.pageQueryContractPayRecord(condition)); + }catch (Exception e) { + log.error(e.getMessage(),e); + } + return ResultMessage.success(new PageResult()); + } + + @LoginCheck + @GetMapping("/countUnpayRentBills") + public ResultMessage countUnpayRentBills() { + try { + UserContext userContext = UserContext.get(); + if(userContext == null || userContext.getCusNo() == null) { + return ResultMessage.success(0); + } + return ResultMessage.success(billService.countUnpayRentBills(userContext.getCusNo())); + }catch (Exception e) { + log.error(e.getMessage(),e); + } + return ResultMessage.success(0); + } + + @LoginCheck + @GetMapping("/countUnpayWaeBills") + public ResultMessage countUnpayWaeBills() { + try { + UserContext userContext = UserContext.get(); + if(userContext == null || userContext.getCusNo() == null) { + return ResultMessage.success(0); + } + return ResultMessage.success(billService.countUnpayWaeBills(userContext.getCusNo())); + }catch (Exception e) { + log.error(e.getMessage(),e); + } + return ResultMessage.success(0); + } +} diff --git a/src/main/java/org/chenyon/bill/BillQueryCondition.java b/src/main/java/org/chenyon/bill/BillQueryCondition.java new file mode 100644 index 0000000..083b47a --- /dev/null +++ b/src/main/java/org/chenyon/bill/BillQueryCondition.java @@ -0,0 +1,34 @@ +package org.chenyon.bill; + +import org.rcy.framework.api.entity.PageQueryRequest; + +public class BillQueryCondition extends PageQueryRequest { + + private String cusNo; //客商编码 + private String year; //年份 + private String billStatus; //账单状态 + + public String getCusNo() { + return cusNo; + } + + public void setCusNo(String cusNo) { + this.cusNo = cusNo; + } + + public String getYear() { + return year; + } + + public void setYear(String year) { + this.year = year; + } + + public String getBillStatus() { + return billStatus; + } + + public void setBillStatus(String billStatus) { + this.billStatus = billStatus; + } +} diff --git a/src/main/java/org/chenyon/bill/BillService.java b/src/main/java/org/chenyon/bill/BillService.java new file mode 100644 index 0000000..8c2794c --- /dev/null +++ b/src/main/java/org/chenyon/bill/BillService.java @@ -0,0 +1,42 @@ +package org.chenyon.bill; + +import org.chenyon.oa.OaBillService; +import org.chenyon.oa.bill.OaBillVo; +import org.chenyon.oa.bill.OaPayRecordVo; +import org.rcy.framework.api.entity.PageResult; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.HashMap; +import java.util.Map; + +@Service +public class BillService { + + @Autowired + private OaBillService oaBillService; + + public PageResult pageQueryContractBill(BillQueryCondition condition) throws Exception { + return oaBillService.pageQueryContractBill(condition); + } + + public PageResult pageQueryWaeBill(BillQueryCondition condition) throws Exception { + return oaBillService.pageQueryWaeBill(condition); + } + public PageResult pageQueryContractPayRecord(PayRecordQueryConditon condition) throws Exception { + return oaBillService.pageQueryPayRecord(condition); + } + + public Integer countUnpayRentBills(String cusNo) throws Exception { + Map params = new HashMap<>(); + params.put("cusNo",cusNo); + return oaBillService.countUnpayRentBills(params); + } + + public Integer countUnpayWaeBills(String cusNo) throws Exception { + Map params = new HashMap<>(); + params.put("cusNo",cusNo); + return oaBillService.countUnpayWaeBills(params); + } + +} diff --git a/src/main/java/org/chenyon/bill/PayRecordQueryConditon.java b/src/main/java/org/chenyon/bill/PayRecordQueryConditon.java new file mode 100644 index 0000000..a10c585 --- /dev/null +++ b/src/main/java/org/chenyon/bill/PayRecordQueryConditon.java @@ -0,0 +1,42 @@ +package org.chenyon.bill; + +import org.rcy.framework.api.entity.PageQueryRequest; + +public class PayRecordQueryConditon extends PageQueryRequest { + private String cusNo; + private String leType; + private String year; //年份 + private String billType; + + public String getCusNo() { + return cusNo; + } + + public void setCusNo(String cusNo) { + this.cusNo = cusNo; + } + + public String getLeType() { + return leType; + } + + public void setLeType(String leType) { + this.leType = leType; + } + + public String getYear() { + return year; + } + + public void setYear(String year) { + this.year = year; + } + + public String getBillType() { + return billType; + } + + public void setBillType(String billType) { + this.billType = billType; + } +} diff --git a/src/main/java/org/chenyon/cache/WxTokenCache.java b/src/main/java/org/chenyon/cache/WxTokenCache.java new file mode 100644 index 0000000..aaccd4d --- /dev/null +++ b/src/main/java/org/chenyon/cache/WxTokenCache.java @@ -0,0 +1,23 @@ +package org.chenyon.cache; + +public class WxTokenCache { + + private String token; + private long expireTime; + + public String getToken() { + return token; + } + + public void setToken(String token) { + this.token = token; + } + + public long getExpireTime() { + return expireTime; + } + + public void setExpireTime(long expireTime) { + this.expireTime = expireTime; + } +} diff --git a/src/main/java/org/chenyon/config/SpringMvcConfigurer.java b/src/main/java/org/chenyon/config/SpringMvcConfigurer.java new file mode 100644 index 0000000..cf4841b --- /dev/null +++ b/src/main/java/org/chenyon/config/SpringMvcConfigurer.java @@ -0,0 +1,64 @@ +package org.chenyon.config; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.deser.std.DateDeserializers; +import com.fasterxml.jackson.databind.module.SimpleModule; +import com.fasterxml.jackson.databind.ser.std.DateSerializer; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import org.chenyon.interceptor.LoginCheckInterceptor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.TimeZone; + +/** + * @author 吴康桥 + * @Description + * @date 2022/10/10 14:29 + */ + +@Configuration +public class SpringMvcConfigurer implements WebMvcConfigurer { + + @Autowired + private LoginCheckInterceptor loginCheckInterceptor; + + @Bean + @Primary + public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) { + ObjectMapper mapper = builder.createXmlMapper(false).timeZone(TimeZone.getTimeZone("Asia/Shanghai")).build(); + //忽略值为null的属性 + mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); + SimpleModule module = new SimpleModule(); + module.addSerializer(Long.class, new ToStringSerializer()); + module.addSerializer(Date.class, new DateSerializer(false, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"))); + module.addDeserializer(Date.class, new DateDeserializers.DateDeserializer(new DateDeserializers.DateDeserializer(), new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"), "yyyy-MM-dd HH:mm:ss" )); + mapper.registerModule(module); + return mapper; + } + + + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(loginCheckInterceptor) + .addPathPatterns("/**"); + } + + @Override + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/**") + .allowedOrigins("*") // 允许所有域名访问,生产环境可以换成指定域名 + .allowedMethods("GET","POST","PUT","DELETE","OPTIONS") + .allowCredentials(true) + .maxAge(3600); + } +} diff --git a/src/main/java/org/chenyon/constants/OaApiUrl.java b/src/main/java/org/chenyon/constants/OaApiUrl.java new file mode 100644 index 0000000..911a350 --- /dev/null +++ b/src/main/java/org/chenyon/constants/OaApiUrl.java @@ -0,0 +1,116 @@ +package org.chenyon.constants; + +public final class OaApiUrl { + /** + * 匹配个人 + */ + public static final String MATCH_PERSON = "/cus/matchPerson"; + /** + * 匹配组织 + */ + public static final String MATCH_ORG = "/cus/matchOrg"; + /** + * 查询客商信息 + */ + public static final String CUS_INFO = "/cus/getCusInfo"; + /** + * 分页查询资产 + */ + public static final String PAGE_QUERY_ASSETS = "/assets/queryPage"; + /** + * 查询资产详情 + */ + public static final String QUERY_ASSETS_DETAIL = "/assets/detail"; + /** + * 分页查询合同 + */ + public static final String PAGE_QUERY_CONTRACT = "/contract/queryPage"; + /** + * 查询合同详情 + */ + public static final String CONTRACT_DETAIL = "/contract/detail"; + /** + * 查询合同详情 + */ + public static final String CONTRACT_SIGN_LINK = "/contract/getSignLink"; + /** + * 统计待签署合同份数 + */ + public static final String CONTRACT_COUNT_UNSIGN = "/contract/countUnsign"; + /** + * 查询客户所有已完成的合同信息 + */ + public static final String CONTRACT_ALL = "/contract/queryAll"; + /** + * 分页查询合同关联资产信息 + */ + public static final String PAGE_QUERY_CONTRACT_ASSETS = "/pageQueryAssets"; + /** + * 分页查询合同账单 + */ + public static final String PAGE_QUERY_CONTRACT_BILL = "/bill/contractBill/queryPage"; + /** + * 分页查询水电费账单 + */ + public static final String PAGE_QUERY_WAE_BILL = "/bill/waeBill/queryPage"; + /** + * 分页查询缴费记录 + */ + public static final String PAGE_QUERY_PAY_RECORD = "/bill/payRecord/queryPage"; + /** + * 统计未缴租金账单数 + */ + public static final String COUNT_UNPAY_RENT_BILLS = "/bill/countUnpay/rent"; + /** + * 统计未缴水电费账单数 + */ + public static final String COUNT_UNPAY_WAE_BILLS = "/bill/countUnpay/wae"; + /** + * 分页查询公告 + */ + public static final String PAGE_QUERY_NOTICE = "/notice/queryPage"; + /** + * 分页查询公告 + */ + public static final String QUERY_NOTICE_DETAIL = "/notice/detail"; + /** + * 分页查询留言 + */ + public static final String PAGE_QUERY_FALLBACK = "/fallback/queryPage"; + /** + * 查询留言详情 + */ + public static final String FALLBACK_DETAIL = "/fallback/detail"; + /** + * 提交留言 + */ + public static final String FALLBACK_SUBMIT = "/fallback/submit"; + /** + * 分页查询预约记录 + */ + public static final String PAGE_QUERY_RESERVATION = "/reserve/queryPage"; + /** + * 新增预约 + */ + public static final String RESERVATION_SUBMIT = "/reserve/apply"; + /** + * 新增预约 + */ + public static final String RESERVATION_COUNT_HANDLING = "/reserve/countHandling"; + /** + * 分页查询退租申请记录 + */ + public static final String PAGE_QUERY_DISCHARGE = "/discharge/queryPage"; + /** + * 提交退租申请 + */ + public static final String DISCHARGE_APPLY = "/discharge/apply"; + /** + * 下载文件 + */ + public static final String FILE_DOWNLOAD = "/fileTransport/downloadFile"; + /** + * 下载文件 + */ + public static final String VIEW_RECORD_ADD = "/potential/add"; +} diff --git a/src/main/java/org/chenyon/contract/ContractAssetsVo.java b/src/main/java/org/chenyon/contract/ContractAssetsVo.java new file mode 100644 index 0000000..8c172d8 --- /dev/null +++ b/src/main/java/org/chenyon/contract/ContractAssetsVo.java @@ -0,0 +1,68 @@ +package org.chenyon.contract; + +public class ContractAssetsVo { + + private String assetsNo; // 资产编号 + private String assetsName; // 资产名称 + private String rentFee; //租金 + private String formId; //表单记录ID + private String cover; //封面 + private RentFeeInfo feeInfo; + private String footPrint; //占地大小 + + public String getAssetsNo() { + return assetsNo; + } + + public void setAssetsNo(String assetsNo) { + this.assetsNo = assetsNo; + } + + public String getAssetsName() { + return assetsName; + } + + public void setAssetsName(String assetsName) { + this.assetsName = assetsName; + } + + public String getRentFee() { + return rentFee; + } + + public void setRentFee(String rentFee) { + this.rentFee = rentFee; + } + + public String getFormId() { + return formId; + } + + public void setFormId(String formId) { + this.formId = formId; + } + + public String getCover() { + return cover; + } + + public void setCover(String cover) { + this.cover = cover; + } + + public RentFeeInfo getFeeInfo() { + return feeInfo; + } + + public void setFeeInfo(RentFeeInfo feeInfo) { + this.feeInfo = feeInfo; + } + + public String getFootPrint() { + return footPrint; + } + + public void setFootPrint(String footPrint) { + this.footPrint = footPrint; + } +} \ No newline at end of file diff --git a/src/main/java/org/chenyon/contract/ContractController.java b/src/main/java/org/chenyon/contract/ContractController.java new file mode 100644 index 0000000..8a9f04e --- /dev/null +++ b/src/main/java/org/chenyon/contract/ContractController.java @@ -0,0 +1,103 @@ +package org.chenyon.contract; + +import org.chenyon.user.LoginCheck; +import org.chenyon.user.UserContext; +import org.rcy.framework.api.entity.PageResult; +import org.rcy.framework.api.entity.ResultMessage; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import java.util.ArrayList; + +@RestController +@RequestMapping("/contract") +public class ContractController { + private static final Logger log = LoggerFactory.getLogger(ContractController.class); + + @Autowired + private ContractService contractService; + + @PostMapping("/queryPage") + @LoginCheck + public ResultMessage queryContractPage(@RequestBody ContractQueryCondition condition) { + try { + UserContext userContext = UserContext.get(); + if(userContext == null || userContext.getCusNo() == null) { + return ResultMessage.success(new PageResult()); + } + condition.setCusNo(userContext.getCusNo()); + PageResult pageResult = contractService.queryContractPage(condition); + return ResultMessage.success(pageResult); + }catch (Exception e) { + log.error(e.getMessage()); + } + return ResultMessage.success(); + } + + @GetMapping("/detail") + @LoginCheck + public ResultMessage contractDetail(@RequestParam("contractNo") String contractNo){ + try { + UserContext userContext = UserContext.get(); + if(userContext == null) { + return ResultMessage.success(); + } + return ResultMessage.success(contractService.queryContractDetail(userContext.getCusNo(), contractNo)); + }catch (Exception e) { + log.error(e.getMessage(),e); + } + return ResultMessage.error("查询合同信息失败"); + } + + @GetMapping("/countUnsign") + @LoginCheck + public ResultMessage countUnsign(){ + try { + UserContext userContext = UserContext.get(); + if(userContext == null || userContext.getCusNo() == null) { + return ResultMessage.success(0); + } + return ResultMessage.success(contractService.countUnsign(userContext.getCusNo())); + }catch (Exception e) { + log.error(e.getMessage(),e); + } + return ResultMessage.success(0); + } + + + @PostMapping("/queryAssets") + @LoginCheck + public ResultMessage queryAssets(String formId,Integer pageNo,Integer pageSize) throws Exception { + return ResultMessage.success(contractService.queryMoreContractAssets(formId,pageNo,pageSize)); + } + + @GetMapping("/getSignLink") + @LoginCheck + public ResultMessage getSignLink(@RequestParam("eFlowId") String eFlowId){ + try { + return ResultMessage.success(contractService.getSignLink(eFlowId)); + }catch (Exception e) { + log.error(e.getMessage(),e); + } + return ResultMessage.error("获取签署链接失败"); + } + + @GetMapping("/queryAll") + @LoginCheck + public ResultMessage queryAll(){ + try { + UserContext userContext = UserContext.get(); + if(userContext == null || userContext.getCusNo() == null) { + return ResultMessage.success(); + } + return ResultMessage.success(contractService.queryAll(userContext.getCusNo())); + }catch (Exception e) { + log.error(e.getMessage(),e); + } + return ResultMessage.success(new ArrayList<>()); + } + +} diff --git a/src/main/java/org/chenyon/contract/ContractQueryCondition.java b/src/main/java/org/chenyon/contract/ContractQueryCondition.java new file mode 100644 index 0000000..eaa48a9 --- /dev/null +++ b/src/main/java/org/chenyon/contract/ContractQueryCondition.java @@ -0,0 +1,52 @@ +package org.chenyon.contract; + +import org.rcy.framework.api.entity.PageQueryRequest; + +public class ContractQueryCondition extends PageQueryRequest { + + private String cusNo; + private String contractNo; + private String formmainId; + private String signStatus; + private String signWay; + + public String getCusNo() { + return cusNo; + } + + public void setCusNo(String cusNo) { + this.cusNo = cusNo; + } + + public String getContractNo() { + return contractNo; + } + + public void setContractNo(String contractNo) { + this.contractNo = contractNo; + } + + public String getFormmainId() { + return formmainId; + } + + public void setFormmainId(String formmainId) { + this.formmainId = formmainId; + } + + public String getSignStatus() { + return signStatus; + } + + public void setSignStatus(String signStatus) { + this.signStatus = signStatus; + } + + public String getSignWay() { + return signWay; + } + + public void setSignWay(String signWay) { + this.signWay = signWay; + } +} diff --git a/src/main/java/org/chenyon/contract/ContractService.java b/src/main/java/org/chenyon/contract/ContractService.java new file mode 100644 index 0000000..a5a805f --- /dev/null +++ b/src/main/java/org/chenyon/contract/ContractService.java @@ -0,0 +1,149 @@ +package org.chenyon.contract; + +import org.apache.commons.lang3.StringUtils; +import org.chenyon.assets.vo.AssetsVo; +import org.chenyon.file.OaFileHandlerService; +import org.chenyon.file.OaFileLocalRefVo; +import org.chenyon.file.OaFileVo; +import org.chenyon.oa.OaContractService; +import org.chenyon.oa.asset.OaAssetsVo; +import org.chenyon.oa.contract.OaContractVo; +import org.rcy.framework.api.entity.PageResult; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +@Service +public class ContractService { + + @Autowired + private OaContractService oaContractService; + @Autowired + private OaFileHandlerService oaFileHandlerService; + + private void hanldeSignStatus(ContractQueryCondition condition) { + if (StringUtils.isNotBlank(condition.getSignStatus())) { + switch (condition.getSignStatus()){ + case "all": condition.setSignStatus(null);break; + case "pending" : condition.setSignStatus("待签署");break; + case "signed" : condition.setSignStatus("已签署");break; + case "expired" : condition.setSignStatus("已过期");break; + } + } + } + + private String convertSignStatus(String status) { + if (StringUtils.isNotBlank(status)) { + switch (status){ + case "待签署" : return "pending"; + case "已签署" : return "signed"; + case "已过期" : return "expired"; + } + } + return ""; + } + + public PageResult queryContractPage(ContractQueryCondition condition) throws Exception { + //调用OA接口查询 + hanldeSignStatus(condition); + PageResult pageResultOa = oaContractService.pageQueryContract(condition); + PageResult pageResult = new PageResult<>(); + pageResult.setPageNo(pageResultOa.getPageNo()); + pageResult.setPageSize(pageResultOa.getPageSize()); + pageResult.setRecordTotal(pageResultOa.getRecordTotal()); + List contractVoList = new ArrayList<>(); + for (OaContractVo oaContractVo : pageResultOa.getResult()) { + ContractVo contractVo = new ContractVo(); + BeanUtils.copyProperties(oaContractVo, contractVo); + if(oaContractVo.getAssetsVos() != null) { + List assetsVos = oaContractVo.getAssetsVos(); + OaAssetsVo assetsVo = assetsVos.get(0); + List assetsDetailImgs = oaFileHandlerService.getUrls(true,assetsVo.getAssetsNo(), assetsVo.getFormId(), "AssetsDetailImg", assetsVo.getDetailImg()); + if(assetsDetailImgs != null) { + contractVo.setCoverImgUrl(assetsDetailImgs.get(0)); + } + } + contractVo.setSignStatus(convertSignStatus(contractVo.getSignStatus())); + contractVoList.add(contractVo); + } + pageResult.setResult(contractVoList); + return pageResult; + } + + public List queryAll(String cusNo) throws Exception { + ContractQueryCondition condition = new ContractQueryCondition(); + condition.setCusNo(cusNo); + condition.setSignStatus("已签署"); + List contractVos = new ArrayList<>(); + List oaContractVos = oaContractService.queryAll(condition); + for (OaContractVo oaContractVo : oaContractVos) { + ContractVo contractVo = new ContractVo(); + BeanUtils.copyProperties(oaContractVo, contractVo); + contractVos.add(contractVo); + } + return contractVos; + } + + public ContractAssetsVo queryMoreContractAssets(String formId,Integer pageNo,Integer pageSize) throws Exception { + ContractQueryCondition condition = new ContractQueryCondition(); + condition.setFormmainId(formId); + condition.setPageNo(pageNo); + condition.setPageSize(pageSize); + OaAssetsVo assetsVo = oaContractService.pageQueryContractAssets(condition); + List assetsDetailImgs = oaFileHandlerService.getUrls(true,assetsVo.getAssetsNo(), assetsVo.getFormId(), "AssetsDetailImg", assetsVo.getDetailImg()); + ContractAssetsVo assetsInfo = new ContractAssetsVo(); + BeanUtils.copyProperties(assetsVo, assetsInfo); + RentFeeInfo rentFeeInfo = new RentFeeInfo(); + if(StringUtils.isNotBlank(assetsVo.getRentFee())){ + rentFeeInfo.setRentFee(Double.parseDouble(assetsVo.getRentFee())); + } + assetsInfo.setFeeInfo(rentFeeInfo); + if(assetsDetailImgs != null) { + assetsInfo.setCover(assetsDetailImgs.get(0)); + } + return assetsInfo; + } + public Integer countUnsign(String cusNo) throws Exception { + Integer count = oaContractService.countUnsign(cusNo); + return count; + } + + public ContractVo queryContractDetail(String cusNo,String contractNo) throws Exception { + ContractQueryCondition condition = new ContractQueryCondition(); + condition.setContractNo(contractNo); + OaContractVo oaContractVo = oaContractService.queryContractDetail(condition); + if(!cusNo.equals(oaContractVo.getCusNo())) { + return null; + } + ContractVo contractVo = new ContractVo(); + BeanUtils.copyProperties(oaContractVo, contractVo); + List assetsVos = oaContractVo.getAssetsVos(); + OaAssetsVo assetsVo = assetsVos.get(0); + List assetsDetailImgs = oaFileHandlerService.getUrls(true,assetsVo.getAssetsNo(), assetsVo.getFormId(), "AssetsDetailImg", assetsVo.getDetailImg()); + List eContractUrl = oaFileHandlerService.getUrls(false,cusNo,oaContractVo.getContractNo(),oaContractVo.getFormId(),"eContractFile",oaContractVo.geteContractFile()); + ContractAssetsVo assetsInfo = new ContractAssetsVo(); + BeanUtils.copyProperties(assetsVo, assetsInfo); + RentFeeInfo rentFeeInfo = new RentFeeInfo(); + if(StringUtils.isNotBlank(assetsVo.getRentFee())){ + rentFeeInfo.setRentFee(Double.parseDouble(assetsVo.getRentFee())); + } + assetsInfo.setFeeInfo(rentFeeInfo); + if(assetsDetailImgs != null) { + assetsInfo.setCover(assetsDetailImgs.get(0)); + } + if(eContractUrl != null) { + contractVo.seteContractUrl(eContractUrl.get(0)); + } + List assetsInfoList = new ArrayList<>(); + assetsInfoList.add(assetsInfo); + contractVo.setAssetsInfos(assetsInfoList); + return contractVo; + } + public String getSignLink(String eFlowId) throws Exception { + String signLink = oaContractService.getSignLink(eFlowId); + return signLink; + } +} diff --git a/src/main/java/org/chenyon/contract/ContractVo.java b/src/main/java/org/chenyon/contract/ContractVo.java new file mode 100644 index 0000000..e8189f7 --- /dev/null +++ b/src/main/java/org/chenyon/contract/ContractVo.java @@ -0,0 +1,107 @@ +package org.chenyon.contract; + +import org.chenyon.assets.vo.AssetsVo; + +import java.util.List; + +public class ContractVo { + private String formId; //表单ID + private String contractNo; //合同编号 + private String contractName; //合同名称 + private String signStatus; //签订状态 + private String startDate; //开始日期 + private String endDate; //开始日期 + private String eContractUrl; //电子合同文件地址 + private String eContractFlowId; //电子合同签署流程ID + private List assetsInfos; //资产信息 + private String coverImgUrl; //封面图片信息 + private String cusNo; //客商编码 + + public String getContractNo() { + return contractNo; + } + + public void setContractNo(String contractNo) { + this.contractNo = contractNo; + } + + public String getContractName() { + return contractName; + } + + public void setContractName(String contractName) { + this.contractName = contractName; + } + + public String getSignStatus() { + return signStatus; + } + + public void setSignStatus(String signStatus) { + this.signStatus = signStatus; + } + + public List getAssetsInfos() { + return assetsInfos; + } + + public void setAssetsInfos(List assetsInfos) { + this.assetsInfos = assetsInfos; + } + + public String geteContractUrl() { + return eContractUrl; + } + + public void seteContractUrl(String eContractUrl) { + this.eContractUrl = eContractUrl; + } + + public String getCusNo() { + return cusNo; + } + + public void setCusNo(String cusNo) { + this.cusNo = cusNo; + } + + public String geteContractFlowId() { + return eContractFlowId; + } + + public void seteContractFlowId(String eContractFlowId) { + this.eContractFlowId = eContractFlowId; + } + + public String getCoverImgUrl() { + return coverImgUrl; + } + + public void setCoverImgUrl(String coverImgUrl) { + this.coverImgUrl = coverImgUrl; + } + + public String getFormId() { + return formId; + } + + public void setFormId(String formId) { + this.formId = formId; + } + + public String getStartDate() { + return startDate; + } + + public void setStartDate(String startDate) { + this.startDate = startDate; + } + + public String getEndDate() { + return endDate; + } + + public void setEndDate(String endDate) { + this.endDate = endDate; + } +} diff --git a/src/main/java/org/chenyon/contract/FeeUnit.java b/src/main/java/org/chenyon/contract/FeeUnit.java new file mode 100644 index 0000000..4a92529 --- /dev/null +++ b/src/main/java/org/chenyon/contract/FeeUnit.java @@ -0,0 +1,6 @@ +package org.chenyon.contract; + +public enum FeeUnit { + KWT, //度 + TON //吨 +} diff --git a/src/main/java/org/chenyon/contract/RentFeeInfo.java b/src/main/java/org/chenyon/contract/RentFeeInfo.java new file mode 100644 index 0000000..6ce0a9c --- /dev/null +++ b/src/main/java/org/chenyon/contract/RentFeeInfo.java @@ -0,0 +1,59 @@ +package org.chenyon.contract; + +public class RentFeeInfo { + + private Double deposit; //押金 + private Double rentFee; //租金 + private Double waterFee; //水费 + private FeeUnit waterFeeUnit; //水费单位 + private Double powerFee; //电费 + private FeeUnit powerFeeUnit; //电费单位 + + public Double getDeposit() { + return deposit; + } + + public void setDeposit(Double deposit) { + this.deposit = deposit; + } + + public Double getRentFee() { + return rentFee; + } + + public void setRentFee(Double rentFee) { + this.rentFee = rentFee; + } + + public Double getWaterFee() { + return waterFee; + } + + public void setWaterFee(Double waterFee) { + this.waterFee = waterFee; + } + + public FeeUnit getWaterFeeUnit() { + return waterFeeUnit; + } + + public void setWaterFeeUnit(FeeUnit waterFeeUnit) { + this.waterFeeUnit = waterFeeUnit; + } + + public Double getPowerFee() { + return powerFee; + } + + public void setPowerFee(Double powerFee) { + this.powerFee = powerFee; + } + + public FeeUnit getPowerFeeUnit() { + return powerFeeUnit; + } + + public void setPowerFeeUnit(FeeUnit powerFeeUnit) { + this.powerFeeUnit = powerFeeUnit; + } +} diff --git a/src/main/java/org/chenyon/discharge/DisChargeApplyQueryCondition.java b/src/main/java/org/chenyon/discharge/DisChargeApplyQueryCondition.java new file mode 100644 index 0000000..88d64ce --- /dev/null +++ b/src/main/java/org/chenyon/discharge/DisChargeApplyQueryCondition.java @@ -0,0 +1,15 @@ +package org.chenyon.discharge; + +import org.rcy.framework.api.entity.PageQueryRequest; + +public class DisChargeApplyQueryCondition extends PageQueryRequest { + private String cusNo; + + public String getCusNo() { + return cusNo; + } + + public void setCusNo(String cusNo) { + this.cusNo = cusNo; + } +} diff --git a/src/main/java/org/chenyon/discharge/DisChargeApplyVo.java b/src/main/java/org/chenyon/discharge/DisChargeApplyVo.java new file mode 100644 index 0000000..7b8fda7 --- /dev/null +++ b/src/main/java/org/chenyon/discharge/DisChargeApplyVo.java @@ -0,0 +1,87 @@ +package org.chenyon.discharge; + +import java.util.List; + +public class DisChargeApplyVo { + private String contractNo; + private String contractName; + private List assetsNoList; + private String reason; + private String dischargeDate; + private String cusNo; + private String cusName; + private String cusType; + private String phone; + + public String getContractNo() { + return contractNo; + } + + public void setContractNo(String contractNo) { + this.contractNo = contractNo; + } + + public List getAssetsNoList() { + return assetsNoList; + } + + public void setAssetsNoList(List assetsNoList) { + this.assetsNoList = assetsNoList; + } + + public String getReason() { + return reason; + } + + public void setReason(String reason) { + this.reason = reason; + } + + public String getDischargeDate() { + return dischargeDate; + } + + public void setDischargeDate(String dischargeDate) { + this.dischargeDate = dischargeDate; + } + + public String getCusNo() { + return cusNo; + } + + public void setCusNo(String cusNo) { + this.cusNo = cusNo; + } + + public String getContractName() { + return contractName; + } + + public void setContractName(String contractName) { + this.contractName = contractName; + } + + public String getCusName() { + return cusName; + } + + public void setCusName(String cusName) { + this.cusName = cusName; + } + + public String getCusType() { + return cusType; + } + + public void setCusType(String cusType) { + this.cusType = cusType; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } +} diff --git a/src/main/java/org/chenyon/discharge/DisChargeController.java b/src/main/java/org/chenyon/discharge/DisChargeController.java new file mode 100644 index 0000000..34edab9 --- /dev/null +++ b/src/main/java/org/chenyon/discharge/DisChargeController.java @@ -0,0 +1,60 @@ +package org.chenyon.discharge; + +import org.chenyon.oa.OaDisChargeService; +import org.chenyon.user.LoginCheck; +import org.chenyon.user.UserContext; +import org.rcy.framework.api.entity.PageResult; +import org.rcy.framework.api.entity.ResultMessage; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/discharge") +public class DisChargeController { + + private static final Logger log = LoggerFactory.getLogger(DisChargeController.class); + + @Autowired + private OaDisChargeService oaDisChargeService; + + @PostMapping("/queryPage") + @LoginCheck + public ResultMessage queryPage(@RequestBody DisChargeApplyQueryCondition condition) { + try { + UserContext userContext = UserContext.get(); + if(userContext == null || userContext.getCusNo() == null) { + return ResultMessage.success(new PageResult()); + } + condition.setCusNo(userContext.getCusNo()); + return ResultMessage.success(oaDisChargeService.pageQueryApplyRecord(condition)); + }catch (Exception e) { + log.error(e.getMessage(),e); + } + return ResultMessage.success(new PageResult()); + } + + @PostMapping("/apply") + @LoginCheck + public ResultMessage apply(@RequestBody DisChargeApplyVo applyVo) throws Exception { + try { + UserContext userContext = UserContext.get(); + if(userContext == null || userContext.getCusNo() == null) { + return ResultMessage.success("您还未实名"); + } + applyVo.setCusNo(userContext.getCusNo()); + applyVo.setCusName(userContext.getUsername()); + applyVo.setPhone(userContext.getPhone()); + applyVo.setCusType(userContext.getUserType().equals("0") ? "个人" : "单位"); + oaDisChargeService.apply(applyVo); + return ResultMessage.success(); + }catch (Exception e) { + log.error(e.getMessage(),e); + } + return ResultMessage.error("申请失败"); + } +} diff --git a/src/main/java/org/chenyon/discharge/DisChargeRecordVo.java b/src/main/java/org/chenyon/discharge/DisChargeRecordVo.java new file mode 100644 index 0000000..b920071 --- /dev/null +++ b/src/main/java/org/chenyon/discharge/DisChargeRecordVo.java @@ -0,0 +1,58 @@ +package org.chenyon.discharge; + +public class DisChargeRecordVo { + private String contractName; + private String dischargeItem; + private String id; + private String status; + private String applyDate; + private String remark; + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getApplyDate() { + return applyDate; + } + + public void setApplyDate(String applyDate) { + this.applyDate = applyDate; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getContractName() { + return contractName; + } + + public void setContractName(String contractName) { + this.contractName = contractName; + } + + public String getDischargeItem() { + return dischargeItem; + } + + public void setDischargeItem(String dischargeItem) { + this.dischargeItem = dischargeItem; + } +} diff --git a/src/main/java/org/chenyon/fallback/FallbackController.java b/src/main/java/org/chenyon/fallback/FallbackController.java new file mode 100644 index 0000000..c8c0730 --- /dev/null +++ b/src/main/java/org/chenyon/fallback/FallbackController.java @@ -0,0 +1,73 @@ +package org.chenyon.fallback; + +import org.chenyon.discharge.DisChargeApplyQueryCondition; +import org.chenyon.discharge.DisChargeApplyVo; +import org.chenyon.oa.OaFallBackService; +import org.chenyon.user.LoginCheck; +import org.chenyon.user.UserContext; +import org.rcy.framework.api.entity.PageResult; +import org.rcy.framework.api.entity.ResultMessage; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/fallback") +public class FallbackController { + + private static final Logger log = LoggerFactory.getLogger(FallbackController.class); + @Autowired + private OaFallBackService fallbackServcie; + + @PostMapping("/queryPage") + @LoginCheck + public ResultMessage queryPage(@RequestBody FallbackQueryCondition condition) { + try { + UserContext userContext = UserContext.get(); + if(userContext == null || userContext.getCusNo() == null) { + return ResultMessage.success(new PageResult()); + } + condition.setCusNo(userContext.getCusNo()); + return ResultMessage.success(fallbackServcie.pageQuery(condition)); + }catch (Exception e) { + log.error(e.getMessage(),e); + } + return ResultMessage.success(new PageResult()); + } + + @GetMapping("/detail") + @LoginCheck + public ResultMessage detail(@RequestParam("id") String id) { + try { + UserContext userContext = UserContext.get(); + if(userContext == null ) { + return ResultMessage.success(); + } + return ResultMessage.success(fallbackServcie.detail(id)); + }catch (Exception e) { + log.error(e.getMessage(),e); + } + return ResultMessage.error("查询留言详情失败"); + } + + @PostMapping("/submit") + @LoginCheck + public ResultMessage submit(@RequestBody FallbackSubmitVo submitVo) { + try { + UserContext userContext = UserContext.get(); + if(userContext == null || userContext.getCusNo() == null) { + return ResultMessage.success("您还未实名"); + } + submitVo.setCusNo(userContext.getCusNo()); + submitVo.setTenantType(userContext.getUserType().equals("0") ? "个人" : "单位"); + submitVo.setTenantName(userContext.getUsername()); + submitVo.setTenantPhone(userContext.getPhone()); + fallbackServcie.submit(submitVo); + return ResultMessage.success(); + }catch (Exception e){ + log.error(e.getMessage(),e); + } + return ResultMessage.error("提交失败"); + } +} diff --git a/src/main/java/org/chenyon/fallback/FallbackQueryCondition.java b/src/main/java/org/chenyon/fallback/FallbackQueryCondition.java new file mode 100644 index 0000000..524e4a5 --- /dev/null +++ b/src/main/java/org/chenyon/fallback/FallbackQueryCondition.java @@ -0,0 +1,24 @@ +package org.chenyon.fallback; + +import org.rcy.framework.api.entity.PageQueryRequest; + +public class FallbackQueryCondition extends PageQueryRequest { + private String cusNo; + private String id; + + public String getCusNo() { + return cusNo; + } + + public void setCusNo(String cusNo) { + this.cusNo = cusNo; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } +} diff --git a/src/main/java/org/chenyon/fallback/FallbackSubmitVo.java b/src/main/java/org/chenyon/fallback/FallbackSubmitVo.java new file mode 100644 index 0000000..b6824fa --- /dev/null +++ b/src/main/java/org/chenyon/fallback/FallbackSubmitVo.java @@ -0,0 +1,67 @@ +package org.chenyon.fallback; + +public class FallbackSubmitVo { + private String cusNo; + private String content; + private String status; + private String comment; + private String tenantName; + private String tenantType; + private String tenantPhone; + + public String getCusNo() { + return cusNo; + } + + public void setCusNo(String cusNo) { + this.cusNo = cusNo; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getComment() { + return comment; + } + + public void setComment(String comment) { + this.comment = comment; + } + + public String getTenantName() { + return tenantName; + } + + public void setTenantName(String tenantName) { + this.tenantName = tenantName; + } + + public String getTenantType() { + return tenantType; + } + + public void setTenantType(String tenantType) { + this.tenantType = tenantType; + } + + public String getTenantPhone() { + return tenantPhone; + } + + public void setTenantPhone(String tenantPhone) { + this.tenantPhone = tenantPhone; + } +} diff --git a/src/main/java/org/chenyon/fallback/FallbackVo.java b/src/main/java/org/chenyon/fallback/FallbackVo.java new file mode 100644 index 0000000..2df7a4d --- /dev/null +++ b/src/main/java/org/chenyon/fallback/FallbackVo.java @@ -0,0 +1,58 @@ +package org.chenyon.fallback; + +public class FallbackVo { + private String id; + private String content; + private String status; + private String comment; + private String summitDate; + private String handleDate; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getComment() { + return comment; + } + + public void setComment(String comment) { + this.comment = comment; + } + + public String getSummitDate() { + return summitDate; + } + + public void setSummitDate(String summitDate) { + this.summitDate = summitDate; + } + + public String getHandleDate() { + return handleDate; + } + + public void setHandleDate(String handleDate) { + this.handleDate = handleDate; + } +} diff --git a/src/main/java/org/chenyon/file/OaFileFindCondition.java b/src/main/java/org/chenyon/file/OaFileFindCondition.java new file mode 100644 index 0000000..f6da889 --- /dev/null +++ b/src/main/java/org/chenyon/file/OaFileFindCondition.java @@ -0,0 +1,43 @@ +package org.chenyon.file; + +import org.rcy.framework.api.entity.TypeAliases; + +public class OaFileFindCondition implements TypeAliases { + + private String bizId; + private String refId; + private String oaFormId; + private String oaFieldFlag; + + public String getBizId() { + return bizId; + } + + public void setBizId(String bizId) { + this.bizId = bizId; + } + + public String getRefId() { + return refId; + } + + public void setRefId(String refId) { + this.refId = refId; + } + + public String getOaFormId() { + return oaFormId; + } + + public void setOaFormId(String oaFormId) { + this.oaFormId = oaFormId; + } + + public String getOaFieldFlag() { + return oaFieldFlag; + } + + public void setOaFieldFlag(String oaFieldFlag) { + this.oaFieldFlag = oaFieldFlag; + } +} diff --git a/src/main/java/org/chenyon/file/OaFileHandlerService.java b/src/main/java/org/chenyon/file/OaFileHandlerService.java new file mode 100644 index 0000000..2eead7c --- /dev/null +++ b/src/main/java/org/chenyon/file/OaFileHandlerService.java @@ -0,0 +1,147 @@ +package org.chenyon.file; + +import org.chenyon.constants.OaApiUrl; +import org.chenyon.oa.SeeyonHttpClient; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +@Service +@Transactional +public class OaFileHandlerService { + + @Autowired + private OaFileLocalRefDao oaFileLocalRefDao; + @Autowired + private OaFileLocalSubRefDao oaFileLocalSubRefDao; + @Autowired + private SeeyonHttpClient seeyonHttpClient; + @Value("${local.fileStorage.path}") + private String fileStoragePath; + + public OaFileLocalRef findFileInfoByConditions(OaFileFindCondition condition) { + return oaFileLocalRefDao.findFileInfoByConditions(condition); + } + + public void update(OaFileLocalRef oaFileLocalRef) { + oaFileLocalRefDao.updateByPrimaryKeySelective(oaFileLocalRef); + } + + public List getUrls(Boolean viewPublic,String owner,String bizId, String formId, String oaFieldFlag, OaFileVo oaFileVo){ + if(bizId == null || formId == null || oaFieldFlag == null || oaFileVo == null) { + return null; + } + OaFileLocalRefVo oaFileLocalRefVo = new OaFileLocalRefVo(); + oaFileLocalRefVo.setBizId(bizId); + oaFileLocalRefVo.setOaFormId(formId); + oaFileLocalRefVo.setOaFieldFlag(oaFieldFlag); + oaFileLocalRefVo.setRefId(oaFileVo.getMainRefId()); + oaFileLocalRefVo.setSubRefIds(oaFileVo.getSubRefIds()); + oaFileLocalRefVo.setViewPublic(viewPublic); + oaFileLocalRefVo.setOwner(owner); + return refLocalUrl(oaFileLocalRefVo); + } + + public List getUrls(Boolean viewPublic,String bizId, String formId, String oaFieldFlag, OaFileVo oaFileVo){ + return getUrls(viewPublic,null,bizId,formId,oaFieldFlag,oaFileVo); + } + + public List refLocalUrl(OaFileLocalRefVo oaFileLocalRefVo) { + OaFileFindCondition condition1 = new OaFileFindCondition(); + condition1.setBizId(oaFileLocalRefVo.getBizId()); + condition1.setOaFormId(oaFileLocalRefVo.getOaFormId()); + condition1.setOaFieldFlag(oaFileLocalRefVo.getOaFieldFlag()); + OaFileLocalRef localRefDb = findFileInfoByConditions(condition1); + if (localRefDb != null && localRefDb.getRefId().equals(oaFileLocalRefVo.getRefId())) { + //附件信息没完全删除但是部分发生改变 + List subRefInfos = oaFileLocalSubRefDao.findFileInfoByMainRefId(localRefDb.getRefId()); + //先删除旧的 + Set subRefSet = oaFileLocalRefVo.getSubRefIds().stream().collect(Collectors.toSet()); + List nSubUrls = new ArrayList<>(); + for (OaFileLocalSubRef subRefInfo : subRefInfos) { + if (!subRefSet.contains(subRefInfo.getRefId())) { + //删除子表 + OaFileLocalSubRef temp = oaFileLocalSubRefDao.get(subRefInfo.getId()); + oaFileLocalSubRefDao.deleteByPrimaryKey(subRefInfo.getId()); + String tempFileUrl = fileStoragePath + temp.getUrl(); + //删除本地文件 + File tempFile = new File(tempFileUrl); + if (tempFile.exists()) { + tempFile.delete(); + } + }else { + nSubUrls.add(subRefInfo.getUrl()); + } + } + Set dbSubRefSet = subRefInfos.stream().map(s -> s.getRefId()).collect(Collectors.toSet()); + for (String subRefId : oaFileLocalRefVo.getSubRefIds()) { + if (!dbSubRefSet.contains(subRefId)) { + reBuildSubRef(oaFileLocalRefVo.getOaFieldFlag(),subRefId, localRefDb.getRefId(), localRefDb.getViewPublic(), localRefDb.getOwner(), nSubUrls); + } + } + return nSubUrls; + } + //附件信息完全删除 + List ncSubUrls = new ArrayList<>(); + List subRefIds = oaFileLocalRefVo.getSubRefIds(); + for (String subRefId : subRefIds) { + try { + reBuildSubRef(oaFileLocalRefVo.getOaFieldFlag(),subRefId, oaFileLocalRefVo.getRefId(), oaFileLocalRefVo.getViewPublic(), oaFileLocalRefVo.getOwner(), ncSubUrls); + } catch (Exception e) { + + } + } + if (localRefDb != null) { + localRefDb.setRefId(oaFileLocalRefVo.getRefId()); + oaFileLocalRefDao.updateByPrimaryKeySelective(localRefDb); + } + OaFileLocalRef oaFileLocalRef = new OaFileLocalRef(); + oaFileLocalRef.setBizId(oaFileLocalRefVo.getBizId()); + oaFileLocalRef.setOaFormId(oaFileLocalRefVo.getOaFormId()); + oaFileLocalRef.setOaFieldFlag(oaFileLocalRefVo.getOaFieldFlag()); + oaFileLocalRef.setRefId(oaFileLocalRefVo.getRefId()); + oaFileLocalRef.setViewPublic(oaFileLocalRefVo.getViewPublic()); + oaFileLocalRef.setOwner(oaFileLocalRefVo.getOwner()); + oaFileLocalRefDao.save(oaFileLocalRef); + return ncSubUrls; + } + + private void reBuildSubRef(String bizType,String subRefId, String mainRefId, Boolean isPublic, String owner, List nSubUrls) { + //新增 + OaFileLocalSubRef oaFileLocalSubRef = new OaFileLocalSubRef(); + oaFileLocalSubRef.setRefId(subRefId); + oaFileLocalSubRef.setMainRefId(mainRefId); + //调OA接口写入文件 + try { + String subUrl = seeyonHttpClient.downloadFile(bizType,OaApiUrl.FILE_DOWNLOAD,subRefId, isPublic, owner); + oaFileLocalSubRef.setUrl(subUrl); + oaFileLocalSubRefDao.save(oaFileLocalSubRef); + nSubUrls.add(subUrl); + } catch (Exception e) { + + } + } + + public String findOwnerByUrl(String url) { + OaFileLocalSubRef subRef = oaFileLocalSubRefDao.findByUrl(url); + if(subRef == null) { + return null; + }else { + String mainRefId = subRef.getMainRefId(); + OaFileFindCondition condition = new OaFileFindCondition(); + condition.setRefId(mainRefId); + OaFileLocalRef mainRef = oaFileLocalRefDao.findFileInfoByConditions(condition); + if(mainRef == null) { + return null; + } + return mainRef.getOwner(); + } + } +} diff --git a/src/main/java/org/chenyon/file/OaFileLocalRef.java b/src/main/java/org/chenyon/file/OaFileLocalRef.java new file mode 100644 index 0000000..297b4cc --- /dev/null +++ b/src/main/java/org/chenyon/file/OaFileLocalRef.java @@ -0,0 +1,65 @@ +package org.chenyon.file; + +import org.rcy.framework.api.entity.BaseEntity; + +import javax.persistence.Entity; +import javax.persistence.Table; + +@Entity +@Table(name = "OAFILELOCALREF") +public class OaFileLocalRef extends BaseEntity { + private String bizId; + private String refId; + private String oaFormId; + private String oaFieldFlag; + private String owner; + private Boolean viewPublic = true; + + public String getBizId() { + return bizId; + } + + public void setBizId(String bizId) { + this.bizId = bizId; + } + + public String getRefId() { + return refId; + } + + public void setRefId(String refId) { + this.refId = refId; + } + + public String getOaFormId() { + return oaFormId; + } + + public void setOaFormId(String oaFormId) { + this.oaFormId = oaFormId; + } + + public String getOaFieldFlag() { + return oaFieldFlag; + } + + public void setOaFieldFlag(String oaFieldFlag) { + this.oaFieldFlag = oaFieldFlag; + } + + public String getOwner() { + return owner; + } + + public void setOwner(String owner) { + this.owner = owner; + } + + public Boolean getViewPublic() { + return viewPublic; + } + + public void setViewPublic(Boolean viewPublic) { + this.viewPublic = viewPublic; + } +} diff --git a/src/main/java/org/chenyon/file/OaFileLocalRefDao.java b/src/main/java/org/chenyon/file/OaFileLocalRefDao.java new file mode 100644 index 0000000..86c4e3a --- /dev/null +++ b/src/main/java/org/chenyon/file/OaFileLocalRefDao.java @@ -0,0 +1,7 @@ +package org.chenyon.file; + +import org.rcy.framework.data.dao.BaseDao; + +public interface OaFileLocalRefDao extends BaseDao { + OaFileLocalRef findFileInfoByConditions(OaFileFindCondition condition); +} diff --git a/src/main/java/org/chenyon/file/OaFileLocalRefDao.xml b/src/main/java/org/chenyon/file/OaFileLocalRefDao.xml new file mode 100644 index 0000000..70979a0 --- /dev/null +++ b/src/main/java/org/chenyon/file/OaFileLocalRefDao.xml @@ -0,0 +1,28 @@ + + + + + + + + 1 = 1 + + AND bizId = #{bizId} + + + AND refId = #{refId} + + + AND oaFormId = #{oaFormId} + + + AND oaFieldFlag = #{oaFieldFlag} + + + + \ No newline at end of file diff --git a/src/main/java/org/chenyon/file/OaFileLocalRefVo.java b/src/main/java/org/chenyon/file/OaFileLocalRefVo.java new file mode 100644 index 0000000..eb328b1 --- /dev/null +++ b/src/main/java/org/chenyon/file/OaFileLocalRefVo.java @@ -0,0 +1,79 @@ +package org.chenyon.file; + + +import java.util.List; + +public class OaFileLocalRefVo { + private String id; + private String bizId; + private String refId; + private String oaFormId; + private String oaFieldFlag; + private String owner; + private Boolean viewPublic = true; + private List subRefIds; + + public String getBizId() { + return bizId; + } + + public void setBizId(String bizId) { + this.bizId = bizId; + } + + public String getRefId() { + return refId; + } + + public void setRefId(String refId) { + this.refId = refId; + } + + public String getOaFormId() { + return oaFormId; + } + + public void setOaFormId(String oaFormId) { + this.oaFormId = oaFormId; + } + + public String getOaFieldFlag() { + return oaFieldFlag; + } + + public void setOaFieldFlag(String oaFieldFlag) { + this.oaFieldFlag = oaFieldFlag; + } + + public String getOwner() { + return owner; + } + + public void setOwner(String owner) { + this.owner = owner; + } + + public Boolean getViewPublic() { + return viewPublic; + } + + public void setViewPublic(Boolean viewPublic) { + this.viewPublic = viewPublic; + } + + public List getSubRefIds() { + return subRefIds; + } + + public void setSubRefIds(List subRefIds) { + this.subRefIds = subRefIds; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } +} diff --git a/src/main/java/org/chenyon/file/OaFileLocalSubRef.java b/src/main/java/org/chenyon/file/OaFileLocalSubRef.java new file mode 100644 index 0000000..42832c4 --- /dev/null +++ b/src/main/java/org/chenyon/file/OaFileLocalSubRef.java @@ -0,0 +1,38 @@ +package org.chenyon.file; + +import org.rcy.framework.api.entity.BaseEntity; + +import javax.persistence.Entity; +import javax.persistence.Table; + +@Entity +@Table(name = "OAFILELOCALSUBREF") +public class OaFileLocalSubRef extends BaseEntity { + private String refId; + private String url; + private String mainRefId; + + public String getRefId() { + return refId; + } + + public void setRefId(String refId) { + this.refId = refId; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getMainRefId() { + return mainRefId; + } + + public void setMainRefId(String mainRefId) { + this.mainRefId = mainRefId; + } +} diff --git a/src/main/java/org/chenyon/file/OaFileLocalSubRefDao.java b/src/main/java/org/chenyon/file/OaFileLocalSubRefDao.java new file mode 100644 index 0000000..79d2651 --- /dev/null +++ b/src/main/java/org/chenyon/file/OaFileLocalSubRefDao.java @@ -0,0 +1,10 @@ +package org.chenyon.file; + +import org.rcy.framework.data.dao.BaseDao; + +import java.util.List; + +public interface OaFileLocalSubRefDao extends BaseDao { + List findFileInfoByMainRefId(String mainRefId); + OaFileLocalSubRef findByUrl(String url); +} diff --git a/src/main/java/org/chenyon/file/OaFileLocalSubRefDao.xml b/src/main/java/org/chenyon/file/OaFileLocalSubRefDao.xml new file mode 100644 index 0000000..1b42295 --- /dev/null +++ b/src/main/java/org/chenyon/file/OaFileLocalSubRefDao.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/src/main/java/org/chenyon/file/OaFileVo.java b/src/main/java/org/chenyon/file/OaFileVo.java new file mode 100644 index 0000000..ed39f1c --- /dev/null +++ b/src/main/java/org/chenyon/file/OaFileVo.java @@ -0,0 +1,26 @@ +package org.chenyon.file; + +import java.io.Serializable; +import java.util.List; + +public class OaFileVo implements Serializable { + private String mainRefId; + private List subRefIds; + + public List getSubRefIds() { + return subRefIds; + } + + public void setSubRefIds(List subRefIds) { + this.subRefIds = subRefIds; + } + + public String getMainRefId() { + return mainRefId; + } + + public void setMainRefId(String mainRefId) { + this.mainRefId = mainRefId; + } + +} \ No newline at end of file diff --git a/src/main/java/org/chenyon/global/GlobalExceptionHandler.java b/src/main/java/org/chenyon/global/GlobalExceptionHandler.java new file mode 100644 index 0000000..06c5fe2 --- /dev/null +++ b/src/main/java/org/chenyon/global/GlobalExceptionHandler.java @@ -0,0 +1,24 @@ +package org.chenyon.global; + +import org.rcy.framework.api.entity.ResultMessage; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +@RestControllerAdvice +public class GlobalExceptionHandler { + + private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class); + + @ExceptionHandler(Exception.class) + public ResponseEntity handle(Exception e) { + log.error(e.getMessage(), e); + return ResponseEntity + .status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(ResultMessage.error()); + } + +} \ No newline at end of file diff --git a/src/main/java/org/chenyon/interceptor/LoginCheckInterceptor.java b/src/main/java/org/chenyon/interceptor/LoginCheckInterceptor.java new file mode 100644 index 0000000..6432be0 --- /dev/null +++ b/src/main/java/org/chenyon/interceptor/LoginCheckInterceptor.java @@ -0,0 +1,96 @@ +package org.chenyon.interceptor; + +import org.chenyon.user.LoginCheck; +import org.chenyon.user.UserContext; +import org.chenyon.user.UserService; +import org.chenyon.user.UserVo; +import org.chenyon.wx.WxUserSession; +import org.chenyon.wx.WxUserSessionService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.HandlerInterceptor; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.lang.reflect.Method; + +@Component +public class LoginCheckInterceptor implements HandlerInterceptor { + + private static final Logger log = LoggerFactory.getLogger(LoginCheckInterceptor.class); + @Autowired + private WxUserSessionService wxUserSessionService; + @Autowired + private UserService userService; + + @Override + public boolean preHandle(HttpServletRequest request, + HttpServletResponse response, + Object handler) throws Exception { + + // 处理OPTIONS预检请求 + if ("OPTIONS".equals(request.getMethod())) { + return true; + } + + if (!(handler instanceof HandlerMethod)) { + return true; + } + + HandlerMethod handlerMethod = (HandlerMethod) handler; + Method method = handlerMethod.getMethod(); + + // 检查方法上是否有AuthCheck注解 + LoginCheck authCheck = method.getAnnotation(LoginCheck.class); + if (authCheck == null) { + return true; // 没有注解,直接放行 + } + + // 获取token进行验证 + String token = request.getHeader("WT"); + String userType = request.getHeader("USERTYPE"); + if (token == null || !validateToken(token) || userType == null) { + response.setStatus(401); + return false; + } + UserContext context = setUserContext(token,userType); + if(context != null) { + UserContext.set(context); + } + return true; + } + + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { + // 清理线程变量 + UserContext.remove(); + } + + private UserContext setUserContext(String token,String userType) { + WxUserSession session = wxUserSessionService.getSessionInfoByThirdSession(token); + try { + UserVo userVo = userService.findByOpenIdAndUserType(session.getOpenId(), userType); + UserContext context = new UserContext(); + context.setUsername(userVo.getUserName()); + context.setOpenId(userVo.getOpenId()); + context.setCusNo(userVo.getCusNo()); + context.setToken(token); + context.setUserType(userType); + context.setPhone(userVo.getPhone()); + return context; + } catch (Exception e) { + log.error(e.getMessage(),e); + return null; + } + } + + private boolean validateToken(String token) { + // 实现token验证逻辑 + return !wxUserSessionService.sessionIsExpired(token); + } + +} + diff --git a/src/main/java/org/chenyon/location/IpLocationService.java b/src/main/java/org/chenyon/location/IpLocationService.java new file mode 100644 index 0000000..6d8d800 --- /dev/null +++ b/src/main/java/org/chenyon/location/IpLocationService.java @@ -0,0 +1,25 @@ +package org.chenyon.location; + +import org.rcy.framework.utils.net.HttpRequestUtils; +import org.rcy.framework.utils.net.HttpResponse; +import org.springframework.stereotype.Service; + +@Service +public class IpLocationService { + + private static final String API = "https://apis.map.qq.com/ws/location/v1/ip"; + + public String getLocationByIP(String ip) { + String key = "CQPBZ-R543L-ZCZPH-E5CPI-KMUF6-VRBGE"; + String url = API + "?ip=" + ip + "&key=" + key; + try { + HttpResponse response = HttpRequestUtils.sendGet(url, null); + if(response.getCode() == 200) { + return response.getRespStr(); + } + }catch (Exception e) { + + } + return null; + } +} diff --git a/src/main/java/org/chenyon/location/LocateController.java b/src/main/java/org/chenyon/location/LocateController.java new file mode 100644 index 0000000..57fc2f7 --- /dev/null +++ b/src/main/java/org/chenyon/location/LocateController.java @@ -0,0 +1,28 @@ +package org.chenyon.location; + +import org.rcy.framework.api.entity.ResultMessage; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletRequest; +import java.io.IOException; + +@RestController +@RequestMapping("/location") +public class LocateController { + @Autowired + private IpLocationService ipLocationService; + + @GetMapping("/getRealCity") + public ResultMessage getRealCity(HttpServletRequest request) throws IOException { +// String ip = ""; +// String locationJson = ipLocationService.getLocationByIP(ip); +// JsonNode root = JsonUtils.parseTree(locationJson); +// JsonNode adInfo = root.path("result").path("ad_info"); +// String city = adInfo.path("city").asText(); +// return ResultMessage.success(city != null ? city : "未知城市"); + return ResultMessage.success("宜昌"); + } +} diff --git a/src/main/java/org/chenyon/message/Message.java b/src/main/java/org/chenyon/message/Message.java new file mode 100644 index 0000000..aed7975 --- /dev/null +++ b/src/main/java/org/chenyon/message/Message.java @@ -0,0 +1,74 @@ +package org.chenyon.message; + +import org.rcy.framework.api.entity.BaseEntity; + +import javax.persistence.Entity; +import javax.persistence.Table; + +@Entity +@Table(name = "MESSAGE") +public class Message extends BaseEntity { + private String title; + private MessageType messageType; + private String messageContent; + private String messageTime; + private String messageReceiver; + private String bizId; + private Boolean hasRead = false; + + public MessageType getMessageType() { + return messageType; + } + + public void setMessageType(MessageType messageType) { + this.messageType = messageType; + } + + public String getMessageContent() { + return messageContent; + } + + public void setMessageContent(String messageContent) { + this.messageContent = messageContent; + } + + public String getMessageTime() { + return messageTime; + } + + public void setMessageTime(String messageTime) { + this.messageTime = messageTime; + } + + public String getMessageReceiver() { + return messageReceiver; + } + + public void setMessageReceiver(String messageReceiver) { + this.messageReceiver = messageReceiver; + } + + public String getBizId() { + return bizId; + } + + public void setBizId(String bizId) { + this.bizId = bizId; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public Boolean getHasRead() { + return hasRead; + } + + public void setHasRead(Boolean hasRead) { + this.hasRead = hasRead; + } +} diff --git a/src/main/java/org/chenyon/message/MessageController.java b/src/main/java/org/chenyon/message/MessageController.java new file mode 100644 index 0000000..a0697d0 --- /dev/null +++ b/src/main/java/org/chenyon/message/MessageController.java @@ -0,0 +1,80 @@ +package org.chenyon.message; + +import org.chenyon.user.LoginCheck; +import org.chenyon.user.UserContext; +import org.rcy.framework.api.entity.PageResult; +import org.rcy.framework.api.entity.ResultMessage; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/message") +public class MessageController { + + private static final Logger log = LoggerFactory.getLogger(MessageController.class); + + @Autowired + private MessageService messageService; + + @PostMapping("/queryPage") + @LoginCheck + public ResultMessage queryPage(@RequestBody MessageQueryCondition condition){ + UserContext userContext = UserContext.get(); + if(userContext == null || userContext.getCusNo() == null) { + return ResultMessage.success(new PageResult()); + } + try { + condition.setMessageReceiver(userContext.getCusNo()); + return ResultMessage.success(messageService.queryPage(condition)); + }catch (Exception e) { + log.error(e.getMessage(), e); + } + return ResultMessage.success(); + } + + @GetMapping("/detail") + @LoginCheck + public ResultMessage detail(@RequestParam("id") Long id){ + try { + return ResultMessage.success(messageService.detail(id)); + }catch (Exception e) { + log.error(e.getMessage(), e); + } + return ResultMessage.success(); + } + + @GetMapping("/read") + @LoginCheck + public ResultMessage read(@RequestParam("id") Long id){ + try { + messageService.read(id); + return ResultMessage.success(); + }catch (Exception e) { + log.error(e.getMessage(), e); + } + return ResultMessage.success(); + } + + @GetMapping("/countUnread") + @LoginCheck + public ResultMessage countUnread(){ + UserContext userContext = UserContext.get(); + if(userContext == null || userContext.getCusNo() == null) { + return ResultMessage.success(0); + } + try { + return ResultMessage.success(messageService.countUnread(userContext.getCusNo())); + }catch (Exception e) { + log.error(e.getMessage(), e); + } + return ResultMessage.success(0); + } + + + @PostMapping("/sendMessage") + public ResultMessage sendMessage(@RequestBody MessageVo vo){ + return ResultMessage.success(); + } +} diff --git a/src/main/java/org/chenyon/message/MessageDao.java b/src/main/java/org/chenyon/message/MessageDao.java new file mode 100644 index 0000000..b150dfe --- /dev/null +++ b/src/main/java/org/chenyon/message/MessageDao.java @@ -0,0 +1,10 @@ +package org.chenyon.message; + +import org.rcy.framework.data.dao.BaseDao; + +import java.util.List; + +public interface MessageDao extends BaseDao { + List pageQuery(MessageQueryCondition condition); + Long countCondition(MessageQueryCondition condition); +} diff --git a/src/main/java/org/chenyon/message/MessageDao.xml b/src/main/java/org/chenyon/message/MessageDao.xml new file mode 100644 index 0000000..5c67895 --- /dev/null +++ b/src/main/java/org/chenyon/message/MessageDao.xml @@ -0,0 +1,31 @@ + + + + + + + + + + 1 = 1 + + AND bizId = #{bizId} + + + AND messageReceiver = #{messageReceiver} + + + + + \ No newline at end of file diff --git a/src/main/java/org/chenyon/message/MessageQueryCondition.java b/src/main/java/org/chenyon/message/MessageQueryCondition.java new file mode 100644 index 0000000..4e2098d --- /dev/null +++ b/src/main/java/org/chenyon/message/MessageQueryCondition.java @@ -0,0 +1,16 @@ +package org.chenyon.message; + +import org.rcy.framework.api.entity.PageQueryRequest; + +public class MessageQueryCondition extends PageQueryRequest { + + private String messageReceiver; + + public String getMessageReceiver() { + return messageReceiver; + } + + public void setMessageReceiver(String messageReceiver) { + this.messageReceiver = messageReceiver; + } +} diff --git a/src/main/java/org/chenyon/message/MessageService.java b/src/main/java/org/chenyon/message/MessageService.java new file mode 100644 index 0000000..4dd62bd --- /dev/null +++ b/src/main/java/org/chenyon/message/MessageService.java @@ -0,0 +1,73 @@ +package org.chenyon.message; + +import org.chenyon.wx.AesException; +import org.chenyon.wx.WXBizMsgCrypt; +import org.rcy.framework.api.entity.PageResult; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.xml.parsers.ParserConfigurationException; +import java.util.List; + +@Service +@Transactional +public class MessageService { + + @Autowired + private MessageDao messageDao; + + + public MessageVo detail(Long id) { + Message message = messageDao.get(id); + MessageVo messageVo = new MessageVo(); + if(message != null) { + messageVo.setMessageContent(message.getMessageContent()); + messageVo.setTitle(message.getTitle()); + messageVo.setMessageTime(message.getMessageTime()); + } + return messageVo; + } + + public void read(Long id) { + Message message = messageDao.get(id); + message.setHasRead(true); + messageDao.updateByPrimaryKeySelective(message); + } + + public Integer countUnread(String cusNo){ + MessageQueryCondition messageQueryCondition = new MessageQueryCondition(); + messageQueryCondition.setMessageReceiver(cusNo); + Long count = messageDao.countCondition(messageQueryCondition); + return count.intValue(); + } + + public PageResult queryPage(MessageQueryCondition condition) { + List messages = messageDao.pageQuery(condition); + Long count = messageDao.countCondition(condition); + PageResult pageResult = new PageResult<>(); + pageResult.setResult(messages); + pageResult.setRecordTotal(count); + return pageResult; + } + + public void send(MessageVo messageVo) throws AesException, ParserConfigurationException { + // 消息入库 + // + String urlSend = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token="; + + + // 需要加密的明文 + String encodingAesKey = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFG"; + String token = "pamtest"; + String timestamp = "1409304348"; + String nonce = "xxxxxx"; + String appId = "wxb11529c136998cb6"; + String replyMsg = " 中文1407743423"; + + WXBizMsgCrypt pc = new WXBizMsgCrypt(token, encodingAesKey, appId); + String mingwen = pc.encryptMsg(replyMsg, timestamp, nonce); + System.out.println("加密后: " + mingwen); + + } +} diff --git a/src/main/java/org/chenyon/message/MessageType.java b/src/main/java/org/chenyon/message/MessageType.java new file mode 100644 index 0000000..170ee2a --- /dev/null +++ b/src/main/java/org/chenyon/message/MessageType.java @@ -0,0 +1,11 @@ +package org.chenyon.message; + +public enum MessageType { + SIGN("合同签署"), + BILL("账单催缴"), + ; + private String desc; + MessageType(String desc) { + this.desc = desc; + } +} diff --git a/src/main/java/org/chenyon/message/MessageVo.java b/src/main/java/org/chenyon/message/MessageVo.java new file mode 100644 index 0000000..69e181e --- /dev/null +++ b/src/main/java/org/chenyon/message/MessageVo.java @@ -0,0 +1,76 @@ +package org.chenyon.message; + +public class MessageVo { + private String id; + private String title; + private String messageType; + private String messageContent; + private String messageTime; + private String messageReceiver; + private String bizId; + private Boolean hasRead; + + public String getMessageType() { + return messageType; + } + + public void setMessageType(String messageType) { + this.messageType = messageType; + } + + public String getMessageContent() { + return messageContent; + } + + public void setMessageContent(String messageContent) { + this.messageContent = messageContent; + } + + public String getMessageTime() { + return messageTime; + } + + public void setMessageTime(String messageTime) { + this.messageTime = messageTime; + } + + public String getMessageReceiver() { + return messageReceiver; + } + + public void setMessageReceiver(String messageReceiver) { + this.messageReceiver = messageReceiver; + } + + public String getBizId() { + return bizId; + } + + public void setBizId(String bizId) { + this.bizId = bizId; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public Boolean getHasRead() { + return hasRead; + } + + public void setHasRead(Boolean hasRead) { + this.hasRead = hasRead; + } +} \ No newline at end of file diff --git a/src/main/java/org/chenyon/notice/NoticeController.java b/src/main/java/org/chenyon/notice/NoticeController.java new file mode 100644 index 0000000..007e66c --- /dev/null +++ b/src/main/java/org/chenyon/notice/NoticeController.java @@ -0,0 +1,40 @@ +package org.chenyon.notice; + +import org.chenyon.oa.OaNoticeService; +import org.rcy.framework.api.entity.PageResult; +import org.rcy.framework.api.entity.ResultMessage; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/notice") +public class NoticeController { + + private static final Logger log = LoggerFactory.getLogger(NoticeController.class); + + @Autowired + private OaNoticeService noticeService; + + @PostMapping("/pageQuery") + public ResultMessage pageQuery(@RequestBody NoticeQueryCondition condition) { + try { + PageResult pageList = noticeService.pageQuery(condition); + return ResultMessage.success(pageList); + }catch (Exception e){ + log.error(e.getMessage(),e); + } + return ResultMessage.success(new PageResult<>()); + } + + @GetMapping("/detail") + public ResultMessage detail(@RequestParam("id") String id) { + try { + return ResultMessage.success(noticeService.queryDetail(id)); + }catch (Exception e) { + log.error(e.getMessage(),e); + } + return ResultMessage.success(new NoticeVo()); + } +} diff --git a/src/main/java/org/chenyon/notice/NoticeQueryCondition.java b/src/main/java/org/chenyon/notice/NoticeQueryCondition.java new file mode 100644 index 0000000..8949c59 --- /dev/null +++ b/src/main/java/org/chenyon/notice/NoticeQueryCondition.java @@ -0,0 +1,6 @@ +package org.chenyon.notice; + +import org.rcy.framework.api.entity.PageQueryRequest; + +public class NoticeQueryCondition extends PageQueryRequest { +} diff --git a/src/main/java/org/chenyon/notice/NoticeVo.java b/src/main/java/org/chenyon/notice/NoticeVo.java new file mode 100644 index 0000000..5ff72de --- /dev/null +++ b/src/main/java/org/chenyon/notice/NoticeVo.java @@ -0,0 +1,115 @@ +package org.chenyon.notice; + +import java.util.List; + +public class NoticeVo { + + private String noticeId; + private String noticeTitle; + private String noticeType; + private String noticeContent; + private String status; + private String createBy; + private String createTime; + private String updateBy; + private String updateTime; + private String remark; + private List attachments; + private List imgs; + + public String getNoticeId() { + return noticeId; + } + + public void setNoticeId(String noticeId) { + this.noticeId = noticeId; + } + + public String getNoticeTitle() { + return noticeTitle; + } + + public void setNoticeTitle(String noticeTitle) { + this.noticeTitle = noticeTitle; + } + + public String getNoticeType() { + return noticeType; + } + + public void setNoticeType(String noticeType) { + this.noticeType = noticeType; + } + + public String getNoticeContent() { + return noticeContent; + } + + public void setNoticeContent(String noticeContent) { + this.noticeContent = noticeContent; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getCreateBy() { + return createBy; + } + + public void setCreateBy(String createBy) { + this.createBy = createBy; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getUpdateBy() { + return updateBy; + } + + public void setUpdateBy(String updateBy) { + this.updateBy = updateBy; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public List getAttachments() { + return attachments; + } + + public void setAttachments(List attachments) { + this.attachments = attachments; + } + + public List getImgs() { + return imgs; + } + + public void setImgs(List imgs) { + this.imgs = imgs; + } +} diff --git a/src/main/java/org/chenyon/oa/OaAssetService.java b/src/main/java/org/chenyon/oa/OaAssetService.java new file mode 100644 index 0000000..a5474ac --- /dev/null +++ b/src/main/java/org/chenyon/oa/OaAssetService.java @@ -0,0 +1,52 @@ +package org.chenyon.oa; + +import com.fasterxml.jackson.core.type.TypeReference; +import org.chenyon.assets.vo.AssetsPageQueryCondition; +import org.chenyon.constants.OaApiUrl; +import org.chenyon.oa.asset.OaAssetsVo; +import org.rcy.framework.api.entity.PageResult; +import org.rcy.framework.utils.json.JsonUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 查询OA资产信息的service + */ +@Service +public class OaAssetService { + + @Autowired + private SeeyonHttpClient seeyonHttpClient; + + public PageResult pageQueryAssets(AssetsPageQueryCondition condition) throws Exception { + OaResp oaResp = seeyonHttpClient.sendPost("分页查询资产信息",OaApiUrl.PAGE_QUERY_ASSETS, JsonUtils.convertJson(condition)); + String data = oaResp.getDataStr(); + Map mapRoot = JsonUtils.parseObject(data, Map.class); + Long totalCount = 0L; + List assetsVos = null; + if(mapRoot.get("totalCount") != null){ + totalCount = mapRoot.get("totalCount") instanceof Long ? (Long) mapRoot.get("totalCount") : Long.parseLong(mapRoot.get("totalCount") + ""); + } + if(mapRoot.get("datas") != null) { + assetsVos = JsonUtils.parseArray(JsonUtils.convertJson(mapRoot.get("datas")), OaAssetsVo.class); + } + PageResult pageResult = new PageResult<>(); + pageResult.setPageNo(condition.getPageNo()); + pageResult.setPageSize(condition.getPageSize()); + pageResult.setRecordTotal(totalCount.intValue()); + pageResult.setResult(assetsVos); + return pageResult; + } + + public OaAssetsVo queryAssetsDetail(String assetsNo) throws Exception { + Map params = new HashMap<>(); + params.put("assetsNo",assetsNo); + OaResp oaResp = seeyonHttpClient.sendPost("查询资产详情信息",OaApiUrl.QUERY_ASSETS_DETAIL, params); + return JsonUtils.parseObject(oaResp.getDataStr(),OaAssetsVo.class); + } + +} diff --git a/src/main/java/org/chenyon/oa/OaBillService.java b/src/main/java/org/chenyon/oa/OaBillService.java new file mode 100644 index 0000000..ec0e541 --- /dev/null +++ b/src/main/java/org/chenyon/oa/OaBillService.java @@ -0,0 +1,94 @@ +package org.chenyon.oa; + +import org.chenyon.bill.BillQueryCondition; +import org.chenyon.bill.PayRecordQueryConditon; +import org.chenyon.constants.OaApiUrl; +import org.chenyon.oa.asset.OaAssetsVo; +import org.chenyon.oa.bill.OaBillVo; +import org.chenyon.oa.bill.OaPayRecordVo; +import org.rcy.framework.api.entity.PageResult; +import org.rcy.framework.utils.json.JsonUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +@Service +public class OaBillService { + + @Autowired + private SeeyonHttpClient seeyonHttpClient; + + public PageResult pageQueryContractBill(BillQueryCondition condition) throws Exception { + OaResp oaResp = seeyonHttpClient.sendPost("分页查询合同账单信息", OaApiUrl.PAGE_QUERY_CONTRACT_BILL, JsonUtils.convertJson(condition)); + String data = oaResp.getDataStr(); + Map mapRoot = JsonUtils.parseObject(data, Map.class); + List oaBillVos = null; + Long totalCount = 0L; + if(mapRoot.get("totalCount") != null){ + totalCount = mapRoot.get("totalCount") instanceof Long ? (Long) mapRoot.get("totalCount") : Long.parseLong(mapRoot.get("totalCount") + ""); + } + if(mapRoot.get("datas") != null) { + oaBillVos = JsonUtils.parseArray(JsonUtils.convertJson(mapRoot.get("datas")), OaBillVo.class); + } + PageResult pageResult = new PageResult<>(); + pageResult.setPageNo(condition.getPageNo()); + pageResult.setPageSize(condition.getPageSize()); + pageResult.setRecordTotal(totalCount.intValue()); + pageResult.setResult(oaBillVos); + return pageResult; + } + + public PageResult pageQueryWaeBill(BillQueryCondition condition) throws Exception { + OaResp oaResp = seeyonHttpClient.sendPost("分页查询水电费账单信息", OaApiUrl.PAGE_QUERY_WAE_BILL, JsonUtils.convertJson(condition)); + String data = oaResp.getDataStr(); + Map mapRoot = JsonUtils.parseObject(data, Map.class); + List oaBillVos = null; + Long totalCount = 0L; + if(mapRoot.get("totalCount") != null){ + totalCount = mapRoot.get("totalCount") instanceof Long ? (Long) mapRoot.get("totalCount") : Long.parseLong(mapRoot.get("totalCount") + ""); + } + if(mapRoot.get("datas") != null) { + oaBillVos = JsonUtils.parseArray(JsonUtils.convertJson(mapRoot.get("datas")), OaBillVo.class); + } + PageResult pageResult = new PageResult<>(); + pageResult.setPageNo(condition.getPageNo()); + pageResult.setPageSize(condition.getPageSize()); + pageResult.setRecordTotal(totalCount.intValue()); + pageResult.setResult(oaBillVos); + return pageResult; + } + + public PageResult pageQueryPayRecord(PayRecordQueryConditon condition) throws Exception { + OaResp oaResp = seeyonHttpClient.sendPost("分页查询缴费记录信息", OaApiUrl.PAGE_QUERY_PAY_RECORD, JsonUtils.convertJson(condition)); + String data = oaResp.getDataStr(); + Map mapRoot = JsonUtils.parseObject(data, Map.class); + List oaPayRecordVos = null; + Long totalCount = 0L; + if(mapRoot.get("totalCount") != null){ + totalCount = mapRoot.get("totalCount") instanceof Long ? (Long) mapRoot.get("totalCount") : Long.parseLong(mapRoot.get("totalCount") + ""); + } + if(mapRoot.get("datas") != null) { + oaPayRecordVos = JsonUtils.parseArray(JsonUtils.convertJson(mapRoot.get("datas")), OaPayRecordVo.class); + } + PageResult pageResult = new PageResult<>(); + pageResult.setPageNo(condition.getPageNo()); + pageResult.setPageSize(condition.getPageSize()); + pageResult.setRecordTotal(totalCount.intValue()); + pageResult.setResult(oaPayRecordVos); + return pageResult; + } + + + public Integer countUnpayRentBills(Map params) throws Exception { + OaResp oaResp = seeyonHttpClient.sendPost("统计未缴租金账单数", OaApiUrl.COUNT_UNPAY_RENT_BILLS, JsonUtils.convertJson(params)); + return (Integer) oaResp.getData(); + } + + public Integer countUnpayWaeBills(Map params) throws Exception { + OaResp oaResp = seeyonHttpClient.sendPost("统计未缴水电费账单数", OaApiUrl.COUNT_UNPAY_WAE_BILLS, JsonUtils.convertJson(params)); + return (Integer) oaResp.getData(); + } + +} diff --git a/src/main/java/org/chenyon/oa/OaContractService.java b/src/main/java/org/chenyon/oa/OaContractService.java new file mode 100644 index 0000000..276f904 --- /dev/null +++ b/src/main/java/org/chenyon/oa/OaContractService.java @@ -0,0 +1,77 @@ +package org.chenyon.oa; + +import org.chenyon.constants.OaApiUrl; +import org.chenyon.contract.ContractQueryCondition; +import org.chenyon.oa.asset.OaAssetsVo; +import org.chenyon.oa.contract.OaContractVo; +import org.rcy.framework.api.entity.PageResult; +import org.rcy.framework.utils.json.JsonUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Service +public class OaContractService { + + @Autowired + private SeeyonHttpClient seeyonHttpClient; + + public PageResult pageQueryContract(ContractQueryCondition condition) throws Exception { + OaResp oaResp = seeyonHttpClient.sendPost("分页查询合同信息", OaApiUrl.PAGE_QUERY_CONTRACT, JsonUtils.convertJson(condition)); + String data = oaResp.getDataStr(); + Map mapRoot = JsonUtils.parseObject(data, Map.class); + List oaContractVos = null; + Long totalCount = 0L; + if(mapRoot.get("totalCount") != null){ + totalCount = mapRoot.get("totalCount") instanceof Long ? (Long) mapRoot.get("totalCount") : Long.parseLong(mapRoot.get("totalCount") + ""); + } + if(mapRoot.get("datas") != null) { + oaContractVos = JsonUtils.parseArray(JsonUtils.convertJson(mapRoot.get("datas")), OaContractVo.class); + } + PageResult pageResult = new PageResult<>(); + pageResult.setPageNo(condition.getPageNo()); + pageResult.setPageSize(condition.getPageSize()); + pageResult.setRecordTotal(totalCount.intValue()); + pageResult.setResult(oaContractVos); + return pageResult; + } + + public List queryAll(ContractQueryCondition condition) throws Exception { + OaResp oaResp = seeyonHttpClient.sendPost("查询客户所有已完成的合同信息", OaApiUrl.CONTRACT_ALL, JsonUtils.convertJson(condition)); + String data = oaResp.getDataStr(); + List vos = JsonUtils.parseArray(data, OaContractVo.class); + return vos; + } + + public OaContractVo queryContractDetail(ContractQueryCondition condition) throws Exception { + OaResp oaResp = seeyonHttpClient.sendPost("查询合同详情信息", OaApiUrl.CONTRACT_DETAIL, JsonUtils.convertJson(condition)); + String data = oaResp.getDataStr(); + OaContractVo oaContractVo = JsonUtils.parseObject(data, OaContractVo.class); + return oaContractVo; + } + + public Integer countUnsign(String cusNo) throws Exception { + Map params = new HashMap<>(); + params.put("cusNo", cusNo); + OaResp oaResp = seeyonHttpClient.sendPost("统计待签署合同份数", OaApiUrl.CONTRACT_COUNT_UNSIGN, JsonUtils.convertJson(params)); + String data = oaResp.getDataStr(); + return Integer.parseInt(data); + } + + public String getSignLink(String eFlowId) throws Exception { + OaResp oaResp = seeyonHttpClient.sendGet("获取签署链接", OaApiUrl.CONTRACT_SIGN_LINK + "?eFlowId=" +eFlowId); + return (String)oaResp.getData(); + } + + public OaAssetsVo pageQueryContractAssets(ContractQueryCondition condition) throws Exception { + OaResp oaResp = seeyonHttpClient.sendPost("分页查询合同关联资产信息", OaApiUrl.PAGE_QUERY_CONTRACT_ASSETS, JsonUtils.convertJson(condition)); + String data = oaResp.getDataStr(); + Map mapRoot = JsonUtils.parseObject(data, Map.class); + OaAssetsVo assetsVo = JsonUtils.parseObject(JsonUtils.convertJson(mapRoot.get("datas")), OaAssetsVo.class); + return assetsVo; + } +} diff --git a/src/main/java/org/chenyon/oa/OaCusService.java b/src/main/java/org/chenyon/oa/OaCusService.java new file mode 100644 index 0000000..f172170 --- /dev/null +++ b/src/main/java/org/chenyon/oa/OaCusService.java @@ -0,0 +1,61 @@ +package org.chenyon.oa; + +import org.chenyon.constants.OaApiUrl; +import org.chenyon.oa.cus.OaCusVo; +import org.chenyon.user.CusVo; +import org.rcy.framework.utils.json.JsonUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.HashMap; +import java.util.Map; + +@Service +public class OaCusService { + + private static final Logger log = LoggerFactory.getLogger(OaCusService.class); + @Autowired + private SeeyonHttpClient seeyonHttpClient; + + public OaCusVo getCusInfo(String cusNo) { + try { + //调用OA接口查询 + Map params = new HashMap<>(); + params.put("cusNo",cusNo); + OaResp oaResp = seeyonHttpClient.sendPost("查询OA客商信息",OaApiUrl.CUS_INFO, params); + Map map = (Map) oaResp.getData(); + OaCusVo oaCusVo = new OaCusVo(); + oaCusVo.setCusName((String) map.get("cusName")); + oaCusVo.setPhone((String) map.get("cusPhone")); +// oaCusVo.setIdCardNo((String) data.get("cardNo")); +// oaCusVo.setOrgNo((String) data.get("orgNo")); + oaCusVo.setCusNo(cusNo); + return oaCusVo; + }catch (Exception e) { + log.error("调用OA接口查询客商信息失败:"+e.getMessage(),e); + } + return null; + } + + public CusVo matchPersonCus(String phone) throws Exception { + Map params = new HashMap<>(); + params.put("phone",phone); + OaResp oaResp = seeyonHttpClient.sendPost("匹配个人客户",OaApiUrl.MATCH_PERSON, params); + Object data = oaResp.getData(); + CusVo cusVo = new CusVo(); + cusVo.setCusNo((String)data); + return cusVo; + } + + public CusVo matchOrgCus(String orgNo) throws Exception { + Map params = new HashMap<>(); + params.put("orgNo",orgNo); + OaResp oaResp = seeyonHttpClient.sendPost("匹配组织客户",OaApiUrl.MATCH_ORG, params); + Object data = oaResp.getData(); + CusVo cusVo = new CusVo(); + cusVo.setCusNo((String)data); + return cusVo; + } +} diff --git a/src/main/java/org/chenyon/oa/OaDisChargeService.java b/src/main/java/org/chenyon/oa/OaDisChargeService.java new file mode 100644 index 0000000..fda404e --- /dev/null +++ b/src/main/java/org/chenyon/oa/OaDisChargeService.java @@ -0,0 +1,49 @@ +package org.chenyon.oa; + +import org.chenyon.constants.OaApiUrl; +import org.chenyon.discharge.DisChargeApplyQueryCondition; +import org.chenyon.discharge.DisChargeApplyVo; +import org.chenyon.discharge.DisChargeRecordVo; +import org.chenyon.oa.asset.OaAssetsVo; +import org.chenyon.oa.bill.OaPayRecordVo; +import org.rcy.framework.api.entity.PageResult; +import org.rcy.framework.utils.json.JsonUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +@Service +public class OaDisChargeService { + + @Autowired + private SeeyonHttpClient seeyonHttpClient; + + public void apply(DisChargeApplyVo vo) throws Exception { + OaResp oaResp = seeyonHttpClient.sendPost("提交退租申请", OaApiUrl.DISCHARGE_APPLY, JsonUtils.convertJson(vo)); + if(oaResp.getCode() != 0){ + throw new Exception("提交退租申请失败"); + } + } + + public PageResult pageQueryApplyRecord(DisChargeApplyQueryCondition condition) throws Exception { + OaResp oaResp = seeyonHttpClient.sendPost("分页查询退租申请信息", OaApiUrl.PAGE_QUERY_DISCHARGE, JsonUtils.convertJson(condition)); + String data = oaResp.getDataStr(); + Map mapRoot = JsonUtils.parseObject(data, Map.class); + Long totalCount = 0L; + List vos = null; + if(mapRoot.get("totalCount") != null){ + totalCount = mapRoot.get("totalCount") instanceof Long ? (Long) mapRoot.get("totalCount") : Long.parseLong(mapRoot.get("totalCount") + ""); + } + if(mapRoot.get("datas") != null) { + vos = JsonUtils.parseArray(JsonUtils.convertJson(mapRoot.get("datas")), DisChargeRecordVo.class); + } + PageResult pageResult = new PageResult<>(); + pageResult.setPageNo(condition.getPageNo()); + pageResult.setPageSize(condition.getPageSize()); + pageResult.setRecordTotal(totalCount); + pageResult.setResult(vos); + return pageResult; + } +} diff --git a/src/main/java/org/chenyon/oa/OaFallBackService.java b/src/main/java/org/chenyon/oa/OaFallBackService.java new file mode 100644 index 0000000..566b3ce --- /dev/null +++ b/src/main/java/org/chenyon/oa/OaFallBackService.java @@ -0,0 +1,57 @@ +package org.chenyon.oa; + +import org.chenyon.constants.OaApiUrl; +import org.chenyon.fallback.FallbackQueryCondition; +import org.chenyon.fallback.FallbackSubmitVo; +import org.chenyon.fallback.FallbackVo; +import org.rcy.framework.api.entity.PageResult; +import org.rcy.framework.utils.json.JsonUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +@Service +public class OaFallBackService { + + @Autowired + private SeeyonHttpClient seeyonHttpClient; + + public void submit(FallbackSubmitVo vo) throws Exception { + OaResp oaResp = seeyonHttpClient.sendPost("新增留言", OaApiUrl.FALLBACK_SUBMIT, JsonUtils.convertJson(vo)); + if(oaResp.getCode() != 0){ + throw new Exception("新增留言失败"); + } + } + + public FallbackVo detail(String id) throws Exception { + FallbackQueryCondition condition = new FallbackQueryCondition(); + condition.setId(id); + OaResp oaResp = seeyonHttpClient.sendPost("查询留言详情", OaApiUrl.FALLBACK_DETAIL, JsonUtils.convertJson(condition)); + String data = oaResp.getDataStr(); + FallbackVo fallbackVo = JsonUtils.parseObject(data, FallbackVo.class); + return fallbackVo; + } + + public PageResult pageQuery(FallbackQueryCondition condition) throws Exception { + OaResp oaResp = seeyonHttpClient.sendPost("分页查询留言", OaApiUrl.PAGE_QUERY_FALLBACK, JsonUtils.convertJson(condition)); + String data = oaResp.getDataStr(); + Map mapRoot = JsonUtils.parseObject(data, Map.class); + Long totalCount = 0L; + List vos = null; + if(mapRoot.get("totalCount") != null){ + totalCount = mapRoot.get("totalCount") instanceof Long ? (Long) mapRoot.get("totalCount") : Long.parseLong(mapRoot.get("totalCount") + ""); + } + if(mapRoot.get("datas") != null) { + vos = JsonUtils.parseArray(JsonUtils.convertJson(mapRoot.get("datas")), FallbackVo.class); + } + PageResult pageResult = new PageResult<>(); + pageResult.setPageNo(condition.getPageNo()); + pageResult.setPageSize(condition.getPageSize()); + pageResult.setRecordTotal(totalCount.intValue()); + pageResult.setResult(vos); + return pageResult; + } + +} diff --git a/src/main/java/org/chenyon/oa/OaNoticeService.java b/src/main/java/org/chenyon/oa/OaNoticeService.java new file mode 100644 index 0000000..15652e7 --- /dev/null +++ b/src/main/java/org/chenyon/oa/OaNoticeService.java @@ -0,0 +1,47 @@ +package org.chenyon.oa; + +import org.chenyon.constants.OaApiUrl; +import org.chenyon.notice.NoticeQueryCondition; +import org.chenyon.notice.NoticeVo; +import org.rcy.framework.api.entity.PageResult; +import org.rcy.framework.utils.json.JsonUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Service +public class OaNoticeService { + + @Autowired + private SeeyonHttpClient seeyonHttpClient; + + public PageResult pageQuery(NoticeQueryCondition condition) throws Exception { + OaResp oaResp = seeyonHttpClient.sendPost("分页查询招商公告信息", OaApiUrl.PAGE_QUERY_NOTICE, JsonUtils.convertJson(condition)); + String data = oaResp.getDataStr(); + Map mapRoot = JsonUtils.parseObject(data, Map.class); + Long totalCount = 0L; + List vos = null; + if(mapRoot.get("totalCount") != null){ + totalCount = mapRoot.get("totalCount") instanceof Long ? (Long) mapRoot.get("totalCount") : Long.parseLong(mapRoot.get("totalCount") + ""); + } + if(mapRoot.get("datas") != null) { + vos = JsonUtils.parseArray(JsonUtils.convertJson(mapRoot.get("datas")), NoticeVo.class); + } + PageResult pageResult = new PageResult<>(); + pageResult.setPageNo(condition.getPageNo()); + pageResult.setPageSize(condition.getPageSize()); + pageResult.setRecordTotal(totalCount.intValue()); + pageResult.setResult(vos); + return pageResult; + } + + public NoticeVo queryDetail(String id) throws Exception { + Map params = new HashMap<>(); + params.put("id",id); + OaResp oaResp = seeyonHttpClient.sendPost("查询公告详情",OaApiUrl.QUERY_NOTICE_DETAIL, params); + return JsonUtils.parseObject(oaResp.getDataStr(),NoticeVo.class); + } +} diff --git a/src/main/java/org/chenyon/oa/OaPotentialService.java b/src/main/java/org/chenyon/oa/OaPotentialService.java new file mode 100644 index 0000000..d56629c --- /dev/null +++ b/src/main/java/org/chenyon/oa/OaPotentialService.java @@ -0,0 +1,21 @@ +package org.chenyon.oa; + +import org.chenyon.constants.OaApiUrl; +import org.chenyon.potential.ViewRecordVo; +import org.rcy.framework.utils.json.JsonUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class OaPotentialService { + + @Autowired + private SeeyonHttpClient seeyonHttpClient; + + public void add(ViewRecordVo viewRecordVo) throws Exception { + OaResp oaResp = seeyonHttpClient.sendPost("新增租户浏览记录", OaApiUrl.VIEW_RECORD_ADD, JsonUtils.convertJson(viewRecordVo)); + if(oaResp.getCode() != 0){ + throw new Exception("新增租户浏览记录失败"); + } + } +} diff --git a/src/main/java/org/chenyon/oa/OaReservationService.java b/src/main/java/org/chenyon/oa/OaReservationService.java new file mode 100644 index 0000000..b8464d4 --- /dev/null +++ b/src/main/java/org/chenyon/oa/OaReservationService.java @@ -0,0 +1,59 @@ +package org.chenyon.oa; + +import org.chenyon.constants.OaApiUrl; +import org.chenyon.fallback.FallbackSubmitVo; +import org.chenyon.reservation.ReservationQueryCondition; +import org.chenyon.reservation.ReservationSubmitVo; +import org.chenyon.reservation.ReservationVo; +import org.rcy.framework.api.entity.PageResult; +import org.rcy.framework.utils.json.JsonUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Service +public class OaReservationService { + + @Autowired + private SeeyonHttpClient seeyonHttpClient; + + public PageResult pageQuery(ReservationQueryCondition condition) throws Exception { + OaResp oaResp = seeyonHttpClient.sendPost("分页看房预约信息", OaApiUrl.PAGE_QUERY_RESERVATION, JsonUtils.convertJson(condition)); + String data = oaResp.getDataStr(); + Map mapRoot = JsonUtils.parseObject(data, Map.class); + Long totalCount = 0L; + List vos = null; + if(mapRoot.get("totalCount") != null){ + totalCount = mapRoot.get("totalCount") instanceof Long ? (Long) mapRoot.get("totalCount") : Long.parseLong(mapRoot.get("totalCount") + ""); + } + if(mapRoot.get("datas") != null) { + vos = JsonUtils.parseArray(JsonUtils.convertJson(mapRoot.get("datas")), ReservationVo.class); + } + PageResult pageResult = new PageResult<>(); + pageResult.setPageNo(condition.getPageNo()); + pageResult.setPageSize(condition.getPageSize()); + pageResult.setRecordTotal(totalCount.intValue()); + pageResult.setResult(vos); + return pageResult; + } + + public Integer countHandling(String openId) throws Exception { + Map params = new HashMap<>(); + params.put("openId",openId); + OaResp oaResp = seeyonHttpClient.sendPost("查询处理中预约", OaApiUrl.RESERVATION_COUNT_HANDLING,JsonUtils.convertJson(params)); + String data = oaResp.getDataStr(); + return Integer.parseInt(data); + } + + public void submit(ReservationSubmitVo vo) throws Exception { + OaResp oaResp = seeyonHttpClient.sendPost("新增预约", OaApiUrl.RESERVATION_SUBMIT,JsonUtils.convertJson(vo)); + if(oaResp.getCode() != 0){ + throw new Exception("新增预约失败"); + } + } + + +} diff --git a/src/main/java/org/chenyon/oa/OaResp.java b/src/main/java/org/chenyon/oa/OaResp.java new file mode 100644 index 0000000..51c3bc0 --- /dev/null +++ b/src/main/java/org/chenyon/oa/OaResp.java @@ -0,0 +1,40 @@ +package org.chenyon.oa; + +public class OaResp { + private Integer code; + private String message; + private Object data; + private String dataStr; + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + public String getDataStr() { + return dataStr; + } + + public void setDataStr(String dataStr) { + this.dataStr = dataStr; + } +} diff --git a/src/main/java/org/chenyon/oa/SeeyonHttpClient.java b/src/main/java/org/chenyon/oa/SeeyonHttpClient.java new file mode 100644 index 0000000..279b9ff --- /dev/null +++ b/src/main/java/org/chenyon/oa/SeeyonHttpClient.java @@ -0,0 +1,147 @@ +package org.chenyon.oa; + +import org.rcy.framework.utils.json.JsonUtils; +import org.rcy.framework.utils.net.HttpRequestUtils; +import org.rcy.framework.utils.net.HttpResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.io.File; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +@Service +public class SeeyonHttpClient { + private static final Logger log = LoggerFactory.getLogger(SeeyonHttpClient.class); + @Value("${seeyon.host}") + private String oaHost; + @Value("${seeyon.rest.restName}") + private String restName; + @Value("${seeyon.rest.restPwd}") + private String restPwd; + @Value("${local.fileStorage.path}") + private String fileStoragePath; + + private ConcurrentHashMap tokenCache = new ConcurrentHashMap<>(); + + + public OaResp sendGet(String bizName,String url) throws Exception { + Map headers = new HashMap<>(); + headers.put("token",getToken()); + log.info(bizName + "请求链接为:" + url); + HttpResponse response = HttpRequestUtils.sendGet(oaHost + "/seeyon/rest" + url,headers); + String respStr = response.getRespStr(); + log.info(bizName + "响应结果为:" + respStr); + return resovleResp(respStr); + } + + public OaResp sendPost(String bizName,String url,Map params) throws Exception { + Map headers = new HashMap<>(); + headers.put("token",getToken()); + headers.put("Content-Type","application/json;charset=UTF-8"); + String paramStr = JsonUtils.convertJson(params); + log.info(bizName + "请求参数为:" + paramStr); + HttpResponse response = HttpRequestUtils.sendPost(oaHost + "/seeyon/rest" + url,paramStr,headers); + String respStr = response.getRespStr(); + log.info(bizName + "响应结果为:" + respStr); + return resovleResp(respStr); + } + + public OaResp sendPost(String bizName,String url,String paramStr) throws Exception { + Map headers = new HashMap<>(); + headers.put("token",getToken()); + headers.put("Content-Type","application/json;charset=UTF-8"); + log.info(bizName + "请求参数为:" + paramStr); + HttpResponse response = HttpRequestUtils.sendPost(oaHost + "/seeyon/rest" + url,paramStr,headers); + String respStr = response.getRespStr(); + log.info(bizName + "响应结果为:" + respStr); + return resovleResp(respStr); + } + + public String downloadFile(String bizType,String url,String refId,Boolean isPulic,String owner) throws Exception { + Map headers = new HashMap<>(); + headers.put("token",getToken()); + log.info("下载OA文件请求参数为:" + refId + "," + isPulic + "," + owner); + String savePath = fileStoragePath; + String returnUrl = null; + if(Boolean.TRUE.equals(isPulic)){ + savePath += File.separator + "public" + File.separator + bizType; + returnUrl = "/" + "public/" + bizType; + }else { + savePath += File.separator + "private" + File.separator + bizType + File.separator + owner; + returnUrl = "/" + "private" + "/" + bizType + "/" + owner; + } + File tempDir = new File(savePath); + if (!tempDir.exists()) { + tempDir.mkdirs(); + } + savePath += File.separator + refId; + String fileGetUrl = oaHost + "/seeyon/rest" + url + "?refId=" + refId; + File file = HttpRequestUtils.downloadFile(fileGetUrl, headers, savePath); + log.info("文件绝对路径为:" + file.getAbsolutePath()); + returnUrl += "/" + file.getName(); + return returnUrl; + } + + + OaResp resovleResp(String respStr) throws IOException { + OaResp oaResp = JsonUtils.parseObject(respStr, OaResp.class); + oaResp.setDataStr(JsonUtils.convertJson(oaResp.getData())); + return oaResp; + } + + private String applyToken() { + String url = oaHost +"/seeyon/rest/token/" + restName + "/" + restPwd; + try { + HttpResponse response = HttpRequestUtils.sendGet(url, null); + if(response.getCode() == 200) { + String respStr = response.getRespStr(); + if (respStr.startsWith("{") && respStr.endsWith("}")) { + Map map = JsonUtils.parseObject(respStr, Map.class); + if(map.get("id") != null) { + return map.get("id") + ""; + } + throw new RuntimeException("获取token失败"); + } else { + return respStr; + } + }else { + throw new RuntimeException("获取token失败:" + response.getCode()); + } + }catch (Exception e) { + throw new RuntimeException("获取oaToken异常:" + e.getMessage(),e); + } + } + + private String getToken(){ + String token = tokenCache.get(restName); + if(token != null && !checkExpire(token)) { + return token; + }else { + String tokenStr = applyToken(); + tokenCache.put(restName, tokenStr); + return tokenStr; + } + } + + private boolean checkExpire(String token) { + String url = oaHost + "/seeyon/rest/cap4/batch/refresh"; + try{ + Map headers = new HashMap<>(); + headers.put("token",token); + headers.put("loginName",restName); + HttpResponse response = HttpRequestUtils.sendPost(url, null, headers); + if(response.getCode() == 200) { + return false; + }else { + return true; + } + } catch (Exception e){ + return true; + } + } +} diff --git a/src/main/java/org/chenyon/oa/asset/OaAssetsVo.java b/src/main/java/org/chenyon/oa/asset/OaAssetsVo.java new file mode 100644 index 0000000..decc1d7 --- /dev/null +++ b/src/main/java/org/chenyon/oa/asset/OaAssetsVo.java @@ -0,0 +1,243 @@ +package org.chenyon.oa.asset; + + +import org.chenyon.file.OaFileVo; + +import java.io.Serializable; + +public class OaAssetsVo implements Serializable { + private String assetsNo; // 资产编号 + private String assetsName; // 资产名称 + private String assetsType; //资产类型 + private String assetsStatus; //资产状态 + private String rentFee; //租金 + private String footPrint; //占地大小 + private String formId; //表单记录ID + private OaFileVo detailImg; //详情图片 + private OaFileVo vrImg; //vr图 + private String assetsDesc; //资产描述 + private String assetsAddress; //资产地址 + private String latitude; //纬度 + private String longitude; //经度 + private String unitNo; //单元号 + private String floorNo; //楼层号 + private String roomNo; //房间号 + private Boolean hasLift;//有无电梯 + private String managerName; //管理员 + private String managerPhone; //管理员电话 + private String layout; //户型 + private String orientation; //朝向 + private String building; //楼栋 + private String waterFee; //水费 + private String waterFeeUnit; //水费单位 + private String powerFee; //电费 + private String powerFeeUnit; //电费单位 + + public String getAssetsNo() { + return assetsNo; + } + + public void setAssetsNo(String assetsNo) { + this.assetsNo = assetsNo; + } + + public String getAssetsName() { + return assetsName; + } + + public void setAssetsName(String assetsName) { + this.assetsName = assetsName; + } + + public String getAssetsType() { + return assetsType; + } + + public void setAssetsType(String assetsType) { + this.assetsType = assetsType; + } + + public String getAssetsStatus() { + return assetsStatus; + } + + public void setAssetsStatus(String assetsStatus) { + this.assetsStatus = assetsStatus; + } + + public String getRentFee() { + return rentFee; + } + + public void setRentFee(String rentFee) { + this.rentFee = rentFee; + } + + public String getFootPrint() { + return footPrint; + } + + public void setFootPrint(String footPrint) { + this.footPrint = footPrint; + } + + public String getFormId() { + return formId; + } + + public void setFormId(String formId) { + this.formId = formId; + } + + public OaFileVo getDetailImg() { + return detailImg; + } + + public void setDetailImg(OaFileVo detailImg) { + this.detailImg = detailImg; + } + + public OaFileVo getVrImg() { + return vrImg; + } + + public void setVrImg(OaFileVo vrImg) { + this.vrImg = vrImg; + } + + public String getAssetsDesc() { + return assetsDesc; + } + + public void setAssetsDesc(String assetsDesc) { + this.assetsDesc = assetsDesc; + } + + public String getAssetsAddress() { + return assetsAddress; + } + + public void setAssetsAddress(String assetsAddress) { + this.assetsAddress = assetsAddress; + } + + public String getLatitude() { + return latitude; + } + + public void setLatitude(String latitude) { + this.latitude = latitude; + } + + public String getLongitude() { + return longitude; + } + + public void setLongitude(String longitude) { + this.longitude = longitude; + } + + public String getUnitNo() { + return unitNo; + } + + public void setUnitNo(String unitNo) { + this.unitNo = unitNo; + } + + public String getFloorNo() { + return floorNo; + } + + public void setFloorNo(String floorNo) { + this.floorNo = floorNo; + } + + public String getRoomNo() { + return roomNo; + } + + public void setRoomNo(String roomNo) { + this.roomNo = roomNo; + } + + public Boolean getHasLift() { + return hasLift; + } + + public void setHasLift(Boolean hasLift) { + this.hasLift = hasLift; + } + + public String getManagerPhone() { + return managerPhone; + } + + public void setManagerPhone(String managerPhone) { + this.managerPhone = managerPhone; + } + + public String getLayout() { + return layout; + } + + public void setLayout(String layout) { + this.layout = layout; + } + + public String getOrientation() { + return orientation; + } + + public void setOrientation(String orientation) { + this.orientation = orientation; + } + + public String getBuilding() { + return building; + } + + public void setBuilding(String building) { + this.building = building; + } + + public String getWaterFee() { + return waterFee; + } + + public void setWaterFee(String waterFee) { + this.waterFee = waterFee; + } + + public String getWaterFeeUnit() { + return waterFeeUnit; + } + + public void setWaterFeeUnit(String waterFeeUnit) { + this.waterFeeUnit = waterFeeUnit; + } + + public String getPowerFee() { + return powerFee; + } + + public void setPowerFee(String powerFee) { + this.powerFee = powerFee; + } + + public String getPowerFeeUnit() { + return powerFeeUnit; + } + + public void setPowerFeeUnit(String powerFeeUnit) { + this.powerFeeUnit = powerFeeUnit; + } + + public String getManagerName() { + return managerName; + } + + public void setManagerName(String managerName) { + this.managerName = managerName; + } +} diff --git a/src/main/java/org/chenyon/oa/bill/OaBillVo.java b/src/main/java/org/chenyon/oa/bill/OaBillVo.java new file mode 100644 index 0000000..4399453 --- /dev/null +++ b/src/main/java/org/chenyon/oa/bill/OaBillVo.java @@ -0,0 +1,112 @@ +package org.chenyon.oa.bill; + +public class OaBillVo { + private String billType; //账单类型 + private String billNo; //账单编号 + private String cusNo; //租户编号 + private String contractNo; //合同编号 + private String billAmount; //账单金额 + private String billStatus; //账单状态 + private String billStartDate; //账单开始日期 + private String billEndDate; //账单结束日期 + private String billPayEndDate; //账单支付截止日期 + private String billName;// 账单名称 + private String billPayTime; + private String formId; + + public String getBillStartDate() { + return billStartDate; + } + + public void setBillStartDate(String billStartDate) { + this.billStartDate = billStartDate; + } + + public String getBillPayEndDate() { + return billPayEndDate; + } + + public void setBillPayEndDate(String billPayEndDate) { + this.billPayEndDate = billPayEndDate; + } + + public String getBillType() { + return billType; + } + + public void setBillType(String billType) { + this.billType = billType; + } + + public String getBillNo() { + return billNo; + } + + public void setBillNo(String billNo) { + this.billNo = billNo; + } + + public String getCusNo() { + return cusNo; + } + + public void setCusNo(String cusNo) { + this.cusNo = cusNo; + } + + public String getContractNo() { + return contractNo; + } + + public void setContractNo(String contractNo) { + this.contractNo = contractNo; + } + + public String getBillAmount() { + return billAmount; + } + + public void setBillAmount(String billAmount) { + this.billAmount = billAmount; + } + + public String getBillStatus() { + return billStatus; + } + + public void setBillStatus(String billStatus) { + this.billStatus = billStatus; + } + + public String getBillEndDate() { + return billEndDate; + } + + public void setBillEndDate(String billEndDate) { + this.billEndDate = billEndDate; + } + + public String getBillName() { + return billName; + } + + public void setBillName(String billName) { + this.billName = billName; + } + + public String getBillPayTime() { + return billPayTime; + } + + public void setBillPayTime(String billPayTime) { + this.billPayTime = billPayTime; + } + + public String getFormId() { + return formId; + } + + public void setFormId(String formId) { + this.formId = formId; + } +} diff --git a/src/main/java/org/chenyon/oa/bill/OaPayRecordVo.java b/src/main/java/org/chenyon/oa/bill/OaPayRecordVo.java new file mode 100644 index 0000000..c00fb1c --- /dev/null +++ b/src/main/java/org/chenyon/oa/bill/OaPayRecordVo.java @@ -0,0 +1,59 @@ +package org.chenyon.oa.bill; + +public class OaPayRecordVo { + + private String feeType; + private String itemName; //记录项名称 + private String itemAmount; //记录项金额 + private String payDate; //支付日期 + private String inDate; //入账日期 + private String inOutType; //收支类型 + + public String getItemName() { + return itemName; + } + + public void setItemName(String itemName) { + this.itemName = itemName; + } + + public String getItemAmount() { + return itemAmount; + } + + public void setItemAmount(String itemAmount) { + this.itemAmount = itemAmount; + } + + public String getPayDate() { + return payDate; + } + + public void setPayDate(String payDate) { + this.payDate = payDate; + } + + public String getInDate() { + return inDate; + } + + public void setInDate(String inDate) { + this.inDate = inDate; + } + + public String getInOutType() { + return inOutType; + } + + public void setInOutType(String inOutType) { + this.inOutType = inOutType; + } + + public String getFeeType() { + return feeType; + } + + public void setFeeType(String feeType) { + this.feeType = feeType; + } +} diff --git a/src/main/java/org/chenyon/oa/contract/OaContractVo.java b/src/main/java/org/chenyon/oa/contract/OaContractVo.java new file mode 100644 index 0000000..0a2fcea --- /dev/null +++ b/src/main/java/org/chenyon/oa/contract/OaContractVo.java @@ -0,0 +1,99 @@ +package org.chenyon.oa.contract; + +import org.chenyon.file.OaFileVo; +import org.chenyon.oa.asset.OaAssetsVo; + +import java.util.List; + +public class OaContractVo { + private String formId;//表单ID + private String contractNo; //合同编号 + private String contractName; //合同名称 + private String signStatus; //签订状态 + private String startDate; + private String endDate; + private String eContractFlowId; //电子合同签署流程ID + private List assetsVos; //资产信息 + private OaFileVo eContractFile; //电子合同文件 + private String cusNo; //客商编码 + + public String getContractNo() { + return contractNo; + } + + public void setContractNo(String contractNo) { + this.contractNo = contractNo; + } + + public String getContractName() { + return contractName; + } + + public void setContractName(String contractName) { + this.contractName = contractName; + } + + public String getSignStatus() { + return signStatus; + } + + public void setSignStatus(String signStatus) { + this.signStatus = signStatus; + } + + public List getAssetsVos() { + return assetsVos; + } + + public void setAssetsVos(List assetsVos) { + this.assetsVos = assetsVos; + } + + public String getCusNo() { + return cusNo; + } + + public void setCusNo(String cusNo) { + this.cusNo = cusNo; + } + + public String geteContractFlowId() { + return eContractFlowId; + } + + public void seteContractFlowId(String eContractFlowId) { + this.eContractFlowId = eContractFlowId; + } + + public String getFormId() { + return formId; + } + + public void setFormId(String formId) { + this.formId = formId; + } + + public String getStartDate() { + return startDate; + } + + public void setStartDate(String startDate) { + this.startDate = startDate; + } + + public String getEndDate() { + return endDate; + } + + public void setEndDate(String endDate) { + this.endDate = endDate; + } + + public OaFileVo geteContractFile() { + return eContractFile; + } + + public void seteContractFile(OaFileVo eContractFile) { + this.eContractFile = eContractFile; + } +} diff --git a/src/main/java/org/chenyon/oa/cus/OaCusVo.java b/src/main/java/org/chenyon/oa/cus/OaCusVo.java new file mode 100644 index 0000000..55dcb3c --- /dev/null +++ b/src/main/java/org/chenyon/oa/cus/OaCusVo.java @@ -0,0 +1,59 @@ +package org.chenyon.oa.cus; + +public class OaCusVo { + + private String cusName; + private String phone; + private String idCardNo; + private String orgNo; + private String userType; + private String cusNo; + + public String getCusName() { + return cusName; + } + + public void setCusName(String cusName) { + this.cusName = cusName; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getIdCardNo() { + return idCardNo; + } + + public void setIdCardNo(String idCardNo) { + this.idCardNo = idCardNo; + } + + public String getUserType() { + return userType; + } + + public void setUserType(String userType) { + this.userType = userType; + } + + public String getOrgNo() { + return orgNo; + } + + public void setOrgNo(String orgNo) { + this.orgNo = orgNo; + } + + public String getCusNo() { + return cusNo; + } + + public void setCusNo(String cusNo) { + this.cusNo = cusNo; + } +} diff --git a/src/main/java/org/chenyon/oa/notice/OaNoticeVo.java b/src/main/java/org/chenyon/oa/notice/OaNoticeVo.java new file mode 100644 index 0000000..9190449 --- /dev/null +++ b/src/main/java/org/chenyon/oa/notice/OaNoticeVo.java @@ -0,0 +1,4 @@ +package org.chenyon.oa.notice; + +public class OaNoticeVo { +} diff --git a/src/main/java/org/chenyon/pay/Goods.java b/src/main/java/org/chenyon/pay/Goods.java new file mode 100644 index 0000000..7ce9b0e --- /dev/null +++ b/src/main/java/org/chenyon/pay/Goods.java @@ -0,0 +1,110 @@ +package org.chenyon.pay; + +public class Goods { + + private String goodsId; + private String goodsName; + private String quantity; + private String price; + private String unit; + private String goodsCategory; + private String body; + private String discount; + + /** 子商户号 */ + private String subMerchantId; + + /** 子订单号 */ + private String merOrderId; + + /** 子订单金额(分) */ + private String subOrderAmount; + + public String getGoodsId() { + return goodsId; + } + + public void setGoodsId(String goodsId) { + this.goodsId = goodsId; + } + + public String getGoodsName() { + return goodsName; + } + + public void setGoodsName(String goodsName) { + this.goodsName = goodsName; + } + + public String getQuantity() { + return quantity; + } + + public void setQuantity(String quantity) { + this.quantity = quantity; + } + + public String getPrice() { + return price; + } + + public void setPrice(String price) { + this.price = price; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + + public String getGoodsCategory() { + return goodsCategory; + } + + public void setGoodsCategory(String goodsCategory) { + this.goodsCategory = goodsCategory; + } + + public String getBody() { + return body; + } + + public void setBody(String body) { + this.body = body; + } + + public String getDiscount() { + return discount; + } + + public void setDiscount(String discount) { + this.discount = discount; + } + + public String getSubMerchantId() { + return subMerchantId; + } + + public void setSubMerchantId(String subMerchantId) { + this.subMerchantId = subMerchantId; + } + + public String getMerOrderId() { + return merOrderId; + } + + public void setMerOrderId(String merOrderId) { + this.merOrderId = merOrderId; + } + + public String getSubOrderAmount() { + return subOrderAmount; + } + + public void setSubOrderAmount(String subOrderAmount) { + this.subOrderAmount = subOrderAmount; + } +} diff --git a/src/main/java/org/chenyon/pay/Order.java b/src/main/java/org/chenyon/pay/Order.java new file mode 100644 index 0000000..b54b488 --- /dev/null +++ b/src/main/java/org/chenyon/pay/Order.java @@ -0,0 +1,52 @@ +package org.chenyon.pay; + +import org.rcy.framework.api.entity.BaseEntity; + +public class Order extends BaseEntity { + + private String bizId; + private String payerId; + private String payDate; + private String amount; + private String status; + + public String getBizId() { + return bizId; + } + + public void setBizId(String bizId) { + this.bizId = bizId; + } + + public String getPayerId() { + return payerId; + } + + public void setPayerId(String payerId) { + this.payerId = payerId; + } + + public String getPayDate() { + return payDate; + } + + public void setPayDate(String payDate) { + this.payDate = payDate; + } + + public String getAmount() { + return amount; + } + + public void setAmount(String amount) { + this.amount = amount; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } +} diff --git a/src/main/java/org/chenyon/pay/RetCommParams.java b/src/main/java/org/chenyon/pay/RetCommParams.java new file mode 100644 index 0000000..db497ee --- /dev/null +++ b/src/main/java/org/chenyon/pay/RetCommParams.java @@ -0,0 +1,32 @@ +package org.chenyon.pay; + +public class RetCommParams { + + private String foodOrderType; + private String parkId; + private String vehicleNo; + + public String getFoodOrderType() { + return foodOrderType; + } + + public void setFoodOrderType(String foodOrderType) { + this.foodOrderType = foodOrderType; + } + + public String getParkId() { + return parkId; + } + + public void setParkId(String parkId) { + this.parkId = parkId; + } + + public String getVehicleNo() { + return vehicleNo; + } + + public void setVehicleNo(String vehicleNo) { + this.vehicleNo = vehicleNo; + } +} \ No newline at end of file diff --git a/src/main/java/org/chenyon/pay/SubOrder.java b/src/main/java/org/chenyon/pay/SubOrder.java new file mode 100644 index 0000000..d6999e7 --- /dev/null +++ b/src/main/java/org/chenyon/pay/SubOrder.java @@ -0,0 +1,37 @@ +package org.chenyon.pay; + +public class SubOrder { + + /** 子商户号 */ + private String mid; + + /** 子订单号 */ + private String merOrderId; + + /** 金额(分) */ + private String totalAmount; + + public String getMid() { + return mid; + } + + public void setMid(String mid) { + this.mid = mid; + } + + public String getMerOrderId() { + return merOrderId; + } + + public void setMerOrderId(String merOrderId) { + this.merOrderId = merOrderId; + } + + public String getTotalAmount() { + return totalAmount; + } + + public void setTotalAmount(String totalAmount) { + this.totalAmount = totalAmount; + } +} \ No newline at end of file diff --git a/src/main/java/org/chenyon/pay/TmPayApiContextBuilder.java b/src/main/java/org/chenyon/pay/TmPayApiContextBuilder.java new file mode 100644 index 0000000..c826046 --- /dev/null +++ b/src/main/java/org/chenyon/pay/TmPayApiContextBuilder.java @@ -0,0 +1,27 @@ +package org.chenyon.pay; + +import com.chinaums.open.api.OpenApiCache; +import com.chinaums.open.api.OpenApiContext; +import com.chinaums.open.api.constants.ConfigBean; + +import java.util.UUID; + +public class TmPayApiContextBuilder { + + public static OpenApiContext build(String appId,String appKey,String url) { + + ConfigBean configBean = new ConfigBean(); + OpenApiContext context = new OpenApiContext(); + context.setStartTime(System.currentTimeMillis()); + context.setRequestId(UUID.randomUUID().toString().replace("-", "")); + context.setOpenServUrl(url.split("/v")[0].concat("/")); + context.setApiServiceUrl(url); + context.setVersion(url.split("/")[3]); + context.setServiceCode(url.split("/v")[1].substring(1)); + context.setAppId(appId); + context.setAppKey(appKey); + context.setConfigBean(configBean); + OpenApiCache.getCurrentToken(context); + return context; + } +} diff --git a/src/main/java/org/chenyon/pay/TmPayService.java b/src/main/java/org/chenyon/pay/TmPayService.java new file mode 100644 index 0000000..e952955 --- /dev/null +++ b/src/main/java/org/chenyon/pay/TmPayService.java @@ -0,0 +1,44 @@ +package org.chenyon.pay; + +import com.chinaums.open.api.OpenApiContext; + +import com.chinaums.open.api.internal.util.http.HttpTransport; +import org.rcy.framework.utils.json.JsonUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +@Service +public class TmPayService { + + @Value("${chinaums.api.dev.host}") + private String devHost; + @Value("chinaums.api.prod.host") + private String prodHost; + + public void weChatPayCreateOrder(UnifiedOrderRequest request) { + String url = "/v1/netpay/wx/unified-order"; + String appId = "123456"; + String appKey = "123456"; + OpenApiContext context = TmPayApiContextBuilder.build(appId, appKey, url); + Long totalAmount = null; +// if(Boolean.TRUE.equals(divisionFlag)){ +// request.setDivisionFlag(divisionFlag); +// List subOrders = new ArrayList<>(); +// }else { +// request.setTotalAmount(100); +// } + request.setRequestTimestamp(""); // 设置请求时间戳 + request.setMerOrderId("123456"); // 设置商户订单号 + request.setMid("");// 设置商户号 + request.setTid(""); + try { + HttpTransport.getInstance().doPost(context, JsonUtils.convertJson(request)); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + +} diff --git a/src/main/java/org/chenyon/pay/UnifiedOrderRequest.java b/src/main/java/org/chenyon/pay/UnifiedOrderRequest.java new file mode 100644 index 0000000..8692535 --- /dev/null +++ b/src/main/java/org/chenyon/pay/UnifiedOrderRequest.java @@ -0,0 +1,198 @@ +package org.chenyon.pay; + +import java.util.List; + +public class UnifiedOrderRequest { + + /** 请求时间 yyyy-MM-dd HH:mm:ss */ + private String requestTimestamp; + + /** 商户订单号 */ + private String merOrderId; + + /** 商户号 */ + private String mid; + + /** 终端号 */ + private String tid; + + /** 订单总金额(分) */ + private Long totalAmount; + /** 微信子商户appId*/ + private String subAppId; + /** 用户子标识*/ + private String subOpenId; + /** 微信:MINI / JSAPI */ + private String tradeType; + + /** 消息ID */ + private String msgId; + + /** 机构号 */ + private String instMid; + + /** 订单描述 */ + private String orderDesc; + /** 同步分账标识*/ + private Boolean divisionFlag; + /** 分账金额*/ + private Long platformAmount; + /** 通知地址 */ + private String notifyUrl; + + /** 客户端IP */ + private String clientIp; + + /** 商品信息 */ + private List goods; + + /** 子订单(分账) */ + private List subOrders; + + /** 扩展参数 */ + private RetCommParams retCommParams; + + public String getRequestTimestamp() { + return requestTimestamp; + } + + public void setRequestTimestamp(String requestTimestamp) { + this.requestTimestamp = requestTimestamp; + } + + public String getMerOrderId() { + return merOrderId; + } + + public void setMerOrderId(String merOrderId) { + this.merOrderId = merOrderId; + } + + public String getMid() { + return mid; + } + + public void setMid(String mid) { + this.mid = mid; + } + + public String getTid() { + return tid; + } + + public void setTid(String tid) { + this.tid = tid; + } + + public String getTradeType() { + return tradeType; + } + + public void setTradeType(String tradeType) { + this.tradeType = tradeType; + } + + public String getMsgId() { + return msgId; + } + + public void setMsgId(String msgId) { + this.msgId = msgId; + } + + public String getInstMid() { + return instMid; + } + + public void setInstMid(String instMid) { + this.instMid = instMid; + } + + public String getOrderDesc() { + return orderDesc; + } + + public void setOrderDesc(String orderDesc) { + this.orderDesc = orderDesc; + } + + public String getNotifyUrl() { + return notifyUrl; + } + + public void setNotifyUrl(String notifyUrl) { + this.notifyUrl = notifyUrl; + } + + public String getClientIp() { + return clientIp; + } + + public void setClientIp(String clientIp) { + this.clientIp = clientIp; + } + + public List getGoods() { + return goods; + } + + public void setGoods(List goods) { + this.goods = goods; + } + + public List getSubOrders() { + return subOrders; + } + + public void setSubOrders(List subOrders) { + this.subOrders = subOrders; + } + + public RetCommParams getRetCommParams() { + return retCommParams; + } + + public void setRetCommParams(RetCommParams retCommParams) { + this.retCommParams = retCommParams; + } + + public Long getTotalAmount() { + return totalAmount; + } + + public void setTotalAmount(Long totalAmount) { + this.totalAmount = totalAmount; + } + + public String getSubAppId() { + return subAppId; + } + + public void setSubAppId(String subAppId) { + this.subAppId = subAppId; + } + + public String getSubOpenId() { + return subOpenId; + } + + public void setSubOpenId(String subOpenId) { + this.subOpenId = subOpenId; + } + + public Boolean getDivisionFlag() { + return divisionFlag; + } + + public void setDivisionFlag(Boolean divisionFlag) { + this.divisionFlag = divisionFlag; + } + + public Long getPlatformAmount() { + return platformAmount; + } + + public void setPlatformAmount(Long platformAmount) { + this.platformAmount = platformAmount; + } +} \ No newline at end of file diff --git a/src/main/java/org/chenyon/potential/PotentialController.java b/src/main/java/org/chenyon/potential/PotentialController.java new file mode 100644 index 0000000..c69ad69 --- /dev/null +++ b/src/main/java/org/chenyon/potential/PotentialController.java @@ -0,0 +1,51 @@ +package org.chenyon.potential; + +import org.chenyon.user.LoginCheck; +import org.chenyon.user.UserContext; +import org.chenyon.user.UserService; +import org.chenyon.user.UserVo; +import org.chenyon.wx.WxUserSession; +import org.chenyon.wx.WxUserSessionService; +import org.rcy.framework.api.entity.ResultMessage; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletRequest; + +@RestController +@RequestMapping("/potential") +public class PotentialController { + + private static final Logger log = LoggerFactory.getLogger(PotentialController.class); + @Autowired + private PotentialService potentialService; + @Autowired + private UserService userService; + @Autowired + private WxUserSessionService wxUserSessionService; + + @GetMapping("/add") + public ResultMessage addViewRecord(HttpServletRequest request, @RequestParam("assetId") String assetId) { + try { + String token = request.getHeader("WT"); + String userType = request.getHeader("USERTYPE"); + WxUserSession session = wxUserSessionService.getSessionInfoByThirdSession(token); + UserVo userVo = userService.findByOpenIdAndUserType(session.getOpenId(), userType); + ViewRecordVo viewRecordVo = new ViewRecordVo(); + viewRecordVo.setAssetsNo(assetId); + viewRecordVo.setCusNo(userVo.getCusNo()); + viewRecordVo.setPhone(userVo.getPhone()); + viewRecordVo.setCusName(userVo.getUserName()); + potentialService.add(viewRecordVo); + }catch (Exception e) { + log.warn("记录租户浏览记录失败: " + e.getMessage(),e); + } + return ResultMessage.success(); + } + +} diff --git a/src/main/java/org/chenyon/potential/PotentialService.java b/src/main/java/org/chenyon/potential/PotentialService.java new file mode 100644 index 0000000..dc96f10 --- /dev/null +++ b/src/main/java/org/chenyon/potential/PotentialService.java @@ -0,0 +1,17 @@ +package org.chenyon.potential; + + +import org.chenyon.oa.OaPotentialService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class PotentialService { + + @Autowired + private OaPotentialService oaPotentialService; + + public void add(ViewRecordVo viewRecordVo) throws Exception { + oaPotentialService.add(viewRecordVo); + } +} diff --git a/src/main/java/org/chenyon/potential/ViewRecordVo.java b/src/main/java/org/chenyon/potential/ViewRecordVo.java new file mode 100644 index 0000000..1695117 --- /dev/null +++ b/src/main/java/org/chenyon/potential/ViewRecordVo.java @@ -0,0 +1,41 @@ +package org.chenyon.potential; + +public class ViewRecordVo { + + private String cusNo; + private String cusName; + private String phone; + private String assetsNo; + + public String getCusNo() { + return cusNo; + } + + public void setCusNo(String cusNo) { + this.cusNo = cusNo; + } + + public String getCusName() { + return cusName; + } + + public void setCusName(String cusName) { + this.cusName = cusName; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getAssetsNo() { + return assetsNo; + } + + public void setAssetsNo(String assetsNo) { + this.assetsNo = assetsNo; + } +} diff --git a/src/main/java/org/chenyon/reservation/ReservateController.java b/src/main/java/org/chenyon/reservation/ReservateController.java new file mode 100644 index 0000000..3d3300b --- /dev/null +++ b/src/main/java/org/chenyon/reservation/ReservateController.java @@ -0,0 +1,74 @@ +package org.chenyon.reservation; + +import org.chenyon.oa.OaReservationService; +import org.chenyon.user.LoginCheck; +import org.chenyon.user.UserContext; +import org.rcy.framework.api.entity.PageResult; +import org.rcy.framework.api.entity.ResultMessage; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; + +@RestController +@RequestMapping("/reservate") +public class ReservateController { + private static final Logger log = LoggerFactory.getLogger(ReservateController.class); + @Autowired + private OaReservationService reservateService; + + @LoginCheck + @PostMapping("/queryPage") + public ResultMessage queryPage(@RequestBody ReservationQueryCondition condition) { + try { + UserContext userContext = UserContext.get(); + if(userContext == null || userContext.getOpenId() == null) { + return ResultMessage.success(new PageResult()); + } + condition.setOpenId(userContext.getOpenId()); + return ResultMessage.success(reservateService.pageQuery(condition)); + }catch (Exception e) { + log.error(e.getMessage(),e); + } + return ResultMessage.success(new PageResult()); + } + + @LoginCheck + @PostMapping("/submit") + public ResultMessage submit(@RequestBody ReservationSubmitVo submitVo) { + try { + DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + UserContext userContext = UserContext.get(); + if(userContext == null || userContext.getOpenId() == null) { + return ResultMessage.error("提交失败"); + } + submitVo.setReserveDate(df.format(new Date())); + submitVo.setOpenId(userContext.getOpenId()); + reservateService.submit(submitVo); + return ResultMessage.success(); + }catch (Exception e) { + log.error(e.getMessage(),e); + } + return ResultMessage.error("提交失败"); + } + + @LoginCheck + @GetMapping("/countHandling") + public ResultMessage countHandling() { + try { + UserContext userContext = UserContext.get(); + if(userContext == null || userContext.getCusNo() == null) { + return ResultMessage.success(0); + } + return ResultMessage.success(reservateService.countHandling(userContext.getOpenId())); + }catch (Exception e) { + log.error(e.getMessage(),e); + } + return ResultMessage.success(0); + } + +} diff --git a/src/main/java/org/chenyon/reservation/ReservationQueryCondition.java b/src/main/java/org/chenyon/reservation/ReservationQueryCondition.java new file mode 100644 index 0000000..2b2d468 --- /dev/null +++ b/src/main/java/org/chenyon/reservation/ReservationQueryCondition.java @@ -0,0 +1,15 @@ +package org.chenyon.reservation; + +import org.rcy.framework.api.entity.PageQueryRequest; + +public class ReservationQueryCondition extends PageQueryRequest { + private String openId; + + public String getOpenId() { + return openId; + } + + public void setOpenId(String openId) { + this.openId = openId; + } +} diff --git a/src/main/java/org/chenyon/reservation/ReservationSubmitVo.java b/src/main/java/org/chenyon/reservation/ReservationSubmitVo.java new file mode 100644 index 0000000..aa280a5 --- /dev/null +++ b/src/main/java/org/chenyon/reservation/ReservationSubmitVo.java @@ -0,0 +1,58 @@ +package org.chenyon.reservation; + +public class ReservationSubmitVo { + private String openId; + private String assetsNo; + private String assetsName; + private String phone; + private String reserveDate; + private String reserveName; + + public String getAssetsNo() { + return assetsNo; + } + + public void setAssetsNo(String assetsNo) { + this.assetsNo = assetsNo; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getReserveDate() { + return reserveDate; + } + + public void setReserveDate(String reserveDate) { + this.reserveDate = reserveDate; + } + + public String getOpenId() { + return openId; + } + + public void setOpenId(String openId) { + this.openId = openId; + } + + public String getReserveName() { + return reserveName; + } + + public void setReserveName(String reserveName) { + this.reserveName = reserveName; + } + + public String getAssetsName() { + return assetsName; + } + + public void setAssetsName(String assetsName) { + this.assetsName = assetsName; + } +} diff --git a/src/main/java/org/chenyon/reservation/ReservationVo.java b/src/main/java/org/chenyon/reservation/ReservationVo.java new file mode 100644 index 0000000..d72afb2 --- /dev/null +++ b/src/main/java/org/chenyon/reservation/ReservationVo.java @@ -0,0 +1,94 @@ +package org.chenyon.reservation; + +public class ReservationVo { + private String openId; + private String id; //id + private String date; //预约时间 + private String status; //状态 + private String assetName; //资产名称 + private String assetAddress; //资产地址 + private String managerName; //管理员姓名 + private String managerPhone; //管理员电话 + private String lat; //纬度 + private String lng; //经度 + + public String getOpenId() { + return openId; + } + + public void setOpenId(String openId) { + this.openId = openId; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getDate() { + return date; + } + + public void setDate(String date) { + this.date = date; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getAssetName() { + return assetName; + } + + public void setAssetName(String assetName) { + this.assetName = assetName; + } + + public String getAssetAddress() { + return assetAddress; + } + + public void setAssetAddress(String assetAddress) { + this.assetAddress = assetAddress; + } + + public String getManagerName() { + return managerName; + } + + public void setManagerName(String managerName) { + this.managerName = managerName; + } + + public String getManagerPhone() { + return managerPhone; + } + + public void setManagerPhone(String managerPhone) { + this.managerPhone = managerPhone; + } + + public String getLat() { + return lat; + } + + public void setLat(String lat) { + this.lat = lat; + } + + public String getLng() { + return lng; + } + + public void setLng(String lng) { + this.lng = lng; + } +} diff --git a/src/main/java/org/chenyon/user/AuthInfoVo.java b/src/main/java/org/chenyon/user/AuthInfoVo.java new file mode 100644 index 0000000..9a5079d --- /dev/null +++ b/src/main/java/org/chenyon/user/AuthInfoVo.java @@ -0,0 +1,23 @@ +package org.chenyon.user; + +public class AuthInfoVo { + + private String userType; + private String code; + + public String getUserType() { + return userType; + } + + public void setUserType(String userType) { + this.userType = userType; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } +} diff --git a/src/main/java/org/chenyon/user/CusVo.java b/src/main/java/org/chenyon/user/CusVo.java new file mode 100644 index 0000000..43644ad --- /dev/null +++ b/src/main/java/org/chenyon/user/CusVo.java @@ -0,0 +1,25 @@ +package org.chenyon.user; + +import java.io.Serializable; + +public class CusVo implements Serializable { + + private String cusNo; + private String CusName; + + public String getCusNo() { + return cusNo; + } + + public void setCusNo(String cusNo) { + this.cusNo = cusNo; + } + + public String getCusName() { + return CusName; + } + + public void setCusName(String cusName) { + CusName = cusName; + } +} diff --git a/src/main/java/org/chenyon/user/LoginCheck.java b/src/main/java/org/chenyon/user/LoginCheck.java new file mode 100644 index 0000000..51ee460 --- /dev/null +++ b/src/main/java/org/chenyon/user/LoginCheck.java @@ -0,0 +1,9 @@ +package org.chenyon.user; + +import java.lang.annotation.*; + +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface LoginCheck { +} diff --git a/src/main/java/org/chenyon/user/LoginController.java b/src/main/java/org/chenyon/user/LoginController.java new file mode 100644 index 0000000..e4d10fc --- /dev/null +++ b/src/main/java/org/chenyon/user/LoginController.java @@ -0,0 +1,94 @@ +package org.chenyon.user; + +import org.chenyon.utils.RSAUtil; +import org.chenyon.wx.*; +import org.rcy.framework.api.entity.ResultMessage; +import org.rcy.framework.utils.json.JsonUtils; +import org.rcy.framework.utils.net.HttpRequestUtils; +import org.rcy.framework.utils.net.HttpResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import java.util.Map; +import java.util.UUID; + +@RestController +@RequestMapping("/login") +public class LoginController { + + private static final Logger log = LoggerFactory.getLogger(LoginController.class); + + @Autowired + private WeChatAccessTokenService weChatAccessTokenService; + @Autowired + private WeChatApi weChatApi; + @Autowired + private WxUserSessionService wxUserSessionService; + @Autowired + private UserService userService; + @Value("${rsa.privateKey}") + private String rasPrivateKey; + @Value("${rsa.publicKey}") + private String rasPublicKey; + + @PostMapping("/weChatLogin") + public ResultMessage weChatLogin(@RequestBody LoginVo loginVo) throws Exception{ + String accessToken = weChatAccessTokenService.getAccessToken(); + WeChatAuthInfo sessionInfo = weChatApi.getSessionInfo(loginVo.getLoginCode()); + WxUserSession wxUserSession = new WxUserSession(); + wxUserSession.setSessionKey(sessionInfo.getSession_key()); + wxUserSession.setOpenId(sessionInfo.getOpenid()); + wxUserSession.setUnionid(sessionInfo.getUnionid()); + String thirdSessionKey = UUID.randomUUID().toString().replace("-", ""); + wxUserSession.setThirdSession(thirdSessionKey); + String url = "https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=" + accessToken; + HttpResponse httpResponse = HttpRequestUtils.sendPost(url, "{\"code\":\"" + loginVo.getPhoneGetCode() + "\"}", null); + String respStr = httpResponse.getRespStr(); + Map respMap = JsonUtils.parseObject(respStr, Map.class); + Map phoneInfo = (Map) respMap.get("phone_info"); + User user = new User(); + if (phoneInfo != null) { + String phoneNumber = (String) phoneInfo.get("purePhoneNumber"); + user.setOpenId(sessionInfo.getOpenid()); + user.setPhone(phoneNumber); + user.setUserType(loginVo.getLoginType()); + userService.upsert(user); + } + wxUserSessionService.upsertWxUserSession(wxUserSession); + return ResultMessage.success(wxUserSession.getThirdSession()); + + } + + @GetMapping("/checkExpiration") + public ResultMessage checkExpiration(HttpServletRequest request) { + String token = request.getHeader("WT"); + return ResultMessage.success(wxUserSessionService.sessionIsExpired(token)); + } + + @GetMapping("/userInfo") + @LoginCheck + public ResultMessage userInfo() throws Exception { + UserContext userContext = UserContext.get(); + if(userContext == null) { + return ResultMessage.success(); + } + WxUserSession wxUserSession = wxUserSessionService.getSessionInfoByThirdSession(userContext.getToken()); + UserVo userVo = userService.findByOpenIdAndUserType(wxUserSession.getOpenId(), userContext.getUserType()); + return ResultMessage.success(userVo); + } + + @PostMapping("/updateVerifyCode") + @LoginCheck + public ResultMessage updateVerifyCode(HttpServletRequest request,@RequestBody AuthInfoVo authInfoVo) throws Exception { + String token = request.getHeader("WT"); + WxUserSession wxUserSession = wxUserSessionService.getSessionInfoByThirdSession(token); + userService.updateAuthInfo(wxUserSession.getOpenId(), + authInfoVo.getUserType(), + "0".equals(authInfoVo.getUserType()) ? RSAUtil.decrypt(authInfoVo.getCode(),rasPrivateKey) : authInfoVo.getCode()); + return ResultMessage.success(); + } +} diff --git a/src/main/java/org/chenyon/user/LoginVo.java b/src/main/java/org/chenyon/user/LoginVo.java new file mode 100644 index 0000000..06df8c2 --- /dev/null +++ b/src/main/java/org/chenyon/user/LoginVo.java @@ -0,0 +1,34 @@ +package org.chenyon.user; + +import org.springframework.web.bind.annotation.RequestParam; + +public class LoginVo { + + private String phoneGetCode; + private String loginCode; + private String loginType; + + public String getPhoneGetCode() { + return phoneGetCode; + } + + public void setPhoneGetCode(String phoneGetCode) { + this.phoneGetCode = phoneGetCode; + } + + public String getLoginCode() { + return loginCode; + } + + public void setLoginCode(String loginCode) { + this.loginCode = loginCode; + } + + public String getLoginType() { + return loginType; + } + + public void setLoginType(String loginType) { + this.loginType = loginType; + } +} diff --git a/src/main/java/org/chenyon/user/User.java b/src/main/java/org/chenyon/user/User.java new file mode 100644 index 0000000..df920cb --- /dev/null +++ b/src/main/java/org/chenyon/user/User.java @@ -0,0 +1,84 @@ +package org.chenyon.user; + +import org.rcy.framework.api.entity.BaseEntity; + +import javax.persistence.Entity; +import javax.persistence.Table; + +@Entity +@Table(name = "USER") +public class User extends BaseEntity { + + private String openId; + private String phone; + private Boolean oaAuth; + private String userType = "0"; + private String cusNo; + private String cardNo; + private String orgNo; + private Boolean subscribeMsg; + + public String getOpenId() { + return openId; + } + + public void setOpenId(String openId) { + this.openId = openId; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public Boolean getOaAuth() { + return oaAuth; + } + + public void setOaAuth(Boolean oaAuth) { + this.oaAuth = oaAuth; + } + + public String getUserType() { + return userType; + } + + public void setUserType(String userType) { + this.userType = userType; + } + + public String getCusNo() { + return cusNo; + } + + public void setCusNo(String cusNo) { + this.cusNo = cusNo; + } + + public String getCardNo() { + return cardNo; + } + + public void setCardNo(String cardNo) { + this.cardNo = cardNo; + } + + public String getOrgNo() { + return orgNo; + } + + public void setOrgNo(String orgNo) { + this.orgNo = orgNo; + } + + public Boolean getSubscribeMsg() { + return subscribeMsg; + } + + public void setSubscribeMsg(Boolean subscribeMsg) { + this.subscribeMsg = subscribeMsg; + } +} diff --git a/src/main/java/org/chenyon/user/UserContext.java b/src/main/java/org/chenyon/user/UserContext.java new file mode 100644 index 0000000..b566fb8 --- /dev/null +++ b/src/main/java/org/chenyon/user/UserContext.java @@ -0,0 +1,70 @@ +package org.chenyon.user; + +public class UserContext { + + private static final ThreadLocal userThreadLocal = new ThreadLocal<>(); + + private String openId; + private String username; + private String cusNo; + private String userType; + private String token; + private String phone; + + // 可扩展其他字段,如角色、权限等 + + public static void set(UserContext context) { + userThreadLocal.set(context); + } + + public static UserContext get() { + return userThreadLocal.get(); + } + + public static void remove() { + userThreadLocal.remove(); + } + + public String getOpenId() { + return openId; + } + + public void setOpenId(String openId) { + this.openId = openId; + } + + public String getCusNo() { + return cusNo; + } + + public void setCusNo(String cusNo) { + this.cusNo = cusNo; + } + + public String getUsername() { return username; } + public void setUsername(String username) { this.username = username; } + + public String getUserType() { + return userType; + } + + public void setUserType(String userType) { + this.userType = userType; + } + + public String getToken() { + return token; + } + + public void setToken(String token) { + this.token = token; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } +} diff --git a/src/main/java/org/chenyon/user/UserDao.java b/src/main/java/org/chenyon/user/UserDao.java new file mode 100644 index 0000000..03a92e6 --- /dev/null +++ b/src/main/java/org/chenyon/user/UserDao.java @@ -0,0 +1,8 @@ +package org.chenyon.user; + +import org.rcy.framework.data.dao.BaseDao; +import org.springframework.web.bind.annotation.RequestParam; + +public interface UserDao extends BaseDao { + User findByOpenIdAndUserType(@RequestParam("openId") String openId,@RequestParam("loginType") String loginType); +} diff --git a/src/main/java/org/chenyon/user/UserDao.xml b/src/main/java/org/chenyon/user/UserDao.xml new file mode 100644 index 0000000..d3000e3 --- /dev/null +++ b/src/main/java/org/chenyon/user/UserDao.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/src/main/java/org/chenyon/user/UserService.java b/src/main/java/org/chenyon/user/UserService.java new file mode 100644 index 0000000..1b97f0c --- /dev/null +++ b/src/main/java/org/chenyon/user/UserService.java @@ -0,0 +1,78 @@ +package org.chenyon.user; + +import org.chenyon.oa.OaCusService; +import org.chenyon.oa.cus.OaCusVo; +import org.rcy.framework.utils.aes.AESUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@Transactional +public class UserService { + + private static final Logger log = LoggerFactory.getLogger(UserService.class); + @Autowired + private UserDao userDao; + @Autowired + private OaCusService oaCusService; + + public void upsert(User user) { + User oldDbData = userDao.findByOpenIdAndUserType(user.getOpenId(), user.getUserType()); + if(oldDbData != null) { + if(!oldDbData.getPhone().equals(user.getPhone())){ + user.setId(oldDbData.getId()); + userDao.updateByPrimaryKeySelective(user); + } + }else { + userDao.save(user); + } + } + + public UserVo findByOpenIdAndUserType(String openId,String userType) { + User user = userDao.findByOpenIdAndUserType(openId, userType); + OaCusVo cusInfo = null; + try { + if(user.getCusNo() != null) { + cusInfo = oaCusService.getCusInfo(user.getCusNo()); + } + }catch (Exception e) { + log.error(e.getMessage(),e); + } + UserVo userVo = new UserVo(); + BeanUtils.copyProperties(user,userVo); + if(userVo.getOaAuth() == null) { + userVo.setOaAuth(false); + } + if(cusInfo != null) { + userVo.setUserName(cusInfo.getCusName()); + } + return userVo; + } + + public void updateAuthInfo(String openId,String userType,String verifyCode) throws Exception { + //调用oa接口客商信息 + User user = userDao.findByOpenIdAndUserType(openId, userType); + if(user == null) { + throw new Exception("用户不存在"); + } + String cusNo = null; + if("0".equals(userType)) { + CusVo cusVo = oaCusService.matchPersonCus(user.getPhone()); + cusNo = cusVo == null ? null : cusVo.getCusNo(); + user.setCardNo(AESUtils.encrypt(verifyCode,"abc123")); + }else if("1".equals(user.getUserType())) { + CusVo cusVo = oaCusService.matchOrgCus(verifyCode); + cusNo = cusVo == null ? null : cusVo.getCusNo(); + user.setOrgNo(verifyCode); + } + if(cusNo != null) { + user.setCusNo(cusNo); + user.setOaAuth(true); + userDao.updateByPrimaryKeySelective(user); + } + } +} diff --git a/src/main/java/org/chenyon/user/UserVo.java b/src/main/java/org/chenyon/user/UserVo.java new file mode 100644 index 0000000..27ad496 --- /dev/null +++ b/src/main/java/org/chenyon/user/UserVo.java @@ -0,0 +1,61 @@ +package org.chenyon.user; + +import java.io.Serializable; + +public class UserVo implements Serializable { + + private String cusNo; + private String openId; + private String phone; + private Boolean oaAuth; + private String userType = "0"; + private String userName; + + public String getOpenId() { + return openId; + } + + public void setOpenId(String openId) { + this.openId = openId; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public Boolean getOaAuth() { + return oaAuth; + } + + public void setOaAuth(Boolean oaAuth) { + this.oaAuth = oaAuth; + } + + public String getUserType() { + return userType; + } + + public void setUserType(String userType) { + this.userType = userType; + } + + public String getCusNo() { + return cusNo; + } + + public void setCusNo(String cusNo) { + this.cusNo = cusNo; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } +} diff --git a/src/main/java/org/chenyon/utils/HmacSha256Util.java b/src/main/java/org/chenyon/utils/HmacSha256Util.java new file mode 100644 index 0000000..fd7135e --- /dev/null +++ b/src/main/java/org/chenyon/utils/HmacSha256Util.java @@ -0,0 +1,85 @@ +package org.chenyon.utils; + +import org.rcy.framework.utils.aes.AESUtils; + +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; +import java.nio.charset.StandardCharsets; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; +import java.util.Base64; + +public class HmacSha256Util { + + /** + * 使用HMAC-SHA256算法生成签名(十六进制格式) + * @param data 待签名的数据 + * @param key 密钥 + * @return 十六进制格式的签名结果 + */ + public static String hmacSha256Hex(String data, String key) { + try { + Mac mac = Mac.getInstance("HmacSHA256"); + SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "HmacSHA256"); + mac.init(secretKey); + byte[] hash = mac.doFinal(data.getBytes(StandardCharsets.UTF_8)); + return bytesToHex(hash); + } catch (NoSuchAlgorithmException | InvalidKeyException e) { + throw new RuntimeException("HMAC-SHA256计算失败", e); + } + } + + /** + * 使用HMAC-SHA256算法生成签名(Base64格式) + * @param data 待签名的数据 + * @param key 密钥 + * @return Base64格式的签名结果 + */ + public static String hmacSha256Base64(String data, String key) { + try { + Mac mac = Mac.getInstance("HmacSHA256"); + SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "HmacSHA256"); + mac.init(secretKey); + byte[] hash = mac.doFinal(data.getBytes(StandardCharsets.UTF_8)); + return Base64.getEncoder().encodeToString(hash); + } catch (NoSuchAlgorithmException | InvalidKeyException e) { + throw new RuntimeException("HMAC-SHA256计算失败", e); + } + } + + /** + * 字节数组转十六进制字符串 + * @param bytes 字节数组 + * @return 十六进制字符串 + */ + private static String bytesToHex(byte[] bytes) { + StringBuilder hexString = new StringBuilder(); + for (byte b : bytes) { + String hex = Integer.toHexString(0xff & b); + if (hex.length() == 1) { + hexString.append('0'); + } + hexString.append(hex); + } + return hexString.toString(); + } + + /** + * 测试方法 + */ + public static void main(String[] args) { + String data = "abcdefg"; + String key = "123"; + // 生成十六进制格式签名 + String hexSignature = hmacSha256Hex(data, key); + System.out.println("HMAC-SHA256 Hex: " + hexSignature); + + // 生成Base64格式签名 + String base64Signature = hmacSha256Base64(data, key); + System.out.println("HMAC-SHA256 Base64: " + base64Signature); + + // 验证签名一致性 + String hexSignature2 = hmacSha256Hex(data, key); + System.out.println("签名验证: " + hexSignature.equals(hexSignature2)); + } +} \ No newline at end of file diff --git a/src/main/java/org/chenyon/utils/RSAUtil.java b/src/main/java/org/chenyon/utils/RSAUtil.java new file mode 100644 index 0000000..6df5d42 --- /dev/null +++ b/src/main/java/org/chenyon/utils/RSAUtil.java @@ -0,0 +1,28 @@ +package org.chenyon.utils; + +import javax.crypto.Cipher; +import java.nio.charset.StandardCharsets; +import java.security.KeyFactory; +import java.security.PrivateKey; +import java.security.spec.PKCS8EncodedKeySpec; +import java.util.Base64; + +public class RSAUtil { + + private static final String ALGORITHM = "RSA"; + + public static String decrypt(String encrypted, String privateKeyStr) throws Exception { + byte[] keyBytes = Base64.getDecoder().decode(privateKeyStr); + PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes); + KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM); + PrivateKey privateKey = keyFactory.generatePrivate(keySpec); + + Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); + cipher.init(Cipher.DECRYPT_MODE, privateKey); + + byte[] decodedData = Base64.getDecoder().decode(encrypted); + byte[] decrypted = cipher.doFinal(decodedData); + + return new String(decrypted, StandardCharsets.UTF_8); + } +} \ No newline at end of file diff --git a/src/main/java/org/chenyon/wx/AesException.java b/src/main/java/org/chenyon/wx/AesException.java new file mode 100644 index 0000000..a1267cf --- /dev/null +++ b/src/main/java/org/chenyon/wx/AesException.java @@ -0,0 +1,59 @@ +package org.chenyon.wx; + +@SuppressWarnings("serial") +public class AesException extends Exception { + + public final static int OK = 0; + public final static int ValidateSignatureError = -40001; + public final static int ParseXmlError = -40002; + public final static int ComputeSignatureError = -40003; + public final static int IllegalAesKey = -40004; + public final static int ValidateAppidError = -40005; + public final static int EncryptAESError = -40006; + public final static int DecryptAESError = -40007; + public final static int IllegalBuffer = -40008; + //public final static int EncodeBase64Error = -40009; + //public final static int DecodeBase64Error = -40010; + //public final static int GenReturnXmlError = -40011; + + private int code; + + private static String getMessage(int code) { + switch (code) { + case ValidateSignatureError: + return "签名验证错误"; + case ParseXmlError: + return "xml解析失败"; + case ComputeSignatureError: + return "sha加密生成签名失败"; + case IllegalAesKey: + return "SymmetricKey非法"; + case ValidateAppidError: + return "appid校验失败"; + case EncryptAESError: + return "aes加密失败"; + case DecryptAESError: + return "aes解密失败"; + case IllegalBuffer: + return "解密后得到的buffer非法"; +// case EncodeBase64Error: +// return "base64加密错误"; +// case DecodeBase64Error: +// return "base64解密错误"; +// case GenReturnXmlError: +// return "xml生成失败"; + default: + return null; // cannot be + } + } + + public int getCode() { + return code; + } + + AesException(int code) { + super(getMessage(code)); + this.code = code; + } + +} diff --git a/src/main/java/org/chenyon/wx/ByteGroup.java b/src/main/java/org/chenyon/wx/ByteGroup.java new file mode 100644 index 0000000..e0838d8 --- /dev/null +++ b/src/main/java/org/chenyon/wx/ByteGroup.java @@ -0,0 +1,26 @@ +package org.chenyon.wx; + +import java.util.ArrayList; + +public class ByteGroup { + ArrayList byteContainer = new ArrayList(); + + public byte[] toBytes() { + byte[] bytes = new byte[byteContainer.size()]; + for (int i = 0; i < byteContainer.size(); i++) { + bytes[i] = byteContainer.get(i); + } + return bytes; + } + + public ByteGroup addBytes(byte[] bytes) { + for (byte b : bytes) { + byteContainer.add(b); + } + return this; + } + + public int size() { + return byteContainer.size(); + } +} diff --git a/src/main/java/org/chenyon/wx/PKCS7Encoder.java b/src/main/java/org/chenyon/wx/PKCS7Encoder.java new file mode 100644 index 0000000..0fff389 --- /dev/null +++ b/src/main/java/org/chenyon/wx/PKCS7Encoder.java @@ -0,0 +1,59 @@ +package org.chenyon.wx; + +import java.nio.charset.Charset; +import java.util.Arrays; + +/** + * 提供基于PKCS7算法的加解密接口. + */ +class PKCS7Encoder { + static Charset CHARSET = Charset.forName("utf-8"); + static int BLOCK_SIZE = 32; + + /** + * 获得对明文进行补位填充的字节. + * + * @param count 需要进行填充补位操作的明文字节个数 + * @return 补齐用的字节数组 + */ + static byte[] encode(int count) { + // 计算需要填充的位数 + int amountToPad = BLOCK_SIZE - (count % BLOCK_SIZE); + if (amountToPad == 0) { + amountToPad = BLOCK_SIZE; + } + // 获得补位所用的字符 + char padChr = chr(amountToPad); + String tmp = new String(); + for (int index = 0; index < amountToPad; index++) { + tmp += padChr; + } + return tmp.getBytes(CHARSET); + } + + /** + * 删除解密后明文的补位字符 + * + * @param decrypted 解密后的明文 + * @return 删除补位字符后的明文 + */ + static byte[] decode(byte[] decrypted) { + int pad = (int) decrypted[decrypted.length - 1]; + if (pad < 1 || pad > 32) { + pad = 0; + } + return Arrays.copyOfRange(decrypted, 0, decrypted.length - pad); + } + + /** + * 将数字转化成ASCII码对应的字符,用于对明文进行补码 + * + * @param a 需要转化的数字 + * @return 转化得到的字符 + */ + static char chr(int a) { + byte target = (byte) (a & 0xFF); + return (char) target; + } + +} diff --git a/src/main/java/org/chenyon/wx/SHA1.java b/src/main/java/org/chenyon/wx/SHA1.java new file mode 100644 index 0000000..cf0573e --- /dev/null +++ b/src/main/java/org/chenyon/wx/SHA1.java @@ -0,0 +1,53 @@ +package org.chenyon.wx; + +import java.security.MessageDigest; +import java.util.Arrays; + +/** + * SHA1 class + * + * 计算公众平台的消息签名接口. + */ +class SHA1 { + + /** + * 用SHA1算法生成安全签名 + * @param token 票据 + * @param timestamp 时间戳 + * @param nonce 随机字符串 + * @param encrypt 密文 + * @return 安全签名 + * @throws AesException + */ + public static String getSHA1(String token, String timestamp, String nonce, String encrypt) throws AesException + { + try { + String[] array = new String[] { token, timestamp, nonce, encrypt }; + StringBuffer sb = new StringBuffer(); + // 字符串排序 + Arrays.sort(array); + for (int i = 0; i < 4; i++) { + sb.append(array[i]); + } + String str = sb.toString(); + // SHA1签名生成 + MessageDigest md = MessageDigest.getInstance("SHA-1"); + md.update(str.getBytes()); + byte[] digest = md.digest(); + + StringBuffer hexstr = new StringBuffer(); + String shaHex = ""; + for (int i = 0; i < digest.length; i++) { + shaHex = Integer.toHexString(digest[i] & 0xFF); + if (shaHex.length() < 2) { + hexstr.append(0); + } + hexstr.append(shaHex); + } + return hexstr.toString(); + } catch (Exception e) { + e.printStackTrace(); + throw new AesException(AesException.ComputeSignatureError); + } + } +} \ No newline at end of file diff --git a/src/main/java/org/chenyon/wx/WXBizMsgCrypt.java b/src/main/java/org/chenyon/wx/WXBizMsgCrypt.java new file mode 100644 index 0000000..63e1725 --- /dev/null +++ b/src/main/java/org/chenyon/wx/WXBizMsgCrypt.java @@ -0,0 +1,278 @@ +package org.chenyon.wx; + +import org.apache.commons.codec.binary.Base64; + +import java.nio.charset.Charset; +import java.util.Arrays; +import java.util.Random; + +import javax.crypto.Cipher; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; + + + +/** + * 提供接收和推送给公众平台消息的加解密接口(UTF8编码的字符串). + *
    + *
  1. 第三方回复加密消息给公众平台
  2. + *
  3. 第三方收到公众平台发送的消息,验证消息的安全性,并对消息进行解密。
  4. + *
+ * 说明:异常java.security.InvalidKeyException:illegal Key Size的解决方案 + *
    + *
  1. 在官方网站下载JCE无限制权限策略文件(JDK7的下载地址: + * http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html
  2. + *
  3. 下载后解压,可以看到local_policy.jar和US_export_policy.jar以及readme.txt
  4. + *
  5. 如果安装了JRE,将两个jar文件放到%JRE_HOME%\lib\security目录下覆盖原来的文件
  6. + *
  7. 如果安装了JDK,将两个jar文件放到%JDK_HOME%\jre\lib\security目录下覆盖原来文件
  8. + *
+ */ +public class WXBizMsgCrypt { + static Charset CHARSET = Charset.forName("utf-8"); + Base64 base64 = new Base64(); + byte[] aesKey; + String token; + String appId; + + /** + * 构造函数 + * @param token 公众平台上,开发者设置的token + * @param encodingAesKey 公众平台上,开发者设置的EncodingAESKey + * @param appId 公众平台appid + * + * @throws AesException 执行失败,请查看该异常的错误码和具体的错误信息 + */ + public WXBizMsgCrypt(String token, String encodingAesKey, String appId) throws AesException { + if (encodingAesKey.length() != 43) { + throw new AesException(AesException.IllegalAesKey); + } + + this.token = token; + this.appId = appId; + aesKey = Base64.decodeBase64(encodingAesKey + "="); + } + + // 生成4个字节的网络字节序 + byte[] getNetworkBytesOrder(int sourceNumber) { + byte[] orderBytes = new byte[4]; + orderBytes[3] = (byte) (sourceNumber & 0xFF); + orderBytes[2] = (byte) (sourceNumber >> 8 & 0xFF); + orderBytes[1] = (byte) (sourceNumber >> 16 & 0xFF); + orderBytes[0] = (byte) (sourceNumber >> 24 & 0xFF); + return orderBytes; + } + + // 还原4个字节的网络字节序 + int recoverNetworkBytesOrder(byte[] orderBytes) { + int sourceNumber = 0; + for (int i = 0; i < 4; i++) { + sourceNumber <<= 8; + sourceNumber |= orderBytes[i] & 0xff; + } + return sourceNumber; + } + + // 随机生成16位字符串 + String getRandomStr() { + String base = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + Random random = new Random(); + StringBuffer sb = new StringBuffer(); + for (int i = 0; i < 16; i++) { + int number = random.nextInt(base.length()); + sb.append(base.charAt(number)); + } + return sb.toString(); + } + + /** + * 对明文进行加密. + * + * @param text 需要加密的明文 + * @return 加密后base64编码的字符串 + * @throws AesException aes加密失败 + */ + String encrypt(String randomStr, String text) throws AesException { + ByteGroup byteCollector = new ByteGroup(); + byte[] randomStrBytes = randomStr.getBytes(CHARSET); + byte[] textBytes = text.getBytes(CHARSET); + byte[] networkBytesOrder = getNetworkBytesOrder(textBytes.length); + byte[] appidBytes = appId.getBytes(CHARSET); + + // randomStr + networkBytesOrder + text + appid + byteCollector.addBytes(randomStrBytes); + byteCollector.addBytes(networkBytesOrder); + byteCollector.addBytes(textBytes); + byteCollector.addBytes(appidBytes); + + // ... + pad: 使用自定义的填充方式对明文进行补位填充 + byte[] padBytes = PKCS7Encoder.encode(byteCollector.size()); + byteCollector.addBytes(padBytes); + + // 获得最终的字节流, 未加密 + byte[] unencrypted = byteCollector.toBytes(); + + try { + // 设置加密模式为AES的CBC模式 + Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding"); + SecretKeySpec keySpec = new SecretKeySpec(aesKey, "AES"); + IvParameterSpec iv = new IvParameterSpec(aesKey, 0, 16); + cipher.init(Cipher.ENCRYPT_MODE, keySpec, iv); + + // 加密 + byte[] encrypted = cipher.doFinal(unencrypted); + + // 使用BASE64对加密后的字符串进行编码 + String base64Encrypted = base64.encodeToString(encrypted); + + return base64Encrypted; + } catch (Exception e) { + e.printStackTrace(); + throw new AesException(AesException.EncryptAESError); + } + } + + /** + * 对密文进行解密. + * + * @param text 需要解密的密文 + * @return 解密得到的明文 + * @throws AesException aes解密失败 + */ + String decrypt(String text) throws AesException { + byte[] original; + try { + // 设置解密模式为AES的CBC模式 + Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding"); + SecretKeySpec key_spec = new SecretKeySpec(aesKey, "AES"); + IvParameterSpec iv = new IvParameterSpec(Arrays.copyOfRange(aesKey, 0, 16)); + cipher.init(Cipher.DECRYPT_MODE, key_spec, iv); + + // 使用BASE64对密文进行解码 + byte[] encrypted = Base64.decodeBase64(text); + + // 解密 + original = cipher.doFinal(encrypted); + } catch (Exception e) { + e.printStackTrace(); + throw new AesException(AesException.DecryptAESError); + } + + String xmlContent, from_appid; + try { + // 去除补位字符 + byte[] bytes = PKCS7Encoder.decode(original); + + // 分离16位随机字符串,网络字节序和AppId + byte[] networkOrder = Arrays.copyOfRange(bytes, 16, 20); + + int xmlLength = recoverNetworkBytesOrder(networkOrder); + + xmlContent = new String(Arrays.copyOfRange(bytes, 20, 20 + xmlLength), CHARSET); + from_appid = new String(Arrays.copyOfRange(bytes, 20 + xmlLength, bytes.length), + CHARSET); + } catch (Exception e) { + e.printStackTrace(); + throw new AesException(AesException.IllegalBuffer); + } + + // appid不相同的情况 + if (!from_appid.equals(appId)) { + throw new AesException(AesException.ValidateAppidError); + } + return xmlContent; + + } + + /** + * 将公众平台回复用户的消息加密打包. + *
    + *
  1. 对要发送的消息进行AES-CBC加密
  2. + *
  3. 生成安全签名
  4. + *
  5. 将消息密文和安全签名打包成xml格式
  6. + *
+ * + * @param replyMsg 公众平台待回复用户的消息,xml格式的字符串 + * @param timeStamp 时间戳,可以自己生成,也可以用URL参数的timestamp + * @param nonce 随机串,可以自己生成,也可以用URL参数的nonce + * + * @return 加密后的可以直接回复用户的密文,包括msg_signature, timestamp, nonce, encrypt的xml格式的字符串 + * @throws AesException 执行失败,请查看该异常的错误码和具体的错误信息 + */ + public String encryptMsg(String replyMsg, String timeStamp, String nonce) throws AesException { + // 加密 + String encrypt = encrypt(getRandomStr(), replyMsg); + + // 生成安全签名 + if (timeStamp == "") { + timeStamp = Long.toString(System.currentTimeMillis()); + } + + String signature = SHA1.getSHA1(token, timeStamp, nonce, encrypt); + + // System.out.println("发送给平台的签名是: " + signature[1].toString()); + // 生成发送的xml + String result = XMLParse.generate(encrypt, signature, timeStamp, nonce); + return result; + } + + /** + * 检验消息的真实性,并且获取解密后的明文. + *
    + *
  1. 利用收到的密文生成安全签名,进行签名验证
  2. + *
  3. 若验证通过,则提取xml中的加密消息
  4. + *
  5. 对消息进行解密
  6. + *
+ * + * @param msgSignature 签名串,对应URL参数的msg_signature + * @param timeStamp 时间戳,对应URL参数的timestamp + * @param nonce 随机串,对应URL参数的nonce + * @param postData 密文,对应POST请求的数据 + * + * @return 解密后的原文 + * @throws AesException 执行失败,请查看该异常的错误码和具体的错误信息 + */ + public String decryptMsg(String msgSignature, String timeStamp, String nonce, String postData) + throws AesException { + + // 密钥,公众账号的app secret + // 提取密文 + Object[] encrypt = XMLParse.extract(postData); + + // 验证安全签名 + String signature = SHA1.getSHA1(token, timeStamp, nonce, encrypt[1].toString()); + + // 和URL中的签名比较是否相等 + // System.out.println("第三方收到URL中的签名:" + msg_sign); + // System.out.println("第三方校验签名:" + signature); + if (!signature.equals(msgSignature)) { + throw new AesException(AesException.ValidateSignatureError); + } + + // 解密 + String result = decrypt(encrypt[1].toString()); + return result; + } + + /** + * 验证URL + * @param msgSignature 签名串,对应URL参数的msg_signature + * @param timeStamp 时间戳,对应URL参数的timestamp + * @param nonce 随机串,对应URL参数的nonce + * @param echoStr 随机串,对应URL参数的echostr + * + * @return 解密之后的echostr + * @throws AesException 执行失败,请查看该异常的错误码和具体的错误信息 + */ + public String verifyUrl(String msgSignature, String timeStamp, String nonce, String echoStr) + throws AesException { + String signature = SHA1.getSHA1(token, timeStamp, nonce, echoStr); + + if (!signature.equals(msgSignature)) { + throw new AesException(AesException.ValidateSignatureError); + } + + String result = decrypt(echoStr); + return result; + } + +} \ No newline at end of file diff --git a/src/main/java/org/chenyon/wx/WeChatAccessTokenService.java b/src/main/java/org/chenyon/wx/WeChatAccessTokenService.java new file mode 100644 index 0000000..0f7bd3b --- /dev/null +++ b/src/main/java/org/chenyon/wx/WeChatAccessTokenService.java @@ -0,0 +1,71 @@ +package org.chenyon.wx; + +import org.chenyon.cache.WxTokenCache; +import org.rcy.framework.utils.json.JsonUtils; +import org.rcy.framework.utils.net.HttpRequestUtils; +import org.rcy.framework.utils.net.HttpResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 微信小程序AccessToken 服务 + */ + +@Service +public class WeChatAccessTokenService { + + private static final Logger log = LoggerFactory.getLogger(WeChatAccessTokenService.class); + @Value("${wx.appId}") + private String miniProgramAppId; + @Value("${wx.appSecret}") + private String miniProgramAppSecret; + private ConcurrentHashMap cache = new ConcurrentHashMap<>(); + + + /** + * 获取 AccessToken,优先返回缓存 + */ + public String getAccessToken() { + long now = System.currentTimeMillis(); + String appId = miniProgramAppId; + String appSecret = miniProgramAppSecret; + // 缓存有效 + WxTokenCache accessToken = cache.get(appId); + if (accessToken != null && now < accessToken.getExpireTime()) { + return accessToken.getToken(); + } + // 请求微信获取 access_token + String url = String.format( + "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s", + appId, appSecret); + try { + Map headers = new HashMap<>(); + headers.put("grant_type", "client_credential"); + headers.put("appid", appId); + headers.put("secret", appSecret); + HttpResponse response = HttpRequestUtils.sendGet(url, headers); + Map respMap = JsonUtils.parseObject(response.getRespStr(), Map.class); + if (respMap.get("errcode") != null) { + throw new IOException("获取 access_token 请求失败: " + respMap.get("errmsg")); + } + String tokenStr = respMap.get("access_token") + ""; + long ttl = Long.parseLong(respMap.get("expires_in") + ""); + WxTokenCache tokenCache = new WxTokenCache(); + tokenCache.setToken(tokenStr); + tokenCache.setExpireTime(now + (ttl - 20000)); + cache.put(appId, tokenCache); + return tokenStr; + }catch (Exception e){ + log.error(e.getMessage(),e); + } + return null; + } + +} diff --git a/src/main/java/org/chenyon/wx/WeChatApi.java b/src/main/java/org/chenyon/wx/WeChatApi.java new file mode 100644 index 0000000..c1bb680 --- /dev/null +++ b/src/main/java/org/chenyon/wx/WeChatApi.java @@ -0,0 +1,31 @@ +package org.chenyon.wx; + +import org.rcy.framework.utils.json.JsonUtils; +import org.rcy.framework.utils.net.HttpRequestUtils; +import org.rcy.framework.utils.net.HttpResponse; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.util.Map; + +@Service +public class WeChatApi { + + @Value("${wx.appId}") + private String miniProgramAppId; + @Value("${wx.appSecret}") + private String miniProgramAppSecret; + + public WeChatAuthInfo getSessionInfo(String code) throws Exception { + String url = "https://api.weixin.qq.com/sns/jscode2session"; + url += "?appid=" + miniProgramAppId + "&secret=" + miniProgramAppSecret + "&js_code=" + code + "&grant_type=authorization_code"; + HttpResponse httpResponse = HttpRequestUtils.sendGet(url, null); + if(httpResponse.getCode() == 200) { + String httpResponseStr = httpResponse.getRespStr(); + WeChatAuthInfo weChatAuthInfo = JsonUtils.parseObject(httpResponseStr, WeChatAuthInfo.class); + return weChatAuthInfo; + }else { + return null; + } + } +} diff --git a/src/main/java/org/chenyon/wx/WeChatAuthInfo.java b/src/main/java/org/chenyon/wx/WeChatAuthInfo.java new file mode 100644 index 0000000..d12f63b --- /dev/null +++ b/src/main/java/org/chenyon/wx/WeChatAuthInfo.java @@ -0,0 +1,31 @@ +package org.chenyon.wx; + +public class WeChatAuthInfo { + private String openid; + private String session_key; + private String unionid; + + public String getOpenid() { + return openid; + } + + public void setOpenid(String openid) { + this.openid = openid; + } + + public String getSession_key() { + return session_key; + } + + public void setSession_key(String session_key) { + this.session_key = session_key; + } + + public String getUnionid() { + return unionid; + } + + public void setUnionid(String unionid) { + this.unionid = unionid; + } +} diff --git a/src/main/java/org/chenyon/wx/WxUserSession.java b/src/main/java/org/chenyon/wx/WxUserSession.java new file mode 100644 index 0000000..9166817 --- /dev/null +++ b/src/main/java/org/chenyon/wx/WxUserSession.java @@ -0,0 +1,72 @@ +package org.chenyon.wx; + +import org.rcy.framework.api.entity.BaseEntity; + +import javax.persistence.Entity; +import javax.persistence.Table; +import java.util.Date; + +@Entity +@Table(name = "WX_USER_SESSION") +public class WxUserSession extends BaseEntity { + + private String openId; + + private String sessionKey; + + private String thirdSession; + + private Date createTime; + + private Date updateTime; + + private String unionid; + + public String getOpenId() { + return openId; + } + + public void setOpenId(String openId) { + this.openId = openId; + } + + public String getSessionKey() { + return sessionKey; + } + + public void setSessionKey(String sessionKey) { + this.sessionKey = sessionKey; + } + + public String getThirdSession() { + return thirdSession; + } + + public void setThirdSession(String thirdSession) { + this.thirdSession = thirdSession; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public String getUnionid() { + return unionid; + } + + public void setUnionid(String unionid) { + this.unionid = unionid; + } +} diff --git a/src/main/java/org/chenyon/wx/WxUserSessionDao.java b/src/main/java/org/chenyon/wx/WxUserSessionDao.java new file mode 100644 index 0000000..b73c5b4 --- /dev/null +++ b/src/main/java/org/chenyon/wx/WxUserSessionDao.java @@ -0,0 +1,9 @@ +package org.chenyon.wx; + +import org.apache.ibatis.annotations.Param; +import org.rcy.framework.data.dao.BaseDao; + +public interface WxUserSessionDao extends BaseDao { + WxUserSession findByOpenId(@Param("openId") String openId); + WxUserSession findByThirdSession(String thirdSession); +} diff --git a/src/main/java/org/chenyon/wx/WxUserSessionDao.xml b/src/main/java/org/chenyon/wx/WxUserSessionDao.xml new file mode 100644 index 0000000..48cad2e --- /dev/null +++ b/src/main/java/org/chenyon/wx/WxUserSessionDao.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/org/chenyon/wx/WxUserSessionService.java b/src/main/java/org/chenyon/wx/WxUserSessionService.java new file mode 100644 index 0000000..1787c41 --- /dev/null +++ b/src/main/java/org/chenyon/wx/WxUserSessionService.java @@ -0,0 +1,79 @@ +package org.chenyon.wx; + +import org.chenyon.oa.OaCusService; +import org.chenyon.user.CusVo; +import org.chenyon.utils.HmacSha256Util; +import org.rcy.framework.utils.json.JsonUtils; +import org.rcy.framework.utils.net.HttpRequestUtils; +import org.rcy.framework.utils.net.HttpResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Map; + +@Service +@Transactional +public class WxUserSessionService { + + private static final Logger log = LoggerFactory.getLogger(WxUserSessionService.class); + + @Autowired + private WxUserSessionDao wxUserSessionDao; + @Autowired + private WeChatAccessTokenService tokenService; + @Autowired + private OaCusService oaCusService; + + public void upsertWxUserSession(WxUserSession wxUserSession) { + WxUserSession dbWxUserSession = wxUserSessionDao.findByOpenId(wxUserSession.getOpenId()); + if(dbWxUserSession == null) { + wxUserSessionDao.save(wxUserSession); + }else { + wxUserSession.setId(dbWxUserSession.getId()); + wxUserSessionDao.updateByPrimaryKeySelective(wxUserSession); + } + } + + public WxUserSession getSessionInfoByThirdSession(String thirdSession) { + WxUserSession wxUserSession = wxUserSessionDao.findByThirdSession(thirdSession); + return wxUserSession; + } + + public Boolean sessionIsExpired(String thirdSession) { + try { + WxUserSession session = wxUserSessionDao.findByThirdSession(thirdSession); + if(session == null) { + return true; + } + String accessToken = tokenService.getAccessToken(); + String url = "https://api.weixin.qq.com/wxa/checksession?access_token=" + accessToken + "&signature=" + HmacSha256Util.hmacSha256Hex("",session.getSessionKey()) + "&openid=" + session.getOpenId() +"&sig_method=hmac_sha256"; + HttpResponse response = HttpRequestUtils.sendGet(url, null); + if(response.getCode() != 200) { + return true; + } + Map map = JsonUtils.parseObject(response.getRespStr(), Map.class); + if((Integer) map.get("errcode") == 0) { + return false; + }else { + return true; + } + }catch (Exception e) { + log.error(e.getMessage(),e); + } + return true; + } + + public CusVo matchCus(String phone, String orgNo, String loginType) throws Exception { + //调用oa接口客商信息 + CusVo cusNo = null; + if("person".equals(loginType)) { + cusNo = oaCusService.matchPersonCus(phone); + }else if("compnay".equals(loginType)) { + cusNo = oaCusService.matchOrgCus(orgNo); + } + return cusNo; + } +} diff --git a/src/main/java/org/chenyon/wx/XMLParse.java b/src/main/java/org/chenyon/wx/XMLParse.java new file mode 100644 index 0000000..543a74b --- /dev/null +++ b/src/main/java/org/chenyon/wx/XMLParse.java @@ -0,0 +1,64 @@ +package org.chenyon.wx; + +import java.io.StringReader; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; +import org.xml.sax.InputSource; + +/** + * XMLParse class + * + * 提供提取消息格式中的密文及生成回复消息格式的接口. + */ +public class XMLParse { + + /** + * 提取出xml数据包中的加密消息 + * @param xmltext 待提取的xml字符串 + * @return 提取出的加密消息字符串 + * @throws AesException + */ + public static Object[] extract(String xmltext) throws AesException { + Object[] result = new Object[3]; + try { + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + DocumentBuilder db = dbf.newDocumentBuilder(); + StringReader sr = new StringReader(xmltext); + InputSource is = new InputSource(sr); + Document document = db.parse(is); + + Element root = document.getDocumentElement(); + NodeList nodelist1 = root.getElementsByTagName("Encrypt"); + NodeList nodelist2 = root.getElementsByTagName("ToUserName"); + result[0] = 0; + result[1] = nodelist1.item(0).getTextContent(); + result[2] = nodelist2.item(0).getTextContent(); + return result; + } catch (Exception e) { + e.printStackTrace(); + throw new AesException(AesException.ParseXmlError); + } + } + + /** + * 生成xml消息 + * @param encrypt 加密后的消息密文 + * @param signature 安全签名 + * @param timestamp 时间戳 + * @param nonce 随机字符串 + * @return 生成的xml字符串 + */ + public static String generate(String encrypt, String signature, String timestamp, String nonce) { + + String format = "\n" + "\n" + + "\n" + + "%3$s\n" + "\n" + ""; + return String.format(format, encrypt, signature, timestamp, nonce); + + } +} \ No newline at end of file diff --git a/src/main/scripts/shutdown.bat b/src/main/scripts/shutdown.bat new file mode 100644 index 0000000..0c4ec62 --- /dev/null +++ b/src/main/scripts/shutdown.bat @@ -0,0 +1,40 @@ +@echo off +REM --------------------------------------------- +REM Spring Boot 停止脚本 (Windows) +REM --------------------------------------------- + +setlocal +set APP_NAME=..\qichenrent.jar + +echo Stopping %APP_NAME% ... + +REM 查找 java 进程里运行的 jar +for /f "tokens=2" %%i in ('jps -l ^| findstr /i %APP_NAME%') do ( + set PID=%%i +) + +if "%PID%"=="" ( + echo No running process found for %APP_NAME%. + goto :EOF +) + +REM 尝试优雅停止 +echo Attempting to stop process PID %PID% ... +taskkill /PID %PID% /T + +REM 检查是否还在运行 +timeout /t 5 /nobreak > nul + +for /f "tokens=2" %%i in ('jps -l ^| findstr /i %APP_NAME%') do ( + set PID=%%i +) + +if not "%PID%"=="" ( + REM 强制杀掉 + echo Process still running. Force killing PID %PID% ... + taskkill /PID %PID% /F /T +) else ( + echo Application stopped successfully. +) + +endlocal \ No newline at end of file diff --git a/src/main/scripts/shutdown.sh b/src/main/scripts/shutdown.sh new file mode 100644 index 0000000..f3d1117 --- /dev/null +++ b/src/main/scripts/shutdown.sh @@ -0,0 +1,47 @@ +#!/bin/bash +# --------------------------------------------- +# Spring Boot 停止脚本 +# --------------------------------------------- + +PID_FILE=/usr/local/qichenrent/qichenrent.pid +WAIT_TIME=10 # 等待秒数 + +# 检查 PID 文件是否存在 +if [ ! -f $PID_FILE ]; then + echo "PID file not found at $PID_FILE. Application may not be running." + exit 0 +fi + +PID=$(cat $PID_FILE) +echo "Stopping application, PID=$PID ..." + +# 检查进程是否存在 +if ! ps -p $PID > /dev/null; then + echo "Process $PID not found. Cleaning up PID file." + rm -f $PID_FILE + exit 0 +fi + +# 发送 SIGTERM 正常关闭 +kill $PID + +# 等待应用优雅退出 +for i in $(seq 1 $WAIT_TIME); do + if ! ps -p $PID > /dev/null; then + echo "Application stopped gracefully." + rm -f $PID_FILE + exit 0 + fi + echo "Waiting for application to stop... ($i/$WAIT_TIME)" + sleep 1 +done + +# 如果还没停,强制杀掉 +if ps -p $PID > /dev/null; then + echo "Application did not stop within $WAIT_TIME seconds, force killing..." + kill -9 $PID +fi + +# 清理 PID 文件 +rm -f $PID_FILE +echo "Application stopped." diff --git a/src/main/scripts/startup.bat b/src/main/scripts/startup.bat new file mode 100644 index 0000000..c6192af --- /dev/null +++ b/src/main/scripts/startup.bat @@ -0,0 +1,37 @@ +@echo off +REM --------------------------------------------- +REM Spring Boot 启动脚本 (Windows) +REM 控制台窗口保持打开 +REM --------------------------------------------- + +setlocal + +REM ---- 配置 ---- +set APP_NAME=..\qichenrent.jar +set CONFIG_DIR=..\config +set LOG_DIR=..\logs +set JAVA_OPTS=-Xms512m -Xmx1024m -Dfile.encoding=UTF-8 + +REM 创建日志目录 +if not exist %LOG_DIR% ( + mkdir %LOG_DIR% +) + +REM 检查 jar 是否存在 +if not exist %APP_NAME% ( + echo ERROR: %APP_NAME% not found! + pause + exit /b 1 +) + +echo Starting %APP_NAME% ... + +REM 直接在当前窗口运行,不使用 start +java %JAVA_OPTS% -jar %APP_NAME% --spring.config.location=%CONFIG_DIR%\ + +REM 程序退出后保持窗口 +echo. +echo Application has exited. Press any key to close this window. +pause + +endlocal diff --git a/src/main/scripts/startup.sh b/src/main/scripts/startup.sh new file mode 100644 index 0000000..75a5266 --- /dev/null +++ b/src/main/scripts/startup.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +APP_NAME=/usr/local/qichenrent/qichenrent.jar +CONFIG_DIR=file:/usr/local/qichenrent/config/ +LOG_DIR=/usr/local/qichenrent/logs +PID_FILE=/usr/local/qichenrent/qichenrent.pid +JAVA_OPTS="-Xms512m -Xmx1024m -Dfile.encoding=UTF-8" + +mkdir -p $LOG_DIR + +echo "Starting $APP_NAME ..." + +nohup java $JAVA_OPTS -jar $APP_NAME \ +--spring.config.additional-location=$CONFIG_DIR \ +> $LOG_DIR/console.log 2>&1 & + +echo $! > $PID_FILE + +echo "Application started, PID=$(cat $PID_FILE)"