1.付款调整接口返回值优化

--s
This commit is contained in:
weiyunlong 2025-04-07 11:30:24 +08:00
parent f1fa766615
commit 4186bd47ae
2 changed files with 205 additions and 109 deletions

View File

@ -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<ApiResult> applybill_adjust(@NotNull @Valid @ApiRequestBody(value = "入参json格式数据") ApplyAdjustBillModel applyAdjustbill) {
public CustomApiResult<ApiResultPayAdjustExt> 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<String, String> 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<ApiResult> 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<ApiResultPayAdjustExt> 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<ApiResultPayAdjustExt> 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);
}
}

View File

@ -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;
}
}