在开发过程中很多地方都需要操作表单界面上的东西,这个时候我们就可以通过试图来打开这个表单或者基础资料,通过this.View.XXX去操作这个表单上的东西
场景1:与CRM系统对接的时候,通过执行计划定时抓取CRM中的客户信息,创建金蝶的客户基础资料,这个时候有几种方式,常见的有,1.调用金蝶提供的标准API去新增客户,2.直接insert into 客户表和其他的关联表(一般不考虑),3.通过创建试图的方式去创建客户
场景2:在表单插件里面去操作另外一个基础资料的信息对其修改或者生成单据
操作试图的优点:与前台手工做单一致
直接上代码
/// <summary>
/// 客户执行计划
/// </summary>
public class CustomerService : IScheduleService
{
public void Run(Context ctx, Kingdee.BOS.Core.Schedule schedule)
{
ctx.CurrentOrganizationInfo = new OrganizationInfo
{
ID = 1,
Name = string.Empty
};
Customer(ctx);
}
/// <summary>
/// 根据编号创建或修改客户
/// </summary>
/// <param name="ctx"></param>
private void Customer(Context ctx)
{
BaseData baseData = new BaseData();//获取数据
List<recordsAccount> recordsAccount = baseData.Customerlist(ctx);
if (recordsAccount == null)
{
return;
}
else
{
foreach (var z in recordsAccount)
{
AccessResult accs = CreateCustomer.Create(ctx, z);//循环创建
}
}
}
/// <summary>
/// 创建一个单据视图,后续将利用此视图的各种方法,设置字段值
/// </summary>
/// <remarks>
/// 理论上,也可以直接修改数据包达成修改数据的目的
/// 但是,利用单据视图更具有优势:
/// 1. 视图会自动触发插件,这样逻辑更加完整;
/// 2. 视图会自动利用单据元数据,填写字段默认值,不用担心字段值不符合逻辑;
/// 3. 字段改动,会触发实体服务规则;
///
/// 而手工修改数据包的方式,所有的字段值均需要自行填写,非常麻烦
/// </remarks>
public static IBillView CreateBillView(Context ctx, string FormId, object FID)
{
// 读取物料的元数据
FormMetadata meta = AppServiceContext.MetadataService.Load(ctx, FormId) as FormMetadata;
Form form = meta.BusinessInfo.GetForm();
// 创建用于引入数据的单据view
Type type = Type.GetType("Kingdee.BOS.Web.Import.ImportBillView,Kingdee.BOS.Web");
var billView = (IDynamicFormViewService)Activator.CreateInstance(type);
// 开始初始化billView:
// 创建视图加载参数对象,指定各种参数,如FormId, 视图(LayoutId)等
BillOpenParameter openParam = CreateOpenParameter(ctx, meta, FID);
// 动态领域模型服务提供类,通过此类,构建MVC实例
var provider = form.GetFormServiceProvider();
billView.Initialize(openParam, provider);
return billView as IBillView;
}
/// <summary>
/// 根据编码创建或修改客户
/// <param name="ctx"></param>
/// <param name="item></param>
/// </summary>
public class CreateCustomer
{
public static AccessResult Create(Context ctx, recordsAccount item)
{
AccessResult Access = new AccessResult() { Message = "成功!", Code = "0" };
string FormKey = "BD_Customer";//唯一标识 BD_Customer
IOperationResult result = null;
OperateOption saveOption = OperateOption.Create();
IBillView billView = null;
long FID = 0;
long FSaveFID = 0;
timelog log = new timelog();//调用日志
log.FStartTime = DateTime.Now;//开始时间
try
{
//查询客户是否存在
string strsql = string.Format("select FCUSTID from T_BD_CUSTOMER where FNUMBER = '{0}'", item.customItem183__c);
DynamicObjectCollection OBJ = DBServiceHelper.ExecuteDynamicObject(ctx, strsql);
if (OBJ != null && OBJ.Count > 0)//如果返回结果不为空且返回行数大于0
{
FID = Convert.ToInt64(OBJ[0][0].ToString());
}
else
{
strsql = string.Format("select FCUSTID from T_BD_CUSTOMER_L where FNAME = '{0}'", item.accountName);
OBJ = DBServiceHelper.ExecuteDynamicObject(ctx, strsql);
if (OBJ != null && OBJ.Count > 0)//如果返回结果不为空且返回行数大于0
{
FID = Convert.ToInt64(OBJ[0][0].ToString());
}
}
billView = FourSDataManagerUtil.CreateBillView(ctx, FormKey, FID);
((IBillViewService)billView).LoadData();
DynamicFormViewPlugInProxy eventProxyPush = billView.GetService<DynamicFormViewPlugInProxy>();
IDynamicFormViewService dynamicFormViewPush = billView as IDynamicFormViewService;
#region 填充属性(赋值)
dynamicFormViewPush.SetItemValueByNumber("FCreateOrgId", "100", 0);//创建组织
dynamicFormViewPush.SetItemValueByNumber("FUseOrgId", "100", 0);//使用组织
if (!string.IsNullOrWhiteSpace(item.customItem183__c))
dynamicFormViewPush.UpdateValue("FNUMBER", 0, item.customItem183__c);//编码
if (!string.IsNullOrWhiteSpace(item.accountName))
dynamicFormViewPush.UpdateValue("FName", 0, item.accountName);//名称
if (!string.IsNullOrWhiteSpace(item.phone))
dynamicFormViewPush.UpdateValue("FTEL", 0, item.phone);//联系电话
if (!string.IsNullOrWhiteSpace(item.address))
dynamicFormViewPush.UpdateValue("FADDRESS", 0, item.address);//详细地址
if (!string.IsNullOrWhiteSpace(item.zipCode))
dynamicFormViewPush.UpdateValue("FZIP", 0, item.zipCode);//邮政编码
if (!string.IsNullOrWhiteSpace(item.Id))
dynamicFormViewPush.UpdateValue("FACCOUNTID", 0, item.Id);//销售易ID
#endregion
Return returs = new Return();
if (FID != 0)
{
//如果已存在客户直接保存跳出
#region 修改客户
result = FourSDataManagerUtil.SaveBill(ctx, billView, saveOption);
if (!result.IsSuccess)
{
//找到错误信息并跳出
Access.Code = "1004";//错误码
Access.Message = returs.Returns(result, "未知原因保存失败");//错误信息
return Access;
}
FSaveFID = Convert.ToInt32(billView.Model.DataObject["ID"]);
#endregion
}
else
{
#region 新增客户
billView.InvokeFormOperation(FormOperationEnum.Draft);
result = FourSDataManagerUtil.SaveBill(ctx, billView, saveOption);
if (!result.IsSuccess)
{
//找到错误信息并跳出
Access.Code = "1004";//错误码
Access.Message = returs.Returns(result, "未知原因保存失败");//错误信息
return Access;
}
FSaveFID = Convert.ToInt32(billView.Model.DataObject["ID"]);
IOperationResult sumbitResults = AppServiceContext.SubmitService.Submit(ctx, billView.BusinessInfo, new object[] { FSaveFID }, "Submit", OperateOption.Create());
//不成功时返回结果
if (!sumbitResults.IsSuccess)
{
Access.Code = "1004";//错误码
Access.Message = returs.Returns(sumbitResults, "未知原因提交失败");//错误信息
return Access;
}
returs.ClearNetWorkCtrlRS(ctx, FormKey, FSaveFID);
List<KeyValuePair<object, object>> keyValuePairPush = new List<KeyValuePair<object, object>>();
keyValuePairPush.Add(new KeyValuePair<object, object>(FSaveFID, ""));
List<object> pushauditObjs = new List<object>();
pushauditObjs.Add("2");
pushauditObjs.Add("");
result = AppServiceContext.SetStatusService.SetBillStatus(ctx, billView.BusinessInfo, keyValuePairPush, pushauditObjs, "Audit", OperateOption.Create());
if (!result.IsSuccess)
{
Access.Code = "1004";//错误码
Access.Message = returs.Returns(result, "未知原因审核失败");//错误信息
return Access;
}
#endregion
}
log.Msg = "成功";//返回消息
log.FRUNRESULT = 0;//执行状态
}
catch (Exception ex)
{
Access.Code = "500";
Access.Message += "错误信息:" + ex.Message + "错误堆栈:" + ex.StackTrace;
log.Msg = ex.Message;//返回消息
log.FRUNRESULT = 1;//执行状态
}
finally
{
log.cod = Access.Code;//跟踪码
log.FNUMBER = item.customItem183__c;//编码,关键字
log.FTypeName = "客户接口";//接口名称
log.FOPERATENAME = "创建客户";//操作名称
log.FInput = Newtonsoft.Json.JsonConvert.SerializeObject(item);//传入JSON
log.FOresults = Newtonsoft.Json.JsonConvert.SerializeObject(Access);//传出JSON
log.Fendtime = DateTime.Now;//结束时间
log.loge(ctx);//提交信息
if (billView != null)
{
billView.Close();
}
if (FID > 0)
{
DALSysnDataService.ClearNetWorkCtrlRS(ctx, FormKey, FID);
}
}
return Access;
}
}