diff --git a/main/java/shjh/jhzj7/fi/fi/plugin/form/FeeControlApiPlugin.java b/main/java/shjh/jhzj7/fi/fi/plugin/form/FeeControlApiPlugin.java index b58c6cf..548a01e 100644 --- a/main/java/shjh/jhzj7/fi/fi/plugin/form/FeeControlApiPlugin.java +++ b/main/java/shjh/jhzj7/fi/fi/plugin/form/FeeControlApiPlugin.java @@ -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 head = ApiUtils.buildHead(interfaceID); + HashMap head = ApiUtils.buildHead(INTERFACE_ID1,RECEIVER_ID); HashMap body = ApiUtils.buildBody(companyCode, this.getUserCode(), startDate, endDate); HashMap data = (HashMap) 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 head = ApiUtils.buildHead(interfaceID); + HashMap head = ApiUtils.buildHead(INTERFACE_ID2,RECEIVER_ID); HashMap 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" + diff --git a/main/java/shjh/jhzj7/fi/fi/plugin/form/RecBillChangeListExtendPlugin.java b/main/java/shjh/jhzj7/fi/fi/plugin/form/RecBillChangeListExtendPlugin.java new file mode 100644 index 0000000..a1f4ea2 --- /dev/null +++ b/main/java/shjh/jhzj7/fi/fi/plugin/form/RecBillChangeListExtendPlugin.java @@ -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> recBillMap = BFTrackerServiceHelper.findSourceBills("cas_recbill", new Long[]{(Long) recBill.getPkValue()}); + if (recBillMap.containsKey("shjh_clear_account")) { + Set 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; + } + + // 到这里表示全部校验通过,可以继续执行变更逻辑 + } + +} \ No newline at end of file diff --git a/main/java/shjh/jhzj7/fi/fi/plugin/operate/LoanPushSapOperation.java b/main/java/shjh/jhzj7/fi/fi/plugin/operate/LoanPushSapOperation.java index bdd16fd..9ca2e2e 100644 --- a/main/java/shjh/jhzj7/fi/fi/plugin/operate/LoanPushSapOperation.java +++ b/main/java/shjh/jhzj7/fi/fi/plugin/operate/LoanPushSapOperation.java @@ -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 responseHead = ApiUtils.buildHead(interfaceId); - HashMap responseBody = this.assembleRequest(interfaceId,billNumber, recBill,message); + + HashMap responseHead = ApiUtils.buildHead(INTERFACE_ID,RECEIVER_ID); + HashMap 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"); diff --git a/main/java/shjh/jhzj7/fi/fi/plugin/operate/PaymentPushSapOperation.java b/main/java/shjh/jhzj7/fi/fi/plugin/operate/PaymentPushSapOperation.java index cca5747..4f65960 100644 --- a/main/java/shjh/jhzj7/fi/fi/plugin/operate/PaymentPushSapOperation.java +++ b/main/java/shjh/jhzj7/fi/fi/plugin/operate/PaymentPushSapOperation.java @@ -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 responseHead = ApiUtils.buildHead(interfaceId); - HashMap responseBody = this.assembleRequest(interfaceId,billNumber, recBill,message); + + HashMap responseHead = ApiUtils.buildHead(INTERFACE_ID,RECEIVER_ID); + HashMap 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"); diff --git a/main/java/shjh/jhzj7/fi/fi/plugin/operate/RebReversalFiOperation.java b/main/java/shjh/jhzj7/fi/fi/plugin/operate/RebReversalFiOperation.java index 512687a..ee8145b 100644 --- a/main/java/shjh/jhzj7/fi/fi/plugin/operate/RebReversalFiOperation.java +++ b/main/java/shjh/jhzj7/fi/fi/plugin/operate/RebReversalFiOperation.java @@ -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 responseHead = ApiUtils.buildHead(interfaceId); - HashMap responseBody = this.assembleRequest(interfaceId,billNumber, recBill,message); + + HashMap responseHead = ApiUtils.buildHead(INTERFACE_ID,RECEIVER_ID); + HashMap 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 body, String apiName, StringBuilder message) { + public void parseResponse(String response, String billNumber, HashMap body, String apiName, StringBuilder message) { JSONObject result = JSONObject.parseObject(response); if (null != result) { String formattedBody = JSON.toJSONString(body); diff --git a/main/java/shjh/jhzj7/fi/fi/utils/ApiUtils.java b/main/java/shjh/jhzj7/fi/fi/utils/ApiUtils.java index 68f5283..d0b7780 100644 --- a/main/java/shjh/jhzj7/fi/fi/utils/ApiUtils.java +++ b/main/java/shjh/jhzj7/fi/fi/utils/ApiUtils.java @@ -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 buildHead(String interfaceId){ + public static HashMap buildHead(String interfaceId,String receiverId){ HashMap 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 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; + } } diff --git a/main/java/shjh/jhzj7/fi/fi/utils/SapUtils.java b/main/java/shjh/jhzj7/fi/fi/utils/SapUtils.java index e32107a..2d98a2d 100644 --- a/main/java/shjh/jhzj7/fi/fi/utils/SapUtils.java +++ b/main/java/shjh/jhzj7/fi/fi/utils/SapUtils.java @@ -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 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 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 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 thirdPartyMap, String apiName){ + private static JSONObject processRequest(JSONObject pendingsBody, Map 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 thirdPartyMap,String apiName) { + private static void handleResponse(JSONObject jsonObject, JSONObject pendingsBody, Map 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 thirdPartyMap, JSONObject jsonObject,String apiName) { + private static void handleException(Exception e, JSONObject pendingsBody, Map 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 head = ApiUtils.buildHead(INTERFACE_ID4, RECEIVER_ID4); + // 构建请求体 + HashMap body = new HashMap<>(); + Map item = new HashMap<>(); + item.put("BUKRS", companyCode); // 公司编码 + item.put("BELNR", sapVoucherNumber); // SAP凭证号 + item.put("GJAHR", sapFiscalYear); // 会计年度 + item.put("BUZEI", sapLineNumber); // 行项目号 + + List> items = new ArrayList<>(); + items.add(item); + + Map 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; + } }