From 53ed962faa47b5b4e746287345c78d8ed26a9b95 Mon Sep 17 00:00:00 2001 From: weiyunlong Date: Tue, 11 Mar 2025 17:59:04 +0800 Subject: [PATCH] =?UTF-8?q?=20=201.ut=E4=BC=98=E5=8C=96=20=20=202.?= =?UTF-8?q?=E6=8E=A8=E9=80=81=E8=B4=B9=E6=8E=A7=E5=AD=97=E6=AE=B5=E7=A1=AE?= =?UTF-8?q?=E8=AE=A4,=E4=BB=A5=E5=8F=8A=E6=88=90=E5=8A=9F=E8=BF=94?= =?UTF-8?q?=E5=9B=9E=E6=96=B9=E5=BC=8F=20=20=203.=E9=94=81=E5=AE=9A?= =?UTF-8?q?=E8=A7=A3=E9=94=81=E6=8E=A5=E5=8F=A3id=E6=9C=89=E6=A0=A1?= =?UTF-8?q?=E9=AA=8C,=E5=AD=97=E6=AE=B5=E7=A1=AE=E8=AE=A4,=20=20=204.?= =?UTF-8?q?=E5=87=AD=E8=AF=81=E6=9F=A5=E8=AF=A2=E6=8E=A5=E5=8F=A3=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=E7=A1=AE=E8=AE=A4=20=20=205.=E6=BA=90=E5=8D=95?= =?UTF-8?q?=E6=98=AF=E8=B4=B9=E6=8E=A7=EF=BC=8C=E4=B8=8D=E5=85=81=E8=AE=B8?= =?UTF-8?q?=E6=8B=86=E5=88=86=E5=92=8C=E5=90=88=E5=B9=B6(=E4=BE=9D?= =?UTF-8?q?=E6=8D=AE)=20=20=206.=E6=8E=A5=E5=8F=A3=E8=BF=94=E5=9B=9E?= =?UTF-8?q?=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --s --- .../fi/plugin/form/PsdSchebillFormPlugin.java | 55 +++++ .../fi/fi/plugin/form/SappzFormPlugin.java | 5 +- .../plugin/form/SchebillcalcFormPlugin.java | 1 + .../operate/PayApplyDeleteOperation.java | 72 +++++++ .../plugin/operate/PayApplySaveOperation.java | 66 ++++++ .../operate/PayApplySubmitOperation.java | 36 ++++ .../fi/plugin/operate/PaybillOperation.java | 199 ++++++++++++++++++ .../fi/fi/plugin/task/PaybillPushFkTask.java | 34 +++ .../java/shjh/jhzj7/fi/fi/utils/SapUtils.java | 119 +++-------- .../fi/webapi/ApplyAdjustBillControler.java | 7 +- .../fi/fi/webapi/ApplyBillControler.java | 10 +- 11 files changed, 517 insertions(+), 87 deletions(-) create mode 100644 main/java/shjh/jhzj7/fi/fi/plugin/form/PsdSchebillFormPlugin.java create mode 100644 main/java/shjh/jhzj7/fi/fi/plugin/operate/PayApplyDeleteOperation.java create mode 100644 main/java/shjh/jhzj7/fi/fi/plugin/operate/PayApplySaveOperation.java create mode 100644 main/java/shjh/jhzj7/fi/fi/plugin/operate/PayApplySubmitOperation.java create mode 100644 main/java/shjh/jhzj7/fi/fi/plugin/operate/PaybillOperation.java create mode 100644 main/java/shjh/jhzj7/fi/fi/plugin/task/PaybillPushFkTask.java diff --git a/main/java/shjh/jhzj7/fi/fi/plugin/form/PsdSchebillFormPlugin.java b/main/java/shjh/jhzj7/fi/fi/plugin/form/PsdSchebillFormPlugin.java new file mode 100644 index 0000000..267cc67 --- /dev/null +++ b/main/java/shjh/jhzj7/fi/fi/plugin/form/PsdSchebillFormPlugin.java @@ -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; + } + } +} diff --git a/main/java/shjh/jhzj7/fi/fi/plugin/form/SappzFormPlugin.java b/main/java/shjh/jhzj7/fi/fi/plugin/form/SappzFormPlugin.java index 7f1b5a9..cfc91b8 100644 --- a/main/java/shjh/jhzj7/fi/fi/plugin/form/SappzFormPlugin.java +++ b/main/java/shjh/jhzj7/fi/fi/plugin/form/SappzFormPlugin.java @@ -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(); diff --git a/main/java/shjh/jhzj7/fi/fi/plugin/form/SchebillcalcFormPlugin.java b/main/java/shjh/jhzj7/fi/fi/plugin/form/SchebillcalcFormPlugin.java index 0d3a41c..8198d93 100644 --- a/main/java/shjh/jhzj7/fi/fi/plugin/form/SchebillcalcFormPlugin.java +++ b/main/java/shjh/jhzj7/fi/fi/plugin/form/SchebillcalcFormPlugin.java @@ -68,5 +68,6 @@ public class SchebillcalcFormPlugin extends AbstractFormPlugin { } } } + //todo:增加校验,源单类型是费控的,不允许拆分;不允许合并 } } diff --git a/main/java/shjh/jhzj7/fi/fi/plugin/operate/PayApplyDeleteOperation.java b/main/java/shjh/jhzj7/fi/fi/plugin/operate/PayApplyDeleteOperation.java new file mode 100644 index 0000000..2755d8a --- /dev/null +++ b/main/java/shjh/jhzj7/fi/fi/plugin/operate/PayApplyDeleteOperation.java @@ -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()); + } + + } + } + } + } +} diff --git a/main/java/shjh/jhzj7/fi/fi/plugin/operate/PayApplySaveOperation.java b/main/java/shjh/jhzj7/fi/fi/plugin/operate/PayApplySaveOperation.java new file mode 100644 index 0000000..ca21b1b --- /dev/null +++ b/main/java/shjh/jhzj7/fi/fi/plugin/operate/PayApplySaveOperation.java @@ -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()); + } + } + } + } +} diff --git a/main/java/shjh/jhzj7/fi/fi/plugin/operate/PayApplySubmitOperation.java b/main/java/shjh/jhzj7/fi/fi/plugin/operate/PayApplySubmitOperation.java new file mode 100644 index 0000000..ce794dd --- /dev/null +++ b/main/java/shjh/jhzj7/fi/fi/plugin/operate/PayApplySubmitOperation.java @@ -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未锁定,不能提交"); + } + } + } + } + } + }); + } +} diff --git a/main/java/shjh/jhzj7/fi/fi/plugin/operate/PaybillOperation.java b/main/java/shjh/jhzj7/fi/fi/plugin/operate/PaybillOperation.java new file mode 100644 index 0000000..1d5f05d --- /dev/null +++ b/main/java/shjh/jhzj7/fi/fi/plugin/operate/PaybillOperation.java @@ -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 -- QT0401,QT0402 + // EQ44 -- ZZ1001 + // EQ49 -- ZZ1301、ZZ1302、ZZ1303、ZZ1304 + + 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; + } + + +} diff --git a/main/java/shjh/jhzj7/fi/fi/plugin/task/PaybillPushFkTask.java b/main/java/shjh/jhzj7/fi/fi/plugin/task/PaybillPushFkTask.java new file mode 100644 index 0000000..fa51eb4 --- /dev/null +++ b/main/java/shjh/jhzj7/fi/fi/plugin/task/PaybillPushFkTask.java @@ -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 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")); + } + } +} diff --git a/main/java/shjh/jhzj7/fi/fi/utils/SapUtils.java b/main/java/shjh/jhzj7/fi/fi/utils/SapUtils.java index cba826f..fa35b42 100644 --- a/main/java/shjh/jhzj7/fi/fi/utils/SapUtils.java +++ b/main/java/shjh/jhzj7/fi/fi/utils/SapUtils.java @@ -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 buildCustomerHeader(Map thirdPartyMap) { - Map customerHeader = new HashMap<>(); - customerHeader.put("interfaceID", ""+thirdPartyMap.get("interfaceID"));//识别被调接口并进行路由 - customerHeader.put("receiverID", ""+thirdPartyMap.get("receiverID")); - return customerHeader; - } - - /** * SAP应付凭证锁定解锁状态回写 */ - public static void unlocked_status(Map thirdPartyMap){ + public static JSONObject unlocked_status(JSONArray IT_INPUT,String billno){ + + Map thirdPartyMap = new HashMap<>(); thirdPartyMap.put("interfaceID",interfaceID1); thirdPartyMap.put("receiverID",receiverID1); thirdPartyMap.put("URL",unlockedUrl); - // 构建请求头 - Map 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 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 Lists = (List) 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 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 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 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 Lists = (List) 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 { diff --git a/main/java/shjh/jhzj7/fi/fi/webapi/ApplyAdjustBillControler.java b/main/java/shjh/jhzj7/fi/fi/webapi/ApplyAdjustBillControler.java index be318de..cb70067 100644 --- a/main/java/shjh/jhzj7/fi/fi/webapi/ApplyAdjustBillControler.java +++ b/main/java/shjh/jhzj7/fi/fi/webapi/ApplyAdjustBillControler.java @@ -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 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); diff --git a/main/java/shjh/jhzj7/fi/fi/webapi/ApplyBillControler.java b/main/java/shjh/jhzj7/fi/fi/webapi/ApplyBillControler.java index f1d7ee7..d654f50 100644 --- a/main/java/shjh/jhzj7/fi/fi/webapi/ApplyBillControler.java +++ b/main/java/shjh/jhzj7/fi/fi/webapi/ApplyBillControler.java @@ -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 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 map = new HashMap<>(); + customApiResult.setHeaders(map); + customApiResult.getHeaders().put("billno",fkBillNum); + customApiResult.getHeaders().put("billid",""+ap_payapply.getPkValue()); + return CustomApiResult.success(customApiResult); } /**