点击估值:更新估值页面插件2、若单据【赎回方式】=份额赎回,且【现金管理类产品】= 是,跳过标品份额校验(原校验:份额不允许大于申购份额);
3、若单据【赎回方式】=份额赎回,且【现金管理类产品】= 是,不允许编辑“单位净值”,且【份数】必填;4、修改份数后,市值=剩余份额*单位净值; 点击【估值】时,若申购单下游存在暂存、已提交的赎回单,提醒报错:“下游存在待审批的赎回单据,请删除或审批后再进行估值”; --s
This commit is contained in:
		
							parent
							
								
									9a60c374c8
								
							
						
					
					
						commit
						64b871a69f
					
				|  | @ -0,0 +1,276 @@ | |||
| package shjh.jhzj7.fi.fi.plugin.form; | ||||
| 
 | ||||
| import java.math.BigDecimal; | ||||
| import java.math.RoundingMode; | ||||
| import java.util.Collections; | ||||
| import java.util.Comparator; | ||||
| import java.util.Date; | ||||
| import java.util.EventObject; | ||||
| import java.util.HashMap; | ||||
| import java.util.List; | ||||
| import java.util.Map; | ||||
| import java.util.Optional; | ||||
| import java.util.stream.Collectors; | ||||
| import kd.bos.dataentity.entity.DynamicObject; | ||||
| import kd.bos.dataentity.entity.DynamicObjectCollection; | ||||
| import kd.bos.dataentity.resource.ResManager; | ||||
| import kd.bos.entity.EntityMetadataCache; | ||||
| import kd.bos.entity.datamodel.ListSelectedRowCollection; | ||||
| import kd.bos.entity.datamodel.events.PropertyChangedArgs; | ||||
| import kd.bos.entity.property.BasedataProp; | ||||
| import kd.bos.entity.property.DecimalProp; | ||||
| import kd.bos.form.control.Control; | ||||
| import kd.bos.form.control.events.BeforeClickEvent; | ||||
| import kd.bos.form.field.BasedataEdit; | ||||
| import kd.bos.form.field.DecimalEdit; | ||||
| import kd.bos.form.plugin.AbstractFormPlugin; | ||||
| import kd.bos.list.BillList; | ||||
| import kd.bos.orm.query.QFilter; | ||||
| import kd.bos.servicehelper.BusinessDataServiceHelper; | ||||
| import kd.bos.servicehelper.QueryServiceHelper; | ||||
| import kd.bos.servicehelper.operation.SaveServiceHelper; | ||||
| import kd.tmc.cim.common.enums.RedeemWayEnum; | ||||
| import kd.tmc.fbp.common.helper.TmcDataServiceHelper; | ||||
| import kd.tmc.fbp.common.helper.TmcViewInputHelper; | ||||
| import kd.tmc.fbp.common.util.EmptyUtil; | ||||
| 
 | ||||
| public class ValutionUpdateEditFormPlugin extends AbstractFormPlugin { | ||||
|     public ValutionUpdateEditFormPlugin() { | ||||
|     } | ||||
| 
 | ||||
|     public void registerListener(EventObject e) { | ||||
|         super.registerListener(e); | ||||
|         this.addClickListeners(new String[]{"btnok"}); | ||||
|     } | ||||
| 
 | ||||
|     public void afterCreateNewData(EventObject e) { | ||||
|         super.afterCreateNewData(e); | ||||
|         Map<String, Object> paraMap = this.getView().getFormShowParameter().getCustomParams(); | ||||
|         Object currencyObject = paraMap.get("currency"); | ||||
|         this.getModel().setValue("valuationcurrency", currencyObject); | ||||
|         this.getModel().setValue("redeemway", paraMap.get("redeemway")); | ||||
|         this.getModel().setValue("valuation", paraMap.get("e_valuation")); | ||||
|         this.getModel().setValue("surpluscopies", paraMap.get("e_surpcopies")); | ||||
|         this.getModel().setValue("iopv", paraMap.get("e_iopv")); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public void afterBindData(EventObject e) { | ||||
|         super.afterBindData(e); | ||||
| 
 | ||||
|         iopvChanged(); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * 若单据【赎回方式】=份额赎回,且【现金管理类产品】= 是,不允许编辑“单位净值”,且【份数】必填; | ||||
|      */ | ||||
|     private void iopvChanged() { | ||||
|         this.getView().getParentView().getModel(); | ||||
|         BillList billList = this.getView().getParentView().getControl("billlistap"); | ||||
|         //获取列表选中行 | ||||
|         ListSelectedRowCollection selectedRows = billList.getSelectedRows(); | ||||
|         //获取ID | ||||
|         Object[] primaryKeyValues = selectedRows.getPrimaryKeyValues(); | ||||
|         if (primaryKeyValues.length > 0) { | ||||
|             Long primaryKeyValue = (Long)primaryKeyValues[0]; | ||||
|             DynamicObject cimFinsubscribe = BusinessDataServiceHelper.loadSingle(primaryKeyValue, "cim_finsubscribe"); | ||||
|             if (null != cimFinsubscribe) { | ||||
|                 String xjglcp = cimFinsubscribe.getString("shjh_xjglcp"); | ||||
|                 String redeemway = cimFinsubscribe.getString("redeemway"); | ||||
|                 DecimalEdit surpluscopies = this.getView().getControl("surpluscopies"); | ||||
|                 DecimalProp  tp = (DecimalProp) surpluscopies.getProperty(); | ||||
|                 //3、若单据【赎回方式】=份额赎回,且【现金管理类产品】= 是,不允许编辑“单位净值”,且【份数】必填; | ||||
|                 if ("1".equals(xjglcp) && "copies_redeem".equals(redeemway)) { | ||||
|                     this.getView().setEnable(false,"iopv");//锁定"单位净值" | ||||
|                     // 获取份数控件 | ||||
|                     surpluscopies.setMustInput(true);//【份数】必填 | ||||
|                     tp.setMustInput(true); | ||||
|                 }else { | ||||
|                     this.getView().setEnable(true,"iopv");//解锁"单位净值" | ||||
|                     surpluscopies.setMustInput(false);//【份数】非必填 | ||||
|                     tp.setMustInput(false); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     public void propertyChanged(PropertyChangedArgs e) { | ||||
|         switch (e.getProperty().getName()) { | ||||
|             case "valuation": | ||||
|                 this.calOpposideAmt("valuation", "iopv"); | ||||
|                 break; | ||||
|             case "iopv": | ||||
|                 this.calOpposideAmt("iopv", "valuation"); | ||||
|                 break; | ||||
|             case "surpluscopies": | ||||
|                 BigDecimal surpluscopies = (BigDecimal) this.getModel().getValue("surpluscopies"); | ||||
|                 BigDecimal iopv = (BigDecimal)this.getModel().getValue("iopv"); | ||||
|                 this.getView().getModel().setValue("valuation",surpluscopies.multiply(iopv));//4、修改份数后,市值=剩余份额*单位净值; | ||||
|                 this.getView().updateView("valuation"); | ||||
|                 break; | ||||
|         } | ||||
|         iopvChanged(); | ||||
|     } | ||||
| 
 | ||||
|     public void beforeClick(BeforeClickEvent evt) { | ||||
|         Control source = (Control)evt.getSource(); | ||||
|         switch (source.getKey()) { | ||||
|             case "btnok": | ||||
|                 BigDecimal surpluscopies = (BigDecimal)this.getView().getModel().getValue("surpluscopies"); | ||||
|                 this.getView().getParentView().getModel(); | ||||
|                 BillList billList = this.getView().getParentView().getControl("billlistap"); | ||||
|                 //获取列表选中行 | ||||
|                 ListSelectedRowCollection selectedRows = billList.getSelectedRows(); | ||||
|                 //获取ID | ||||
|                 Object[] primaryKeyValues = selectedRows.getPrimaryKeyValues(); | ||||
|                 if (primaryKeyValues.length > 0) { | ||||
|                     Long primaryKeyValue = (Long)primaryKeyValues[0]; | ||||
|                     DynamicObject cimFinsubscribe = BusinessDataServiceHelper.loadSingle(primaryKeyValue, "cim_finsubscribe"); | ||||
|                     if (null != cimFinsubscribe) { | ||||
|                         cimFinsubscribe.set("surpluscopies", surpluscopies); | ||||
|                         SaveServiceHelper.save(new DynamicObject[]{cimFinsubscribe}); | ||||
|                     } | ||||
|                 } | ||||
| 
 | ||||
| 
 | ||||
|                 String redeemWay = (String)this.getModel().getValue("redeemway"); | ||||
|                 if (!RedeemWayEnum.isCopiesRedeem(redeemWay)) { | ||||
|                     return; | ||||
|                 } else { | ||||
|                     BigDecimal valuation = (BigDecimal) Optional.ofNullable((BigDecimal)this.getModel().getValue("valuation")).orElse(BigDecimal.ZERO); | ||||
|                     BigDecimal ecopies = (BigDecimal)Optional.ofNullable((BigDecimal)this.getModel().getValue("surpluscopies")).orElse(BigDecimal.ZERO); | ||||
|                     BigDecimal eiopv = (BigDecimal)Optional.ofNullable((BigDecimal)this.getModel().getValue("iopv")).orElse(BigDecimal.ZERO); | ||||
|                     Integer scale = (Integer)Optional.ofNullable((DynamicObject)this.getModel().getValue("valuationcurrency")).map((r) -> { | ||||
|                         return r.getInt("amtprecision"); | ||||
|                     }).orElse(2); | ||||
|                     if (eiopv.multiply(ecopies).setScale(scale, 4).compareTo(valuation) != 0) { | ||||
|                         evt.setCancel(true); | ||||
|                         this.getView().showTipNotification(ResManager.loadKDString("市值应等于剩余份数乘以单位净值。", "ValuationUpdateEditPlugin_1", "tmc-cim-formplugin", new Object[0])); | ||||
|                         return; | ||||
|                     } else { | ||||
|                         Object finsubId = this.getView().getFormShowParameter().getCustomParam("ids"); | ||||
|                         DynamicObject finsubDyn = QueryServiceHelper.queryOne("cim_finsubscribe", "buycopies", new QFilter[]{new QFilter("id", "=", finsubId)}); | ||||
|                         if (EmptyUtil.isNoEmpty(finsubDyn) && ecopies.compareTo(finsubDyn.getBigDecimal("buycopies")) > 0) { | ||||
| //                            evt.setCancel(true); | ||||
| //                            this.getView().showTipNotification(ResManager.loadKDString("剩余份数不能大于申购单的购买份数。", "ValuationUpdateEditPlugin_2", "tmc-cim-formplugin", new Object[0])); | ||||
| //                            return; | ||||
|                         } else if (valuation.compareTo(BigDecimal.valueOf(Math.pow(10.0, 13.0))) > 0) { | ||||
|                             evt.setCancel(true); | ||||
|                             this.getView().showTipNotification(ResManager.loadKDString("市值过大,请检查。", "ValuationUpdateEditPlugin_3", "tmc-cim-formplugin", new Object[0])); | ||||
|                             return; | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|             default: | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     public void click(EventObject evt) { | ||||
|         super.click(evt); | ||||
|         Control c = (Control)evt.getSource(); | ||||
|         String key = c.getKey().toLowerCase(); | ||||
|         if ("btnok".equals(key)) { | ||||
|             Date valuationDate = (Date)this.getModel().getValue("valuationdate"); | ||||
|             Object valuation = this.getModel().getValue("valuation"); | ||||
|             Object ecopies = this.getModel().getValue("surpluscopies"); | ||||
|             BigDecimal eiopv = (BigDecimal)this.getModel().getValue("iopv"); | ||||
|             Object finsubId = this.getView().getFormShowParameter().getCustomParam("ids"); | ||||
|             DynamicObject[] bills = TmcDataServiceHelper.load(Collections.singletonList(finsubId).toArray(), EntityMetadataCache.getDataEntityType("cim_finsubscribe")); | ||||
|             DynamicObject[] var10 = bills; | ||||
|             int var11 = bills.length; | ||||
| 
 | ||||
|             for(int var12 = 0; var12 < var11; ++var12) { | ||||
|                 DynamicObject bill = var10[var12]; | ||||
|                 DynamicObjectCollection valuationEntries = bill.getDynamicObjectCollection("valuationentry"); | ||||
|                 if (EmptyUtil.isEmpty(valuationEntries)) { | ||||
|                     DynamicObject newEntry = valuationEntries.addNew(); | ||||
|                     newEntry.set("e_valuationdate", valuationDate); | ||||
|                     newEntry.set("e_valuation", valuation); | ||||
|                     newEntry.set("e_surpcopies", ecopies); | ||||
|                     newEntry.set("e_iopv", eiopv); | ||||
|                     newEntry.set("seq", 0); | ||||
|                 } else { | ||||
|                     boolean isReSort = false; | ||||
|                     int index = -1; | ||||
| 
 | ||||
|                     int i; | ||||
|                     DynamicObject entry; | ||||
|                     for(i = 0; i < valuationEntries.size(); ++i) { | ||||
|                         entry = (DynamicObject)valuationEntries.get(i); | ||||
|                         int compare = valuationDate.compareTo((Date)entry.get("e_valuationdate")); | ||||
|                         if (compare == 0) { | ||||
|                             entry.set("e_valuation", valuation); | ||||
|                             entry.set("e_surpcopies", ecopies); | ||||
|                             entry.set("e_iopv", eiopv); | ||||
|                             break; | ||||
|                         } | ||||
| 
 | ||||
|                         DynamicObject newEntry; | ||||
|                         if (compare < 0) { | ||||
|                             newEntry = (DynamicObject)valuationEntries.getDynamicObjectType().createInstance(); | ||||
|                             newEntry.set("e_valuationdate", valuationDate); | ||||
|                             newEntry.set("e_valuation", valuation); | ||||
|                             newEntry.set("e_surpcopies", ecopies); | ||||
|                             newEntry.set("e_iopv", eiopv); | ||||
|                             valuationEntries.add(i, newEntry); | ||||
|                             isReSort = true; | ||||
|                             index = i; | ||||
|                             break; | ||||
|                         } | ||||
| 
 | ||||
|                         if (i == valuationEntries.size() - 1) { | ||||
|                             newEntry = valuationEntries.addNew(); | ||||
|                             newEntry.set("e_valuationdate", valuationDate); | ||||
|                             newEntry.set("e_valuation", valuation); | ||||
|                             newEntry.set("e_surpcopies", ecopies); | ||||
|                             newEntry.set("e_iopv", eiopv); | ||||
|                             newEntry.set("seq", i); | ||||
|                         } | ||||
|                     } | ||||
| 
 | ||||
|                     if (isReSort) { | ||||
|                         for(i = index; i < valuationEntries.size(); ++i) { | ||||
|                             entry = (DynamicObject)valuationEntries.get(i); | ||||
|                             entry.set("seq", i); | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
| 
 | ||||
|                 List<DynamicObject> entryList = (List)valuationEntries.stream().sorted(Comparator.comparing((r) -> { | ||||
|                     return r.getDate("e_valuationdate"); | ||||
|                 }, Comparator.reverseOrder())).collect(Collectors.toList()); | ||||
|                 if (EmptyUtil.isNoEmpty(entryList)) { | ||||
|                     eiopv = ((DynamicObject)entryList.get(0)).getBigDecimal("e_iopv"); | ||||
|                 } | ||||
| 
 | ||||
|                 bill.set("futureamount", bill.getBigDecimal("surpluscopies").multiply(eiopv.subtract(bill.getBigDecimal("iopv")))); | ||||
|             } | ||||
| 
 | ||||
|             TmcDataServiceHelper.save(bills); | ||||
|             Map<String, Object> returnData = new HashMap(); | ||||
|             returnData.put("success", Boolean.TRUE); | ||||
|             this.getView().returnDataToParent(returnData); | ||||
|             this.getView().close(); | ||||
|         } | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
|     private void calOpposideAmt(String currField, String opposideField) { | ||||
|         String redeemWay = (String)this.getModel().getValue("redeemway"); | ||||
|         if (RedeemWayEnum.isCopiesRedeem(redeemWay)) { | ||||
|             BigDecimal amount = (BigDecimal)Optional.ofNullable((BigDecimal)this.getModel().getValue("valuation")).orElse(BigDecimal.ZERO); | ||||
|             BigDecimal copies = (BigDecimal)Optional.ofNullable((BigDecimal)this.getModel().getValue("surpluscopies")).orElse(BigDecimal.ZERO); | ||||
|             BigDecimal iopv = (BigDecimal)Optional.ofNullable((BigDecimal)this.getModel().getValue("iopv")).orElse(BigDecimal.ZERO); | ||||
|             BigDecimal oppSide = BigDecimal.ZERO; | ||||
|             if ("valuation".equals(currField) && EmptyUtil.isNoEmpty(copies)) { | ||||
|                 oppSide = amount.divide(copies, 10, RoundingMode.HALF_UP); | ||||
|             } | ||||
| 
 | ||||
|             if ("iopv".equals(currField)) { | ||||
|                 oppSide = iopv.multiply(copies); | ||||
|             } | ||||
| 
 | ||||
|             TmcViewInputHelper.setValWithoutPropChgEvt(this.getView(), this.getModel(), opposideField, oppSide); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | @ -0,0 +1,41 @@ | |||
| package shjh.jhzj7.fi.fi.plugin.operate; | ||||
| 
 | ||||
| import kd.bos.dataentity.entity.DynamicObject; | ||||
| 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.sdk.plugin.Plugin; | ||||
| 
 | ||||
| /** | ||||
|  * 理财申购 | ||||
|  * cim_finsubscribe | ||||
|  */ | ||||
| public class ValuateUpdateOperation extends AbstractOperationServicePlugIn implements Plugin { | ||||
| 
 | ||||
|     @Override | ||||
|     public void beforeExecuteOperationTransaction(BeforeOperationArgs e) { | ||||
|         super.beforeExecuteOperationTransaction(e); | ||||
|         String eok = e.getOperationKey(); | ||||
|         //估值 | ||||
|         if("valuateupdate".equals(eok)){ | ||||
|             DynamicObject[] dos = e.getDataEntities(); | ||||
|             DynamicObject prinfo; | ||||
|             for (int i = 0; i < dos.length; i++) { | ||||
|                 prinfo = BusinessDataServiceHelper.loadSingle(dos[i].getPkValue(), dos[i].getDataEntityType().getName()); | ||||
|                 //1、点击【估值】时,若申购单下游存在暂存、已提交的赎回单,提醒报错:“下游存在待审批的赎回单据,请删除或审批后再进行估值”; | ||||
|                 //cim_redeem | ||||
|                 QFilter q1 = new QFilter("finbillno.id", QCP.equals, prinfo.getLong("id")); | ||||
|                 QFilter q2 = new QFilter("billstatus", QCP.equals, "A");//暂存 | ||||
|                 QFilter q3 = new QFilter("billstatus", QCP.equals, "B");//已提交 | ||||
|                 q1 = q1.and(q2.or(q3)); | ||||
|                 DynamicObject cimRedeem = BusinessDataServiceHelper.loadSingle("cim_redeem", q1.toArray()); | ||||
|                 if (null != cimRedeem) { | ||||
|                     e.setCancelMessage("下游存在待审批的赎回单据,请删除或审批后再进行估值"); | ||||
|                     e.setCancel(true); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
		Loading…
	
		Reference in New Issue