Merge remote-tracking branch 'origin/main'
This commit is contained in:
commit
9757195a14
|
@ -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<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");//业务处理
|
||||
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) {
|
||||
|
||||
}
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
}
|
|
@ -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("背书失败");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue