/// <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());
        }
Exemplo n.º 2
0
        /// <summary>
        /// 根据销售报价明细分录创建产品代码
        /// </summary>
        /// <param name="ctx"></param>
        /// <param name="info">销售报价单模型信息</param>
        /// <param name="saleQuoteEntryRows">销售报价单表体分录集合信息</param>
        /// <param name="option"></param>
        /// <returns></returns>
        public IOperationResult CreateProductMaterial(Context ctx, BusinessInfo info, DynamicObject[] saleQuoteEntryRows, OperateOption option, DynamicObject dynamicO = null)
        {
            IOperationResult result = new OperationResult();

            result.IsSuccess = false;


            DynamicObject customer = dynamicO["CustId"] as DynamicObject;//客户信息

            //if (customer == null)
            //{
            //    throw new KDBusinessException("", "产品创建失败:请先录入客户信息!");
            //}
            string custName = (customer == null) ? "" : customer["Name"].ToString();
            long   userId   = (long)dynamicO["SaleOrgId_Id"];       //使用组织
            string billno   = Convert.ToString(dynamicO["BillNo"]); //单据号

            if (saleQuoteEntryRows == null || saleQuoteEntryRows.Any() == false)
            {
                return(result);
            }

            Dictionary <DynamicObject, DynamicObject> dctQuoteMaterialData = new Dictionary <DynamicObject, DynamicObject>();

            var billTypeField = info.GetBillTypeField();

            if (billTypeField == null)
            {
                return(result);
            }

            FormMetadata mtrlMetadata = AppServiceContext.MetadataService.Load(ctx, "BD_MATERIAL") as FormMetadata;

            var saleQuoteEntryGroups = saleQuoteEntryRows.GroupBy(o => billTypeField.RefIDDynamicProperty.GetValue <string>(o.Parent as DynamicObject));

            foreach (var saleQuoteGroup in saleQuoteEntryGroups)
            {
                var billTypeParaObj = AppServiceContext.GetService <ISysProfileService>().LoadBillTypeParameter(ctx, info.GetForm().Id, saleQuoteGroup.Key);
                if (billTypeParaObj == null)
                {
                    continue;
                }

                //产品组别没有配置对应物料模板
                var billTypeParaTplMtrlRows = billTypeParaObj["QuoteMtrlTplEntity"] as DynamicObjectCollection;
                foreach (var quoteEntryRow in saleQuoteGroup)
                {
                    var matchTplMtrlRowObj = billTypeParaTplMtrlRows.FirstOrDefault(o => (long)o["F_JN_MtrlGroupId_Id"] == (long)quoteEntryRow["F_JN_MtrlGroupId_Id"]);
                    if (matchTplMtrlRowObj == null)
                    {
                        var strMtrlGroupName = "";
                        if (quoteEntryRow["F_JN_MtrlGroupId"] is DynamicObject)
                        {
                            strMtrlGroupName = Convert.ToString((quoteEntryRow["F_JN_MtrlGroupId"] as DynamicObject)["name"]);
                        }
                        throw new KDBusinessException("", string.Format("产品创建失败:产品组别{0}未配置对应的模板物料!", strMtrlGroupName));
                    }

                    var           lRefMtrlTplId = (long)matchTplMtrlRowObj["F_JN_TplMtrlId_Id"];
                    DynamicObject refMtrlObject = null;
                    if (lRefMtrlTplId > 0)
                    {
                        refMtrlObject = AppServiceContext.ViewService.LoadWithCache(ctx, new object[] { lRefMtrlTplId }, mtrlMetadata.BusinessInfo.GetDynamicObjectType(), true, null)
                                        .FirstOrDefault();
                    }

                    if (refMtrlObject == null)
                    {
                        var strMtrlGroupName = "";
                        if (quoteEntryRow["F_JN_MtrlGroupId"] is DynamicObject)
                        {
                            strMtrlGroupName = Convert.ToString((quoteEntryRow["F_JN_MtrlGroupId"] as DynamicObject)["name"]);
                        }
                        throw new KDBusinessException("", string.Format("产品创建失败:产品组别{0}关联的模板物料不存在!", strMtrlGroupName));
                    }

                    //通过克隆生成新物料数据包
                    var newMtrlObject = refMtrlObject.Clone(false, true) as DynamicObject;
                    dctQuoteMaterialData[quoteEntryRow] = newMtrlObject;

                    //TODO:新物料数据包需要覆盖及重写的属性
                    newMtrlObject["DocumentStatus"] = "Z";
                    newMtrlObject["ForbidStatus"]   = "A";
                    string name = quoteEntryRow["F_JN_ProductName"] as string;
                    if (name.IsNullOrEmptyOrWhiteSpace())
                    {
                        name = custName + "特配";
                    }
                    newMtrlObject["Name"]             = new LocaleValue(name);
                    newMtrlObject["MaterialGroup_Id"] = quoteEntryRow["F_JN_MtrlGroupId_Id"];
                    newMtrlObject["CreateOrgId_Id"]   = userId;
                    newMtrlObject["UseOrgId_Id"]      = userId;
                    newMtrlObject["F_JNSRCBillNo"]    = billno;
                    //统一根据编码规则生成
                    newMtrlObject["Number"] = AppServiceContext.GetService <IBusinessDataService>().GetListBillNO(ctx, "BD_MATERIAL", 1, "565c204c1f5abf")[0];
                    //计量单位本可以根据报价分录去重写,但目前可以考虑放在模板物料中设置,一个行业的产品代码特性通常相同的。
                }
            }


            if (dctQuoteMaterialData.Any())
            {
                var saveRet = AppServiceContext.SaveService.Save(ctx, mtrlMetadata.BusinessInfo, dctQuoteMaterialData.Values.ToArray(), option, "Save");
                result.MergeResult(saveRet);

                if (saveRet.SuccessDataEnity != null)
                {
                    //更新msterID--解决工序汇报已添加相同键的项
                    DynamicObject mtrl = saveRet.SuccessDataEnity.FirstOrDefault();

                    string sql = string.Format("update T_BD_MATERIAL set FMASTERID=FMATERIALID where FMATERIALID={0}", mtrl["ID"]);
                    DBUtils.Execute(ctx, sql);
                }

                /*
                 * //启动审批流
                 *  // 读取单据的工作流配置模板
                 *  var submitRowObjs = saveRet.SuccessDataEnity.Where(o => Convert.ToString(o["DocumentStatus"]).EqualsIgnoreCase("A")
                 || Convert.ToString(o["DocumentStatus"]).EqualsIgnoreCase("D")).Select(o => o["Id"]).ToArray();
                 || string formId = "BD_MATERIAL";
                 || String[] Billarray = null;
                 || int length = submitRowObjs.GetLength(0);
                 || Billarray = new String[length];
                 || for (int i = 0; i < length; i++)
                 || {
                 ||     Billarray[i] = Convert.ToString(submitRowObjs.GetValue(i));
                 || }
                 || IWorkflowTemplateService wfTemplateService = Kingdee.BOS.Workflow.Contracts.ServiceFactory.GetWorkflowTemplateService(ctx);
                 || List<FindPrcResult> findProcResultList = wfTemplateService.GetPrcListByFormID(
                 ||                 formId, Billarray, ctx);
                 || if (findProcResultList == null || findProcResultList.Count == 0)
                 || {
                 ||     throw new KDBusinessException("AutoSubmit-002", "查找单据适用的流程模板失败,不允许提交工作流!");
                 || }
                 ||
                 || // 设置提交参数:忽略操作过程中的警告,避免与用户交互
                 || OperateOption submitOption = OperateOption.Create();
                 || submitOption.SetIgnoreWarning(true);
                 || IOperationResult submitResult = null;
                 ||
                 || FindPrcResult findProcResult = findProcResultList[0];
                 || if (findProcResult.Result == TemplateResultType.Error)
                 || {
                 ||     throw new KDBusinessException("AutoSubmit-003", "单据不符合流程启动条件,不允许提交工作流!");
                 || }
                 || else if (findProcResult.Result != TemplateResultType.Normal)
                 || {// 本单无适用的流程图,直接走传统审批
                 ||     ISubmitService submitService = Kingdee.BOS.App.ServiceHelper.GetService<ISubmitService>();
                 ||     submitResult = submitService.Submit(ctx, mtrlMetadata.BusinessInfo,
                 ||         submitRowObjs, "Submit", submitOption);
                 || }
                 || else
                 || {// 走工作流
                 ||     IBOSWorkflowService wfService = Kingdee.BOS.Workflow.Contracts.ServiceFactory.GetBOSWorkflowService(ctx);
                 ||     submitResult = wfService.ListSubmit(ctx, mtrlMetadata.BusinessInfo,
                 ||         0, submitRowObjs, findProcResultList, submitOption);
                 ||     result.MergeResult(submitResult);
                 || }
                 ||
                 ||
                 ||var submitRet = AppServiceContext.SubmitService.Submit(ctx, mtrlMetadata.BusinessInfo, saveRet.SuccessDataEnity.Select(o => o["Id"]).ToArray(), "Submit", option);
                 ||result.MergeResult(submitRet);
                 ||if (submitRet.SuccessDataEnity != null)
                 ||{
                 || var auditResult = AppServiceContext.SetStatusService.SetBillStatus(ctx, mtrlMetadata.BusinessInfo,
                 ||     submitRet.SuccessDataEnity.Select(o => new KeyValuePair<object, object>(o["Id"], 0)).ToList(),
                 ||     new List<object> { "1", "" },
                 ||     "Audit", option);
                 ||
                 || result.MergeResult(auditResult);
                 ||}
                 ||
                 ||}*/
            }
            result.IsSuccess  = true;
            result.FuncResult = dctQuoteMaterialData;
            return(result);
        }