金蝶云星空_k3cloud自定义WEBAPI-生产用料清单下推退料单

金蝶云星空_k3cloud自定义WEBAPI-生产用料清单下推退料单


ERP与IMS系统集成,需要IMS将退料单传给ERP,传入的参数如下:

public class PRD_PickMtrlReturnInfo
    {
        /// <summary>
        /// 访问令牌
        /// </summary>
        public string ACCESSTOKEN { get; set; }
        /// <summary>
        /// 单据编号
        /// </summary>
        public string FBILLNO { get; set; }
        /// <summary>
        /// 源单编号
        /// </summary>
        public string FSrcId { get; set; }
        public List<PRD_PickMtrlEntry2> FDetailEntity { get; set; }
    }
    public class PRD_PickMtrlEntry2
    {
        /// <summary>
        /// 明细内码
        /// </summary>
        public string FEntryId { get; set; }
        /// <summary>
        /// 源单明细内码
        /// </summary>
        public string FSrcEntryId { get; set; }
        /// <summary>
        /// 物料编码
        /// </summary>
        public string FMaterialId { get; set; }
        /// <summary>
        /// 实发数量(基本单位数量)
        /// </summary>
        public string FQty { get; set; }
        /// <summary>
        /// 仓库编码
        /// </summary>
        public string FStockID { get; set; }
        /// <summary>
        /// 备注
        /// </summary>
        public string FEntrtyMemo { get; set; }
        /// <summary>
        /// 退料类型
        /// </summary>
        public string FReturnType { get; set; }  //良品退料1   来料不良退料2   作业不良退料3
        /// <summary>
        /// 退料原因
        /// </summary>
        public string FReturnReason { get; set; }

        /// <summary>
        /// 不更新未领
        /// </summary>
        public string FISUPDATEQTY { get; set; }
        /// <summary>
        /// 用于同料号多行更新标记
        /// </summary>
        public bool IsUsed { get; set; } = false;

    }

这里引用的ACCESSTOKEN 是金蝶实施时开发自定义开发的接口,这里不做说明。
建立一个返回类:用于传送返回处理结果给调用端

/// <summary>
    /// 调用金蝶金蝶接口共通返回参数实体
    /// </summary>
    public class CommonReturnEntity
    {
        //0:成功(重复数据);2:TOKEN失效;500:内部服务器错误;1006:业务数据错误
        public string Code { get; set; }
        public string IMSsage { get; set; }
        public Data Datas { get; set; }
        public string AccessToken { get; set; }
        public string Data { get; set; }

    }
    public class Data
    {
        public string FBillNo { get; set; } //单据编号
    }

云星空下推生成下游单据据默认单行分录只能生成一行分录,退料时可能因为退料类型的不同,退料单需要两行同时关料用料清单的一行。这里就需要我们自定义复制行来完成。我的实现代码如下:

 /// <summary>
        ///IMS生产退料入库集成至金蝶 生产用料清单下推生产退料单
        /// </summary>
        /// <param name="ctx"></param>
        /// <param name="data"></param>
        /// <returns></returns>
        public CommonReturnEntity Push_PRD_ReturnMtrl(Context ctx, PRD_PickMtrlReturnInfo data)
        {
            CommonReturnEntity returnEntity = new CommonReturnEntity { Code = "0", IMSsage = "成功" };

            string convertRuleKey = "PRD_PPBOM2RETURNMTRL";  //单据转换规则
            string FormKey = "PRD_PPBOM"; //源单标识
            string tableName = "T_PRD_PPBOM";  //源单表名
            string tableNameEntry = "T_PRD_PPBOMENTRY";  //源单明细表名
            string sourceBillTypeId = "(All)";  //源单单据类型
            string entryEntityKey = "FEntity";  //源单明细标识

            string targetFormId = "PRD_ReturnMtrl"; //目标单标识
            string targetEntryOrm = "Entity"; //目标单明细ORM实体
            string qty = "FAPPQty";  //目标单数量标识
            string entrtyMemo = "FEntrtyMemo";  //目标单备注标识

            //timelog login = new timelog();
            //DateTime FStartTime = DateTime.Now;//开始时间
            //login.FStartTime = Convert.ToString(FStartTime);

            try
            {
                returnEntity = ConvertBillReturn(ctx, data, FormKey, tableName, tableNameEntry, entryEntityKey, sourceBillTypeId, targetFormId, convertRuleKey, targetEntryOrm, qty, entrtyMemo);
            }
            catch (Exception e)
            {
                returnEntity.Code = "1006";
                returnEntity.IMSsage = e.Message;
            }
            finally
            {
                AddLoge(ctx, "生产用料清单下推生产退料单", "Push_PRD_ReturnMtrl", returnEntity.Code
                    , returnEntity.IMSsage, data.FBILLNO,DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
                    , DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), JsonConvert.SerializeObject(data)
                    , JsonConvert.SerializeObject(returnEntity), ctx.UserName, "ims");
            }

            return returnEntity;
        }
        public CommonReturnEntity ConvertBillReturn(Context ctx, PRD_PickMtrlReturnInfo data, string FormKey, string tableName, string tableNameEntry, string entryEntityKey, string sourceBillTypeId, string targetFormId
            , string convertRuleKey, string targetEntryOrm, string qty, string entrtyMemo)
        {
            CommonReturnEntity returnEntity = new CommonReturnEntity { Code = "0", IMSsage = "成功" };
            #region 数据合法性校验
            if (string.IsNullOrWhiteSpace(data.FSrcId))
                return returnEntity = new CommonReturnEntity { Code = "1006", IMSsage = "源单编号不能为空!" };

            if (data.FDetailEntity == null || data.FDetailEntity.Count == 0)
                return returnEntity = new CommonReturnEntity { Code = "1006", IMSsage = "明细信息不能为空!" };

            int i = 0;
            foreach (var item in data.FDetailEntity)
            {
                i++;
                if (item.FSrcEntryId == null || string.IsNullOrWhiteSpace(item.FSrcEntryId))
                    return returnEntity = new CommonReturnEntity { Code = "1006", IMSsage = string.Format("第{0}行,源单明细内码不能为空!", i) };
            }

            string sql = string.Format(@"/*dialect*/ select t1.FPrdOrgId,t1.FEntrustOrgId,t1.FID,t1.FBILLNO,t2.FSEQ,t2.FENTRYID
                                        from {0} t1 
                                        inner join {1} t2 on t1.FID=t2.FID 
                                        where t1.FBILLNO='{2}'", tableName, tableNameEntry, data.FSrcId);
            var obj = DBUtils.ExecuteDynamicObject(ctx, sql);
            if (obj == null || obj.Count == 0)
                return returnEntity = new CommonReturnEntity { Code = "1006", IMSsage = "未查询到该上游单据编号:" + data.FSrcId + "!" };
            #endregion

            #region 下推
            using (KDTransactionScope trans = new KDTransactionScope(System.Transactions.TransactionScopeOption.Required))
            {
                List<ListSelectedRow> selectedRows = new List<ListSelectedRow>();

                foreach (var rowObj in obj)
                {
                    if (data.FDetailEntity.Select(s => s.FSrcEntryId).ToList().Contains(rowObj["FENTRYID"].ToString()))
                    {
                        int selectedSeq = (int)rowObj["FSEQ"];
                        ListSelectedRow listSelectedRow = new ListSelectedRow(
                            rowObj["FID"].ToString(),
                            rowObj["FENTRYID"].ToString(),
                            selectedSeq,
                            FormKey);
                        listSelectedRow.EntryEntityKey = entryEntityKey;
                        selectedRows.Add(listSelectedRow);
                    }
                }
                //Logger.Info("生产用料清单下推生产退料单", JsonConvert.SerializeObject(selectedRows));

                ConvertOption convertOption = new ConvertOption();

                convertOption.TargetOrgId = Convert.ToInt64(obj[0]["FEntrustOrgId"]) == 0 ? Convert.ToInt64(obj[0]["FPrdOrgId"]) : Convert.ToInt64(obj[0]["FEntrustOrgId"]);       //目标组织ID
                convertOption.sourceFormId = FormKey;       //源单唯一标识
                convertOption.sourceBillTypeId = sourceBillTypeId;
                convertOption.targetFormId = targetFormId;  //目标单标识 
                convertOption.ConvertRuleKey = convertRuleKey;    //单据转换规则标识
                convertOption.IsDraft = true;                  //暂存
                convertOption.IsSave = false;                  //保存
                convertOption.IsAudit = false;                 //审核
                convertOption.Option = OperateOption.Create();
                convertOption.BizSelectRows = selectedRows.ToArray();
                //下推结果
               
                PushResult result_push = GSBAppServiceContext.BillConvertService.ConvertBills(ctx, convertOption);
                IOperationResult results = result_push.result;
                //不成功时返回结果
                if (!results.IsSuccess)
                    return returnEntity = new CommonReturnEntity { Code = "1", IMSsage = Returns(results) };
                //获取下推成功退料单数据包
                DynamicObject[] TargetBillData = result_push.TargetBillData;
                
                foreach (var billItem in TargetBillData)
                {
                    //退料单分录
                    var entrys = billItem["Entity"] as DynamicObjectCollection;
                    //定义一个需要复制行记录列表
                    List<Tuple<int, int>> linkCopyCount = new List<Tuple<int, int>>();
                    int index = 0;
                    foreach (var entryItem in entrys)
                    {
                        DynamicObjectCollection links = entryItem["FEntity_Link"] as DynamicObjectCollection;
                        //从link数据找到上游单据分录id,不考虑合并情况
                        string srcEntryId = Convert.ToString(links[0]["SId"]);
                        var recEntryData = data.FDetailEntity.Where(p => p.FSrcEntryId == srcEntryId).ToList();
                        int needCopyCount = recEntryData.Count - 1;

                        
                        if (recEntryData.Count > 0)
                        {
                            linkCopyCount.Add(new Tuple<int, int>(index, needCopyCount));
                        }
                        index++;
                    }
                    
                    //关联复制数据
                    foreach (var tupleItem in linkCopyCount)
                    {
                        int indexSeq = tupleItem.Item1;
                        DynamicObject needCopyDy = entrys[indexSeq];
                        
                        for (int ii = 0; ii < tupleItem.Item2; ii++)
                        {
                            DynamicObject copyedDy = (DynamicObject)Kingdee.BOS.Orm.OrmUtils.Clone(needCopyDy);
                            copyedDy["seq"] = entrys.Count + 1;
                            entrys.Add(copyedDy);
                        }
                    }
                   
                }
                
                //单据暂存,暂存后才能调用单据视图对数据进行更新
                results = GSBAppServiceContext.BillConvertService.DraftBillData(ctx,targetFormId,TargetBillData);
                //获取单据暂存ID
                long Fsaveid = Convert.ToInt64(results.OperateResult[0].PKValue);
                
                
                OperateOption saveOption = OperateOption.Create();
                saveOption.SetIgnoreWarning(true);
                saveOption.SetIgnoreInteractionFlag(true);
                //创建单据视图
                IBillView billView = FourSDataManagerUtil.CreateBillView(ctx, targetFormId, Fsaveid);
                ((IBillViewService)billView).LoadData();

                DynamicFormViewPlugInProxy eventProxyPush = billView.GetService<DynamicFormViewPlugInProxy>();
                IDynamicFormViewService dynamicFormViewPush = billView as IDynamicFormViewService;
                

                //获取单据视图单据体数据
                DynamicObjectCollection BillDataEntitys = billView.Model.DataObject["Entity"] as DynamicObjectCollection;
                //利用值更新赋值单据编码
                dynamicFormViewPush.UpdateValue("FBILLNO", 0, data.FBILLNO);
                //利用值更新赋值数据来源
                dynamicFormViewPush.UpdateValue("F_BHR_SJLY", 0, "1");


                //单据体更新
                int rowindex = 0;
                foreach (var item in BillDataEntitys)
                {
                    //获取link数据明细
                    DynamicObjectCollection links = item["FEntity_Link"] as DynamicObjectCollection;
                    //从link数据找到上游单据分录id,不考虑合并情况
                    string srcEntryId = Convert.ToString(links[0]["SId"]);
                    //根据关联明细ID 获取传入参数明细行数据
                    var recEntryData = data.FDetailEntity.Where(p => p.FSrcEntryId == srcEntryId && p.IsUsed == false).FirstOrDefault();//.ToList();
                    if (recEntryData == null)
                    {
                        continue;
                    }
                    //更新传入参数明细行使用状态
                    recEntryData.IsUsed = true;
                    //更新明细行字段
                    dynamicFormViewPush.UpdateValue("F_BHR_EntryId", rowindex, recEntryData.FEntryId);
                    if (recEntryData.FMaterialId != null && recEntryData.FMaterialId != "")
                        dynamicFormViewPush.SetItemValueByNumber("FMaterialId", recEntryData.FMaterialId, rowindex);
                    dynamicFormViewPush.UpdateValue("FReturnType", rowindex, recEntryData.FReturnType);
                    if (recEntryData.FStockID != null && recEntryData.FStockID != "")
                        dynamicFormViewPush.SetItemValueByNumber("FStockID", recEntryData.FStockID, rowindex);
                    dynamicFormViewPush.UpdateValue("FAPPQty", rowindex, recEntryData.FQty);
                    //dynamicFormViewPush.UpdateValue(FEntrtyMemo, rowindex, recEntryData.FEntrtyMemo);
                    dynamicFormViewPush.SetItemValueByNumber("FReturnReason", recEntryData.FReturnReason, rowindex);
                    //当退料类型为作业不良退时 不更新未领无效
                    if (recEntryData.FISUPDATEQTY == "1"&&recEntryData.FReturnType!="3")
                        dynamicFormViewPush.UpdateValue("FIsUpdateQty",rowindex,true);

                    rowindex++;
                }
                DynamicObjectCollection BillDataEntitys2 = billView.Model.DataObject["Entity"] as DynamicObjectCollection;
                Logger.Info("dynamicObjects", JsonConvert.SerializeObject(BillDataEntitys2));

                #region 保存提交审核
               // GSBAppServiceContext.BillConvertService.DraftBillData(ctx, targetFormId, new DynamicObject[] { billView.Model.DataObject });

                IOperationResult sResult = FourSDataManagerUtil.SaveBill(ctx, billView, saveOption);
                if (!sResult.IsSuccess)
                {
                    returnEntity.IMSsage = Returns(sResult, "未知原因保存失败");
                    return returnEntity;
                }
                #endregion
                //提交,释放网控
                sResult = AppServiceContext.SubmitService.Submit(ctx, billView.BusinessInfo, new object[] { Fsaveid }, "Submit", saveOption);
                //不成功时返回结果
                if (!sResult.IsSuccess)
                {
                    returnEntity.IMSsage=Returns(sResult, "未知原因提交失败");
                    return returnEntity;
                }
                ClearNetWorkCtrlRS(ctx, targetFormId, Fsaveid);

                var Result = BusinessDataServiceHelper.Audit(ctx, billView.BusinessInfo,new object[] { Fsaveid},saveOption);

                trans.Complete();
            }
            #endregion

            return returnEntity;
        }

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值