收款处理自动推送费控定时任务

This commit is contained in:
李贵强 2025-03-17 10:22:14 +08:00
parent ab05e6bae9
commit 323ca77b3f
7 changed files with 339 additions and 72 deletions

View File

@ -35,6 +35,11 @@ public class FeeControlApiPlugin extends AbstractFormPlugin implements Plugin {
private static final String ENTRY_KEY = "shjh_entryentity";
private static final String PAYMENT_API = "paymentApi";
private static final String LOAN_API = "loanApi";
private static final String INTERFACE_ID1 ="FMGetJahYFKList";//识别被调接口并进行路由-预付款退回
private static final String INTERFACE_ID2 ="FMGetJahJKYList";//识别被调接口并进行路由-员工借款
private static final String RECEIVER_ID ="FeiKong";//定义的发送者
/**
* 按钮监听
@ -156,8 +161,7 @@ public class FeeControlApiPlugin extends AbstractFormPlugin implements Plugin {
return;
}
String supplierCode = supplier.getString("number");
String interfaceID="FMGetJahYFKList";
HashMap<String, String> head = ApiUtils.buildHead(interfaceID);
HashMap<String, String> head = ApiUtils.buildHead(INTERFACE_ID1,RECEIVER_ID);
HashMap<String, Object> body = ApiUtils.buildBody(companyCode, this.getUserCode(), startDate, endDate);
HashMap<String, Object> data = (HashMap<String, Object>) body.get("data");
@ -247,8 +251,7 @@ public class FeeControlApiPlugin extends AbstractFormPlugin implements Plugin {
*/
private void handleLoanApi(String companyCode, Date startDate, Date endDate, String billNumber) {
try {
String interfaceID="FMGetJahJKYList";
HashMap<String, String> head = ApiUtils.buildHead(interfaceID);
HashMap<String, String> head = ApiUtils.buildHead(INTERFACE_ID2,RECEIVER_ID);
HashMap<String, Object> body = ApiUtils.buildBody(companyCode, this.getUserCode(), startDate, endDate);
//String response = ApiUtils.sendPost(head, body, "https://hipint-stg.jahwa.com.cn:6443/gateway/HIP_ReceiveFromFM/1.0/fm/send");
String response="{\n" +

View File

@ -0,0 +1,158 @@
package shjh.jhzj7.fi.fi.plugin.form;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.entity.EntityMetadataCache;
import kd.bos.entity.datamodel.ListSelectedRowCollection;
import kd.bos.form.control.events.ItemClickEvent;
import kd.bos.list.BillList;
import kd.bos.list.plugin.AbstractListPlugin;
import kd.bos.logging.Log;
import kd.bos.logging.LogFactory;
import kd.bos.orm.query.QCP;
import kd.bos.orm.query.QFilter;
import kd.bos.servicehelper.BusinessDataServiceHelper;
import kd.bos.servicehelper.botp.BFTrackerServiceHelper;
import kd.sdk.plugin.Plugin;
import shjh.jhzj7.fi.fi.utils.SapUtils;
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
/**
* 标准单据列表插件
* 收款业务变更扩展校验方法
*
* @author LiGuiQiang
*/
public class RecBillChangeListExtendPlugin extends AbstractListPlugin implements Plugin {
private final static Log logger = LogFactory.getLog(RecBillChangeListExtendPlugin.class);
@Override
public void itemClick(ItemClickEvent evt) {
String key = evt.getItemKey();
if (!"tblrecchg".equalsIgnoreCase(key)) {
return;
}
BillList list = (BillList) this.getView().getControl("billlistap");
ListSelectedRowCollection selectedRows = list.getSelectedRows();
if (selectedRows == null || selectedRows.isEmpty()) {
this.getView().showTipNotification("请选择需要操作的收款单!");
return;
}
DynamicObject recBill = BusinessDataServiceHelper.loadSingle(
selectedRows.get(0).getPrimaryKeyValue(),
EntityMetadataCache.getDataEntityType("cas_recbill")
);
String billStatus = recBill.getString("billstatus");
String sourceBillType = recBill.getString("sourcebilltype");
String voucherNum = recBill.getString("shjh_vouchernum");
String typeNumber = recBill.getString("receivingtype.number");
String qzState = recBill.getString("shjh_qzzt");
BigDecimal actrecamt = recBill.getBigDecimal("actrecamt");
// 校验状态为已收款 来源为收款入账中心/认领通知单
boolean isStatusC = "C".equals(billStatus);
boolean isValidSource = "cas_claimcenterbill".equals(sourceBillType) || "bei_intelrec".equals(sourceBillType);
if (!(isStatusC && isValidSource)) {
this.getView().showTipNotification("所选单据不满足变更条件,只有单据状态=“已收款”且源单类型=“收款入账中心/认领通知单”的收款单才允许变更。");
return;
}
// 校验SAP凭证号不能为空
if (voucherNum == null || voucherNum.trim().isEmpty()) {
this.getView().showTipNotification("所选单据不满足变更条件SAP凭证号≠空。");
return;
}
// 校验收款类型必须为指定类型
if (!Arrays.asList("103", "109", "100").contains(typeNumber)) {
this.getView().showTipNotification("所选单据不满足变更条件,只有收款类型=“预付款退回/员工还款/销售回款”的收款单才允许变更。");
return;
}
// 校验清账状态
boolean isAutoCleared = "A".equals(qzState) || "D".equals(qzState);
boolean isToBeCleared = "B".equals(qzState);
boolean isClearBillCancelled = false;
if (isToBeCleared) {
Map<String, HashSet<Long>> recBillMap = BFTrackerServiceHelper.findSourceBills("cas_recbill", new Long[]{(Long) recBill.getPkValue()});
if (recBillMap.containsKey("shjh_clear_account")) {
Set<Long> billIds = recBillMap.get("shjh_clear_account");
for (Long billId : billIds) {
DynamicObject clearBill = BusinessDataServiceHelper.loadSingle(billId, "shjh_clear_account");
if (clearBill != null && "D".equals(clearBill.getString("billstatus"))) {
isClearBillCancelled = true;
break; // 只要存在一个作废的清账单即可
}
}
} else {
this.getView().showTipNotification("所选单据不满足变更条件,下游未关联清账单。");
return;
}
}
if (!(isAutoCleared || (isToBeCleared && isClearBillCancelled))) {
this.getView().showTipNotification("所选单据不满足变更条件,只有清账状态为“无需金蝶清账/反清账”,或清账状态为“待清账”且清账单已作废的收款单才允许变更。");
return;
}
// 校验收款金额 > 0
if (actrecamt == null || actrecamt.compareTo(BigDecimal.ZERO) <= 0) {
this.getView().showTipNotification("所选单据不满足变更条件,只有收款金额>0的收款单才允许变更。");
return;
}
// SAP清账状态校验
boolean cleared = false;
String billNumber = recBill.getString("billno");
String companyCode = recBill.getString("org.number");
String sapFiscalYear = recBill.getString("shjh_sapfiscalyear");
String sapLineNumber = recBill.getString("shjh_sapline");
String response = SapUtils.querySapClearAccountsState(billNumber, companyCode, voucherNum, sapFiscalYear, sapLineNumber);
if (response != null) {
try {
JSONObject json = JSONObject.parseObject(response);
JSONObject data = json.getJSONObject("data");
JSONArray itItems = data.getJSONArray("IT_ITEMS");
if (itItems != null && !itItems.isEmpty()) {
JSONObject resultItem = itItems.getJSONObject(0);
cleared = "y".equalsIgnoreCase(resultItem.getString("ZCLEARED"));
}
} catch (Exception e) {
logger.error("SAP返回清账状态解析异常" + e.getMessage(), e);
}
}
if (cleared) {
this.getView().showTipNotification("所选单据不满足变更条件该单据在SAP已清账。");
return;
}
// 校验是否有付款申请锁定
QFilter[] filters = new QFilter[]{
new QFilter("org.number", QCP.equals, companyCode),
new QFilter("shjh_vouchernum", QCP.equals, voucherNum),
new QFilter("shjh_sapfiscalyear", QCP.equals, sapFiscalYear),
new QFilter("shjh_sapline", QCP.equals, sapLineNumber)
};
DynamicObject payApply = BusinessDataServiceHelper.loadSingle("ap_payapply", filters);
if (payApply != null) {
this.getView().showTipNotification("所选单据不满足变更条件存在SAP关联付款申请" + payApply.getString("billno") + ",不允许变更。");
return;
}
// 到这里表示全部校验通过可以继续执行变更逻辑
}
}

View File

@ -35,6 +35,9 @@ public class LoanPushSapOperation extends AbstractOperationServicePlugIn impleme
private final static Log logger = LogFactory.getLog(LoanPushSapOperation.class);
private static final String INTERFACE_ID ="GeneraRepayBill";//识别被调接口并进行路由-员工借款
private static final String RECEIVER_ID ="FeiKong";//定义的发送者
/**
* 操作标识
@ -83,14 +86,14 @@ public class LoanPushSapOperation extends AbstractOperationServicePlugIn impleme
if (null != recBill) {
//单号
String billNumber = recBill.getString("billno");
String interfaceId = "GeneraRepayBill";
HashMap<String, String> responseHead = ApiUtils.buildHead(interfaceId);
HashMap<String, Object> responseBody = this.assembleRequest(interfaceId,billNumber, recBill,message);
HashMap<String, String> responseHead = ApiUtils.buildHead(INTERFACE_ID,RECEIVER_ID);
HashMap<String, Object> responseBody = this.assembleRequest(INTERFACE_ID,billNumber, recBill,message);
//try {
// String response = ApiUtils.sendPost(responseHead, responseBody, "https://hipint-stg.jahwa.com.cn:6443/gateway/HIP_ReceiveFromFM/1.0/fm/send");
String response="{ \"rootContextID\": \"8as6dfasd6f98as7d6f9a98sd76f\", \"code\": \"0\", \"msg\": \"成功\", \"data\": { \"ID\": \"ab7a4722-656e-4fdf-bcea-3d40d175fa78\", \"BillConfigID\": 2524, \"RequestCode\": \"JKY2025030400002\" } }";
if (!response.isEmpty()) {
this.parseResponse(recBill,response, billNumber, responseBody, interfaceId, message);
this.parseResponse(recBill,response, billNumber, responseBody, INTERFACE_ID, message);
}
//} catch (IOException ex) {
// message.append("收款处理【").append(billNumber).append("】:").append(ex.getMessage()).append("\n");

View File

@ -35,7 +35,9 @@ public class PaymentPushSapOperation extends AbstractOperationServicePlugIn impl
private final static Log logger = LogFactory.getLog(PaymentPushSapOperation.class);
private static final String INTERFACE_ID ="GeneraGTH";//识别被调接口并进行路由-员工借款
private static final String RECEIVER_ID ="FeiKong";//定义的发送者
/**
* 操作标识
*/
@ -83,13 +85,13 @@ public class PaymentPushSapOperation extends AbstractOperationServicePlugIn impl
if (null != recBill) {
//单号
String billNumber = recBill.getString("billno");
String interfaceId = "GeneraGTH";
HashMap<String, String> responseHead = ApiUtils.buildHead(interfaceId);
HashMap<String, Object> responseBody = this.assembleRequest(interfaceId,billNumber, recBill,message);
HashMap<String, String> responseHead = ApiUtils.buildHead(INTERFACE_ID,RECEIVER_ID);
HashMap<String, Object> responseBody = this.assembleRequest(INTERFACE_ID,billNumber, recBill,message);
try {
String response = ApiUtils.sendPost(responseHead, responseBody, "https://hipint-stg.jahwa.com.cn:6443/gateway/HIP_ReceiveFromFM/1.0/fm/send");
if (!response.isEmpty()) {
this.parseResponse(recBill,response, billNumber, responseBody, interfaceId, message);
this.parseResponse(recBill,response, billNumber, responseBody, INTERFACE_ID, message);
}
} catch (IOException ex) {
message.append("收款处理【").append(billNumber).append("】:").append(ex.getMessage()).append("\n");

View File

@ -36,6 +36,9 @@ public class RebReversalFiOperation extends AbstractOperationServicePlugIn imple
private final static Log logger = LogFactory.getLog(RebReversalFiOperation.class);
private static final String INTERFACE_ID ="BillInvalid";//识别被调接口并进行路由-员工借款
private static final String RECEIVER_ID ="FeiKong";//定义的发送者
/**
* 操作标识
@ -132,14 +135,14 @@ public class RebReversalFiOperation extends AbstractOperationServicePlugIn imple
if (null != recBill) {
//单号
String billNumber = recBill.getString("billno");
String interfaceId = "BillInvalid";
HashMap<String, String> responseHead = ApiUtils.buildHead(interfaceId);
HashMap<String, Object> responseBody = this.assembleRequest(interfaceId,billNumber, recBill,message);
HashMap<String, String> responseHead = ApiUtils.buildHead(INTERFACE_ID,RECEIVER_ID);
HashMap<String, Object> responseBody = this.assembleRequest(INTERFACE_ID,billNumber, recBill,message);
//try {
// String response = ApiUtils.sendPost(responseHead, responseBody, "https://hipint-stg.jahwa.com.cn:6443/gateway/HIP_ReceiveFromFM/1.0/fm/send");
String response="{ \"rootContextID\": \"8as6dfasd6f98as7d6f9a98sd76f\", \"code\": \"0\", \"msg\": \"红冲作废单据处理成功\", \"data\": null }";
if (!response.isEmpty()) {
this.parseResponse(response, billNumber, responseBody, interfaceId, message);
ApiUtils.parseResponse(response, billNumber, responseBody, INTERFACE_ID, message);
}
//} catch (IOException ex) {
// message.append("收款处理【").append(billNumber).append("】:").append(ex.getMessage()).append("\n");
@ -200,7 +203,7 @@ public class RebReversalFiOperation extends AbstractOperationServicePlugIn imple
* @param body 请求体
* @param apiName 接口名
*/
private void parseResponse(String response, String billNumber, HashMap<String, Object> body, String apiName, StringBuilder message) {
public void parseResponse(String response, String billNumber, HashMap<String, Object> body, String apiName, StringBuilder message) {
JSONObject result = JSONObject.parseObject(response);
if (null != result) {
String formattedBody = JSON.toJSONString(body);

View File

@ -1,6 +1,7 @@
package shjh.jhzj7.fi.fi.utils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import kd.bos.logging.Log;
import kd.bos.logging.LogFactory;
import org.apache.http.HttpResponse;
@ -23,12 +24,12 @@ public class ApiUtils {
static Log log = LogFactory.getLog(ApiUtils.class);
public static HashMap<String,String> buildHead(String interfaceId){
public static HashMap<String,String> buildHead(String interfaceId,String receiverId){
HashMap<String,String> header = new HashMap<>(5);
header.put("Content-Type","application/json;charset=UTF-8");
header.put("x-Gateway-APIKey","207b5296-9866-4b4b-8146-1fea58b3c8c9");
header.put("interfaceID",interfaceId);
header.put("receiverID","FeiKong");
header.put("receiverID",receiverId);
return header;
}
@ -88,5 +89,43 @@ public class ApiUtils {
return responseData;
}
/**
* 响应解析
* 日志记录
* @param response 响应参数
* @param billNumber 本单单号
* @param body 请求体
* @param apiName 接口名
*/
public static boolean parseResponse(String response, String billNumber, HashMap<String, Object> body, String apiName, StringBuilder message) {
JSONObject result = JSONObject.parseObject(response);
boolean isSuccess =false;
if (null != result) {
String formattedBody = JSON.toJSONString(body);
String code = result.getString("code");
switch (code) {
case "0":
isSuccess=true;
EsbUtils.saveLog("收款处理"+billNumber, apiName, formattedBody, response, true, "ESBReversalApi", "推送成功");
break;
case "1":
EsbUtils.saveLog("收款处理"+billNumber, apiName, formattedBody, response, false, "ESBReversalApi", "服务异常");
message.append("收款处理【").append(billNumber).append("】:").append("服务异常").append("\n");
break;
case "2":
EsbUtils.saveLog("收款处理"+billNumber, apiName, formattedBody, response, false, "ESBReversalApi", "三方服务异常");
message.append("收款处理【").append(billNumber).append("】:").append("三方服务异常").append("\n");
break;
case "3":
EsbUtils.saveLog("收款处理"+billNumber, apiName, formattedBody, response, false, "ESBReversalApi", "业务异常");
message.append("收款处理【").append(billNumber).append("】:").append("业务异常").append("\n");
break;
default:
EsbUtils.saveLog("收款处理"+billNumber, apiName, formattedBody, response, false, "ESBReversalApi", "未知异常");
message.append("收款处理【").append(billNumber).append("】:").append("未知异常").append("\n");
break;
}
}
return isSuccess;
}
}

View File

@ -13,8 +13,10 @@ import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
@ -48,16 +50,25 @@ public class SapUtils {
public static final String sapArUrl = "https://hipint-stg.jahwa.com.cn:6443/gateway/HIP_ReceiveFromFM/1.0/fm/send";//测试环境(SAP应收凭证清单)
// public static final String sapArUrl = "https://hipint.jahwa.com.cn:6443/gateway/HIP_ReceiveFromFM/1.0/fm/send";//正式环境
private static final String API_METHOD4 = "SAP收款凭证清账状态查询接口";
private static final String INTERFACE_ID4 = "ReceiptVoucherClearingStatusCheck";
/**
* 测试地址
*/
public static final String QUERY_STATE_URL = "https://hipint-stg.jahwa.com.cn:6443/gateway/HIP_ReceiveFromFM/1.0/fm/send";
// public static final String withholdingUrl = "https://hipint.jahwa.com.cn:6443/gateway//HIP_ReceiveFromFM/1.0/fm/send";
public static final String RECEIVER_ID4 = "SAP";
/**
* SAP应付凭证锁定解锁状态回写
*/
public static JSONObject unlocked_status(JSONArray IT_INPUT,String billno){
public static JSONObject unlocked_status(JSONArray IT_INPUT, String billno) {
Map<String, Object> thirdPartyMap = new HashMap<>();
thirdPartyMap.put("interfaceID",interfaceID1);
thirdPartyMap.put("receiverID",receiverID1);
thirdPartyMap.put("URL",unlockedUrl);
thirdPartyMap.put("billno",billno);
thirdPartyMap.put("interfaceID", interfaceID1);
thirdPartyMap.put("receiverID", receiverID1);
thirdPartyMap.put("URL", unlockedUrl);
thirdPartyMap.put("billno", billno);
// 组装请求体
JSONObject pendingsBody = unlockedBody(IT_INPUT);
// 发送请求并处理响应
@ -66,6 +77,7 @@ public class SapUtils {
/**
* SAP应付凭证锁定解锁状态回写组装请求体:
*
* @return 请求体的 JSON 对象
*/
private static JSONObject unlockedBody(JSONArray IT_INPUT) {
@ -77,11 +89,11 @@ public class SapUtils {
String dates = date.format(formatter);
//组装请求体
JSONObject pendingsBody = new JSONObject();
pendingsBody.put("rootContextID",""+System.currentTimeMillis());//唯一事务ID采用UUID或其他强唯一性ID,会校验不存在,是否在上游储存
pendingsBody.put("rootContextID", "" + System.currentTimeMillis());//唯一事务ID采用UUID或其他强唯一性ID,会校验不存在,是否在上游储存
pendingsBody.put("requestTime", dates);//请求时间,格式为yyyy-MM-dd HH:mm:ss.SSS
JSONObject data = new JSONObject();
data.put("IT_LIST",IT_INPUT);
data.put("IT_LIST", IT_INPUT);
pendingsBody.put("data", data);
return pendingsBody;
}
@ -130,12 +142,12 @@ public class SapUtils {
/**
* SAP应付凭证清单接口
*/
public static JSONObject vouchers_payable(JSONArray IT_LIST,String billno){
public static JSONObject vouchers_payable(JSONArray IT_LIST, String billno) {
Map<String, Object> thirdPartyMap = new HashMap<>();
thirdPartyMap.put("interfaceID",interfaceID2);
thirdPartyMap.put("receiverID",receiverID1);
thirdPartyMap.put("URL",vouchersUrl);
thirdPartyMap.put("billno",billno);
thirdPartyMap.put("interfaceID", interfaceID2);
thirdPartyMap.put("receiverID", receiverID1);
thirdPartyMap.put("URL", vouchersUrl);
thirdPartyMap.put("billno", billno);
// 组装请求体
JSONObject payableBody = payableBody(IT_LIST);
// 发送请求并处理响应
@ -144,6 +156,7 @@ public class SapUtils {
/**
* SAP应付凭证清单接口组装请求体:
*
* @return 请求体的 JSON 对象
*/
private static JSONObject payableBody(JSONArray IT_LIST) {
@ -155,11 +168,11 @@ public class SapUtils {
String dates = date.format(formatter);
//组装请求体
JSONObject pendingsBody = new JSONObject();
pendingsBody.put("rootContextID",""+System.currentTimeMillis());//唯一事务ID采用UUID或其他强唯一性ID
pendingsBody.put("requestTime",dates);//请求时间,格式为yyyy-MM-dd HH:mm:ss.SSS
pendingsBody.put("rootContextID", "" + System.currentTimeMillis());//唯一事务ID采用UUID或其他强唯一性ID
pendingsBody.put("requestTime", dates);//请求时间,格式为yyyy-MM-dd HH:mm:ss.SSS
JSONObject data = new JSONObject();
data.put("IT_INPUT",IT_LIST);
data.put("IT_INPUT", IT_LIST);
pendingsBody.put("data", data);
return pendingsBody;
}
@ -167,12 +180,12 @@ public class SapUtils {
/**
* 生成代扣款记账单接口
*/
public static JSONObject withholding_billing(JSONObject data,String billno){
public static JSONObject withholding_billing(JSONObject data, String billno) {
Map<String, Object> thirdPartyMap = new HashMap<>();
thirdPartyMap.put("interfaceID",interfaceID3);
thirdPartyMap.put("receiverID",receiverID2);
thirdPartyMap.put("URL",withholdingUrl);
thirdPartyMap.put("billno",billno);
thirdPartyMap.put("interfaceID", interfaceID3);
thirdPartyMap.put("receiverID", receiverID2);
thirdPartyMap.put("URL", withholdingUrl);
thirdPartyMap.put("billno", billno);
// 获取当前日期和时间
LocalDateTime date = LocalDateTime.now();
@ -180,7 +193,7 @@ public class SapUtils {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
// 格式化当前日期和时间
String dates = date.format(formatter);
thirdPartyMap.put("createdatetime",dates);
thirdPartyMap.put("createdatetime", dates);
// 组装请求体
JSONObject withholdingBody = withholdingBody(data);
// 发送请求并处理响应
@ -189,6 +202,7 @@ public class SapUtils {
/**
* 生成代扣款记账单接口组装请求体:
*
* @return 请求体的 JSON 对象
*/
private static JSONObject withholdingBody(JSONObject data) {
@ -200,7 +214,7 @@ public class SapUtils {
String dates = date.format(formatter);
//组装请求体
JSONObject pendingsBody = new JSONObject();
pendingsBody.put("rootContextID",""+System.currentTimeMillis());//todo:唯一事务ID采用UUID或其他强唯一性ID
pendingsBody.put("rootContextID", "" + System.currentTimeMillis());//todo:唯一事务ID采用UUID或其他强唯一性ID
pendingsBody.put("requestTime", dates);//请求时间,格式为yyyy-MM-dd HH:mm:ss.SSS
pendingsBody.put("data", data);
return pendingsBody;
@ -209,11 +223,11 @@ public class SapUtils {
/**
* 发送请求并处理响应
*
* @param pendingsBody 请求体
* @param thirdPartyMap 第三方数据映射
* @param apiName 接口名称
* @param pendingsBody 请求体
* @param thirdPartyMap 第三方数据映射
* @param apiName 接口名称
*/
private static JSONObject processRequest(JSONObject pendingsBody, Map<String, Object> thirdPartyMap, String apiName){
private static JSONObject processRequest(JSONObject pendingsBody, Map<String, Object> thirdPartyMap, String apiName) {
// 配置超时时间
RequestConfig requestConfig = RequestConfig.custom()
@ -251,31 +265,32 @@ public class SapUtils {
if (responseEntity != null) {
String responseString = EntityUtils.toString(responseEntity, "UTF-8");
jsonObject = JSONObject.parseObject(responseString);
String code = (String)jsonObject.get("code");
String code = (String) jsonObject.get("code");
if (!"0".equals(code)) {
logger.info(apiName +"失败!");
saveLog( (thirdPartyMap.get("billno").toString()), pendingsBody, jsonObject, false,apiName);
logger.info(apiName + "失败!");
saveLog((thirdPartyMap.get("billno").toString()), pendingsBody, jsonObject, false, apiName);
return jsonObject;
}
handleResponse(jsonObject, pendingsBody, thirdPartyMap,apiName);
handleResponse(jsonObject, pendingsBody, thirdPartyMap, apiName);
return com.alibaba.fastjson.JSONObject.parseObject(responseString);
}else {
logger.info(apiName +"失败!");
saveLog( (thirdPartyMap.get("billno").toString()), pendingsBody, null, false,apiName);
} else {
logger.info(apiName + "失败!");
saveLog((thirdPartyMap.get("billno").toString()), pendingsBody, null, false, apiName);
}
} catch (Exception e) {
handleException(e, pendingsBody, thirdPartyMap, jsonObject,apiName);
handleException(e, pendingsBody, thirdPartyMap, jsonObject, apiName);
}
return jsonObject;
}
/**
* 解析响应 JSON 字符串
*
* @param response 响应的 JSON 字符串
* @param apiName 接口名称
* @return 解析后的 JSON 对象
*/
private static JSONObject parseResponse(String response,String apiName) {
private static JSONObject parseResponse(String response, String apiName) {
try {
return JSONObject.parseObject(response);
} catch (Exception e) {
@ -286,40 +301,42 @@ public class SapUtils {
/**
* 处理响应结果
* @param jsonObject 响应的 JSON 对象
* @param pendingsBody 请求体
* @param thirdPartyMap 第三方数据映射
* @param apiName 接口名称
*
* @param jsonObject 响应的 JSON 对象
* @param pendingsBody 请求体
* @param thirdPartyMap 第三方数据映射
* @param apiName 接口名称
*/
private static void handleResponse(JSONObject jsonObject, JSONObject pendingsBody, Map<String, Object> thirdPartyMap,String apiName) {
private static void handleResponse(JSONObject jsonObject, JSONObject pendingsBody, Map<String, Object> thirdPartyMap, String apiName) {
String operResult = jsonObject.getString("code");
JSONObject jsonobject = jsonObject.getJSONObject("data");
if (jsonobject == null && !"0".equals(operResult)) {
logger.info(apiName + "失败!");
saveLog((thirdPartyMap.get("billno").toString()), pendingsBody, jsonObject, false,apiName);
saveLog((thirdPartyMap.get("billno").toString()), pendingsBody, jsonObject, false, apiName);
return;
}
String logMessage = Objects.equals(operResult, "0") ? apiName +"成功!" : apiName +"失败!";
String logMessage = Objects.equals(operResult, "0") ? apiName + "成功!" : apiName + "失败!";
// 记录日志
logger.info(logMessage);
saveLog((thirdPartyMap.get("billno").toString()), pendingsBody, jsonObject, true,apiName);
saveLog((thirdPartyMap.get("billno").toString()), pendingsBody, jsonObject, true, apiName);
}
/**
* 处理异常情况
* @param e 捕获的异常
* @param pendingsBody 请求体
* @param thirdPartyMap 第三方数据映射
* @param jsonObject 响应的 JSON 对象
* @param apiName 接口名称
*
* @param e 捕获的异常
* @param pendingsBody 请求体
* @param thirdPartyMap 第三方数据映射
* @param jsonObject 响应的 JSON 对象
* @param apiName 接口名称
*/
private static void handleException(Exception e, JSONObject pendingsBody, Map<String, Object> thirdPartyMap, JSONObject jsonObject,String apiName) {
private static void handleException(Exception e, JSONObject pendingsBody, Map<String, Object> thirdPartyMap, JSONObject jsonObject, String apiName) {
// 记录异常信息
String errorMessage = String.format(apiName +"状态回写接口异常:%s", e.getMessage());
String errorMessage = String.format(apiName + "状态回写接口异常:%s", e.getMessage());
logger.error(errorMessage);
saveLog(thirdPartyMap.get("billno").toString(), pendingsBody, jsonObject, false,apiName);
saveLog(thirdPartyMap.get("billno").toString(), pendingsBody, jsonObject, false, apiName);
throw new RuntimeException(e);
}
@ -332,8 +349,50 @@ public class SapUtils {
* @param isSuccess 是否成功
* @param apiName 接口名称
*/
private static void saveLog(String billNo, JSONObject pendingsBody, JSONObject jsonObject, boolean isSuccess,String apiName) {
private static void saveLog(String billNo, JSONObject pendingsBody, JSONObject jsonObject, boolean isSuccess, String apiName) {
JhzjUtils.saveLog(billNo, apiName, pendingsBody.toJSONString(),
jsonObject != null ? jsonObject.toJSONString() : "{}", isSuccess, "API");
}
/**
* 调用SAP收款凭证清账状态查询接口
*
* @param billNumber 单据编号
* @param companyCode 公司编码
* @param sapVoucherNumber SAP凭证号
* @param sapFiscalYear 会计年度
* @param sapLineNumber 会计凭证中的行项目数
* @return 响应参数
*/
public static String querySapClearAccountsState(String billNumber, String companyCode, String sapVoucherNumber, String sapFiscalYear, String sapLineNumber) {
try {
StringBuilder message = new StringBuilder();
HashMap<String, String> head = ApiUtils.buildHead(INTERFACE_ID4, RECEIVER_ID4);
// 构建请求体
HashMap<String, Object> body = new HashMap<>();
Map<String, Object> item = new HashMap<>();
item.put("BUKRS", companyCode); // 公司编码
item.put("BELNR", sapVoucherNumber); // SAP凭证号
item.put("GJAHR", sapFiscalYear); // 会计年度
item.put("BUZEI", sapLineNumber); // 行项目号
List<Map<String, Object>> items = new ArrayList<>();
items.add(item);
Map<String, Object> data = new HashMap<>();
data.put("IT_ITEMS", items);
body.put("data", data);
String response = ApiUtils.sendPost(head, body, QUERY_STATE_URL);
if (null != response) {
boolean isSuccess = ApiUtils.parseResponse(response, billNumber, body, API_METHOD4, message);
if (isSuccess) {
return response;
}
}
} catch (IOException e) {
logger.error(e.getMessage());
}
return null;
}
}