1.ut优化

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

--s
This commit is contained in:
weiyunlong 2025-03-11 17:59:04 +08:00
parent 8243c926be
commit 53ed962faa
11 changed files with 517 additions and 87 deletions

View File

@ -0,0 +1,55 @@
package shjh.jhzj7.fi.fi.plugin.form;
import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.dataentity.entity.DynamicObjectCollection;
import kd.bos.form.events.BeforeDoOperationEventArgs;
import kd.bos.form.operate.FormOperate;
import kd.bos.form.plugin.AbstractFormPlugin;
import kd.bos.orm.query.QCP;
import kd.bos.orm.query.QFilter;
import kd.bos.servicehelper.BusinessDataServiceHelper;
import kd.bos.util.StringUtils;
/**
* 排程处理单
* shjh_psd_schebillcalc_ext
*/
public class PsdSchebillFormPlugin extends AbstractFormPlugin {
@Override
public void beforeDoOperation(BeforeDoOperationEventArgs args) {
super.beforeDoOperation(args);
FormOperate source = (FormOperate) args.getSource();
String operateKey = source.getOperateKey();
switch (operateKey) {
case "autocombine":// 自动合并
case "split":// 拆分
case "combine":/// 合并
case "cancelcombine":/// 取消合并
//付款排程增加校验源单是费控不允许拆分和合并
DynamicObjectCollection entryentity = this.getModel().getEntryEntity("entryentity");//逐笔排程_单据体
if (!entryentity.isEmpty()) {
for (DynamicObject dynamicObject : entryentity) {
String e_billno = dynamicObject.getString("e_billno");
if (StringUtils.isNotEmpty(e_billno)) {
//付款排程单
DynamicObject schedulebill = BusinessDataServiceHelper.loadSingle("psd_schedulebill",
new QFilter("billno", QCP.equals, e_billno).toArray());
if (null != schedulebill) {
String fkbillid = schedulebill.getString("shjh_fkbillid");//费控表头ID
if (StringUtils.isNotEmpty(fkbillid)) {
this.getView().showErrorNotification("源单是费控,不允许拆分和合并!");
args.setCancel(true);
return;
}
}
}
}
}
break;
default:
break;
}
}
}

View File

@ -105,7 +105,10 @@ public class SappzFormPlugin extends AbstractFormPlugin {
if (null != data && data.containsKey("IT_ITEM")) {
JSONArray IT_ITEMs = (JSONArray) data.get("IT_ITEM");
if (!IT_ITEMs.isEmpty()) {
// for (int i = 0; i <5000; i++) {
// int size = IT_ITEMs.size();
// if (IT_ITEMs.size() > 5000) {
// size = 5000;
// }
for (int i = 0; i < IT_ITEMs.size(); i++) {
JSONObject it_list = (JSONObject)IT_ITEMs.get(i);
DynamicObject add = shjhEntryentity.addNew();

View File

@ -68,5 +68,6 @@ public class SchebillcalcFormPlugin extends AbstractFormPlugin {
}
}
}
//todo:增加校验源单类型是费控的不允许拆分;不允许合并
}
}

View File

@ -0,0 +1,72 @@
package shjh.jhzj7.fi.fi.plugin.operate;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.sap.db.jdbc.packet.ErrorLevel;
import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.entity.operate.result.OperateErrorInfo;
import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
import kd.bos.entity.plugin.args.BeforeOperationArgs;
import kd.bos.servicehelper.operation.SaveServiceHelper;
import kd.sdk.plugin.Plugin;
import static shjh.jhzj7.fi.fi.utils.SapUtils.unlocked_status;
public class PayApplyDeleteOperation extends AbstractOperationServicePlugIn implements Plugin {
@Override
public void beforeExecuteOperationTransaction(BeforeOperationArgs e) {
super.beforeExecuteOperationTransaction(e);
String operationKey = e.getOperationKey();
if ("delete".equals(operationKey)) {
//提交失败调取删除,删除判断单据状态暂存来源系统sap已锁定 才可以执行删除逻辑-->调解锁接口
DynamicObject[] dataEntities = e.getDataEntities();
for (DynamicObject bill : dataEntities) {
String billstatus = bill.getString("billstatus");//获取单据状态:暂存A
String sourcesystem = bill.getString("shjh_sourcesystem");//来源系统:SAP_A
boolean shjhSapwhetherlocking = bill.getBoolean("shjh_sapwhetherlocking");//SAP是否锁定:锁定
if ("A".equals(billstatus) && "A".equals(sourcesystem)) {
if (!shjhSapwhetherlocking) {
e.setCancel(true);
return;
}
//调解锁接口
JSONArray IT_INPUT = new JSONArray();
JSONObject jsonObject = new JSONObject();
String FM_CompanyCode = "";
if (null!= bill.getDynamicObject("openorg")) {
FM_CompanyCode = bill.getDynamicObject("openorg").getString("number");//公司编码_申请付款组织
}
jsonObject.put("bukrs",FM_CompanyCode);//公司代码_申请付款组织
jsonObject.put("belnr", bill.getString("shjh_vouchernum"));//会计凭证编号_SAP应付凭证号
jsonObject.put("gjahr", bill.getString("shjh_voucheryear"));//会计年度_SAP应付凭证会计年度
jsonObject.put("stasus", "02");//状态 01锁定02解锁03关闭04退单05作废
String cname = "";
if (null!= bill.getDynamicObject("creator")) {
cname = bill.getDynamicObject("creator").getString("number");//创建人工号_申请人
}
jsonObject.put("cname", cname);//创建人工号
jsonObject.put("zjddjid", ""+bill.getPkValue());//金蝶单据ID
jsonObject.put("zjddjbh", bill.getString("billno"));//金蝶单据编号
IT_INPUT.add(jsonObject);
JSONObject jsonObjects = unlocked_status(IT_INPUT,bill.getString("billno"));
String code = (String)jsonObjects.get("code");
if (!"0".equals(code)) {
OperateErrorInfo operateErrorInfo = new OperateErrorInfo();
operateErrorInfo.setMessage("付款申请单:"+bill.getString("billno")+"状态解锁失败:" + jsonObject.get("msg"));
operateErrorInfo.setErrorLevel(ErrorLevel.Error.name());
operateErrorInfo.setPkValue(bill.getPkValue());
this.operationResult.addErrorInfo(operateErrorInfo);
e.setCancel(true);
return;
}else {
this.operationResult.addSuccessPkId(bill.getPkValue());
}
}
}
}
}
}

View File

@ -0,0 +1,66 @@
package shjh.jhzj7.fi.fi.plugin.operate;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.sap.db.jdbc.packet.ErrorLevel;
import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.entity.operate.result.OperateErrorInfo;
import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
import kd.bos.entity.plugin.args.AfterOperationArgs;
import kd.bos.servicehelper.operation.SaveServiceHelper;
import kd.sdk.plugin.Plugin;
import static shjh.jhzj7.fi.fi.utils.SapUtils.unlocked_status;
/**
* 付款申请单保存操作
*/
public class PayApplySaveOperation extends AbstractOperationServicePlugIn implements Plugin {
@Override
public void afterExecuteOperationTransaction(AfterOperationArgs e) {
super.afterExecuteOperationTransaction(e);
//保存插件之后来源类型为sap且未锁定才去锁,并且更新状态
DynamicObject[] dataEntities = e.getDataEntities();
for (DynamicObject bill : dataEntities) {
String sourcesystem = bill.getString("shjh_sourcesystem");//来源系统:SAP
boolean shjhSapwhetherlocking = bill.getBoolean("shjh_sapwhetherlocking");//SAP是否锁定:未锁定
if ("A".equals(sourcesystem) && !shjhSapwhetherlocking) {
JSONArray IT_INPUT = new JSONArray();
JSONObject jsonObject = new JSONObject();
String FM_CompanyCode = "";
if (null!= bill.getDynamicObject("openorg")) {
FM_CompanyCode = bill.getDynamicObject("openorg").getString("number");//公司编码_申请付款组织
}
jsonObject.put("bukrs",FM_CompanyCode);//公司代码_申请付款组织
jsonObject.put("belnr", bill.getString("shjh_vouchernum"));//会计凭证编号_SAP应付凭证号
jsonObject.put("gjahr", bill.getString("shjh_voucheryear"));//会计年度_SAP应付凭证会计年度
jsonObject.put("stasus", "01");//状态 01锁定02解锁03关闭04退单05作废
String cname = "";
if (null!= bill.getDynamicObject("creator")) {
cname = bill.getDynamicObject("creator").getString("number");//创建人工号_申请人
}
jsonObject.put("cname", cname);//创建人工号
jsonObject.put("zjddjid", ""+bill.getPkValue());//金蝶单据ID
jsonObject.put("zjddjbh", bill.getString("billno"));//金蝶单据编号
IT_INPUT.add(jsonObject);
JSONObject jsonObjects = unlocked_status(IT_INPUT,bill.getString("billno"));
String code = (String)jsonObjects.get("code");
if (!"0".equals(code)) {
OperateErrorInfo operateErrorInfo = new OperateErrorInfo();
operateErrorInfo.setMessage("付款申请单:"+bill.getString("billno")+"状态锁定失败:" + jsonObject.get("msg"));
operateErrorInfo.setErrorLevel(ErrorLevel.Error.name());
operateErrorInfo.setPkValue(bill.getPkValue());
this.operationResult.addErrorInfo(operateErrorInfo);
}else {
//成功:更新状态
bill.set("shjh_sapwhetherlocking", true);
SaveServiceHelper.save(new DynamicObject[]{bill});
this.operationResult.addSuccessPkId(bill.getPkValue());
}
}
}
}
}

View File

@ -0,0 +1,36 @@
package shjh.jhzj7.fi.fi.plugin.operate;
import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.entity.ExtendedDataEntity;
import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
import kd.bos.entity.plugin.AddValidatorsEventArgs;
import kd.bos.entity.validate.AbstractValidator;
import kd.sdk.plugin.Plugin;
public class PayApplySubmitOperation extends AbstractOperationServicePlugIn implements Plugin {
@Override
public void onAddValidators(AddValidatorsEventArgs e) {
super.onAddValidators(e);
e.addValidator(new AbstractValidator() {
@Override
public void validate() {
String operateKey = this.getOperateKey();
//标记锁了才可以提交,
if ("submit".equals(operateKey)){
ExtendedDataEntity[] entities = this.getDataEntities();
for (ExtendedDataEntity entity : entities) {
DynamicObject bill = entity.getDataEntity();
String sourcesystem = bill.getString("shjh_sourcesystem");//来源系统:SAP_A
boolean shjhSapwhetherlocking = bill.getBoolean("shjh_sapwhetherlocking");//SAP是否锁定:锁定
if ("A".equals(sourcesystem)) {
if (!shjhSapwhetherlocking) {
this.addErrorMessage(entity,"SAP未锁定不能提交");
}
}
}
}
}
});
}
}

View File

@ -0,0 +1,199 @@
package shjh.jhzj7.fi.fi.plugin.operate;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.sap.db.jdbc.packet.ErrorLevel;
import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.dataentity.entity.DynamicObjectCollection;
import kd.bos.entity.operate.result.OperateErrorInfo;
import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
import kd.bos.entity.plugin.args.AfterOperationArgs;
import kd.bos.orm.query.QCP;
import kd.bos.orm.query.QFilter;
import kd.bos.servicehelper.BusinessDataServiceHelper;
import kd.sdk.plugin.Plugin;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import static shjh.jhzj7.fi.fi.utils.SapUtils.withholding_billing;
/**
* 付款单推送费控操作插件
* shjh_cas_paybill_ext
*/
public class PaybillOperation extends AbstractOperationServicePlugIn implements Plugin {
@Override
public void afterExecuteOperationTransaction(AfterOperationArgs e) {
super.afterExecuteOperationTransaction(e);
String operationKey = e.getOperationKey();
if ("pushfk".equals(operationKey)) {
DynamicObject[] dataEntities = e.getDataEntities();
for (DynamicObject bill : dataEntities) {
JSONObject data = new JSONObject();
// 构建header
JSONObject header = buildHeader(bill);
// 构建body
JSONArray body = buildBody(bill);
data.put("header", header);
data.put("body", body);
JSONObject jsonObject = withholding_billing(data, bill.getString("billno"));
String code = (String)jsonObject.get("code");
if (!"0".equals(code)) {
OperateErrorInfo operateErrorInfo = new OperateErrorInfo();
operateErrorInfo.setMessage("付款单:"+bill.getString("billno")+"推送费控失败:" + jsonObject.get("msg"));
operateErrorInfo.setErrorLevel(ErrorLevel.Error.name());
operateErrorInfo.setPkValue(bill.getPkValue());
this.operationResult.addErrorInfo(operateErrorInfo);
}else {
this.operationResult.addSuccessPkId(bill.getPkValue());
}
}
}
}
// 构建header方法
public static JSONObject buildHeader(DynamicObject bill) {
bill = BusinessDataServiceHelper.loadSingle(bill.getPkValue(), "cas_paybill");
JSONObject header = new JSONObject();
header.put("FM_RequestBillCode", "DKK");// 单据类型编码固定值DKK
header.put("FM_RequestCode", bill.getString("billno"));// 资金系统的申请单号_单据编号
String FM_CompanyCode = "";
if (null!= bill.getDynamicObject("openorg")) {
FM_CompanyCode = bill.getDynamicObject("openorg").getString("number");//公司编码_申请付款组织
}
header.put("FM_CompanyCode", FM_CompanyCode);// 公司编码_申请付款组织
String FM_DeptCode = "";
DynamicObjectCollection entry = bill.getDynamicObjectCollection("entry");
if (!entry.isEmpty()) {
DynamicObject dynamicObject = entry.get(0);
DynamicObject secondarydept = dynamicObject.getDynamicObject("shjh_secondarydept");
if (null != secondarydept) {
FM_DeptCode = secondarydept.getString("number");// 部门编码_申请付款部门
}
}
header.put("FM_DeptCode", FM_DeptCode);//部门编码,取分录二级部门
String FM_ExpenseItemCode = "";
if (null!= bill.getDynamicObject("shjh_bizsmall")) {
FM_ExpenseItemCode = bill.getDynamicObject("shjh_bizsmall").getString("number");// 业务小类编码
}
String FM_UserCode = "";
String FM_CreateUserCode = "";
QFilter q1 = new QFilter("shjh_biztype", QCP.equals, "fk");//业务类型为付款单
QFilter q2 = new QFilter("shjh_org.number", QCP.equals, FM_CompanyCode);//组织
QFilter q3 = new QFilter("shjh_bizsmalltype.number", QCP.equals, FM_ExpenseItemCode);//业务小类
DynamicObject[] load = BusinessDataServiceHelper.load("shjh_fksqr", "id", new QFilter[]{q1, q2, q3});
if (load.length > 0) {
DynamicObject fksqr = load[0];
if (null != fksqr) {
DynamicObject dynamicObject = fksqr.getDynamicObject("shjh_sqr");
if (null != dynamicObject) {
FM_UserCode = dynamicObject.getString("number");// 员工工号_费控单据申请人映射表_人员
FM_CreateUserCode = dynamicObject.getString("createusercode");// 创建人工号_费控单据申请人映射表_人员
}
}
}
// header.put("FM_UserCode", FM_UserCode);//员工工号,配置表(shjh_fksqr)
// header.put("FM_CreateUserCode", FM_CreateUserCode);// 创建人工号
header.put("FM_UserCode", "GH017994");//员工工号,配置表(shjh_fksqr)
header.put("FM_CreateUserCode", "GH017994");// 创建人工号
String FM_ExpenseTypeCode = "";
if (null!= bill.getDynamicObject("shjh_bizbig")) {
FM_ExpenseTypeCode = bill.getDynamicObject("shjh_bizbig").getString("number");// 业务大类编码(EQ49,EQ44,EQ1101)
}
// header.put("FM_ExpenseTypeCode", FM_ExpenseTypeCode);// 业务大类编码(EQ49,EQ44,EQ1101)
header.put("FM_ExpenseTypeCode", "EQ44");// 业务大类编码(EQ49,EQ44,EQ1101)
//todo:EQ1101 -- QT0401QT0402
// EQ44 -- ZZ1001
// EQ49 -- ZZ1301ZZ1302ZZ1303ZZ1304
header.put("FM_CurrencyCode", "RMB");// 币种编码默认:RMB
header.put("FM_RequestName", bill.getString("description"));// todo:单据主题_拼接
header.put("FM_AttachUrl", null);//附件URL地址:array
header.put("FM_BudType", 0);//预算类别0-组织预算,1-全年预算,当前只处理0 int
header.put("Remark", bill.getString("description"));// 事项描述_摘要
return header;
}
// 构建body方法
public static JSONArray buildBody(DynamicObject bill) {
bill = BusinessDataServiceHelper.loadSingle(bill.getPkValue(), "cas_paybill");
JSONArray body = new JSONArray();
// 付款明细
DynamicObjectCollection Lists = bill.getDynamicObjectCollection("entry");
for (DynamicObject obj : Lists) {
JSONObject jsonObject = new JSONObject();
Double e_actamt = Double.valueOf(String.valueOf(obj.getBigDecimal("e_actamt"))); // 含税金额_实付金额
Double taxamt = Double.valueOf(String.valueOf(obj.getBigDecimal("taxamt"))); // 税额_税额
Double excluamt = e_actamt - taxamt; // 未税金额 = 实付金额 - 税额
jsonObject.put("FM_ClaimAmt", e_actamt);
jsonObject.put("FM_ExcluAmt", excluamt);//未税金额
jsonObject.put("FM_VatAmt", taxamt);
Date entrybizdate = obj.getDate("entrybizdate");
// Date 对象转换为 LocalDate 对象
LocalDate localDate = entrybizdate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
// 提取年份
int year = localDate.getYear();
// 提取月份
int month = localDate.getMonthValue();
jsonObject.put("FM_FiscalYear", year);// 费用年度_表头业务日期
jsonObject.put("FM_FiscalMoth", month);//费用月度_表头业务日期
// 格式化日期为 yyyyMMdd
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
String formattedDate = localDate.format(formatter);
jsonObject.put("FM_ExItemDate1", formattedDate);// 业务日期_业务日期
String FM_SupplierCode = "";
String payeetype = bill.getString("payeetype");//收款人类型
if ("bd_supplier".equals(payeetype)) {
String payeeformid = bill.getString("payeeformid");//收款人基础资料标识
String payee = bill.getString("payee");//收款人ID
DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle(payee, payeeformid);
if (null != dynamicObject) {
FM_SupplierCode = dynamicObject.getString("number");// 供应商编码_收款人类型为供应商,取收款人编码
}
}
jsonObject.put("FM_SupplierCode", FM_SupplierCode);// 供应商编码_收款人类型为供应商,取收款人编码
String FM_CostCenterCode = "";
if (null!= bill.getDynamicObject("shjh_costcenter")) {
FM_CostCenterCode = bill.getDynamicObject("shjh_costcenter").getString("number");// 成本中心编码
}
jsonObject.put("FM_CostCenterCode", FM_CostCenterCode);// 成本中心编码
String FM_ProfitCenterCode = "";
if (null!= bill.getDynamicObject("shjh_pc")) {
FM_ProfitCenterCode = bill.getDynamicObject("shjh_pc").getString("number");// 利润中心编码
}
jsonObject.put("FM_ProfitCenterCode", FM_ProfitCenterCode);// 利润中心编码
String FM_ExpenseItemCode = "";
if (null!= bill.getDynamicObject("shjh_bizsmall")) {
FM_ExpenseItemCode = bill.getDynamicObject("shjh_bizsmall").getString("number");// 业务小类编码
}
// jsonObject.put("FM_ExpenseItemCode", FM_ExpenseItemCode);// 业务小类编码
jsonObject.put("FM_ExpenseItemCode", "ZZ1001");// todo:业务小类编码
// todo:税率编码(传J0时发票类型选INVOICE003)参考附表 @余学良 根据业务类型来默认吧
// 我们到时候会增加一个 代付款专票这样的大类这个大类传 专票其他大类 默认 其他发票类型税率0
jsonObject.put("FM_InvoiceTypeCode", "INVOICE003");// 发票类型编码(普票:INVOICE001,专票:INVOICE002其它票据:INVOICE003)
jsonObject.put("FM_TaxRateCode", "J0");
jsonObject.put("FM_DetailAttachUrl", null);// 附件URL地址:array
jsonObject.put("Remark", obj.getString("e_remark"));// 备注
body.add(jsonObject);
}
return body;
}
}

View File

@ -0,0 +1,34 @@
package shjh.jhzj7.fi.fi.plugin.task;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import kd.bos.context.RequestContext;
import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.exception.KDException;
import kd.bos.schedule.executor.AbstractTask;
import kd.bos.servicehelper.BusinessDataServiceHelper;
import kd.sdk.plugin.Plugin;
import java.util.Map;
import static shjh.jhzj7.fi.fi.plugin.operate.PaybillOperation.buildBody;
import static shjh.jhzj7.fi.fi.plugin.operate.PaybillOperation.buildHeader;
import static shjh.jhzj7.fi.fi.utils.SapUtils.withholding_billing;
public class PaybillPushFkTask extends AbstractTask implements Plugin {
@Override
public void execute(RequestContext requestContext, Map<String, Object> map) throws KDException {
DynamicObject[] paybills = BusinessDataServiceHelper.load("cas_paybill", "id", null);
for (DynamicObject paybill : paybills) {
JSONObject data = new JSONObject();
// 构建header
JSONObject header = buildHeader(paybill);
// 构建body
JSONArray body = buildBody(paybill);
data.put("header", header);
data.put("body", body);
withholding_billing(data, paybill.getString("billno"));
}
}
}

View File

@ -14,7 +14,6 @@ import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import java.sql.Date;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
@ -46,60 +45,39 @@ public class SapUtils {
// public static final String withholdingUrl = "https://hipint.jahwa.com.cn:6443/gateway//HIP_ReceiveFromFM/1.0/fm/send";//正式环境
public static final String receiverID2 = "FeiKong";//定义的发送者
/**
* 构建请求头
* @param thirdPartyMap 第三方数据映射
* @return 请求头映射
*/
private static Map<String, String> buildCustomerHeader(Map<String, Object> thirdPartyMap) {
Map<String, String> customerHeader = new HashMap<>();
customerHeader.put("interfaceID", ""+thirdPartyMap.get("interfaceID"));//识别被调接口并进行路由
customerHeader.put("receiverID", ""+thirdPartyMap.get("receiverID"));
return customerHeader;
}
/**
* SAP应付凭证锁定解锁状态回写
*/
public static void unlocked_status(Map<String, Object> thirdPartyMap){
public static JSONObject unlocked_status(JSONArray IT_INPUT,String billno){
Map<String, Object> thirdPartyMap = new HashMap<>();
thirdPartyMap.put("interfaceID",interfaceID1);
thirdPartyMap.put("receiverID",receiverID1);
thirdPartyMap.put("URL",unlockedUrl);
// 构建请求头
Map<String, String> customerHeader = buildCustomerHeader(thirdPartyMap);
thirdPartyMap.put("billno",billno);
// 组装请求体
JSONObject pendingsBody = unlockedBody(thirdPartyMap);
JSONObject pendingsBody = unlockedBody(IT_INPUT);
// 发送请求并处理响应
// processRequest(customerHeader, pendingsBody, thirdPartyMap,Apimenthod1);
return processRequest(pendingsBody, thirdPartyMap, Apimenthod1);
}
/**
* SAP应付凭证锁定解锁状态回写组装请求体:
* @param thirdPartyMap 第三方数据映射
* @return 请求体的 JSON 对象
*/
private static JSONObject unlockedBody(Map<String, Object> thirdPartyMap) {
private static JSONObject unlockedBody(JSONArray IT_INPUT) {
// 获取当前日期和时间
LocalDateTime date = LocalDateTime.now();
// 定义日期时间格式
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
// 格式化当前日期和时间
String dates = date.format(formatter);
//组装请求体
JSONObject pendingsBody = new JSONObject();
pendingsBody.put("rootContextID",""+System.currentTimeMillis());//todo:唯一事务ID采用UUID或其他强唯一性ID
pendingsBody.put("requestTime", ""+(thirdPartyMap.get("createdatetime")));//请求时间,格式为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();
JSONArray IT_INPUT = new JSONArray();
//todo:
List<DynamicObject> Lists = (List<DynamicObject>) thirdPartyMap.get("Lists");
for (DynamicObject obj : Lists) {
JSONObject jsonObject = new JSONObject();
jsonObject.put("bukrs", ""+(thirdPartyMap.get("bukrs")));//公司代码
jsonObject.put("belnr", ""+(thirdPartyMap.get("belnr")));//会计凭证编号
jsonObject.put("gjahr", ""+(thirdPartyMap.get("gjahr")));//会计年度
jsonObject.put("stasus", ""+(thirdPartyMap.get("stasus")));//状态 01锁定02解锁03关闭04退单05作废
jsonObject.put("cname", ""+(thirdPartyMap.get("cname")));//创建人工号
jsonObject.put("zjddjid", ""+(thirdPartyMap.get("zjddjid")));//金蝶单据ID
jsonObject.put("zjddjbh", ""+(thirdPartyMap.get("zjddjbh")));//金蝶单据编号
IT_INPUT.add(jsonObject);
}
data.put("IT_INPUT",IT_INPUT);
pendingsBody.put("data", data);
return pendingsBody;
@ -146,11 +124,13 @@ public class SapUtils {
/**
* 生成代扣款记账单接口
*/
public static void withholding_billing(){
public static JSONObject withholding_billing(JSONObject data,String billno){
Map<String, Object> thirdPartyMap = new HashMap<>();
thirdPartyMap.put("interfaceID",interfaceID3);
thirdPartyMap.put("receiverID",receiverID2);
thirdPartyMap.put("URL",withholdingUrl);
thirdPartyMap.put("billno",billno);
// 获取当前日期和时间
LocalDateTime date = LocalDateTime.now();
// 定义日期时间格式
@ -158,62 +138,27 @@ public class SapUtils {
// 格式化当前日期和时间
String dates = date.format(formatter);
thirdPartyMap.put("createdatetime",dates);
// 构建请求头
Map<String, String> customerHeader = buildCustomerHeader(thirdPartyMap);
// 组装请求体
JSONObject withholdingBody = withholdingBody(thirdPartyMap);
JSONObject withholdingBody = withholdingBody(data);
// 发送请求并处理响应
// processRequest(customerHeader, withholdingBody, thirdPartyMap, Apimenthod3);
return processRequest(withholdingBody, thirdPartyMap, Apimenthod2);
}
/**
* SAP应付凭证清单接口组装请求体:
* @param thirdPartyMap 第三方数据映射
* 生成代扣款记账单接口组装请求体:
* @return 请求体的 JSON 对象
*/
private static JSONObject withholdingBody(Map<String, Object> thirdPartyMap) {
private static JSONObject withholdingBody(JSONObject data) {
// 获取当前日期和时间
LocalDateTime date = LocalDateTime.now();
// 定义日期时间格式
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
// 格式化当前日期和时间
String dates = date.format(formatter);
//组装请求体
JSONObject pendingsBody = new JSONObject();
pendingsBody.put("rootContextID",""+System.currentTimeMillis());//todo:唯一事务ID采用UUID或其他强唯一性ID
pendingsBody.put("requestTime", ""+(thirdPartyMap.get("createdatetime")));//请求时间,格式为yyyy-MM-dd HH:mm:ss.SSS
JSONObject data = new JSONObject();
JSONObject header = new JSONObject();
header.put("FM_RequestBillCode", "DKK");//单据类型编码固定值DKK
header.put("FM_RequestCode", ""+(thirdPartyMap.get("FM_RequestCode")));//资金系统的申请单号
header.put("FM_CompanyCode", ""+(thirdPartyMap.get("FM_CompanyCode")));//公司编码
header.put("FM_DeptCode", ""+(thirdPartyMap.get("FM_DeptCode")));//部门编码
header.put("FM_UserCode", ""+(thirdPartyMap.get("FM_UserCode")));//员工工号
header.put("FM_CreateUserCode", ""+(thirdPartyMap.get("FM_CreateUserCode")));//创建人工号
header.put("FM_ExpenseTypeCode", ""+(thirdPartyMap.get("FM_ExpenseTypeCode")));//业务大类编码(EQ49,EQ44,EQ1101)
header.put("FM_CurrencyCode", ""+(thirdPartyMap.get("FM_CurrencyCode")));//币种编码默认:RMB
header.put("FM_RequestName", ""+(thirdPartyMap.get("FM_RequestName")));//单据主题
header.put("FM_AttachUrl", JSONArray.parse(""+(thirdPartyMap.get("FM_AttachUrl"))));//todo:附件URL地址:array
header.put("FM_BudType", Integer.valueOf(""+thirdPartyMap.get("FM_AttachUr")));//预算类别0-组织预算,1-全年预算,当前只处理0 int
header.put("Remark", ""+(thirdPartyMap.get("Remark")));//事项描述
JSONArray body = new JSONArray();
//todo:
List<DynamicObject> Lists = (List<DynamicObject>) thirdPartyMap.get("Lists");
for (DynamicObject obj : Lists) {
JSONObject jsonObject = new JSONObject();
jsonObject.put("FM_ClaimAmt", Double.valueOf(""+(thirdPartyMap.get("FM_ClaimAmt"))));//含税金额
jsonObject.put("FM_ExcluAmt", Double.valueOf(""+(thirdPartyMap.get("FM_ExcluAmt"))));//未税金额
jsonObject.put("FM_VatAmt", Double.valueOf(""+(thirdPartyMap.get("FM_VatAmt"))));//税额
jsonObject.put("FM_FiscalYear", Integer.valueOf(""+(thirdPartyMap.get("FM_FiscalYear"))));//费用年度
jsonObject.put("FM_FiscalMoth", Integer.valueOf(""+(thirdPartyMap.get("FM_FiscalMoth"))));//费用月度
jsonObject.put("FM_ExItemDate1", Date.valueOf(""+thirdPartyMap.get("FM_ExItemDate1")));//业务日期
jsonObject.put("FM_SupplierCode", ""+(thirdPartyMap.get("FM_SupplierCode")));//供应商编码业务大类=EQ49时必填
jsonObject.put("FM_CostCenterCode", ""+(thirdPartyMap.get("FM_CostCenterCode")));//成本中心编码业务大类=EQ49时必填
jsonObject.put("FM_ProfitCenterCode", ""+(thirdPartyMap.get("FM_ProfitCenterCode")));//利润中心编码业务大类=EQ49时必填
jsonObject.put("FM_ExpenseItemCode", ""+(thirdPartyMap.get("FM_ExpenseItemCode")));//业务小类编码业务大类=EQ49时必填
jsonObject.put("FM_InvoiceTypeCode", ""+(thirdPartyMap.get("FM_InvoiceTypeCode")));//发票类型编码(普票:INVOICE001,专票:INVOICE002其它票据:INVOICE003)
jsonObject.put("FM_TaxRateCode", ""+(thirdPartyMap.get("FM_TaxRateCode")));//税率编码(传J0时发票类型选INVOICE003)参考附表
jsonObject.put("FM_DetailAttachUrl", JSONArray.parse(""+(thirdPartyMap.get("FM_DetailAttachUrl"))));//todo:附件URL地址:array
jsonObject.put("Remark", ""+(thirdPartyMap.get("Remark")));//备注
body.add(jsonObject);
}
data.put("header",header);
data.put("body",body);
pendingsBody.put("requestTime", dates);//请求时间,格式为yyyy-MM-dd HH:mm:ss.SSS
pendingsBody.put("data", data);
return pendingsBody;
}
@ -263,6 +208,12 @@ public class SapUtils {
if (responseEntity != null) {
String responseString = EntityUtils.toString(responseEntity, "UTF-8");
jsonObject = JSONObject.parseObject(responseString);
String code = (String)jsonObject.get("code");
if (!"0".equals(code)) {
logger.info(apiName +"失败!");
saveLog(apiName +(thirdPartyMap.get("billno").toString()), pendingsBody, jsonObject, false,apiName);
return jsonObject;
}
handleResponse(jsonObject, pendingsBody, thirdPartyMap,apiName);
return com.alibaba.fastjson.JSONObject.parseObject(responseString);
}else {

View File

@ -220,7 +220,12 @@ public class ApplyAdjustBillControler {
log.error("审核成功,费控调整单号:" + fkBillNum);
JhzjUtils.saveLog(fkBillNum, Apimenthod, jsonBodyString, null, true, "API");
return CustomApiResult.success(null);
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 handleErrorAndReturn("同步失败, 调整单号:" + fkBillNum + "的调整金额大于分录未调整过的申请金额", fkBillNum, jsonBodyString);

View File

@ -16,6 +16,7 @@ import kd.bos.entity.validate.ValidateResult;
import kd.bos.entity.validate.ValidateResultCollection;
import kd.bos.logging.Log;
import kd.bos.logging.LogFactory;
import kd.bos.openapi.base.custom.valueextraction.CustomApiResultValueExtractor;
import kd.bos.openapi.common.custom.annotation.ApiController;
import kd.bos.openapi.common.custom.annotation.ApiPostMapping;
import kd.bos.openapi.common.custom.annotation.ApiRequestBody;
@ -58,6 +59,8 @@ public class ApplyBillControler {
public CustomApiResult<ApiResult> applybill_sync (@NotNull @Valid @ApiRequestBody(value="入参json格式数据") ApplyBillModel applybill) {
JSONObject json_body;
String jsonBodyString = null;
try {
// 解析入参如果格式不正确日志记录并反馈esb
json_body = (JSONObject) JSON.toJSON(applybill);
@ -383,7 +386,12 @@ public class ApplyBillControler {
log.error("审核成功,费控单据编号:" + fkBillNum);
JhzjUtils.saveLog(fkBillNum, Apimenthod, jsonBodyString, null, true, "API");
return CustomApiResult.success(null);
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);
}
/**