From 3a04faa5690259cf7b4eb7c22f18ad297a174b6d Mon Sep 17 00:00:00 2001 From: zoujiangtao Date: Wed, 2 Jul 2025 10:47:14 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E5=86=85=E5=AE=B9=EF=BC=9A?= =?UTF-8?q?=E9=BC=A0=E6=A0=87=E6=82=AC=E5=81=9C=E6=A0=BC=E5=BC=8F=E5=8C=96?= =?UTF-8?q?=E9=87=91=E9=A2=9D=20=E6=97=B6=E9=97=B4=EF=BC=9A2025-07-02=2010?= =?UTF-8?q?=EF=BC=9A46=20=E6=8F=90=E4=BA=A4=E4=BA=BA=EF=BC=9A=E9=82=B9?= =?UTF-8?q?=E6=B1=9F=E6=B6=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../form/PaymentProcessingBillPlugin.java | 35 +++- .../form/PaymentProcessingFormPlugin.java | 152 ++++++++++++++++ .../PaymentSlipAssociationFixed.java | 165 ++++++++++++++---- 3 files changed, 314 insertions(+), 38 deletions(-) create mode 100644 sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/form/PaymentProcessingFormPlugin.java diff --git a/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/form/PaymentProcessingBillPlugin.java b/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/form/PaymentProcessingBillPlugin.java index bb4e4dd..c12b97d 100644 --- a/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/form/PaymentProcessingBillPlugin.java +++ b/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/form/PaymentProcessingBillPlugin.java @@ -22,10 +22,17 @@ import kd.bos.entity.datamodel.ListSelectedRowCollection; import kd.bos.entity.datamodel.events.ChangeData; import kd.bos.entity.datamodel.events.PropertyChangedArgs; import kd.bos.entity.operate.result.OperationResult; +import kd.bos.form.FormShowParameter; import kd.bos.form.IPageCache; +import kd.bos.form.control.Control; import kd.bos.form.control.Toolbar; +import kd.bos.form.control.events.AfterShowTipsEvent; +import kd.bos.form.control.events.BeforeShowTipsEvent; import kd.bos.form.control.events.ItemClickEvent; +import kd.bos.form.control.events.TipsListener; +import kd.bos.form.events.AfterDoOperationEventArgs; import kd.bos.form.events.BeforeDoOperationEventArgs; +import kd.bos.form.field.FieldEdit; import kd.bos.form.field.RefBillEdit; import kd.bos.form.field.events.BeforeF7SelectEvent; import kd.bos.form.field.events.BeforeF7SelectListener; @@ -52,7 +59,7 @@ import static kd.bos.servicehelper.workflow.WorkflowServiceHelper.abandonByBusie /** * 单据界面插件 */ -public class PaymentProcessingBillPlugin extends AbstractBillPlugIn implements Plugin, BeforeF7SelectListener { +public class PaymentProcessingBillPlugin extends AbstractBillPlugIn implements Plugin, BeforeF7SelectListener, TipsListener { private static final Log logger = LogFactory.getLog(PaymentProcessingBillPlugin.class); public static final List update_sk = Arrays.asList("payeename","payeebanknum","recaccbankname","payeecurrency","payeebank","payeebankname","recbanknumber");//拉单需要更新的收款方 @@ -67,6 +74,8 @@ public class PaymentProcessingBillPlugin extends AbstractBillPlugIn implements P RefBillEdit shkd_ywcl = this.getView().getControl("shkd_ywcl");//业务处理 shkd_ywcl.addBeforeF7SelectListener(this); + FieldEdit actpayamt = getControl("actpayamt"); + actpayamt.addTipsListener(this); } @Override @@ -395,4 +404,28 @@ public class PaymentProcessingBillPlugin extends AbstractBillPlugIn implements P return enableRules; } + + @Override + public void afterDoOperation(AfterDoOperationEventArgs afterDoOperationEventArgs) { + super.afterDoOperation(afterDoOperationEventArgs); + String operateKey = afterDoOperationEventArgs.getOperateKey(); + logger.info("调用操作代码 → {}", operateKey); + } + + @Override + public void beforeShowTips(BeforeShowTipsEvent beforeShowTipsEvent) { + Control source = (FieldEdit) beforeShowTipsEvent.getSource(); + FormShowParameter formshowParameter = beforeShowTipsEvent.getFormshowParameter(); + if(formshowParameter == null) { + formshowParameter = new FormShowParameter(); + } + //将点击控件标识传递给子页面用于获取填报指引详情数据 + formshowParameter.setCustomParam("amount", this.getModel().getValue(source.getKey())); + beforeShowTipsEvent.setFormshowParameter(formshowParameter); + } + + @Override + public void afterShowTips(AfterShowTipsEvent afterShowTipsEvent) { + + } } \ No newline at end of file diff --git a/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/form/PaymentProcessingFormPlugin.java b/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/form/PaymentProcessingFormPlugin.java new file mode 100644 index 0000000..3ca75f1 --- /dev/null +++ b/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/form/PaymentProcessingFormPlugin.java @@ -0,0 +1,152 @@ +package shkd.sys.sys.plugin.form; + +import kd.bos.form.FormShowParameter; +import kd.bos.form.plugin.AbstractFormPlugin; +import kd.sdk.plugin.Plugin; + +import java.math.BigDecimal; +import java.text.DecimalFormat; +import java.util.EventObject; + +/** + * 动态表单插件 + */ +public class PaymentProcessingFormPlugin extends AbstractFormPlugin implements Plugin { + private static final String[] CN_NUMBERS = {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九"}; + private static final String[] CN_UNITS = {"", "十", "百", "千"}; + private static final String[] CN_BIG_UNITS = {"", "万", "亿", "万亿"}; + + @Override + public void afterCreateNewData(EventObject e) { + super.afterCreateNewData(e); + FormShowParameter formShowParameter = getView().getFormShowParameter(); + //FormShowParameter获取父页面被点击控件的标识 + Object amountObj = formShowParameter.getCustomParam("amount"); + if (amountObj != null) { + BigDecimal amount; + if (amountObj instanceof BigDecimal) { + amount = (BigDecimal) amountObj; + } else { + try { + amount = new BigDecimal(amountObj.toString()); + } catch (NumberFormatException ex) { + // 处理非法数字格式 + this.getModel().setValue("shkd_amount", "0.00"); + return; + } + } + this.getModel().setValue("shkd_amount", numberToFormat(amount)); + } + } + + public static String numberToFormat(BigDecimal amount) { + BigDecimal integerPart = amount.setScale(0, BigDecimal.ROUND_DOWN); + BigDecimal decimalPart = amount.remainder(BigDecimal.ONE) + .setScale(2, BigDecimal.ROUND_DOWN); + + String formattedInteger = formatInteger(integerPart.longValueExact()); + String formattedDecimal = decimalPart.toPlainString().replace("0.", ""); + + return "00".equals(formattedDecimal) ? formattedInteger : formattedInteger + "." + formattedDecimal; + } + + private static String formatInteger(long number) { + StringBuilder result = new StringBuilder(); + + if (number >= 1_0000_0000_0000L) { + long zhao = number / 1_0000_0000_0000L; + long yiPart = (number % 1_0000_0000_0000L) / 1_0000_0000L; + long wanPart = (number % 1_0000_0000L) / 10000; + long remain = number % 10000; + + if (zhao > 0) result.append(zhao).append("兆"); + + // 如果后面还有非零部分才显示 + if (yiPart > 0 || wanPart > 0 || remain > 0) { + if (yiPart > 0) result.append(String.format("%04d", yiPart)).append("亿"); + else result.append("0000亿"); + + if (wanPart > 0) result.append(String.format("%04d", wanPart)).append("万"); + else result.append("0000万"); + + if (remain > 0) result.append(String.format("%04d", remain)); + } + + } else if (number >= 100000000) { + long yi = number / 100000000; + long wanPart = (number % 100000000) / 10000; + long remain = number % 10000; + + if (yi > 0) result.append(yi).append("亿"); + + if (wanPart > 0 || remain > 0) { + if (wanPart > 0) result.append(String.format("%04d", wanPart)).append("万"); + else result.append("0000万"); + + if (remain > 0) result.append(String.format("%04d", remain)); + } + + } else if (number >= 10000) { + int wan = (int)(number / 10000); + int remain = (int)(number % 10000); + + result.append(wan).append("万"); + if (remain > 0) result.append(String.format("%04d", remain)); + + } else { + result.append(number); + } + + return result.toString(); + } + + public static String numberToChinese(double number) { + // 分割整数部分和小数部分 + String[] parts = new DecimalFormat("#.00").format(number).split("\\."); + long integerPart = Long.parseLong(parts[0]); + String decimalPart = parts[1]; + + // 处理整数部分 + StringBuilder chineseInteger = new StringBuilder(); + int unitIndex = 0; + int bigUnitIndex = 0; + + while (integerPart > 0) { + int section = (int) (integerPart % 10000); + if (section != 0) { + chineseInteger.insert(0, convertSection(section) + CN_BIG_UNITS[bigUnitIndex]); + } + integerPart /= 10000; + bigUnitIndex++; + } + + // 处理小数部分 + StringBuilder chineseDecimal = new StringBuilder(); + for (char c : decimalPart.toCharArray()) { + chineseDecimal.append(CN_NUMBERS[c - '0']); + } + + return chineseInteger.toString() + "." + chineseDecimal.toString(); + } + + private static String convertSection(int number) { + StringBuilder result = new StringBuilder(); + int unitIndex = 0; + + while (number > 0) { + int digit = number % 10; + if (digit != 0) { + result.insert(0, CN_NUMBERS[digit] + CN_UNITS[unitIndex]); + } else { + // 如果当前位是零,并且前一位不是零,则添加一个零 + if (result.length() > 0 && result.charAt(0) != '零') { + result.insert(0, "零"); + } + } + number /= 10; + unitIndex++; + } + + return result.toString(); + } +} \ No newline at end of file diff --git a/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/operation/PaymentSlipAssociationFixed.java b/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/operation/PaymentSlipAssociationFixed.java index 4f4b308..362926f 100644 --- a/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/operation/PaymentSlipAssociationFixed.java +++ b/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/operation/PaymentSlipAssociationFixed.java @@ -1,11 +1,19 @@ package shkd.sys.sys.plugin.operation; +import kd.bos.dataentity.OperateOption; import kd.bos.dataentity.entity.DynamicObject; import kd.bos.dataentity.entity.DynamicObjectCollection; +import kd.bos.dataentity.metadata.dynamicobject.DynamicCollectionProperty; +import kd.bos.dataentity.metadata.dynamicobject.DynamicProperty; +import kd.bos.entity.EntityMetadataCache; +import kd.bos.entity.MainEntityType; +import kd.bos.entity.operate.result.OperationResult; import kd.bos.entity.plugin.AbstractOperationServicePlugIn; import kd.bos.entity.plugin.args.AfterOperationArgs; import kd.bos.i18n.mservice.I18nServiceHelper; import kd.bos.i18n.mservice.utils.AmountConvertResult; +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; @@ -13,73 +21,156 @@ import kd.bos.servicehelper.BusinessDataServiceHelper; import java.math.BigDecimal; import java.util.Date; +import kd.bos.servicehelper.operation.OperationServiceHelper; import kd.bos.servicehelper.operation.SaveServiceHelper; import kd.fi.cas.helper.CasBotpHelper; import kd.sdk.plugin.Plugin; +import shkd.sys.sys.plugin.form.PaymentProcessingBillPlugin; /** * 单据操作插件 * 修复付款单和应收票据关联关系 */ public class PaymentSlipAssociationFixed extends AbstractOperationServicePlugIn implements Plugin { + private static final Log logger = LogFactory.getLog(PaymentSlipAssociationFixed.class); @Override public void afterExecuteOperationTransaction(AfterOperationArgs e) { super.afterExecuteOperationTransaction(e); + + logger.info("进入save操作代码方法"); + DynamicObject[] dataEntities = e.getDataEntities(); DynamicObject dataEntity = dataEntities[0]; - // 付款单 - DynamicObject fkDynamicObject = BusinessDataServiceHelper.loadSingle(dataEntity.getPkValue(), dataEntity.getDynamicObjectType()); - // 付款金额 - BigDecimal actpayamt = fkDynamicObject.getBigDecimal("actpayamt"); - String formattedValue = String.format("%.2f", Double.parseDouble(actpayamt.toString())); - - // 大写金额 - String shkdZwamount = fkDynamicObject.getString("shkd_zwamount"); - - AmountConvertResult amountConvertResult = I18nServiceHelper.amountConvertUppercase( - "ZH", "CNY", formattedValue, "false"); - - if (amountConvertResult.isSuccess() && !shkdZwamount.equals(amountConvertResult.getResult())) { - fkDynamicObject.set("shkd_zwamount", amountConvertResult.getResult()); - } - - // 来源系统 - Object businessnameObj = fkDynamicObject.get("shkd_businessname"); - - // 付款单关联票据分录 - String blEntryKey = fkDynamicObject.getDataEntityType().getName() + "_bl"; - DynamicObjectCollection dynamicObjectCollection = fkDynamicObject.getDynamicObjectCollection(blEntryKey); - - // 票据关联付款单不为空,说明已经关联了 - if (!dynamicObjectCollection.isEmpty()) { + // 是否关联票据 + boolean shkdIsrenotes = dataEntity.getBoolean("shkd_isrenotes"); + if (shkdIsrenotes) { return; } - if (dataEntity.get("settletnumber") != null) { - String settletnumber = dataEntity.getString("settletnumber");//结算号 - DynamicObject[] dynamicObjects = BusinessDataServiceHelper.load("cdm_payablebill", "id,draftbillno", new QFilter("draftbillno", QCP.equals, settletnumber).toArray()); + // 付款单 + DynamicObject fkDynamicObject = BusinessDataServiceHelper.loadSingle(dataEntity.getPkValue(), dataEntity.getDynamicObjectType()); + + // 结算方式为空,则不处理 + DynamicObject settletype = fkDynamicObject.getDynamicObject("settletype"); + if (settletype == null) { + return; + } + String settletype_number = settletype.getString("number");// 结算方式 + + + // 结算号为空,则不处理 + if (dataEntity.get("settletnumber") == null || "".equals(dataEntity.getString("settletnumber"))) { + return; + } + String settletnumber = dataEntity.getString("settletnumber");//结算号 + + // 来源系统 + Object businessnameObj = fkDynamicObject.get("shkd_businessname"); + if (businessnameObj == null || !"XK".equals(businessnameObj.toString())){ + return; + } + + if ("JSFS06、JSFS07、JSFS19、JSFS20".contains(settletype_number)) { + DynamicObject[] dynamicObjects = BusinessDataServiceHelper.load("cdm_payablebill", "id," + + "draftbillno,releatedcasbillentrys,releatedcasbillentrys.rel_billtype,releatedcasbillentrys.rel_billno," + + "releatedcasbillentrys.rel_billid,releatedcasbillentrys.rel_bizdate,releatedcasbillentrys.rel_billamount," + + "releatedcasbillentrys.rel_createtime,releatedcasbillentrys.rel_modifytime", new QFilter("draftbillno", QCP.equals, settletnumber).toArray()); + + if (dynamicObjects.length > 0) { + + DynamicObjectCollection releatedcasbillentrys = dynamicObjects[0].getDynamicObjectCollection("releatedcasbillentrys"); + + if (!releatedcasbillentrys.isEmpty()) { + return; + } - if (businessnameObj != null && "XK".equals(businessnameObj.toString()) && dynamicObjects.length > 0) { // 写入付款单关联票据关联关系 - DynamicObject linkRow = new DynamicObject(dynamicObjectCollection.getDynamicObjectType()); - linkRow.set(blEntryKey + "_basedataid", dynamicObjects[0].getPkValue()); - dynamicObjectCollection.add(linkRow); - SaveServiceHelper.save(new DynamicObject[]{fkDynamicObject}); + + MainEntityType entityType = EntityMetadataCache.getDataEntityType(fkDynamicObject.getDataEntityType().getName()); + DynamicCollectionProperty currencyProp = (DynamicCollectionProperty) entityType.getProperty("draftbill"); + DynamicObjectCollection collection = new DynamicObjectCollection(currencyProp.getDynamicCollectionItemPropertyType(), fkDynamicObject); + DynamicObject dynamicObject = new DynamicObject(currencyProp.getDynamicCollectionItemPropertyType()); + dynamicObject.set("fbasedataid", dynamicObjects[0]); + dynamicObject.set("fbasedataid_id", dynamicObjects[0].getPkValue()); + collection.add(dynamicObject); + + fkDynamicObject.set("draftbill", collection); + fkDynamicObject.set("shkd_isrenotes", true); // 写入票据关联付款单关联关系 - DynamicObject kpdjDynamicObject = BusinessDataServiceHelper.loadSingle(dynamicObjects[0].getPkValue(), dynamicObjects[0].getDynamicObjectType()); - DynamicObjectCollection releatedcasbillentrys = kpdjDynamicObject.getDynamicObjectCollection("releatedcasbillentrys"); DynamicObject kpLinkRow = new DynamicObject(releatedcasbillentrys.getDynamicObjectType()); - kpLinkRow.set("rel_billtype", "cas_paybill");// 关联单据类型 + + kpLinkRow.set("rel_billtype", "cas_paybill");// 关联单据类型 → 付款处理 kpLinkRow.set("rel_billno", fkDynamicObject.getString("billno"));// 关联单据编号 kpLinkRow.set("rel_billid", fkDynamicObject.getPkValue());// 关联单据ID kpLinkRow.set("rel_bizdate", fkDynamicObject.get("bizdate"));// 出纳单据业务日期 kpLinkRow.set("rel_billamount", fkDynamicObject.get("actpayamt"));// 关联单据金额 kpLinkRow.set("rel_createtime", new Date());// 关联信息创建时间 kpLinkRow.set("rel_modifytime", new Date());// 记录修改时间 + releatedcasbillentrys.add(kpLinkRow); - SaveServiceHelper.save(new DynamicObject[]{kpdjDynamicObject}); + + dynamicObjects[0].set("releatedcasbillentrys", releatedcasbillentrys); + SaveServiceHelper.save(dynamicObjects); + + // 最后保存付款单 + SaveServiceHelper.save(new DynamicObject[]{fkDynamicObject}); + } + } else if ("JSFS09".equals(settletype_number)) { + + // 收票登记:cdm_receivablebill + DynamicObject[] dynamicObjects = BusinessDataServiceHelper.load("cdm_receivablebill", "id," + + "draftbillno,releatedcasbillentrys,releatedcasbillentrys.rel_billtype,releatedcasbillentrys.rel_billno," + + "releatedcasbillentrys.rel_billid,releatedcasbillentrys.rel_bizdate,releatedcasbillentrys.rel_billamount," + + "releatedcasbillentrys.rel_createtime,releatedcasbillentrys.rel_modifytime", new QFilter("draftbillno", QCP.equals, settletnumber).toArray()); + + if (dynamicObjects.length > 0) { + + DynamicObjectCollection releatedcasbillentrys = dynamicObjects[0].getDynamicObjectCollection("releatedcasbillentrys"); + + if (!releatedcasbillentrys.isEmpty()) { + return; + } + + // 写入付款单关联票据关联关系 + + MainEntityType entityType = EntityMetadataCache.getDataEntityType(fkDynamicObject.getDataEntityType().getName()); + DynamicCollectionProperty currencyProp = (DynamicCollectionProperty) entityType.getProperty("draftbill"); + DynamicObjectCollection collection = new DynamicObjectCollection(currencyProp.getDynamicCollectionItemPropertyType(), fkDynamicObject); + DynamicObject dynamicObject = new DynamicObject(currencyProp.getDynamicCollectionItemPropertyType()); + dynamicObject.set("fbasedataid", dynamicObjects[0]); + dynamicObject.set("fbasedataid_id", dynamicObjects[0].getPkValue()); + collection.add(dynamicObject); + + fkDynamicObject.set("draftbill", collection); + fkDynamicObject.set("shkd_isrenotes", true); + + // 写入票据关联付款单关联关系 + DynamicObject kpLinkRow = new DynamicObject(releatedcasbillentrys.getDynamicObjectType()); + + kpLinkRow.set("rel_billtype", "cas_recbill");// 关联单据类型 → 收款处理 + kpLinkRow.set("rel_billno", fkDynamicObject.getString("billno"));// 关联单据编号 + kpLinkRow.set("rel_billid", fkDynamicObject.getPkValue());// 关联单据ID + kpLinkRow.set("rel_bizdate", fkDynamicObject.get("bizdate"));// 出纳单据业务日期 + kpLinkRow.set("rel_billamount", fkDynamicObject.get("actpayamt"));// 关联单据金额 + kpLinkRow.set("rel_createtime", new Date());// 关联信息创建时间 + kpLinkRow.set("rel_modifytime", new Date());// 记录修改时间 + + releatedcasbillentrys.add(kpLinkRow); + + dynamicObjects[0].set("releatedcasbillentrys", releatedcasbillentrys); + SaveServiceHelper.save(dynamicObjects); + + // 最后保存付款单 + SaveServiceHelper.save(new DynamicObject[]{fkDynamicObject}); + + OperationResult result = OperationServiceHelper.executeOperate("endorse", "cas_paybill", new DynamicObject[]{fkDynamicObject}, OperateOption.create()); + if (result.isSuccess()) { + logger.info("背书成功"); + } else { + logger.info("背书失败"); + } } } }