锁库,预留,解锁实现

栏目:云星空知识作者:金蝶来源:金蝶云社区发布:2024-09-16浏览:1

锁库,预留,解锁实现

星空的锁库,预留,解锁这一类操作再官方标准里面有过定义,不过都是比较简略的说明。

这里详细记录下这一类的操作,并附上代码,方便以后开发人员直接使用,记得点赞收藏哦~

下面详细记录了一整套锁库解锁流程,可以在上面的基础上进行修改调整

先上代码:


namespace HN_JLDL_PC_Plugin.App.JLDL.K3.BD.App.Service.PlugIn

{

    [System.ComponentModel.Description("接口锁库记录表保存时创建预留锁库")]

    [Kingdee.BOS.Util.HotUpdate]

    public class MesInterfaceLockServiceEX : AbstractOperationServicePlugIn

    {

        /// <summary>

        /// 预加载

        /// </summary>

        /// <param name="e"></param>

        public override void OnPreparePropertys(Kingdee.BOS.Core.DynamicForm.PlugIn.Args.PreparePropertysEventArgs e)

        {

            base.OnPreparePropertys(e);

            //字段标识

            e.FieldKeys.Add("FBillNo");

            e.FieldKeys.Add("FSalesBillNo");

            e.FieldKeys.Add("FSalesSeq");

            e.FieldKeys.Add("FMaterialNo");

            e.FieldKeys.Add("FMaterialName");

            e.FieldKeys.Add("FSalesQty");

            e.FieldKeys.Add("FLot");

            e.FieldKeys.Add("FYLQty");

            e.FieldKeys.Add("FRealQty");

            e.FieldKeys.Add("FCreateDate");

            e.FieldKeys.Add("FModifyDate");

            e.FieldKeys.Add("FIsNow");

           

        }

      

        /// <summary>

        /// 保存前服务插件

        /// </summary>

        /// <param name="e"></param>

        public override void BeginOperationTransaction(BeginOperationTransactionArgs e)

        {

            base.BeginOperationTransaction(e);

            if (this.FormOperation.Operation.EqualsIgnoreCase(OperationNumber.Save)) //保存操作

            {

                try

                {

                    foreach (DynamicObject item in e.DataEntitys)

                    {

                        string FBillNo = "";

                        int FENTRYID = 0;

                        string FMaterialNo = "";

                        string FLOT_TEXT = "";

                        int isNow =  Convert.ToInt32(item["FIsNow"]);


                        decimal FQTY =  Convert.ToDecimal(item["FYLQty"]); 

                        decimal FBASEAVBQTY = 0;

                        decimal FBASEDEMANDQTY = 0;

                        string fresult = "", FMATERIALID = "", FSTOCKID = "", fseq = "";


                        FBillNo = Convert.ToString(item["FSalesBillNo"]);

                        FMaterialNo = Convert.ToString(item["FMaterialNo"]);

                        FLOT_TEXT = Convert.ToString(item["FLot"]);

                        if (item["FSalesSeq"] != null)

                        {

                            FENTRYID = Convert.ToInt32(item["FSalesSeq"]);

                        }

                        else

                        {

                            continue;

                        }

                        string SQL0 = "/*dialect*/" + string.Format(@"SELECT t1.fseq,t1.FMATERIALID,(select top 1 FSTOCKID from T_STK_INVENTORY where FMATERIALID=t1.FMATERIALID and FSTOCKORGID= t1.FSTOCKORGID and FSTOCKSTATUSID=10000 order by FUPDATETIME desc)  FSTOCKID FROM T_SAL_ORDER t

                                    left join T_SAL_ORDERENTRY t1 on t.FID=t1.FID

                                    left join T_BD_MATERIAL as t2 on t2.FMATERIALID=t1.FMATERIALID 

                                    where  t.FBILLNO='{0}' and t1.FENTRYID='{1}' and t2.FNUMBER='{2}' 

                                    " , FBillNo, FENTRYID, FMaterialNo);

                        DynamicObjectCollection DynamData0 = DBUtils.ExecuteDynamicObject(this.Context, SQL0);

                        DynamicObjectCollection DynamData1 = DBUtils.ExecuteDynamicObject(this.Context, SQL0);

                        //判断是否满足可用量,可用量=库存量-预留数量

                        if (DynamData1.Count > 0)

                        {

                            for (int y = 0; y < DynamData1.Count; y++)

                            {

                                FMATERIALID = Convert.ToString(DynamData1[y]["FMATERIALID"]);

                                FSTOCKID = Convert.ToString(DynamData1[y]["FSTOCKID"]);

                                fseq = Convert.ToString(DynamData1[y]["fseq"]);

                                string SQL2 = "/*dialect*/" + string.Format(@" SELECT SUM(q.FBASEAVBQTY) FBASEAVBQTY,q.StockOrgId,q.MaterialId,q.StockId FROM(

                                                            select

                                                            case when (select FBASEDEMANDQTY from T_PLN_RESERVELINK where FSRCINTERID=T.FID)>0 then (T.FBASEQTY-(select FBASEDEMANDQTY from T_PLN_RESERVELINK where FSRCINTERID=T.FID)) else T.FBASEQTY end FBASEAVBQTY,

                                                            T.FSTOCKORGID StockOrgId,

                                                            T.FMATERIALID MaterialId,

                                                            T.FSTOCKID StockId 

                                                            from T_STK_INVENTORY T

                                                            where t.FMATERIALID='" + FMATERIALID + "' and t.FSTOCKID=" + FSTOCKID +

                                                            ") as q  GROUP BY q.StockOrgId,q.MaterialId,q.StockId");

                                DynamicObjectCollection DynamData2 = DBUtils.ExecuteDynamicObject(this.Context, SQL2);

                                if (DynamData2.Count > 0)

                                {

                                    for (int x = 0; x < DynamData2.Count; x++)

                                    {

                                        FBASEAVBQTY = Convert.ToDecimal(DynamData2[x]["FBASEAVBQTY"]);

                                        if (FBASEAVBQTY < FQTY)

                                        {

                                            throw new KDBusinessException("500", "第" + fseq + "行物料可用量不足!,无法生成锁库单。");

                                        }

                                    }

                                }

                            }

                        }

                        if (DynamData0.Count > 0)

                        {

                            for (int i = 0; i < DynamData0.Count; i++)

                            {

                                FMATERIALID = Convert.ToString(DynamData0[i]["FMATERIALID"]);

                                FSTOCKID = Convert.ToString(DynamData0[i]["FSTOCKID"]);

                                List<LockStockArgs> list = new List<LockStockArgs>();

                                string SQL = "";

                                if (isNow==1)

                                {

                                    SQL = "/*dialect*/" + string.Format(@" select

                                        s.FID BillId,

                                        s1.FENTRYID as BillDetailID,

                                        s.FBILLTYPEID as BillTypeID,

                                        s.FBILLNO as BillNo,

                                        s1.FSEQ as BillSEQ,

                                        T.FID InvDetailID,

                                        T.FSTOCKORGID StockOrgId,

                                        T.FMATERIALID MaterialId,

                                        T1.FPLANMODE PlanMode,

                                        T.FBOMID BomId,

                                        T.FAuxPropId AuxPropId,

                                        T.FLOT,

                                        T2.FNUMBER LotNo,

                                        T.FMTONO MtoNo,

                                        T.FPROJECTNO ProjectNo,

                                        T.FPRODUCEDATE ProduceDate,

                                        T.FEXPIRYDATE ExpiryDate,

                                        T.FSTOCKID StockId,

                                        T.FSTOCKLOCID StockLocId,

                                        T.FSTOCKSTATUSID StockStatusId,

                                        T.FOWNERTYPEID OwnerTypeId,

                                        T.FOWNERID OwnerId,

                                        T.FKEEPERTYPEID KeeperTypeId,

                                        T.FKEEPERID KeeperId,

                                        T.FSTOCKUNITID UnitID,

                                        T.FBASEUNITID BaseUnitId,

                                        T.FSECUNITID SecUnitId,

                                        T.FBASEQTY,

                                        case when (select FBASEDEMANDQTY from T_PLN_RESERVELINK where FSRCINTERID=T.FID)>0 then (T.FBASEQTY-(select FBASEDEMANDQTY from T_PLN_RESERVELINK where FSRCINTERID=T.FID)) else T.FBASEQTY end FBASEAVBQTY

                                        from T_STK_INVENTORY T

                                        LEFT JOIN t_BD_MaterialPlan T1 ON T.FMATERIALID=T1.FMATERIALID

                                        LEFT JOIN T_BD_LOTMASTER T2 ON T.FLOT=T2.FLOTID

                                        left join T_SAL_ORDERENTRY as s1 on s1.FMATERIALID=T.FMATERIALID 

                                        left join T_SAL_ORDER s on s.FID= s1.FID

                                        where T.FSTOCKID='" + FSTOCKID + "' AND T.FMATERIALID='" + FMATERIALID + "' and s.FBILLNO='"+ FBillNo + "' and T2.FNUMBER='"+ FLOT_TEXT + "'");

                                    DynamicObjectCollection DynamData = DBUtils.ExecuteDynamicObject(this.Context, SQL);

                                    if (DynamData.Count > 0)

                                    {

                                        foreach (DynamicObject ite in DynamData)

                                        {

                                            FBASEAVBQTY = Convert.ToDecimal(ite["FBASEAVBQTY"]);

                                            if (FQTY <= FBASEAVBQTY)

                                            {

                                                list.Add(GetSubData(ite, FQTY, isNow));

                                                break;

                                            }

                                            if (FQTY > FBASEAVBQTY)

                                            {

                                                list.Add(GetSubData(ite, FBASEAVBQTY, isNow));

                                                FQTY = FQTY - FBASEAVBQTY;

                                            }

                                        }

                                    }

                                    DynamicObjectCollection result = StockServiceHelper.SaveLockInfo(base.Context, list);

                                    if (result.Count > 0)

                                    {

                                        fresult = result[0]["fresult"].ToString();

                                        throw new KDBusinessException("500", fresult);

                                    }

                                    else

                                    {

                                        //锁库成功

                                    }

                                }

                                else

                                {

                                    SQL = "/*dialect*/" + string.Format(@" select

                                        T.FID InvDetailID,

                                        T4.FEntryID,

                                        s1.FENTRYID as BillDetailID,

                                        s.FBILLTYPEID as BillTypeID,

                                        s.FBILLNO as BillNo,

                                        s1.FSEQ as BillSEQ,

                                        T.FLOT,

                                        T2.FNUMBER LotNo,

                                        T3.FBASEDEMANDQTY,

                                        T.FBASEQTY,

                                        case when (select FBASEDEMANDQTY from T_PLN_RESERVELINK where FSRCINTERID=T.FID)>0 then (T.FBASEQTY-(select FBASEDEMANDQTY from T_PLN_RESERVELINK where FSRCINTERID=T.FID)) else T.FBASEQTY end FBASEAVBQTY 

                                        from T_STK_INVENTORY T

                                        LEFT JOIN t_BD_MaterialPlan T1 ON T.FMATERIALID=T1.FMATERIALID

                                        LEFT JOIN T_BD_LOTMASTER T2 ON T.FLOT=T2.FLOTID

                                        left join T_SAL_ORDERENTRY as s1 on s1.FMATERIALID=T.FMATERIALID 

                                        left join T_SAL_ORDER s on s.FID= s1.FID

                                        LEFT JOIN T_PLN_RESERVELINK T3 ON CONVERT(varchar(10),s.FID)= T3.FDEMANDINTERID

                                        LEFT JOIN T_PLN_RESERVELINKENTRY T4 ON T3.FID=T4.FID

                                        where T.FSTOCKID='" + FSTOCKID + "' AND T.FMATERIALID='" + FMATERIALID + "' and s.FBILLNO='" + FBillNo + "'");

                                    DynamicObjectCollection DynamData = DBUtils.ExecuteDynamicObject(this.Context, SQL);

                                    if (DynamData.Count > 0)

                                    {

                                        foreach (DynamicObject ite in DynamData)

                                        {

                                            FBASEAVBQTY = Convert.ToDecimal(ite["FBASEAVBQTY"]);

                                            //FBASEDEMANDQTY = Convert.ToDecimal(ite["FBASEDEMANDQTY"]);

                                            if (FQTY <= FBASEAVBQTY)

                                            {

                                                list.Add(GetSubData(ite, FQTY, isNow));

                                                break;

                                            }

                                            if (FQTY > FBASEAVBQTY)

                                            {

                                                list.Add(GetSubData(ite, FBASEAVBQTY, isNow));

                                                FQTY = FQTY - FBASEDEMANDQTY;

                                            }

                                        }

                                    }

                                    StockServiceHelper.SaveUnLockInfo(base.Context, list);

                                    //if (result.Count > 0)

                                    //{

                                    //    fresult = result[0]["fresult"].ToString();

                                    //    throw new KDBusinessException("500", fresult);

                                    //}

                                }

                            }

                        }

                    }

                }

                catch (Exception ex)

                {

                    throw new KDBusinessException("500", "生成锁库失败:" + ex.Message ) ;


                }

            }

        }


       /// <summary>

       /// 拼接锁库数据

       /// </summary>

       /// <param name="materialObj"></param>

       /// <param name="FQTY"></param>

       /// <returns></returns>

        private LockStockArgs GetSubData(DynamicObject materialObj, decimal FQTY,int isNow)

        {

            LockStockArgs lockStockArgs = new LockStockArgs();

            if (isNow==1)//锁库

            {

                lockStockArgs.ObjectId = "SAL_SaleOrder";//单据对象内码

                lockStockArgs.BillId = Convert.ToString(materialObj["BillId"]);//单据内码

                lockStockArgs.BillDetailID = Convert.ToString(materialObj["BillDetailID"]);//单据明细内码

                lockStockArgs.BillTypeID = Convert.ToString(materialObj["BillTypeID"]);

                lockStockArgs.BillNo = Convert.ToString(materialObj["BillNo"]);

                lockStockArgs.BillSEQ = Convert.ToInt32(materialObj["BillSEQ"]); 

                lockStockArgs.FInvDetailID = Convert.ToString(materialObj["InvDetailID"]);//即时库存明细内码

                lockStockArgs.StockOrgID = Convert.ToInt64(materialObj["StockOrgId"]);//库存组织

                lockStockArgs.DemandOrgId = Convert.ToInt64(materialObj["StockOrgId"]);//需求组织内码

                lockStockArgs.MaterialID = Convert.ToInt64(materialObj["MaterialID"]);//物料内码

                lockStockArgs.DemandMaterialId = Convert.ToInt64(materialObj["MaterialID"]);//需求物料内码

                lockStockArgs.DemandDateTime = DateTime.Now;//需求日期

                lockStockArgs.DemandPriority = "";//需求优先级

                if (materialObj["PlanMode"] != null && Convert.ToString(materialObj["PlanMode"]) == "1")

                {

                    lockStockArgs.IsMto = "1";//是否MTO

                }

                lockStockArgs.BOMID = Convert.ToInt64(materialObj["BomID"]);//BomID

                lockStockArgs.AuxPropId = Convert.ToInt64(materialObj["AuxPropId"]);//辅助属性

                if (materialObj["FLOT"] != null && Convert.ToInt64(materialObj["FLOT"]) > 0)

                {

                    lockStockArgs.Lot = Convert.ToInt64(materialObj["FLOT"]);////批号内码

                    lockStockArgs.LotNo = Convert.ToString(materialObj["LotNo"]);//批号编码

                }

                lockStockArgs.MtoNo = Convert.ToString(materialObj["MtoNo"]);//MTO号

                lockStockArgs.ProjectNo = Convert.ToString(materialObj["ProjectNo"]);//计划跟踪号

                if (materialObj["ProduceDate"] != null)

                {

                    lockStockArgs.ProduceDate = DateTime.Parse(Convert.ToString(materialObj["ProduceDate"]));//生成日期

                }

                if (materialObj["ExpiryDate"] != null)

                {

                    lockStockArgs.ExpiryDate = DateTime.Parse(Convert.ToString(materialObj["ExpiryDate"]));//有效期

                }

                lockStockArgs.STOCKID = Convert.ToInt64(materialObj["StockId"]);//仓库内码

                lockStockArgs.StockLocID = Convert.ToInt64(materialObj["StockLocID"]);//仓位内码

                lockStockArgs.StockStatusID = Convert.ToInt64(materialObj["StockStatusID"]);//仓库状态

                lockStockArgs.OwnerTypeID = Convert.ToString(materialObj["OwnerTypeId"]);//货主类型

                lockStockArgs.OwnerID = Convert.ToInt64(materialObj["OwnerID"]);//货主

                lockStockArgs.KeeperTypeID = Convert.ToString(materialObj["KeeperTypeId"]);//保管者类型

                lockStockArgs.KeeperID = Convert.ToInt64(materialObj["KeeperID"]);//保管者

                lockStockArgs.UnitID = Convert.ToInt64(materialObj["UnitID"]);//库存单位

                lockStockArgs.BaseUnitID = Convert.ToInt64(materialObj["BaseUnitID"]);//基本单位

                lockStockArgs.SecUnitID = Convert.ToInt64(materialObj["SecUnitID"]);//辅助单位

                lockStockArgs.LockQty = FQTY;//锁库数量

                lockStockArgs.LockBaseQty = FQTY;//锁库数量(基本)

                lockStockArgs.LockSecQty = 0;//锁库数量(辅助)

                //object obj2 = materialObj["ReserveDate"];

                //if (obj2 != null && !string.IsNullOrWhiteSpace(obj2.ToString()))

                //{

                lockStockArgs.ReserveDate = DateTime.Now;//锁库日期

                lockStockArgs.BaseQty = Convert.ToDecimal(materialObj["FBASEQTY"]);

                //}

                //lockStockArgs.ReserveDays = Convert.ToInt32(materialObj["ReserveDays"]);//锁库天数

                //obj2 = materialObj["ReleaseDate"];

                //if (obj2 != null && !string.IsNullOrWhiteSpace(obj2.ToString()))

                //{

                // lockStockArgs.ReLeaseDate = DateTime.Parse(obj2.ToString());//预计解锁日期

                //}

                //lockStockArgs.SupplyNote = Convert.ToString(materialObj["SupplyNote"]);//供应备注

                //lockStockArgs.RequestNote = lockStockArgs.SupplyNote;//需求备注




            }

            else//解锁

            {

                lockStockArgs.FInvDetailID = Convert.ToString(materialObj["InvDetailID"]);

                lockStockArgs.FEntryID = Convert.ToInt64(materialObj["FEntryID"]);

                lockStockArgs.BillDetailID = Convert.ToString(materialObj["BillDetailID"]);//单据明细内码

                lockStockArgs.BillTypeID = Convert.ToString(materialObj["BillTypeID"]);

                lockStockArgs.BillNo = Convert.ToString(materialObj["BillNo"]);

                lockStockArgs.BillSEQ = Convert.ToInt32(materialObj["BillSEQ"]);

                if (materialObj["FLOT"] != null && Convert.ToInt64(materialObj["FLOT"]) > 0)

                {

                    lockStockArgs.Lot = Convert.ToInt64(materialObj["FLOT"]);////批号内码

                    lockStockArgs.LotNo = Convert.ToString(materialObj["LotNo"]);//批号编码

                }

                lockStockArgs.LockQty = 0;

                lockStockArgs.UnLockQty = FQTY;

                lockStockArgs.LockBaseQty = 0;

                lockStockArgs.UnLockBaseQty = FQTY;

                lockStockArgs.LockSecQty = 0;

                lockStockArgs.UnLockSecQty = 0;

                //lockStockArgs.ReserveDate = DateTime.Parse(item["ReserveDate"].ToString());

                //lockStockArgs.ReserveDays = Convert.ToInt32(item["ReserveDays"]);

                lockStockArgs.ReLeaseDate = DateTime.Now;

                lockStockArgs.UnLockNote = "";



                //lockStockArgs.FEntryID = Convert.ToInt64(item["Id"]);

                //lockStockArgs.FInvDetailID = item["InvDetailID"].ToString();

                //lockStockArgs.BillDetailID = item["BillDetailID"].ToString();

                //lockStockArgs.BillNo = Convert.ToString(item["BILLNO"]);

                //lockStockArgs.BillSEQ = Convert.ToInt32(item["BILLSEQ"]);

                //lockStockArgs.Lot = Convert.ToInt64(materialObj["FLOT"]);////批号内码

                //lockStockArgs.LotNo = Convert.ToString(materialObj["LotNo"]);//批号编码

                //lockStockArgs.LockQty = lockQty;

                //lockStockArgs.UnLockQty = unLockQty;

                //lockStockArgs.LockBaseQty = Convert.ToDecimal(item["BaseLcokQty"]);

                //lockStockArgs.UnLockBaseQty = num3;

                //lockStockArgs.LockSecQty = Convert.ToDecimal(item["SecLockQty"]);

                //lockStockArgs.UnLockSecQty = num2;

                //if (item["ReserveDate"] != null && !string.IsNullOrWhiteSpace(item["ReserveDate"].ToString()))

                //{

                //    lockStockArgs.ReserveDate = DateTime.Parse(item["ReserveDate"].ToString());

                //}

                //lockStockArgs.ReserveDays = Convert.ToInt32(item["ReserveDays"]);

                //if (item["ReleaseDate"] != null && !string.IsNullOrWhiteSpace(item["ReleaseDate"].ToString()))

                //{

                //    lockStockArgs.ReLeaseDate = DateTime.Parse(item["ReleaseDate"].ToString());

                //}

                //lockStockArgs.UnLockNote = Convert.ToString(item["UnLockNote"]);

                //if (flag)

                //{

                //    warnStockArgList.Add(lockStockArgs);

                //}

                //else

                //{

                //    stockArgList.Add(lockStockArgs);

                //}




            }

            

            return lockStockArgs;

        }


        



        private long GetDynamicValue(DynamicObject obj)

        {

            if (obj == null)

            {

                return 0L;

            }

            if (obj.DynamicObjectType.Properties.ContainsKey(FormConst.MASTER_ID))

            {

                return Convert.ToInt64(obj[FormConst.MASTER_ID]);

            }

            if (obj.DynamicObjectType.Properties.ContainsKey("Id"))

            {

                return Convert.ToInt64(obj["Id"]);

            }

            return 0L;

        }

   

    }

}



这个不对把... 库存的物料和单据的物料进行关联,, 全是重复的



老师好!用你的这个方法成功预留之后,预留查询查不到信息,并且下游出库单审核之后,无法自动清除预留,怎么解决这个问题??


谢谢刘老师的分享

锁库,预留,解锁实现

星空的锁库,预留,解锁这一类操作再官方标准里面有过定义,不过都是比较简略的说明。这里详细记录下这一类的操作,并附上代码,方便以后开...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息