1.ut优化

2.推送费控字段确认,以及成功返回方式
  3.锁定解锁接口id有校验,字段确认,
  4.凭证查询接口字段确认
  5.源单是费控,不允许拆分和合并(依据)
  6.接口返回值
  7.排程校验

--s
This commit is contained in:
weiyunlong 2025-03-12 18:04:47 +08:00
parent f72ae66203
commit 690e630150
8 changed files with 196 additions and 109 deletions

View File

@ -110,20 +110,21 @@ public class SappzFormPlugin extends AbstractFormPlugin {
// size = 5000; // size = 5000;
// } // }
for (int i = 0; i < IT_ITEMs.size(); i++) { for (int i = 0; i < IT_ITEMs.size(); i++) {
JSONObject it_list = (JSONObject)IT_ITEMs.get(i); // for (int i = 0; i < IT_ITEMs.size(); i++) {
JSONObject it_list = (JSONObject) IT_ITEMs.get(i);
DynamicObject add = shjhEntryentity.addNew(); DynamicObject add = shjhEntryentity.addNew();
this.getModel().setValue("shjh_orgnumber", it_list.getString("BUKRS"), i);//公司编号,"公司代码 this.getModel().setValue("shjh_orgnumber", it_list.getString("BUKRS"), i);//公司编号,"公司代码
this.getModel().setValue("shjh_vouchernumber", it_list.getString("BELNR"), i);//凭证号,会计凭证编号 this.getModel().setValue("shjh_vouchernumber", it_list.getString("BELNR"), i);//凭证号,会计凭证编号
this.getModel().setValue("shjh_accountingyear", it_list.getString("GJAHR"), i);//会计年度,会计年度 this.getModel().setValue("shjh_accountingyear", it_list.getString("GJAHR"), i);//会计年度,会计年度
this.getModel().setValue("shjh_accountingsubject", it_list.getString("SAKNR"), i);//todo:会计科目:1001,总帐科目编号 this.getModel().setValue("shjh_accountingsubject", it_list.getString("SAKNR"), i);//会计科目:1001,总帐科目编号
this.getModel().setValue("shjh_accountingsubjecline", it_list.getString("EBELP"), i);//会计科目行项目号,采购凭证的项目编号 this.getModel().setValue("shjh_accountingsubjecline", it_list.getString("EBELP"), i);//会计科目行项目号,采购凭证的项目编号
this.getModel().setValue("shjh_outstandingamount", new BigDecimal(it_list.getString("WRBTR")), i);//未清金额,凭证货币金额 this.getModel().setValue("shjh_outstandingamount", new BigDecimal(it_list.getString("WRBTR")), i);//未清金额,凭证货币金额
BigDecimal KURSF = new BigDecimal(it_list.getString("KURSF")); BigDecimal KURSF = new BigDecimal(it_list.getString("KURSF"));
if (KURSF.compareTo(BigDecimal.ZERO) == 0) { if (KURSF.compareTo(BigDecimal.ZERO) == 0) {
KURSF = BigDecimal.ONE; KURSF = BigDecimal.ONE;
} }
this.getModel().setValue("shjh_exchangerate",KURSF, i);//汇率 this.getModel().setValue("shjh_exchangerate", KURSF, i);//汇率
this.getModel().setValue("shjh_applyforconversionof",new BigDecimal(it_list.getString("DMBTR")), i);//申请金额折结算币别,按本位币计的金额 this.getModel().setValue("shjh_applyforconversionof", new BigDecimal(it_list.getString("DMBTR")), i);//申请金额折结算币别,按本位币计的金额
String FAEDT = it_list.getString("FAEDT"); String FAEDT = it_list.getString("FAEDT");
if (StringUtils.isNotEmpty(FAEDT)) { if (StringUtils.isNotEmpty(FAEDT)) {
Date date = StrToDate(FAEDT); Date date = StrToDate(FAEDT);
@ -142,17 +143,17 @@ public class SappzFormPlugin extends AbstractFormPlugin {
String ZFBDT = it_list.getString("ZFBDT"); String ZFBDT = it_list.getString("ZFBDT");
if (StringUtils.isNotEmpty(ZFBDT)) { if (StringUtils.isNotEmpty(ZFBDT)) {
Date date = StrToDate(ZFBDT); Date date = StrToDate(ZFBDT);
this.getModel().setValue("shjh_basedate", date, i);//基准日期,用于到期日计算的基准日期 this.getModel().setValue("shjh_basedate", date, i);//基准日期,用于到期日计算的基准日期
} }
// this.getModel().setValue("shjh_payee", "供应商", i);//todo:往来类型 // this.getModel().setValue("shjh_payee", "供应商", i);//todo:往来类型
// this.getModel().setValue("shjh_payeebanknum", it_list.getString("ZWLZH"), i);//todo:往来户名称 // this.getModel().setValue("shjh_payeebanknum", it_list.getString("ZWLZH"), i);//todo:往来户名称
this.getModel().setValue("shjh_payee", "供应商", i);//往来类型 this.getModel().setValue("shjh_payee", "供应商", i);//往来类型
this.getModel().setValue("shjh_payeebanknum", "上海家化销售有限公司", i);//往来户名称 this.getModel().setValue("shjh_payeebanknum", "上海家化销售有限公司", i);//往来户名称
this.getModel().setValue("shjh_description",it_list.getString("BVTYP") , i);//合作银行类型.合作银行类型 this.getModel().setValue("shjh_description", it_list.getString("BVTYP"), i);//合作银行类型.合作银行类型
this.getModel().setValue("shjh_reasoncode", "014", i);//todo:原因码 this.getModel().setValue("shjh_reasoncode", "014", i);//todo:原因码
this.getModel().setValue("shjh_classificationoffund", payablevouchernumber, i);//todo:资金计划分类 this.getModel().setValue("shjh_classificationoffund", payablevouchernumber, i);//todo:资金计划分类
this.getModel().setValue("shjh_secondarydept", it_list.getString("ZREQ_DEPT"), i);//二级部门,需求部门 this.getModel().setValue("shjh_secondarydept", it_list.getString("ZREQ_DEPT"), i);//二级部门,需求部门
this.getModel().setValue("shjh_procurementeam", it_list.getString("EKGRP"), i);//采购组 this.getModel().setValue("shjh_procurementeam", it_list.getString("EKGRP"), i);//采购组
this.getModel().setValue("shjh_isselfprocurment", it_list.getString("ZZXCG_FLAG"), i);//todo:是否自行采购 this.getModel().setValue("shjh_isselfprocurment", it_list.getString("ZZXCG_FLAG"), i);//todo:是否自行采购
this.getModel().setValue("shjh_paymentcurrency", it_list.getString("WAERS"), i);//付款币别编号CNY,货币码 this.getModel().setValue("shjh_paymentcurrency", it_list.getString("WAERS"), i);//付款币别编号CNY,货币码
this.getModel().setValue("shjh_settlementcurrency", it_list.getString("WAERS"), i);//结算币别编号,货币码 this.getModel().setValue("shjh_settlementcurrency", it_list.getString("WAERS"), i);//结算币别编号,货币码
@ -161,6 +162,8 @@ public class SappzFormPlugin extends AbstractFormPlugin {
this.getView().updateView("shjh_entryentity"); this.getView().updateView("shjh_entryentity");
} }
} }
} else {
this.getView().showMessage("查询失败:" + result.getString("msg"));
} }
break; break;
case "confirm": case "confirm":
@ -572,7 +575,7 @@ public class SappzFormPlugin extends AbstractFormPlugin {
} }
private Date StrToDate(String strDate){ public static Date StrToDate(String strDate) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try { try {
return sdf.parse(strDate); return sdf.parse(strDate);
@ -621,7 +624,7 @@ public class SappzFormPlugin extends AbstractFormPlugin {
} }
// 添加过滤条件到IT_LIST的方法 // 添加过滤条件到IT_LIST的方法
private void addFilterCondition(JSONArray IT_LIST, String field, String low, String high) { public static void addFilterCondition(JSONArray IT_LIST, String field, String low, String high) {
JSONObject jsonObject = new JSONObject(); JSONObject jsonObject = new JSONObject();
jsonObject.put("FIELD", field); // 字段 jsonObject.put("FIELD", field); // 字段
jsonObject.put("SIGN", "I"); // I:包含 E排除 jsonObject.put("SIGN", "I"); // I:包含 E排除

View File

@ -7,6 +7,7 @@ import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.entity.operate.result.OperateErrorInfo; import kd.bos.entity.operate.result.OperateErrorInfo;
import kd.bos.entity.plugin.AbstractOperationServicePlugIn; import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
import kd.bos.entity.plugin.args.BeforeOperationArgs; import kd.bos.entity.plugin.args.BeforeOperationArgs;
import kd.bos.servicehelper.BusinessDataServiceHelper;
import kd.bos.servicehelper.operation.SaveServiceHelper; import kd.bos.servicehelper.operation.SaveServiceHelper;
import kd.sdk.plugin.Plugin; import kd.sdk.plugin.Plugin;
@ -23,20 +24,26 @@ public class PayApplyDeleteOperation extends AbstractOperationServicePlugIn impl
//提交失败调取删除,删除判断单据状态暂存来源系统sap已锁定 才可以执行删除逻辑-->调解锁接口 //提交失败调取删除,删除判断单据状态暂存来源系统sap已锁定 才可以执行删除逻辑-->调解锁接口
DynamicObject[] dataEntities = e.getDataEntities(); DynamicObject[] dataEntities = e.getDataEntities();
for (DynamicObject bill : dataEntities) { for (DynamicObject bill : dataEntities) {
bill = BusinessDataServiceHelper.loadSingle(bill.getPkValue(),"ap_payapply");
String billstatus = bill.getString("billstatus");//获取单据状态:暂存A String billstatus = bill.getString("billstatus");//获取单据状态:暂存A
String sourcesystem = bill.getString("shjh_sourcesystem");//来源系统:SAP_A String sourcesystem = bill.getString("shjh_sourcesystem");//来源系统:SAP_A
boolean shjhSapwhetherlocking = bill.getBoolean("shjh_sapwhetherlocking");//SAP是否锁定:锁定 boolean shjhSapwhetherlocking = bill.getBoolean("shjh_sapwhetherlocking");//SAP是否锁定:锁定
if ("A".equals(billstatus) && "A".equals(sourcesystem)) { if ("A".equals(billstatus) && "A".equals(sourcesystem)) {
if (!shjhSapwhetherlocking) { // if (!shjhSapwhetherlocking) {
e.setCancel(true); // OperateErrorInfo operateErrorInfo = new OperateErrorInfo();
return; // operateErrorInfo.setMessage("付款申请单:"+bill.getString("billno")+"状态解锁失败SAP状态未锁定");
} // operateErrorInfo.setErrorLevel(ErrorLevel.Error.name());
// operateErrorInfo.setPkValue(bill.getPkValue());
// this.operationResult.addErrorInfo(operateErrorInfo);
// e.setCancel(true);
// return;
// }
//调解锁接口 //调解锁接口
JSONArray IT_INPUT = new JSONArray(); JSONArray IT_INPUT = new JSONArray();
JSONObject jsonObject = new JSONObject(); JSONObject jsonObject = new JSONObject();
String FM_CompanyCode = ""; String FM_CompanyCode = "";
if (null!= bill.getDynamicObject("openorg")) { if (null!= bill.getDynamicObject("applyorg")) {
FM_CompanyCode = bill.getDynamicObject("openorg").getString("number");//公司编码_申请付款组织 FM_CompanyCode = bill.getDynamicObject("applyorg").getString("number");//公司编码_申请付款组织
} }
jsonObject.put("bukrs",FM_CompanyCode);//公司代码_申请付款组织 jsonObject.put("bukrs",FM_CompanyCode);//公司代码_申请付款组织
jsonObject.put("belnr", bill.getString("shjh_vouchernum"));//会计凭证编号_SAP应付凭证号 jsonObject.put("belnr", bill.getString("shjh_vouchernum"));//会计凭证编号_SAP应付凭证号
@ -46,7 +53,8 @@ public class PayApplyDeleteOperation extends AbstractOperationServicePlugIn impl
if (null!= bill.getDynamicObject("creator")) { if (null!= bill.getDynamicObject("creator")) {
cname = bill.getDynamicObject("creator").getString("number");//创建人工号_申请人 cname = bill.getDynamicObject("creator").getString("number");//创建人工号_申请人
} }
jsonObject.put("cname", cname);//创建人工号 // jsonObject.put("cname", cname);//创建人工号
jsonObject.put("cname", "GH001657");//todo:创建人工号
jsonObject.put("zjddjid", ""+bill.getPkValue());//金蝶单据ID jsonObject.put("zjddjid", ""+bill.getPkValue());//金蝶单据ID
jsonObject.put("zjddjbh", bill.getString("billno"));//金蝶单据编号 jsonObject.put("zjddjbh", bill.getString("billno"));//金蝶单据编号
IT_INPUT.add(jsonObject); IT_INPUT.add(jsonObject);

View File

@ -7,6 +7,7 @@ import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.entity.operate.result.OperateErrorInfo; import kd.bos.entity.operate.result.OperateErrorInfo;
import kd.bos.entity.plugin.AbstractOperationServicePlugIn; import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
import kd.bos.entity.plugin.args.AfterOperationArgs; import kd.bos.entity.plugin.args.AfterOperationArgs;
import kd.bos.servicehelper.BusinessDataServiceHelper;
import kd.bos.servicehelper.operation.SaveServiceHelper; import kd.bos.servicehelper.operation.SaveServiceHelper;
import kd.sdk.plugin.Plugin; import kd.sdk.plugin.Plugin;
@ -24,26 +25,28 @@ public class PayApplySaveOperation extends AbstractOperationServicePlugIn implem
//保存插件之后来源类型为sap且未锁定才去锁,并且更新状态 //保存插件之后来源类型为sap且未锁定才去锁,并且更新状态
DynamicObject[] dataEntities = e.getDataEntities(); DynamicObject[] dataEntities = e.getDataEntities();
for (DynamicObject bill : dataEntities) { for (DynamicObject bill : dataEntities) {
bill = BusinessDataServiceHelper.loadSingle(bill.getPkValue(),"ap_payapply");
String sourcesystem = bill.getString("shjh_sourcesystem");//来源系统:SAP String sourcesystem = bill.getString("shjh_sourcesystem");//来源系统:SAP
boolean shjhSapwhetherlocking = bill.getBoolean("shjh_sapwhetherlocking");//SAP是否锁定:未锁定 boolean shjhSapwhetherlocking = bill.getBoolean("shjh_sapwhetherlocking");//SAP是否锁定:未锁定
if ("A".equals(sourcesystem) && !shjhSapwhetherlocking) { if ("A".equals(sourcesystem) && !shjhSapwhetherlocking) {
JSONArray IT_INPUT = new JSONArray(); JSONArray IT_INPUT = new JSONArray();
JSONObject jsonObject = new JSONObject(); JSONObject jsonObject = new JSONObject();
String FM_CompanyCode = ""; String FM_CompanyCode = "";
if (null!= bill.getDynamicObject("openorg")) { if (null!= bill.getDynamicObject("applyorg")) {
FM_CompanyCode = bill.getDynamicObject("openorg").getString("number");//公司编码_申请付款组织 FM_CompanyCode = bill.getDynamicObject("applyorg").getString("number");//公司编码_申请付款组织
} }
jsonObject.put("bukrs",FM_CompanyCode);//公司代码_申请付款组织 jsonObject.put("BUKRS",FM_CompanyCode);//公司代码_申请付款组织
jsonObject.put("belnr", bill.getString("shjh_vouchernum"));//会计凭证编号_SAP应付凭证号 jsonObject.put("BELNR", bill.getString("shjh_vouchernum"));//会计凭证编号_SAP应付凭证号
jsonObject.put("gjahr", bill.getString("shjh_voucheryear"));//会计年度_SAP应付凭证会计年度 jsonObject.put("GJAHR", bill.getString("shjh_voucheryear"));//会计年度_SAP应付凭证会计年度
jsonObject.put("stasus", "01");//状态 01锁定02解锁03关闭04退单05作废 jsonObject.put("STASUS", "01");//状态 01锁定02解锁03关闭04退单05作废
String cname = ""; String cname = "";
if (null!= bill.getDynamicObject("creator")) { if (null!= bill.getDynamicObject("creator")) {
cname = bill.getDynamicObject("creator").getString("number");//创建人工号_申请人 cname = bill.getDynamicObject("creator").getString("number");//创建人工号_申请人
} }
jsonObject.put("cname", cname);//创建人工号 // jsonObject.put("cname", cname);//todo:创建人工号
jsonObject.put("zjddjid", ""+bill.getPkValue());//金蝶单据ID jsonObject.put("CNAME", "GH001657");//todo:创建人工号
jsonObject.put("zjddjbh", bill.getString("billno"));//金蝶单据编号 jsonObject.put("ZJDDJID", ""+bill.getPkValue());//金蝶单据ID
jsonObject.put("ZJDDJBH", bill.getString("billno"));//金蝶单据编号
IT_INPUT.add(jsonObject); IT_INPUT.add(jsonObject);
JSONObject jsonObjects = unlocked_status(IT_INPUT,bill.getString("billno")); JSONObject jsonObjects = unlocked_status(IT_INPUT,bill.getString("billno"));

View File

@ -5,6 +5,7 @@ import kd.bos.entity.ExtendedDataEntity;
import kd.bos.entity.plugin.AbstractOperationServicePlugIn; import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
import kd.bos.entity.plugin.AddValidatorsEventArgs; import kd.bos.entity.plugin.AddValidatorsEventArgs;
import kd.bos.entity.validate.AbstractValidator; import kd.bos.entity.validate.AbstractValidator;
import kd.bos.servicehelper.BusinessDataServiceHelper;
import kd.sdk.plugin.Plugin; import kd.sdk.plugin.Plugin;
public class PayApplySubmitOperation extends AbstractOperationServicePlugIn implements Plugin { public class PayApplySubmitOperation extends AbstractOperationServicePlugIn implements Plugin {
@ -21,6 +22,7 @@ public class PayApplySubmitOperation extends AbstractOperationServicePlugIn impl
ExtendedDataEntity[] entities = this.getDataEntities(); ExtendedDataEntity[] entities = this.getDataEntities();
for (ExtendedDataEntity entity : entities) { for (ExtendedDataEntity entity : entities) {
DynamicObject bill = entity.getDataEntity(); DynamicObject bill = entity.getDataEntity();
bill = BusinessDataServiceHelper.loadSingle(bill.getPkValue(),"ap_payapply");
String sourcesystem = bill.getString("shjh_sourcesystem");//来源系统:SAP_A String sourcesystem = bill.getString("shjh_sourcesystem");//来源系统:SAP_A
boolean shjhSapwhetherlocking = bill.getBoolean("shjh_sapwhetherlocking");//SAP是否锁定:锁定 boolean shjhSapwhetherlocking = bill.getBoolean("shjh_sapwhetherlocking");//SAP是否锁定:锁定
if ("A".equals(sourcesystem)) { if ("A".equals(sourcesystem)) {

View File

@ -11,6 +11,7 @@ import kd.bos.entity.plugin.args.AfterOperationArgs;
import kd.bos.orm.query.QCP; import kd.bos.orm.query.QCP;
import kd.bos.orm.query.QFilter; import kd.bos.orm.query.QFilter;
import kd.bos.servicehelper.BusinessDataServiceHelper; import kd.bos.servicehelper.BusinessDataServiceHelper;
import kd.bos.servicehelper.operation.SaveServiceHelper;
import kd.sdk.plugin.Plugin; import kd.sdk.plugin.Plugin;
import java.time.LocalDate; import java.time.LocalDate;
@ -51,7 +52,8 @@ public class PaybillOperation extends AbstractOperationServicePlugIn implements
operateErrorInfo.setPkValue(bill.getPkValue()); operateErrorInfo.setPkValue(bill.getPkValue());
this.operationResult.addErrorInfo(operateErrorInfo); this.operationResult.addErrorInfo(operateErrorInfo);
}else { }else {
//todo:表头更新状态 bill.set("shjh_ispushfk",true);
SaveServiceHelper.save(new DynamicObject[]{bill});
this.operationResult.addSuccessPkId(bill.getPkValue()); this.operationResult.addSuccessPkId(bill.getPkValue());
} }
} }

View File

@ -2,11 +2,14 @@ package shjh.jhzj7.fi.fi.plugin.task;
import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.sap.db.jdbc.packet.ErrorLevel;
import kd.bos.context.RequestContext; import kd.bos.context.RequestContext;
import kd.bos.dataentity.entity.DynamicObject; import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.entity.operate.result.OperateErrorInfo;
import kd.bos.exception.KDException; import kd.bos.exception.KDException;
import kd.bos.schedule.executor.AbstractTask; import kd.bos.schedule.executor.AbstractTask;
import kd.bos.servicehelper.BusinessDataServiceHelper; import kd.bos.servicehelper.BusinessDataServiceHelper;
import kd.bos.servicehelper.operation.SaveServiceHelper;
import kd.sdk.plugin.Plugin; import kd.sdk.plugin.Plugin;
import java.util.Map; import java.util.Map;
@ -28,8 +31,14 @@ public class PaybillPushFkTask extends AbstractTask implements Plugin {
JSONArray body = buildBody(paybill); JSONArray body = buildBody(paybill);
data.put("header", header); data.put("header", header);
data.put("body", body); data.put("body", body);
withholding_billing(data, paybill.getString("billno")); JSONObject jsonObject = withholding_billing(data, paybill.getString("billno"));
//todo:成功:表头更新状态 String code = (String)jsonObject.get("code");
if (!"0".equals(code)) {
//todo:失败:记录错误信息
}else {
paybill.set("shjh_ispushfk",true);
SaveServiceHelper.save(new DynamicObject[]{paybill});
}
} }
} }
} }

View File

@ -78,7 +78,7 @@ public class SapUtils {
pendingsBody.put("requestTime", dates);//请求时间,格式为yyyy-MM-dd HH:mm:ss.SSS pendingsBody.put("requestTime", dates);//请求时间,格式为yyyy-MM-dd HH:mm:ss.SSS
JSONObject data = new JSONObject(); JSONObject data = new JSONObject();
data.put("IT_INPUT",IT_INPUT); data.put("IT_LIST",IT_INPUT);
pendingsBody.put("data", data); pendingsBody.put("data", data);
return pendingsBody; return pendingsBody;
} }
@ -211,14 +211,14 @@ public class SapUtils {
String code = (String)jsonObject.get("code"); String code = (String)jsonObject.get("code");
if (!"0".equals(code)) { if (!"0".equals(code)) {
logger.info(apiName +"失败!"); logger.info(apiName +"失败!");
saveLog(apiName +(thirdPartyMap.get("billno").toString()), pendingsBody, jsonObject, false,apiName); saveLog( (thirdPartyMap.get("billno").toString()), pendingsBody, jsonObject, false,apiName);
return jsonObject; return jsonObject;
} }
handleResponse(jsonObject, pendingsBody, thirdPartyMap,apiName); handleResponse(jsonObject, pendingsBody, thirdPartyMap,apiName);
return com.alibaba.fastjson.JSONObject.parseObject(responseString); return com.alibaba.fastjson.JSONObject.parseObject(responseString);
}else { }else {
logger.info(apiName +"失败!"); logger.info(apiName +"失败!");
saveLog(apiName +(thirdPartyMap.get("billno").toString()), pendingsBody, null, false,apiName); saveLog( (thirdPartyMap.get("billno").toString()), pendingsBody, null, false,apiName);
} }
} catch (Exception e) { } catch (Exception e) {
handleException(e, pendingsBody, thirdPartyMap, jsonObject,apiName); handleException(e, pendingsBody, thirdPartyMap, jsonObject,apiName);
@ -251,9 +251,9 @@ public class SapUtils {
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"); String operResult = jsonObject.getString("code");
JSONObject jsonobject = jsonObject.getJSONObject("data"); JSONObject jsonobject = jsonObject.getJSONObject("data");
if (jsonobject == null || jsonobject.isEmpty()) { if (jsonobject == null&&!"0".equals(operResult)) {
logger.info(apiName + "失败!"); logger.info(apiName + "失败!");
saveLog(apiName + (thirdPartyMap.get("billno").toString()), pendingsBody, jsonObject, false,apiName); saveLog((thirdPartyMap.get("billno").toString()), pendingsBody, jsonObject, false,apiName);
return; return;
} }
@ -261,7 +261,7 @@ public class SapUtils {
// 记录日志 // 记录日志
logger.info(logMessage); logger.info(logMessage);
saveLog(apiName + (thirdPartyMap.get("billno").toString()), pendingsBody, jsonObject, true,apiName); saveLog((thirdPartyMap.get("billno").toString()), pendingsBody, jsonObject, true,apiName);
} }
/** /**
@ -276,7 +276,7 @@ public class SapUtils {
// 记录异常信息 // 记录异常信息
String errorMessage = String.format(apiName +"状态回写接口异常:%s", e.getMessage()); String errorMessage = String.format(apiName +"状态回写接口异常:%s", e.getMessage());
logger.error(errorMessage); logger.error(errorMessage);
saveLog(apiName + thirdPartyMap.get("billno").toString(), pendingsBody, jsonObject, false,apiName); saveLog(thirdPartyMap.get("billno").toString(), pendingsBody, jsonObject, false,apiName);
throw new RuntimeException(e); throw new RuntimeException(e);
} }

View File

@ -1,6 +1,7 @@
package shjh.jhzj7.fi.fi.webapi; package shjh.jhzj7.fi.fi.webapi;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONException; import com.alibaba.fastjson.JSONException;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.drew.lang.annotations.NotNull; import com.drew.lang.annotations.NotNull;
@ -9,6 +10,7 @@ import kd.bos.context.RequestContext;
import kd.bos.dataentity.OperateOption; import kd.bos.dataentity.OperateOption;
import kd.bos.dataentity.entity.DynamicObject; import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.dataentity.entity.DynamicObjectCollection; import kd.bos.dataentity.entity.DynamicObjectCollection;
import kd.bos.dataentity.utils.StringUtils;
import kd.bos.entity.operate.OperateOptionConst; import kd.bos.entity.operate.OperateOptionConst;
import kd.bos.entity.operate.result.OperateErrorInfo; import kd.bos.entity.operate.result.OperateErrorInfo;
import kd.bos.entity.operate.result.OperationResult; import kd.bos.entity.operate.result.OperationResult;
@ -31,11 +33,14 @@ import shjh.jhzj7.fi.fi.webapi.model.ApplyAdjustBillModel;
import javax.validation.Valid; import javax.validation.Valid;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.math.RoundingMode; import java.math.RoundingMode;
import java.text.SimpleDateFormat;
import java.util.Date; import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import static shjh.jhzj7.fi.fi.plugin.form.SappzFormPlugin.BD_ACCOUNTVIEW; import static kd.bos.login.utils.DateUtils.formatDate;
import static shjh.jhzj7.fi.fi.plugin.form.SappzFormPlugin.*;
import static shjh.jhzj7.fi.fi.utils.SapUtils.vouchers_payable;
import static shjh.jhzj7.fi.fi.webapi.ApplyBillControler.*; import static shjh.jhzj7.fi.fi.webapi.ApplyBillControler.*;
/** /**
@ -79,51 +84,59 @@ public class ApplyAdjustBillControler {
// 是否存在付款申请单 // 是否存在付款申请单
if (ap_payapply == null) { if (ap_payapply == null) {
// todo:不存在从SAP获取应付凭证,生成付款申请单 log.info("不存在从SAP获取应付凭证,生成付款申请单");
ap_payapply = createOrUpdatePayApply(applyAdjustbill, companyNum, voucherNum, year, voucherLineNum, org, fkBillNum); JSONArray sappzs = querySapPz(applyAdjustbill);
if (ap_payapply == null) { if (null != sappzs) {
return CustomApiResult.fail("400", "创建或更新付款申请单失败,详情查看日志"); 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(); BigDecimal amounts = applyAdjustbill.getAmount();
if (amounts == null || amounts.toString().trim().isEmpty()) { if (amounts == null || amounts.toString().trim().isEmpty()) {
return handleErrorAndReturn("同步失败, 调整单号:" + fkBillNum + "的调整金额为空", fkBillNum, null); return handleErrorAndReturn("同步失败, 调整单号:" + fkBillNum + "的调整金额为空", fkBillNum, null);
} }
try { try {
amounts = amounts.setScale(2, RoundingMode.HALF_UP); amounts = amounts.setScale(2, RoundingMode.HALF_UP);
} catch (NumberFormatException e) { } catch (NumberFormatException e) {
return handleErrorAndReturn("同步失败, 调整单号:" + fkBillNum + "的金额格式不正确: " + amounts, fkBillNum, null); return handleErrorAndReturn("同步失败, 调整单号:" + fkBillNum + "的金额格式不正确: " + amounts, fkBillNum, null);
} }
DynamicObjectCollection collection = ap_payapply.getDynamicObjectCollection("entry"); DynamicObjectCollection collection = ap_payapply.getDynamicObjectCollection("entry");
if (collection.isEmpty()) { if (collection.isEmpty()) {
return handleErrorAndReturn("同步失败, 调整单号:" + fkBillNum + "无明细信息", fkBillNum, null); return handleErrorAndReturn("同步失败, 调整单号:" + fkBillNum + "无明细信息", fkBillNum, null);
} }
DynamicObject add = collection.get(0); DynamicObject add = collection.get(0);
BigDecimal amount = add.getBigDecimal("e_applyamount"); BigDecimal amount = add.getBigDecimal("e_applyamount");
int comparisonResult = amount.compareTo(amounts); int comparisonResult = amount.compareTo(amounts);
if (comparisonResult > 0) { if (comparisonResult > 0) {
// 分录申请金额大于调整金额,可拆 由于新增,所以不需要考虑状态直接拆 difference(拆完剩余金额) // 分录申请金额大于调整金额,可拆 由于新增,所以不需要考虑状态直接拆 difference(拆完剩余金额)
BigDecimal difference = amount.subtract(amounts); BigDecimal difference = amount.subtract(amounts);
add.set("e_applyamount", difference); // 拆完剩余金额 add.set("e_applyamount", difference); // 拆完剩余金额
add.set("e_approvedamt", difference); // 同步核准金额 add.set("e_approvedamt", difference); // 同步核准金额
// 复制行 ,不考虑重复拆() // 复制行 ,不考虑重复拆()
cloneEntryRow(add, collection, amounts, applyAdjustbill.getFkBillNum()); cloneEntryRow(add, collection, amounts, applyAdjustbill.getFkBillNum());
// 标记付款申请___来源调整单 // 标记付款申请___来源调整单
// ap_payapply.set("shjh_sourceadjustment", true); ap_payapply.set("shjh_sourceadjustment", true);
// 保存提交和审核付款申请单 // 保存提交和审核付款申请单
if (!processPayApply(ap_payapply, fkBillNum, jsonBodyString)) { if (!processPayApply(ap_payapply, fkBillNum, jsonBodyString)) {
return CustomApiResult.fail("400", "处理付款申请单失败,详情查看日志"); return CustomApiResult.fail("400", "处理付款申请单失败,详情查看日志");
}
log.error("审核成功,费控调整单号:" + fkBillNum);
JhzjUtils.saveLog(fkBillNum, Apimenthod, jsonBodyString, null, true, "API");
}
} }
log.error("审核成功,费控调整单号:" + fkBillNum);
JhzjUtils.saveLog(fkBillNum, Apimenthod, jsonBodyString, null, true, "API");
} }
} }
else { else {
@ -238,6 +251,32 @@ public class ApplyAdjustBillControler {
return CustomApiResult.success(null); return CustomApiResult.success(null);
} }
/**
* 调取SAP凭证接口
*/
private static JSONArray querySapPz(ApplyAdjustBillModel applyAdjustbill){
JSONArray IT_LIST = new JSONArray();
// 添加公司过滤条件
addFilterCondition(IT_LIST, "BUKRS", applyAdjustbill.getCompanyNum(), applyAdjustbill.getCompanyNum());
// 添加SAP应付凭证号过滤条件
addFilterCondition(IT_LIST, "BELNR", applyAdjustbill.getVoucherNum(), applyAdjustbill.getVoucherNum());
// 添加会计年度过滤条件
addFilterCondition(IT_LIST, "GJAHR", applyAdjustbill.getVoucherYear(), applyAdjustbill.getVoucherYear());
//todo:根据查询条件,调用SAP查询凭证接口,生成分录行
JSONObject result = vouchers_payable(IT_LIST, applyAdjustbill.getFkBillNum());
if (null != result && result.containsKey("data")) {
// 处理查询结果
JSONObject data = (JSONObject) result.get("data");
if (null != data && data.containsKey("IT_ITEM")) {
JSONArray IT_ITEMs = (JSONArray) data.get("IT_ITEM");
if (!IT_ITEMs.isEmpty()) {
return IT_ITEMs;
}
}
}
return null;
}
/** /**
* 处理付款申请单的保存提交和审核操作 * 处理付款申请单的保存提交和审核操作
* @param ap_payapply 付款申请单对象 * @param ap_payapply 付款申请单对象
@ -342,45 +381,65 @@ public class ApplyAdjustBillControler {
/** /**
* 创建或更新付款申请单 * 创建或更新付款申请单
* *
* @param applyAdjustbill 调整单模型 * @param it_list SAP查到的凭证信息
* @param companyNum 公司编号
* @param voucherNum SAP凭证号
* @param year 会计年度
* @param voucherLineNum 凭证行号
* @param org 组织信息
* @return 付款申请单的动态对象 * @return 付款申请单的动态对象
*/ */
private DynamicObject createOrUpdatePayApply(ApplyAdjustBillModel applyAdjustbill, String companyNum, String voucherNum, String year, String voucherLineNum, DynamicObject org, String fkBillNum) { private DynamicObject createOrUpdatePayApply(JSONObject it_list,String fkBillNum) {
String vouchernum = voucherNum; String orgNum = it_list.getString("BUKRS");//公司编号,"公司代码
String voucheryear = year; String voucheryear = it_list.getString("GJAHR");//会计年度,会计年度
String voucherentrynum = voucherLineNum; String voucherentrynum = it_list.getString("BUZEI");//会计科目行项目号,行编号
String accountingsubject = "1001";// 会计科目:1001 String accountingsubject = it_list.getString("SAKNR");//todo:会计科目:1001,总帐科目编号
BigDecimal outstandingamount = BigDecimal.valueOf(100);// 未清金额 BigDecimal outstandingamount = new BigDecimal(it_list.getString("WRBTR"));//未清金额,凭证货币金额
BigDecimal exchangerate = BigDecimal.ONE;// 汇率 BigDecimal KURSF = new BigDecimal(it_list.getString("KURSF"));
BigDecimal applyforconversionof = BigDecimal.ONE;// 申请金额折结算币别 if (KURSF.compareTo(BigDecimal.ZERO) == 0) {
Date duedate = new Date();// 到期日 KURSF = BigDecimal.ONE;
Date bizDate = new Date();// 记账日期 }
Date documentdate = new Date();// 凭证日期 BigDecimal exchangerate = KURSF;//汇率
Date basedate = new Date();// 基准日期 BigDecimal applyforconversionof = new BigDecimal(it_list.getString("DMBTR"));//申请金额折结算币别,按本位币计的金额
String asstacttype = "供应商";// 往来类型 Date duedate = null;// 到期日
String asstact = "上海接口有限公司";// 往来户名称 String FAEDT = it_list.getString("FAEDT");//到期日,净价到期日
String assacct = "A";// 合作银行类型 if (StringUtils.isNotEmpty(FAEDT)) {
String reasoncode = "014";// 原因码 duedate = StrToDate(FAEDT);
String shjh_classificationoffund = "资金计划分类";// 资金计划分类 }
String shjh_secondarydept = "二级部门";// 二级部门 Date bizDate = null;// 记账日期
String procurementeam = "采购组";// 采购组 String BUDAT = it_list.getString("BUDAT");
Boolean isselfprocurment = Boolean.TRUE;// 是否自行采购 if (StringUtils.isNotEmpty(BUDAT)) {
String paymentcurrency = "CNY";// 付款币别编号 bizDate = StrToDate(BUDAT);//记账日期,凭证中的过帐日期
String settlementcurrency = "CNY";// 结算币别编号 }
String applycause = "摘要";// 摘要 Date documentdate = null;// 凭证日期
String sourcebillno = "外部系统编号001";// 外部系统编号 String BLDAT = it_list.getString("BLDAT");
String vouchertype = "0003";// 凭证类型 if (StringUtils.isNotEmpty(BLDAT)) {
String paymentterms = "付款条件";// 付款条件 documentdate = StrToDate(BLDAT);//凭证日期,凭证中的凭证日期
String refertoinvoicenumber = "发票号001";// 参照发票号 }
Date basedate = null;// 基准日期
String ZFBDT = it_list.getString("ZFBDT");
if (StringUtils.isNotEmpty(ZFBDT)) {
basedate = StrToDate(ZFBDT);//基准日期,用于到期日计算的基准日期
}
String asstacttype = "供应商";//todo:往来类型
String asstact = "上海接口有限公司";//todo:往来户名称
// String assacct = it_list.getString("BVTYP");//合作银行类型.合作银行类型 A
String assacct = "A";//合作银行类型.合作银行类型 A
String reasoncode = "014";//todo:原因码 014
String shjh_classificationoffund = "资金计划分类";//todo:资金计划分类
String shjh_secondarydept = it_list.getString("ZREQ_DEPT");//二级部门,需求部门
String procurementeam = it_list.getString("EKGRP");//采购组
Boolean isselfprocurment = Boolean.valueOf(it_list.getString("ZZXCG_FLAG"));//todo:是否自行采购
String WAERS = it_list.getString("WAERS");
if ("RMB".equals(WAERS)) {
WAERS = "CNY";
}
String paymentcurrency = WAERS;//付款币别编号CNY,货币码
String settlementcurrency = WAERS;//结算币别编号,货币码
String applycause = it_list.getString("BKTXT");// TODO:摘要_凭证抬头文本
String vouchernum = it_list.getString("BELNR");//外部系统编号_会计凭证编号
String vouchertype = it_list.getString("BLART");// 凭证类型_凭证类型
String paymentterms = it_list.getString("ZTERM");// 付款条件_付款条件代码
String refertoinvoicenumber = "发票号001";// TODO:参照发票号
// 防重校验 // 防重校验
QFilter Q5 = new QFilter("shjh_vouchernum", QCP.equals, vouchernum); QFilter Q5 = new QFilter("shjh_vouchernum", QCP.equals, vouchernum);
QFilter Q6 = new QFilter("applyorg.number", QCP.equals, companyNum); QFilter Q6 = new QFilter("applyorg.number", QCP.equals, orgNum);
QFilter Q7 = new QFilter("shjh_voucheryear", QCP.equals, voucheryear); QFilter Q7 = new QFilter("shjh_voucheryear", QCP.equals, voucheryear);
QFilter Q8 = new QFilter("shjh_voucherentrynum", QCP.equals, voucherentrynum); QFilter Q8 = new QFilter("shjh_voucherentrynum", QCP.equals, voucherentrynum);
DynamicObject ap_payapplys = BusinessDataServiceHelper.loadSingle(AP_PAYAPPLY, new QFilter[]{Q5, Q6, Q7, Q8}); DynamicObject ap_payapplys = BusinessDataServiceHelper.loadSingle(AP_PAYAPPLY, new QFilter[]{Q5, Q6, Q7, Q8});
@ -391,6 +450,7 @@ public class ApplyAdjustBillControler {
return null; return null;
} }
DynamicObject org = BusinessDataServiceHelper.loadSingle("bos_org", "id", new QFilter("number", "=", orgNum).toArray());
// 设置组织信息 // 设置组织信息
ap_payapply.set("settleorg", org); ap_payapply.set("settleorg", org);
@ -450,7 +510,7 @@ public class ApplyAdjustBillControler {
setPaymentType(ap_payapply, accountingsubject); setPaymentType(ap_payapply, accountingsubject);
// 设置默认字段 // 设置默认字段
if (!setDefaultFields(ap_payapply, vouchernum, voucherentrynum, voucheryear, procurementeam, isselfprocurment, sourcebillno, reasoncode, bizDate, documentdate, vouchertype, basedate, paymentterms, refertoinvoicenumber, companyNum, duedate, fkBillNum)) { if (!setDefaultFields(ap_payapply, vouchernum, voucherentrynum, voucheryear, procurementeam, isselfprocurment, vouchernum, reasoncode, bizDate, documentdate, vouchertype, basedate, paymentterms, refertoinvoicenumber, orgNum, duedate, fkBillNum)) {
return null; return null;
} }