
【场景】按列表选中行加载收件人
【案例】采购申请单,使用明细的建议供应商发送邮件;
发送时使用选中行的供应商邮箱作为收件人
```csharp
using Kingdee.BOS.Core;
using Kingdee.BOS.Core.Bill;
using Kingdee.BOS.Core.CommonFilter;
using Kingdee.BOS.Core.DynamicForm;
using Kingdee.BOS.Core.DynamicForm.PlugIn;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Core.Enums;
using Kingdee.BOS.Core.List;
using Kingdee.BOS.Core.Metadata;
using Kingdee.BOS.Core.Metadata.EntityElement;
using Kingdee.BOS.Core.Metadata.FieldElement;
using Kingdee.BOS.Core.Metadata.FormElement;
using Kingdee.BOS.Core.Metadata.Operation;
using Kingdee.BOS.Core.SqlBuilder;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.ServiceHelper;
using Kingdee.BOS.Util;
using System;
using System.Collections.Generic;
using System.Linq;
namespace DynamicFormPlugIn.Mail
{
[Kingdee.BOS.Util.HotUpdate]
[System.ComponentModel.Description("发送邮件,针对列表,取选中行收件人逻辑")]
public class MailFormPlugIn_Extend : AbstractDynamicFormPlugIn
{
/*
* 针对特定单据,按照选中行数据加载默认收件人
*/
/// <summary>
/// 指定的业务对象标识
/// </summary>
string specFormId = "PUR_Requisition";
private string[] selectIds;
private SendMailParameter sendMailParam;
public override void OnInitialize(InitializeEventArgs e)
{
if (this.View.ParentFormView == null)
return;
//是否特定表单
if (!string.Equals(this.View.ParentFormView.BillBusinessInfo.GetForm().Id, specFormId, StringComparison.OrdinalIgnoreCase))
return;
selectIds = (e.Paramter.GetCustomParameter("Ids") as string[]) ?? new string[] { };
//加载操作的发送邮件参数
var formOp = this.View.ParentFormView.BillBusinessInfo.GetForm().GetOperation("SendMail");
if (formOp == null)
return;
sendMailParam = formOp.Parmeter as SendMailParameter;
}
public override void AfterBindData(EventArgs e)
{
if (sendMailParam == null)
return;
const string mailAddress = "FMailAddress";
Entity entity = this.View.BillBusinessInfo.GetEntity(mailAddress);
DynamicObjectCollection entityObjs = this.View.Model.GetEntityDataObject(entity);
//<0>清掉前面加载的收件人逻辑
entityObjs.Clear();
//<1>根据既定逻辑加载自己的收件人
AppendSupplierMail(entityObjs);
this.View.UpdateView(mailAddress);
}
private void AppendSupplierMail(DynamicObjectCollection entityObjs)
{
List<int> pkIds = GetBillSupplierId();
var supplilerObjs = GetSupplierById(pkIds, 1);
for (int i = 0; i < supplilerObjs.Count; ++i)
{
DynamicObject rowObj = new DynamicObject(entityObjs.DynamicCollectionItemPropertyType);
entityObjs.Add(rowObj);
rowObj["FSendeeType"] = "supplier";
rowObj["FSendeeKey"] = supplilerObjs[i]["FSUPPLIERID"];
rowObj["FSendee"] = supplilerObjs[i]["FName"];
rowObj["FUser"] = supplilerObjs[i]["FCONTACT"];
rowObj["FToAddress"] = supplilerObjs[i]["FEmail"];
this.View.StyleManager.SetEnabled("FUser", rowObj, "LockFieldService", true);
this.View.StyleManager.SetEnabled("FToAddress", rowObj, "LockFieldService", false);
}
}
/// <summary>
/// 获取单据关联的供应商内码
/// </summary>
/// <returns></returns>
private List<int> GetBillSupplierId()
{
List<int> result = new List<int>();
IDynamicFormView parentView = this.View.ParentFormView;
if (parentView == null)
return result;
BaseDataField loadField = parentView.BillBusinessInfo.GetField(sendMailParam.SupplierFieldKey) as BaseDataField;
Form form = parentView.BillBusinessInfo.GetForm();
string billPk = form.PkFieldName;
string baseField = loadField.FieldName;
QueryBuilderParemeter queryParameter = new QueryBuilderParemeter();
queryParameter.RequiresDataPermission = true;
queryParameter.FormId = parentView.BillBusinessInfo.GetForm().Id;
queryParameter.SelectItems = SelectorItemInfo.CreateItems(string.Format("{0},{1}", billPk, baseField));
if (parentView is IBillView)
{
//针对单据界面的特殊处理
queryParameter.FilterClauseWihtKey = string.Format("{0} in ('{1}')", billPk, string.Join("','", this.selectIds));
}
else if(parentView is IListView)
{
if(loadField.Entity.EntityType != (int)Entity.ENTRY_TYPE)
{
queryParameter.FilterClauseWihtKey = string.Format("{0} in ('{1}')", billPk, string.Join("','", this.selectIds));
}
else
{
//针对列表界面的特殊处理,加载选中行的供应商
IListView listView = parentView as IListView;
//获取对应的实体标识
List<FilterEntity> selectEntitnes = listView.Model.FilterParameter.SelectedEntities;