diff --git a/main/java/shjh/jhzj7/fi/fi/plugin/form/ClaimBillFormPlugin.java b/main/java/shjh/jhzj7/fi/fi/plugin/form/ClaimBillFormPlugin.java index 6cf2909..46424f2 100644 --- a/main/java/shjh/jhzj7/fi/fi/plugin/form/ClaimBillFormPlugin.java +++ b/main/java/shjh/jhzj7/fi/fi/plugin/form/ClaimBillFormPlugin.java @@ -15,7 +15,7 @@ import shjh.jhzj7.fi.fi.plugin.form.info.ClaimFieldsInfo; import java.util.EventObject; /** - * 动态表单插件-【认领处理单】————已作废,全部逻辑界面规则配置 + * 动态表单插件-【认领处理单】 * @author LiGuiQiang */ public class ClaimBillFormPlugin extends AbstractFormPlugin implements Plugin { diff --git a/main/java/shjh/jhzj7/fi/fi/plugin/form/FeeControlApiPlugin.java b/main/java/shjh/jhzj7/fi/fi/plugin/form/FeeControlApiPlugin.java index 2ed87f7..bd27aed 100644 --- a/main/java/shjh/jhzj7/fi/fi/plugin/form/FeeControlApiPlugin.java +++ b/main/java/shjh/jhzj7/fi/fi/plugin/form/FeeControlApiPlugin.java @@ -223,48 +223,24 @@ public class FeeControlApiPlugin extends AbstractFormPlugin implements Plugin { JSONObject root = JSONObject.parseObject(response); JSONObject data = root.getJSONObject("data"); JSONObject data2 = data.getJSONObject("data"); - JSONArray rows = data2.getJSONArray("LoanItems"); + JSONArray loanItems = data2.getJSONArray("LoanItems"); + JSONArray voucherItems = data2.getJSONArray("VoucherItems"); DynamicObjectCollection entry = this.getModel().getEntryEntity(ENTRY_KEY); entry.clear(); - for (int i = 0; i < rows.size(); i++) { - JSONObject top = (JSONObject) rows.get(i); + for (int i = 0; i < loanItems.size(); i++) { + JSONObject top = (JSONObject) loanItems.get(i); JSONArray loanDetailInfo = top.getJSONArray("LoanDetailInfo"); - JSONObject detail = (JSONObject) loanDetailInfo.get(0); - entry.addNew(); - setPaymentApiValues(top, detail, i); + for (int j = 0; j < loanDetailInfo.size(); j++) { + JSONObject detail = (JSONObject) loanDetailInfo.get(j); + entry.addNew(); + setPaymentApiValues(top, detail, i ,voucherItems ); + } } } catch (Exception e) { logger.error("预付单数据解析异常: " + e.getMessage(), e); } } - /** - * 预付单赋值 - * - * @param top json头参数 - * @param detail json分录参数 - * @param i - */ - private void setPaymentApiValues(JSONObject top, JSONObject detail, int i) { - try { - this.getModel().setValue("shjh_billno", top.getString("CompanyCode"), i); - this.getModel().setValue("shjh_prepaymentnum", top.getString("RequestCode"), i); - this.getModel().setValue("shjh_purchasenum", detail.getString("PoOrderNo"), i); - this.getModel().setValue("shjh_purchaselinenum", detail.getString("PoOrderColNo"), i); - this.getModel().setValue("shjh_billsubject", detail.getString("RequestName"), i); - this.getModel().setValue("shjh_prepaymentdate", top.getString("RequestDate"), i); - this.getModel().setValue("shjh_paymentamount", top.getBigDecimal("RequestAmt"), i); - this.getModel().setValue("shjh_documentamount", top.getBigDecimal("AvailableAmt"), i); - this.getModel().setValue("shjh_verificationnum", top.getString("StrColumn20"), i); - this.getModel().setValue("shjh_fiscalyear", top.getString("GLDate").substring(0, 4), i); - this.getModel().setValue("shjh_billheaderid", detail.getString("BillHeaderID"), i); - this.getModel().setValue("shjh_detailid", detail.getString("DetailID"), i); - this.getModel().setValue("shjh_usercode", top.getString("RequestUserCode"), i); - this.getModel().setValue("shjh_deptcode", top.getString("RequestDeptCode"), i); - } catch (Exception e) { - logger.error("预付单赋值异常: " + e.getMessage(), e); - } - } /** * 借款单数据解析 @@ -278,37 +254,81 @@ public class FeeControlApiPlugin extends AbstractFormPlugin implements Plugin { JSONObject data = root.getJSONObject("data"); JSONObject data2 = data.getJSONObject("data"); JSONArray rows = data2.getJSONArray("LoanItems"); + JSONArray voucherItems = data2.getJSONArray("VoucherItems"); DynamicObjectCollection entry = this.getModel().getEntryEntity(ENTRY_KEY); entry.clear(); for (int i = 0; i < rows.size(); i++) { JSONObject top = (JSONObject) rows.get(i); entry.addNew(); - setLoanApiValues(top, i); + setLoanApiValues(top, i,voucherItems); } } catch (Exception e) { logger.error("借款单数据解析异常: " + e.getMessage(), e); } } + /** + * 预付单赋值 + * + * @param top json头参数 + * @param detail json分录参数 + * @param i + */ + private void setPaymentApiValues(JSONObject top, JSONObject detail, int i ,JSONArray voucherItems) { + try { + this.getModel().setValue("shjh_prepaymentnum", detail.getString("RequestCode"), i); + this.getModel().setValue("shjh_purchasenum", detail.getString("PoOrderNo"), i); + this.getModel().setValue("shjh_purchaselinenum", detail.getString("PoOrderColNo"), i); + this.getModel().setValue("shjh_billsubject", detail.getString("RequestName"), i); + this.getModel().setValue("shjh_prepaymentdate", top.getString("RequestDate"), i); + this.getModel().setValue("shjh_paymentamount", detail.getBigDecimal("RequestAmt"), i); + this.getModel().setValue("shjh_documentamount", detail.getBigDecimal("AvailableAmt"), i); + this.getModel().setValue("shjh_detailid", detail.getString("DetailID"), i); + setPublicValues(top,i,voucherItems); + } catch (Exception e) { + logger.error("预付单赋值异常: " + e.getMessage(), e); + } + } + /** * 借款单赋值 * * @param top * @param i */ - private void setLoanApiValues(JSONObject top,int i) { + private void setLoanApiValues(JSONObject top,int i,JSONArray voucherItems) { try { - this.getModel().setValue("shjh_billno", top.getString("CompanyCode"), i); this.getModel().setValue("shjh_loannum", top.getString("RequestCode"), i); this.getModel().setValue("shjh_loanamount", top.getBigDecimal("RequestAmt"), i); this.getModel().setValue("shjh_loanbalance", top.getBigDecimal("AvailableAmt"), i); - this.getModel().setValue("shjh_verificationnum", top.getString("StrColumn20"), i); - this.getModel().setValue("shjh_fiscalyear", top.getString("GLDate").substring(0, 4), i); + setPublicValues(top,i,voucherItems); + } catch (Exception e) { + logger.error("借款单赋值异常: " + e.getMessage(), e); + } + } + + private void setPublicValues(JSONObject top,int i,JSONArray voucherItems) { + try { + this.getModel().setValue("shjh_billno", top.getString("CompanyCode"), i);//公司编号 + this.getModel().setValue("shjh_verificationnum", top.getString("StrColumn20"), i);//核销单凭证号 + this.getModel().setValue("shjh_fiscalyear", top.getString("GLDate").substring(0, 4), i);//会计年度 this.getModel().setValue("shjh_billheaderid", top.getString("ID"), i); this.getModel().setValue("shjh_usercode", top.getString("RequestUserCode"), i); this.getModel().setValue("shjh_deptcode", top.getString("RequestDeptCode"), i); + String id = top.getString("ID"); + for (int i1 = 0; i1 < voucherItems.size(); i1++) { + JSONObject voucherItem = (JSONObject)voucherItems.get(i1); + if (voucherItem.getString("BillHeaderID").equals(id)){ + this.getModel().setValue("shjh_coaitemfullname", voucherItem.getString("COAItemFullName"), i); + this.getModel().setValue("shjh_coaitemcode", voucherItem.getString("COAItemCode"), i); + this.getModel().setValue("shjh_coaitemname", voucherItem.getString("COAItemName"), i); + this.getModel().setValue("shjh_reasoncode", voucherItem.getString("ReasonCode"), i); + this.getModel().setValue("shjh_reasoncodename", voucherItem.getString("ReasonCodeName"), i); + break; + } + } } catch (Exception e) { - logger.error("借款单赋值异常: " + e.getMessage(), e); + logger.error("赋值异常: " + e.getMessage(), e); } } diff --git a/main/java/shjh/jhzj7/fi/fi/plugin/form/RecBillAddEntryPushPlugin.java b/main/java/shjh/jhzj7/fi/fi/plugin/form/RecBillAddEntryPushPlugin.java index cb500b1..a80b9de 100644 --- a/main/java/shjh/jhzj7/fi/fi/plugin/form/RecBillAddEntryPushPlugin.java +++ b/main/java/shjh/jhzj7/fi/fi/plugin/form/RecBillAddEntryPushPlugin.java @@ -40,7 +40,7 @@ import java.util.List; */ public class RecBillAddEntryPushPlugin extends AbstractBillPlugIn implements RowClickEventListener,Plugin { - private final static Log logger = LogFactory.getLog(RecBillAddTopPushPlugin.class); + private final static Log logger = LogFactory.getLog(RecBillAddEntryPushPlugin.class); private static final String ENTITY_REC_BILL = "cas_recbill"; private static final String TARGET_NAME="shjh_supplementpush"; diff --git a/main/java/shjh/jhzj7/fi/fi/plugin/operate/RecBillSubmitOperation.java b/main/java/shjh/jhzj7/fi/fi/plugin/operate/RecBillSubmitOperation.java new file mode 100644 index 0000000..11b0374 --- /dev/null +++ b/main/java/shjh/jhzj7/fi/fi/plugin/operate/RecBillSubmitOperation.java @@ -0,0 +1,116 @@ +package shjh.jhzj7.fi.fi.plugin.operate; + +import kd.bos.dataentity.entity.DynamicObject; +import kd.bos.dataentity.entity.DynamicObjectCollection; +import kd.bos.entity.plugin.AbstractOperationServicePlugIn; +import kd.bos.entity.plugin.args.AfterOperationArgs; +import kd.bos.logging.Log; +import kd.bos.logging.LogFactory; +import kd.bos.orm.query.QCP; +import kd.bos.orm.query.QFilter; +import kd.bos.servicehelper.BusinessDataServiceHelper; +import kd.bos.servicehelper.operation.SaveServiceHelper; +import kd.sdk.plugin.Plugin; + +import java.util.Date; + +/** + * 单据操作插件 + * 收款处理提交自动带出资金计划科目 + */ +public class RecBillSubmitOperation extends AbstractOperationServicePlugIn implements Plugin { + + private static final Log log = LogFactory.getLog(RecBillSubmitOperation.class); + + @Override + public void afterExecuteOperationTransaction(AfterOperationArgs e) { + super.afterExecuteOperationTransaction(e); + //付款单提交之后 付款标识为被动付款,并且资金计划科目为空,从配置表(shjh_pay_account)携带资金计划科目 + DynamicObject[] dataEntities = e.getDataEntities(); + for (DynamicObject bill : dataEntities) { + bill = BusinessDataServiceHelper.loadSingle(bill.getPkValue(),"cas_recbill"); + DynamicObject planClass = bill.getDynamicObject("shjh_planclass"); + if (null == planClass) { + //根据配置表携带资金计划科目 + bill.set("shjh_planclass", xdMembersubject(bill)); + SaveServiceHelper.save(new DynamicObject[]{bill}); + } + } + } + + private DynamicObject xdMembersubject(DynamicObject bill){ + //收款单,系统自动根据配置表(shjh_pay_account)带出资金计划科目 + QFilter qFilter = new QFilter("shjh_biztype", QCP.equals,"B");//业务类型:收款 + //公司范围_多选基础资料 + DynamicObject openorg = bill.getDynamicObject("openorg"); + if (null != openorg) { + Long orgid = openorg.getLong("id"); + QFilter q1 = new QFilter("shjh_companys.fbasedataid", QCP.equals, orgid); + qFilter = qFilter.and(q1); + } + //业务大类 + DynamicObject shjhBizbig = bill.getDynamicObject("shjh_bizebig"); + if (null != shjhBizbig) { + Long shjhBizbigid = shjhBizbig.getLong("id"); + QFilter q2 = new QFilter("shjh_bizbig.fbasedataid", QCP.equals, shjhBizbigid); + qFilter = qFilter.and(q2); + } + + //业务小类 + DynamicObject shjhbizsmall = bill.getDynamicObject("shjh_bizsmall"); + if (null != shjhbizsmall) { + Long shjhbizsmallid = shjhbizsmall.getLong("id"); + QFilter q3 = new QFilter("shjh_bizsmall.fbasedataid", QCP.equals, shjhbizsmallid); + qFilter = qFilter.and(q3); + } + + //成本中心 shjh_costcenter + DynamicObject shjhCostcenter = bill.getDynamicObject("shjh_costcenter"); + if (null != shjhCostcenter) { + Long costcenterid = shjhCostcenter.getLong("id"); + QFilter q4 = new QFilter("shjh_cc.fbasedataid", QCP.equals, costcenterid); + qFilter = qFilter.and(q4); + } + + //原因码 shjh_reasoncode + //会计科目 shjh_coaitemcode + DynamicObjectCollection entrys = bill.getDynamicObjectCollection("entry");//付款明细 + if (!entrys.isEmpty()) { + DynamicObject entry = entrys.get(0); + DynamicObject shjhYym = entry.getDynamicObject("shjh_yym"); + if (null != shjhYym) { + Long yymid = shjhYym.getLong("id"); + QFilter q5 = new QFilter("shjh_yym.fbasedataid", QCP.equals, yymid); + qFilter = qFilter.and(q5); + } + + DynamicObject shjhSapkjkm = entry.getDynamicObject("shjh_accountsap"); + if (null != shjhSapkjkm) { + Long kjkmid = shjhSapkjkm.getLong("id"); + QFilter q6 = new QFilter("shjh_kjkm.fbasedataid", QCP.equals, kjkmid); + qFilter = qFilter.and(q6); + } + + } + + DynamicObject[] accounts = BusinessDataServiceHelper.load("shjh_pay_account", "id,shjh_membersubject", qFilter.toArray()); + if (accounts.length > 1) { + // 根据生效日期,失效日期区间,判断当前时间满足的数据 + Date currentDate = new Date(); + QFilter startDateFilter = new QFilter("shjh_begindate", QCP.less_equals, currentDate); + QFilter endDateFilter = new QFilter("shjh_enddate", QCP.large_equals, currentDate); + QFilter newFilter = qFilter.and(startDateFilter).and(endDateFilter); + accounts = BusinessDataServiceHelper.load("shjh_pay_account", "id", newFilter.toArray()); + } + if (accounts.length > 0) { + // 处理找到符合条件的账户 + DynamicObject account = accounts[0]; + account = BusinessDataServiceHelper.loadSingle(account.getPkValue(), "shjh_pay_account"); + return account.getDynamicObject("shjh_membersubject"); + } else { + log.info("没有找到符合条件的资金计划科目"); + } + + return null; + } +} \ No newline at end of file diff --git a/main/java/shjh/jhzj7/fi/fi/plugin/operate/RecPushVoucherOperation.java b/main/java/shjh/jhzj7/fi/fi/plugin/operate/RecPushVoucherOperation.java new file mode 100644 index 0000000..40d6381 --- /dev/null +++ b/main/java/shjh/jhzj7/fi/fi/plugin/operate/RecPushVoucherOperation.java @@ -0,0 +1,442 @@ +package shjh.jhzj7.fi.fi.plugin.operate; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import kd.bos.dataentity.entity.DynamicObject; +import kd.bos.dataentity.entity.DynamicObjectCollection; +import kd.bos.dataentity.utils.StringUtils; +import kd.bos.entity.ExtendedDataEntity; +import kd.bos.entity.formula.RowDataModel; +import kd.bos.entity.operate.result.OperateErrorInfo; +import kd.bos.entity.plugin.AbstractOperationServicePlugIn; +import kd.bos.entity.plugin.AddValidatorsEventArgs; +import kd.bos.entity.plugin.PreparePropertysEventArgs; +import kd.bos.entity.plugin.args.AfterOperationArgs; +import kd.bos.entity.validate.AbstractValidator; +import kd.bos.entity.validate.ErrorLevel; +import kd.bos.logging.Log; +import kd.bos.logging.LogFactory; +import kd.bos.orm.query.QCP; +import kd.bos.orm.query.QFilter; +import kd.bos.servicehelper.BusinessDataServiceHelper; +import kd.sdk.plugin.Plugin; +import shjh.jhzj7.fi.fi.plugin.form.info.RecFieldsInfo; +import shjh.jhzj7.fi.fi.utils.ApiUtils; +import shjh.jhzj7.fi.fi.utils.EsbUtils; +import shjh.jhzj7.fi.fi.utils.JhzjUtils; +import shjh.jhzj7.fi.fi.utils.SysUtils; + +import java.io.IOException; +import java.math.BigDecimal; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.UUID; + +import static shjh.jhzj7.fi.fi.utils.SapUtils.sap_accounVoucher; + +/** + * 单据操作插件 + * 收款单推送SAP凭证 + */ +public class RecPushVoucherOperation extends AbstractOperationServicePlugIn implements Plugin { + + private final static Log logger = LogFactory.getLog(RecPushVoucherOperation.class); + + private static final String INTERFACE_ID ="FinancialTransactionVoucher";//识别被调接口并进行路由-凭证推送 + + private static final String RECEIVER_ID ="SAP";//定义的发送者 + + /** + * 操作标识 + */ + private static final String KEY_PUSH_VOUCHER= "pushvoucher"; + + /** + * 操作执行前,准备加载单据数据之前,触发此事件 + * + * @remark 插件可以在此事件中,指定需要加载的字段 + */ + @Override + public void onPreparePropertys(PreparePropertysEventArgs e) { + super.onPreparePropertys(e); + e.getFieldKeys().add(PushVoucherValidator.KEY_VOUCHER_NUM); + e.getFieldKeys().add(PushVoucherValidator.KEY_BILL_STATUS); + e.getFieldKeys().add(PushVoucherValidator.KEY_BILL_NUMBER); + e.getFieldKeys().add(PushVoucherValidator.KEY_IS_PUSH_SAP); + } + + /** + * 执行操作校验前,触发此事件 + * + * @remark 插件可以在此事件,调整预置的操作校验器;或者增加自定义操作校验器 + */ + @Override + public void onAddValidators(AddValidatorsEventArgs e) { + super.onAddValidators(e); + //添加自定义校验器:1.单据状态=已收款 2.收款明细!=空 3.是否已推送SAP=false 4.SAP凭证号=空 + e.addValidator(new RebReversalFiOperation.ReversalValidator()); + } + + /** + * 自定义校验器 + */ + static class PushVoucherValidator extends AbstractValidator { + /** + * 单据编码 + */ + public final static String KEY_BILL_NUMBER = "billno"; + /** + * 单据状态 + */ + public final static String KEY_BILL_STATUS = "billstatus"; + /** + * SAP凭证号字段标识 + */ + public final static String KEY_VOUCHER_NUM = "shjh_vouchernum"; + /** + * 是否已推送SAP + */ + public final static String KEY_IS_PUSH_SAP ="shjh_vouchernum"; + /** + * 是否已生成凭证 + */ + public final static String KEY_IS_VOUCHER ="isvoucher"; + + @Override + public void validate() { + //取数模型 + RowDataModel rowDataModel = new RowDataModel(this.entityKey, this.getValidateContext().getSubEntityType()); + ExtendedDataEntity[] dataEntities = this.getDataEntities(); + if (dataEntities != null && dataEntities.length >= 1) { + for (ExtendedDataEntity dataEntity : dataEntities) { + if (dataEntity != null) { + rowDataModel.setRowContext(dataEntity.getDataEntity()); + String billNo = (String) rowDataModel.getValue(KEY_BILL_NUMBER); + String type = (String) rowDataModel.getValue(KEY_BILL_STATUS); + if (!"D".equals(type)){ + this.addErrorMessage(dataEntity, "【" + billNo + "】未付款,无法推送。"); + } + String voucherNum = (String) rowDataModel.getValue(KEY_VOUCHER_NUM); + boolean result = (boolean) rowDataModel.getValue(KEY_IS_PUSH_SAP); + if (!voucherNum.isEmpty()||result) { + this.addErrorMessage(dataEntity, "【" + billNo + "】已推送SAP,请勿重复推送。"); + } + boolean isVoucher = (boolean) rowDataModel.getValue(KEY_IS_VOUCHER); + if (!isVoucher) { + this.addErrorMessage(dataEntity, "【" + billNo + "】未生成金蝶凭证,无法推送。"); + } + } + } + } + } + } + + @Override + public void afterExecuteOperationTransaction(AfterOperationArgs e) { + //TODO:调用SAP预付款单接口 + String operationKey = e.getOperationKey(); + if (StringUtils.equals(KEY_PUSH_VOUCHER, operationKey)) { + DynamicObject[] dataEntities = e.getDataEntities(); + if (dataEntities != null && dataEntities.length >= 1) { + for (DynamicObject dataEntity : dataEntities) { + DynamicObject recBill = BusinessDataServiceHelper.loadSingle(dataEntity.getLong("id"), "cas_recbill"); + if (null != recBill) { + JSONObject data = new JSONObject(); + //抬头,参考《IS_HEADER》 + data.put("IS_HEADER", getIS_HEADER(recBill)); + //详细,参考《IT_ITEM》 + data.put("IT_ITEM", getIT_ITEM(recBill)); + //收款类型=推预付款、员工还款需要传清账数据 + String receivingType = recBill.getString("receivingtype.number"); + if ("103".equals(receivingType)||"109".equals(receivingType)) { + //清账数据,参考《IT_CLEAR》,仅清账需要输入 + data.put("IT_CLEAR", getIT_CLEAR(recBill)); + } + String type = recBill.getString(RecFieldsInfo.PAYER_TYPE); + long id = recBill.getLong("payer"); + if (null!=type&&id!=0L){ + Boolean disposableCusOrSup = SysUtils.isDisposableCusOrSup(id, type); + if (disposableCusOrSup){ + //一次性供应商或客户信息(仅需要填写) + data.put("IS_CUSTOMERCPD", getIS_CUSTOMERCPD(recBill)); + } + } + sap_accounVoucher(data,recBill.getString("billno")); + } + } + } + } + } + + + /** + * 获取SAP凭证头信息 + * @param recBill 收款单动态对象 + * @return 包含凭证头信息的JSONObject + */ + private JSONObject getIS_HEADER(DynamicObject recBill) { + JSONObject IS_HEADER = new JSONObject(); + + // 使用线程安全的日期格式化 + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); + + // 公司代码 + IS_HEADER.put("BUKRS", recBill.getString("org.number")); + + // 凭证类型(留空) + IS_HEADER.put("BLART", ""); + + // 凭证日期 + Date bizDate = recBill.getDate("bizdate"); + IS_HEADER.put("BLDAT", bizDate != null ? format.format(bizDate) : ""); + + // 过账日期(修正了原代码中错误的条件判断) + Date payeeDate = recBill.getDate("payeedate"); + IS_HEADER.put("BUDAT", payeeDate != null ? format.format(payeeDate) : ""); + + // 币种 + DynamicObject currency = recBill.getDynamicObject("currency"); + String isoCode = currency != null ? currency.getString("number") : ""; + IS_HEADER.put("WAERS", JhzjUtils.getCurrencyCode(isoCode)); + + // 参考凭证号 + IS_HEADER.put("XBLNR", recBill.getString("billno")); + + // 凭证抬头文本 + IS_HEADER.put("BKTXT", recBill.getString("payername")); + + // 固定值 + IS_HEADER.put("USNAM", "资金系统"); + + // 以下字段初始化为空 + IS_HEADER.put("KUNNR", ""); // 客户编号 + IS_HEADER.put("LIFNR", ""); // 供应商编号 + IS_HEADER.put("ZUONR", ""); // 分配编号 + + return IS_HEADER; + } + + /** + * 获取SAP凭证行项目信息 + * @param recBill 收款单动态对象 + * @return 包含行项目信息的JSONArray + */ + private JSONArray getIT_ITEM(DynamicObject recBill) { + JSONArray IT_ITEM = new JSONArray(); + + // 1. 获取客户/供应商编号 + String payerType = recBill.getString("payertype"); + String cusOrSupNumber = getCustomerOrSupplierNumber(payerType, recBill); + + // 2. 获取原因码和SAP行项目文本 + String RSTGR = ""; + String SGTXT = ""; + DynamicObjectCollection entrys = recBill.getDynamicObjectCollection("entry"); + if (entrys != null && !entrys.isEmpty()) { + DynamicObject entry = entrys.get(0); + DynamicObject shjhYym = entry.getDynamicObject("shjh_yym"); + RSTGR = shjhYym != null ? shjhYym.getString("number") : ""; + SGTXT = entry.getString("shjh_sapline"); + } + + // 3. 获取成本中心 + String KOSTL = ""; + DynamicObject shjhCostcenter = recBill.getDynamicObject("shjh_costcenter"); + if (shjhCostcenter != null) { + KOSTL = shjhCostcenter.getString("number"); + } + + // 4. 获取利润中心 + String PRCTR = ""; + DynamicObject shjhPc = recBill.getDynamicObject("shjh_profitcenter"); + if (shjhPc != null) { + PRCTR = shjhPc.getString("number"); + } + + // 5. 查询关联的凭证信息 + DynamicObject gl_voucher = BusinessDataServiceHelper.loadSingle("gl_voucher", + "id,sourcebill,entries,entries.account,entries.debitlocal,entries.creditlocal,entries.entrydc", + new QFilter("sourcebill", QCP.equals, recBill.getPkValue()).toArray()); + + if (gl_voucher != null) { + DynamicObjectCollection entries = gl_voucher.getDynamicObjectCollection("entries"); + if (entries != null && !entries.isEmpty()) { + for (DynamicObject entry : entries) { + JSONObject IT_ITEMS = new JSONObject(); + + // 设置客户/供应商编号 + switch (payerType) { + case "bd_customer": + IT_ITEMS.put("KUNNR", cusOrSupNumber); + break; + case "bd_supplier": + IT_ITEMS.put("LIFNR", cusOrSupNumber); + break; + } + + // 设置科目 + DynamicObject account = entry.getDynamicObject("account"); + if (account != null) { + IT_ITEMS.put("HKONT", account.getString("number")); + } + + // 处理金额 + BigDecimal debitlocal = (BigDecimal) entry.get("debitlocal"); + BigDecimal creditlocal = (BigDecimal) entry.get("creditlocal"); + String entrydc = (String) entry.get("entrydc"); + + if (debitlocal != null && creditlocal != null && entrydc != null) { + BigDecimal amount = BigDecimal.ZERO; + switch (entrydc) { + case "1": // 借方 + amount = debitlocal; + break; + case "-1": // 贷方 + amount = creditlocal.negate(); + break; + default: + logger.warn("无效的分录方向: " + entrydc); + } + IT_ITEMS.put("DMBTR", amount.toString()); + } else { + logger.warn("凭证分录金额或方向为空"); + } + + // 设置其他字段 + IT_ITEMS.put("SGTXT", SGTXT); + IT_ITEMS.put("RSTGR", RSTGR); + IT_ITEMS.put("KOSTL", KOSTL); + IT_ITEMS.put("PRCTR", PRCTR); + + IT_ITEM.add(IT_ITEMS); + } + } + } + + return IT_ITEM; + } + + /** + * 收款清账凭证 + * @param recBill + * @return + */ + private JSONArray getIT_CLEAR(DynamicObject recBill){ + JSONArray IT_CLEAR = new JSONArray(); + JSONObject IT_CLEARS = new JSONObject(); + IT_CLEARS.put("BUKRS",recBill.getString("org.number"));//公司代码 + IT_CLEARS.put("BELNR",recBill.getString("shjh_vouchernum"));//会计凭证编号 + IT_CLEARS.put("GJAHR",recBill.getString("shjh_sapfiscalyear"));//会计年度 + IT_CLEARS.put("BUZEI",recBill.getString("shjh_sapline"));//行编号 + IT_CLEARS.put("KUNNR","");//客户编号 + IT_CLEARS.put("LIFNR","");//供应商编号 + IT_CLEARS.put("HKONT","");//总账科目 + IT_CLEARS.put("UMSKZ","");//特殊总帐标识 + IT_CLEARS.put("DMBTR","");//未清金额 + IT_CLEARS.put("DMBTR1","");//清账金额 + IT_CLEARS.put("DMBTR2","");//剩余金额 + IT_CLEARS.put("ERLKZ","");//已完成的未清项标识符 + IT_CLEAR.add(IT_CLEARS); + + return IT_CLEAR; + } + + private JSONArray getIS_CUSTOMERCPD(DynamicObject recBill) { + JSONArray IS_CUSTOMERCPD = new JSONArray(); + + // 提取公共字段(只需获取一次) + String city = recBill.getString("shjh_city"); // 城市 + String bankAcct = recBill.getString("payeracctbanknum"); // 银行账号 + String countryName = recBill.getString("shjh_country"); // 国家名称 + + // 国家代码转换(公共逻辑提取到外部) + String countryCode = null; + if (countryName != null) { + // 根据国家名称查询国家编码 + DynamicObject countryObject = BusinessDataServiceHelper.loadSingle( + "bd_country", + new QFilter("name", QCP.equals, countryName).toArray() + ); + if (countryObject != null) { + countryCode = countryObject.getString("number"); // 获取国家编码 + } + } + + // 判断是否客户拆分 + if (recBill.getBoolean(RecFieldsInfo.CUSTOMER_SPLIT)) { + // 处理拆分客户情况(分录级别) + DynamicObjectCollection entries = recBill.getDynamicObjectCollection("entry"); + if (entries != null) { + for (DynamicObject entry : entries) { + JSONObject customerData = new JSONObject(); + customerData.put("NAME", entry.getString("shjh_entrycustomer")); // 分录客户名称 + customerData.put("CITY", city); + if (countryCode != null) { + customerData.put("COUNTRY", countryCode); + } + customerData.put("BANK_ACCT", bankAcct); + IS_CUSTOMERCPD.add(customerData); + } + } + } else { + // 处理非拆分情况(单据级别) + JSONObject customerData = new JSONObject(); + customerData.put("NAME", recBill.getString("payername")); // 付款人名称 + customerData.put("CITY", city); + if (countryCode != null) { + customerData.put("COUNTRY", countryCode); + } + customerData.put("BANK_ACCT", bankAcct); + IS_CUSTOMERCPD.add(customerData); + } + + return IS_CUSTOMERCPD; + } + + /** + * 根据付款方类型获取客户或供应商编号 + * @param payerType 付款方类型 ("bd_customer" 或 "bd_supplier") + * @param recBill 收款单动态对象 + * @return 客户/供应商编号,如果找不到则返回空字符串 + */ + private String getCustomerOrSupplierNumber(String payerType, DynamicObject recBill) { + // 验证输入参数 + if (payerType == null || recBill == null) { + return ""; + } + + // 确定基础资料类型 + String objectType = null; + switch (payerType) { + case "bd_customer": + case "bd_supplier": + objectType = payerType; // 直接使用传入的类型,避免重复赋值 + break; + // 可在此添加其他类型的处理 + default: + return ""; // 非支持类型直接返回空 + } + + // 获取付款方ID + String payerIdStr = recBill.getString("payer"); + if (payerIdStr == null || payerIdStr.isEmpty()) { + return ""; + } + + try { + // 加载客户/供应商对象 + DynamicObject payerObject = BusinessDataServiceHelper.loadSingle( + Long.valueOf(payerIdStr), + objectType + ); + + // 返回编号字段 + return payerObject != null ? payerObject.getString("number") : ""; + } catch (NumberFormatException e) { + // 处理payerId转换异常 + return ""; + } + } + +} \ No newline at end of file diff --git a/main/java/shjh/jhzj7/fi/fi/plugin/task/ReceiptGenerationTask.java b/main/java/shjh/jhzj7/fi/fi/plugin/task/ReceiptGenerationTask.java deleted file mode 100644 index 62f54e7..0000000 --- a/main/java/shjh/jhzj7/fi/fi/plugin/task/ReceiptGenerationTask.java +++ /dev/null @@ -1,64 +0,0 @@ -package shjh.jhzj7.fi.fi.plugin.task; - -import kd.bos.context.RequestContext; -import kd.bos.dataentity.OperateOption; -import kd.bos.dataentity.entity.DynamicObject; -import kd.bos.dataentity.utils.StringUtils; -import kd.bos.entity.operate.result.OperationResult; -import kd.bos.exception.KDException; -import kd.bos.orm.query.QCP; -import kd.bos.orm.query.QFilter; -import kd.bos.schedule.api.MessageHandler; -import kd.bos.schedule.executor.AbstractTask; -import kd.bos.servicehelper.BusinessDataServiceHelper; -import kd.bos.servicehelper.operation.OperationServiceHelper; -import kd.sdk.plugin.Plugin; - -import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 收款入账中心-按规则自动生成收款单 - * - * @author LiGuiQiang - */ -public class ReceiptGenerationTask extends AbstractTask implements Plugin { - - @Override - public MessageHandler getMessageHandle() { - return super.getMessageHandle(); - } - - @Override - public void execute(RequestContext requestContext, Map map) throws KDException { - //查询【收款入账中心】 - //【待确认】receredtype - //【收款金额不等于0】creditamount - //【收款认领通知为空】claimnoticebillno - QFilter qFilter = new QFilter("receredtype", QCP.equals, "0"); - qFilter.and("creditamount", QCP.not_equals, BigDecimal.ZERO); - qFilter.and("claimnoticebillno", QCP.equals, ""); - qFilter.and("billno", QCP.equals, "20250211-0000000094"); - DynamicObject[] collection = BusinessDataServiceHelper.load("bei_intelrec", "id", qFilter.toArray()); - if (collection.length != 0) { - Object[] idArray = new Object[collection.length]; - for (int i = 0; i < collection.length; i++) { - DynamicObject dynamicObject = collection[i]; - Object id = dynamicObject.get("id"); - idArray[i] = id; - } - for (Object o : idArray) { - DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle(o, "bei_intelrec"); - - } - } - - } - - @Override - public boolean isSupportReSchedule() { - return super.isSupportReSchedule(); - } -} \ No newline at end of file diff --git a/main/java/shjh/jhzj7/fi/fi/utils/SysUtils.java b/main/java/shjh/jhzj7/fi/fi/utils/SysUtils.java index 876a74c..9fe4d48 100644 --- a/main/java/shjh/jhzj7/fi/fi/utils/SysUtils.java +++ b/main/java/shjh/jhzj7/fi/fi/utils/SysUtils.java @@ -10,15 +10,17 @@ import java.util.Map; /** * 获取系统信息工具栏 + * * @author LiGuiQiang */ public class SysUtils { /** * 获取当前用户工号 + * * @return */ - public static String getUserNumber(){ + public static String getUserNumber() { Long userId = UserServiceHelper.getCurrentUserId(); ArrayList list = new ArrayList<>(); list.add(userId); @@ -30,20 +32,40 @@ public class SysUtils { /** * 获取当前操作人部门编码 + * * @return */ - public static String getUserDeptNumber(){ - String deptNumber=null; + public static String getUserDeptNumber() { + String deptNumber = null; long userId = UserServiceHelper.getCurrentUserId(); long deptId = UserServiceHelper.getUserMainOrgId(userId); - if (deptId!=0L){ + if (deptId != 0L) { DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle(deptId, "bos_adminorg"); - if (null!=dynamicObject){ - deptNumber=dynamicObject.getString("number"); + if (null != dynamicObject) { + deptNumber = dynamicObject.getString("number"); } } return deptNumber; } + /** + * 判断一次性客户||供应商 + * @param id 客户||供应商id + * @param type 类型 + * @return + */ + public static Boolean isDisposableCusOrSup(Long id, String type) { + boolean result=false; + if ("bd_customer".equals(type) || "bd_supplier".equals(type)) { + DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle(id, type); + if (null != dynamicObject) { + String groupNumber = dynamicObject.getString("group.number"); + if ("D300".equals(groupNumber) || "D301".equals(groupNumber)) { + result=true; + } + } + } + return result; + } }