
# 【问题概述】:如何在移动采购2.0各列表页的卡片中增加相应自定义数据展示?
场景:目前移动采购2.0提供的列表页,如申请单列表、订单列表、供应商列表等,列表卡片中提供的字段显示相对固定,客户希望在展示自定义字段,如何实现呢?
# 【问题分析】
该需求需要在对应表单中进行二开设计,且需要写代码实现。
# 【解决方案】二开步骤
1. 确定当前需要操作的表单及默认插件
* 移动采购V2_申请单列表 (PUR_MobReqOrderListV2)
* Kingdee.K3.SCM.Mobile.Business.PlugIn.PUR.Version2.MobReqList, Kingdee.K3.SCM.Mobile.Business.PlugIn
* 移动采购V2_申请单商品列表 (PUR_MobReqOrderProductV2)
* Kingdee.K3.SCM.Mobile.Business.PlugIn.PUR.Version2.MobReqProduct, Kingdee.K3.SCM.Mobile.Business.PlugIn
* 移动采购V2_采购订单列表 (Pur_MobPurchaseOrderListV2)
* Kingdee.K3.SCM.Mobile.Business.PlugIn.PUR.Version2.MobPurchaseOrderList, Kingdee.K3.SCM.Mobile.Business.PlugIn
* 移动采购V2_订单商品列表 (PUR_MobOrderProductV2)
* Kingdee.K3.SCM.Mobile.Business.PlugIn.PUR.Version2.MobPurProduct, Kingdee.K3.SCM.Mobile.Business.PlugIn
* 移动采购V2_供应商列表 (Pur_MobPurchaseSupplierListV2)
* Kingdee.K3.SCM.Mobile.Business.PlugIn.PUR.Version2.MobPurchaseSupplierList, Kingdee.K3.SCM.Mobile.Business.PlugIn
* 移动采购V2_收料通知单列表 (PUR_MobReceiveOrderListV2)
* Kingdee.K3.SCM.Mobile.Business.PlugIn.PUR.Version2.MobPurReceiveOrderList, Kingdee.K3.SCM.Mobile.Business.PlugIn
2. 扩展对应表单,在表单中找到移动列表控件,在其中相应位置增加文本字段,记下字段标识


3. 编写插件类,引用Kingdee.K3.SCM.Mobile.Business.PlugIn.PUR.Version2(项目引用组件Kingdee.K3.SCM.Mobile.Business.PlugIn.dll),继承对应默认插件
4. 重写相应触发重新加载列表的事件处理方法,调用父类的对应
方法后,获取数据赋值对应字段
5. 注册并启用该插件,取消启用默认插件

以 供应商列表“**展示供应商的第一个联系人的备注字段**” 为例,参考代码如下:
```
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Kingdee.BOS.Util;
using Kingdee.BOS.Mobile.PlugIn.Args;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Core.Metadata;
using Kingdee.BOS.ServiceHelper;
namespace ClassLibrary1
{
public class YourPlugin : Kingdee.K3.SCM.Mobile.Business.PlugIn.PUR.Version2.MobPurchaseSupplierList
{
// 数据包创建完毕后
public override void AfterCreateNewData(EventArgs e)
{
base.AfterCreateNewData(e);
FillOtherData();
}
// 上拉翻页
public override void OnEntityPageChange(PageChangeEventArgs e)
{
base.OnEntityPageChange(e);
FillOtherData();
}
// 下拉刷新
public override void OnEntityRefresh(EntityRefreshEventArgs e)
{
base.OnEntityRefresh(e);
FillOtherData();
}
// 页签 常用、全部、收藏 被点击
public override void LabelClick(LabelClickEventArgs e)
{
base.LabelClick(e);
if (e.Key.EqualsIgnoreCase("FLblCommon") || e.Key.EqualsIgnoreCase("FLblAll") || e.Key.EqualsIgnoreCase("FLblFavor"))
{
FillOtherData();
}
}
// 搜索按钮被点击
public override void ButtonClick(ButtonClickEventArgs e)
{
base.ButtonClick(e);
if (e.Key.EqualsIgnoreCase("FBtnSearch"))
{
FillOtherData();
}
}
// 额外字段赋值
public void FillOtherData()
{
// 获取当前移动列表数据包
var entryList = this.View.Model.GetEntityDataObject(ListArgs.MainEntity);
List<object> Ids = new List<object>();
// 循环分录行
for (int i = 0; i < entryList.Count; i++)
{
// 当前供应商内码Id
long Id = (long)entryList[i]["Id"];
Ids.Add(Id);
}
if (Ids.Count > 0)
{
BusinessInfo info = (MetaDataServiceHelper.Load(this.Context, BillFormId) as FormMetadata).BusinessInfo;
// 因为供应商是基础资料,值不会频繁修改,因此从缓存中取数据(LoadFromCache)
var data = Kingdee.BOS.ServiceHelper.BusinessDataServiceHelper.LoadFromCache(this.Context, Ids.ToArray(), info.GetDynamicObjectType());
// 有取到数据
if (data.Length > 0)
{
// 循环分录行
for (int i = 0; i < entryList.Count; i++)
{
for (int j = 0; j < data.Length; j++)
{
if ((long)entryList[i]["Id"] == (long)data[j]["Id"])
{
// 当前供应商的联系人分录
var SupplierContacts = (Kingdee.BOS.Orm.DataEntity.DynamicObjectCollection)data[j]["SupplierContact"];
if (SupplierContacts.Count > 0)
{
//赋值对应字段
entryList[i]["F_dev_Text"] = SupplierContacts[0]["Description"];
}
}
}
}
this.View.UpdateView(ListArgs.Key_MainEntity);
}
}
}
}
}
```
备注:
1. F_dev_Text为你创建的字段标识,建议按需求修改为有意义的名称。
2. 移动端供应商列表是可以获取到Id的,所以可以用Id来获取数据包。其他列表可自行调试,如没有Id则选取Number编码来获取数据包。

3. 由于供应商是基础资料不会频繁修改,因此这里是从缓存中获取的BusinessDataServiceHelper.LoadFromCache。
4. 前端效果(下划线、字体、样式等)要自己调整
最终效果:
