加班处理

This commit is contained in:
李贵强 2025-07-08 19:16:37 +08:00
parent 3737b86341
commit 235f2f9f76
3 changed files with 100 additions and 23 deletions

View File

@ -626,26 +626,28 @@ public class RecBillSaveOperation extends AbstractOperationServicePlugIn impleme
QFilter customerFilter = new QFilter("name", QCP.equals, oppunit);
//可用状态
customerFilter.and(new QFilter("enable",QCP.equals,"1"));
DynamicObject[] bd_customer = BusinessDataServiceHelper.load("bd_customer", "id,name,shjh_entry_five",customerFilter.toArray());
DynamicObject[] bd_customer = BusinessDataServiceHelper.load("bd_customer", "id,name",customerFilter.toArray());
boolean exitCustomerArray = false;
if (null != bd_customer ) {
if (bd_customer.length==1){
exitCustomerArray=true;
//if (bd_customer.length==1){
bill.set("payer", bd_customer[0].getPkValue()); //付款人id
bill.set("payernumber", bd_customer[0].getString("number")); //付款人编码
bill.set("payername", bd_customer[0].getString("name")); //付款人名称
}else if (bd_customer.length>1){
for (int i = 0; i < bd_customer.length; i++) {
DynamicObjectCollection dynamicObjectCollection = bd_customer[i].getDynamicObjectCollection("shjh_entry_five");
if (dynamicObjectCollection.size()!=0){
bill.set("payer", bd_customer[i].getPkValue()); //付款人id
bill.set("payernumber", bd_customer[i].getString("number")); //付款人编码
bill.set("payername", bd_customer[i].getString("name")); //付款人名称
exitCustomerArray=true;
break;
}
}
}
//}
//else if (bd_customer.length>1){
//for (int i = 0; i < bd_customer.length; i++) {
//DynamicObjectCollection dynamicObjectCollection = bd_customer[i].getDynamicObjectCollection("shjh_entry_five");
// if (dynamicObjectCollection.size()!=0){
// bill.set("payer", bd_customer[i].getPkValue()); //付款人id
// bill.set("payernumber", bd_customer[i].getString("number")); //付款人编码
// bill.set("payername", bd_customer[i].getString("name")); //付款人名称
// exitCustomerArray=true;
// break;
// }
//}
// }
}
if (!exitCustomerArray){
//4.规则生单未配置客户>默认不确定客户

View File

@ -48,6 +48,9 @@ public class RedeemBillUnAuditOperation extends AbstractOperationServicePlugIn i
if (valuationentry!=null && valuationentry.size()!=0) {
for (DynamicObject dynamicObject : valuationentry) {
DynamicObject shdh = dynamicObject.getDynamicObject("shjh_shdh");
if (shdh==null){
continue;
}
if (pkValue.compareTo((Long) shdh.getPkValue()) == 0) {
valuationentry.remove(dynamicObject);
break;

View File

@ -119,7 +119,7 @@ public class FinancialFormReport extends AbstractReportFormPlugin implements Plu
// 10. 本月收益千元当月年化收益率%
// 11. 本年累计收益千元本年累计年化收益率
Long id = row.getLong(REPORT_FIELDS[13]);
valuationEntry(accrualDate,buyDate,expireDate2,valueDate,buyAmount,days,basisDays,id,row);
BigDecimal redAmount = valuationEntry(accrualDate, buyDate, expireDate2, valueDate, buyAmount, days, basisDays, id, row);
BigDecimal buyCopies = ReportUtils.getBigDecimalValue(row, REPORT_FIELDS[5]); // 持有份额
BigDecimal netWorth = ReportUtils.getBigDecimalValue(row, REPORT_FIELDS[6]); // 购买时单位净值
@ -128,7 +128,7 @@ public class FinancialFormReport extends AbstractReportFormPlugin implements Plu
// 12. 收益计提 = (持有份额 *月末单位净值 - 购买份额*购买时单位净值) / 1000
BigDecimal revenueAmt = countRevenueAmt(valueDate,expireDate2, accrualDate,buyCopies, monthNetWorth, netWorth, row,startBuyCopies);
BigDecimal revenueAmt = countRevenueAmt(valueDate,expireDate2, accrualDate,buyCopies, monthNetWorth, netWorth, row,startBuyCopies,redAmount);
sumProvisionEarnings=sumProvisionEarnings.add(revenueAmt);
// 本月收益计算累计
@ -189,8 +189,9 @@ public class FinancialFormReport extends AbstractReportFormPlugin implements Plu
* @param days 天数(计提日-计息日)
* @param basisDays 计息基准天数
* @param id 表单id
* @return allRedAmount 计提日期之前赎回金额之和
*/
private void valuationEntry(Date accrualDate, Date buyDate,Date expireDate,Date valueDate, BigDecimal buyAmount,BigDecimal days,BigDecimal basisDays, Long id, DynamicObject row) {
private BigDecimal valuationEntry(Date accrualDate, Date buyDate,Date expireDate,Date valueDate, BigDecimal buyAmount,BigDecimal days,BigDecimal basisDays, Long id, DynamicObject row) {
// 初始化所有变量
BigDecimal buyCopies = BigDecimal.ZERO;
BigDecimal monthIop = BigDecimal.ZERO;
@ -199,6 +200,9 @@ public class FinancialFormReport extends AbstractReportFormPlugin implements Plu
BigDecimal monthAnnualizedRate = BigDecimal.ZERO;
BigDecimal yearAmount = BigDecimal.ZERO;
BigDecimal yearAnnualizedRate = BigDecimal.ZERO;
//计提日期之前赎回金额之和(用于收益计提计算)
BigDecimal allRedAmount = BigDecimal.ZERO;
DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle(id, "cim_finsubscribe");
if (dynamicObject != null) {
@ -250,6 +254,7 @@ public class FinancialFormReport extends AbstractReportFormPlugin implements Plu
closestRecord = object;
}
}
allRedAmount=this.getRedAmount(dynamicObjectCollection,closestRecord.getDate("e_valuationdate"));
// 2. 寻找本月最后一次估值记录相同日期取赎回日期最大的
if (!valuationDate.after(accrualDate)) {
@ -320,7 +325,9 @@ public class FinancialFormReport extends AbstractReportFormPlugin implements Plu
// 计提日期向上最近一次市值-上月最后一次的市值表体若没有置0
// 新增逻辑计息日<计提日<=到期日所在月月底才计算本月收益和收益率
if (latestIopRecord != null) {
BigDecimal currentMarketValue = latestIopRecord.getBigDecimal("e_iopv").multiply(buyCopies);
BigDecimal currentRedAmount = this.getRedAmount(dynamicObjectCollection, latestIopRecord.getDate("e_valuationdate"));
BigDecimal currentMarketValue = latestIopRecord.getBigDecimal("e_iopv").multiply(buyCopies).add(currentRedAmount);
// 新增检查计息日<计提日<=到期日所在月月底
boolean isValidPeriod = true;
@ -340,8 +347,11 @@ public class FinancialFormReport extends AbstractReportFormPlugin implements Plu
// 只有当上月记录存在时才计算本月收益
// 计提日期若与购买日期不同月取不到上月最后一次单元格为0
if (lastMonthRecord != null) {
BigDecimal lastMonthRedAmount = this.getRedAmount(dynamicObjectCollection, lastMonthRecord.getDate("e_valuationdate"));
BigDecimal lastMonthMarketValue = lastMonthRecord.getBigDecimal("e_iopv")
.multiply(lastMonthRecord.getBigDecimal("e_surpcopies"));
.multiply(lastMonthRecord.getBigDecimal("e_surpcopies")).add(lastMonthRedAmount);
monthAmount = currentMarketValue.subtract(lastMonthMarketValue)
.divide(new BigDecimal(1000), 2, RoundingMode.HALF_UP);
@ -372,12 +382,16 @@ public class FinancialFormReport extends AbstractReportFormPlugin implements Plu
// 计算本年累计收益
if (latestIopRecord != null) {
BigDecimal currentMarketValue = latestIopRecord.getBigDecimal("e_iopv").multiply(buyCopies);
BigDecimal currentRedAmount = this.getRedAmount(dynamicObjectCollection, latestIopRecord.getDate("e_valuationdate"));
BigDecimal currentMarketValue = latestIopRecord.getBigDecimal("e_iopv").multiply(buyCopies).add(currentRedAmount);
// 只有当上年记录存在时才计算本年累计收益
if (lastYearRecord != null) {
BigDecimal lastYearRedAmount = this.getRedAmount(dynamicObjectCollection, lastYearRecord.getDate("e_valuationdate"));
BigDecimal lastYearMarketValue = lastYearRecord.getBigDecimal("e_iopv")
.multiply(lastYearRecord.getBigDecimal("e_surpcopies"));
.multiply(lastYearRecord.getBigDecimal("e_surpcopies")).add(lastYearRedAmount);
yearAmount = currentMarketValue.subtract(lastYearMarketValue)
.divide(new BigDecimal(1000), 2, RoundingMode.HALF_UP);
@ -419,6 +433,62 @@ public class FinancialFormReport extends AbstractReportFormPlugin implements Plu
row.set(DYNAMICS_FIELDS[5], monthAnnualizedRate);
row.set(DYNAMICS_FIELDS[6], yearAmount);
row.set(DYNAMICS_FIELDS[7], yearAnnualizedRate);
return allRedAmount;
}
/**
* 获取填入日期之前的赎回单中的赎回金额之和
* @param entry 估值分录
* @param date 填入日期
* @return
*/
private BigDecimal getRedAmount(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. 累加符合条件的赎回金额
BigDecimal sum = BigDecimal.ZERO;
for (DynamicObject item : sortedEntries) {
// 检查是否为赎回单跳过非赎回条目
DynamicObject shdh = item.getDynamicObject("shjh_shdh");
if (shdh == null) {
continue;
}
// 检查估值日期是否 目标日期
Date valDate = item.getDate("e_valuationdate");
if (valDate != null && valDate.compareTo(date) <= 0) {
Object pkValue = shdh.getPkValue();
DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle(pkValue, "cim_redeem");
BigDecimal amount = dynamicObject.getBigDecimal("amount"); // 赎回金额字段名
BigDecimal realrevenue = dynamicObject.getBigDecimal("revenueamount"); // 实际收益字段名
if (amount != null) {
sum = sum.add(amount).add(realrevenue);
}
}
}
return sum;
}
/**
@ -568,7 +638,8 @@ public class FinancialFormReport extends AbstractReportFormPlugin implements Plu
BigDecimal monthNetWorth,
BigDecimal netWorth,
DynamicObject row,
BigDecimal startBuyCopies
BigDecimal startBuyCopies,
BigDecimal redAmount
) {
if (expireDate==null){
expireDate=accrualDate;
@ -580,6 +651,7 @@ public class FinancialFormReport extends AbstractReportFormPlugin implements Plu
if (buyCopies != null && monthNetWorth != null && netWorth != null && startBuyCopies != null) {
// 计算(持有份额 * 月末单位净值 - 购买份额 * 购买时单位净值) / 1000
revenue = buyCopies.multiply(monthNetWorth)
.add(redAmount)
.subtract(startBuyCopies.multiply(netWorth))
.divide(new BigDecimal(1000), 2, RoundingMode.HALF_UP);