理财批量预提2.0计算逻辑修改
This commit is contained in:
		
							parent
							
								
									48a8d64455
								
							
						
					
					
						commit
						08e591b4fc
					
				|  | @ -3,10 +3,14 @@ package shjh.jhzj7.fi.fi.plugin.form; | ||||||
| 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.form.plugin.AbstractFormPlugin; | import kd.bos.form.plugin.AbstractFormPlugin; | ||||||
|  | import kd.bos.logging.Log; | ||||||
|  | import kd.bos.logging.LogFactory; | ||||||
| import kd.bos.servicehelper.BusinessDataServiceHelper; | import kd.bos.servicehelper.BusinessDataServiceHelper; | ||||||
| import kd.sdk.plugin.Plugin; | import kd.sdk.plugin.Plugin; | ||||||
|  | import shjh.jhzj7.fi.fi.plugin.report.FinancialFormReport; | ||||||
| 
 | 
 | ||||||
| import java.math.BigDecimal; | import java.math.BigDecimal; | ||||||
|  | import java.math.RoundingMode; | ||||||
| import java.util.Date; | import java.util.Date; | ||||||
| import java.util.EventObject; | import java.util.EventObject; | ||||||
| 
 | 
 | ||||||
|  | @ -14,6 +18,7 @@ import java.util.EventObject; | ||||||
|  * 理财批量预提表单插件 |  * 理财批量预提表单插件 | ||||||
|  */ |  */ | ||||||
| public class CimIntBillBatchFormPlugin extends AbstractFormPlugin implements Plugin { | public class CimIntBillBatchFormPlugin extends AbstractFormPlugin implements Plugin { | ||||||
|  |     private final static Log logger = LogFactory.getLog(CimIntBillBatchFormPlugin.class); | ||||||
| 
 | 
 | ||||||
|     @Override |     @Override | ||||||
|     public void afterBindData(EventObject e) { |     public void afterBindData(EventObject e) { | ||||||
|  | @ -40,6 +45,10 @@ public class CimIntBillBatchFormPlugin extends AbstractFormPlugin implements Plu | ||||||
|                                     DynamicObjectCollection valuationentry = finsubscribe.getDynamicObjectCollection("valuationentry"); |                                     DynamicObjectCollection valuationentry = finsubscribe.getDynamicObjectCollection("valuationentry"); | ||||||
| 
 | 
 | ||||||
|                                     if (valuationentry != null && valuationentry.size() != 0) { |                                     if (valuationentry != null && valuationentry.size() != 0) { | ||||||
|  | 
 | ||||||
|  |                                         BigDecimal redProductAmount = this.getRedProductAmount(valuationentry, preintdate); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|                                         DynamicObject targetValuation = null; |                                         DynamicObject targetValuation = null; | ||||||
| 
 | 
 | ||||||
|                                         // 1. 如果只有一条估值数据,直接使用 |                                         // 1. 如果只有一条估值数据,直接使用 | ||||||
|  | @ -74,9 +83,9 @@ public class CimIntBillBatchFormPlugin extends AbstractFormPlugin implements Plu | ||||||
|                                             BigDecimal currentSurpcopies = targetValuation.getBigDecimal("e_surpcopies"); |                                             BigDecimal currentSurpcopies = targetValuation.getBigDecimal("e_surpcopies"); | ||||||
| 
 | 
 | ||||||
|                                             if (currentIopv != null && currentSurpcopies != null && iopv != null && buycopies != null) { |                                             if (currentIopv != null && currentSurpcopies != null && iopv != null && buycopies != null) { | ||||||
|                                                 // 计算公式:预提收益 = (预提日净值 * 剩余份数) - (购买日净值 * 购买日份数) |                                                 // 计算公式:预提收益 = (预提日净值 * 剩余份数) - (购买日净值 * 购买日份数)*差值 | ||||||
|                                                 BigDecimal preIncome = currentIopv.multiply(currentSurpcopies) |                                                 BigDecimal preIncome = currentIopv.multiply(currentSurpcopies) | ||||||
|                                                         .subtract(iopv.multiply(buycopies)); |                                                         .subtract(iopv.multiply(buycopies).multiply(redProductAmount)); | ||||||
| 
 | 
 | ||||||
|                                                 // 将计算结果设置到模型 |                                                 // 将计算结果设置到模型 | ||||||
|                                                 this.getModel().setValue("interestamt", preIncome, i); |                                                 this.getModel().setValue("interestamt", preIncome, i); | ||||||
|  | @ -92,4 +101,80 @@ public class CimIntBillBatchFormPlugin extends AbstractFormPlugin implements Plu | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * 计提日最近估值记录获取——(1-赎回份额/赎回日剩余份额)* 所有赎回单 | ||||||
|  |      * @param entry 输入数据集合 | ||||||
|  |      * @param date 目标日期 | ||||||
|  |      * @return 所有符合条件的赎回单的(1-赎回份额/剩余份额)的乘积 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal getRedProductAmount(DynamicObjectCollection entry, Date date) { | ||||||
|  |         // 1. 按估值日期和赎回日期排序 | ||||||
|  |         DynamicObjectCollection sortedEntries = new DynamicObjectCollection(); | ||||||
|  |         sortedEntries.addAll(entry); | ||||||
|  | 
 | ||||||
|  |         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. 累乘符合条件的差额,初始值设为1 | ||||||
|  |         BigDecimal product = BigDecimal.ONE; | ||||||
|  | 
 | ||||||
|  |         for (DynamicObject item : sortedEntries) { | ||||||
|  |             try { | ||||||
|  |                 // 检查是否为赎回单(跳过非赎回条目) | ||||||
|  |                 DynamicObject shdh = item.getDynamicObject("shjh_shdh"); | ||||||
|  |                 if (shdh == null) { | ||||||
|  |                     continue; | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|  |                 // 检查估值日期是否 ≤ 目标日期 | ||||||
|  |                 Date valDate = item.getDate("e_valuationdate"); | ||||||
|  |                 if (valDate == null || valDate.compareTo(date) > 0) { | ||||||
|  |                     continue; | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|  |                 Object pkValue = shdh.getPkValue(); | ||||||
|  |                 DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle(pkValue, "cim_redeem"); | ||||||
|  | 
 | ||||||
|  |                 // 安全获取数值字段 | ||||||
|  |                 BigDecimal copies = dynamicObject.getBigDecimal("copies"); // 赎回份额 | ||||||
|  |                 BigDecimal remainderCopies = dynamicObject.getBigDecimal("shjh_shrsyfe"); // 赎回日剩余份额 | ||||||
|  | 
 | ||||||
|  |                 if (copies == null || remainderCopies == null || remainderCopies.compareTo(BigDecimal.ZERO) == 0) { | ||||||
|  |                     continue; // 跳过无效数据 | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|  |                 // 计算 (1 - 赎回份额/剩余日份额) | ||||||
|  |                 BigDecimal ratio = copies.divide(remainderCopies, 10, RoundingMode.HALF_UP); | ||||||
|  |                 BigDecimal difference = BigDecimal.ONE.subtract(ratio); | ||||||
|  | 
 | ||||||
|  |                 // 累乘 | ||||||
|  |                 product = product.multiply(difference).setScale(10, RoundingMode.HALF_UP); | ||||||
|  | 
 | ||||||
|  |             } catch (Exception e) { | ||||||
|  |                 // 记录错误并跳过当前条目 | ||||||
|  |                 logger.error("处理赎回单数据出错: " + e.getMessage(), e); | ||||||
|  |                 continue; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         return product; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
| } | } | ||||||
		Loading…
	
		Reference in New Issue