/// <summary> /// 移动表格分录 /// </summary> /// <param name="view"></param> /// <param name="entityKey"></param> /// <param name="iSrcRowIndex"></param> /// <param name="iDstRowIndex"></param> /// <param name="callback"></param> public static void MoveEntryRow(this IDynamicFormView view, string entityKey, int iSrcRowIndex, int iDstRowIndex, Action <int, int> callback = null) { EntryEntity entryEntity = view.BillBusinessInfo.GetEntryEntity(entityKey); DynamicObjectCollection dataEntities = view.Model.GetEntityDataObject(entryEntity); if (iSrcRowIndex < 0 || iSrcRowIndex >= dataEntities.Count) { return; } if (iDstRowIndex < 0 || iDstRowIndex >= dataEntities.Count) { return; } var srcRow = dataEntities[iSrcRowIndex]; var dstRow = dataEntities[iDstRowIndex]; if (iSrcRowIndex > iDstRowIndex) { dataEntities.RemoveAt(iSrcRowIndex); dataEntities.Insert(iDstRowIndex, srcRow); } else { dataEntities.RemoveAt(iDstRowIndex); dataEntities.Insert(iSrcRowIndex, dstRow); } EntryGrid grid = view.GetControl <EntryGrid>(entityKey); grid.ExchangeRowIndex(iSrcRowIndex, iDstRowIndex); grid.SetFocusRowIndex(iDstRowIndex); if (callback != null) { callback(iSrcRowIndex, iDstRowIndex); } }
/// <summary> /// 移动表格分录,保证模型与视图索引匹配 /// </summary> /// <param name="view"></param> /// <param name="entityKey"></param> /// <param name="selRows"></param> /// <param name="iTargetPos"></param> /// <param name="isRelativePos"></param> /// <param name="callback"></param> public static void MoveEntryRow(this IDynamicFormView view, string entityKey, int[] selRows, int iTargetPos, bool isRelativePos = true, Action <int[], int, bool> callback = null) { if (selRows == null || selRows.Any() == false) { return; } var entryEntity = view.BillBusinessInfo.GetEntity(entityKey); DynamicObjectCollection dataEntities = view.Model.GetEntityDataObject(entryEntity); DynamicObject targetRowObj = null; if (!isRelativePos) { if (iTargetPos < 0 || iTargetPos >= dataEntities.Count) { return; } targetRowObj = view.Model.GetEntityDataObject(entryEntity, iTargetPos); if (targetRowObj == null) { return; } } var selRowObjItems = selRows.Select(o => view.Model.GetEntityDataObject(entryEntity, o)) .ToList(); List <int> lstNewSelRows = new List <int>(); for (int i = selRowObjItems.Count - 1; i >= 0; i--) { if (selRowObjItems[i] == null) { continue; } var selRowObj = selRowObjItems[i]; int iSrcRowIndex = view.Model.GetRowIndex(entryEntity, selRowObj); int iTargetRowIndex = iSrcRowIndex + iTargetPos; if (!isRelativePos) { iTargetRowIndex = view.Model.GetRowIndex(entryEntity, targetRowObj); } if (iTargetRowIndex > dataEntities.Count - 1 || iTargetRowIndex < 0) { continue; } dataEntities.Remove(selRowObj); dataEntities.Insert(iTargetRowIndex, selRowObj); lstNewSelRows.Add(iTargetRowIndex); } int iSeq = 1; foreach (var dataEntity in dataEntities) { if (entryEntity.SeqDynamicProperty != null) { entryEntity.SeqDynamicProperty.SetValue(dataEntity, iSeq++); } } if (callback != null) { callback(selRows, iTargetPos, isRelativePos); } view.UpdateView(entityKey); if (lstNewSelRows.IsEmpty()) { lstNewSelRows.AddRange(selRows); } if (lstNewSelRows.Any()) { EntryGrid grid = view.GetControl <EntryGrid>(entityKey); grid.SelectRows(lstNewSelRows.ToArray()); grid.SetFocusRowIndex(lstNewSelRows.Last()); } }
/// <summary> /// 目标单单据构建完毕,且已经创建好与源单的关联关系之后,触发此事件 /// </summary> /// <param name="e"></param> /// <remarks> /// 本事件的时机,刚好能够符合需求, /// 而AfterConvert事件,则在执行表单服务策略之后 /// </remarks> public override void OnAfterCreateLink(CreateLinkEventArgs e) { // 目标单单据体元数据 Entity entity = e.TargetBusinessInfo.GetEntity("FRefundBillSrcEntity"); Entity es = e.SourceBusinessInfo.GetEntity("FEntity"); // 读取已经生成的付款退款单 ExtendedDataEntity[] bills = e.TargetExtendedDataEntities.FindByEntityKey("FBillHead"); // 定义一个集合,存储新拆分出来的单据体行 List <ExtendedDataEntity> newRows = new List <ExtendedDataEntity>(); // 对目标单据进行循环 foreach (var bill in bills) { // 取单据体集合 DynamicObjectCollection rowObjs = entity.DynamicProperty.GetValue(bill.DataEntity) as DynamicObjectCollection; // 对单据体进行循环:从后往前循环,新拆分的行,避开循环 int rowCount = rowObjs.Count; int newRowCount = 1; for (int i = rowCount - 1; i >= 0; i--) { DynamicObject rowObj = rowObjs[i]; double F_JNRoadAmount = Convert.ToDouble(rowObj["F_JNRoadAmount"]); double PLANPAYAMOUNT = Convert.ToDouble(rowObj["PLANREFUNDAMOUNT"]); double AFTTAXTOTALAMOUNT = Convert.ToDouble(rowObj["AFTTAXTOTALAMOUNT"]); double F_JNTAXAmount = Convert.ToDouble(rowObj["F_JNTAXAmount"]); DynamicObject newRowObj = null; rowObj["PLANREFUNDAMOUNT"] = PLANPAYAMOUNT - F_JNRoadAmount - F_JNTAXAmount; rowObj["AFTTAXTOTALAMOUNT"] = AFTTAXTOTALAMOUNT - F_JNRoadAmount - F_JNTAXAmount; rowObj["REALREFUNDAMOUNT"] = rowObj["PLANREFUNDAMOUNT"]; rowObj["F_JNRoadAmount"] = 0; // 根据规则进行拆分: // 示例代码略过拆分规则,强制对每行进行拆分 // 通过复制的方式,产生新行:确保字段值、关联关系与原行一致 if (F_JNRoadAmount > 0) { var SRCCOSTID = rowObj["FSRCCOSTID"] as DynamicObject; DynamicObject SRCCOST = (DynamicObject)SRCCOSTID.Clone(true, false); newRowObj = (DynamicObject)rowObj.Clone(false, true); //DynamicObject newRowObj = rowObj.Clone(; //DynamicObject newRowObj = (DynamicObject)rowObj.Clone(true, true); newRowObj["PLANREFUNDAMOUNT"] = F_JNRoadAmount; newRowObj["AFTTAXTOTALAMOUNT"] = F_JNRoadAmount; newRowObj["F_JNRoadAmount"] = 0; newRowObj["REALREFUNDAMOUNT"] = F_JNRoadAmount; //newRowObj["Seq"] = i + 1; QueryBuilderParemeter queryParam = new QueryBuilderParemeter(); queryParam.FormId = "BD_Expense"; queryParam.SelectItems.Add(new SelectorItemInfo("FMasterId")); queryParam.SelectItems.Add(new SelectorItemInfo("FNumber")); queryParam.SelectItems.Add(new SelectorItemInfo("FName")); queryParam.FilterClauseWihtKey = string.Format(" FNumber = '{0}' ", "FYXM23"); var expense = QueryServiceHelper.GetDynamicObjectCollection(this.Context, queryParam); newRowObj["FSRCCOSTID_Id"] = expense[0]["FMasterId"]; SRCCOST["Id"] = expense[0]["FMasterId"]; SRCCOST["msterId"] = expense[0]["FMasterId"]; SRCCOST["Name"] = expense[0]["FName"]; SRCCOST["Number"] = expense[0]["FNumber"]; newRowObj["FSRCCOSTID"] = SRCCOST; // 把新行,插入到单据中,排在当前行之后 rowObjs.Insert(i + 1, newRowObj); //newRowObj["SRCCOSTID_Id"] = 131120; } if (F_JNTAXAmount > 0) { var SRCCOSTID = rowObj["FSRCCOSTID"] as DynamicObject; DynamicObject SRCCOST = (DynamicObject)SRCCOSTID.Clone(true, false); newRowObj = (DynamicObject)rowObj.Clone(false, true); //DynamicObject newRowObj = rowObj.Clone(; //DynamicObject newRowObj = (DynamicObject)rowObj.Clone(true, true); newRowObj["PLANREFUNDAMOUNT"] = F_JNTAXAmount; newRowObj["AFTTAXTOTALAMOUNT"] = F_JNTAXAmount; newRowObj["F_JNRoadAmount"] = 0; newRowObj["REALREFUNDAMOUNT"] = F_JNTAXAmount; //newRowObj["Seq"] = i + 1; QueryBuilderParemeter queryParam = new QueryBuilderParemeter(); queryParam.FormId = "BD_Expense"; queryParam.SelectItems.Add(new SelectorItemInfo("FMasterId")); queryParam.SelectItems.Add(new SelectorItemInfo("FNumber")); queryParam.SelectItems.Add(new SelectorItemInfo("FName")); queryParam.FilterClauseWihtKey = string.Format(" FNumber = '{0}' ", "FYXM98"); var expense = QueryServiceHelper.GetDynamicObjectCollection(this.Context, queryParam); newRowObj["FSRCCOSTID_Id"] = expense[0]["FMasterId"]; SRCCOST["Id"] = expense[0]["FMasterId"]; SRCCOST["msterId"] = expense[0]["FMasterId"]; SRCCOST["Name"] = expense[0]["FName"]; SRCCOST["Number"] = expense[0]["FNumber"]; newRowObj["FSRCCOSTID"] = SRCCOST; // 把新行,插入到单据中,排在当前行之后 rowObjs.Insert(i + 1, newRowObj); //newRowObj["SRCCOSTID_Id"] = 131120; } if (newRowObj != null) { // 为新行创建一个ExtendedDataEntity对象,表单服务策略需要此对象 ExtendedDataEntity newRow = new ExtendedDataEntity( newRowObj, bill.DataEntityIndex, rowCount + newRowCount); newRows.Add(newRow); newRowCount++; } } } // 把新拆分出来的单据体行,加入到下推结果中 // 特别说明:如果去掉此语句,新拆分的行,不会执行表单服务策略 e.TargetExtendedDataEntities.AddExtendedDataEntities("FEntity", newRows.ToArray()); }