From 4186bd47aeb495aa8f8c918bab2c5511b7569fd9 Mon Sep 17 00:00:00 2001 From: weiyunlong Date: Mon, 7 Apr 2025 11:30:24 +0800 Subject: [PATCH] =?UTF-8?q?=20=201.=E4=BB=98=E6=AC=BE=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E8=BF=94=E5=9B=9E=E5=80=BC=E4=BC=98=E5=8C=96?= =?UTF-8?q?=20--s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fi/webapi/ApplyAdjustBillControler.java | 250 ++++++++++-------- .../webapi/model/ApiResultPayAdjustExt.java | 64 +++++ 2 files changed, 205 insertions(+), 109 deletions(-) create mode 100644 main/java/shjh/jhzj7/fi/fi/webapi/model/ApiResultPayAdjustExt.java diff --git a/main/java/shjh/jhzj7/fi/fi/webapi/ApplyAdjustBillControler.java b/main/java/shjh/jhzj7/fi/fi/webapi/ApplyAdjustBillControler.java index dc62cff..678dd71 100644 --- a/main/java/shjh/jhzj7/fi/fi/webapi/ApplyAdjustBillControler.java +++ b/main/java/shjh/jhzj7/fi/fi/webapi/ApplyAdjustBillControler.java @@ -27,6 +27,8 @@ import kd.bos.orm.query.QFilter; import kd.bos.servicehelper.BusinessDataServiceHelper; import kd.bos.servicehelper.operation.OperationServiceHelper; import shjh.jhzj7.fi.fi.utils.JhzjUtils; +import shjh.jhzj7.fi.fi.webapi.model.ApiResultPayAdjustExt; +import shjh.jhzj7.fi.fi.webapi.model.ApiResultPayApplyExt; import shjh.jhzj7.fi.fi.webapi.model.ApplyAdjustBillModel; import javax.validation.Valid; @@ -52,16 +54,20 @@ public class ApplyAdjustBillControler { private static final Log log = LogFactory.getLog(ApplyAdjustBillControler.class); @ApiPostMapping(value = apimenthod, desc = "应付付款调整单接口") - public CustomApiResult applybill_adjust(@NotNull @Valid @ApiRequestBody(value = "入参json格式数据") ApplyAdjustBillModel applyAdjustbill) { + public CustomApiResult applybill_adjust(@NotNull @Valid @ApiRequestBody(value = "入参json格式数据") ApplyAdjustBillModel applyAdjustbill) { JSONObject json_body; String jsonBodyString = null; + + //返回值 + ApiResultPayAdjustExt apiResultExt = new ApiResultPayAdjustExt(); try { // 解析入参,如果格式不正确,日志记录,并反馈esb7.4.1 json_body = (JSONObject) JSON.toJSON(applyAdjustbill); jsonBodyString = JSON.toJSONString(json_body); } catch (JSONException e) { - return handleErrorAndReturn("应付付款调整单接口入参异常:" + e.getMessage(), "费控", null); + handleError("应付付款调整单接口入参异常:" + e.getMessage(), "费控", jsonBodyString); + handleErrorAndReturn(apiResultExt, "应付付款调整单接口入参异常:" + e.getMessage(), "费控", jsonBodyString); } // 公司编号+会计年度+SAP凭证号+凭证行号 @@ -73,7 +79,7 @@ public class ApplyAdjustBillControler { DynamicObject org = loadOrgByCompanyNum(companyNum); if (org == null) { - return handleErrorAndReturn("同步失败,调整单号:" + fkBillNum + "的组织编码不存在", fkBillNum, jsonBodyString); + return handleErrorAndReturn(apiResultExt, "同步失败,调整单号:" + fkBillNum + "的组织编码不存在", fkBillNum, jsonBodyString); } String sapuniquevalue = companyNum + year + voucherNum + voucherLineNum; // SAP应付凭证ID @@ -83,75 +89,82 @@ public class ApplyAdjustBillControler { if (ap_payapply == null) { log.info("不存在,从SAP获取应付凭证,生成付款申请单"); JSONArray sappzs = querySapPz(applyAdjustbill); - if (null != sappzs) { - log.info("SAP查询凭证接口存在凭证,准备生成付款申请单"); - // 存在凭证,生成付款申请单 - for (Object sappz : sappzs) { - JSONObject it_list = (JSONObject) sappz; - ap_payapply = createOrUpdatePayApply(it_list,fkBillNum); - if (ap_payapply == null) { - return CustomApiResult.fail("400", "创建或更新付款申请单失败,详情查看日志"); - } - - // 将生成的付款申请单拆分明细 - BigDecimal amounts = applyAdjustbill.getAmount(); - if (amounts == null || amounts.toString().trim().isEmpty()) { - return handleErrorAndReturn("同步失败, 调整单号:" + fkBillNum + "的调整金额为空", fkBillNum, null); - } - try { - amounts = amounts.setScale(2, RoundingMode.HALF_UP); - } catch (NumberFormatException e) { - return handleErrorAndReturn("同步失败, 调整单号:" + fkBillNum + "的金额格式不正确: " + amounts, fkBillNum, null); - } - - DynamicObjectCollection collection = ap_payapply.getDynamicObjectCollection("entry"); - if (collection.isEmpty()) { - return handleErrorAndReturn("同步失败, 调整单号:" + fkBillNum + "无明细信息", fkBillNum, null); - } - - DynamicObject add = collection.get(0); - BigDecimal amount = add.getBigDecimal("e_applyamount"); - int comparisonResult = amount.compareTo(amounts); - - if (comparisonResult > 0) { - // 分录申请金额大于调整金额,可拆 由于新增,所以不需要考虑状态直接拆 difference(拆完剩余金额) - BigDecimal difference = amount.subtract(amounts); - add.set("e_applyamount", difference); // 拆完剩余金额 - add.set("e_approvedamt", difference); // 同步核准金额 - - // 复制行 ,不考虑重复拆() - cloneEntryRow(add, collection, amounts, applyAdjustbill.getFkBillNum()); - - // 标记付款申请___来源调整单 - ap_payapply.set("shjh_sourceadjustment", true); - - // 保存、提交和审核付款申请单 - if (!processPayApply(ap_payapply, fkBillNum, jsonBodyString)) { - return CustomApiResult.fail("400", "处理付款申请单失败,详情查看日志"); - } - - log.error("审核成功,费控调整单号:" + fkBillNum); - JhzjUtils.saveLog(fkBillNum, Apimenthod, jsonBodyString, null, true, "API"); - } - } + if (null == sappzs) { + return handleErrorAndReturn(apiResultExt, "同步失败, 调整单号:" + fkBillNum + ",SAP返回:没有满足条件的记录", + fkBillNum, jsonBodyString); } - } - else { + log.info("SAP查询凭证接口存在凭证,准备生成付款申请单"); + // 存在凭证,生成付款申请单 + for (Object sappz : sappzs) { + JSONObject it_list = (JSONObject) sappz; + ap_payapply = createOrUpdatePayApply(it_list, fkBillNum); + if (ap_payapply == null) { + return handleErrorAndReturn(apiResultExt, "创建或更新付款申请单失败,详情查看日志", fkBillNum, + jsonBodyString +"\n" + sappzs.toJSONString()); + } + + // 将生成的付款申请单拆分明细 + BigDecimal amounts = applyAdjustbill.getAmount(); + if (amounts == null || amounts.toString().trim().isEmpty()) { + return handleErrorAndReturn(apiResultExt, "同步失败, 调整单号:" + fkBillNum + "的调整金额为空", + fkBillNum, jsonBodyString +"\n" + sappzs.toJSONString()); + } + try { + amounts = amounts.setScale(2, RoundingMode.HALF_UP); + } catch (NumberFormatException e) { + return handleErrorAndReturn(apiResultExt, "同步失败, 调整单号:" + fkBillNum + "的金额格式不正确: " + amounts, + fkBillNum, jsonBodyString +"\n" + sappzs.toJSONString()); + } + + DynamicObjectCollection collection = ap_payapply.getDynamicObjectCollection("entry"); + if (collection.isEmpty()) { + return handleErrorAndReturn(apiResultExt, "同步失败, 调整单号:" + fkBillNum + "无明细信息", + fkBillNum, jsonBodyString +"\n" + sappzs.toJSONString()); + } + + DynamicObject add = collection.get(0); + BigDecimal amount = add.getBigDecimal("e_applyamount"); + int comparisonResult = amount.compareTo(amounts); + + if (comparisonResult <= 0) { + return handleErrorAndReturn(apiResultExt, "同步失败, 调整单号:" + fkBillNum + + "的调整金额大于等于分录未调整过的申请金额", fkBillNum, jsonBodyString +"\n" + sappzs.toJSONString()); + } + // 分录申请金额大于调整金额,可拆 由于新增,所以不需要考虑状态直接拆 difference(拆完剩余金额) + BigDecimal difference = amount.subtract(amounts); + add.set("e_applyamount", difference); // 拆完剩余金额 + add.set("e_approvedamt", difference); // 同步核准金额 + + // 复制行 ,不考虑重复拆() + cloneEntryRow(add, collection, amounts, applyAdjustbill.getFkBillNum()); + + // 标记付款申请___来源调整单 + ap_payapply.set("shjh_sourceadjustment", true); + + // 保存、提交和审核付款申请单 + if (!processPayApply(ap_payapply, fkBillNum, jsonBodyString)) { + return handleErrorAndReturn(apiResultExt, "处理付款申请单失败,详情查看日志(136)", + fkBillNum, jsonBodyString +"\n" + sappzs.toJSONString()); + } + //成功 + return handleSuccessAndReturn(ap_payapply, apiResultExt,fkBillNum, jsonBodyString +"\n" + sappzs.toJSONString()); + } + } else { // 存在 DynamicObjectCollection collection = ap_payapply.getDynamicObjectCollection("entry"); if (collection.isEmpty()) { - return handleErrorAndReturn("同步失败, 调整单号:" + fkBillNum + "无明细信息", fkBillNum, null); + return handleErrorAndReturn(apiResultExt, "同步失败, 调整单号:" + fkBillNum + "无明细信息", fkBillNum, jsonBodyString); } // 拆分明细 BigDecimal amounts = applyAdjustbill.getAmount(); if (amounts == null || amounts.toString().trim().isEmpty()) { - return handleErrorAndReturn("同步失败, 调整单号:" + fkBillNum + "的调整金额为空", fkBillNum, null); + return handleErrorAndReturn(apiResultExt, "同步失败, 调整单号:" + fkBillNum + "的调整金额为空", fkBillNum, jsonBodyString); } try { amounts = amounts.setScale(2, RoundingMode.HALF_UP); } catch (NumberFormatException e) { - return handleErrorAndReturn("同步失败, 调整单号:" + fkBillNum + "的金额格式不正确: " + amounts, fkBillNum, null); + return handleErrorAndReturn(apiResultExt, "同步失败, 调整单号:" + fkBillNum + "的金额格式不正确: " + amounts, fkBillNum, jsonBodyString); } // 付款申请单有无标记? @@ -163,7 +176,7 @@ public class ApplyAdjustBillControler { QCP.equals, ap_payapply.getString("billno"))}); if (null != psd_schedulebill) { // 存在排程,返回日志,终止 - return handleErrorAndReturn("同步失败, 调整单号:" + fkBillNum + "已进入排程处理", fkBillNum, jsonBodyString); + return handleErrorAndReturn(apiResultExt, "同步失败, 调整单号:" + fkBillNum + "已进入排程处理", fkBillNum, jsonBodyString); } // 不存在排程,更新拆分明细和标记(CNY20+CNY80) @@ -185,19 +198,18 @@ public class ApplyAdjustBillControler { // 保存付款申请单 if (!processPayApplys(ap_payapply, fkBillNum, jsonBodyString)) { - return CustomApiResult.fail("400", "处理付款申请单失败,详情查看日志"); + return handleErrorAndReturn(apiResultExt, "处理付款申请单失败,详情查看日志(194)", fkBillNum, jsonBodyString); + } - log.error("审核成功,费控调整单号:" + fkBillNum); - JhzjUtils.saveLog(fkBillNum, Apimenthod, jsonBodyString, null, true, "API"); - return CustomApiResult.success(null); - }else { + //成功 + return handleSuccessAndReturn(ap_payapply, apiResultExt,fkBillNum, jsonBodyString); + } else { // 调整金额大于分录未调整过的申请金额,反馈无法处理 - return handleErrorAndReturn("同步失败, 调整单号:" + fkBillNum + "的调整金额大于分录未调整过的申请金额", fkBillNum, jsonBodyString); + return handleErrorAndReturn(apiResultExt, "同步失败, 调整单号:" + fkBillNum + "的调整金额大于等于分录未调整过的申请金额", fkBillNum, jsonBodyString); } - } - else { - // 已标记 付款申请单剩余未调整金额? seq根据size优化,根据单号为空的分录行进行拆分 + } else { + // 已标记 付款申请单剩余未调整金额? seq根据size优化,根据单号为空的分录行进行拆分(根据首行拆分) // CNY20>剩余未调整,反馈无法处理 // CNY20<=剩余未调整(假设CNY50) 更新拆分明细(CNY20+CNY30) // 不存在排程,更新拆分明细和标记(CNY20+CNY80) @@ -225,33 +237,27 @@ public class ApplyAdjustBillControler { // 保存付款申请单 if (!processPayApplys(ap_payapply, fkBillNum, jsonBodyString)) { - return CustomApiResult.fail("400", "处理付款申请单失败,详情查看日志"); + return handleErrorAndReturn(apiResultExt, "处理付款申请单失败,详情查看日志(235)", fkBillNum, jsonBodyString); } - log.error("审核成功,费控调整单号:" + fkBillNum); - JhzjUtils.saveLog(fkBillNum, Apimenthod, jsonBodyString, null, true, "API"); - ApiResult customApiResult = new ApiResult(""); - HashMap map = new HashMap<>(); - customApiResult.setHeaders(map); - customApiResult.getHeaders().put("billno",fkBillNum); - customApiResult.getHeaders().put("billid",""+ap_payapply.getPkValue()); - return CustomApiResult.success(customApiResult); - }else { + //成功 + return handleSuccessAndReturn(ap_payapply, apiResultExt,fkBillNum, jsonBodyString); + } else { // 调整金额大于分录未调整过的申请金额,反馈无法处理 - return handleErrorAndReturn("同步失败, 调整单号:" + fkBillNum + "的调整金额大于分录未调整过的申请金额", fkBillNum, jsonBodyString); + return handleErrorAndReturn(apiResultExt, "同步失败, 调整单号:" + fkBillNum + "的调整金额大于分录未调整过的申请金额", fkBillNum, jsonBodyString); } } } } } - return CustomApiResult.success(null); + return handleErrorAndReturn(apiResultExt, "同步失败(250), 调整单号:" + fkBillNum , fkBillNum, jsonBodyString); } /** - * 调取SAP凭证接口 + * 调取SAP凭证接口 */ - private static JSONArray querySapPz(ApplyAdjustBillModel applyAdjustbill){ + private static JSONArray querySapPz(ApplyAdjustBillModel applyAdjustbill) { JSONArray IT_LIST = new JSONArray(); // 添加公司过滤条件 addFilterCondition(IT_LIST, "BUKRS", applyAdjustbill.getCompanyNum(), applyAdjustbill.getCompanyNum()); @@ -276,8 +282,9 @@ public class ApplyAdjustBillControler { /** * 处理付款申请单的保存、提交和审核操作 - * @param ap_payapply 付款申请单对象 - * @param fkBillNum 费控单据编号 + * + * @param ap_payapply 付款申请单对象 + * @param fkBillNum 费控单据编号 * @param jsonBodyString 入参JSON字符串 * @return 操作是否成功 */ @@ -311,8 +318,9 @@ public class ApplyAdjustBillControler { /** * 处理付款申请单的保存操作 - * @param ap_payapply 付款申请单对象 - * @param fkBillNum 费控单据编号 + * + * @param ap_payapply 付款申请单对象 + * @param fkBillNum 费控单据编号 * @param jsonBodyString 入参JSON字符串 * @return 操作是否成功 */ @@ -356,7 +364,7 @@ public class ApplyAdjustBillControler { newRow.set("e_closestatus", source.get("e_closestatus")); // 设置特定属性 - newRow.set("seq", size+1); + newRow.set("seq", size + 1); newRow.set("e_applyamount", amounts); // 调整金额 newRow.set("e_approvedamt", amounts); // 核准金额 newRow.set("shjh_applyadjustcode", fkBillNum); // 付款调整单号 @@ -366,6 +374,7 @@ public class ApplyAdjustBillControler { /** * 根据公司编号加载组织信息 + * * @param companyNum 公司编号 * @return 组织信息的动态对象 */ @@ -380,7 +389,7 @@ public class ApplyAdjustBillControler { * @param it_list SAP查到的凭证信息 * @return 付款申请单的动态对象 */ - private DynamicObject createOrUpdatePayApply(JSONObject it_list,String fkBillNum) { + private DynamicObject createOrUpdatePayApply(JSONObject it_list, String fkBillNum) { String orgNum = it_list.getString("BUKRS");//公司编号,"公司代码 String voucheryear = it_list.getString("GJAHR");//会计年度,会计年度 String voucherentrynum = it_list.getString("BUZEI");//会计科目行项目号,行编号 @@ -419,7 +428,7 @@ public class ApplyAdjustBillControler { if (StringUtils.isNotEmpty(kunnr)) { asstacttype = "客户"; asstact = kunnr; - }else { + } else { asstacttype = "供应商"; asstact = lifnr; } @@ -807,16 +816,24 @@ public class ApplyAdjustBillControler { } /** - * 处理错误并返回失败结果 - * + * 处理错误日志 * @param errorMessage 错误信息 * @param fkBillNum 费控单据编号 * @param jsonBodyString 入参JSON字符串 - * @return 失败的CustomApiResult对象 */ - private CustomApiResult handleErrorAndReturn(String errorMessage, String fkBillNum, String jsonBodyString) { - handleError(errorMessage, fkBillNum, jsonBodyString); - return CustomApiResult.fail("400", errorMessage); + private static void handleError(String errorMessage, String fkBillNum, String jsonBodyString) { + log.error(errorMessage); + // 可以添加更多的错误处理逻辑,如记录到数据库等 + JhzjUtils.saveLog(fkBillNum, Apimenthod, jsonBodyString, errorMessage, false, "API"); + } + + /** + * 处理成功日志 + */ + private static void handleSuccess(String successMessage, String fkBillNum, String jsonBodyString) { + log.error(successMessage); + // 可以添加更多的错误处理逻辑,如记录到数据库等 + JhzjUtils.saveLog(fkBillNum, Apimenthod, jsonBodyString, successMessage, true, "API"); } /** @@ -833,19 +850,6 @@ public class ApplyAdjustBillControler { CustomApiResult.fail("400", errorMessage); } - /** - * 处理错误日志 - * - * @param errorMessage 错误信息 - * @param fkBillNum 费控单据编号 - * @param jsonBodyString 入参JSON字符串 - */ - private void handleError(String errorMessage, String fkBillNum, String jsonBodyString) { - log.error(errorMessage); - // 可以添加更多的错误处理逻辑,如记录到数据库等 - JhzjUtils.saveLog(fkBillNum, Apimenthod, jsonBodyString, errorMessage, false, "API"); - } - /** * 获取第一个错误信息 * @@ -863,4 +867,32 @@ public class ApplyAdjustBillControler { } return "未知错误"; } + + /** + * 处理错误并返回失败结果 + * + * @return 失败的CustomApiResult对象 + */ + public static CustomApiResult handleErrorAndReturn(ApiResultPayAdjustExt apiResultExt, String errorMessage, String fkBillNum, String jsonBodyString) { + handleError(errorMessage, fkBillNum, jsonBodyString); + apiResultExt.setErrorCode("400"); + apiResultExt.setStatus(false); + apiResultExt.setMessage(errorMessage); + return CustomApiResult.success(apiResultExt); + } + + /** + * 处理成功并返回成功结果 + * + * @return 成功的CustomApiResult对象 + */ + public static CustomApiResult handleSuccessAndReturn(DynamicObject ap_payapply, ApiResultPayAdjustExt apiResultExt,String fkBillNum, String jsonBodyString) { + handleSuccess("费控调整单号:" + fkBillNum,fkBillNum, jsonBodyString); + apiResultExt.setErrorCode("0"); + apiResultExt.setStatus(true); + apiResultExt.setMessage(null); + apiResultExt.setKdPayBillID("" + ap_payapply.getPkValue()); + apiResultExt.setKdPayBillNo(ap_payapply.getString("billno")); + return CustomApiResult.success(apiResultExt); + } } \ No newline at end of file diff --git a/main/java/shjh/jhzj7/fi/fi/webapi/model/ApiResultPayAdjustExt.java b/main/java/shjh/jhzj7/fi/fi/webapi/model/ApiResultPayAdjustExt.java new file mode 100644 index 0000000..d5bfc2e --- /dev/null +++ b/main/java/shjh/jhzj7/fi/fi/webapi/model/ApiResultPayAdjustExt.java @@ -0,0 +1,64 @@ +package shjh.jhzj7.fi.fi.webapi.model; + +import kd.bos.openapi.common.custom.annotation.ApiModel; +import kd.bos.openapi.common.custom.annotation.ApiParam; + +import java.io.Serializable; + +/** + * 付款调整接口返回模型 + */ +@ApiModel +public class ApiResultPayAdjustExt implements Serializable { + + @ApiParam("接口访问是否成功") + private Boolean status; + @ApiParam("错误码") + private String errorCode; + @ApiParam("接口调用错误信息") + private String message; + @ApiParam("金蝶付款单ID") + private String kdPayBillID; + @ApiParam("金蝶付款单号") + private String kdPayBillNo; + + public Boolean getStatus() { + return status; + } + + public void setStatus(Boolean status) { + this.status = status; + } + + public String getErrorCode() { + return errorCode; + } + + public void setErrorCode(String errorCode) { + this.errorCode = errorCode; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public String getKdPayBillID() { + return kdPayBillID; + } + + public void setKdPayBillID(String kdPayBillID) { + this.kdPayBillID = kdPayBillID; + } + + public String getKdPayBillNo() { + return kdPayBillNo; + } + + public void setKdPayBillNo(String kdPayBillNo) { + this.kdPayBillNo = kdPayBillNo; + } +}