电脑桌面
添加蚂蚁七词文库到电脑桌面
安装后可以在桌面快捷访问

隔月补单造成关账报负库存问题的控制方法(二)——代码

来源:金蝶云社区作者:金蝶2024-09-1614

隔月补单造成关账报负库存问题的控制方法(二)——代码

1、服务插件用校验器,主要C#代码如下(所有出库单审核按钮都要配置,本代码是通用代码,各单据都是注册同一个DLL):

 

using System;

using System.Data;

using System.Collections.Generic;

using System.ComponentModel;

using Kingdee.BOS.Core.DynamicForm.PlugIn;

using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;

using Kingdee.BOS.Core;

using Kingdee.BOS.Orm.DataEntity;

using Kingdee.BOS.App.Data;

using Kingdee.BOS.Core.Validation;

using Kingdee.BOS;


namespace WFHH.K3CLOUD.SCM.STK.StockCheckService.Plugin

{

    [Description("隔月入库致出库负库存检查")]

    [Kingdee.BOS.Util.HotUpdate]

    public class StockCheck : AbstractOperationServicePlugIn

    {

        public class OtherMonthValidator : AbstractValidator

        {

            //单据体实体名、数量字段名 各单据不统一,请根据业务实际增加启用的单据数据

            Dictionary<string, string> dcQty = new Dictionary<string, string>()

                {

                    { "其他出库单","BASEQTY"},

                    { "销售出库单","BASEUNITQTY"},

                    { "直接调拨单","BaseQty"},//FSrcStockID,FDestStockID

                    { "其他入库单","BaseQty"}


                };

            Dictionary<string, string> dcEntry = new Dictionary<string, string>()

                {

                    { "其他出库单","BillEntry"},

                    { "销售出库单","SAL_OUTSTOCKENTRY"},                  

                    { "直接调拨单","TransferDirectEntry"},//FSrcStockID,FDestStockID

                    { "其他入库单","BillEntry"}


                };

            public override void InitializeConfiguration(ValidateContext validateContext, Context ctx)

            {

                base.InitializeConfiguration(validateContext, ctx);

                if (validateContext.BusinessInfo != null)

                {

                    EntityKey = validateContext.BusinessInfo.GetEntity(0).Key;

                }

            }

            public override void Validate(ExtendedDataEntity[] dataEntities, ValidateContext validateContext, Context ctx)

            {

                if (validateContext.IgnoreWarning) return; // 警告已经被用户忽略,就不需要再次执行了 

                if (dataEntities == null || dataEntities.Length <= 0) return;

                // 循环校验每一个数据包(一个数据包对应一张单据)

                foreach (ExtendedDataEntity et in dataEntities)

                {

                    bool hasError = false;

                    // 进行数据校验

                    string formName = validateContext.BusinessInfo.GetForm().Name;

                    //对其他出入库单、直接调拨单做特别处理(INT/OUT双向单据都要做)

                    string stockDirect = "";

                    switch (formName)

                    {

                        case "其他出库单":

                            stockDirect = et.DataEntity["StockDirect"].ToString();

                            if (stockDirect.Equals("RETURN")) return;//退货方向入库,无需校验

                            break;

                        case "其他入库单":

                            stockDirect = et.DataEntity["StockDirect"].ToString();

                            if (stockDirect.Equals("GENERAL")) return; //普通方向入库,无需校验

                            break;

                        case "直接调拨单":

                            stockDirect = et.DataEntity["TransferDirect"].ToString();

                            break;

                        //请根据业务实际增加其他有双向出入库单据的库存方向处理

                    }

                    string entryName = dcEntry[formName].ToString();

                    string qtyField = dcQty[formName].ToString();

                    DateTime billDate = Convert.ToDateTime(et.DataEntity["Date"]);

                    DynamicObjectCollection detail = et.DataEntity[entryName] as DynamicObjectCollection;//单据体

                    foreach (DynamicObject d in detail)

                    {

                        int Id = Convert.ToInt32(d["Id"]);

                        double qty = Convert.ToDouble(d[qtyField]);

                        DynamicObject material = d["MaterialId"] as DynamicObject;

                        int materialId = Convert.ToInt32(material["Id"]);

                        DynamicObject stock = null;

                        #region 

                        //请根据业务实际增加其他有调拨出入库单据的出库仓库取值

                        if (formName.Equals("直接调拨单") && stockDirect.Equals("GENERAL"))

                            stock = d["SrcStockID"] as DynamicObject;

                        else if (formName.Equals("直接调拨单") && stockDirect.Equals("RETURN"))

                            stock = d["DestStockID"] as DynamicObject;

                        else stock = d["StockID"] as DynamicObject;

                        #endregion

                        int stockId = Convert.ToInt32(stock["Id"]);

                        int lot = Convert.ToInt32(d["Lot"]);

                        List<SqlParam> sqlParams = new List<SqlParam>();

                        sqlParams.Add(new SqlParam("@date", KDDbType.Date, billDate));

                        sqlParams.Add(new SqlParam("@materialId", KDDbType.Int32, materialId));

                        sqlParams.Add(new SqlParam("@stockId", KDDbType.Int32, stockId));

                        sqlParams.Add(new SqlParam("@lot", KDDbType.Int32, lot));

                        sqlParams.Add(new SqlParam("@qty", KDDbType.Double, qty));

                        sqlParams.Add(new SqlParam("@result", KDDbType.Double, -1) { Direction = ParameterDirection.Output });

                        List<SqlParam> sp = DBUtils.ExecuteStoreProcedure(ctx, "CHR_STOCK_CHECK", sqlParams);

                        if ((double)sp[0].Value < 0) hasError = true;//@result<0   

                        // 如果校验不通过,抛出校验异常

                        if (hasError)

                        {

                            validateContext.AddError(et, new ValidationErrorInfo(

                                                         "", // 出错字段Key,可以空

                                                        Convert.ToString(et.DataEntity[0]), // 数据包内码,必填,后续操作会据此内码避开此数据包

                                                        et.DataEntityIndex, // 出错的数据包在全部数据包中的顺序

                                                        et.RowIndex, // 出错的数据行在全部数据行中的顺序,如果校验基于单据头,此为0

                                                        "OTHER-MONTH-01", // 错误编码,可以任意设定一个字符,主要用于追查错误来源

                                                        "检查到有下月及后续的入库,本月库存不足,无法审核。物料编码=" + material["NUMBER"].ToString() + ",仓库=" + stock["NAME"].ToString(), // 错误的详细提示信息

                                                        "隔月入库检查", // 错误的简明提示信息

                                                        ErrorLevel.Error // 错误级别:警告、错误

                                                    ));

                        }

                    }

                }

            }

        }

        public override void OnAddValidators(AddValidatorsEventArgs e)

        {

            base.OnAddValidators(e);

            // 二、采用校验器模式

            var o

隔月补单造成关账报负库存问题的控制方法(二)——代码

1、服务插件用校验器,主要C#代码如下(所有出库单审核按钮都要配置,本代码是通用代码,各单据都是注册同一个DLL): using System;using...
点击下载文档文档为doc格式

声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。

已经是第一篇
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息
QQ群
  • 答案:my7c点击这里加入QQ群
支持邮箱
微信
  • 微信