diff --git a/main/java/shjh/jhzj7/fi/fi/plugin/form/CimFinancialBillPlugin.java b/main/java/shjh/jhzj7/fi/fi/plugin/form/CimFinancialBillPlugin.java index f356a60..5ec735f 100644 --- a/main/java/shjh/jhzj7/fi/fi/plugin/form/CimFinancialBillPlugin.java +++ b/main/java/shjh/jhzj7/fi/fi/plugin/form/CimFinancialBillPlugin.java @@ -11,6 +11,7 @@ import kd.bos.servicehelper.operation.SaveServiceHelper; import kd.sdk.plugin.Plugin; import java.math.BigDecimal; +import java.util.Date; import java.util.EventObject; /** @@ -53,20 +54,24 @@ public class CimFinancialBillPlugin extends AbstractBillPlugIn implements Plugin this.getView().showTipNotification("无可删除数据!"); return; } - DynamicObject maxSeqItem = findMaxSeqItem(entryEntity); + DynamicObject maxSeqItem = findMaxDateItem(entryEntity); if (maxSeqItem!=null){ DynamicObject redeemBill = maxSeqItem.getDynamicObject("shjh_shdh"); if (redeemBill!=null){ this.getView().showTipNotification("最新估值分录存在已审核赎回单!"); }else { entryEntity.remove(maxSeqItem); - DynamicObject newMaxSeqItem = findMaxSeqItem(entryEntity); + DynamicObject newMaxSeqItem = findMaxDateItem(entryEntity); if (newMaxSeqItem!=null){ BigDecimal e_surpcopies = newMaxSeqItem.getBigDecimal("e_surpcopies"); financialBill.set("surpluscopies",e_surpcopies); SaveServiceHelper.update(financialBill); } - DB.update(DBRoute.of("fi"),DELETE,new Object[]{maxSeqItem.getPkValue()}); + int update = DB.update(DBRoute.of("fi"), DELETE, new Object[]{maxSeqItem.getPkValue()}); + if (update==1){ + //重新排序 + this.reorder(financialBill,entryEntity); + } this.getView().invokeOperation("refresh"); } } @@ -74,6 +79,47 @@ public class CimFinancialBillPlugin extends AbstractBillPlugIn implements Plugin } + private void reorder(DynamicObject financialBill,DynamicObjectCollection entryEntity) { + if (entryEntity == null || entryEntity.isEmpty()) { + return; + } + + // 1. 按估值日期和赎回日期排序 + DynamicObjectCollection sortedEntries = new DynamicObjectCollection(); + sortedEntries.addAll(entryEntity); + + sortedEntries.sort((o1, o2) -> { + // 优先按估值日期排序(从小到大) + Date valDate1 = o1.getDate("e_valuationdate"); + Date valDate2 = o2.getDate("e_valuationdate"); + int compareValDate = valDate1.compareTo(valDate2); + if (compareValDate != 0) { + return compareValDate; + } + + // 估值日期相同时,按赎回日期排序 + Date redDate1 = o1.getDate("shjh_shrq"); + Date redDate2 = o2.getDate("shjh_shrq"); + if (redDate1 == null && redDate2 == null) return 0; + if (redDate1 == null) return -1; // null视为较小值 + if (redDate2 == null) return 1; + return redDate1.compareTo(redDate2); + }); + + // 2. 重新赋值seq从0开始 + int seq = 0; + for (DynamicObject item : sortedEntries) { + item.set("seq", seq++); + } + + // 3. 将排序后的结果重新设置回原集合 + entryEntity.clear(); + entryEntity.addAll(sortedEntries); + financialBill.set("valuationentry",entryEntity); + SaveServiceHelper.update(financialBill); + + } + private void updateBillInfo() { boolean dataChanged = this.getModel().getDataChanged(); if (dataChanged){ @@ -91,30 +137,64 @@ public class CimFinancialBillPlugin extends AbstractBillPlugIn implements Plugin } /** - * 从分录中查找行号最大的记录 + * 从分录中查找日期最大的记录 * @param entryEntity 分录集合 * @return 行号最大的记录,如果没有记录则返回null */ - private DynamicObject findMaxSeqItem(DynamicObjectCollection entryEntity) { + private DynamicObject findMaxDateItem(DynamicObjectCollection entryEntity) { if (entryEntity == null || entryEntity.isEmpty()) { return null; } + // 检查初始行情况 + if (entryEntity.size() == 1) { + return null; + } - DynamicObject maxSeqItem = null; - int maxSeq = -1; + DynamicObject maxDateItem = null; + Date maxValDate = null; + Date maxRedDate = null; for (DynamicObject item : entryEntity) { - int currentSeq = item.getInt("seq"); - if (currentSeq==0){ - this.getView().showMessage("初始行不可删除!"); - return null; + //估值日期 + Date currentValDate = item.getDate("e_valuationdate"); + //赎回日期 + Date currentRedDate = item.getDate("shjh_shrq"); + // 第一次循环直接赋值 + if (maxDateItem == null) { + maxDateItem = item; + maxValDate = currentValDate; + maxRedDate = currentRedDate; + continue; } - if (currentSeq > maxSeq) { - maxSeq = currentSeq; - maxSeqItem = item; + + // 比较估值日期 + int valDateCompare = currentValDate.compareTo(maxValDate); + if (valDateCompare > 0) { + // 当前估值日期更大 + maxDateItem = item; + maxValDate = currentValDate; + maxRedDate = currentRedDate; + } else if (valDateCompare == 0) { + // 估值日期相同,比较赎回日期 + // 处理赎回日期为null的情况 + if (currentRedDate == null && maxRedDate == null) { + continue; // 都为空,保持原样 + } else if (currentRedDate == null) { + continue; // 当前赎回日期为空,保持原样 + } else if (maxRedDate == null) { + // 原赎回日期为空,当前不为空,更新 + maxDateItem = item; + maxRedDate = currentRedDate; + } else { + // 都不为空,比较日期 + if (currentRedDate.compareTo(maxRedDate) > 0) { + maxDateItem = item; + maxRedDate = currentRedDate; + } + } } } - return maxSeqItem; + return maxDateItem; } } \ No newline at end of file diff --git a/main/java/shjh/jhzj7/fi/fi/plugin/form/FinSubScribeExtList.java b/main/java/shjh/jhzj7/fi/fi/plugin/form/FinSubScribeExtList.java new file mode 100644 index 0000000..7e09769 --- /dev/null +++ b/main/java/shjh/jhzj7/fi/fi/plugin/form/FinSubScribeExtList.java @@ -0,0 +1,62 @@ +package shjh.jhzj7.fi.fi.plugin.form; + +import kd.bos.dataentity.entity.DynamicObject; +import kd.bos.dataentity.entity.DynamicObjectCollection; +import kd.bos.entity.operate.result.OperationResult; +import kd.bos.form.CloseCallBack; +import kd.bos.form.FormShowParameter; +import kd.bos.form.ShowType; +import kd.bos.form.events.AfterDoOperationEventArgs; +import kd.bos.form.operate.FormOperate; +import kd.bos.orm.query.QFilter; +import kd.bos.servicehelper.QueryServiceHelper; +import kd.sdk.plugin.Plugin; +import kd.tmc.cim.common.helper.FinSubscribeValuationHelper; +import kd.tmc.cim.formplugin.finsubscribe.FinSubscribeList; +import kd.tmc.cim.formplugin.resource.CimFormResourceEnum; +import kd.tmc.fbp.common.util.EmptyUtil; + +/** + * 请implements插件扩展点接口 + */ +public class FinSubScribeExtList extends FinSubscribeList { + + @Override + public void afterDoOperation(AfterDoOperationEventArgs args) { + FormOperate formOperate = (FormOperate)args.getSource(); + String operateKey = formOperate.getOperateKey(); + OperationResult operationResult = args.getOperationResult(); + if (operationResult != null && operationResult.isSuccess()) { + if (!"valuateupdate".equals(operateKey)){ + super.afterDoOperation(args); + }else { + this.showValuationUpdate(); + } + } + } + + private void showValuationUpdate() { + Long selectedId = this.getSelectedId(); + if (!EmptyUtil.isEmpty(selectedId)) { + if (FinSubscribeValuationHelper.isExistOngoingRedeemBill(selectedId)) { + this.getView().showTipNotification(CimFormResourceEnum.FinSubscribeList_17.loadKDString()); + } else { + DynamicObjectCollection finsubCols = QueryServiceHelper.query("cim_finsubscribe", "currency,redeemway,valuationentry,valuationentry.e_surpcopies as e_surpcopies,valuationentry.e_iopv as e_iopv,valuationentry.e_valuation as e_valuation,valuationentry.e_valuationdate as e_valuationdate,valuationentry.seq as seq", new QFilter[]{new QFilter("id", "=", selectedId)}, "valuationentry.seq desc", 1); + if (!EmptyUtil.isEmpty(finsubCols)) { + DynamicObject dynamicObject = (DynamicObject)finsubCols.get(0); + FormShowParameter showParameter = new FormShowParameter(); + showParameter.setFormId("cim_valuation_update"); + showParameter.getOpenStyle().setShowType(ShowType.NonModal); + showParameter.getCustomParams().put("currency", dynamicObject.getLong("currency")); + showParameter.getCustomParams().put("redeemway", dynamicObject.getString("redeemway")); + showParameter.getCustomParams().put("e_valuation", dynamicObject.getBigDecimal("e_valuation")); + showParameter.getCustomParams().put("e_surpcopies", dynamicObject.getBigDecimal("e_surpcopies")); + showParameter.getCustomParams().put("e_iopv", dynamicObject.getBigDecimal("e_iopv")); + showParameter.getCustomParams().put("ids", selectedId); + showParameter.setCloseCallBack(new CloseCallBack(this, "valuateupdate")); + this.getView().showForm(showParameter); + } + } + } + } +} \ No newline at end of file diff --git a/main/java/shjh/jhzj7/fi/fi/plugin/form/RedeemBillExtendEditPlugin.java b/main/java/shjh/jhzj7/fi/fi/plugin/form/RedeemBillExtendEditPlugin.java index 333e2be..95f9b98 100644 --- a/main/java/shjh/jhzj7/fi/fi/plugin/form/RedeemBillExtendEditPlugin.java +++ b/main/java/shjh/jhzj7/fi/fi/plugin/form/RedeemBillExtendEditPlugin.java @@ -117,7 +117,6 @@ public class RedeemBillExtendEditPlugin extends RedeemBillEdit { realRevenue = copies.multiply(shrjz.subtract(iopv)); } } - TmcViewInputHelper.setValWithoutDataChanged(this.getModel(), "realrevenue", realRevenue); } } @@ -203,7 +202,7 @@ public class RedeemBillExtendEditPlugin extends RedeemBillEdit { // 计算 (赎回份额/剩余日份额) BigDecimal ratio = copies.divide(remainderCopies, 10, RoundingMode.HALF_UP); // 累乘 - product = product.multiply(ratio).setScale(10, RoundingMode.HALF_UP); + product = product.multiply(BigDecimal.ONE.subtract(ratio)).setScale(10, RoundingMode.HALF_UP); } catch (Exception e) { // 记录错误并跳过当前条目 diff --git a/main/java/shjh/jhzj7/fi/fi/plugin/operate/ValuateUpdateOperation.java b/main/java/shjh/jhzj7/fi/fi/plugin/operate/ValuateUpdateOperation.java index eb16b40..0b7079f 100644 --- a/main/java/shjh/jhzj7/fi/fi/plugin/operate/ValuateUpdateOperation.java +++ b/main/java/shjh/jhzj7/fi/fi/plugin/operate/ValuateUpdateOperation.java @@ -1,13 +1,17 @@ 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.BeforeOperationArgs; 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; + /** * 理财申购 * cim_finsubscribe @@ -24,6 +28,43 @@ public class ValuateUpdateOperation extends AbstractOperationServicePlugIn imple DynamicObject prinfo; for (int i = 0; i < dos.length; i++) { prinfo = BusinessDataServiceHelper.loadSingle(dos[i].getPkValue(), dos[i].getDataEntityType().getName()); + //重新排序 + DynamicObjectCollection valuationentry = prinfo.getDynamicObjectCollection("valuationentry"); + if (valuationentry!=null && valuationentry.size()>1){ + // 1. 按估值日期和赎回日期排序 + DynamicObjectCollection sortedEntries = new DynamicObjectCollection(); + sortedEntries.addAll(valuationentry); + + sortedEntries.sort((o1, o2) -> { + // 优先按估值日期排序(从小到大) + Date valDate1 = o1.getDate("e_valuationdate"); + Date valDate2 = o2.getDate("e_valuationdate"); + int compareValDate = valDate1.compareTo(valDate2); + if (compareValDate != 0) { + return compareValDate; + } + + // 估值日期相同时,按赎回日期排序 + Date redDate1 = o1.getDate("shjh_shrq"); + Date redDate2 = o2.getDate("shjh_shrq"); + if (redDate1 == null && redDate2 == null) return 0; + if (redDate1 == null) return -1; // null视为较小值 + if (redDate2 == null) return 1; + return redDate1.compareTo(redDate2); + }); + + // 2. 重新赋值seq从0开始 + int seq = 0; + for (DynamicObject item : sortedEntries) { + item.set("seq", seq++); + } + + // 3. 将排序后的结果重新设置回原集合 + valuationentry.clear(); + valuationentry.addAll(sortedEntries); + prinfo.set("valuationentry",valuationentry); + SaveServiceHelper.update(prinfo); + } //1、点击【估值】时,若申购单下游存在暂存、已提交的赎回单,提醒报错:“下游存在待审批的赎回单据,请删除或审批后再进行估值”; //cim_redeem QFilter q1 = new QFilter("finbillno.id", QCP.equals, prinfo.getLong("id")); diff --git a/main/java/shjh/jhzj7/fi/fi/plugin/report/FinancialFormReport.java b/main/java/shjh/jhzj7/fi/fi/plugin/report/FinancialFormReport.java index 8a37491..512bdae 100644 --- a/main/java/shjh/jhzj7/fi/fi/plugin/report/FinancialFormReport.java +++ b/main/java/shjh/jhzj7/fi/fi/plugin/report/FinancialFormReport.java @@ -2,6 +2,8 @@ package shjh.jhzj7.fi.fi.plugin.report; import kd.bos.dataentity.entity.DynamicObject; import kd.bos.dataentity.entity.DynamicObjectCollection; +import kd.bos.entity.NumberFormatProvider; +import kd.bos.entity.report.AbstractReportColumn; import kd.bos.entity.report.ReportColumn; import kd.bos.entity.report.ReportQueryParam; import kd.bos.logging.Log; @@ -444,10 +446,10 @@ public class FinancialFormReport extends AbstractReportFormPlugin implements Plu row.set(REPORT_FIELDS[5], buyCopies); row.set(REPORT_FIELDS[11], monthIop); row.set(REPORT_FIELDS[12], monthIopDate); - row.set(DYNAMICS_FIELDS[4], monthAmount); - row.set(DYNAMICS_FIELDS[5], monthAnnualizedRate); - row.set(DYNAMICS_FIELDS[6], yearAmount); - row.set(DYNAMICS_FIELDS[7], yearAnnualizedRate); + row.set(DYNAMICS_FIELDS[4], monthAmount.setScale(2, RoundingMode.HALF_UP)); + row.set(DYNAMICS_FIELDS[5], monthAnnualizedRate.setScale(2, RoundingMode.HALF_UP)); + row.set(DYNAMICS_FIELDS[6], yearAmount.setScale(2, RoundingMode.HALF_UP)); + row.set(DYNAMICS_FIELDS[7], yearAnnualizedRate.setScale(2, RoundingMode.HALF_UP)); return allRedProductAmount; } @@ -503,7 +505,7 @@ public class FinancialFormReport extends AbstractReportFormPlugin implements Plu // sum = sum.add(amount).add(realrevenue); // } if (amount != null) { - sum = amount; + sum = sum.add(amount); } } } @@ -758,7 +760,7 @@ public class FinancialFormReport extends AbstractReportFormPlugin implements Plu projectRevenue = new BigDecimal(day).multiply(amount) .multiply(expectedRate.divide(new BigDecimal(100), 10, RoundingMode.HALF_UP)) .divide(basisDay, 8, RoundingMode.HALF_UP); - row.set(DYNAMICS_FIELDS[0], projectRevenue); + row.set(DYNAMICS_FIELDS[0], projectRevenue.setScale(2, RoundingMode.HALF_UP)); } return projectRevenue; } @@ -795,7 +797,7 @@ public class FinancialFormReport extends AbstractReportFormPlugin implements Plu // 设置到表格行 boolean isValidPeriod = !valueDate.after(accrualDate) && !accrualDate.after(expireDate); if (isValidPeriod){ - row.set(DYNAMICS_FIELDS[3], revenue); + row.set(DYNAMICS_FIELDS[3], revenue.setScale(2, RoundingMode.HALF_UP)); }else { row.set(DYNAMICS_FIELDS[3], BigDecimal.ZERO); return BigDecimal.ZERO;