Merge remote-tracking branch 'origin/main'

This commit is contained in:
wenlukang1 2025-07-02 14:46:20 +08:00
commit 9757195a14
3 changed files with 314 additions and 38 deletions

View File

@ -22,10 +22,17 @@ import kd.bos.entity.datamodel.ListSelectedRowCollection;
import kd.bos.entity.datamodel.events.ChangeData; import kd.bos.entity.datamodel.events.ChangeData;
import kd.bos.entity.datamodel.events.PropertyChangedArgs; import kd.bos.entity.datamodel.events.PropertyChangedArgs;
import kd.bos.entity.operate.result.OperationResult; import kd.bos.entity.operate.result.OperationResult;
import kd.bos.form.FormShowParameter;
import kd.bos.form.IPageCache; import kd.bos.form.IPageCache;
import kd.bos.form.control.Control;
import kd.bos.form.control.Toolbar; 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.ItemClickEvent;
import kd.bos.form.control.events.TipsListener;
import kd.bos.form.events.AfterDoOperationEventArgs;
import kd.bos.form.events.BeforeDoOperationEventArgs; import kd.bos.form.events.BeforeDoOperationEventArgs;
import kd.bos.form.field.FieldEdit;
import kd.bos.form.field.RefBillEdit; import kd.bos.form.field.RefBillEdit;
import kd.bos.form.field.events.BeforeF7SelectEvent; import kd.bos.form.field.events.BeforeF7SelectEvent;
import kd.bos.form.field.events.BeforeF7SelectListener; 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); private static final Log logger = LogFactory.getLog(PaymentProcessingBillPlugin.class);
public static final List<String> update_sk = Arrays.asList("payeename","payeebanknum","recaccbankname","payeecurrency","payeebank","payeebankname","recbanknumber");//拉单需要更新的收款方 public static final List<String> 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");//业务处理 RefBillEdit shkd_ywcl = this.getView().getControl("shkd_ywcl");//业务处理
shkd_ywcl.addBeforeF7SelectListener(this); shkd_ywcl.addBeforeF7SelectListener(this);
FieldEdit actpayamt = getControl("actpayamt");
actpayamt.addTipsListener(this);
} }
@Override @Override
@ -395,4 +404,28 @@ public class PaymentProcessingBillPlugin extends AbstractBillPlugIn implements P
return enableRules; 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) {
}
} }

View File

@ -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();
}
}

View File

@ -1,11 +1,19 @@
package shkd.sys.sys.plugin.operation; package shkd.sys.sys.plugin.operation;
import kd.bos.dataentity.OperateOption;
import kd.bos.dataentity.entity.DynamicObject; import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.dataentity.entity.DynamicObjectCollection; 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.AbstractOperationServicePlugIn;
import kd.bos.entity.plugin.args.AfterOperationArgs; import kd.bos.entity.plugin.args.AfterOperationArgs;
import kd.bos.i18n.mservice.I18nServiceHelper; import kd.bos.i18n.mservice.I18nServiceHelper;
import kd.bos.i18n.mservice.utils.AmountConvertResult; 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.QCP;
import kd.bos.orm.query.QFilter; import kd.bos.orm.query.QFilter;
import kd.bos.servicehelper.BusinessDataServiceHelper; import kd.bos.servicehelper.BusinessDataServiceHelper;
@ -13,73 +21,156 @@ import kd.bos.servicehelper.BusinessDataServiceHelper;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.Date; import java.util.Date;
import kd.bos.servicehelper.operation.OperationServiceHelper;
import kd.bos.servicehelper.operation.SaveServiceHelper; import kd.bos.servicehelper.operation.SaveServiceHelper;
import kd.fi.cas.helper.CasBotpHelper; import kd.fi.cas.helper.CasBotpHelper;
import kd.sdk.plugin.Plugin; import kd.sdk.plugin.Plugin;
import shkd.sys.sys.plugin.form.PaymentProcessingBillPlugin;
/** /**
* 单据操作插件 * 单据操作插件
* 修复付款单和应收票据关联关系 * 修复付款单和应收票据关联关系
*/ */
public class PaymentSlipAssociationFixed extends AbstractOperationServicePlugIn implements Plugin { public class PaymentSlipAssociationFixed extends AbstractOperationServicePlugIn implements Plugin {
private static final Log logger = LogFactory.getLog(PaymentSlipAssociationFixed.class);
@Override @Override
public void afterExecuteOperationTransaction(AfterOperationArgs e) { public void afterExecuteOperationTransaction(AfterOperationArgs e) {
super.afterExecuteOperationTransaction(e); super.afterExecuteOperationTransaction(e);
logger.info("进入save操作代码方法");
DynamicObject[] dataEntities = e.getDataEntities(); DynamicObject[] dataEntities = e.getDataEntities();
DynamicObject dataEntity = dataEntities[0]; DynamicObject dataEntity = dataEntities[0];
// 付款单
DynamicObject fkDynamicObject = BusinessDataServiceHelper.loadSingle(dataEntity.getPkValue(), dataEntity.getDynamicObjectType());
// 付款金额 // 是否关联票据
BigDecimal actpayamt = fkDynamicObject.getBigDecimal("actpayamt"); boolean shkdIsrenotes = dataEntity.getBoolean("shkd_isrenotes");
String formattedValue = String.format("%.2f", Double.parseDouble(actpayamt.toString())); if (shkdIsrenotes) {
// 大写金额
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()) {
return; return;
} }
if (dataEntity.get("settletnumber") != null) { // 付款单
String settletnumber = dataEntity.getString("settletnumber");//结算号 DynamicObject fkDynamicObject = BusinessDataServiceHelper.loadSingle(dataEntity.getPkValue(), dataEntity.getDynamicObjectType());
DynamicObject[] dynamicObjects = BusinessDataServiceHelper.load("cdm_payablebill", "id,draftbillno", new QFilter("draftbillno", QCP.equals, settletnumber).toArray());
// 结算方式为空则不处理
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()); MainEntityType entityType = EntityMetadataCache.getDataEntityType(fkDynamicObject.getDataEntityType().getName());
dynamicObjectCollection.add(linkRow); DynamicCollectionProperty currencyProp = (DynamicCollectionProperty) entityType.getProperty("draftbill");
SaveServiceHelper.save(new DynamicObject[]{fkDynamicObject}); 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()); 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_billno", fkDynamicObject.getString("billno"));// 关联单据编号
kpLinkRow.set("rel_billid", fkDynamicObject.getPkValue());// 关联单据ID kpLinkRow.set("rel_billid", fkDynamicObject.getPkValue());// 关联单据ID
kpLinkRow.set("rel_bizdate", fkDynamicObject.get("bizdate"));// 出纳单据业务日期 kpLinkRow.set("rel_bizdate", fkDynamicObject.get("bizdate"));// 出纳单据业务日期
kpLinkRow.set("rel_billamount", fkDynamicObject.get("actpayamt"));// 关联单据金额 kpLinkRow.set("rel_billamount", fkDynamicObject.get("actpayamt"));// 关联单据金额
kpLinkRow.set("rel_createtime", new Date());// 关联信息创建时间 kpLinkRow.set("rel_createtime", new Date());// 关联信息创建时间
kpLinkRow.set("rel_modifytime", new Date());// 记录修改时间 kpLinkRow.set("rel_modifytime", new Date());// 记录修改时间
releatedcasbillentrys.add(kpLinkRow); 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("背书失败");
}
} }
} }
} }