From 8d106789c5a7c2f3a82779d1a1cfb7e8e507ea20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E8=B4=B5=E5=BC=BA?= Date: Mon, 17 Feb 2025 17:57:55 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=A4=E9=A2=86=E5=A4=84=E7=90=86=E5=8D=95-?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=AD=97=E6=AE=B5-=E6=8F=90=E4=BA=A4?= =?UTF-8?q?=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fi/plugin/form/ClaimBillFormPlugin.java | 190 ++++++++++++++++++ .../fi/plugin/form/info/ClaimFieldsInfo.java | 68 +++++++ .../fi/plugin/task/ReceiptGenerationTask.java | 64 ++++++ .../validators/ClaimSubmitValidator.java | 100 +++++++++ 4 files changed, 422 insertions(+) create mode 100644 main/java/shjh/jhzj7/fi/fi/plugin/form/ClaimBillFormPlugin.java create mode 100644 main/java/shjh/jhzj7/fi/fi/plugin/form/info/ClaimFieldsInfo.java create mode 100644 main/java/shjh/jhzj7/fi/fi/plugin/task/ReceiptGenerationTask.java create mode 100644 main/java/shjh/jhzj7/fi/fi/plugin/validators/ClaimSubmitValidator.java diff --git a/main/java/shjh/jhzj7/fi/fi/plugin/form/ClaimBillFormPlugin.java b/main/java/shjh/jhzj7/fi/fi/plugin/form/ClaimBillFormPlugin.java new file mode 100644 index 0000000..485c69b --- /dev/null +++ b/main/java/shjh/jhzj7/fi/fi/plugin/form/ClaimBillFormPlugin.java @@ -0,0 +1,190 @@ +package shjh.jhzj7.fi.fi.plugin.form; + +import kd.bos.dataentity.entity.DynamicObject; +import kd.bos.dataentity.entity.DynamicObjectCollection; +import kd.bos.dataentity.utils.StringUtils; +import kd.bos.entity.datamodel.events.PropertyChangedArgs; +import kd.bos.form.field.ComboEdit; +import kd.bos.form.plugin.AbstractFormPlugin; +import kd.sdk.plugin.Plugin; +import shjh.jhzj7.fi.fi.plugin.form.info.ClaimFieldsInfo; + +import java.util.EventObject; + +/** + * 动态表单插件-【认领处理单】 + * @author LiGuiQiang + */ +public class ClaimBillFormPlugin extends AbstractFormPlugin implements Plugin { + + + @Override + public void afterBindData(EventObject e) { + super.afterBindData(e); + this.getView().setVisible(false,ClaimFieldsInfo.COST_CENTER); + this.getView().setVisible(false,ClaimFieldsInfo.REFUND_METHODS); + this.getView().setVisible(false,ClaimFieldsInfo.CUSTOMER); + this.getView().setVisible(false,ClaimFieldsInfo.REPAYMENT_METHOD); + this.getView().setVisible(false,ClaimFieldsInfo.CUSTOMER_SPLIT); + this.getView().setVisible(false,ClaimFieldsInfo.ENTRY_CUSTOMER); + hideEntryFields(); + } + + @Override + public void propertyChanged(PropertyChangedArgs e) { + super.propertyChanged(e); + String fieldKey = e.getProperty().getName(); + if (StringUtils.equals(fieldKey, ClaimFieldsInfo.REC_PAY_TYPE)) { + handleReceivingTypeChange(); + } else if (StringUtils.equals(fieldKey, ClaimFieldsInfo.REFUND_METHODS)) { + handleRefundMethodsChange(); + } else if (StringUtils.equals(fieldKey, ClaimFieldsInfo.CUSTOMER_SPLIT)) { + handleCustomerSplit(); + } + } + + private void handleReceivingTypeChange() { + DynamicObject receivingType = (DynamicObject) this.getModel().getValue(ClaimFieldsInfo.RECEIVING_TYPE); + if (null!=receivingType){ + String number = receivingType.getString("number"); + if (null!=number){ + clearFields(); + switch (number) { + case "100": + showTopFieldsBySale(); + break; + case "103": + showCostCenter(); + showRefundMethods(); + showEntryFieldsByRefund(); + break; + case "109": + showCostCenter(); + showRepaymentMethod(); + showEntryFieldsByEmployee(); + break; + default: + break; + } + } + } + + } + + private void handleRefundMethodsChange() { + String value = (String) this.getModel().getValue(ClaimFieldsInfo.REFUND_METHODS); + if (ClaimFieldsInfo.METHOD_C.equals(value) || ClaimFieldsInfo.METHOD_D.equals(value)) { + this.getView().setVisible(true, ClaimFieldsInfo.CUSTOMER); + } else { + this.getView().setVisible(false, ClaimFieldsInfo.CUSTOMER); + this.getModel().setValue(ClaimFieldsInfo.CUSTOMER, null); + } + } + + private void handleCustomerSplit(){ + Boolean split = (Boolean) this.getModel().getValue(ClaimFieldsInfo.CUSTOMER_SPLIT); + DynamicObjectCollection entry = this.getModel().getEntryEntity(ClaimFieldsInfo.ENTRY); + if (split){ + this.getView().setVisible(true,ClaimFieldsInfo.ENTRY_CUSTOMER); + }else { + this.getView().setVisible(false,ClaimFieldsInfo.ENTRY_CUSTOMER); + for (int i = 0; i < entry.size(); i++) { + this.getModel().setValue(ClaimFieldsInfo.ENTRY_CUSTOMER,null,i); + } + } + } + + private void showTopFieldsBySale(){ + this.getView().setVisible(true, ClaimFieldsInfo.CUSTOMER_SPLIT); + } + + + private void showCostCenter() { + this.getView().setVisible(true, ClaimFieldsInfo.COST_CENTER); + } + + private void showRefundMethods() { + this.getView().setVisible(true, ClaimFieldsInfo.REFUND_METHODS); + ComboEdit edit = this.getView().getControl(ClaimFieldsInfo.REFUND_METHODS); + edit.setMustInput(true); + } + + private void showEntryFieldsByRefund() { + this.getView().setVisible(true, ClaimFieldsInfo.PREPAYMENT_NUMBER); + this.getView().setVisible(true,ClaimFieldsInfo.PURCHASE_NUMBER); + this.getView().setVisible(true,ClaimFieldsInfo.PURCHASE_LINE_NUMBER); + this.getView().setVisible(true,ClaimFieldsInfo.BILL_SUBJECT); + this.getView().setVisible(true,ClaimFieldsInfo.PREPAYMENT_DATE); + this.getView().setVisible(true,ClaimFieldsInfo.PAYMENT_AMOUNT); + this.getView().setVisible(true,ClaimFieldsInfo.DOCUMENT_AMOUNT); + this.getView().setVisible(true,ClaimFieldsInfo.REFUNDED_AMOUNT); + this.getView().setVisible(true,ClaimFieldsInfo.VERIFICATION_NUMBER); + this.getView().setVisible(true,ClaimFieldsInfo.FISCAL_YEAR); + } + private void showRepaymentMethod() { + this.getView().setVisible(true, ClaimFieldsInfo.REPAYMENT_METHOD); + } + + private void showEntryFieldsByEmployee(){ + this.getView().setVisible(true,ClaimFieldsInfo.LOAN_NUMBER); + this.getView().setVisible(true,ClaimFieldsInfo.LOAN_AMOUNT); + this.getView().setVisible(true,ClaimFieldsInfo.LOAN_BALANCE); + this.getView().setVisible(true,ClaimFieldsInfo.REPAYMENT_AMOUNT); + this.getView().setVisible(true,ClaimFieldsInfo.VERIFICATION_NUMBER); + this.getView().setVisible(true,ClaimFieldsInfo.FISCAL_YEAR); + } + + private void clearFields() { + this.getModel().setValue(ClaimFieldsInfo.COST_CENTER, null); + this.getView().setVisible(false, ClaimFieldsInfo.COST_CENTER); + ComboEdit edit = this.getView().getControl(ClaimFieldsInfo.REFUND_METHODS); + edit.setMustInput(false); + this.getModel().setValue(ClaimFieldsInfo.REFUND_METHODS, null); + this.getView().setVisible(false, ClaimFieldsInfo.REFUND_METHODS); + this.getModel().setValue(ClaimFieldsInfo.CUSTOMER, null); + this.getView().setVisible(false, ClaimFieldsInfo.CUSTOMER); + this.getModel().setValue(ClaimFieldsInfo.REPAYMENT_METHOD, null); + this.getView().setVisible(false, ClaimFieldsInfo.REPAYMENT_METHOD); + this.getModel().setValue(ClaimFieldsInfo.CUSTOMER_SPLIT, null); + this.getView().setVisible(false, ClaimFieldsInfo.CUSTOMER_SPLIT); + DynamicObjectCollection entry = this.getModel().getEntryEntity(ClaimFieldsInfo.ENTRY); + if (null!=entry){ + hideEntryFields(); + for (int i = 0; i < entry.size(); i++) { + this.getModel().setValue(ClaimFieldsInfo.ENTRY_CUSTOMER, null,i); + this.getModel().setValue(ClaimFieldsInfo.PREPAYMENT_NUMBER, null,i); + this.getModel().setValue(ClaimFieldsInfo.PURCHASE_NUMBER, null,i); + this.getModel().setValue(ClaimFieldsInfo.PURCHASE_LINE_NUMBER, null,i); + this.getModel().setValue(ClaimFieldsInfo.BILL_SUBJECT, null,i); + this.getModel().setValue(ClaimFieldsInfo.PREPAYMENT_DATE, null,i); + this.getModel().setValue(ClaimFieldsInfo.PAYMENT_AMOUNT, null,i); + this.getModel().setValue(ClaimFieldsInfo.DOCUMENT_AMOUNT, null,i); + this.getModel().setValue(ClaimFieldsInfo.REFUNDED_AMOUNT, null,i); + this.getModel().setValue(ClaimFieldsInfo.LOAN_NUMBER, null,i); + this.getModel().setValue(ClaimFieldsInfo.LOAN_AMOUNT, null,i); + this.getModel().setValue(ClaimFieldsInfo.LOAN_BALANCE, null,i); + this.getModel().setValue(ClaimFieldsInfo.REPAYMENT_AMOUNT, null,i); + this.getModel().setValue(ClaimFieldsInfo.VERIFICATION_NUMBER, null,i); + this.getModel().setValue(ClaimFieldsInfo.FISCAL_YEAR, null,i); + } + } + } + + private void hideEntryFields(){ + this.getView().setVisible(false,ClaimFieldsInfo.PREPAYMENT_NUMBER); + this.getView().setVisible(false,ClaimFieldsInfo.PURCHASE_NUMBER); + this.getView().setVisible(false,ClaimFieldsInfo.PURCHASE_LINE_NUMBER); + this.getView().setVisible(false,ClaimFieldsInfo.BILL_SUBJECT); + this.getView().setVisible(false,ClaimFieldsInfo.PREPAYMENT_DATE); + this.getView().setVisible(false,ClaimFieldsInfo.PAYMENT_AMOUNT); + this.getView().setVisible(false,ClaimFieldsInfo.DOCUMENT_AMOUNT); + this.getView().setVisible(false,ClaimFieldsInfo.REFUNDED_AMOUNT); + this.getView().setVisible(false,ClaimFieldsInfo.LOAN_NUMBER); + this.getView().setVisible(false,ClaimFieldsInfo.LOAN_AMOUNT); + this.getView().setVisible(false,ClaimFieldsInfo.LOAN_BALANCE); + this.getView().setVisible(false,ClaimFieldsInfo.REPAYMENT_AMOUNT); + this.getView().setVisible(false,ClaimFieldsInfo.VERIFICATION_NUMBER); + this.getView().setVisible(false,ClaimFieldsInfo.FISCAL_YEAR); + } + +} \ No newline at end of file diff --git a/main/java/shjh/jhzj7/fi/fi/plugin/form/info/ClaimFieldsInfo.java b/main/java/shjh/jhzj7/fi/fi/plugin/form/info/ClaimFieldsInfo.java new file mode 100644 index 0000000..1dfa7dd --- /dev/null +++ b/main/java/shjh/jhzj7/fi/fi/plugin/form/info/ClaimFieldsInfo.java @@ -0,0 +1,68 @@ +package shjh.jhzj7.fi.fi.plugin.form.info; + +/** + * @author LiGuiQiang + */ +public class ClaimFieldsInfo { + + /** + * 单据标识 + */ + public static final String RECEIVING_TYPE = "e_receivingtype"; + /** + * Top:收款类型 + */ + public static final String REC_PAY_TYPE = "recpaytype"; + /** + * Top:成本中心 + */ + public static final String COST_CENTER = "shjh_costcenter"; + /** + * Top:退款方式 + */ + public static final String REFUND_METHODS = "shjh_refundmethods"; + /** + * Top:客户名称 + */ + public static final String CUSTOMER = "shjh_customer"; + /** + * Top:还款方式 + */ + public static final String REPAYMENT_METHOD = "shjh_repaymentmethod"; + /** + * Top:客户拆分 + */ + public static final String CUSTOMER_SPLIT = "shjh_customersplit"; + /** + * Top:收款金额 + */ + public static final String RE_AMOUNT="reamount"; + /** + * 分录标识 + */ + public static final String ENTRY = "entryentity"; + + public static final String ENTRY_CUSTOMER = "shjh_entrycustomer"; + + public static final String PREPAYMENT_NUMBER = "shjh_prepaymentnum"; + public static final String PURCHASE_NUMBER = "shjh_purchasenum"; + public static final String PURCHASE_LINE_NUMBER = "shjh_purchaselinenum"; + public static final String BILL_SUBJECT = "shjh_billsubject"; + public static final String PREPAYMENT_DATE = "shjh_prepaymentdate"; + public static final String PAYMENT_AMOUNT = "shjh_paymentamount"; + public static final String DOCUMENT_AMOUNT = "shjh_documentamount"; + public static final String REFUNDED_AMOUNT = "shjh_refundedamount"; + public static final String LOAN_NUMBER = "shjh_loannum"; + public static final String LOAN_AMOUNT = "shjh_loanamount"; + public static final String LOAN_BALANCE = "shjh_loanbalance"; + public static final String REPAYMENT_AMOUNT = "shjh_repaymentamount"; + public static final String VERIFICATION_NUMBER = "shjh_verificationnum"; + public static final String FISCAL_YEAR = "shjh_fiscalyear"; + public static final String METHOD_C = "C"; + public static final String METHOD_D = "D"; + + /** + * Entry:应收金额 + */ + public static final String RECEIVABLE_AMOUNT = "e_receivableamt"; +} diff --git a/main/java/shjh/jhzj7/fi/fi/plugin/task/ReceiptGenerationTask.java b/main/java/shjh/jhzj7/fi/fi/plugin/task/ReceiptGenerationTask.java new file mode 100644 index 0000000..62f54e7 --- /dev/null +++ b/main/java/shjh/jhzj7/fi/fi/plugin/task/ReceiptGenerationTask.java @@ -0,0 +1,64 @@ +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/plugin/validators/ClaimSubmitValidator.java b/main/java/shjh/jhzj7/fi/fi/plugin/validators/ClaimSubmitValidator.java new file mode 100644 index 0000000..00b96ae --- /dev/null +++ b/main/java/shjh/jhzj7/fi/fi/plugin/validators/ClaimSubmitValidator.java @@ -0,0 +1,100 @@ +package shjh.jhzj7.fi.fi.plugin.validators; + +import kd.bos.dataentity.entity.DynamicObject; +import kd.bos.dataentity.entity.DynamicObjectCollection; +import kd.bos.entity.ExtendedDataEntity; +import kd.bos.entity.validate.AbstractValidator; +import shjh.jhzj7.fi.fi.plugin.form.info.ClaimFieldsInfo; + +import java.math.BigDecimal; +import java.math.RoundingMode; + +/** + * 认领处理单-提交操作校验 + * + * @author LiGuiQiang + */ +public class ClaimSubmitValidator extends AbstractValidator { + @Override + public void validate() { + ExtendedDataEntity[] dataEntities = this.getDataEntities(); + if (dataEntities != null && dataEntities.length >= 1) { + for (ExtendedDataEntity dataEntity : dataEntities) { + if (dataEntity != null) { + DynamicObject bill = dataEntity.getDataEntity(); + DynamicObjectCollection entry = bill.getDynamicObjectCollection(ClaimFieldsInfo.ENTRY); + if (entry != null && !entry.isEmpty()) { + BigDecimal reAmount = bill.getBigDecimal(ClaimFieldsInfo.RE_AMOUNT); + BigDecimal receivableAll = BigDecimal.ZERO; + BigDecimal refundedAll = BigDecimal.ZERO; + BigDecimal repaymentAll = BigDecimal.ZERO; + + // 计算所有金额的合计 + for (DynamicObject dynamicObject : entry) { + receivableAll = receivableAll.add(dynamicObject.getBigDecimal(ClaimFieldsInfo.RECEIVABLE_AMOUNT)); + refundedAll = refundedAll.add(dynamicObject.getBigDecimal(ClaimFieldsInfo.REFUNDED_AMOUNT)); + repaymentAll = repaymentAll.add(dynamicObject.getBigDecimal(ClaimFieldsInfo.REPAYMENT_AMOUNT)); + } + + DynamicObject receivingType = bill.getDynamicObject(ClaimFieldsInfo.REC_PAY_TYPE); + if (null != receivingType) { + String type = receivingType.getString("number"); + if (null != type) { + if (isAmountInvalid(type, reAmount, receivableAll, refundedAll, repaymentAll)) { + String errorMessage = getErrorMessage(type, reAmount, receivableAll, refundedAll, repaymentAll); + this.addErrorMessage(dataEntity, errorMessage); + } + } + } + } + } + } + } + } + + /** + * 判断金额是否有效 + * + * @param type 收款类型 + * @param reAmount 收款金额 + * @param receivableAll 应收金额合计 + * @param refundedAll 退还金额合计 + * @param repaymentAll 还款金额合计 + * @return 布尔值 + */ + private boolean isAmountInvalid(String type, BigDecimal reAmount, BigDecimal receivableAll, BigDecimal refundedAll, BigDecimal repaymentAll) { + switch (type) { + case "100": + return reAmount.compareTo(receivableAll) <= 0; + case "103": + return reAmount.compareTo(refundedAll) <= 0; + case "109": + return reAmount.compareTo(repaymentAll) <= 0; + default: + return false; + } + } + + /** + * 获取错误信息 + * + * @param type 收款类型 + * @param reAmount 收款金额 + * @param receivableAll 应收金额合计 + * @param refundedAll 退还金额合计 + * @param repaymentAll 还款金额合计 + * @return 错误信息 + */ + private String getErrorMessage(String type, BigDecimal reAmount, BigDecimal receivableAll, BigDecimal refundedAll, BigDecimal repaymentAll) { + switch (type) { + case "100": + return String.format("提交失败:分录应收金额合计(%.2f)应小于等于收款金额(%.2f)", receivableAll.setScale(2, RoundingMode.DOWN).doubleValue(), reAmount.setScale(2, RoundingMode.DOWN).doubleValue()); + case "103": + return String.format("提交失败:分录本次退还本位币金额合计(%.2f)应小于等于收款金额(%.2f)", refundedAll.setScale(2, RoundingMode.DOWN).doubleValue(), reAmount.setScale(2, RoundingMode.DOWN).doubleValue()); + case "109": + return String.format("提交失败:分录本次还款金额合计(%.2f)应小于等于收款金额(%.2f)", repaymentAll.setScale(2, RoundingMode.DOWN).doubleValue(), reAmount.setScale(2, RoundingMode.DOWN).doubleValue()); + default: + return ""; + } + } +}