From dfcb8f95f76a716f915cb37ff253ea3d84b45bb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=B1=E6=B6=9B?= <15850646081@163.com> Date: Wed, 26 Mar 2025 15:35:34 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E8=89=BE=E5=BF=97OA?= =?UTF-8?q?=E4=BB=93=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resource/WEB-INF/CBS2ECConfig.xml | 36 ++ resource/WEB-INF/config/MyBatis.xml | 42 ++ .../WEB-INF/prop/hrmSalaryCBS8.properties | 12 + .../exception/CBS8RunTimeException.java | 15 + src/com/engine/salary/mapper/SQLMapper.java | 22 + src/com/engine/salary/mapper/SQLMapper.xml | 16 + .../salary/mapper/cbs/UfHkrdzbMapper.java | 57 +++ .../salary/mapper/cbs/UfHkrdzbMapper.xml | 322 +++++++++++++ .../engine/salary/remote/cbs8/HttpUtil.java | 233 ++++++++++ .../engine/salary/remote/cbs8/JsonUtil.java | 97 ++++ .../salary/remote/cbs8/SalaryEntityUtil.java | 417 +++++++++++++++++ .../cbs8/client/AccountManagementClient.java | 59 +++ .../cbs8/client/BillManagementClient.java | 56 +++ .../remote/cbs8/client/CBS8BaseClient.java | 166 +++++++ .../salary/remote/cbs8/common/Constants.java | 23 + .../remote/cbs8/config/EBS2ECConfig.java | 63 +++ .../remote/cbs8/example/SM2Example.java | 155 ++++++ .../salary/remote/cbs8/po/UfHkrdzbPO.java | 55 +++ .../remote/cbs8/request/CBS8BaseRequest.java | 10 + .../remote/cbs8/request/GetDtaRequest.java | 108 +++++ .../request/GetTransactionDetailRequest.java | 75 +++ .../cbs8/response/CBS8BaseResponse.java | 10 + .../remote/cbs8/response/CBS8PageInfo.java | 77 +++ .../remote/cbs8/response/GetDtaResponse.java | 440 ++++++++++++++++++ .../cbs8/response/GetTokenResponse.java | 20 + .../GetTransactionDetailResponse.java | 268 +++++++++++ .../salary/remote/cbs8/util/SM2Util.java | 215 +++++++++ .../remote/cbs8/util/db/IdGenerator.java | 51 ++ .../cbs8/util/db/MapperProxyFactory.java | 79 ++++ .../salary/remote/cbs8/xml/XStreamUtil.java | 68 +++ .../timer/SyncCBSAccountDetailsJob.java | 285 ++++++++++++ .../salary/timer/SyncCBSBillPoolJob.java | 311 +++++++++++++ .../salary/timer/SyncCBSPayDetailsJob.java | 344 ++++++++++++++ 33 files changed, 4207 insertions(+) create mode 100644 resource/WEB-INF/CBS2ECConfig.xml create mode 100644 resource/WEB-INF/config/MyBatis.xml create mode 100644 resource/WEB-INF/prop/hrmSalaryCBS8.properties create mode 100644 src/com/engine/salary/exception/CBS8RunTimeException.java create mode 100644 src/com/engine/salary/mapper/SQLMapper.java create mode 100644 src/com/engine/salary/mapper/SQLMapper.xml create mode 100644 src/com/engine/salary/mapper/cbs/UfHkrdzbMapper.java create mode 100644 src/com/engine/salary/mapper/cbs/UfHkrdzbMapper.xml create mode 100644 src/com/engine/salary/remote/cbs8/HttpUtil.java create mode 100644 src/com/engine/salary/remote/cbs8/JsonUtil.java create mode 100644 src/com/engine/salary/remote/cbs8/SalaryEntityUtil.java create mode 100644 src/com/engine/salary/remote/cbs8/client/AccountManagementClient.java create mode 100644 src/com/engine/salary/remote/cbs8/client/BillManagementClient.java create mode 100644 src/com/engine/salary/remote/cbs8/client/CBS8BaseClient.java create mode 100644 src/com/engine/salary/remote/cbs8/common/Constants.java create mode 100644 src/com/engine/salary/remote/cbs8/config/EBS2ECConfig.java create mode 100644 src/com/engine/salary/remote/cbs8/example/SM2Example.java create mode 100644 src/com/engine/salary/remote/cbs8/po/UfHkrdzbPO.java create mode 100644 src/com/engine/salary/remote/cbs8/request/CBS8BaseRequest.java create mode 100644 src/com/engine/salary/remote/cbs8/request/GetDtaRequest.java create mode 100644 src/com/engine/salary/remote/cbs8/request/GetTransactionDetailRequest.java create mode 100644 src/com/engine/salary/remote/cbs8/response/CBS8BaseResponse.java create mode 100644 src/com/engine/salary/remote/cbs8/response/CBS8PageInfo.java create mode 100644 src/com/engine/salary/remote/cbs8/response/GetDtaResponse.java create mode 100644 src/com/engine/salary/remote/cbs8/response/GetTokenResponse.java create mode 100644 src/com/engine/salary/remote/cbs8/response/GetTransactionDetailResponse.java create mode 100644 src/com/engine/salary/remote/cbs8/util/SM2Util.java create mode 100644 src/com/engine/salary/remote/cbs8/util/db/IdGenerator.java create mode 100644 src/com/engine/salary/remote/cbs8/util/db/MapperProxyFactory.java create mode 100644 src/com/engine/salary/remote/cbs8/xml/XStreamUtil.java create mode 100644 src/com/engine/salary/timer/SyncCBSAccountDetailsJob.java create mode 100644 src/com/engine/salary/timer/SyncCBSBillPoolJob.java create mode 100644 src/com/engine/salary/timer/SyncCBSPayDetailsJob.java diff --git a/resource/WEB-INF/CBS2ECConfig.xml b/resource/WEB-INF/CBS2ECConfig.xml new file mode 100644 index 0000000..e6bde94 --- /dev/null +++ b/resource/WEB-INF/CBS2ECConfig.xml @@ -0,0 +1,36 @@ + + + + + + + + + + +
+ + + + + + + + + + +
+ + + + + + + + + + +
+ + +
diff --git a/resource/WEB-INF/config/MyBatis.xml b/resource/WEB-INF/config/MyBatis.xml new file mode 100644 index 0000000..31cc6f0 --- /dev/null +++ b/resource/WEB-INF/config/MyBatis.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resource/WEB-INF/prop/hrmSalaryCBS8.properties b/resource/WEB-INF/prop/hrmSalaryCBS8.properties new file mode 100644 index 0000000..0207299 --- /dev/null +++ b/resource/WEB-INF/prop/hrmSalaryCBS8.properties @@ -0,0 +1,12 @@ +# ??ID +app_id=Yg8fWSvs +# ???? +app_secret=1f23768c02219d7864b0009c30a1b6a59fe84606 +# ???? +bodyEncryptionKey=0467E11F7CA86D884C990D4F3F5C2A1EFEEBB02B9878F4FDDCB7899DFABADCC8F38FC23F007A8AF9B2EB8A1D313959647CD8A1542F0414116AE6CFCA792346A802 +# ???????? +signEncryptionPrivateKey=135d6d61d5e820a979e58f4939abbd528c82528c8c276852445854377e1df247 +# ???????? +bodyDecryptionKey=135d6d61d5e820a979e58f4939abbd528c82528c8c276852445854377e1df247 +# ???? +host=https://cbs8-openapi-reprd.csuat.cmburl.cn \ No newline at end of file diff --git a/src/com/engine/salary/exception/CBS8RunTimeException.java b/src/com/engine/salary/exception/CBS8RunTimeException.java new file mode 100644 index 0000000..b9594e9 --- /dev/null +++ b/src/com/engine/salary/exception/CBS8RunTimeException.java @@ -0,0 +1,15 @@ +package com.engine.salary.exception; + +public class CBS8RunTimeException extends RuntimeException { + public CBS8RunTimeException(String message) { + super(message); + } + + public CBS8RunTimeException(Throwable cause) { + super(cause); + } + + public CBS8RunTimeException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/src/com/engine/salary/mapper/SQLMapper.java b/src/com/engine/salary/mapper/SQLMapper.java new file mode 100644 index 0000000..c3a7f81 --- /dev/null +++ b/src/com/engine/salary/mapper/SQLMapper.java @@ -0,0 +1,22 @@ +package com.engine.salary.mapper; + +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + * SQLMapper + *

Copyright: Copyright (c) 2024

+ *

Company: 娉涘井杞欢

+ * + * @author qiantao + * @version 1.0 + **/ +public interface SQLMapper { + List runSQL(@Param("sql") String sql); + + List listLong(@Param("sql") String sql); + + List listString(@Param("sql") String sql); +} diff --git a/src/com/engine/salary/mapper/SQLMapper.xml b/src/com/engine/salary/mapper/SQLMapper.xml new file mode 100644 index 0000000..3f67dea --- /dev/null +++ b/src/com/engine/salary/mapper/SQLMapper.xml @@ -0,0 +1,16 @@ + + + + + + + + + + diff --git a/src/com/engine/salary/mapper/cbs/UfHkrdzbMapper.java b/src/com/engine/salary/mapper/cbs/UfHkrdzbMapper.java new file mode 100644 index 0000000..cfe5e56 --- /dev/null +++ b/src/com/engine/salary/mapper/cbs/UfHkrdzbMapper.java @@ -0,0 +1,57 @@ +package com.engine.salary.mapper.cbs; + +import com.engine.salary.remote.cbs8.po.UfHkrdzbPO; + +import java.util.List; + +public interface UfHkrdzbMapper { + + /** + * 鏌ヨ鎵鏈夎褰 + * + * @return 杩斿洖闆嗗悎锛屾病鏈夎繑鍥炵┖List + */ + List listAll(); + + /** + * 鏉′欢鏌ヨ + * + * @return 杩斿洖闆嗗悎锛屾病鏈夎繑鍥炵┖List + */ + List listSome(UfHkrdzbPO ufHkrdzb); + + + /** + * 鏍规嵁涓婚敭鏌ヨ + * + * @param id 涓婚敭 + * @return 杩斿洖璁板綍锛屾病鏈夎繑鍥瀗ull + */ + UfHkrdzbPO getById(Integer id); + + /** + * 鏂板锛屽拷鐣ull瀛楁 + * + * @param ufHkrdzb 鏂板鐨勮褰 + * @return 杩斿洖褰卞搷琛屾暟 + */ + int insertIgnoreNull(UfHkrdzbPO ufHkrdzb); + + /** + * 淇敼锛屼慨鏀规墍鏈夊瓧娈 + * + * @param ufHkrdzb 淇敼鐨勮褰 + * @return 杩斿洖褰卞搷琛屾暟 + */ + int update(UfHkrdzbPO ufHkrdzb); + + /** + * 淇敼锛屽拷鐣ull瀛楁 + * + * @param ufHkrdzb 淇敼鐨勮褰 + * @return 杩斿洖褰卞搷琛屾暟 + */ + int updateIgnoreNull(UfHkrdzbPO ufHkrdzb); + + +} \ No newline at end of file diff --git a/src/com/engine/salary/mapper/cbs/UfHkrdzbMapper.xml b/src/com/engine/salary/mapper/cbs/UfHkrdzbMapper.xml new file mode 100644 index 0000000..7380ec2 --- /dev/null +++ b/src/com/engine/salary/mapper/cbs/UfHkrdzbMapper.xml @@ -0,0 +1,322 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + t + . + id + , t.requestId + , t.formmodeid + , t.modedatacreater + , t.modedatacreatertype + , t.modedatacreatedate + , t.modedatacreatetime + , t.MODEUUID + , t.form_biz_id + , t.gsbm + , t.khbm + , t.khmc + , t.bmbm + , t.bmd + , t.bm + , t.modedatamodifier + , t.modedatamodifydatetime + + + + + + + + + + + + + + + INSERT INTO uf_hkrdzb + + + + requestId, + + + formmodeid, + + + modedatacreater, + + + modedatacreatertype, + + + modedatacreatedate, + + + modedatacreatetime, + + + MODEUUID, + + + form_biz_id, + + + gsbm, + + + khbm, + + + khmc, + + + bmbm, + + + bmd, + + + bm, + + + modedatamodifier, + + + modedatamodifydatetime, + + + + + #{requestId}, + + + #{formmodeid}, + + + #{modedatacreater}, + + + #{modedatacreatertype}, + + + #{modedatacreatedate}, + + + #{modedatacreatetime}, + + + #{modeuuid}, + + + #{formBizId}, + + + #{gsbm}, + + + #{khbm}, + + + #{khmc}, + + + #{bmbm}, + + + #{bmd}, + + + #{bm}, + + + #{modedatamodifier}, + + + #{modedatamodifydatetime}, + + + + + + + + + UPDATE uf_hkrdzb + + requestId=#{requestId}, + formmodeid=#{formmodeid}, + modedatacreater=#{modedatacreater}, + modedatacreatertype=#{modedatacreatertype}, + modedatacreatedate=#{modedatacreatedate}, + modedatacreatetime=#{modedatacreatetime}, + MODEUUID=#{modeuuid}, + form_biz_id=#{formBizId}, + gsbm=#{gsbm}, + khbm=#{khbm}, + khmc=#{khmc}, + bmbm=#{bmbm}, + bmd=#{bmd}, + bm=#{bm}, + modedatamodifier=#{modedatamodifier}, + modedatamodifydatetime=#{modedatamodifydatetime}, + + WHERE id = #{id} + + + + + + UPDATE uf_hkrdzb + + + requestId=#{requestId}, + + + formmodeid=#{formmodeid}, + + + modedatacreater=#{modedatacreater}, + + + modedatacreatertype=#{modedatacreatertype}, + + + modedatacreatedate=#{modedatacreatedate}, + + + modedatacreatetime=#{modedatacreatetime}, + + + MODEUUID=#{modeuuid}, + + + form_biz_id=#{formBizId}, + + + gsbm=#{gsbm}, + + + khbm=#{khbm}, + + + khmc=#{khmc}, + + + bmbm=#{bmbm}, + + + bmd=#{bmd}, + + + bm=#{bm}, + + + modedatamodifier=#{modedatamodifier}, + + + modedatamodifydatetime=#{modedatamodifydatetime}, + + + WHERE id = #{id} + + + + + + \ No newline at end of file diff --git a/src/com/engine/salary/remote/cbs8/HttpUtil.java b/src/com/engine/salary/remote/cbs8/HttpUtil.java new file mode 100644 index 0000000..0df6b19 --- /dev/null +++ b/src/com/engine/salary/remote/cbs8/HttpUtil.java @@ -0,0 +1,233 @@ +package com.engine.salary.remote.cbs8; + + +import lombok.extern.slf4j.Slf4j; +import org.apache.http.Consts; +import org.apache.http.HttpEntity; +import org.apache.http.HttpResponse; +import org.apache.http.client.HttpClient; +import org.apache.http.client.config.AuthSchemes; +import org.apache.http.client.config.CookieSpecs; +import org.apache.http.client.config.RequestConfig; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.config.Registry; +import org.apache.http.config.RegistryBuilder; +import org.apache.http.conn.ConnectTimeoutException; +import org.apache.http.conn.socket.ConnectionSocketFactory; +import org.apache.http.conn.socket.PlainConnectionSocketFactory; +import org.apache.http.conn.ssl.NoopHostnameVerifier; +import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; +import org.apache.http.util.EntityUtils; + +import javax.net.ssl.SSLContext; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; +import java.io.IOException; +import java.security.KeyManagementException; +import java.security.NoSuchAlgorithmException; +import java.security.cert.X509Certificate; +import java.util.Arrays; +import java.util.Collections; +import java.util.Map; + +/** + * Http璋冪敤澶勭悊绫 + * + * @author Terry + */ +@Slf4j +public class HttpUtil { + + public static final String TEXT_TYPE = "text/plain"; + public static final String JSON_TYPE = "application/json"; + public static final String XML_TYPE = "text/xml"; + public static final String HTML_TYPE = "text/html"; + + public static final String EXCEL_TYPE = "application/vnd.ms-excel"; + public static final String STREAM_TYPE = "application/octet-stream"; + public static final int SLEEP_TIME = 1000; + public static final int IAS_SUCCESS = 400; + + public static HttpClient httpsTrustClient() { + try { + // 鍦ㄨ皟鐢⊿SL涔嬪墠闇瑕侀噸鍐欓獙璇佹柟娉曪紝鍙栨秷妫娴婼SL + X509TrustManager trustManager = new X509TrustManager() { + @Override + public X509Certificate[] getAcceptedIssuers() { + return null; + } + + @Override + public void checkClientTrusted(X509Certificate[] xcs, String str) { + } + + @Override + public void checkServerTrusted(X509Certificate[] xcs, String str) { + } + }; + SSLContext ctx = SSLContext.getInstance(SSLConnectionSocketFactory.TLS); + ctx.init(null, new TrustManager[]{trustManager}, null); + SSLConnectionSocketFactory socketFactory = + new SSLConnectionSocketFactory(ctx, NoopHostnameVerifier.INSTANCE); + // 鍒涘缓Registry + RequestConfig requestConfig = + RequestConfig.custom().setCookieSpec(CookieSpecs.STANDARD_STRICT).setExpectContinueEnabled(Boolean.TRUE) + .setTargetPreferredAuthSchemes(Arrays.asList(AuthSchemes.NTLM, AuthSchemes.DIGEST)) + .setProxyPreferredAuthSchemes(Collections.singletonList(AuthSchemes.BASIC)).build(); + Registry socketFactoryRegistry = RegistryBuilder.create() + .register("http", PlainConnectionSocketFactory.INSTANCE).register("https", socketFactory).build(); + // 鍒涘缓ConnectionManager锛屾坊鍔燙onnection閰嶇疆淇℃伅 + PoolingHttpClientConnectionManager connectionManager = + new PoolingHttpClientConnectionManager(socketFactoryRegistry); + + return HttpClients.custom().setConnectionManager(connectionManager) + .setDefaultRequestConfig(requestConfig).build(); + } catch (KeyManagementException | NoSuchAlgorithmException ex) { + throw new RuntimeException(ex); + } + } + + /** + * 鑾峰彇 HttpClient + * + * @param path + * @return + */ + public static HttpClient wrapClient(String path) { + HttpClient httpClient = HttpClientBuilder.create().build(); + if (path != null && path.startsWith("https://")) { + return httpsTrustClient(); + } + return httpClient; + } + + /** + * 璁剧疆http瓒呮椂鏃堕棿 + * + * @param requestConfig + * @return + */ + private static RequestConfig setTimeOutConfig(RequestConfig requestConfig) { + if (requestConfig == null) { + requestConfig = RequestConfig.DEFAULT; + } + return RequestConfig.copy(requestConfig).setConnectionRequestTimeout(900000).setConnectTimeout(900000) + .setSocketTimeout(900000).build(); + } + + /** + * get 璇锋眰 + * + * @param url + * @param header + * @param params + * @return + */ + public static String getRequest(String url, Map header, Map params) { + CloseableHttpClient httpClient = null; + CloseableHttpResponse response = null; + String result = ""; + + StringBuilder urlStr = new StringBuilder(); + urlStr.append(url).append("?"); + + int i = params.size(); + for (Map.Entry map : params.entrySet()) { + urlStr.append(map.getKey()).append("=").append(map.getValue()); + if ((--i) == 0) { + continue; + } + urlStr.append("&"); + } + try { + httpClient = (CloseableHttpClient) wrapClient(url); + HttpGet httpGet = new HttpGet(urlStr.toString()); + if (null != header && !header.isEmpty()) { + for (String key : header.keySet()) { + httpGet.setHeader(key, header.get(key)); + } + } + + RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(20000) + .setConnectionRequestTimeout(20000).setSocketTimeout(40000).build(); + httpGet.setConfig(requestConfig); + response = httpClient.execute(httpGet); + HttpEntity entity = response.getEntity(); + result = EntityUtils.toString(entity); + httpGet.abort(); + EntityUtils.consume(entity); + } catch (IOException e) { + log.error("鍙戣捣GET璇锋眰澶辫触", e); + result = "鍙戣捣GET璇锋眰澶辫触"; + } finally { + if (null != response) { + try { + httpClient.close(); + response.close(); + } catch (IOException e) { + log.error("鍙戣捣GET璇锋眰澶辫触", e); + } + } + + if (null != httpClient) { + try { + httpClient.close(); + } catch (IOException e) { + log.error("鍙戣捣GET璇锋眰澶辫触", e); + } + } + } + return result; + } + + /** + * HTTP Post 鑾峰彇鍐呭 + * + * @param url 璇锋眰鐨剈rl鍦板潃 ?涔嬪墠鐨勫湴鍧 + * @param params 璇锋眰鐨勫弬鏁 + * @param header 缂栫爜鏍煎紡 + * @return 椤甸潰鍐呭 + */ + public static String doPost(String url, Map header, String params, String contentType) { + String result = null; + try { + HttpPost httpPost = new HttpPost(url); + httpPost.setHeader("Connection", "close"); + httpPost.setConfig(setTimeOutConfig(httpPost.getConfig())); + httpPost.setHeader("Content-Type", contentType); + if (null != header && !header.isEmpty()) { + for (String key : header.keySet()) { + httpPost.setHeader(key, header.get(key)); + } + } + if (null != params) { + httpPost.setEntity(new StringEntity(params, Consts.UTF_8)); + } + HttpClient httpClient = wrapClient(url); + HttpResponse response = httpClient.execute(httpPost); + int statusCode = response.getStatusLine().getStatusCode(); + if (statusCode != 200) { + httpPost.abort(); + throw new RuntimeException("HttpClient,error status code :" + statusCode); + } + HttpEntity entity = response.getEntity(); + if (entity != null) { + result = EntityUtils.toString(entity, Consts.UTF_8); + } + EntityUtils.consume(entity); + httpPost.abort(); + return result; + } catch (Exception e) { + log.error("鍙戣捣POST璇锋眰澶辫触", e); + result = "鍙戣捣POST璇锋眰澶辫触"; + } + return result; + } +} diff --git a/src/com/engine/salary/remote/cbs8/JsonUtil.java b/src/com/engine/salary/remote/cbs8/JsonUtil.java new file mode 100644 index 0000000..51a9fb9 --- /dev/null +++ b/src/com/engine/salary/remote/cbs8/JsonUtil.java @@ -0,0 +1,97 @@ +package com.engine.salary.remote.cbs8; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.parser.Feature; +import com.alibaba.fastjson.serializer.SerializerFeature; +import com.alibaba.fastjson.util.TypeUtils; + +import java.lang.reflect.Type; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +public class JsonUtil { + private static final SerializerFeature[] DEFAULT_S_FEATURES; + private static final SerializerFeature[] PRETTY_S_FEATURES; + private static final Feature[] DEFAULT_P_FEATURES; + + public JsonUtil() { + } + + public static String toJsonString(Object obj) { + return JSON.toJSONString(obj, DEFAULT_S_FEATURES); + } + + public static String toJsonString(Object obj, SerializerFeature... features) { + return JSON.toJSONString(obj, features); + } + + public static String toPrettyJson(Object object) { + return JSON.toJSONString(object, PRETTY_S_FEATURES); + } + + public static JSONObject parseJsonObject(String jsonStr) { + return JSON.parseObject(jsonStr, DEFAULT_P_FEATURES); + } + + public static T parseValue(JSONObject jsonObject, String key, Class clazz) { + if (jsonObject != null) { + T value = jsonObject.getObject(key, (Type) clazz); + return value; + } else { + return null; + } + } + + public static T parseObject(String jsonStr, Class clazz) { + return JSON.parseObject(jsonStr, (Type) clazz, DEFAULT_P_FEATURES); + } + + public static List parseList(String jsonStr, Class clazz) { + return JSON.parseArray(jsonStr, clazz); + } + + public static List parseList(Object jsonObject, Class clazz) { + String jsonStr = toJsonString(jsonObject); + return parseList(jsonStr, clazz); + } + + public static Map parseMap(String jsonStr, Class valueCls) { + Map result = new LinkedHashMap(); + Map map = JSON.parseObject(jsonStr, DEFAULT_P_FEATURES); + if (map != null && map.size() > 0) { + Iterator var4 = map.entrySet().iterator(); + + while (var4.hasNext()) { + Entry entry = (Entry) var4.next(); + Object obj = entry.getValue(); + V value = JSON.parseObject(JSON.toJSONString(obj), valueCls); + result.put(entry.getKey(), value); + } + } + + return result; + } + + public static Map parseMap(Object jsonObject, Class valueCls) { + String jsonStr = toJsonString(jsonObject); + return parseMap(jsonStr, valueCls); + } + + public static T parseBean(String jsonString, Class beanClazz) { + return parseBean(parseJsonObject(jsonString), beanClazz); + } + + public static T parseBean(JSONObject jsonObject, Class beanClazz) { + return TypeUtils.castToJavaBean(jsonObject, beanClazz); + } + + static { + DEFAULT_S_FEATURES = new SerializerFeature[]{SerializerFeature.WriteDateUseDateFormat, SerializerFeature.SortField}; + PRETTY_S_FEATURES = new SerializerFeature[]{SerializerFeature.WriteDateUseDateFormat, SerializerFeature.SortField, SerializerFeature.PrettyFormat}; + DEFAULT_P_FEATURES = new Feature[]{Feature.OrderedField}; + } +} diff --git a/src/com/engine/salary/remote/cbs8/SalaryEntityUtil.java b/src/com/engine/salary/remote/cbs8/SalaryEntityUtil.java new file mode 100644 index 0000000..06eb7aa --- /dev/null +++ b/src/com/engine/salary/remote/cbs8/SalaryEntityUtil.java @@ -0,0 +1,417 @@ +package com.engine.salary.remote.cbs8; + +import com.alibaba.fastjson.JSON; +import com.engine.salary.exception.CBS8RunTimeException; +import com.google.common.collect.Maps; +import com.google.common.collect.Sets; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.MapUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.math.NumberUtils; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.stream.Collector; +import java.util.stream.Collectors; + +/** + * 瀹炰綋绫荤浉鍏 + *

Copyright: Copyright (c) 2022

+ *

Company: 娉涘井杞欢

+ * + * @author qiantao + * @version 1.0 + **/ +public class SalaryEntityUtil { + + private static final DecimalFormat decimalFormat = new DecimalFormat("#,##0.00"); + + /** + * 鏁板瓧姝e垯琛ㄨ揪寮 + * 鍖呭惈璐熸暟銆佹鏁般佸皬鏁般0銆0.00000绛 + */ + public static final String NUMBER_REGEX = "(-?[1-9]\\d*\\.?\\d+)|(-?0\\.\\d*[0-9])|(\\d+)"; + + /** + * 鍗冨垎浣嶆牸寮忓寲 + * + * @param originMap 鍘熷map + * @param targetMap 鐩爣map + */ + public static void thousandthConvert(Map originMap, Map targetMap) { + + if (MapUtils.isNotEmpty(originMap)) { + originMap.forEach((k, v) -> { + if (StringUtils.isNotBlank(String.valueOf(v))) { + targetMap.put(k, decimalFormat.format(Double.valueOf(String.valueOf(v)))); + } + }); + } + } + + /** + * 鍗冨垎浣嶆牸寮忓寲 + * + * @param originString 鍘熷瀛楃涓 + * @return 鏍煎紡鍖栧悗鐨勫瓧绗︿覆 + */ + public static String thousandthConvert(String originString) { + if (StringUtils.isNotBlank(originString)) { + return decimalFormat.format(Double.valueOf(originString)); + } + return "0.00"; + } + + /** + * 鍒ゆ柇瀵硅薄鎴栧璞℃暟缁勪腑姣忎竴涓璞℃槸鍚︿负绌: 瀵硅薄涓簄ull锛屽瓧绗﹀簭鍒楅暱搴︿负0锛岄泦鍚堢被銆丮ap涓篹mpty + * + * @param obj + * @return + */ + public static boolean isNullOrEmpty(Object obj) { + if (obj == null) { + return true; + } + if (obj instanceof CharSequence) { + return ((CharSequence) obj).length() == 0; + } + if (obj instanceof Collection) { + return ((Collection) obj).isEmpty(); + } + if (obj instanceof Map) { + return ((Map) obj).isEmpty(); + } + if (obj instanceof Object[]) { + Object[] object = (Object[]) obj; + if (object.length == 0) { + return true; + } + boolean empty = true; + for (int i = 0; i < object.length; i++) { + if (!isNullOrEmpty(object[i])) { + empty = false; + break; + } + } + return empty; + } + + return false; + } + + public static boolean isNotNullOrEmpty(Object obj) { + return !isNullOrEmpty(obj); + } + + public static A properties(Collection objs, Function function, Collector collectors) { + return objs.stream().map(function).collect(collectors); + } + + public static Set properties(Collection objs, Function function) { + if (CollectionUtils.isEmpty(objs)) { + return Sets.newHashSet(); + } + return properties(objs, function, Collectors.toSet()); + } + + public static Map convert2Map(Collection objs, Function function) { + if (CollectionUtils.isEmpty(objs)) { + return Maps.newHashMap(); + } + return objs.stream().collect(Collectors.toMap(function, Function.identity(), (a, b) -> a)); + } + + public static Map convert2Map(Collection objs, Function keyMapper, Function valueMapper) { + if (CollectionUtils.isEmpty(objs)) { + return Maps.newHashMap(); + } + return objs.stream() + .filter(e -> valueMapper.apply(e) != null && keyMapper.apply(e) != null) + .collect(Collectors.toMap(keyMapper, valueMapper, (a, b) -> a)); + } + + public static Map> group2Map(Collection objs, Function function) { + if (CollectionUtils.isEmpty(objs)) { + return Maps.newHashMap(); + } + return objs.stream().collect(Collectors.groupingBy(function)); + } + + public static Map> group2Map(Collection objs, Function keyMapper, Function valueMapper) { + if (CollectionUtils.isEmpty(objs)) { + return Maps.newHashMap(); + } + return objs.stream() + .filter(e -> keyMapper.apply(e) != null && valueMapper.apply(e) != null) + .collect(Collectors.groupingBy(keyMapper, + Collectors.collectingAndThen(Collectors.toList(), e -> e.stream().map(valueMapper).collect(Collectors.toSet())))); + } + + public static Map> group2ListMap(Collection objs, Function keyMapper, Function valueMapper) { + if (CollectionUtils.isEmpty(objs)) { + return Maps.newHashMap(); + } + return objs.stream() + .filter(e -> keyMapper.apply(e) != null && valueMapper.apply(e) != null) + .collect(Collectors.groupingBy(keyMapper, + Collectors.collectingAndThen(Collectors.toList(), e -> e.stream().map(valueMapper).collect(Collectors.toList())))); + } + + public static Map> list2Map(Collection objs, Function function1, Function function2, Function function3) { + if (CollectionUtils.isEmpty(objs)) { + return Maps.newHashMap(); + } + Map> collect = objs.stream().collect(Collectors.groupingBy(function1)); + Map> map = new HashMap<>(); + for (Map.Entry> entry: collect.entrySet()) { + Map values = map.getOrDefault(entry.getKey(), new HashMap<>()); + entry.getValue().forEach(e -> values.put(function2.apply(e), function3.apply(e))); + map.put(entry.getKey(), values); + } + return map; + } + + public static Map> list2Map(Collection objs, Function function1, Function function2) { + if (CollectionUtils.isEmpty(objs)) { + return Maps.newHashMap(); + } + Map> collect = objs.stream().collect(Collectors.groupingBy(function1)); + Map> map = new HashMap<>(); + for (Map.Entry> entry: collect.entrySet()) { + Map values = map.getOrDefault(entry.getKey(), new HashMap<>()); + entry.getValue().forEach(e -> values.put(function2.apply(e), e)); + map.put(entry.getKey(), values); + } + return map; + } + + + + /** + * LinkedHashMap鏈夊簭鍘婚噸 + * + * @param keyExtractor + * @param + * @return + */ + public static Predicate distinctByKey(Function keyExtractor) { + LinkedHashMap map = new LinkedHashMap<>(); + return t -> map.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null; + } + + /** + * ConcurrentHashMap鏃犲簭鍘婚噸 + * + * @param keyExtractor + * @param + * @return + */ + public static Predicate distinctByKeyMap(Function keyExtractor) { + ConcurrentHashMap map = new ConcurrentHashMap<>(); + return t -> map.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null; + } + + public static BigDecimal reduce(Collection objs, Function function) { + if (CollectionUtils.isEmpty(objs)) { + return BigDecimal.ZERO; + } + return objs.stream() + .filter(e -> function.apply(e) != null) + .map(function) + .reduce(BigDecimal.ZERO, BigDecimal::add); + } + + public static BigDecimal empty2Zero(String value) { + if (StringUtils.isEmpty(value)) { + return BigDecimal.ZERO; + } + try { + return new BigDecimal(value); + } catch (Exception e) { + return BigDecimal.ZERO; + } + } + + + + /** + * 涓や釜闆嗗悎鏄惁鏈変氦闆 + * + * @param list1 + * @param list2 + * @param + * @return + */ + public static boolean judgeIntersection(List list1, List list2) { + boolean flag = false; + List origin = new ArrayList<>(); + origin.addAll(list1); + origin.retainAll(list2); + if (origin.size() > 0) { + flag = true; + } + return flag; + } + + /** + * String杞琇ong + * + * @param obj + * @return + */ + public static Long string2Long(String obj) { + if (NumberUtils.isCreatable(obj)) { + return Long.valueOf(obj); + } + return null; + } + + /** + * String杞琁nteger + * + * @param obj + * @return + */ + public static Integer string2Integer(String obj) { + if (NumberUtils.isCreatable(obj)) { + return Integer.valueOf(obj); + } + return null; + } + + /** + * String杞珺igDecimal + * + * @param obj + * @return + */ + public static BigDecimal string2BigDecimal(String obj) { + if (NumberUtils.isCreatable(obj)) { + return new BigDecimal(obj); + } + return null; + } + + /** + * String杞珺igDecimal + * + * @param obj + * @return + */ + public static BigDecimal string2BigDecimalDefault0(String obj) { + if (NumberUtils.isCreatable(obj)) { + return new BigDecimal(obj); + } + return BigDecimal.ZERO; + } + + /** + * 鍒ゆ柇瀛楃涓叉槸鍚︾瓑浜0 + * + * @param obj + * @return + */ + public static boolean StringEqZERO(String obj) { + if (NumberUtils.isCreatable(obj)) { + return BigDecimal.ZERO.compareTo(new BigDecimal(obj)) == 0; + } + return false; + } + + + public static Double string2DoubleDefault0(String obj) { + if (NumberUtils.isCreatable(obj)) { + return new Double(obj); + } + return new Double("0.0"); + } + + /** + * 涓や釜闆嗗悎浜ら泦锛岋紙forEasy锛 + * + * @param arr1 + * @param arr2 + * @return + */ + public static Collection intersectionForList(Collection arr1, Collection arr2) { + + Collection resultList = new ArrayList<>(); + + if (CollectionUtils.isEmpty(arr1) || CollectionUtils.isEmpty(arr1)) { + return resultList; + } + arr1.forEach(a1 -> { + if (arr2.contains(a1)) { + resultList.add(a1); + } + }); + return resultList; + } + + public static String toJSONString(Object obj) { + if (obj != null) { + return JSON.toJSONString(obj); + } + return ""; + } + + + public static String null2String(Object obj) { + if (Objects.isNull(obj)) { + return ""; + } + return obj.toString(); + } + + public static String null2String(Object obj, String def) { + if (Objects.isNull(obj)) { + return def; + } + return obj.toString(); + } + + public static Integer getIntValue(Object obj, Integer def) { + if (Objects.isNull(obj)) { + return def; + } + try { + return StringUtils.isEmpty(String.valueOf(obj)) ? def : Integer.valueOf(String.valueOf(obj)); + } catch (NumberFormatException e) { + return def; + } + } + + public static BigDecimal getBigDecimal(Object value, int scale) { + String valueStr = null2String(value); + if (StringUtils.isEmpty(valueStr)) { + return BigDecimal.ZERO; + } + try { + return new BigDecimal(valueStr).setScale(scale, RoundingMode.HALF_UP); + } catch (NumberFormatException e) { + return null; + } + } + + public static BigDecimal getBigDecimal(Object value, int scale, BigDecimal defValue) { + try { + return new BigDecimal(null2String(value)).setScale(scale, RoundingMode.HALF_UP); + } catch (NumberFormatException e) { + return defValue; + } + } + + + public static T findFirst(Collection objs) { + if (CollectionUtils.isEmpty(objs)) { + throw new CBS8RunTimeException("the collection can not be empty"); + } + return objs.stream().findFirst().orElse(null); + } + +} diff --git a/src/com/engine/salary/remote/cbs8/client/AccountManagementClient.java b/src/com/engine/salary/remote/cbs8/client/AccountManagementClient.java new file mode 100644 index 0000000..03f0d50 --- /dev/null +++ b/src/com/engine/salary/remote/cbs8/client/AccountManagementClient.java @@ -0,0 +1,59 @@ +package com.engine.salary.remote.cbs8.client; + +import com.engine.salary.exception.CBS8RunTimeException; +import com.engine.salary.remote.cbs8.request.GetTransactionDetailRequest; +import com.engine.salary.remote.cbs8.response.GetTransactionDetailResponse; +import com.engine.salary.remote.cbs8.JsonUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.Objects; + +@Slf4j +public class AccountManagementClient extends CBS8BaseClient { + + public GetTransactionDetailResponse transactionDetailQuery(GetTransactionDetailRequest requestParam) throws IOException { + String url = host + "/openapi/account/openapi/v1/transaction-detail/query"; + + + CloseableHttpClient client = HttpClients.custom() + // 绂佹HttpClient鑷姩瑙e帇缂 + .disableContentCompression() + .build(); + + String requestData = JsonUtil.toJsonString(requestParam); + log.info("鑾峰彇cbs浜ゆ槗鍙傛暟锛" + url + "\n" + requestData); + + HttpPost httpPost = setupRequest(url, requestData); + try (CloseableHttpResponse response = client.execute(httpPost)) { + byte[] finalResponseData = handleResponse(response); + String req = new String(finalResponseData, StandardCharsets.UTF_8); + GetTransactionDetailResponse getTransactionDetailResponse = JsonUtil.parseBean(req, GetTransactionDetailResponse.class); + log.info("鑾峰彇cbs浜ゆ槗缁撴灉锛" + "\n" + JsonUtil.toJsonString(getTransactionDetailResponse)); + + if (Objects.isNull(getTransactionDetailResponse)) { + throw new CBS8RunTimeException("鏈嶅姟寮傚父"); + } + if (!"0".equals(getTransactionDetailResponse.getCode())) { + throw new CBS8RunTimeException(getTransactionDetailResponse.getMsg()); + } + if (getTransactionDetailResponse.getData() == null) { + throw new CBS8RunTimeException("鏈幏鍙栨暟鎹"); + } + + return getTransactionDetailResponse; + + } catch (IOException ignored) { + log.error("缃戠粶杩炴帴澶辫触鎴栬秴鏃讹紒",ignored); + throw new CBS8RunTimeException("缃戠粶杩炴帴澶辫触鎴栬秴鏃讹紒"); + } finally { + client.close(); + } + } + +} diff --git a/src/com/engine/salary/remote/cbs8/client/BillManagementClient.java b/src/com/engine/salary/remote/cbs8/client/BillManagementClient.java new file mode 100644 index 0000000..6a57057 --- /dev/null +++ b/src/com/engine/salary/remote/cbs8/client/BillManagementClient.java @@ -0,0 +1,56 @@ +package com.engine.salary.remote.cbs8.client; + +import com.engine.salary.exception.CBS8RunTimeException; +import com.engine.salary.remote.cbs8.request.GetDtaRequest; +import com.engine.salary.remote.cbs8.response.GetDtaResponse; +import com.engine.salary.remote.cbs8.JsonUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.Objects; + +@Slf4j +public class BillManagementClient extends CBS8BaseClient { + + public GetDtaResponse dtaQuery(GetDtaRequest requestParam) throws IOException { + String url = host + "/openapi/draft/openapi/v1/dta/query"; + + CloseableHttpClient client = HttpClients.custom() + // 绂佹HttpClient鑷姩瑙e帇缂 + .disableContentCompression() + .build(); + + String requestData = JsonUtil.toJsonString(requestParam); + log.info("鑾峰彇cbs绁ㄦ嵁鍙傛暟锛" + url + "\n" + requestData); + + HttpPost httpPost = setupRequest(url, requestData); + try (CloseableHttpResponse response = client.execute(httpPost)) { + byte[] finalResponseData = handleResponse(response); + String req = new String(finalResponseData, StandardCharsets.UTF_8); + GetDtaResponse getDtaResponse = JsonUtil.parseBean(req, GetDtaResponse.class); + log.info("鑾峰彇cbs绁ㄦ嵁缁撴灉锛" + "\n" + JsonUtil.toJsonString(getDtaResponse)); + + if (Objects.isNull(getDtaResponse)) { + throw new CBS8RunTimeException("鏈嶅姟寮傚父"); + } + if (!"0".equals(getDtaResponse.getCode())) { + throw new CBS8RunTimeException(getDtaResponse.getMsg()); + } + if (getDtaResponse.getData() == null) { + throw new CBS8RunTimeException("鏈幏鍙栨暟鎹"); + } + + return getDtaResponse; + } catch (IOException ignored) { + throw new CBS8RunTimeException("缃戠粶杩炴帴澶辫触鎴栬秴鏃讹紒"); + } finally { + client.close(); + } + } + +} diff --git a/src/com/engine/salary/remote/cbs8/client/CBS8BaseClient.java b/src/com/engine/salary/remote/cbs8/client/CBS8BaseClient.java new file mode 100644 index 0000000..930c5f2 --- /dev/null +++ b/src/com/engine/salary/remote/cbs8/client/CBS8BaseClient.java @@ -0,0 +1,166 @@ +package com.engine.salary.remote.cbs8.client; + +import cn.hutool.core.util.StrUtil; +import com.engine.salary.exception.CBS8RunTimeException; +import com.engine.salary.remote.cbs8.common.Constants; +import com.engine.salary.remote.cbs8.response.GetTokenResponse; +import com.engine.salary.remote.cbs8.util.SM2Util; +import com.engine.salary.remote.cbs8.HttpUtil; +import com.engine.salary.remote.cbs8.JsonUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.io.IOUtils; +import org.apache.http.Header; +import org.apache.http.HttpMessage; +import org.apache.http.HttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.ByteArrayEntity; +import org.apache.http.protocol.HTTP; +import weaver.general.BaseBean; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.zip.GZIPInputStream; + +@Slf4j +public class CBS8BaseClient { + + static final String appId = new BaseBean().getPropValue("hrmSalaryCBS8", "app_id"); + + static final String appSecret = new BaseBean().getPropValue("hrmSalaryCBS8", "app_secret"); + + /** + * 璐㈣祫绠$悊浜戝叕閽(骞冲彴鍏挜) + */ + static final String bodyEncryptionKey = new BaseBean().getPropValue("hrmSalaryCBS8", "bodyEncryptionKey"); + + /** + * 浼佷笟绉侀挜锛堝姞瀵嗭級 + */ + static final String signEncryptionPrivateKey = new BaseBean().getPropValue("hrmSalaryCBS8", "signEncryptionPrivateKey"); + + /** + * 浼佷笟绉侀挜锛堣В瀵嗭級 + */ + static final String bodyDecryptionKey = new BaseBean().getPropValue("hrmSalaryCBS8", "bodyDecryptionKey"); + + /** + * 鍩熷悕 + */ + static final String host = new BaseBean().getPropValue("hrmSalaryCBS8", "host"); + + + /** + * 鑾峰彇token + * + * @return + */ + public static String getToken() { + Map params = new HashMap<>(); + params.put("app_id", appId); + params.put("app_secret", appSecret); + params.put("grant_type", "client_credentials"); + // 寮濮嬭姹 + String paramBody = JsonUtil.toJsonString(params); + String res = HttpUtil.doPost(host + "/openapi/app/v1/app/token", new HashMap<>(), paramBody, HttpUtil.JSON_TYPE); + GetTokenResponse getTokenResponse = JsonUtil.parseBean(res, GetTokenResponse.class); + log.info("鑾峰彇token params:{} res: {}", paramBody, res); + if (Objects.isNull(getTokenResponse)) { + throw new CBS8RunTimeException("鏈嶅姟寮傚父"); + } + if (!"0".equals(getTokenResponse.getCode())) { + throw new CBS8RunTimeException(getTokenResponse.getMsg()); + } + if (getTokenResponse.getData() == null) { + throw new CBS8RunTimeException("鏈幏鍙栨暟鎹"); + } + if (StrUtil.isBlank(getTokenResponse.getData().getToken())) { + throw new CBS8RunTimeException("鏈幏鍙杢oken"); + } + String token = getTokenResponse.getData().getToken(); + return token; + } + + + /** + * 鐢熸垚璇锋眰鎶ユ枃 + */ + public static HttpPost setupRequest(String url, String requestData) { + + long timestamp = System.currentTimeMillis(); + + // 璇锋眰鏁版嵁鎷兼帴锛 鎶ユ枃浣+鏃堕棿鎴 + byte[] requestDataBytes = requestData.getBytes(StandardCharsets.UTF_8); + byte[] timestampBytes = ("×tamp=" + timestamp).getBytes(StandardCharsets.UTF_8); + byte[] newBytes = new byte[requestDataBytes.length + timestampBytes.length]; + System.arraycopy(requestDataBytes, 0, newBytes, 0, requestDataBytes.length); + System.arraycopy(timestampBytes, 0, newBytes, requestDataBytes.length, timestampBytes.length); + + // 鐢熸垚绛惧悕 + byte[] signature = SM2Util.sign(signEncryptionPrivateKey, newBytes); + String sign = Base64.encodeBase64String(SM2Util.encodeDERSignature(signature)); + + // 璁剧疆璇锋眰URL + HttpPost httpPost = new HttpPost(url); + // 璇锋眰澶磋缃鍚 + httpPost.setHeader(Constants.SIGN_HEADER_NAME, sign); + // 璇锋眰澶磋缃椂闂存埑 + httpPost.setHeader(Constants.TIMESTAMP_HEADER, Long.toString(timestamp)); + // 璇锋眰澶磋缃姹傚弬鏁版牸寮忥紝璇锋牴鎹疄闄呮儏鍐垫敼鍐 + httpPost.setHeader(HTTP.CONTENT_TYPE, Constants.TARGET_CONTENT_TYPE); + // 璇锋眰澶磋缃甌OKEN + String token = getToken(); + httpPost.setHeader(Constants.AUTHORIZATION, Constants.BEARER + token); + + // 鎶ユ枃浣撳姞瀵 + byte[] encryptedData = SM2Util.encrypt(bodyEncryptionKey, requestDataBytes); + // 璁剧疆璇锋眰浣 + httpPost.setEntity(new ByteArrayEntity(encryptedData)); + + return httpPost; + } + + /** + * 澶勭悊鍝嶅簲鎶ユ枃 + */ + public byte[] handleResponse(HttpResponse response) throws IOException { + InputStream content = response.getEntity().getContent(); + byte[] responseData = IOUtils.toByteArray(content); + + if (responseData == null || responseData.length == 0) { + return responseData == null ? new byte[0] : responseData; + } + + // 姝ラ1 鍘熷鍝嶅簲鎶ユ枃瑙e瘑 濡傛灉鏈嶅姟缃戝叧鑾峰彇鍔犺В瀵嗗瘑閽ュけ璐ワ紝鍒欐棤娉曡В瀵嗚姹傛姤鏂囷紝涓旀棤娉曞姞瀵嗗搷搴旀姤鏂囥 杩欐椂鍊欙紝缃戝叧浼氱洿鎺ヨ繑鍥為敊璇俊鎭紝鍝嶅簲鎶ユ枃鏄湭鍔犲瘑鐘舵併 + Boolean encryptionEnable = getHeader(response, Constants.ENCRYPTION_ENABLED_HEADER_NAME); + + if (Boolean.TRUE.equals(encryptionEnable)) { + responseData = SM2Util.decrypt(bodyDecryptionKey, responseData); + } + + Boolean xMbcloudCompress = getHeader(response, Constants.X_MBCLOUD_COMPRESS); + if (Boolean.TRUE.equals(xMbcloudCompress)) { + responseData = decompress(responseData); + } + + return responseData; + + + } + + private static Boolean getHeader(HttpMessage message, String name) { + Header header = message.getFirstHeader(name); + return header != null; + } + + public static byte[] decompress(byte[] data) throws IOException { + ByteArrayInputStream input = new ByteArrayInputStream(data); + GZIPInputStream gzipInput = new GZIPInputStream(input); + return IOUtils.toByteArray(gzipInput); + } +} diff --git a/src/com/engine/salary/remote/cbs8/common/Constants.java b/src/com/engine/salary/remote/cbs8/common/Constants.java new file mode 100644 index 0000000..d0fbcd5 --- /dev/null +++ b/src/com/engine/salary/remote/cbs8/common/Constants.java @@ -0,0 +1,23 @@ +package com.engine.salary.remote.cbs8.common; + +/** + * @author: KeXue + * @time: 2022/8/25 + * @description: 甯搁噺绫 + */ +public interface Constants { + + String TARGET_CONTENT_TYPE = "application/json"; + + String SIGN_HEADER_NAME = "X-MBCLOUD-API-SIGN"; + + String TIMESTAMP_HEADER = "X-MBCLOUD-TIMESTAMP"; + + String ENCRYPTION_ENABLED_HEADER_NAME = "X-MBCLOUD-ENCRYPTION-ENABLED"; + + String X_MBCLOUD_COMPRESS = "X-Mbcloud-Compress"; + + String AUTHORIZATION = "Authorization"; + + String BEARER = "Bearer "; +} diff --git a/src/com/engine/salary/remote/cbs8/config/EBS2ECConfig.java b/src/com/engine/salary/remote/cbs8/config/EBS2ECConfig.java new file mode 100644 index 0000000..dcc3a3f --- /dev/null +++ b/src/com/engine/salary/remote/cbs8/config/EBS2ECConfig.java @@ -0,0 +1,63 @@ +package com.engine.salary.remote.cbs8.config; + +import com.thoughtworks.xstream.annotations.XStreamAlias; +import com.thoughtworks.xstream.annotations.XStreamAsAttribute; +import com.thoughtworks.xstream.annotations.XStreamImplicit; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@XStreamAlias("config") +public class EBS2ECConfig { + @XStreamAlias("name") + @XStreamAsAttribute + private String name; + + @XStreamImplicit(itemFieldName = "table") + private List tables; + + @Data + public static class Table { + @XStreamAlias("name") + @XStreamAsAttribute + private String name; + + @XStreamAlias("key") + @XStreamAsAttribute + private String key; + + @XStreamAlias("modeId") + @XStreamAsAttribute + private Integer modeId; + + @XStreamImplicit(itemFieldName = "field") + private List fields; + + @Data + public static class Field { + @XStreamAlias("name") + @XStreamAsAttribute + private String name; + + @XStreamAlias("key") + @XStreamAsAttribute + private String key; + + @XStreamAlias("ebsKey") + @XStreamAsAttribute + private String ebsKey; + + @XStreamAlias("unique") + @XStreamAsAttribute + private boolean unique; + + } + } +} diff --git a/src/com/engine/salary/remote/cbs8/example/SM2Example.java b/src/com/engine/salary/remote/cbs8/example/SM2Example.java new file mode 100644 index 0000000..c3f46cd --- /dev/null +++ b/src/com/engine/salary/remote/cbs8/example/SM2Example.java @@ -0,0 +1,155 @@ +package com.engine.salary.remote.cbs8.example; + +import com.engine.salary.remote.cbs8.common.Constants; +import com.engine.salary.remote.cbs8.util.SM2Util; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.io.IOUtils; +import org.apache.http.Header; +import org.apache.http.HttpMessage; +import org.apache.http.HttpResponse; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.ByteArrayEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.protocol.HTTP; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.util.zip.GZIPInputStream; + +/** + * @author: KeXue + * @time: 2022/8/25 + * @description: SM2璇锋眰鍔犺В瀵嗗疄渚 + */ +@Slf4j +public class SM2Example { + + /** + * 璐㈣祫绠$悊浜戝叕閽(骞冲彴鍏挜) + */ + static final String bodyEncryptionKey = "0467E11F7CA86D884C990D4F3F5C2A1EFEEBB02B9878F4FDDCB7899DFABADCC8F38FC23F007A8AF9B2EB8A1D313959647CD8A1542F0414116AE6CFCA792346A802"; + + /** + * 浼佷笟绉侀挜锛堝姞瀵嗭級 + */ + static final String signEncryptionPrivateKey = "135d6d61d5e820a979e58f4939abbd528c82528c8c276852445854377e1df247"; + + /** + * 浼佷笟绉侀挜锛堣В瀵嗭級 + */ + static final String bodyDecryptionKey = "135d6d61d5e820a979e58f4939abbd528c82528c8c276852445854377e1df247"; + + /** + * 鏍规嵁appid鍜宎ppsecert鑾峰彇鐨則oken + */ + static final String token = "e4cdf00f-3fc9-4845-ac57-6baaee620895"; + + /** + * 鎺ュ彛璺緞 + */ + static final String TARGET_URL = "https://cbs8-openapi-reprd.csuat.cmburl.cn/openapi/account/accounts-current-balance/erp/query"; + + /** + * 璇锋眰浣撴暟鎹 + */ + static final String requestData = "\n" + "{\"accountNo\":\"\"}"; + + + public static void main(String[] args) throws Exception { + CloseableHttpClient client = HttpClients.custom() + // 绂佹HttpClient鑷姩瑙e帇缂 + .disableContentCompression() + .build(); + + HttpPost httpPost = setupRequest(); + try (CloseableHttpResponse response = client.execute(httpPost)) { + byte[] finalResponseData = handleResponse(response); + log.info("\n杩斿洖缁撴灉锛歿}", new String(finalResponseData)); + }catch (IOException ignored){ + throw new IOException("缃戠粶杩炴帴澶辫触鎴栬秴鏃讹紒"); + }finally { + client.close(); + } + } + + /** + * 鐢熸垚璇锋眰鎶ユ枃 + */ + private static HttpPost setupRequest() { + long timestamp = System.currentTimeMillis(); + + // 璇锋眰鏁版嵁鎷兼帴锛 鎶ユ枃浣+鏃堕棿鎴 + byte[] requestDataBytes = requestData.getBytes(StandardCharsets.UTF_8); + byte[] timestampBytes = ("×tamp=" + timestamp).getBytes(StandardCharsets.UTF_8); + byte[] newBytes = new byte[requestDataBytes.length + timestampBytes.length]; + System.arraycopy(requestDataBytes, 0, newBytes, 0, requestDataBytes.length); + System.arraycopy(timestampBytes, 0, newBytes, requestDataBytes.length, timestampBytes.length); + + // 鐢熸垚绛惧悕 + byte[] signature = SM2Util.sign(signEncryptionPrivateKey, newBytes); + String sign = Base64.encodeBase64String(SM2Util.encodeDERSignature(signature)); + log.info("绛惧悕:{}", sign); + + // 璁剧疆璇锋眰URL + HttpPost httpPost = new HttpPost(TARGET_URL); + // 璇锋眰澶磋缃鍚 + httpPost.setHeader(Constants.SIGN_HEADER_NAME, sign); + // 璇锋眰澶磋缃椂闂存埑 + httpPost.setHeader(Constants.TIMESTAMP_HEADER, Long.toString(timestamp)); + // 璇锋眰澶磋缃姹傚弬鏁版牸寮忥紝璇锋牴鎹疄闄呮儏鍐垫敼鍐 + httpPost.setHeader(HTTP.CONTENT_TYPE, Constants.TARGET_CONTENT_TYPE); + // 璇锋眰澶磋缃甌OKEN + httpPost.setHeader(Constants.AUTHORIZATION, Constants.BEARER + token); + + // 鎶ユ枃浣撳姞瀵 + byte[] encryptedData = SM2Util.encrypt(bodyEncryptionKey, requestDataBytes); + // 璁剧疆璇锋眰浣 + httpPost.setEntity(new ByteArrayEntity(encryptedData)); + + return httpPost; + } + + /** + * 澶勭悊鍝嶅簲鎶ユ枃 + */ + private static byte[] handleResponse(HttpResponse response) throws Exception { + InputStream content = response.getEntity().getContent(); + byte[] responseData = IOUtils.toByteArray(content); + + if (responseData == null || responseData.length == 0) { + return responseData == null ? new byte[0] : responseData; + } + + // 姝ラ1 鍘熷鍝嶅簲鎶ユ枃瑙e瘑 濡傛灉鏈嶅姟缃戝叧鑾峰彇鍔犺В瀵嗗瘑閽ュけ璐ワ紝鍒欐棤娉曡В瀵嗚姹傛姤鏂囷紝涓旀棤娉曞姞瀵嗗搷搴旀姤鏂囥 杩欐椂鍊欙紝缃戝叧浼氱洿鎺ヨ繑鍥為敊璇俊鎭紝鍝嶅簲鎶ユ枃鏄湭鍔犲瘑鐘舵併 + Boolean encryptionEnable = getHeader(response, Constants.ENCRYPTION_ENABLED_HEADER_NAME); + + if (Boolean.TRUE.equals(encryptionEnable)) { + responseData = SM2Util.decrypt(bodyDecryptionKey, responseData); + } + + Boolean xMbcloudCompress = getHeader(response, Constants.X_MBCLOUD_COMPRESS); + if (Boolean.TRUE.equals(xMbcloudCompress)) { + responseData = decompress(responseData); + } + + return responseData; + + + } + + private static Boolean getHeader(HttpMessage message, String name) { + Header header = message.getFirstHeader(name); + return header != null; + } + + public static byte[] decompress(byte[] data) throws IOException { + ByteArrayInputStream input = new ByteArrayInputStream(data); + GZIPInputStream gzipInput = new GZIPInputStream(input); + return IOUtils.toByteArray(gzipInput); + } +} diff --git a/src/com/engine/salary/remote/cbs8/po/UfHkrdzbPO.java b/src/com/engine/salary/remote/cbs8/po/UfHkrdzbPO.java new file mode 100644 index 0000000..4d3de9b --- /dev/null +++ b/src/com/engine/salary/remote/cbs8/po/UfHkrdzbPO.java @@ -0,0 +1,55 @@ +package com.engine.salary.remote.cbs8.po; + + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Collection; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class UfHkrdzbPO { + private Integer id; + + private Integer requestId; + + private Integer formmodeid; + + private Integer modedatacreater; + + private Integer modedatacreatertype; + + private String modedatacreatedate; + + private String modedatacreatetime; + + private String modeuuid; + + private String formBizId; + + private String gsbm; + + private String khbm; + + private String khmc; + + private String bmbm; + + private Integer bmd; + + private Integer bm; + + private Integer modedatamodifier; + + private String modedatamodifydatetime; + + + private Collection ids; + + private Integer departmentId; + +} \ No newline at end of file diff --git a/src/com/engine/salary/remote/cbs8/request/CBS8BaseRequest.java b/src/com/engine/salary/remote/cbs8/request/CBS8BaseRequest.java new file mode 100644 index 0000000..ec73482 --- /dev/null +++ b/src/com/engine/salary/remote/cbs8/request/CBS8BaseRequest.java @@ -0,0 +1,10 @@ +package com.engine.salary.remote.cbs8.request; + +import lombok.Data; + + +@Data +public class CBS8BaseRequest { + private int currentPage; + private int pageSize; +} diff --git a/src/com/engine/salary/remote/cbs8/request/GetDtaRequest.java b/src/com/engine/salary/remote/cbs8/request/GetDtaRequest.java new file mode 100644 index 0000000..cf39708 --- /dev/null +++ b/src/com/engine/salary/remote/cbs8/request/GetDtaRequest.java @@ -0,0 +1,108 @@ +package com.engine.salary.remote.cbs8.request; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; +import java.util.List; + +@Data +@EqualsAndHashCode(callSuper = true) +public class GetDtaRequest extends CBS8BaseRequest { + /** + * 鍑虹エ鏃ユ湡璧 鏍煎紡涓簓yyy-mm-dd锛屽嚭绁ㄦ棩鏈熻捣姝笉鍏佽涓杈规湁鍊间竴杈规棤鍊硷紝鏃ユ湡闂撮殧鏈澶т负涓骞 + */ + private String issueDateStart; + /** + * 鍑虹エ鏃ユ湡姝 鏍煎紡涓簓yyy-mm-dd锛屽嚭绁ㄦ棩鏈熻捣姝笉鍏佽涓杈规湁鍊间竴杈规棤鍊硷紝鏃ユ湡闂撮殧鏈澶т负涓骞 + */ + private String issueDateEnd; + /** + * 鍒版湡鏃ユ湡璧 鏍煎紡涓簓yyy-mm-dd锛屽埌鏈熸棩鏈熻捣姝笉鍏佽涓杈规湁鍊间竴杈规棤鍊硷紝鏃ユ湡闂撮殧鏈澶т负涓骞 + */ + private String dueDateStart; + /** + * 鍒版湡鏃ユ湡姝 鏍煎紡涓簓yyy-mm-dd锛屽埌鏈熸棩鏈熻捣姝笉鍏佽涓杈规湁鍊间竴杈规棤鍊硷紝鏃ユ湡闂撮殧鏈澶т负涓骞 + */ + private String dueDateEnd; + /** + * 绁ㄦ嵁绉嶇被 AC01-閾舵壙锛孉C02-鍟嗘壙 + */ + private String billType; + /** + * 绁ㄦ嵁鏉ユ簮 澶氶夈1-鐩磋仈浜ゆ槗锛2-鍙拌处浜ゆ槗锛3-鍙拌处鐧昏锛4-鎸戠エ鍚屾锛5-浠诲姟鍚屾 + */ + private List draftSourceList; + /** + * 鎸佺エ閾惰绫诲瀷 澶氶夈傝闄勫綍4.1.1.閾惰绫诲瀷鏋氫妇 + */ + private List holdBankTypeList; + /** + * 鎸佺エ浜哄崟浣嶇紪鐮 澶氶夈傚~鍦╟bs绯荤粺鍏叡璁剧疆>鍩虹淇℃伅>缁勭粐鏈烘瀯缁存姢鐨勫崟浣嶇紪鐮 + */ + private List displayHoldOrganizationCodeList; + /** + * 鎸佺エ浜鸿处鍙 澶氶夈 + */ + private List holdAccountList; + /** + * 鎸佺エ绛炬敹鏃ユ湡璧 鏍煎紡涓簓yyy-mm-dd锛屾寔绁ㄧ鏀舵棩鏈熻捣姝笉鍏佽涓杈规湁鍊间竴杈规棤鍊硷紝鏃ユ湡闂撮殧鏈澶т负涓骞 + */ + private String holdSignDateStart; + /** + * 鎸佺エ绛炬敹鏃ユ湡姝 鏍煎紡涓簓yyy-mm-dd锛屾寔绁ㄧ鏀舵棩鏈熻捣姝笉鍏佽涓杈规湁鍊间竴杈规棤鍊硷紝鏃ユ湡闂撮殧鏈澶т负涓骞 + */ + private String holdSignDateEnd; + /** + * 绯荤粺绁ㄦ嵁缂栧彿 + */ + private String draftNbr; + /** + * 绁ㄦ嵁(鍖)鍙 + */ + private String billNbr; + + /** + * 绁ㄦ嵁閲戦璧 澶т簬绛変簬0,鏈澶氫负涓や綅灏忔暟涓旀暣鏁颁綅涓婇檺涓13浣嶃傜エ鎹噾棰濊捣姝笉鍏佽涓杈规湁鍊间竴杈规棤鍊笺傚崟浣嶏紙鍏冿級 + */ + private BigDecimal billAmountStart; + + /** + * 绁ㄦ嵁閲戦姝 澶т簬绛変簬0,鏈澶氫负涓や綅灏忔暟涓旀暣鏁颁綅涓婇檺涓13浣嶃傜エ鎹噾棰濊捣姝笉鍏佽涓杈规湁鍊间竴杈规棤鍊笺傚崟浣嶏紙鍏冿級 + */ + private BigDecimal billAmountEnd; + + /** + * 瀛愮エ鍖洪棿璧 瀛愮エ鍖洪棿璧锋涓嶅厑璁镐竴杈规湁鍊间竴杈规棤鍊硷紝鏈澶12浣 + */ + private String subBillIntervalStart; + /** + * 瀛愮エ鍖洪棿姝 瀛愮エ鍖洪棿璧锋涓嶅厑璁镐竴杈规湁鍊间竴杈规棤鍊,鏈澶12浣 + */ + private String subBillIntervalEnd; + /** + * 绯荤粺绁ㄦ嵁绫诲瀷 澶氶夈傛寜闄勫綍4.1.3绁ㄦ嵁绫诲瀷-绁ㄦ嵁鐘舵-娴侀氭爣蹇楃骇鑱斿叧绯昏〃閫夋嫨鍚庢寜椤哄簭濉啓銆傜郴缁熺エ鎹被鍨嬫灇涓捐闄勫綍4.1.3銆傜エ鎹姸鎬佹灇涓捐闄勫綍4.1.4銆傛祦閫氭爣蹇楁灇涓捐闄勫綍4.1.5銆 + */ + private List billVarietyList; + /** + * 绁ㄦ嵁鐘舵 + */ + private List billStsList; + /** + * 娴侀氭爣蹇 + */ + private List billTrsStsList; + /** + * 搴撳瓨鐘舵 1-宸插叆搴擄紝2-宸插嚭搴撱 涓虹┖鏃堕粯璁ゆ煡璇㈠叏閮ㄦ暟鎹 + */ + private String stockFlag; + /** + * 鍑哄簱鏂瑰紡 0-绌猴紝2-鑳屼功锛3-璐ㄦ娂锛4-瑙h川锛5-璐寸幇锛6-鍒嗗寘锛7-缁撴竻, 8-浣滃簾銆 涓虹┖鏃堕粯璁ゆ煡璇㈠叏閮ㄦ暟鎹 + */ + private String outInvType; + /** + * 璁板綍鐘舵 NOR-姝e父锛孶SE-鍗犵敤锛孌EL-鍒犻櫎 SUC-瀹屾垚銆備负绌烘椂榛樿鏌ヨ鍏ㄩ儴鏁版嵁 + */ + private String lockFlag; + +} diff --git a/src/com/engine/salary/remote/cbs8/request/GetTransactionDetailRequest.java b/src/com/engine/salary/remote/cbs8/request/GetTransactionDetailRequest.java new file mode 100644 index 0000000..b1248d8 --- /dev/null +++ b/src/com/engine/salary/remote/cbs8/request/GetTransactionDetailRequest.java @@ -0,0 +1,75 @@ +package com.engine.salary.remote.cbs8.request; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.List; + +@Data +@EqualsAndHashCode(callSuper = true) +public class GetTransactionDetailRequest extends CBS8BaseRequest { + /** + * 寮濮嬫棩鏈 鏍煎紡涓簓yyy-mm-dd + */ + private String startDate; + /** + * 缁撴潫鏃ユ湡 鏍煎紡涓簓yyy-mm-dd + */ + private String endDate; + /** + * 鏃ユ湡绫诲瀷 0-浜ゆ槗鏃ユ湡 + */ + private String dateType; + /** + * 璐︽埛鍒楄〃 鏌ヨ璐︽埛鍒楄〃锛屼笉浼犻粯璁よ繑鍥炲叏閮 + */ + private List accountNoList; + /** + * 閾惰绫诲瀷鍒楄〃 渚嬪鎷涜CMB锛岄摱琛岀被鍨嬫灇涓捐闄勫綍4.1.5 + */ + private List bankTypeList; + /** + * 甯佺鍒楄〃 瑙侀檮褰曞竵绉嶆灇涓撅紝4.1.1 + */ + private List currencyList; + /** + * 鏄庣粏鏉ユ簮 + * B锛氶摱琛岋紝鍗抽摱琛岀洿鑱 + * U锛氱敤鎴凤紝鍗虫墜宸/ERP鎺ュ彛瀵煎叆 + * 涓嶄紶榛樿鏌ュ叏閮 + */ + private String detailedSources; + /** + * 鏄庣粏绫诲瀷 1-褰撴棩鏄庣粏 2-鍘嗗彶鏄庣粏 涓庢槑缁嗘棩鏈熸棤鍏筹紝浠呮爣璇嗘暟鎹潵婧愰摱琛岀殑涓嶅悓鎺ュ彛 + */ + private String currentFlag; + /** + * 鍊熻捶绫诲瀷 1-鍊燂紱2-璐 + */ + private String loanType; + /** + * 璐︽埛鎬ц川鍒楄〃 瀹㈡埛鍦ㄥ叕鍏辫缃>鍩虹淇℃伅>璐︽埛鎬ц川鏌ヨ鑷畾涔夊唴瀹癸紝渚嬪AA-缁煎悎鎴凤紝姝ゅ浼犲尖淎A鈥 + */ + private List accountNatureList; + /** + * 閾惰娴佹按鍙 閾惰娴佹按鍙 + */ + private String bankSerialNumber; + /** + * 浜ゆ槗娴佹按鍙 浜ゆ槗娴佹按鍙凤紝鐢盋BS8瀹氫箟鐢熸垚鐨勫敮涓鏍囪瘑 + */ + private Long transactionSerialNumber; + /** + * 鍗曚綅缂栫爜鍒楄〃 瀹㈡埛鍦ㄥ叕鍏辫缃>鍩虹淇℃伅>缁勭粐鏈烘瀯缁存姢锛屼緥濡0001-XX绉戞妧鏈夐檺鍏徃锛屾澶勪紶0001 + */ + private List unitCodeList; + /** + * ERP涓氬姟鍙傝冨彿 erpSerialNumber + */ + private String erpSerialNumber; + /** + * 娆鹃」鎬ц川鍒楄〃 + */ + private List paymentNatureList; + +} diff --git a/src/com/engine/salary/remote/cbs8/response/CBS8BaseResponse.java b/src/com/engine/salary/remote/cbs8/response/CBS8BaseResponse.java new file mode 100644 index 0000000..1a44572 --- /dev/null +++ b/src/com/engine/salary/remote/cbs8/response/CBS8BaseResponse.java @@ -0,0 +1,10 @@ +package com.engine.salary.remote.cbs8.response; + +import lombok.Data; + + +@Data +public class CBS8BaseResponse { + private String code; + private String msg; +} diff --git a/src/com/engine/salary/remote/cbs8/response/CBS8PageInfo.java b/src/com/engine/salary/remote/cbs8/response/CBS8PageInfo.java new file mode 100644 index 0000000..2ae5c7e --- /dev/null +++ b/src/com/engine/salary/remote/cbs8/response/CBS8PageInfo.java @@ -0,0 +1,77 @@ +package com.engine.salary.remote.cbs8.response; + +import lombok.Data; + + +@Data +public class CBS8PageInfo { + /** + * 褰撳墠椤 + */ + private int pageNum; + /** + * 姣忛〉鐨勬暟閲 + */ + private int pageSize; + /** + * 褰撳墠椤电殑鏁伴噺 + */ + private int size; + /** + * 鎬婚〉鏁 + */ + private int pages; + /** + * 涓婁竴椤 + */ + private int prePage; + /** + * 涓嬩竴椤 + */ + private int nextPage; + /** + * 鎬昏褰曟暟 + */ + private long total; + /** + * 褰撳墠椤甸潰绗竴涓厓绱犲湪鏁版嵁搴撲腑鐨勮鍙 + */ + private int startRow; + /** + * 褰撳墠椤甸潰鏈鍚庝竴涓厓绱犲湪鏁版嵁搴撲腑鐨勮鍙 + */ + private int endRow; + /** + * 鏄惁涓虹涓椤 + */ + private boolean isFirstPage; + /** + * 鏄惁涓烘渶鍚庝竴椤 + */ + private boolean isLastPage; + /** + * 鏄惁鏈夊墠涓椤 + */ + private boolean hasPreviousPage; + /** + * 鏄惁鏈変笅涓椤 + */ + private boolean hasNextPage; + /** + * 瀵艰埅椤电爜鏁 + */ + private int navigatePages; + /** + * 鎵鏈夊鑸〉鍙 + */ + private int[] navigatepageNums; + /** + * 瀵艰埅鏉′笂鐨勭涓椤 + */ + private int navigateFirstPage; + /** + * 瀵艰埅鏉′笂鐨勬渶鍚庝竴椤 + */ + private int navigateLastPage; + +} diff --git a/src/com/engine/salary/remote/cbs8/response/GetDtaResponse.java b/src/com/engine/salary/remote/cbs8/response/GetDtaResponse.java new file mode 100644 index 0000000..e2587a9 --- /dev/null +++ b/src/com/engine/salary/remote/cbs8/response/GetDtaResponse.java @@ -0,0 +1,440 @@ +package com.engine.salary.remote.cbs8.response; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +@Data +@EqualsAndHashCode(callSuper = true) +public class GetDtaResponse extends CBS8BaseResponse { + /** + * 杩斿洖鏁版嵁 + */ + private Body data; + + @Data + public static class Body extends CBS8PageInfo{ + /** + * 鏄庣粏鍒楄〃 + */ + private List list; + } + + @Data + public static class Detail { + /** + * 绯荤粺绁ㄦ嵁缂栧彿 + */ + private String draftNbr; + /** + * 鐖剁郴缁熺エ鎹紪鍙 + */ + private String fatDraftNbr; + /** + * 绯荤粺绁ㄦ嵁绫诲瀷 绯荤粺绁ㄦ嵁绫诲瀷鏋氫妇瑙侀檮褰4.1.3銆 + */ + private String billVariety; + /** + * 绁ㄦ嵁(鍖)鍙 + */ + private String billNbr; + /** + * 鏄惁鍙垎鍖 0-鏈垎鍖 1-宸插垎鍖 + */ + private String splitFlag; + /** + * 瀛愮エ鍖洪棿璧 + */ + private String subBillIntervalStart; + /** + * 瀛愮エ鍖洪棿姝 + */ + private String subBillIntervalEnd; + /** + * 瀛愮エ鍖洪棿 + */ + private String subBillInterval; + + /** + * 绁ㄦ嵁閲戦 澶т簬绛変簬0,鏈澶氫负涓や綅灏忔暟涓旀暣鏁颁綅涓婇檺涓13浣嶃傚崟浣嶏紙鍏冿級 + */ + private BigDecimal billAmount; + + /** + * 绁ㄦ嵁绉嶇被 AC01-閾舵壙锛孉C02-鍟嗘壙 + */ + private String billType; + /** + * 鍑虹エ鏃ユ湡 鏍煎紡涓簓yyy-mm-dd + */ + private Date issueDate; + /** + * 鍒版湡鏃ユ湡 鏍煎紡涓簓yyy-mm-dd + */ + private Date dueDate; + /** + * 绁ㄩ潰鏀剁エ鏃ユ湡 绗竴鎵嬫敹绁ㄤ汉绛炬敹鏃ユ湡锛屾牸寮忎负yyyy-mm-dd + */ + private Date receiptDate; + /** + * 鎸佺エ绛炬敹鏃ユ湡 绁ㄦ嵁绛炬敹鏃ユ湡锛屾牸寮忎负yyyy-mm-dd + */ + private Date holdSignDate; + /** + * 绁ㄩ潰涓嶅緱杞鏍囪 EM00-鍙浆璁╋紝EM01-涓嶅彲杞 + */ + private String trfFlag; + /** + * 鑳屼功涓嶅緱杞鏍囪 EM00-鍙浆璁╋紝EM01-涓嶅彲杞 + */ + private String endorsementTransferFlg; + /** + * 绁ㄦ嵁鐘舵 绁ㄦ嵁鐘舵佹灇涓捐闄勫綍4.1.4 + */ + private String billSts; + /** + * 娴侀氭爣蹇 娴侀氭爣蹇楁灇涓捐闄勫綍4.1.5銆 + */ + private String billTrsSts; + /** + * 搴撳瓨鐘舵 0-鏈叆搴擄紝1-宸插叆搴擄紝2-宸插嚭搴 + */ + private String stockFlag; + /** + * 鍑哄簱鏂瑰紡 0-绌猴紝2-鑳屼功锛3-璐ㄦ娂锛4-瑙h川锛5-璐寸幇锛6-鍒嗗寘锛7-缁撴竻, 8-浣滃簾 + */ + private String outInvType; + /** + * 椋庨櫓鐘舵 RS00-闈為闄╃エ鎹 RS01-鎸傚け姝粯 RS02-鍏ず鍌憡 RS03-鍙告硶鍐荤粨 RS05-浜夎绁ㄦ嵁 RS06-闄ゆ潈鍒ゅ喅 + */ + private String riskFlag; + /** + * 璁板綍鐘舵 NOR-姝e父锛孶SE-鍗犵敤锛孌EL-鍒犻櫎 SUC-瀹屾垚 + */ + private String lockFlag; + /** + * 绁ㄦ嵁鏉ユ簮 + * 1-鐩磋仈浜ゆ槗 + * 2-绯荤粺浜ゆ槗 + * 3-鍙拌处鐧昏 + * 4-鎸戠エ鍚屾 + * 5-浠诲姟鍚屾 + */ + private String draftSource; + /** + * 鎵垮厬浜虹被鍨 RC00-閾惰(02), RC01-浼佷笟(00) ,RC02- 浜烘皯閾惰(01),RC03 -琚唬鐞嗚(A1),RC04-琚唬鐞嗚储鍔″叕鍙(A2), RC05-璐㈠姟鍏徃(03), RC06-璇佸埜鍏徃(03) ,RC07-鍩洪噾鍏徃(03) + */ + private String acceptorType; + /** + * 鏄惁鍑虹エ淇濊瘉 1-鏄紝0-鍚 + */ + private String drawerEnsureFlag; + /** + * 鏄惁鎵垮厬淇濊瘉 1-鏄紝0-鍚 + */ + private String acceptorEnsureFlag; + /** + * 鏄惁鑳屼功淇濊瘉 1-鏄紝0-鍚 + */ + private String backEnsureFlag; + /** + * 鍑虹エ浜哄悕绉 + */ + private String drawerName; + /** + * 鍑虹エ浜烘槸鍚﹀唴閮ㄤ紒涓 1-鏄紝0-鍚 + */ + private String drawerInternalFlag; + /** + * 鍑虹エ浜哄崟浣嶅悕绉 + */ + private String drawerOrganizationName; + /** + * 鍑虹エ浜哄崟浣嶇紪鐮 + */ + private String displayDrawerOrganizationCode; + /** + * 鍑虹エ浜烘槸鍚﹀鍟嗕紒涓 1-鏄紝0-鍚 + */ + private String drawerCustomerFlg; + /** + * 鍑虹エ浜哄鍟嗗悕绉 + */ + private String drawerCustomerName; + /** + * 鍑虹エ浜哄鍟嗙紪鍙 濉湪cbs绯荤粺鍏叡璁剧疆>鍩虹淇℃伅>瀹㈠晢绠$悊>瀹㈠晢淇℃伅绠$悊缁存姢鐨勫鍟嗙紪鍙 + */ + private String drawerCustomerNbr; + /** + * 鍑虹エ浜鸿处鎴峰悕绉 + */ + private String drawerAccountName; + /** + * 鍑虹エ浜鸿处鍙 + */ + private String drawerAccount; + /** + * 鍑虹エ浜哄紑鎴疯鍚嶇О + */ + private String drawerBrnName; + /** + * 鍑虹エ浜鸿仈琛屽彿 + */ + private String drawerInterbankNbr; + /** + * 鏀舵浜哄悕绉 + */ + private String payeeName; + /** + * 鏀舵浜烘槸鍚﹀唴閮ㄤ紒涓 1-鏄紝0-鍚 + */ + private String payeeInternalFlag; + /** + * 鏀舵浜哄崟浣嶅悕绉 + */ + private String payeeOrganizationName; + /** + * 鏀舵浜哄崟浣嶇紪鐮 + */ + private String displayPayeeOrganizationCode; + /** + * 鏀舵浜烘槸鍚﹀鍟嗕紒涓 1-鏄紝0-鍚 + */ + private String payeeCustomerFlag; + /** + * 鏀舵浜哄鍟嗗悕绉 + */ + private String payeeCustomerName; + /** + * 鏀舵浜哄鍟嗙紪鍙 濉湪cbs绯荤粺鍏叡璁剧疆>鍩虹淇℃伅>瀹㈠晢绠$悊>瀹㈠晢淇℃伅绠$悊缁存姢鐨勫鍟嗙紪鍙 + */ + private String payeeCustomerNbr; + /** + * 鏀舵浜鸿处鎴峰悕绉 + */ + private String payeeAccountName; + /** + * 鏀舵浜鸿处鍙 + */ + private String payeeAccount; + /** + * 鏀舵浜鸿仈琛屽彿 + */ + private String payeeInterbankNbr; + /** + * 鏀舵浜哄紑鎴疯鍚嶇О + */ + private String payeeBrnName; + /** + * 鎵垮厬浜哄悕绉 + */ + private String acceptorName; + /** + * 鎵垮厬浜烘槸鍚﹀唴閮ㄤ紒涓 1-鏄紝0-鍚 + */ + private String acceptorInternalFlag; + /** + * 鎵垮厬浜哄崟浣嶅悕绉 + */ + private String acceptorOrganizationName; + /** + * 鎵垮厬浜哄崟浣嶇紪鐮 + */ + private String displayAcceptorOrganizationCode; + /** + * 鎵垮厬浜烘槸鍚﹀鍟嗕紒涓 1-鏄紝0-鍚 + */ + private String acceptorCustomerFlg; + /** + * 鎵垮厬浜哄鍟嗗悕绉 + */ + private String acceptorCustomerName; + /** + * 鎵垮厬浜哄鍟嗙紪鍙 濉湪cbs绯荤粺鍏叡璁剧疆>鍩虹淇℃伅>瀹㈠晢绠$悊>瀹㈠晢淇℃伅绠$悊缁存姢鐨勫鍟嗙紪鍙 + */ + private String acceptorCustomerNbr; + /** + * 鎵垮厬浜鸿处鎴峰悕绉 + */ + private String acceptorAccountName; + /** + * 鎵垮厬浜鸿处鍙 + */ + private String acceptorAccount; + /** + * 鎵垮厬浜哄紑鎴疯鍚嶇О + */ + private String acceptorBrnName; + /** + * 鎵垮厬浜鸿仈琛屽彿 + */ + private String acceptorInterbankNbr; + /** + * 鍒版湡鏃犳潯浠舵敮浠樺鎵/鎵胯 + */ + private String expireUnconditionalPay; + /** + * 鎵垮厬鏃ユ湡 鏍煎紡涓簓yyy-mm-dd + */ + private Date acceptorDate; + /** + * 鍑虹エ浜鸿瘎绾т富浣 + */ + private String drawerRateSubject; + /** + * 鍑虹エ浜轰俊鐢ㄧ瓑绾 淇$敤绛夌骇鏋氫妇瑙侀檮褰4.1.7銆 + */ + private String drawerCreditRating; + /** + * 鍑虹エ浜鸿瘎绾у埌鏈熸棩 鏍煎紡涓簓yyy-mm-dd + */ + private Date drawerRateDueDate; + /** + * 鎵垮厬浜鸿瘎绾т富浣 + */ + private String acceptorRateSubject; + /** + * 鎵垮厬浜轰俊鐢ㄧ瓑绾 淇$敤绛夌骇鏋氫妇瑙侀檮褰4.1.7銆 + */ + private String acceptorCreditRating; + /** + * 鎵垮厬浜鸿瘎绾у埌鏈熸棩 鏍煎紡涓簓yyy-mm-dd + */ + private Date acceptorRateDueDate; + /** + * 鎸佺エ浜哄悕绉 + */ + private String holdName; + /** + * 鎸佺エ浜哄崟浣嶅悕绉 + */ + private String holdOrganizationName; + /** + * 鎸佺エ浜哄崟浣嶇紪鐮 + */ + private String displayHoldOrganizationCode; + /** + * 鎸佺エ浜鸿处鎴峰悕绉 + */ + private String holdAccountName; + /** + * 鎸佺エ浜洪摱琛岀被鍨 瑙侀檮褰4.1.1.閾惰绫诲瀷鏋氫妇 + */ + private String holdBankType; + /** + * 鎸佺エ浜鸿处鍙 + */ + private String holdAccount; + /** + * 鎸佺エ浜哄紑鎴疯鍚嶇О + */ + private String holdBrnName; + /** + * 鎸佺エ浜鸿仈琛屽彿 + */ + private String holdInterbankNbr; + /** + * 鍓嶆墜鍚嶇О + */ + private String preName; + /** + * 鍓嶆墜鏄惁鍐呴儴浼佷笟 1-鏄紝0-鍚 + */ + private String preInternalFlag; + /** + * 鍓嶆墜鍗曚綅鍚嶇О + */ + private String preOrganizationName; + /** + * 鍓嶆墜鍗曚綅缂栫爜 + */ + private String displayPreOrganizationCode; + /** + * 鍓嶆墜鏄惁瀹㈠晢浼佷笟 1-鏄紝0-鍚 + */ + private String preCustomerFlag; + /** + * 鍓嶆墜瀹㈠晢鍚嶇О + */ + private String preCustomerName; + /** + * 鍓嶆墜瀹㈠晢缂栧彿 濉湪cbs绯荤粺鍏叡璁剧疆>鍩虹淇℃伅>瀹㈠晢绠$悊>瀹㈠晢淇℃伅绠$悊缁存姢鐨勫鍟嗙紪鍙 + */ + private String preCustomerNbr; + /** + * 鍓嶆墜璐︽埛鍚嶇О + */ + private String preAccountName; + /** + * 鍓嶆墜璐﹀彿 + */ + private String preAccount; + /** + * 鍓嶆墜寮鎴疯鍚嶇О + */ + private String preBrnName; + /** + * 鍓嶆墜鑱旇鍙 + */ + private String preInterbankNbr; + /** + * 鍚庢墜鍚嶇О + */ + private String nextName; + /** + * 鍚庢墜鏄惁鍐呴儴浼佷笟 1-鏄紝0-鍚 + */ + private String nextInternalFlag; + /** + * 鍚庢墜鍗曚綅鍚嶇О + */ + private String nextOrganizationName; + /** + * 鍚庢墜鍗曚綅缂栫爜 + */ + private String displayNextOrganizationCode; + /** + * 鍚庢墜鏄惁瀹㈠晢浼佷笟 1-鏄紝0-鍚 + */ + private String nextCustomerFlag; + /** + * 鍚庢墜瀹㈠晢鍚嶇О + */ + private String nextCustomerName; + /** + * 鍚庢墜瀹㈠晢缂栧彿 濉湪cbs绯荤粺鍏叡璁剧疆>鍩虹淇℃伅>瀹㈠晢绠$悊>瀹㈠晢淇℃伅绠$悊缁存姢鐨勫鍟嗙紪鍙 + */ + private String nextCustomerNbr; + /** + * 鍚庢墜璐︽埛鍚嶇О + */ + private String nextAccountName; + /** + * 鍚庢墜璐﹀彿 + */ + private String nextAccount; + /** + * 鍚庢墜寮鎴疯鍚嶇О + */ + private String nextBrnName; + /** + * 鍚庢墜鑱旇鍙 + */ + private String nextInterbankNbr; + /** + * 绛炬敹鏂瑰紡 1-鏀剁エ绛炬敹锛2-鑳屼功绛炬敹 + */ + private String signMethod; + /** + * 鍚屾鐘舵 + * INIT-鏈悓姝 + * ING-鍚屾涓 + * SUC-鍚屾瀹屾垚 + * FAL-鍚屾澶辫触 + */ + private String asyncStatus; + } +} diff --git a/src/com/engine/salary/remote/cbs8/response/GetTokenResponse.java b/src/com/engine/salary/remote/cbs8/response/GetTokenResponse.java new file mode 100644 index 0000000..8aa0c4d --- /dev/null +++ b/src/com/engine/salary/remote/cbs8/response/GetTokenResponse.java @@ -0,0 +1,20 @@ +package com.engine.salary.remote.cbs8.response; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = true) +public class GetTokenResponse extends CBS8BaseResponse { + /** + * 杩斿洖鏁版嵁 + */ + private Body data; + + @Data + public static class Body { + private Integer expires; + private String token; + private String token_type; + } +} diff --git a/src/com/engine/salary/remote/cbs8/response/GetTransactionDetailResponse.java b/src/com/engine/salary/remote/cbs8/response/GetTransactionDetailResponse.java new file mode 100644 index 0000000..61b2f5d --- /dev/null +++ b/src/com/engine/salary/remote/cbs8/response/GetTransactionDetailResponse.java @@ -0,0 +1,268 @@ +package com.engine.salary.remote.cbs8.response; + +import com.alibaba.fastjson.JSON; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +@Data +@EqualsAndHashCode(callSuper = true) +public class GetTransactionDetailResponse extends CBS8BaseResponse { + /** + * 杩斿洖鏁版嵁 + */ + private Body data; + + @Data + @EqualsAndHashCode(callSuper = true) + public static class Body extends CBS8PageInfo{ + /** + * 鏄庣粏鍒楄〃 + */ + private List list; + } + + @Data + public static class Detail { + /** + * 閾惰璐﹀彿 + */ + private String accountNo; + /** + * 璐︽埛鍚嶇О + */ + private String accountName; + /** + * 閾惰绫诲瀷 閾惰绫诲瀷瑙侀檮褰4.1.5 + */ + private String bankType; + /** + * 寮鎴疯鍚嶇О + */ + private String openBank; + /** + * 浜ゆ槗鏃ユ湡 鏃堕棿鎴 + */ + private Date bankTransactionDate; + /** + * 閾惰娴佹按鍙 + */ + private String bankSerialNumber; + /** + * 浜ゆ槗娴佹按鍙 + */ + private Long transactionSerialNumber; + /** + * 甯佺 甯佺鏋氫妇瑙侀檮褰4.1.1 + */ + private String currency; + /** + * 鍊熻捶绫诲瀷 1-鍊燂紱2-璐 + */ + private String loanType; + + /** + * 鍙戠敓棰 + */ + private BigDecimal incurredAmount; + + /** + * 浜ゆ槗鍚庝綑棰 + */ + private BigDecimal accountBalance; + /** + * 鐢ㄩ + */ + private String purpose; + /** + * 鎽樿 + */ + private String digest; + /** + * 瀵规柟璐﹀彿 + */ + private String oppositeAccount; + /** + * 瀵规柟鎴峰悕 + */ + private String oppositeName; + /** + * 瀵规柟寮鎴疯 + */ + private String oppositeOpeningBank; + /** + * 鍏宠仈瀹㈡埛鍙 + */ + private String associatedCustomerNumber; + /** + * 瀹㈠晢缂栧彿 瀹㈡埛鍦ㄥ叕鍏辫缃>鍩虹淇℃伅>瀹㈠晢绠$悊鐧昏鐨勫鍟嗙紪鐮侊紝渚嬪C002-XX渚涘簲閾剧鐞嗐傛澶勮繑鍥濩002銆 + */ + private String merchantNumber; + /** + * 瀹㈠晢鍚嶇О 瀹㈡埛鍦ㄥ叕鍏辫缃>鍩虹淇℃伅>瀹㈠晢绠$悊鐧昏鐨勫鍟嗗悕绉帮紝渚嬪C002-XX渚涘簲閾剧鐞嗐傛澶勮繑鍥瀀X渚涘簲閾剧鐞嗐 + */ + private String merchantName; + /** + * 璧锋伅鏃 鏃堕棿鎴 + */ + private Date valueDate; + /** + * 浜ゆ槗浠g爜 瑙侀檮褰曟灇涓4.1.8 + */ + private String transactionCode; + /** + * 娆鹃」鎬ц川鍖归厤鏍囪 1-鏈尮閰嶏紱2-鎵嬪伐澶勭悊锛3-绯荤粺澶勭悊锛4-鍖归厤澶辫触 + */ + private String paymentNatureFlag; + /** + * 娆鹃」鎬ц川浠g爜 瀹㈡埛鍦ㄥ叕鍏辫缃>鍩虹淇℃伅>娆鹃」鎬ц川鏌ヨ鐧昏鐨勬椤规ц川锛屼緥濡侫001-寰鏉ユ锛屾澶勮繑鍥濧001 + */ + private String paymentNature; + /** + * 鏄庣粏鏉ユ簮 B锛氶摱琛岋紝鍗抽摱琛岀洿鑱 U锛氱敤鎴凤紝鍗虫墜宸/ERP鎺ュ彛瀵煎叆 + */ + private String detailSource; + /** + * 鏄庣粏绫诲瀷 1-褰撴棩鏄庣粏 2-鍘嗗彶鏄庣粏 涓庢槑缁嗘棩鏈熸棤鍏筹紝浠呮爣璇嗘暟鎹潵婧愰摱琛岀殑涓嶅悓鎺ュ彛銆 + */ + private String detailType; + /** + * 璐︽埛鐘舵 0-姝e父锛1-閿鎴 + */ + private String accountStatus; + /** + * 璐︽埛鎬ц川 瀹㈡埛鍦ㄥ叕鍏辫缃>鍩虹淇℃伅>璐︽埛鎬ц川鏌ヨ鑷畾涔夊唴瀹癸紝渚嬪AA-缁煎悎鎴凤紝姝ゅ杩斿洖鍊尖淎A鈥 + */ + private String accountNature; + /** + * 瀵硅处鐮 瀵硅处鐮侊紝鏄疌BS8绯荤粺閫氳繃涓瀹氳鍒欏尮閰嶄氦鏄撴槑缁嗕笌鍥炲崟鎴栦氦鏄撴槑缁嗕笌鏀粯鎴愬姛鍚庣敓鎴愮殑瀵硅处鐮 + */ + private String checkCode; + /** + * 鍗曚綅缂栫爜 瀹㈡埛鍦ㄥ叕鍏辫缃>鍩虹淇℃伅>缁勭粐鏈烘瀯缁存姢锛屼緥濡0001-XX绉戞妧鏈夐檺鍏徃锛屾澶勮繑鍥0001 + */ + private String unitCode; + /** + * 鍗曚綅鍚嶇О + */ + private String unitName; + /** + * 澶囨敞 + */ + private String remark; + /** + * ERP涓氬姟鍙傝冨彿 姝ゅ瓧娈典负鏀粯鎺ュ彛鐨剅eferenceNum锛堜笟鍔″弬鑰冨彿锛 + */ + private String erpSerialNumber; + /** + * 鏀粯鐢宠澶囨敞1 + */ + private String PayApplyRemark1; + /** + * 鏀粯鐢宠澶囨敞2 + */ + private String PayApplyRemark2; + /** + * 鏀粯鐢宠澶囨敞3 + */ + private String PayApplyRemark3; + /** + * 浜ゆ槗璇嗗埆鐮 + */ + private String corporateIdentityCode; + /** + * 棰勭暀瀛楁1 + */ + private String reserveField1; + /** + * 棰勭暀瀛楁2 + */ + private String reserveField2; + /** + * 棰勭暀瀛楁3 + */ + private String reserveField3; + /** + * 棰勭暀瀛楁4 + */ + private String reserveField4; + /** + * 鎵╁睍瀛楁淇℃伅 fieldKey锛氬瓧娈礙EY title : 鏍囬 content : 瀛楁鍐呭 + */ + private List extensionMsg; + /** + * 闄勮█ + */ + private String postscript; + /** + * 鍑瘉缂栧彿 + */ + private String voucherCode; + /** + * 璁拌处鏃ユ湡 + */ + private Date bookingDate; + /** + * 閾惰涓у寲瀛楁1 閾惰涓у寲瀛楁瑙侀檮褰4.1.20 + */ + private String personalizeField1; + /** + * 閾惰涓у寲瀛楁2 閾惰涓у寲瀛楁瑙侀檮褰4.1.20 + */ + private String personalizeField2; + /** + * 閾惰涓у寲瀛楁3 閾惰涓у寲瀛楁瑙侀檮褰4.1.20 + */ + private String personalizeField3; + /** + * 閾惰涓у寲瀛楁4 閾惰涓у寲瀛楁瑙侀檮褰4.1.20 + */ + private String personalizeField4; + /** + * 閾惰涓у寲瀛楁5 閾惰涓у寲瀛楁瑙侀檮褰4.1.20 + */ + private String personalizeField5; + /** + * 铏氭嫙鎴疯处鍙 + */ + private String virtualAccount; + /** + * 铏氭嫙鎴疯处鍙峰悕绉 + */ + private String virtualAccountName; + /** + * 浜ゆ槗绫诲瀷 + */ + private String protocolType; + /** + * 浜ゆ槗绫诲瀷鍚嶇О + */ + private String protocolTypeName; + /** + * 姣/瀛愬叕鍙歌处鍙 + */ + private String parentSubCompanyAccount; + /** + * 姣/瀛愬叕鍙稿悕绉版瘝/瀛愬叕鍙稿悕绉 + */ + private String parentSubCompanyName; + /** + * 閫氳繃9091->鍏叡璁剧疆->涓氬姟閰嶇疆-> + * 閫氱敤鍙傛暟绠$悊->璐︽埛绠$悊->erp_trans_detail_mark_return_flag(浜ゆ槗鏄庣粏鏌ヨERP鎺ュ彛鏄惁杩斿洖鍏宠仈涓氬姟琛ㄥ瓧娈)璁剧疆鍙紑鍚瓧娈佃繑鍥烇紝鍙傛暟鍏抽棴鏃跺瓧娈典负null + * id:鍏宠仈涓氬姟id + * bizCode:鍏宠仈涓氬姟(瑙侀檮褰4.1.22) + * bizFlag:鍏宠仈涓氬姟鏍囪 + * (0-鎵嬪伐鏍囪 + * 1-鎸夎鍒欐爣璁 + * 2-妯″潡鍏宠仈鏍囪 + * 3-ERP鎺ュ彛鏍囪) + * moduleCode:鍏宠仈妯″潡 + * menuName:鍏宠仈鑿滃崟 + * bizOrderNo:涓氬姟缂栧彿 + */ + private List markingList; + } +} diff --git a/src/com/engine/salary/remote/cbs8/util/SM2Util.java b/src/com/engine/salary/remote/cbs8/util/SM2Util.java new file mode 100644 index 0000000..358a82c --- /dev/null +++ b/src/com/engine/salary/remote/cbs8/util/SM2Util.java @@ -0,0 +1,215 @@ +package com.engine.salary.remote.cbs8.util; + +import lombok.extern.slf4j.Slf4j; +import org.bouncycastle.asn1.*; +import org.bouncycastle.crypto.engines.SM2Engine; +import org.bouncycastle.crypto.params.*; +import org.bouncycastle.crypto.signers.SM2Signer; +import org.bouncycastle.jce.ECNamedCurveTable; +import org.bouncycastle.jce.spec.ECParameterSpec; +import org.bouncycastle.math.ec.ECCurve; +import org.bouncycastle.math.ec.ECPoint; +import org.bouncycastle.util.encoders.Hex; + +import java.io.ByteArrayInputStream; +import java.math.BigInteger; +import java.security.SecureRandom; +import java.util.Enumeration; + +/** + * @author: KeXue + * @time: 2022/8/25 + * @description: SM2鍔犺В瀵嗗伐鍏风被 + */ +@Slf4j +public class SM2Util { + + private SM2Util() { + throw new IllegalStateException("Utility class"); + } + + private static final String STD_NAME = "sm2p256v1"; + + /** + * SM2鍔犲瘑绠楁硶 + * + * @param publicKey 鍏挜 + * @param data 鏄庢枃鏁版嵁 + * @return + */ + public static byte[] encrypt(String publicKey, byte[] data) { + ECPublicKeyParameters ecPublicKeyParameters = encodePublicKey(Hex.decode(publicKey)); + SM2Engine engine = new SM2Engine(); + engine.init(true, new ParametersWithRandom(ecPublicKeyParameters, new SecureRandom())); + + byte[] bytes = null; + try { + byte[] cipherText = engine.processBlock(data, 0, data.length); + bytes = C1C2C3ToC1C3C2(cipherText); + } catch (Exception e) { + log.warn("SM2鍔犲瘑鏃跺嚭鐜板紓甯:" + e.getMessage()); + } + return bytes; + } + + /** + * SM2瑙e瘑绠楁硶 + * + * @param privateKey 绉侀挜 + * @param cipherData 瀵嗘枃鏁版嵁 + * @return + */ + public static byte[] decrypt(String privateKey, byte[] cipherData) { + ECPrivateKeyParameters ecPrivateKeyParameters = encodePrivateKey(Hex.decode(privateKey)); + SM2Engine engine = new SM2Engine(); + engine.init(false, ecPrivateKeyParameters); + + byte[] bytes = null; + try { + cipherData = C1C3C2ToC1C2C3(cipherData); + bytes = engine.processBlock(cipherData, 0, cipherData.length); + } catch (Exception e) { + log.warn("SM2瑙e瘑鏃跺嚭鐜板紓甯:" + e.getMessage()); + } + return bytes; + } + + /** + * 绛惧悕绠楁硶 + * + * @param privateKey 绉侀挜 + * @param data 鏄庢枃鏁版嵁 + * @return + */ + public static byte[] sign(String privateKey, byte[] data) { + ECPrivateKeyParameters ecPrivateKeyParameters = encodePrivateKey(hexToByte(privateKey)); + SM2Signer signer = new SM2Signer(); + ParametersWithID parameters = new ParametersWithID(ecPrivateKeyParameters, "1234567812345678".getBytes()); + signer.init(true, parameters); + signer.update(data, 0, data.length); + + byte[] signature = null; + try { + signature = decodeDERSignature(signer.generateSignature()); + } catch (Exception e) { + log.warn("SM2绛惧悕鏃跺嚭鐜板紓甯:" + e.getMessage()); + } + return signature; + } + + private static byte[] hexToByte(String hex) + throws IllegalArgumentException { + if (hex.length() % 2 != 0) { + throw new IllegalArgumentException(); + } + char[] arr = hex.toCharArray(); + byte[] b = new byte[hex.length() / 2]; + for (int i = 0, j = 0, l = hex.length(); i < l; i++, j++) { + String swap = "" + arr[i++] + arr[i]; + int byteInt = Integer.parseInt(swap, 16) & 0xFF; + b[j] = BigInteger.valueOf(byteInt).byteValue(); + } + return b; + } + + private static byte[] C1C2C3ToC1C3C2(byte[] cipherText) throws Exception { + if (cipherText != null && cipherText.length >= 97) { + byte[] bytes = new byte[cipherText.length]; + System.arraycopy(cipherText, 0, bytes, 0, 65); + System.arraycopy(cipherText, cipherText.length - 32, bytes, 65, 32); + System.arraycopy(cipherText, 65, bytes, 97, cipherText.length - 97); + return bytes; + } else { + throw new Exception("SM2 cipher text error, must be more than 96 bytes and in the format C1||C3||C2."); + } + } + + private static byte[] C1C3C2ToC1C2C3(byte[] cipherText) throws Exception { + if (cipherText != null && cipherText.length >= 97) { + byte[] bytes = new byte[cipherText.length]; + System.arraycopy(cipherText, 0, bytes, 0, 65); + System.arraycopy(cipherText, 97, bytes, 65, cipherText.length - 97); + System.arraycopy(cipherText, 65, bytes, cipherText.length - 32, 32); + return bytes; + } else { + throw new Exception("SM2 cipher text error, must be more than 96 bytes and in the format C1||C3||C2."); + } + } + + private static ECPublicKeyParameters encodePublicKey(byte[] value) { + byte[] x = new byte[32]; + byte[] y = new byte[32]; + System.arraycopy(value, 1, x, 0, 32); + System.arraycopy(value, 33, y, 0, 32); + BigInteger X = new BigInteger(1, x); + BigInteger Y = new BigInteger(1, y); + ECPoint Q = getSM2Curve().createPoint(X, Y); + return new ECPublicKeyParameters(Q, getECDomainParameters()); + } + + private static ECCurve getSM2Curve() { + ECParameterSpec spec = ECNamedCurveTable.getParameterSpec(STD_NAME); + return spec.getCurve(); + } + + private static ECPrivateKeyParameters encodePrivateKey(byte[] value) { + BigInteger d = new BigInteger(1, value); + return new ECPrivateKeyParameters(d, getECDomainParameters()); + } + + private static ECDomainParameters getECDomainParameters() { + ECParameterSpec spec = ECNamedCurveTable.getParameterSpec(STD_NAME); + return new ECDomainParameters(spec.getCurve(), spec.getG(), spec.getN(), spec.getH(), spec.getSeed()); + } + + private static byte[] decodeDERSignature(byte[] signature) { + ASN1InputStream stream = new ASN1InputStream(new ByteArrayInputStream(signature)); + + byte[] bytes = new byte[64]; + try { + ASN1Sequence primitive = (ASN1Sequence) stream.readObject(); + Enumeration enumeration = primitive.getObjects(); + BigInteger R = ((ASN1Integer) enumeration.nextElement()).getValue(); + BigInteger S = ((ASN1Integer) enumeration.nextElement()).getValue(); + byte[] r = format(R.toByteArray()); + byte[] s = format(S.toByteArray()); + System.arraycopy(r, 0, bytes, 0, 32); + System.arraycopy(s, 0, bytes, 32, 32); + } catch (Exception e) { + log.warn("decodeDERSignature鏃跺嚭鐜板紓甯:" + e.getMessage()); + } + return bytes; + } + + public static byte[] encodeDERSignature(byte[] signature) { + byte[] r = new byte[32]; + byte[] s = new byte[32]; + System.arraycopy(signature, 0, r, 0, 32); + System.arraycopy(signature, 32, s, 0, 32); + ASN1EncodableVector vector = new ASN1EncodableVector(); + vector.add(new ASN1Integer(new BigInteger(1, r))); + vector.add(new ASN1Integer(new BigInteger(1, s))); + + byte[] encoded = null; + try { + encoded = (new DERSequence(vector)).getEncoded(); + } catch (Exception e) { + log.warn("encodeDERSignature鏃跺嚭鐜板紓甯:" + e.getMessage()); + } + return encoded; + } + + private static byte[] format(byte[] value) { + if (value.length == 32) { + return value; + } else { + byte[] bytes = new byte[32]; + if (value.length > 32) { + System.arraycopy(value, value.length - 32, bytes, 0, 32); + } else { + System.arraycopy(value, 0, bytes, 32 - value.length, value.length); + } + return bytes; + } + } +} diff --git a/src/com/engine/salary/remote/cbs8/util/db/IdGenerator.java b/src/com/engine/salary/remote/cbs8/util/db/IdGenerator.java new file mode 100644 index 0000000..0722256 --- /dev/null +++ b/src/com/engine/salary/remote/cbs8/util/db/IdGenerator.java @@ -0,0 +1,51 @@ +package com.engine.salary.remote.cbs8.util.db; + +import java.util.UUID; +import java.util.concurrent.atomic.AtomicLong; + +public class IdGenerator { + private static AtomicLong next = new AtomicLong(1L); + public static final int ID_LENGTH_36 = 36; + + public IdGenerator() { + } + + public static long generate() { + return System.currentTimeMillis() + next.getAndIncrement(); + } + + public static String generateId() { + return System.currentTimeMillis() + String.valueOf(next.getAndIncrement()); + } + + public static String generateStrId() { + return System.currentTimeMillis() + generateStrId(36); + } + + public static String generateStrId(int idLength) { + if (idLength >= 1 && idLength <= 36) { + char[] srcChars = new char[]{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'g', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}; + char[] chars = new char[idLength]; + + for(int i = 0; i < idLength; ++i) { + if (i != 8 && i != 13 && i != 18 && i != 23) { + if (i == 0) { + chars[i] = srcChars[(int)(Math.random() * 26.0D) % 26]; + } else { + chars[i] = srcChars[(int)(Math.random() * 36.0D) % 36]; + } + } else { + chars[i] = '_'; + } + } + + return new String(chars); + } else { + return ""; + } + } + + public static String getUUID() { + return UUID.randomUUID().toString().replaceAll("-", ""); + } +} diff --git a/src/com/engine/salary/remote/cbs8/util/db/MapperProxyFactory.java b/src/com/engine/salary/remote/cbs8/util/db/MapperProxyFactory.java new file mode 100644 index 0000000..f639b7a --- /dev/null +++ b/src/com/engine/salary/remote/cbs8/util/db/MapperProxyFactory.java @@ -0,0 +1,79 @@ +/** + * + */ +package com.engine.salary.remote.cbs8.util.db; + +import org.apache.ibatis.session.SqlSession; +import weaver.conn.mybatis.MyBatisFactory; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; + +/** + * mapper浠g悊宸ュ巶 + *

Copyright: Copyright (c) 2022

+ *

Company: 娉涘井杞欢

+ * + * @author qiantao + * @version 1.0 + **/ +public class MapperProxyFactory implements InvocationHandler { + private Class clazz; + private boolean enableTransactions = false; + private SqlSession session; + + public MapperProxyFactory(Class clazz) { + this.clazz = clazz; + } + + @Override + public Object invoke(Object proxy, Method method, Object[] args) throws Exception { + this.session = MyBatisFactory.sqlSessionFactory.openSession(); + try { + Object target = session.getMapper(clazz); + return method.invoke(target, args); + } finally { + if (!enableTransactions) { + session.commit(); + session.close(); + } + } + } + + public Object getProxy() { + ClassLoader loader = Thread.currentThread().getContextClassLoader(); + Class[] interfaces = new Class[1]; + interfaces[0] = this.clazz; + return Proxy.newProxyInstance(loader, interfaces, this); + } + + public Object getProxy(boolean enableTransactions) { + this.enableTransactions = enableTransactions; + return this.getProxy(); + } + + public void commit() { + if (this.session != null) { + this.session.commit(); + this.session.close(); + } + } + + public void rollback() { + if (this.session != null) { + this.session.rollback(); + this.session.close(); + } + } + + public static T getProxy(Class clazz) { + MapperProxyFactory handle = new MapperProxyFactory(clazz); + return (T) handle.getProxy(); + } + + public static T getProxy(Class clazz, boolean enableTransactions) { + MapperProxyFactory handle = new MapperProxyFactory(clazz); + return (T) handle.getProxy(enableTransactions); + } +} diff --git a/src/com/engine/salary/remote/cbs8/xml/XStreamUtil.java b/src/com/engine/salary/remote/cbs8/xml/XStreamUtil.java new file mode 100644 index 0000000..5116f59 --- /dev/null +++ b/src/com/engine/salary/remote/cbs8/xml/XStreamUtil.java @@ -0,0 +1,68 @@ +package com.engine.salary.remote.cbs8.xml; + +import cn.hutool.core.util.StrUtil; +import com.thoughtworks.xstream.XStream; +import com.thoughtworks.xstream.io.HierarchicalStreamDriver; +import com.thoughtworks.xstream.io.naming.NoNameCoder; +import com.thoughtworks.xstream.io.xml.DomDriver; +import com.thoughtworks.xstream.security.AnyTypePermission; + +import java.util.Objects; + +public class XStreamUtil { + //new NoNameCoder() 瑙e喅 _ 琚簭鍒楀寲鎴 __ 鐨勯棶棰 + private static final NoNameCoder noNameCoder = new NoNameCoder(); + + private static XStream xStream = new XStream(new DomDriver("UTF-8", noNameCoder)); + + private static XStream getxStream(HierarchicalStreamDriver driver){ + if(Objects.isNull(driver)){ + return xStream; + } + return new XStream(driver); + } + + public static T unmarshal(String pkgName, Class cla, String xmlStr, HierarchicalStreamDriver driver) { + xStream = getxStream(driver); + + if (StrUtil.isEmpty(pkgName)) { + //楂樼増鏈负浜嗚В鍐冲畨鍏ㄦ紡娲烇紝澧炲姞浜嗙櫧鍚嶅崟鏈哄埗锛 濡傛灉涓嶈缃繖涓潈闄愬彲鑳戒細鎶ラ敊 + xStream.addPermission(AnyTypePermission.ANY); + } else { + //璁剧疆鍏佽瑙f瀽鐨勫寘锛屽鏋滀笉鎯宠缃彲浠ョ敤 addPermission(AnyTypePermission.ANY) 浠f浛 + xStream.allowTypesByWildcard(new String[]{pkgName}); + } + + //鏀寔娉ㄨВ锛屼笉鐒朵娇鐢ㄧ殑XStream娉ㄨВ涓嶄細鐢熸晥涓斾笉鎶ラ敊 + xStream.autodetectAnnotations(true); + xStream.processAnnotations(cla); + + //蹇界暐鏈煡灞炴, 濡傛灉涓嶆坊鍔犺繖涓紝褰揦ml鎶ユ枃涓嚭鐜板疄浣撲腑娌℃湁鐨勫睘鎬ф椂浼氭姤閿 No such field + xStream.ignoreUnknownElements(); + + return (T) xStream.fromXML(xmlStr); + } + + public static T unmarshal(String pkgName, Class cla, String xmlStr) { + return unmarshal(pkgName, cla, xmlStr, null); + } + + public static T unmarshal(Class cla, String xmlStr) { + return unmarshal(null, cla, xmlStr, null); + } + + public static String marshal(Object o, DomDriver driver) { + xStream = getxStream(driver); + + //鏀寔娉ㄨВ锛屼笉鐒朵娇鐢ㄧ殑 @XStreamAlias() 娉ㄨВ涓嶄細鐢熸晥鑰屼笖涓嶄細鎶ラ敊 + xStream.autodetectAnnotations(true); + + //娉ㄥ唽鑷畾涔夋椂闂磋浆鎹㈠櫒锛屼娇寰梄Stream鍏ㄥ眬鏀寔LocalDateTime锛 鎴栬呬笉鍦ㄨ繖閲屾敞鍐岋紝浣跨敤@XStreamConverter(LocalDateTimeConverter.class)娉ㄨВ鍦ㄥ崟涓瀛楁涓 +// xStream.registerConverter(new LocalDateTimeConverter()); + return xStream.toXML(o); + } + + public static String marshal(Object o){ + return marshal(o, null); + } +} diff --git a/src/com/engine/salary/timer/SyncCBSAccountDetailsJob.java b/src/com/engine/salary/timer/SyncCBSAccountDetailsJob.java new file mode 100644 index 0000000..b2c7fa5 --- /dev/null +++ b/src/com/engine/salary/timer/SyncCBSAccountDetailsJob.java @@ -0,0 +1,285 @@ +package com.engine.salary.timer; + +import cn.hutool.core.util.StrUtil; +import com.engine.salary.exception.CBS8RunTimeException; +import com.engine.salary.mapper.SQLMapper; +import com.engine.salary.mapper.cbs.UfHkrdzbMapper; +import com.engine.salary.remote.cbs8.client.AccountManagementClient; +import com.engine.salary.remote.cbs8.config.EBS2ECConfig; +import com.engine.salary.remote.cbs8.po.UfHkrdzbPO; +import com.engine.salary.remote.cbs8.request.GetTransactionDetailRequest; +import com.engine.salary.remote.cbs8.response.GetTransactionDetailResponse; +import com.engine.salary.remote.cbs8.JsonUtil; +import com.engine.salary.remote.cbs8.SalaryEntityUtil; +import com.engine.salary.remote.cbs8.util.db.MapperProxyFactory; +import com.thoughtworks.xstream.XStream; +import com.thoughtworks.xstream.security.AnyTypePermission; +import lombok.extern.slf4j.Slf4j; +import weaver.conn.RecordSet; +import weaver.formmode.setup.ModeRightInfo; +import weaver.general.GCONST; +import weaver.general.TimeUtil; +import weaver.hrm.User; +import weaver.interfaces.schedule.BaseCronJob; + +import java.io.File; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 鑾峰彇澧冨唴璐︽埛鏄庣粏 + *

Copyright: Copyright (c) 2024

+ *

Company: 娉涘井杞欢

+ * + * @author qiantao + * @version 1.0 + **/ +@Slf4j +public class SyncCBSAccountDetailsJob extends BaseCronJob { + + /** + * 寮濮嬫棩鏈 鏍煎紡涓簓yyy-mm-dd + */ + private String startDate; + /** + * 缁撴潫鏃ユ湡 鏍煎紡涓簓yyy-mm-dd + */ + private String endDate; + /** + * 鍊熻捶绫诲瀷 1-鍊燂紱2-璐 + */ + private String loanType; + /** + * 娆鹃」鎬ц川鍒楄〃 + */ + private String paymentNatureList; + + /** + * 鏃ユ湡绫诲瀷 0-浜ゆ槗鏃ユ湡 + */ + private String dateType; + /** + * 璐︽埛鍒楄〃 鏌ヨ璐︽埛鍒楄〃锛屼笉浼犻粯璁よ繑鍥炲叏閮 + */ + private String accountNoList; + /** + * 閾惰绫诲瀷鍒楄〃 渚嬪鎷涜CMB锛岄摱琛岀被鍨嬫灇涓捐闄勫綍4.1.5 + */ + private String bankTypeList; + /** + * 甯佺鍒楄〃 瑙侀檮褰曞竵绉嶆灇涓撅紝4.1.1 + */ + private String currencyList; + /** + * 鏄庣粏鏉ユ簮 + * B锛氶摱琛岋紝鍗抽摱琛岀洿鑱 + * U锛氱敤鎴凤紝鍗虫墜宸/ERP鎺ュ彛瀵煎叆 + * 涓嶄紶榛樿鏌ュ叏閮 + */ + private String detailedSources; + /** + * 鏄庣粏绫诲瀷 1-褰撴棩鏄庣粏 2-鍘嗗彶鏄庣粏 涓庢槑缁嗘棩鏈熸棤鍏筹紝浠呮爣璇嗘暟鎹潵婧愰摱琛岀殑涓嶅悓鎺ュ彛 + */ + private String currentFlag; + + /** + * 璐︽埛鎬ц川鍒楄〃 瀹㈡埛鍦ㄥ叕鍏辫缃>鍩虹淇℃伅>璐︽埛鎬ц川鏌ヨ鑷畾涔夊唴瀹癸紝渚嬪AA-缁煎悎鎴凤紝姝ゅ浼犲尖淎A鈥 + */ + private String accountNatureList; + /** + * 閾惰娴佹按鍙 閾惰娴佹按鍙 + */ + private String bankSerialNumber; + /** + * 浜ゆ槗娴佹按鍙 浜ゆ槗娴佹按鍙凤紝鐢盋BS8瀹氫箟鐢熸垚鐨勫敮涓鏍囪瘑 + */ + private Long transactionSerialNumber; + /** + * 鍗曚綅缂栫爜鍒楄〃 瀹㈡埛鍦ㄥ叕鍏辫缃>鍩虹淇℃伅>缁勭粐鏈烘瀯缁存姢锛屼緥濡0001-XX绉戞妧鏈夐檺鍏徃锛屾澶勪紶0001 + */ + private String unitCodeList; + /** + * ERP涓氬姟鍙傝冨彿 erpSerialNumber + */ + private String erpSerialNumber; + + private SQLMapper getSQLMapper() { + return MapperProxyFactory.getProxy(SQLMapper.class); + } + + private UfHkrdzbMapper getUfHkrdzbMapper() { + return MapperProxyFactory.getProxy(UfHkrdzbMapper.class); + } + + @Override + public void execute() { + User user = new User(); + user.setUid(1); + user.setLoginid("sysadmin"); + + try { + GetTransactionDetailRequest requestParam = new GetTransactionDetailRequest(); + requestParam.setCurrentPage(1); + requestParam.setPageSize(1000); + if (StrUtil.isNotBlank(startDate) && StrUtil.isNotBlank(endDate)) { + requestParam.setStartDate(startDate); + requestParam.setEndDate(endDate); + } else { + String nowDate = LocalDate.now().toString(); + requestParam.setStartDate(nowDate); + requestParam.setEndDate(nowDate); + } + requestParam.setLoanType(loanType); + requestParam.setPaymentNatureList(paymentNatureList == null ? null :Arrays.stream(paymentNatureList.split(",")).collect(Collectors.toList())); + requestParam.setDateType(dateType); + requestParam.setAccountNoList(accountNoList== null ? null :Arrays.stream(accountNoList.split(",")).collect(Collectors.toList())); + requestParam.setBankTypeList(bankTypeList== null ? null :Arrays.stream(bankTypeList.split(",")).collect(Collectors.toList())); + requestParam.setCurrencyList(currencyList== null ? null :Arrays.stream(currencyList.split(",")).collect(Collectors.toList())); + requestParam.setDetailedSources(detailedSources); + requestParam.setCurrentFlag(currentFlag); + requestParam.setAccountNatureList(accountNatureList== null ? null :Arrays.stream(accountNatureList.split(",")).collect(Collectors.toList())); + requestParam.setBankSerialNumber(bankSerialNumber); + requestParam.setTransactionSerialNumber(transactionSerialNumber); + requestParam.setUnitCodeList(unitCodeList== null ? null :Arrays.stream(unitCodeList.split(",")).collect(Collectors.toList())); + requestParam.setErpSerialNumber(erpSerialNumber); + + //鏌ヨ鍓1000鏉℃暟鎹 + AccountManagementClient accountManagementClient = new AccountManagementClient(); + GetTransactionDetailResponse response = accountManagementClient.transactionDetailQuery(requestParam); + List list = response.getData().getList(); + + //鍒ゆ柇鏄惁杩樺瓨鍦ㄦ暟鎹紝閫掑綊鏌ヨ + boolean hasNextPage = response.getData().isHasNextPage(); + int nextPage = response.getData().getNextPage(); + while (hasNextPage) { + requestParam.setCurrentPage(nextPage); + GetTransactionDetailResponse nextPageResponse = accountManagementClient.transactionDetailQuery(requestParam); + List pageData = nextPageResponse.getData().getList(); + list.addAll(pageData); + hasNextPage = nextPageResponse.getData().isHasNextPage(); + nextPage = nextPageResponse.getData().getNextPage(); + } + + //鍔犺浇cbs閰嶇疆 + XStream xStream = new XStream(); + String resource = GCONST.getRootPath() + "WEB-INF" + File.separatorChar + "CBS2ECConfig.xml"; + File file = new File(resource); + xStream.addPermission(AnyTypePermission.ANY); + xStream.processAnnotations(EBS2ECConfig.class); + EBS2ECConfig dto = (EBS2ECConfig) xStream.fromXML(file); + EBS2ECConfig.Table table = dto.getTables().get(0); + Integer modeId = table.getModeId(); + String tableName = table.getKey(); + + //鑾峰彇宸插瓨鍦ㄧ殑鏁版嵁 + EBS2ECConfig.Table.Field uniqueField = table.getFields().stream().filter(EBS2ECConfig.Table.Field::isUnique).findFirst().orElse(null); + if (uniqueField == null) { + throw new CBS8RunTimeException("鏈缃敮涓鏍囪瘑瀛楁"); + } + String uniqueKey = uniqueField.getKey(); + String uniqueEbsKey = uniqueField.getEbsKey(); + List uniqueDataKeys = getSQLMapper().listString(String.format("select %s from %s", uniqueKey, tableName)); + + //鑾峰彇姹囨浜轰笌鍔炰簨澶勭殑瀵圭収鏁版嵁 + List ufHkrdzbPOS = getUfHkrdzbMapper().listAll(); + Map customerDepartmentMap = SalaryEntityUtil.convert2Map(ufHkrdzbPOS, UfHkrdzbPO::getKhmc, UfHkrdzbPO::getDepartmentId); + + for (GetTransactionDetailResponse.Detail detail : list) { + Map detailMap = JsonUtil.parseMap(detail, String.class); + String uniqueData = detailMap.get(uniqueEbsKey); + if (StrUtil.isBlank(uniqueData)) { + log.warn("璺宠繃cbs浜ゆ槗鏁版嵁锛屽敮涓鏍囪瘑杩斿洖绌,uniqueKey:{},uniqueEbsKey:{}", uniqueKey, uniqueEbsKey); + continue; + } + if (uniqueDataKeys.contains(uniqueData)) { + log.warn("璺宠繃cbs浜ゆ槗鏁版嵁锛屾暟鎹凡瀛樺湪,uniqueKey:{},uniqueEbsKey:{},鍊納}", uniqueKey, uniqueEbsKey, uniqueData); + continue; + } + + List fields = new ArrayList() {{ + //寤烘ā榛樿瀛楁 + add("formmodeid"); + add("modedatacreater"); + add("modedatacreatertype"); + add("modedatacreatedate"); + add("modedatacreatetime"); + }}; + + String currDate = TimeUtil.getCurrentDateString(); + SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); + String currTime = sdf.format(new Date()); + List values = new ArrayList() {{ + add(modeId); + add(1); + add(0); + add(String.format("'%s'", currDate)); + add(String.format("'%s'", currTime)); + }}; + + String hkr = ""; + for (EBS2ECConfig.Table.Field field : table.getFields()) { + //鏁版嵁搴撳瓧娈 + String fieldName = field.getKey(); + fields.add(fieldName); + // 鎺ュ彛鍊 + String value = detailMap.getOrDefault(field.getEbsKey(), ""); + values.add(String.format("'%s'", detailMap.getOrDefault(field.getEbsKey(), ""))); + + //姹囨浜 + if ("hkr".equals(fieldName)) { + hkr = value; + } + } + + //涓氬姟閫昏緫瀛楁锛屾敹娆剧被鍨嬶紝榛樿鏄摱琛屽瓨娆 + fields.add("sklx"); + values.add(0); + + /* + * 璁ら閫昏緫锛 + * 鏍规嵁姹囨浜哄幓琛ㄩ噷鍖归厤銆愭眹娆句汉涓庡姙浜嬪鐨勫鐓ц〃銆 + * 濡傛灉鑳藉尮閰嶅埌鏁版嵁锛屽垯鐘舵佹敼涓哄凡鑷姩璁ら锛屽悓鏃舵妸鍔炰簨澶勶紙閮ㄩ棬锛夌殑鍊煎悓姝ュ埌鍔炰簨澶勫瓧娈典腑锛屾槸鍚︾郴缁熻嚜鍔ㄨ棰嗗悓姝ヤ负鏄紱 + * 濡傚鐓ф爣鍑嗘棤鏁版嵁锛屽垯鐘舵佷负锛氭湭璁ら锛 + */ + Integer departmentId = customerDepartmentMap.get(hkr); + if(departmentId!=null){ + //璁ら + fields.add("zt"); + values.add(1); + + //鏄惁绯荤粺璁ら + fields.add("sfxtzdrl"); + values.add(1); + + //鍔炰簨澶 + fields.add("szbm"); + values.add(departmentId); + }else { + //鏈棰 + fields.add("zt"); + values.add(0); + } + + String sql = String.format("insert into %s (%s) values (%s)", tableName, String.join(",", fields), values.stream().map(Object::toString).collect(Collectors.joining(","))); + RecordSet rs = new RecordSet(); + rs.execute(sql); + + if (modeId != null) { + rs.executeQuery("select max(id) from " + tableName); + int mainId = 0; + if (rs.next()) { + mainId = rs.getInt(1); + } + ModeRightInfo ModeRightInfo = new ModeRightInfo(); + ModeRightInfo.setNewRight(true); + ModeRightInfo.editModeDataShare(1, modeId, mainId); + } + } + } catch (Exception e) { + log.error("鑾峰彇CBS浜ゆ槗淇℃伅澶辫触", e); + throw new CBS8RunTimeException("鑾峰彇CBS浜ゆ槗淇℃伅澶辫触," + e.getMessage(), e); + } + } +} diff --git a/src/com/engine/salary/timer/SyncCBSBillPoolJob.java b/src/com/engine/salary/timer/SyncCBSBillPoolJob.java new file mode 100644 index 0000000..c78142f --- /dev/null +++ b/src/com/engine/salary/timer/SyncCBSBillPoolJob.java @@ -0,0 +1,311 @@ +package com.engine.salary.timer; + +import cn.hutool.core.util.StrUtil; +import com.engine.salary.exception.CBS8RunTimeException; +import com.engine.salary.mapper.SQLMapper; +import com.engine.salary.remote.cbs8.client.BillManagementClient; +import com.engine.salary.remote.cbs8.config.EBS2ECConfig; +import com.engine.salary.remote.cbs8.request.GetDtaRequest; +import com.engine.salary.remote.cbs8.response.GetDtaResponse; +import com.engine.salary.remote.cbs8.JsonUtil; +import com.engine.salary.remote.cbs8.util.db.MapperProxyFactory; +import com.thoughtworks.xstream.XStream; +import com.thoughtworks.xstream.security.AnyTypePermission; +import lombok.extern.slf4j.Slf4j; +import weaver.conn.RecordSet; +import weaver.formmode.setup.ModeRightInfo; +import weaver.general.GCONST; +import weaver.general.TimeUtil; +import weaver.general.Util; +import weaver.hrm.User; +import weaver.interfaces.schedule.BaseCronJob; + +import java.io.File; +import java.math.BigDecimal; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 鑾峰彇绁ㄦ嵁姹 + *

Copyright: Copyright (c) 2024

+ *

Company: 娉涘井杞欢

+ * + * @author qiantao + * @version 1.0 + **/ +@Slf4j +public class SyncCBSBillPoolJob extends BaseCronJob { + + /** + * 鎸佺エ浜哄崟浣嶇紪鐮 澶氶夈傚~鍦╟bs绯荤粺鍏叡璁剧疆>鍩虹淇℃伅>缁勭粐鏈烘瀯缁存姢鐨勫崟浣嶇紪鐮 + */ + private String displayHoldOrganizationCodeList; + /** + * 鎸佺エ浜鸿处鍙 澶氶夈 + */ + private String holdAccountList; + + /** + * 绯荤粺绁ㄦ嵁绫诲瀷 澶氶夈傛寜闄勫綍4.1.3绁ㄦ嵁绫诲瀷-绁ㄦ嵁鐘舵-娴侀氭爣蹇楃骇鑱斿叧绯昏〃閫夋嫨鍚庢寜椤哄簭濉啓銆傜郴缁熺エ鎹被鍨嬫灇涓捐闄勫綍4.1.3銆傜エ鎹姸鎬佹灇涓捐闄勫綍4.1.4銆傛祦閫氭爣蹇楁灇涓捐闄勫綍4.1.5銆 + */ + private String billVarietyList; + + /** + * 鍑虹エ鏃ユ湡璧 鏍煎紡涓簓yyy-mm-dd锛屽嚭绁ㄦ棩鏈熻捣姝笉鍏佽涓杈规湁鍊间竴杈规棤鍊硷紝鏃ユ湡闂撮殧鏈澶т负涓骞 + */ + private String issueDateStart; + + /** + * 鍑虹エ鏃ユ湡姝 鏍煎紡涓簓yyy-mm-dd锛屽嚭绁ㄦ棩鏈熻捣姝笉鍏佽涓杈规湁鍊间竴杈规棤鍊硷紝鏃ユ湡闂撮殧鏈澶т负涓骞 + */ + private String issueDateEnd; + + + /** + * 鍒版湡鏃ユ湡璧 鏍煎紡涓簓yyy-mm-dd锛屽埌鏈熸棩鏈熻捣姝笉鍏佽涓杈规湁鍊间竴杈规棤鍊硷紝鏃ユ湡闂撮殧鏈澶т负涓骞 + */ + private String dueDateStart; + /** + * 鍒版湡鏃ユ湡姝 鏍煎紡涓簓yyy-mm-dd锛屽埌鏈熸棩鏈熻捣姝笉鍏佽涓杈规湁鍊间竴杈规棤鍊硷紝鏃ユ湡闂撮殧鏈澶т负涓骞 + */ + private String dueDateEnd; + /** + * 绁ㄦ嵁绉嶇被 AC01-閾舵壙锛孉C02-鍟嗘壙 + */ + private String billType; + /** + * 绁ㄦ嵁鏉ユ簮 澶氶夈1-鐩磋仈浜ゆ槗锛2-鍙拌处浜ゆ槗锛3-鍙拌处鐧昏锛4-鎸戠エ鍚屾锛5-浠诲姟鍚屾 + */ + private String draftSourceList; + /** + * 鎸佺エ閾惰绫诲瀷 澶氶夈傝闄勫綍4.1.1.閾惰绫诲瀷鏋氫妇 + */ + private String holdBankTypeList; + + /** + * 鎸佺エ绛炬敹鏃ユ湡璧 鏍煎紡涓簓yyy-mm-dd锛屾寔绁ㄧ鏀舵棩鏈熻捣姝笉鍏佽涓杈规湁鍊间竴杈规棤鍊硷紝鏃ユ湡闂撮殧鏈澶т负涓骞 + */ + private String holdSignDateStart; + /** + * 鎸佺エ绛炬敹鏃ユ湡姝 鏍煎紡涓簓yyy-mm-dd锛屾寔绁ㄧ鏀舵棩鏈熻捣姝笉鍏佽涓杈规湁鍊间竴杈规棤鍊硷紝鏃ユ湡闂撮殧鏈澶т负涓骞 + */ + private String holdSignDateEnd; + /** + * 绯荤粺绁ㄦ嵁缂栧彿 + */ + private String draftNbr; + /** + * 绁ㄦ嵁(鍖)鍙 + */ + private String billNbr; + + /** + * 绁ㄦ嵁閲戦璧 澶т簬绛変簬0,鏈澶氫负涓や綅灏忔暟涓旀暣鏁颁綅涓婇檺涓13浣嶃傜エ鎹噾棰濊捣姝笉鍏佽涓杈规湁鍊间竴杈规棤鍊笺傚崟浣嶏紙鍏冿級 + */ + private BigDecimal billAmountStart; + + /** + * 绁ㄦ嵁閲戦姝 澶т簬绛変簬0,鏈澶氫负涓や綅灏忔暟涓旀暣鏁颁綅涓婇檺涓13浣嶃傜エ鎹噾棰濊捣姝笉鍏佽涓杈规湁鍊间竴杈规棤鍊笺傚崟浣嶏紙鍏冿級 + */ + private BigDecimal billAmountEnd; + + /** + * 瀛愮エ鍖洪棿璧 瀛愮エ鍖洪棿璧锋涓嶅厑璁镐竴杈规湁鍊间竴杈规棤鍊硷紝鏈澶12浣 + */ + private String subBillIntervalStart; + /** + * 瀛愮エ鍖洪棿姝 瀛愮エ鍖洪棿璧锋涓嶅厑璁镐竴杈规湁鍊间竴杈规棤鍊,鏈澶12浣 + */ + private String subBillIntervalEnd; + + /** + * 绁ㄦ嵁鐘舵 + */ + private String billStsList; + /** + * 娴侀氭爣蹇 + */ + private String billTrsStsList; + /** + * 搴撳瓨鐘舵 1-宸插叆搴擄紝2-宸插嚭搴撱 涓虹┖鏃堕粯璁ゆ煡璇㈠叏閮ㄦ暟鎹 + */ + private String stockFlag; + /** + * 鍑哄簱鏂瑰紡 0-绌猴紝2-鑳屼功锛3-璐ㄦ娂锛4-瑙h川锛5-璐寸幇锛6-鍒嗗寘锛7-缁撴竻, 8-浣滃簾銆 涓虹┖鏃堕粯璁ゆ煡璇㈠叏閮ㄦ暟鎹 + */ + private String outInvType; + /** + * 璁板綍鐘舵 NOR-姝e父锛孶SE-鍗犵敤锛孌EL-鍒犻櫎 SUC-瀹屾垚銆備负绌烘椂榛樿鏌ヨ鍏ㄩ儴鏁版嵁 + */ + private String lockFlag; + + + private SQLMapper getSQLMapper() { + return MapperProxyFactory.getProxy(SQLMapper.class); + } + + @Override + public void execute() { + User user = new User(); + user.setUid(1); + user.setLoginid("sysadmin"); + + try { + GetDtaRequest requestParam = new GetDtaRequest(); + requestParam.setCurrentPage(1); + requestParam.setPageSize(1000); + + if (StrUtil.isBlank(displayHoldOrganizationCodeList)) { + throw new CBS8RunTimeException("鎸佺エ浜哄崟浣嶇紪鐮佷负绌猴紝璇峰湪璁″垝浠诲姟閰嶇疆姝ら」锛"); + } + requestParam.setDisplayHoldOrganizationCodeList(Arrays.stream(displayHoldOrganizationCodeList.split(",")).collect(Collectors.toList())); + + if (StrUtil.isBlank(holdAccountList)) { + throw new CBS8RunTimeException("鎸佺エ浜鸿处鍙蜂负绌猴紝璇峰湪璁″垝浠诲姟閰嶇疆姝ら」锛"); + } + requestParam.setHoldAccountList(Arrays.stream(holdAccountList.split(",")).collect(Collectors.toList())); + + if (StrUtil.isNotBlank(issueDateStart) && StrUtil.isNotBlank(issueDateEnd)) { + requestParam.setIssueDateStart(issueDateStart); + requestParam.setIssueDateEnd(issueDateEnd); + } else { + String nowDate = LocalDate.now().toString(); + requestParam.setIssueDateStart(nowDate); + requestParam.setIssueDateEnd(nowDate); + } + + //绯荤粺绁ㄦ嵁绫诲瀷 + requestParam.setBillVarietyList(Arrays.stream(Util.null2String(billVarietyList).split(",")).collect(Collectors.toList())); + + requestParam.setDueDateStart(dueDateStart); + requestParam.setDueDateEnd(dueDateEnd); + requestParam.setBillType(billType); + requestParam.setDraftSourceList(draftSourceList==null ? null :Arrays.stream(draftSourceList.split(",")).collect(Collectors.toList())); + requestParam.setHoldBankTypeList(holdBankTypeList==null ? null :Arrays.stream(holdBankTypeList.split(",")).collect(Collectors.toList())); + requestParam.setHoldSignDateStart(holdSignDateStart); + requestParam.setHoldSignDateEnd(holdSignDateEnd); + requestParam.setDraftNbr(draftNbr); + requestParam.setBillNbr(billNbr); + requestParam.setBillAmountStart(billAmountStart); + requestParam.setBillAmountEnd(billAmountEnd); + requestParam.setSubBillIntervalStart(subBillIntervalStart); + requestParam.setSubBillIntervalEnd(subBillIntervalEnd); + requestParam.setBillStsList(billStsList==null ? null :Arrays.stream(billStsList.split(",")).collect(Collectors.toList())); + requestParam.setBillTrsStsList(billTrsStsList==null ? null :Arrays.stream(billTrsStsList.split(",")).collect(Collectors.toList())); + requestParam.setStockFlag(stockFlag); + requestParam.setOutInvType(outInvType); + requestParam.setLockFlag(lockFlag); + + //鏌ヨ鍓1000鏉℃暟鎹 + BillManagementClient bailManagementClient = new BillManagementClient(); + GetDtaResponse response = bailManagementClient.dtaQuery(requestParam); + List list = response.getData().getList(); + + //鍒ゆ柇鏄惁杩樺瓨鍦ㄦ暟鎹紝閫掑綊鏌ヨ + boolean hasNextPage = response.getData().isHasNextPage(); + int nextPage = response.getData().getNextPage(); + while (hasNextPage) { + requestParam.setCurrentPage(nextPage); + GetDtaResponse nextPageResponse = bailManagementClient.dtaQuery(requestParam); + List pageData = nextPageResponse.getData().getList(); + list.addAll(pageData); + hasNextPage = nextPageResponse.getData().isHasNextPage(); + nextPage = nextPageResponse.getData().getNextPage(); + } + + //鍔犺浇cbs閰嶇疆 + XStream xStream = new XStream(); + String resource = GCONST.getRootPath() + "WEB-INF" + File.separatorChar + "CBS2ECConfig.xml"; + File file = new File(resource); + xStream.addPermission(AnyTypePermission.ANY); + xStream.processAnnotations(EBS2ECConfig.class); + EBS2ECConfig dto = (EBS2ECConfig) xStream.fromXML(file); + EBS2ECConfig.Table table = dto.getTables().get(2); + Integer modeId = table.getModeId(); + String tableName = table.getKey(); + + //鑾峰彇宸插瓨鍦ㄧ殑鏁版嵁 + EBS2ECConfig.Table.Field uniqueField = table.getFields().stream().filter(EBS2ECConfig.Table.Field::isUnique).findFirst().orElse(null); + if (uniqueField == null) { + throw new CBS8RunTimeException("鏈缃敮涓鏍囪瘑瀛楁"); + } + String uniqueKey = uniqueField.getKey(); + String uniqueEbsKey = uniqueField.getEbsKey(); + List uniqueDataKeys = getSQLMapper().listString(String.format("select %s from %s", uniqueKey, tableName)); + + + for (GetDtaResponse.Detail detail : list) { + Map detailMap = JsonUtil.parseMap(detail, String.class); + String uniqueData = detailMap.get(uniqueEbsKey); + if (StrUtil.isBlank(uniqueData)) { + log.warn("璺宠繃cbs绁ㄦ嵁姹犳暟鎹紝鍞竴鏍囪瘑杩斿洖绌,uniqueKey:{},uniqueEbsKey:{}", uniqueKey, uniqueEbsKey); + continue; + } + if (uniqueDataKeys.contains(uniqueData)) { + log.warn("璺宠繃cbs绁ㄦ嵁姹犳暟鎹紝鏁版嵁宸插瓨鍦,uniqueKey:{},uniqueEbsKey:{},鍊納}", uniqueKey, uniqueEbsKey, uniqueData); + continue; + } + + List fields = new ArrayList() {{ + add("formmodeid"); + add("modedatacreater"); + add("modedatacreatertype"); + add("modedatacreatedate"); + add("modedatacreatetime"); + }}; + String currDate = TimeUtil.getCurrentDateString(); + SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); + String currTime = sdf.format(new Date()); + List values = new ArrayList() {{ + add(modeId); + add(1); + add(0); + add(String.format("'%s'", currDate)); + add(String.format("'%s'", currTime)); + }}; + + for (EBS2ECConfig.Table.Field field : table.getFields()) { + //鏁版嵁搴撳瓧娈 + String fieldName = field.getKey(); + fields.add(fieldName); + // 鎺ュ彛鍊 + String value = detailMap.getOrDefault(field.getEbsKey(), ""); + values.add(String.format("'%s'", value)); + } + + //涓氬姟閫昏緫瀛楁锛屾敹娆剧被鍨 + fields.add("pjlx"); + //搴斾粯绁ㄦ嵁 + Integer pjlx; + if ("ISS".equals(detail.getBillVariety())) { + pjlx = 2; + } else { + //搴旀敹绁ㄦ嵁 0锛氶摱鎵 1锛氬晢鎵 + pjlx = "AC01".equals(detail.getBillType()) ? 0 : 1; + } + values.add(pjlx); + + + String sql = String.format("insert into %s (%s) values (%s)", tableName, String.join(",", fields), values.stream().map(Object::toString).collect(Collectors.joining(","))); + RecordSet rs = new RecordSet(); + rs.execute(sql); + + if (modeId != null) { + rs.executeQuery("select max(id) from " + tableName); + int mainId = 0; + if (rs.next()) { + mainId = rs.getInt(1); + } + ModeRightInfo ModeRightInfo = new ModeRightInfo(); + ModeRightInfo.setNewRight(true); + ModeRightInfo.editModeDataShare(1, modeId, mainId); + } + } + } catch (Exception e) { + log.error("鑾峰彇CBS绁ㄦ嵁姹犳暟鎹け璐", e); + throw new CBS8RunTimeException("鑾峰彇CBS绁ㄦ嵁姹犳暟鎹け璐," + e.getMessage(), e); + } + } +} diff --git a/src/com/engine/salary/timer/SyncCBSPayDetailsJob.java b/src/com/engine/salary/timer/SyncCBSPayDetailsJob.java new file mode 100644 index 0000000..8756423 --- /dev/null +++ b/src/com/engine/salary/timer/SyncCBSPayDetailsJob.java @@ -0,0 +1,344 @@ +package com.engine.salary.timer; + +import cn.hutool.core.util.StrUtil; +import com.engine.salary.exception.CBS8RunTimeException; +import com.engine.salary.mapper.SQLMapper; +import com.engine.salary.mapper.cbs.UfHkrdzbMapper; +import com.engine.salary.remote.cbs8.client.BillManagementClient; +import com.engine.salary.remote.cbs8.config.EBS2ECConfig; +import com.engine.salary.remote.cbs8.po.UfHkrdzbPO; +import com.engine.salary.remote.cbs8.request.GetDtaRequest; +import com.engine.salary.remote.cbs8.response.GetDtaResponse; +import com.engine.salary.remote.cbs8.JsonUtil; +import com.engine.salary.remote.cbs8.SalaryEntityUtil; +import com.engine.salary.remote.cbs8.util.db.MapperProxyFactory; +import com.thoughtworks.xstream.XStream; +import com.thoughtworks.xstream.security.AnyTypePermission; +import lombok.extern.slf4j.Slf4j; +import weaver.conn.RecordSet; +import weaver.formmode.setup.ModeRightInfo; +import weaver.general.GCONST; +import weaver.general.TimeUtil; +import weaver.hrm.User; +import weaver.interfaces.schedule.BaseCronJob; + +import java.io.File; +import java.math.BigDecimal; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 鑾峰彇绁ㄦ嵁鏀舵鏄庣粏 + *

Copyright: Copyright (c) 2024

+ *

Company: 娉涘井杞欢

+ * + * @author qiantao + * @version 1.0 + **/ +@Slf4j +public class SyncCBSPayDetailsJob extends BaseCronJob { + + + /** + * 鎸佺エ浜哄崟浣嶇紪鐮 澶氶夈傚~鍦╟bs绯荤粺鍏叡璁剧疆>鍩虹淇℃伅>缁勭粐鏈烘瀯缁存姢鐨勫崟浣嶇紪鐮 + */ + private String displayHoldOrganizationCodeList; + /** + * 鎸佺エ浜鸿处鍙 澶氶夈 + */ + private String holdAccountList; + + /** + * 绯荤粺绁ㄦ嵁绫诲瀷 澶氶夈傛寜闄勫綍4.1.3绁ㄦ嵁绫诲瀷-绁ㄦ嵁鐘舵-娴侀氭爣蹇楃骇鑱斿叧绯昏〃閫夋嫨鍚庢寜椤哄簭濉啓銆傜郴缁熺エ鎹被鍨嬫灇涓捐闄勫綍4.1.3銆傜エ鎹姸鎬佹灇涓捐闄勫綍4.1.4銆傛祦閫氭爣蹇楁灇涓捐闄勫綍4.1.5銆 + */ + private String billVarietyList; + + /** + * 鍑虹エ鏃ユ湡璧 鏍煎紡涓簓yyy-mm-dd锛屽嚭绁ㄦ棩鏈熻捣姝笉鍏佽涓杈规湁鍊间竴杈规棤鍊硷紝鏃ユ湡闂撮殧鏈澶т负涓骞 + */ + private String issueDateStart; + + /** + * 鍑虹エ鏃ユ湡姝 鏍煎紡涓簓yyy-mm-dd锛屽嚭绁ㄦ棩鏈熻捣姝笉鍏佽涓杈规湁鍊间竴杈规棤鍊硷紝鏃ユ湡闂撮殧鏈澶т负涓骞 + */ + private String issueDateEnd; + + + /** + * 鍒版湡鏃ユ湡璧 鏍煎紡涓簓yyy-mm-dd锛屽埌鏈熸棩鏈熻捣姝笉鍏佽涓杈规湁鍊间竴杈规棤鍊硷紝鏃ユ湡闂撮殧鏈澶т负涓骞 + */ + private String dueDateStart; + /** + * 鍒版湡鏃ユ湡姝 鏍煎紡涓簓yyy-mm-dd锛屽埌鏈熸棩鏈熻捣姝笉鍏佽涓杈规湁鍊间竴杈规棤鍊硷紝鏃ユ湡闂撮殧鏈澶т负涓骞 + */ + private String dueDateEnd; + /** + * 绁ㄦ嵁绉嶇被 AC01-閾舵壙锛孉C02-鍟嗘壙 + */ + private String billType; + /** + * 绁ㄦ嵁鏉ユ簮 澶氶夈1-鐩磋仈浜ゆ槗锛2-鍙拌处浜ゆ槗锛3-鍙拌处鐧昏锛4-鎸戠エ鍚屾锛5-浠诲姟鍚屾 + */ + private String draftSourceList; + /** + * 鎸佺エ閾惰绫诲瀷 澶氶夈傝闄勫綍4.1.1.閾惰绫诲瀷鏋氫妇 + */ + private String holdBankTypeList; + + /** + * 鎸佺エ绛炬敹鏃ユ湡璧 鏍煎紡涓簓yyy-mm-dd锛屾寔绁ㄧ鏀舵棩鏈熻捣姝笉鍏佽涓杈规湁鍊间竴杈规棤鍊硷紝鏃ユ湡闂撮殧鏈澶т负涓骞 + */ + private String holdSignDateStart; + /** + * 鎸佺エ绛炬敹鏃ユ湡姝 鏍煎紡涓簓yyy-mm-dd锛屾寔绁ㄧ鏀舵棩鏈熻捣姝笉鍏佽涓杈规湁鍊间竴杈规棤鍊硷紝鏃ユ湡闂撮殧鏈澶т负涓骞 + */ + private String holdSignDateEnd; + /** + * 绯荤粺绁ㄦ嵁缂栧彿 + */ + private String draftNbr; + /** + * 绁ㄦ嵁(鍖)鍙 + */ + private String billNbr; + + /** + * 绁ㄦ嵁閲戦璧 澶т簬绛変簬0,鏈澶氫负涓や綅灏忔暟涓旀暣鏁颁綅涓婇檺涓13浣嶃傜エ鎹噾棰濊捣姝笉鍏佽涓杈规湁鍊间竴杈规棤鍊笺傚崟浣嶏紙鍏冿級 + */ + private BigDecimal billAmountStart; + + /** + * 绁ㄦ嵁閲戦姝 澶т簬绛変簬0,鏈澶氫负涓や綅灏忔暟涓旀暣鏁颁綅涓婇檺涓13浣嶃傜エ鎹噾棰濊捣姝笉鍏佽涓杈规湁鍊间竴杈规棤鍊笺傚崟浣嶏紙鍏冿級 + */ + private BigDecimal billAmountEnd; + + /** + * 瀛愮エ鍖洪棿璧 瀛愮エ鍖洪棿璧锋涓嶅厑璁镐竴杈规湁鍊间竴杈规棤鍊硷紝鏈澶12浣 + */ + private String subBillIntervalStart; + /** + * 瀛愮エ鍖洪棿姝 瀛愮エ鍖洪棿璧锋涓嶅厑璁镐竴杈规湁鍊间竴杈规棤鍊,鏈澶12浣 + */ + private String subBillIntervalEnd; + + /** + * 绁ㄦ嵁鐘舵 + */ + private String billStsList; + /** + * 娴侀氭爣蹇 + */ + private String billTrsStsList; + /** + * 搴撳瓨鐘舵 1-宸插叆搴擄紝2-宸插嚭搴撱 涓虹┖鏃堕粯璁ゆ煡璇㈠叏閮ㄦ暟鎹 + */ + private String stockFlag; + /** + * 鍑哄簱鏂瑰紡 0-绌猴紝2-鑳屼功锛3-璐ㄦ娂锛4-瑙h川锛5-璐寸幇锛6-鍒嗗寘锛7-缁撴竻, 8-浣滃簾銆 涓虹┖鏃堕粯璁ゆ煡璇㈠叏閮ㄦ暟鎹 + */ + private String outInvType; + /** + * 璁板綍鐘舵 NOR-姝e父锛孶SE-鍗犵敤锛孌EL-鍒犻櫎 SUC-瀹屾垚銆備负绌烘椂榛樿鏌ヨ鍏ㄩ儴鏁版嵁 + */ + private String lockFlag; + + private SQLMapper getSQLMapper() { + return MapperProxyFactory.getProxy(SQLMapper.class); + } + + private UfHkrdzbMapper getUfHkrdzbMapper() { + return MapperProxyFactory.getProxy(UfHkrdzbMapper.class); + } + + @Override + public void execute() { + User user = new User(); + user.setUid(1); + user.setLoginid("sysadmin"); + + try { + GetDtaRequest requestParam = new GetDtaRequest(); + requestParam.setCurrentPage(1); + requestParam.setPageSize(1000); + + if (StrUtil.isBlank(displayHoldOrganizationCodeList)) { + throw new CBS8RunTimeException("鎸佺エ浜哄崟浣嶇紪鐮佷负绌猴紝璇峰湪璁″垝浠诲姟閰嶇疆姝ら」锛"); + } + requestParam.setDisplayHoldOrganizationCodeList(Arrays.stream(displayHoldOrganizationCodeList.split(",")).collect(Collectors.toList())); + + if (StrUtil.isBlank(holdAccountList)) { + throw new CBS8RunTimeException("鎸佺エ浜鸿处鍙蜂负绌猴紝璇峰湪璁″垝浠诲姟閰嶇疆姝ら」锛"); + } + requestParam.setHoldAccountList(Arrays.stream(holdAccountList.split(",")).collect(Collectors.toList())); + + if (StrUtil.isNotBlank(issueDateStart) && StrUtil.isNotBlank(issueDateEnd)) { + requestParam.setIssueDateStart(issueDateStart); + requestParam.setIssueDateEnd(issueDateEnd); + } else { + String nowDate = LocalDate.now().toString(); + requestParam.setIssueDateStart(nowDate); + requestParam.setIssueDateEnd(nowDate); + } + + //绯荤粺绁ㄦ嵁绫诲瀷 + requestParam.setBillVarietyList(Arrays.stream(billVarietyList.split(",")).collect(Collectors.toList())); + + requestParam.setDueDateStart(dueDateStart); + requestParam.setDueDateEnd(dueDateEnd); + requestParam.setBillType(billType); + requestParam.setDraftSourceList(draftSourceList==null ? null :Arrays.stream(draftSourceList.split(",")).collect(Collectors.toList())); + requestParam.setHoldBankTypeList(holdBankTypeList==null ? null :Arrays.stream(holdBankTypeList.split(",")).collect(Collectors.toList())); + requestParam.setHoldSignDateStart(holdSignDateStart); + requestParam.setHoldSignDateEnd(holdSignDateEnd); + requestParam.setDraftNbr(draftNbr); + requestParam.setBillNbr(billNbr); + requestParam.setBillAmountStart(billAmountStart); + requestParam.setBillAmountEnd(billAmountEnd); + requestParam.setSubBillIntervalStart(subBillIntervalStart); + requestParam.setSubBillIntervalEnd(subBillIntervalEnd); + requestParam.setBillStsList(billStsList==null ? null :Arrays.stream(billStsList.split(",")).collect(Collectors.toList())); + requestParam.setBillTrsStsList(billTrsStsList==null ? null :Arrays.stream(billTrsStsList.split(",")).collect(Collectors.toList())); + requestParam.setStockFlag(stockFlag); + requestParam.setOutInvType(outInvType); + requestParam.setLockFlag(lockFlag); + + //鏌ヨ鍓1000鏉℃暟鎹 + BillManagementClient bailManagementClient = new BillManagementClient(); + GetDtaResponse response = bailManagementClient.dtaQuery(requestParam); + List list = response.getData().getList(); + + //鍒ゆ柇鏄惁杩樺瓨鍦ㄦ暟鎹紝閫掑綊鏌ヨ + boolean hasNextPage = response.getData().isHasNextPage(); + int nextPage = response.getData().getNextPage(); + while (hasNextPage) { + requestParam.setCurrentPage(nextPage); + GetDtaResponse nextPageResponse = bailManagementClient.dtaQuery(requestParam); + List pageData = nextPageResponse.getData().getList(); + list.addAll(pageData); + hasNextPage = nextPageResponse.getData().isHasNextPage(); + nextPage = nextPageResponse.getData().getNextPage(); + } + + //鍔犺浇cbs閰嶇疆 + XStream xStream = new XStream(); + String resource = GCONST.getRootPath() + "WEB-INF" + File.separatorChar + "CBS2ECConfig.xml"; + File file = new File(resource); + xStream.addPermission(AnyTypePermission.ANY); + xStream.processAnnotations(EBS2ECConfig.class); + EBS2ECConfig dto = (EBS2ECConfig) xStream.fromXML(file); + EBS2ECConfig.Table table = dto.getTables().get(1); + Integer modeId = table.getModeId(); + String tableName = table.getKey(); + + //鑾峰彇宸插瓨鍦ㄧ殑鏁版嵁 + EBS2ECConfig.Table.Field uniqueField = table.getFields().stream().filter(EBS2ECConfig.Table.Field::isUnique).findFirst().orElse(null); + if (uniqueField == null) { + throw new CBS8RunTimeException("鏈缃敮涓鏍囪瘑瀛楁"); + } + String uniqueKey = uniqueField.getKey(); + String uniqueEbsKey = uniqueField.getEbsKey(); + List uniqueDataKeys = getSQLMapper().listString(String.format("select %s from %s", uniqueKey, tableName)); + + //鑾峰彇姹囨浜轰笌鍔炰簨澶勭殑瀵圭収鏁版嵁 + List ufHkrdzbPOS = getUfHkrdzbMapper().listAll(); + Map customerDepartmentMap = SalaryEntityUtil.convert2Map(ufHkrdzbPOS, UfHkrdzbPO::getKhmc, UfHkrdzbPO::getDepartmentId); + + + for (GetDtaResponse.Detail detail : list) { + Map detailMap = JsonUtil.parseMap(detail, String.class); + String uniqueData = detailMap.get(uniqueEbsKey); + if (StrUtil.isBlank(uniqueData)) { + log.warn("璺宠繃cbs绁ㄦ嵁鏀舵鏁版嵁锛屽敮涓鏍囪瘑杩斿洖绌,uniqueKey:{},uniqueEbsKey:{}", uniqueKey, uniqueEbsKey); + continue; + } + if (uniqueDataKeys.contains(uniqueData)) { + log.warn("璺宠繃cbs绁ㄦ嵁鏀舵鏁版嵁锛屾暟鎹凡瀛樺湪,uniqueKey:{},uniqueEbsKey:{},鍊納}", uniqueKey, uniqueEbsKey, uniqueData); + continue; + } + + List fields = new ArrayList() {{ + add("formmodeid"); + add("modedatacreater"); + add("modedatacreatertype"); + add("modedatacreatedate"); + add("modedatacreatetime"); + }}; + String currDate = TimeUtil.getCurrentDateString(); + SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); + String currTime = sdf.format(new Date()); + List values = new ArrayList() {{ + add(modeId); + add(1); + add(0); + add(String.format("'%s'", currDate)); + add(String.format("'%s'", currTime)); + }}; + + String hkr = ""; + for (EBS2ECConfig.Table.Field field : table.getFields()) { + //鏁版嵁搴撳瓧娈 + String fieldName = field.getKey(); + fields.add(fieldName); + // 鎺ュ彛鍊 + String value = detailMap.getOrDefault(field.getEbsKey(), ""); + values.add(String.format("'%s'", value)); + + //姹囨浜 + if ("hkr".equals(fieldName)) { + hkr = value; + } + } + + //涓氬姟閫昏緫瀛楁锛屾敹娆剧被鍨 + fields.add("sklx"); + //搴旀敹绁ㄦ嵁 0锛氶摱鎵 1锛氬晢鎵 + values. add("AC01".equals(detail.getBillType()) ? 0 : 1); + + /* + * 璁ら閫昏緫锛 + * 鏍规嵁姹囨浜哄幓琛ㄩ噷鍖归厤銆愭眹娆句汉涓庡姙浜嬪鐨勫鐓ц〃銆 + * 濡傛灉鑳藉尮閰嶅埌鏁版嵁锛屽垯鐘舵佹敼涓哄凡鑷姩璁ら锛屽悓鏃舵妸鍔炰簨澶勶紙閮ㄩ棬锛夌殑鍊煎悓姝ュ埌鍔炰簨澶勫瓧娈典腑锛屾槸鍚︾郴缁熻嚜鍔ㄨ棰嗗悓姝ヤ负鏄紱 + * 濡傚鐓ф爣鍑嗘棤鏁版嵁锛屽垯鐘舵佷负锛氭湭璁ら锛 + */ + Integer departmentId = customerDepartmentMap.get(hkr); + if(departmentId!=null){ + //璁ら + fields.add("zt"); + values.add(1); + + //鏄惁绯荤粺璁ら + fields.add("sfxtzdrl"); + values.add(1); + + //鍔炰簨澶 + fields.add("szbm"); + values.add(departmentId); + }else { + //鏈棰 + fields.add("zt"); + values.add(0); + } + + String sql = String.format("insert into %s (%s) values (%s)", tableName, String.join(",", fields), values.stream().map(Object::toString).collect(Collectors.joining(","))); + RecordSet rs = new RecordSet(); + rs.execute(sql); + + if (modeId != null) { + rs.executeQuery("select max(id) from " + tableName); + int mainId = 0; + if (rs.next()) { + mainId = rs.getInt(1); + } + ModeRightInfo ModeRightInfo = new ModeRightInfo(); + ModeRightInfo.setNewRight(true); + ModeRightInfo.editModeDataShare(1, modeId, mainId); + } + } + } catch (Exception e) { + log.error("鑾峰彇CBS绁ㄦ嵁鏀舵鏁版嵁澶辫触", e); + throw new CBS8RunTimeException("鑾峰彇CBS绁ㄦ嵁鏀舵鏁版嵁淇℃伅澶辫触," + e.getMessage(), e); + } + } +}