|
@@ -3,11 +3,9 @@ package com.malk.lilin.Service.impl;
|
|
|
|
|
|
import cn.hutool.crypto.SecureUtil;
|
|
|
|
|
|
-import com.alibaba.excel.util.StringUtils;
|
|
|
import com.alibaba.fastjson.JSON;
|
|
|
import com.alibaba.fastjson.JSONArray;
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
|
-import com.alibaba.fastjson.TypeReference;
|
|
|
import com.malk.lilin.Service.LiLinService;
|
|
|
import com.malk.server.aliwork.YDConf;
|
|
|
import com.malk.server.aliwork.YDParam;
|
|
@@ -32,8 +30,8 @@ import java.time.LocalDateTime;
|
|
|
import java.time.ZoneId;
|
|
|
import java.time.format.DateTimeFormatter;
|
|
|
import java.util.*;
|
|
|
-import java.util.concurrent.atomic.AtomicReference;
|
|
|
import java.util.concurrent.atomic.DoubleAdder;
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
@Slf4j
|
|
|
@Service
|
|
@@ -53,7 +51,7 @@ public class LiLinServiceImpl implements LiLinService {
|
|
|
@Override
|
|
|
public McR lilinUpsert(List<String> rqqj, String bdbh) {
|
|
|
List<Map> list = (List<Map>) ydClient.queryData(YDParam.builder()
|
|
|
- .formUuid("FORM-B4B6126350C041EAAF4F04AECF6A3F0C95NV")
|
|
|
+ .formUuid("FORM-5F8B2B6418E14EF0967CC60DA25A7558K5L7")
|
|
|
.searchFieldJson(JSONObject.toJSONString(Arrays.asList(
|
|
|
new YDSearch("createTime", rqqj, "DateField", YDSearch.Type.DATE_FIELD, YDSearch.Operator.BETWEEN),
|
|
|
new YDSearch("textField_m9cdsn32", bdbh, "TextField", YDSearch.Type.TEXT_FIELD, YDSearch.Operator.EQ))))
|
|
@@ -157,7 +155,7 @@ public class LiLinServiceImpl implements LiLinService {
|
|
|
// 查询项目主表单
|
|
|
List<Map> xmdata = (List<Map>) ydClient.queryData(
|
|
|
YDParam.builder()
|
|
|
- .formUuid("FORM-198963B3B465493D859E56557A4E346FPA15")
|
|
|
+ .formUuid("FORM-FFA52F0206684931A0F18C00C2C937EAAVI5")
|
|
|
.searchFieldJson(JSONObject.toJSONString(UtilMap.map("textField_m9awsc29", xmbh)))
|
|
|
.build(),
|
|
|
YDConf.FORM_QUERY.retrieve_list_all
|
|
@@ -215,7 +213,7 @@ public class LiLinServiceImpl implements LiLinService {
|
|
|
}
|
|
|
for (String ddbh : orderToProjectMap.keySet()) {
|
|
|
List<Map> data = (List<Map>) ydClient.queryData(YDParam.builder()
|
|
|
- .formUuid("FORM-BDA88E0932564B64B1619AC05290A012L16E")
|
|
|
+ .formUuid("FORM-C9BC8F7A159E4281B707ADBE1628EB7FDACQ")
|
|
|
.searchFieldJson(JSONObject.toJSONString(UtilMap.map("textField_m9cdcten", ddbh)))
|
|
|
.build(), YDConf.FORM_QUERY.retrieve_list_all).getData();
|
|
|
|
|
@@ -319,7 +317,7 @@ public class LiLinServiceImpl implements LiLinService {
|
|
|
if (!details2.isEmpty()) {
|
|
|
ydClient.operateData(YDParam.builder()
|
|
|
.formInstanceIdList(details2)
|
|
|
- .formUuid("FORM-B4B6126350C041EAAF4F04AECF6A3F0C95NV")
|
|
|
+ .formUuid("FORM-5F8B2B6418E14EF0967CC60DA25A7558K5L7")
|
|
|
.updateFormDataJson(JSONObject.toJSONString(UtilMap.map("textField_md6z2k32", "已同步")))
|
|
|
.useLatestVersion(true)
|
|
|
.build(), YDConf.FORM_OPERATION.multi_update);
|
|
@@ -551,9 +549,9 @@ public class LiLinServiceImpl implements LiLinService {
|
|
|
String name = String.valueOf(map.get("name"));
|
|
|
OkHttpClient client = new OkHttpClient();
|
|
|
Request request = new Request.Builder()
|
|
|
- .url("https://openapi.xencio.com/sandbox/cfa/api/bank/searchBranch?securityCode=" + token().getData() + "&queryType=full&name=" + name)
|
|
|
+ .url("https://x.xencio.com/c4c3/api/bank/searchBranch?securityCode=" + token().getData() + "&queryType=full&name=" + name)
|
|
|
.get()
|
|
|
- .addHeader("x-xencio-client-id", "4d9414e89bc24b0d89b678d9f20bc56a")
|
|
|
+ .addHeader("x-xencio-client-id", "7dc3a31209b94a91ba40a44358fe70eb")
|
|
|
.addHeader("content-type", "application/x-www-form-urlencoded")
|
|
|
.build();
|
|
|
Response response = client.newCall(request).execute();
|
|
@@ -661,9 +659,9 @@ public class LiLinServiceImpl implements LiLinService {
|
|
|
// 公共参数
|
|
|
String securityCode = String.valueOf(token().getData());
|
|
|
Map<String, String> headers = new HashMap<>();
|
|
|
- headers.put("x-xencio-client-id", "4d9414e89bc24b0d89b678d9f20bc56a");
|
|
|
- headers.put("Content-Type", "application/x-www-form-urlencoded");
|
|
|
- String url = "https://openapi.xencio.com/sandbox/cfa/api/payment/transfer";
|
|
|
+ headers.put("x-xencio-client-id", "7dc3a31209b94a91ba40a44358fe70eb");
|
|
|
+ headers.put("content-Type", "application/x-www-form-urlencoded");
|
|
|
+ String url = "https://x.xencio.com/c4c3/api/payment/transfer";
|
|
|
|
|
|
// 判断是否为物流付款单
|
|
|
if ("物流付款单".equals(fklx)) {
|
|
@@ -694,6 +692,7 @@ public class LiLinServiceImpl implements LiLinService {
|
|
|
mapAll.put("toAccountCode", toAccountCode);
|
|
|
mapAll.put("toAccountName", toAccountName);
|
|
|
mapAll.put("payAmount", payAmount);
|
|
|
+ mapAll.put("source", "OA");
|
|
|
mapAll.put("note", note);
|
|
|
mapAll.put("toBank", toBank);
|
|
|
mapAll.put("securityCode", securityCode);
|
|
@@ -723,6 +722,7 @@ public class LiLinServiceImpl implements LiLinService {
|
|
|
mapAll.put("toAccountCode", toAccountCode);
|
|
|
mapAll.put("toAccountName", toAccountName);
|
|
|
mapAll.put("payAmount", payAmount);
|
|
|
+ mapAll.put("source", "OA");
|
|
|
mapAll.put("note", note);
|
|
|
mapAll.put("toBank", toBank);
|
|
|
mapAll.put("securityCode", securityCode);
|
|
@@ -741,7 +741,7 @@ public class LiLinServiceImpl implements LiLinService {
|
|
|
public McR lilinJG(Map<String, Object> map) throws IOException {
|
|
|
// 1. 查询所有需要处理的单据(状态为“已审批待付款”或“已审批部分付款”)
|
|
|
List<Map> list = (List<Map>) ydClient.queryData(YDParam.builder()
|
|
|
- .formUuid("FORM-1A612AA91BAC467CB9823B6CB92491152WZH")
|
|
|
+ .formUuid("FORM-754586D31BF6414586E5C20DB3774A7320CV")
|
|
|
.searchFieldJson(JSONObject.toJSONString(Arrays.asList(
|
|
|
new YDSearch("selectField_ma0w9yrb",
|
|
|
Arrays.asList("已审批待付款", "已审批部分付款"),
|
|
@@ -749,7 +749,7 @@ public class LiLinServiceImpl implements LiLinService {
|
|
|
YDSearch.Type.RADIO_FIELD,
|
|
|
YDSearch.Operator.CONTAINS)
|
|
|
)))
|
|
|
- .build(), YDConf.FORM_QUERY.retrieve_list_all).getData();
|
|
|
+ .build(), YDConf.FORM_QUERY.retrieve_list_all).getData();
|
|
|
|
|
|
if (list == null || list.isEmpty()) {
|
|
|
log.info("没有找到需要处理的单据");
|
|
@@ -759,12 +759,12 @@ public class LiLinServiceImpl implements LiLinService {
|
|
|
log.info("共查询到 {} 条待处理单据", list.size());
|
|
|
|
|
|
// 公共参数提前准备(安全码、URL、请求头等)
|
|
|
- String url = "https://openapi.xencio.com/sandbox/cfa/api/payment/transferStatus";
|
|
|
+ String url = "https://x.xencio.com/c4c3/api/payment/transferStatus";
|
|
|
String securityCode = String.valueOf(token().getData());
|
|
|
|
|
|
Map<String, String> headers = new HashMap<>();
|
|
|
- headers.put("x-xencio-client-id", "4d9414e89bc24b0d89b678d9f20bc56a");
|
|
|
- headers.put("Content-Type", "application/x-www-form-urlencoded");
|
|
|
+ headers.put("x-xencio-client-id", "7dc3a31209b94a91ba40a44358fe70eb");
|
|
|
+ headers.put("content-Type", "application/x-www-form-urlencoded");
|
|
|
|
|
|
Map<String, Object> params = new HashMap<>();
|
|
|
params.put("securityCode", securityCode);
|
|
@@ -919,18 +919,12 @@ public class LiLinServiceImpl implements LiLinService {
|
|
|
|
|
|
@Override
|
|
|
public McR lilinLS(Map<String, Object> map) {
|
|
|
-// String accountNo = String.valueOf(map.get("accountNo"));
|
|
|
- String accountNo = "888001";
|
|
|
- if (accountNo == null || accountNo.trim().isEmpty()) {
|
|
|
- return McR.errorParam("accountNo 不能为空");
|
|
|
- }
|
|
|
- accountNo = accountNo.trim();
|
|
|
-
|
|
|
- log.info("开始对账单同步,accountNo: {}", accountNo);
|
|
|
-
|
|
|
- // 准备时间范围
|
|
|
- String dayFromId = LocalDate.now().minusDays(10).format(DateTimeFormatter.ofPattern("yyyyMMdd"));
|
|
|
- String dayToId = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
|
|
|
+ List<String> khdaList = Arrays.asList(
|
|
|
+ "1001260509024819590",
|
|
|
+ "1001260509424880696",
|
|
|
+ "1001260509324868573",
|
|
|
+ "1001260509324808614"
|
|
|
+ );
|
|
|
|
|
|
// 获取 token 一次
|
|
|
String securityCode;
|
|
@@ -945,110 +939,157 @@ public class LiLinServiceImpl implements LiLinService {
|
|
|
return McR.errorParam("认证信息获取失败");
|
|
|
}
|
|
|
|
|
|
- // 构建 POST 请求体
|
|
|
- MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");
|
|
|
- String requestBodyStr = "securityCode=" + securityCode +
|
|
|
- "&accountNo=" + accountNo +
|
|
|
- "&dayFromId=" + dayFromId +
|
|
|
- "&dayToId=" + dayToId +
|
|
|
- "&instructionIdFlag=1" +
|
|
|
- "&pageNow=1" +
|
|
|
- "&trxFlag=R" +
|
|
|
- "&pageSize=20";
|
|
|
-
|
|
|
- RequestBody body = RequestBody.create(mediaType, requestBodyStr);
|
|
|
-
|
|
|
- Request request = new Request.Builder()
|
|
|
- .url("https://openapi.xencio.com/sandbox/cfa/api/bs/list")
|
|
|
- .post(body)
|
|
|
- .addHeader("x-xencio-client-id", "4d9414e89bc24b0d89b678d9f20bc56a")
|
|
|
- .addHeader("content-Type", "application/x-www-form-urlencoded")
|
|
|
- .build();
|
|
|
-
|
|
|
OkHttpClient client = new OkHttpClient();
|
|
|
|
|
|
- Response response = null;
|
|
|
- try {
|
|
|
- response = client.newCall(request).execute();
|
|
|
- if (!response.isSuccessful()) {
|
|
|
- log.error("银行接口调用失败,HTTP状态码: {}", response.code());
|
|
|
- return McR.errorParam("接口调用失败: " + response.code());
|
|
|
- }
|
|
|
+ for (String accountNo : khdaList) {
|
|
|
+ Response response = null;
|
|
|
+ try {
|
|
|
+ if (accountNo == null || accountNo.trim().isEmpty()) {
|
|
|
+ log.warn("跳过空 accountNo");
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ accountNo = accountNo.trim();
|
|
|
+
|
|
|
+ log.info("开始对账单同步,accountNo: {}", accountNo);
|
|
|
+
|
|
|
+ // 准备时间范围
|
|
|
+ String dayFromId = LocalDate.now().minusDays(7).format(DateTimeFormatter.ofPattern("yyyyMMdd"));
|
|
|
+ String dayToId = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
|
|
|
+
|
|
|
+ // 构建 POST 请求体
|
|
|
+ MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");
|
|
|
+ String requestBodyStr = "securityCode=" + securityCode +
|
|
|
+ "&accountNo=" + accountNo +
|
|
|
+ "&dayFromId=" + dayFromId +
|
|
|
+ "&dayToId=" + dayToId +
|
|
|
+ "&instructionIdFlag=1" +
|
|
|
+ "&pageNow=1" +
|
|
|
+ "&trxFlag=R" +
|
|
|
+ "&pageSize=20";
|
|
|
+
|
|
|
+ RequestBody body = RequestBody.create(mediaType, requestBodyStr);
|
|
|
+
|
|
|
+ Request request = new Request.Builder()
|
|
|
+ .url("https://x.xencio.com/c4c3/api/bs/list")
|
|
|
+ .post(body)
|
|
|
+ .addHeader("x-xencio-client-id", "7dc3a31209b94a91ba40a44358fe70eb")
|
|
|
+ .addHeader("content-Type", "application/x-www-form-urlencoded")
|
|
|
+ .build();
|
|
|
+
|
|
|
+ response = client.newCall(request).execute();
|
|
|
+
|
|
|
+ if (!response.isSuccessful()) {
|
|
|
+ log.error("银行接口调用失败,HTTP状态码: {}", response.code());
|
|
|
+ continue; // 跳过当前账号
|
|
|
+ }
|
|
|
|
|
|
- String jsonStr = response.body().string();
|
|
|
- log.debug("银行接口响应原始数据: {}", jsonStr);
|
|
|
+ String jsonStr = response.body().string();
|
|
|
+ log.debug("银行接口响应原始数据: {}", jsonStr);
|
|
|
|
|
|
- JSONObject jsonObject = JSON.parseObject(jsonStr);
|
|
|
- JSONObject data = jsonObject.getJSONObject("data");
|
|
|
- if (data == null) {
|
|
|
- log.error("响应中缺少 'data' 字段");
|
|
|
- return McR.errorParam("响应数据格式错误:缺少 data");
|
|
|
- }
|
|
|
+ JSONObject jsonObject = JSON.parseObject(jsonStr);
|
|
|
+ JSONObject data = jsonObject.getJSONObject("data");
|
|
|
+ if (data == null) {
|
|
|
+ log.error("响应中缺少 'data' 字段, accountNo: {}", accountNo);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
|
|
|
- JSONArray statementList = data.getJSONArray("searchBankStatementList");
|
|
|
- if (statementList == null || statementList.isEmpty()) {
|
|
|
- log.info("银行接口返回空列表,accountNo: {}", accountNo);
|
|
|
- return McR.success("无对账单数据");
|
|
|
- }
|
|
|
+ JSONArray statementList = data.getJSONArray("searchBankStatementList");
|
|
|
+ if (statementList == null || statementList.isEmpty()) {
|
|
|
+ log.info("银行接口返回空列表,accountNo: {}", accountNo);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ List<Map<String, String>> extractedList = new ArrayList<>();
|
|
|
+
|
|
|
+ for (int i = 0; i < statementList.size(); i++) {
|
|
|
+ JSONObject item = statementList.getJSONObject(i);
|
|
|
+ if (item == null) continue;
|
|
|
+
|
|
|
+ Map<String, String> extractedItem = new HashMap<>();
|
|
|
+ String bankStatementId = getStringValue(item, "bankStatementId");
|
|
|
+ String bankComments = getStringValue(item, "bankComments");
|
|
|
+ String crAmount = getStringValue(item, "crAmount");
|
|
|
+ String trxDate = getStringValue(item, "trxDate");
|
|
|
+ String accountName = getStringValue(item, "accountName"); // 本方账号名称
|
|
|
+ String userRemarks = getStringValue(item, "userRemarks");
|
|
|
+ String userMemo = getStringValue(item, "userMemo");
|
|
|
+ String transFlag = getStringValue(item, "transFlag");
|
|
|
+ String catalogName = getStringValue(item, "catalogName");
|
|
|
+ String customerName = getStringValue(item, "customerName"); // 对手方账户名称
|
|
|
+
|
|
|
+ Long timestamp = null;
|
|
|
+ if (trxDate != null && !trxDate.isEmpty()) {
|
|
|
+ try {
|
|
|
+ timestamp = LocalDateTime.parse(trxDate, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))
|
|
|
+ .atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.warn("日期解析失败: {}", trxDate);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- List<Map<String, String>> extractedList = new ArrayList<>();
|
|
|
-
|
|
|
- for (int i = 0; i < statementList.size(); i++) {
|
|
|
- JSONObject item = statementList.getJSONObject(i);
|
|
|
- if (item == null) continue;
|
|
|
-
|
|
|
- Map<String, String> extractedItem = new HashMap<>();
|
|
|
- String bankStatementId = getStringValue(item, "bankStatementId");
|
|
|
- String bankComments = getStringValue(item, "bankComments");
|
|
|
- String crAmount = getStringValue(item, "crAmount");
|
|
|
- String trxDate = getStringValue(item, "trxDate");
|
|
|
- String userRemarks = getStringValue(item, "userRemarks");
|
|
|
- String userMemo = getStringValue(item, "userMemo");
|
|
|
- String transFlag = getStringValue(item, "transFlag");
|
|
|
- String catalogName = getStringValue(item, "catalogName");
|
|
|
- String customerName = getStringValue(item, "customerName");
|
|
|
-
|
|
|
- // 提取时间戳
|
|
|
- Long timestamp = null;
|
|
|
- if (trxDate != null && !trxDate.isEmpty()) {
|
|
|
+ extractedItem.put("bankStatementId", bankStatementId);
|
|
|
+ extractedItem.put("bankComments", bankComments);
|
|
|
+ extractedItem.put("crAmount", crAmount);
|
|
|
+ extractedItem.put("accountName", accountName);
|
|
|
+ extractedItem.put("trxDate", trxDate);
|
|
|
+ extractedItem.put("userRemarks", userRemarks);
|
|
|
+ extractedItem.put("customerName", customerName);
|
|
|
+ extractedList.add(extractedItem);
|
|
|
+
|
|
|
+ // 检查是否已存在该对账单记录
|
|
|
+ boolean exists = false;
|
|
|
try {
|
|
|
- timestamp = LocalDateTime.parse(trxDate, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))
|
|
|
- .atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
|
|
|
+ List<Map> list = (List<Map>) ydClient.queryData(
|
|
|
+ YDParam.builder()
|
|
|
+ .formUuid("FORM-AF6E9FBF8F7642D59A333BC9EF3DF3FB836A")
|
|
|
+ .appType("APP_RPH7R3LF3SMXLRDY1ZJW")
|
|
|
+ .systemToken("7M866K91D4LVACB4EADAZ5UJG7IN3OGA33WAMNT")
|
|
|
+ .searchCondition(JSON.toJSONString(UtilMap.map("textField_mdh05xw6", bankStatementId)))
|
|
|
+ .build(),
|
|
|
+ YDConf.FORM_QUERY.retrieve_list_all
|
|
|
+ ).getData();
|
|
|
+
|
|
|
+ exists = list != null && !list.isEmpty();
|
|
|
} catch (Exception e) {
|
|
|
- log.warn("日期解析失败: {}", trxDate);
|
|
|
+ log.error("查询宜搭系统失败,bankStatementId: {}", bankStatementId, e);
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
- // 填充提取数据
|
|
|
- extractedItem.put("bankStatementId", bankStatementId);
|
|
|
- extractedItem.put("bankComments", bankComments);
|
|
|
- extractedItem.put("crAmount", crAmount);
|
|
|
- extractedItem.put("trxDate", trxDate);
|
|
|
- extractedItem.put("userRemarks", userRemarks);
|
|
|
- extractedItem.put("customerName", customerName);
|
|
|
- extractedList.add(extractedItem);
|
|
|
-
|
|
|
- // ===== 查询是否已存在 =====
|
|
|
- boolean exists = false;
|
|
|
- try {
|
|
|
- List<Map> list = (List<Map>) ydClient.queryData(
|
|
|
- YDParam.builder()
|
|
|
- .formUuid("FORM-AC0D84A40AD64E469C6AC6D049931C22IDO8")
|
|
|
- .appType("APP_V25MK3XKODKB02UVTGSH")
|
|
|
- .systemToken("IQC66GC1L5TW5HKF6SX645RC4AXG2CFGQOMCMOQ4")
|
|
|
- .searchCondition(JSON.toJSONString(UtilMap.map("textField_mdh05xw6", bankStatementId)))
|
|
|
- .build(),
|
|
|
- YDConf.FORM_QUERY.retrieve_list_all
|
|
|
- ).getData();
|
|
|
-
|
|
|
- exists = list != null && !list.isEmpty();
|
|
|
- } catch (Exception e) {
|
|
|
- log.error("查询宜搭系统失败,bankStatementId: {}", bankStatementId, e);
|
|
|
- }
|
|
|
+ if (exists) {
|
|
|
+ log.debug("记录已存在,跳过: bankStatementId={}", bankStatementId);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
|
|
|
- // ===== 若不存在则创建 =====
|
|
|
- if (!exists && bankStatementId != null && !bankStatementId.isEmpty()) {
|
|
|
+ // 查询客户主数据
|
|
|
+ String khformInstanceId = null;
|
|
|
+ String khaccountName = null;
|
|
|
try {
|
|
|
+ List<Map> khlist = (List<Map>) ydClient.queryData(
|
|
|
+ YDParam.builder()
|
|
|
+ .formUuid("FORM-E18CC7F3495B45BB852CB386F325BF03IAS3")
|
|
|
+ .appType("APP_RPH7R3LF3SMXLRDY1ZJW")
|
|
|
+ .systemToken("7M866K91D4LVACB4EADAZ5UJG7IN3OGA33WAMNT")
|
|
|
+ .searchCondition(JSON.toJSONString(UtilMap.map("textField_m8sjaafp", customerName)))
|
|
|
+ .build(),
|
|
|
+ YDConf.FORM_QUERY.retrieve_list_all
|
|
|
+ ).getData();
|
|
|
+
|
|
|
+ if (khlist != null && !khlist.isEmpty()) {
|
|
|
+ for (Map<String, Object> khitem : khlist) {
|
|
|
+ Map<String, Object> khformData = (Map<String, Object>) khitem.get("formData");
|
|
|
+ if (khformData != null && customerName.equals(khformData.get("textField_m8sjaafp"))) {
|
|
|
+ khformInstanceId = (String) khitem.get("formInstanceId");
|
|
|
+ khaccountName = (String) khformData.get("textField_m8sjaafp");
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (khformInstanceId == null || khaccountName == null) {
|
|
|
+ log.warn("未找到匹配的客户信息: customerName={}", customerName);
|
|
|
+ // 可选择跳过或继续(不关联客户)
|
|
|
+ }
|
|
|
+
|
|
|
+ // 构造 formData
|
|
|
Map<String, Object> formData = new HashMap<>();
|
|
|
formData.put("dateField_m8yeduje", timestamp != null ? timestamp : System.currentTimeMillis());
|
|
|
formData.put("dateField_mbg6gyre", timestamp != null ? timestamp : System.currentTimeMillis());
|
|
@@ -1059,42 +1100,50 @@ public class LiLinServiceImpl implements LiLinService {
|
|
|
formData.put("textField_mdh51nxq", userMemo);
|
|
|
formData.put("textField_mdh51nxr", transFlag);
|
|
|
formData.put("textField_mdh51nxs", catalogName);
|
|
|
+ formData.put("selectField_m982msou", accountName);
|
|
|
|
|
|
- ydClient.operateData(YDParam.builder()
|
|
|
- .formUuid("FORM-AC0D84A40AD64E469C6AC6D049931C22IDO8")
|
|
|
- .processCode("TPROC--K8C66U6152SW46P3DKE38BFVC2AA3HQGQOMCM13")
|
|
|
- .formDataJson(JSON.toJSONString(formData))
|
|
|
- .userId("275412081437800471")
|
|
|
- .build(), YDConf.FORM_OPERATION.start);
|
|
|
+ if (khaccountName != null && khformInstanceId != null) {
|
|
|
+ formData.put("associationFormField_m8yeduj1",
|
|
|
+ Arrays.asList(getkhAss(khaccountName, khformInstanceId)));
|
|
|
+ }
|
|
|
+
|
|
|
+ // 提交创建流程
|
|
|
+ ydClient.operateData(
|
|
|
+ YDParam.builder()
|
|
|
+ .formUuid("FORM-AF6E9FBF8F7642D59A333BC9EF3DF3FB836A")
|
|
|
+ .processCode("TPROC--FPB66VB19FKVVL56E43NW6XQCP7T3URA33WAML3")
|
|
|
+ .formDataJson(JSON.toJSONString(formData))
|
|
|
+ .userId("275412081437800471")
|
|
|
+ .build(),
|
|
|
+ YDConf.FORM_OPERATION.start
|
|
|
+ );
|
|
|
|
|
|
log.info("成功创建对账记录: bankStatementId={}", bankStatementId);
|
|
|
+
|
|
|
} catch (Exception e) {
|
|
|
log.error("创建对账记录失败: bankStatementId={}", bankStatementId, e);
|
|
|
}
|
|
|
- } else if (exists) {
|
|
|
- log.debug("记录已存在,跳过: bankStatementId={}", bankStatementId);
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
- log.info("对账单同步完成,共处理 {} 条", extractedList.size());
|
|
|
- return McR.success("同步完成"); // 可改为返回统计信息
|
|
|
+ log.info("对账单同步完成,accountNo={},共处理 {} 条", accountNo, extractedList.size());
|
|
|
|
|
|
- } catch (IOException e) {
|
|
|
- log.error("网络IO异常", e);
|
|
|
- return McR.errorParam("网络请求失败: " + e.getMessage());
|
|
|
- } catch (Exception e) {
|
|
|
- log.error("未知异常", e);
|
|
|
- return McR.errorParam("处理过程发生错误: " + e.getMessage());
|
|
|
- } finally {
|
|
|
- // 确保 response 被关闭
|
|
|
- if (response != null) {
|
|
|
- try {
|
|
|
- response.close();
|
|
|
- } catch (Exception e) {
|
|
|
- log.warn("关闭 response 失败", e);
|
|
|
+ } catch (IOException e) {
|
|
|
+ log.error("网络IO异常: accountNo={}", accountNo, e);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("处理账号异常: accountNo={}", accountNo, e);
|
|
|
+ } finally {
|
|
|
+ // 确保 response 被安全关闭
|
|
|
+ if (response != null) {
|
|
|
+ try {
|
|
|
+ response.close();
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.warn("关闭 HTTP 响应失败", e);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ return McR.success("所有账号同步完成");
|
|
|
}
|
|
|
|
|
|
// 工具方法:安全获取字符串值
|
|
@@ -1152,7 +1201,7 @@ public class LiLinServiceImpl implements LiLinService {
|
|
|
Map<String, Object> newItem = new HashMap<>();
|
|
|
newItem.put("itemIndex", i + 1);
|
|
|
newItem.put("amount", getAmountFromMap(row, "numberField_m9u2a5tf").doubleValue());
|
|
|
- newItem.put("projectInfo", getStringValue(row, "textField_m9i9k5cl")+"-"+getStringValue(row, "textField_m8yedujm"));
|
|
|
+ newItem.put("projectInfo", getStringValue(row, "textField_m9i9k5cl") + "-" + getStringValue(row, "textField_m8yedujm"));
|
|
|
newItem.put("userMemo", userMemo);
|
|
|
newItem.put("trxFlag", transFlag);
|
|
|
newItem.put("catalogName", catalogName);
|
|
@@ -1172,7 +1221,7 @@ public class LiLinServiceImpl implements LiLinService {
|
|
|
requestBody.put("subBankStatementList", subBankStatementList);
|
|
|
|
|
|
// 请求参数
|
|
|
- String url = "https://openapi.xencio.com/sandbox/cfa/api/sub/bs/splitBankStatement";
|
|
|
+ String url = "https://x.xencio.com/c4c3/api/sub/bs/splitBankStatement";
|
|
|
String securityCode = String.valueOf(token().getData());
|
|
|
if (securityCode == null || securityCode.isEmpty()) {
|
|
|
log.error("获取 securityCode 失败");
|
|
@@ -1180,7 +1229,7 @@ public class LiLinServiceImpl implements LiLinService {
|
|
|
}
|
|
|
|
|
|
Map<String, String> headers = new HashMap<>();
|
|
|
- headers.put("x-xencio-client-id", "4d9414e89bc24b0d89b678d9f20bc56a");
|
|
|
+ headers.put("x-xencio-client-id", "7dc3a31209b94a91ba40a44358fe70eb");
|
|
|
|
|
|
// Map params = new HashMap<>();
|
|
|
headers.put("securityCode", securityCode);
|
|
@@ -1239,7 +1288,7 @@ public class LiLinServiceImpl implements LiLinService {
|
|
|
}
|
|
|
|
|
|
int successCount = 0, failCount = 0;
|
|
|
- String updateUrl = "https://openapi.xencio.com/sandbox/cfa/api/sub/bs/updateProjectInfo";
|
|
|
+ String updateUrl = "https://x.xencio.com/c4c3/api/sub/bs/updateProjectInfo";
|
|
|
|
|
|
for (Map<String, Object> item : result) {
|
|
|
try {
|
|
@@ -1258,6 +1307,158 @@ public class LiLinServiceImpl implements LiLinService {
|
|
|
return McR.success(result);
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public McR taskPLJG() {
|
|
|
+ List<Map> list = (List<Map>) ydClient.queryData(YDParam.builder()
|
|
|
+ .formUuid("FORM-754586D31BF6414586E5C20DB3774A7320CV")
|
|
|
+ .searchFieldJson(JSONObject.toJSONString(Arrays.asList(
|
|
|
+ new YDSearch("selectField_ma0w9yrb",
|
|
|
+ "已审批已付款",
|
|
|
+ "SelectField",
|
|
|
+ YDSearch.Type.RADIO_FIELD,
|
|
|
+ YDSearch.Operator.EQ)
|
|
|
+ )))
|
|
|
+ .build(), YDConf.FORM_QUERY.retrieve_list_all).getData();
|
|
|
+
|
|
|
+ if (list == null || list.isEmpty()) {
|
|
|
+ log.info("没有找到需要处理的单据");
|
|
|
+ return McR.success("无待处理数据");
|
|
|
+ }
|
|
|
+
|
|
|
+ for (Map item : list) {
|
|
|
+ try {
|
|
|
+ String formInstanceId = getStringValue(item, "formInstanceId");
|
|
|
+ if (formInstanceId == null || formInstanceId.isEmpty()) {
|
|
|
+ log.warn("跳过:formInstanceId 为空");
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取源表单详情
|
|
|
+ Map data = (Map) ydClient.queryData(YDParam.builder()
|
|
|
+ .formInstId(formInstanceId)
|
|
|
+ .appType(ydConf.getAppType())
|
|
|
+ .systemToken(ydConf.getSystemToken())
|
|
|
+ .userId(ddConf.getOperator())
|
|
|
+ .build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
|
|
|
+
|
|
|
+ if (data == null) {
|
|
|
+ log.warn("formInstanceId={} 的 formData 为空,跳过", formInstanceId);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ String fklx = getStringValue(data, "selectField_m9ze3rjf"); // 付款类型
|
|
|
+ String mainInstructionId = getStringValue(data, "serialNumberField_m9ze3rjd"); // 主表流水号
|
|
|
+
|
|
|
+ // 🔍 查询目标表单是否已存在该 mainInstructionId 的记录
|
|
|
+ List<Map> list1 = (List<Map>) ydClient.queryData(
|
|
|
+ YDParam.builder()
|
|
|
+ .formUuid("FORM-6B8A683A23524D3596C8C6CA13327EF3552K")
|
|
|
+ .appType("APP_RPH7R3LF3SMXLRDY1ZJW")
|
|
|
+ .systemToken("7M866K91D4LVACB4EADAZ5UJG7IN3OGA33WAMNT")
|
|
|
+ .searchCondition(JSON.toJSONString(UtilMap.map("textField_mdsk7rlm", mainInstructionId)))
|
|
|
+ .build(),
|
|
|
+ YDConf.FORM_QUERY.retrieve_list_all
|
|
|
+ ).getData();
|
|
|
+
|
|
|
+ // ✅ 如果目标表单中已存在该流水号,则跳过,不再新增
|
|
|
+ if (list1 != null && !list1.isEmpty()) {
|
|
|
+ log.info("已存在重复数据,跳过插入:mainInstructionId={}", mainInstructionId);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 继续提取其他字段
|
|
|
+ String note = getStringValue(data, "textField_m9ze3rk3"); // 付款用途
|
|
|
+ String toAccountCode = getStringValue(data, "textField_m9ze3rjs"); // 收款账号
|
|
|
+ String toAccountName = getStringValue(data, "textField_m9ze3rjl"); // 收款户名
|
|
|
+ String toBank = getStringValue(data, "textField_m9ze3rjr"); // 收款银行支行
|
|
|
+ String fromAccountCode = getStringValue(data, "textField_mdfnuyl9"); // 付款账号
|
|
|
+ String fromAccountName = getStringValue(data, "textField_m9ze3rj8"); // 付款户名
|
|
|
+ BigDecimal PayAmount;
|
|
|
+ List<Map<String, Object>> updateList = new ArrayList<>();
|
|
|
+
|
|
|
+ if ("物流付款单".equals(fklx)) {
|
|
|
+ List<Map<String, Object>> tableField = (List<Map<String, Object>>) data.get("tableField_m986c5os");
|
|
|
+ PayAmount = BigDecimal.ZERO; // 初始化累加器
|
|
|
+ if (tableField != null) {
|
|
|
+ for (Map<String, Object> row : tableField) {
|
|
|
+ String instructionId = getStringValue(row, "textField_mdnuob9a");
|
|
|
+ String xmbh = getStringValue(row, "textField_m9lfmh1p");
|
|
|
+ String payAmountStr = getStringValue(row, "numberField_m8yf6gn1");
|
|
|
+ BigDecimal payAmount1 = BigDecimal.ZERO;
|
|
|
+ if (payAmountStr != null && !payAmountStr.trim().isEmpty()) {
|
|
|
+ try {
|
|
|
+ payAmount1 = new BigDecimal(payAmountStr.trim());
|
|
|
+ PayAmount = PayAmount.add(payAmount1);
|
|
|
+ } catch (NumberFormatException e) {
|
|
|
+ // 处理转换失败的情况(可选:记录日志或忽略)
|
|
|
+ System.err.println("Invalid number format: " + payAmountStr);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ Map<String, Object> tablemap = new HashMap<>();
|
|
|
+ tablemap.put("associationFormField_ma13k7v2", Arrays.asList(getAss(mainInstructionId, formInstanceId)));
|
|
|
+ tablemap.put("selectField_m9ze3rjf", fklx);
|
|
|
+ tablemap.put("numberField_m9ze3rk4", payAmountStr);
|
|
|
+ tablemap.put("textField_m9ze3rk3", note);
|
|
|
+ tablemap.put("textField_m9ze3rjl", toAccountName);
|
|
|
+ tablemap.put("textField_m9ze3rjr", toBank);
|
|
|
+ tablemap.put("textField_m9ze3rjs", toAccountCode);
|
|
|
+ tablemap.put("textField_ma13k7v3", instructionId);
|
|
|
+ tablemap.put("textField_ma13k7v4", mainInstructionId);
|
|
|
+ tablemap.put("textField_madmzxce", xmbh);
|
|
|
+ updateList.add(tablemap);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ String instructionId = mainInstructionId;
|
|
|
+ PayAmount = safeGetBigDecimal(data, "numberField_m9ze3rk4");
|
|
|
+ String xmbh = getStringValue(data, "textField_madmzxce");
|
|
|
+
|
|
|
+ Map<String, Object> tablemap = new HashMap<>();
|
|
|
+ tablemap.put("associationFormField_ma13k7v2", Arrays.asList(getAss(mainInstructionId, formInstanceId)));
|
|
|
+ tablemap.put("selectField_m9ze3rjf", fklx);
|
|
|
+ tablemap.put("numberField_m9ze3rk4", PayAmount);
|
|
|
+ tablemap.put("textField_m9ze3rk3", note);
|
|
|
+ tablemap.put("textField_m9ze3rjl", toAccountName);
|
|
|
+ tablemap.put("textField_m9ze3rjr", toBank);
|
|
|
+ tablemap.put("textField_m9ze3rjs", toAccountCode);
|
|
|
+ tablemap.put("textField_ma13k7v3", instructionId);
|
|
|
+ tablemap.put("textField_ma13k7v4", mainInstructionId);
|
|
|
+ tablemap.put("textField_madmzxce", xmbh);
|
|
|
+ updateList.add(tablemap);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 构建目标数据
|
|
|
+ Map<String, Object> formData = new HashMap<>();
|
|
|
+ formData.put("tableField_ma13k7v1", updateList);
|
|
|
+ formData.put("numberField_mac3ccn8", PayAmount);
|
|
|
+ formData.put("textField_mdsk7rlm", mainInstructionId); // 主流水号用于去重
|
|
|
+ formData.put("employeeField_m8yf6gkl", Arrays.asList("275412081437800471"));
|
|
|
+
|
|
|
+ // 执行新增
|
|
|
+ ydClient.operateData(YDParam.builder()
|
|
|
+ .formUuid("FORM-6B8A683A23524D3596C8C6CA13327EF3552K")
|
|
|
+ .formDataJson(JSON.toJSONString(formData))
|
|
|
+ .userId("275412081437800471")
|
|
|
+ .build(), YDConf.FORM_OPERATION.create);
|
|
|
+
|
|
|
+ log.info("成功插入新数据:mainInstructionId={}, 付款类型={}", mainInstructionId, fklx);
|
|
|
+
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("处理单据时发生异常", e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return McR.success();
|
|
|
+ }
|
|
|
+
|
|
|
+ private Object getAss(String title, String id) {
|
|
|
+ return UtilMap.map("appType, formUuid, formType, instanceId, title, subTitle", "APP_RPH7R3LF3SMXLRDY1ZJW", "FORM-754586D31BF6414586E5C20DB3774A7320CV", "receipt", id, title, "");
|
|
|
+ }
|
|
|
+
|
|
|
+ private Object getkhAss(String title, String id) {
|
|
|
+ return UtilMap.map("appType, formUuid, formType, instanceId, title, subTitle", "APP_RPH7R3LF3SMXLRDY1ZJW", "FORM-E18CC7F3495B45BB852CB386F325BF03IAS3", "receipt", id, title, "");
|
|
|
+ }
|
|
|
+
|
|
|
// 工具方法:安全获取字符串
|
|
|
private String getStringValue(Map data, String key) {
|
|
|
Object val = data.get(key);
|
|
@@ -1298,7 +1499,7 @@ public class LiLinServiceImpl implements LiLinService {
|
|
|
|
|
|
private static McR token() {
|
|
|
String today = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
|
|
|
- String s = SecureUtil.md5("KHPuj0JMS6nS1ACzc#" + today);
|
|
|
+ String s = SecureUtil.md5("}bH5%t4_)6e3#" + today);
|
|
|
return McR.success(s);
|
|
|
}
|
|
|
|