应付的审核后从采购入库下推费用应付单
金蝶云社区-Cloud二开DrJ
Cloud二开DrJ
0人赞赏了该文章 1,009次浏览 未经作者许可,禁止转载编辑于2016年03月29日 02:35:34

1、因为费用应付单有多选基础资料字段,所以在下推的时候希望能够直接在程序中赋值给多选基础资料。按照丁老师给的列子做了,但是程序运行到红色部分就没有进入循环体内,这是怎么回事?还有这“ linkEntity.DynamicProperty.GetValue(newBillRow) as DynamicObjectCollection”句话是求什么呢?
[Description("服务插件|标准应付单审核后触发采购入库单下推费用应付单")]
public override void EndOperationTransaction(EndOperationTransactionArgs e)
{
base.EndOperationTransaction(e);

foreach (var billObj in e.DataEntitys)
{
string billType = billObj["BillTypeID_Id"].ToString();
if (billType == "a83c007f22414b399b0ee9b9aafc75f9")
{
DynamicObjectCollection entryRows = billObj["AP_PAYABLEENTRY"] as DynamicObjectCollection;
object sourcebillno = entryRows[0]["SourceBillNo"];

IOperationResult result = new OperationResult();
//获取单据转换规则
ConvertRuleElement ruleElement = ServiceHelper.GetService().GetConvertRules(this.Context, "STK_InStock", "AP_Payable").FirstOrDefault();
string getSourceSql = String.Format(@"select * from t_STK_InStock inner join T_STK_INSTOCKENTRY on T_STK_INSTOCKENTRY.FID=t_STK_InStock.FID where FBILLNO='{0}'", sourcebillno);
ListSelectedRowCollection rows = new ListSelectedRowCollection();
int i = 0;
using (IDataReader reader = DBUtils.ExecuteReader(this.Context, getSourceSql))
{
while (reader.Read())
{
ListSelectedRow row = new ListSelectedRow(reader["FID"].ToString(), string.Empty, i++, "STK_InStock");
rows.Add(row);
}
}
//// 调用下推服务,生成下游单据数据包
ConvertOperationResult operationResult = null;
//Dictionary custParams = new Dictionary();
try
{
PushArgs pushArgs = new PushArgs(ruleElement, rows.ToArray());
{
pushArgs.TargetBillTypeId = "3c6f819d78ac4d5981891956c4595b20"; // 费用应付单类型 targetBillTypeId
// TargetOrgId = 0, // 请设定目标单据主业务组织。如无主业务组织,可以为0
// //CustomParams = custParams, // 可以传递额外附加的参数给单据转换插件,如无此需求,可以忽略
};
// //执行下推操作,并获取下推结果
operationResult = ServiceHelper.GetService().Push(this.Context, pushArgs, OperateOption.Create());
result.MergeResult(operationResult);
}
catch (KDExceptionValidate ex)
{
throw new Exception(ex.Message);

}
catch (KDException ex)
{
throw new Exception(ex.Message);

}
catch
{
throw;
}

// 获取生成的目标单据数据包
DynamicObject[] objs = (from p in operationResult.TargetDataEntities
select p.DataEntity).ToArray();

for (int j = 0; j < objs.Length; j++)
{
decimal Amount = 0;
//根据实际情况,处理目标单据数据
DynamicObjectCollection FEntityDetail = objs[j]["AP_PAYABLEENTRY"] as DynamicObjectCollection;
foreach (var item in FEntityDetail)
{
Amount += Convert.ToDecimal(item["FALLAMOUNTFOR_D"]);//价税合计

}
DynamicObjectCollection FEntityPlan = objs[j]["AP_PAYABLEPLAN"] as DynamicObjectCollection;
decimal iPAYAMOUNTFOR = Amount / FEntityPlan.Count;//“价税合计” 总金额平均分配到每一条付款计划 “应付金额” 字段
foreach (var it in FEntityPlan)
{
it["PAYAMOUNTFOR"] = iPAYAMOUNTFOR;
}
//设置单据头 “价税合计” 即【明细】分录的“含税单价”合计
objs[j]["FALLAMOUNTFOR"] = Amount;

// 读取目标单据元数据
IViewService viewService = ServiceHelper.GetService();
ISaveService saveService = ServiceHelper.GetService();
var targetBillMeta = ServiceHelper.GetService().Load(this.Context, "AP_Payable") as FormMetadata;
BusinessInfo info = targetBillMeta.BusinessInfo;

Entity linkEntity = info.GetEntity("FEntityDetail_Link");
MulBaseDataField FINSTOCKID = info.GetField("FINSTOCKID") as MulBaseDataField;//获取入库单号多选基础资料
//foreach (var NewbillObj in objs)//objs是下游数据包
//{
//DynamicObjectCollection newbillRows =NewbillObj["AP_PAYABLEENTRY"] as DynamicObjectCollection;//NewbillObj["AP_PAYABLEENTRY"]

foreach (DynamicObject newBillRow in FEntityDetail)
{


DynamicObjectCollection linkRows = linkEntity.DynamicProperty.GetValue(newBillRow) as DynamicObjectCollection;
HashSet srcInstockIds = new HashSet();
foreach (var linkRow in linkRows)
{
long srcInStockId = Convert.ToInt64(linkRow["SBillId"]);
if (srcInStockId != 0 && srcInstockIds.Contains(srcInStockId) == false)
{
srcInstockIds.Add(srcInStockId);
}
}
DynamicObjectCollection inStockIdRows = newBillRow["INSTOCKID"] as DynamicObjectCollection;
if (srcInstockIds.Count > 0)
{
DynamicObject[] inStockBillObjs = viewService.LoadFromCache(
this.Context,
srcInstockIds.ToArray(),
FINSTOCKID.RefFormDynamicObjectType);
foreach (var inStockBillObj in inStockBillObjs)
{
DynamicObject newInStockIdRow = new DynamicObject(FINSTOCKID.RefEntityDynamicObjectType);
FINSTOCKID.DynamicProperty.SetValue(newInStockIdRow, inStockBillObj);
FINSTOCKID.RefIDDynamicProperty.SetValue(newInStockIdRow, inStockBillObj[0]);
inStockIdRows.Add(newInStockIdRow);
}
}
OperateOption saveOption = OperateOption.Create();
saveOption.SetIgnoreWarning(true); // 提交数据库保存,并获取保存结果
var saveResult = saveService.Save(this.Context, info, objs, saveOption);
//var saveResult = BusinessDataServiceHelper.Save(this.Context, targetBillMeta.BusinessInfo, objs);

}
}
}
}
}
}
}