Ejemplo n.º 1
0
        /// <summary>
        /// 完成
        /// </summary>
        /// <param name="rowsKeyValues"></param>
        /// <param name="loginUser"></param>
        /// <returns></returns>
        public bool CompleteInfos(List <string> rowsKeyValues, string loginUser)
        {
            ///入库单必须为已发布状态⑫才可以进行完成操作
            ///根据单据中物料需求数量进行物料入库,并标记状态⑫为50.已完成
            List <VmiReceiveInfo> vmiReceiveInfos = dal.GetList("[ID] in (" + string.Join(",", rowsKeyValues.ToArray()) + ")", "[ID]");

            if (vmiReceiveInfos.Count == 0)
            {
                throw new Exception("MC:0x00000084");///数据错误
            }
            List <VmiReceiveDetailInfo> vmiReceiveDetailInfos = new VmiReceiveDetailDAL().GetList("[RECEIVE_FID] in ('" + string.Join("','", vmiReceiveInfos.Select(d => d.Fid.GetValueOrDefault()).ToArray()) + "')", "[ID]");

            if (vmiReceiveDetailInfos.Count == 0)
            {
                throw new Exception("MC:0x00000367");///入库单没有明细
            }
            ///获取系统配置
            Dictionary <string, string> configs = new ConfigDAL().GetValuesByCodes(new string[] {
                "CLIENT_SCANED_BARCODE_UPDATE_BARCODE_STATUS_FLAG",
                "COMPLETE_VMI_RECEIVE_ACTUAL_QTY_EQUALS_REQUIRED_WHEN_NULL"
            });

            ///完成VMI入库单时实收数量为空则等于需求数量
            configs.TryGetValue("COMPLETE_VMI_RECEIVE_ACTUAL_QTY_EQUALS_REQUIRED_WHEN_NULL", out string complete_vmi_receive_actual_qty_equals_required_when_null);
            if (!string.IsNullOrEmpty(complete_vmi_receive_actual_qty_equals_required_when_null) && complete_vmi_receive_actual_qty_equals_required_when_null.ToLower() == "true")
            {
                foreach (var vmiReceiveDetailInfo in vmiReceiveDetailInfos)
                {
                    if (vmiReceiveDetailInfo.ActualBoxNum == null)
                    {
                        vmiReceiveDetailInfo.ActualBoxNum = vmiReceiveDetailInfo.RequiredBoxNum;
                    }
                    if (vmiReceiveDetailInfo.ActualQty == null)
                    {
                        vmiReceiveDetailInfo.ActualQty = vmiReceiveDetailInfo.RequiredQty;
                    }
                }
            }
            ///
            List <BarcodeInfo> barcodeInfos = new List <BarcodeInfo>();

            ///是否在客户端扫描标签条码后更新状态为已扫描
            configs.TryGetValue("CLIENT_SCANED_BARCODE_UPDATE_BARCODE_STATUS_FLAG", out string client_scaned_barcode_update_barcode_status_flag);
            if (!string.IsNullOrEmpty(client_scaned_barcode_update_barcode_status_flag) && client_scaned_barcode_update_barcode_status_flag.ToLower() == "true")
            {
                ///获取已扫描的标签
                barcodeInfos = new BarcodeDAL().GetList("[ASN_RUNSHEET_NO] in ('" + string.Join("','", vmiReceiveInfos.Select(d => d.ReceiveNo).ToArray()) + "') and [BARCODE_STATUS] = " + (int)BarcodeStatusConstants.Scaned + "", string.Empty);
            }
            ///
            StringBuilder @string = new StringBuilder();

            foreach (var vmiReceiveInfo in vmiReceiveInfos)
            {
                if (vmiReceiveInfo.Status.GetValueOrDefault() != (int)WmmOrderStatusConstants.Published)
                {
                    throw new Exception("MC:0x00000148");///已提交的入库单才能进行确认操作
                }
                List <VmiReceiveDetailInfo> detailInfos = vmiReceiveDetailInfos.Where(d => d.ReceiveFid.GetValueOrDefault() == vmiReceiveInfo.Fid.GetValueOrDefault()).ToList();
                if (detailInfos.Count == 0)
                {
                    throw new Exception("MC:0x00000084");///数据错误
                }
                ///获取已扫描的标签
                List <BarcodeInfo> barcodes = barcodeInfos.Where(d => d.AsnRunsheetNo == vmiReceiveInfo.ReceiveNo).ToList();
                ///拼接多张入库单
                @string.AppendLine(GetReceiveCompleteDealSql(vmiReceiveInfo, detailInfos, barcodes, loginUser));
            }
            using (TransactionScope trans = new TransactionScope())
            {
                if (@string.Length > 0)
                {
                    CommonDAL.ExecuteNonQueryBySql(@string.ToString());
                }
                trans.Complete();
            }
            return(true);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 供应商发货单同步
        /// </summary>
        /// <param name="loginUser"></param>
        /// <returns></returns>
        public static void Sync(string loginUser)
        {
            ///获取没有处理的物料发货单表
            List <SrmVmiShippingNoteInfo> srmVmiShippingNoteInfos = new SrmVmiShippingNoteBLL().GetList("[PROCESS_FLAG] = " + (int)ProcessFlagConstants.Untreated + "", "[ID]");

            if (srmVmiShippingNoteInfos.Count == 0)
            {
                return;
            }
            ///获取没有处理的物料发货单详情表
            List <SrmVmiShippingNoteDetailInfo> srmVmiShippingNoteDetailInfos = new SrmVmiShippingNoteDetailBLL().GetList("[NOTE_FID] in ('" + string.Join("','", srmVmiShippingNoteInfos.Select(d => d.LogFid).ToArray()) + "')", "[ID]");

            if (srmVmiShippingNoteDetailInfos.Count == 0)
            {
                return;
            }
            StringBuilder @string = new StringBuilder();
            ///获取相关仓库信息
            List <WarehouseInfo> warehouseInfos = new WarehouseBLL().GetList("[WAREHOUSE] in ('" + string.Join("','", srmVmiShippingNoteInfos.Select(d => d.VmiWmNo).ToArray()) + "')", string.Empty);

            if (warehouseInfos.Count == 0)
            {
                @string.AppendLine("update [LES].[TI_IFM_SRM_VMI_SHIPPING_NOTE] set " +
                                   "[PROCESS_FLAG] = " + (int)ProcessFlagConstants.Suspend + "," +
                                   "[PROCESS_TIME] = GETDATE()," +
                                   "[COMMENTS] = N'0x00000230' where " +///仓库信息不存在
                                   "[ID] in (" + string.Join("','", srmVmiShippingNoteInfos.Select(d => d.Id).ToArray()) + ");");
                BLL.SYS.CommonBLL.ExecuteNonQueryBySql(@string.ToString());
                return;
            }
            ///获取相关供应商基础信息
            List <SupplierInfo> supplierInfos = new SupplierBLL().GetList("[SUPPLIER_NUM] in ('" + string.Join("','", srmVmiShippingNoteInfos.Select(d => d.SupplierCode).ToArray()) + "')", string.Empty);

            if (supplierInfos.Count == 0)
            {
                @string.AppendLine("update [LES].[TI_IFM_SRM_VMI_SHIPPING_NOTE] set " +
                                   "[PROCESS_FLAG] = " + (int)ProcessFlagConstants.Suspend + "," +
                                   "[PROCESS_TIME] = GETDATE()," +
                                   "[COMMENTS] = N'0x00000229' where " +///供应商信息不存在
                                   "[ID] in (" + string.Join("','", srmVmiShippingNoteInfos.Select(d => d.Id).ToArray()) + ");");
                BLL.SYS.CommonBLL.ExecuteNonQueryBySql(@string.ToString());
                return;
            }
            ///获取VMI供应商关系
            List <VmiSupplierInfo> vmiSupplierInfos = new VmiSupplierBLL().GetList("" +
                                                                                   "[SUPPLIER_NUM] in ('" + string.Join("','", srmVmiShippingNoteInfos.Select(d => d.SupplierCode).ToArray()) + "') and " +
                                                                                   "[WM_NO] in ('" + string.Join("','", srmVmiShippingNoteInfos.Select(d => d.VmiWmNo).ToArray()) + "')", string.Empty);

            if (vmiSupplierInfos.Count == 0)
            {
                @string.AppendLine("update [LES].[TI_IFM_SRM_VMI_SHIPPING_NOTE] set " +
                                   "[PROCESS_FLAG] = " + (int)ProcessFlagConstants.Suspend + "," +
                                   "[PROCESS_TIME] = GETDATE()," +
                                   "[COMMENTS] = N'0x00000429' where " +///VMI供应商信息未维护
                                   "[ID] in (" + string.Join("','", srmVmiShippingNoteInfos.Select(d => d.Id).ToArray()) + ");");
                BLL.SYS.CommonBLL.ExecuteNonQueryBySql(@string.ToString());
                return;
            }
            ///获取相关物料基础信息
            List <MaintainPartsInfo> maintainPartsInfos = new MaintainPartsBLL().GetList("" +
                                                                                         "[PART_NO] in ('" + string.Join("','", srmVmiShippingNoteDetailInfos.Select(d => d.Partno).ToArray()) + "')", string.Empty);
            ///获取相关物料仓储信息
            List <PartsStockInfo> partsStockInfos = new PartsStockBLL().GetList("" +
                                                                                "[PART_NO] in ('" + string.Join("','", srmVmiShippingNoteDetailInfos.Select(d => d.Partno).ToArray()) + "') and " +
                                                                                "[WM_NO] in ('" + string.Join("','", warehouseInfos.Select(d => d.Warehouse).ToArray()) + "')", string.Empty);
            ///获取相关包装器具基础信息
            List <PackageApplianceInfo> packageApplianceInfos = new List <PackageApplianceInfo>();

            if (partsStockInfos.Count > 0)
            {
                ///标准包装
                List <string> packageModels = partsStockInfos.
                                              Where(d => !string.IsNullOrEmpty(d.PackageModel)).
                                              Select(d => d.PackageModel).ToList();
                ///入库包装
                packageModels.AddRange(partsStockInfos.
                                       Where(d => !string.IsNullOrEmpty(d.InboundPackageModel) && !packageModels.Contains(d.InboundPackageModel)).
                                       Select(d => d.InboundPackageModel).ToList());
                ///上线包装
                packageModels.AddRange(partsStockInfos.
                                       Where(d => !string.IsNullOrEmpty(d.InhousePackageModel) && !packageModels.Contains(d.InhousePackageModel)).
                                       Select(d => d.InhousePackageModel).ToList());
                ///
                packageApplianceInfos = new PackageApplianceBLL().GetList("[PAKCAGE_NO] in ('" + string.Join("','", packageModels.ToArray()) + "')", string.Empty);
            }

            ///获取系统配置
            Dictionary <string, string> configs = new ConfigBLL().GetValuesByCodes(new string[] {
                "RELEASE_VMI_RECEIVE_ACTUAL_QTY_EQUALS_REQUIRED",
                "ENABLE_VMI_FLAG"
            });
            ///
            List <long> dealedIds = new List <long>();

            ///如果数据不为空,按照规则分发
            foreach (SrmVmiShippingNoteInfo srmVmiShippingNoteInfo in srmVmiShippingNoteInfos)
            {
                ///本单据的对应仓库
                WarehouseInfo warehouseInfo = warehouseInfos.FirstOrDefault(d => d.Warehouse == srmVmiShippingNoteInfo.VmiWmNo);
                ///如果未处理的物料发货单中仓库码不存在, 修改中间表数据为挂起状态
                if (warehouseInfo == null)
                {
                    @string.AppendLine("update [LES].[TI_IFM_SRM_VMI_SHIPPING_NOTE] set " +
                                       "[PROCESS_FLAG] = " + (int)ProcessFlagConstants.Suspend + "," +
                                       "[PROCESS_TIME] = GETDATE()," +
                                       "[COMMENTS] = N'0x00000230' where " +///仓库信息不存在
                                       "[ID] = " + srmVmiShippingNoteInfo.Id + ";");
                    continue;
                }
                ///仓库类型不是VMI
                if (warehouseInfo.WarehouseType.GetValueOrDefault() != (int)WarehouseTypeConstants.VMI)
                {
                    @string.AppendLine("update [LES].[TI_IFM_SRM_VMI_SHIPPING_NOTE] set " +
                                       "[PROCESS_FLAG] = " + (int)ProcessFlagConstants.Suspend + "," +
                                       "[PROCESS_TIME] = GETDATE()," +
                                       "[COMMENTS] = N'0x00000219' where " +///仓库类型错误
                                       "[ID] = " + srmVmiShippingNoteInfo.Id + ";");
                    continue;
                }
                ///本发货单的物料明细
                List <SrmVmiShippingNoteDetailInfo> srmVmiShippingNoteDetails = srmVmiShippingNoteDetailInfos.Where(d =>
                                                                                                                    d.NoteFid.GetValueOrDefault() == srmVmiShippingNoteInfo.Fid).ToList();
                if (srmVmiShippingNoteDetails.Count == 0)
                {
                    @string.AppendLine("update [LES].[TI_IFM_SRM_VMI_SHIPPING_NOTE] set " +
                                       "[PROCESS_FLAG] = " + (int)ProcessFlagConstants.Suspend + "," +
                                       "[PROCESS_TIME] = GETDATE()," +
                                       "[COMMENTS] = N'0x00000465' where " +///发货单物料数据错误
                                       "[ID] = " + srmVmiShippingNoteInfo.Id + ";");
                    continue;
                }
                ///供应商
                SupplierInfo supplierInfo = supplierInfos.FirstOrDefault(d => d.SupplierNum == srmVmiShippingNoteInfo.SupplierCode);
                if (supplierInfo == null)
                {
                    @string.AppendLine("update [LES].[TI_IFM_SRM_VMI_SHIPPING_NOTE] set " +
                                       "[PROCESS_FLAG] = " + (int)ProcessFlagConstants.Suspend + "," +
                                       "[PROCESS_TIME] = GETDATE()," +
                                       "[COMMENTS] = N'0x00000229' where " +///供应商信息不存在
                                       "[ID] = " + srmVmiShippingNoteInfo.Id + ";");
                    continue;
                }
                ///VMI供应商关系
                VmiSupplierInfo vmiSupplierInfo = vmiSupplierInfos.FirstOrDefault(d => d.SupplierNum == supplierInfo.SupplierNum && d.WmNo == warehouseInfo.Warehouse);
                if (vmiSupplierInfo == null)
                {
                    @string.AppendLine("update [LES].[TI_IFM_SRM_VMI_SHIPPING_NOTE] set " +
                                       "[PROCESS_FLAG] = " + (int)ProcessFlagConstants.Suspend + "," +
                                       "[PROCESS_TIME] = GETDATE()," +
                                       "[COMMENTS] = N'0x00000429' where " +///VMI供应商信息未维护
                                       "[ID] = " + srmVmiShippingNoteInfo.Id + ";");
                    continue;
                }

                ///如果该仓库启用的是VMI模块则需要将单据写入VMI入库单
                if (warehouseInfo.VmiEnable.GetValueOrDefault())
                {
                    ///发布VMI入库单时实收数量默认等于需求数量
                    configs.TryGetValue("RELEASE_VMI_RECEIVE_ACTUAL_QTY_EQUALS_REQUIRED", out string release_vmi_receive_actual_qty_equals_required);
                    ///创建VMI入库单,TODO:默认类型与状态
                    VmiReceiveInfo vmiReceiveInfo = VmiReceiveBLL.CreateVmiReceiveInfo(
                        loginUser,
                        (int)VmiReceiveTypeConstants.ProductionWarehousing,
                        (int)WmmOrderStatusConstants.Published);
                    ///SrmVmiShippingNoteInfo -> VmiReceiveInfo
                    VmiReceiveBLL.GetVmiReceiveInfo(srmVmiShippingNoteInfo, ref vmiReceiveInfo);
                    ///SupplierInfo -> VmiReceiveInfo
                    VmiReceiveBLL.GetVmiReceiveInfo(supplierInfo, ref vmiReceiveInfo);
                    ///VmiSupplierInfo -> VmiReceiveInfo
                    VmiReceiveBLL.GetVmiReceiveInfo(vmiSupplierInfo, ref vmiReceiveInfo);
                    ///生成入库单语句
                    @string.AppendLine(VmiReceiveDAL.GetInsertSql(vmiReceiveInfo));
                    ///
                    foreach (SrmVmiShippingNoteDetailInfo srmVmiShippingNoteDetail in srmVmiShippingNoteDetails)
                    {
                        ///创建VMI入库单明细
                        VmiReceiveDetailInfo vmiReceiveDetailInfo = VmiReceiveDetailBLL.CreateVmiReceiveDetailInfo(loginUser);
                        ///VmiReceiveInfo -> VmiReceiveDetailInfo
                        VmiReceiveDetailBLL.GetVmiReceiveDetailInfo(vmiReceiveInfo, ref vmiReceiveDetailInfo);
                        ///MaintainPartsInfo -> VmiReceiveDetailInfo
                        MaintainPartsInfo maintainPartsInfo = maintainPartsInfos.FirstOrDefault(d => d.PartNo == srmVmiShippingNoteDetail.Partno);
                        VmiReceiveDetailBLL.GetVmiReceiveDetailInfo(maintainPartsInfo, ref vmiReceiveDetailInfo);
                        ///PartsStockInfo -> VmiReceiveDetailInfo
                        PartsStockInfo partsStockInfo = partsStockInfos.FirstOrDefault(d => d.PartNo == srmVmiShippingNoteDetail.Partno && d.WmNo == warehouseInfo.Warehouse);
                        VmiReceiveDetailBLL.GetVmiReceiveDetailInfo(partsStockInfo, ref vmiReceiveDetailInfo);
                        ///PackageApplianceInfo -> VmiReceiveDetailInfo
                        PackageApplianceInfo packageApplianceInfo = partsStockInfo == null ? null : packageApplianceInfos.FirstOrDefault(d => d.PackageNo == partsStockInfo.InboundPackageModel);
                        VmiReceiveDetailBLL.GetVmiReceiveDetailInfo(packageApplianceInfo, ref vmiReceiveDetailInfo);
                        ///SrmVmiShippingNoteDetailInfo -> VmiReceiveDetailInfo
                        VmiReceiveDetailBLL.GetVmiReceiveDetailInfo(srmVmiShippingNoteDetail, ref vmiReceiveDetailInfo);
                        ///发布VMI入库单时实收数量默认等于需求数量
                        if (!string.IsNullOrEmpty(release_vmi_receive_actual_qty_equals_required) && release_vmi_receive_actual_qty_equals_required.ToLower() == "true")
                        {
                            ///ACTUAL_BOX_NUM
                            vmiReceiveDetailInfo.ActualBoxNum = vmiReceiveDetailInfo.RequiredBoxNum;
                            ///ACTUAL_QTY
                            vmiReceiveDetailInfo.ActualQty = vmiReceiveDetailInfo.RequiredQty;
                        }
                        ///生成入库单明细语句
                        @string.AppendLine(VmiReceiveDetailDAL.GetInsertSql(vmiReceiveDetailInfo));
                    }
                    dealedIds.Add(srmVmiShippingNoteInfo.Id);
                }
                ///如果未启用VMI模块,则根据WMS系统开关决定是否写入中间表
                else
                {
                    ///是否启用WMS系统标记
                    configs.TryGetValue("ENABLE_VMI_FLAG", out string enable_vmi_flag);
                    if (!string.IsNullOrEmpty(enable_vmi_flag) && enable_vmi_flag.ToLower() == "true" && vmiSupplierInfo.VmiFlag.GetValueOrDefault())
                    {
                        ///创建WMS入库单
                        WmsVmiInboundOrderInfo wmsVmiInboundOrderInfo = WmsVmiInboundOrderBLL.CreateWmsVmiInboundOrderInfo((int)ProcessFlagConstants.Untreated, loginUser);
                        ///SrmVmiShippingNoteInfo -> WmsVmiInboundOrderInfo
                        WmsVmiInboundOrderBLL.GetWmsVmiInboundOrderInfo(srmVmiShippingNoteInfo, ref wmsVmiInboundOrderInfo);
                        ///生成入库单语句
                        @string.AppendLine(WmsVmiInboundOrderDAL.GetInsertSql(wmsVmiInboundOrderInfo));
                        ///
                        foreach (SrmVmiShippingNoteDetailInfo srmVmiShippingNoteDetail in srmVmiShippingNoteDetails)
                        {
                            ///创建WMS入库单明细
                            WmsVmiInboundOrderDetailInfo wmsVmiInboundOrderDetailInfo = WmsVmiInboundOrderDetailBLL.CreateWmsVmiInboundOrderDetailInfo(loginUser);
                            ///WmsVmiInboundOrderInfo -> WmsVmiInboundOrderDetailInfo
                            WmsVmiInboundOrderDetailBLL.GetWmsVmiInboundOrderDetailInfo(wmsVmiInboundOrderInfo, ref wmsVmiInboundOrderDetailInfo);
                            ///
                            PartsStockInfo partsStockInfo = partsStockInfos.FirstOrDefault(d => d.PartNo == srmVmiShippingNoteDetail.Partno && d.WmNo == warehouseInfo.Warehouse);
                            WmsVmiInboundOrderDetailBLL.GetWmsVmiInboundOrderDetailInfo(partsStockInfo, ref wmsVmiInboundOrderDetailInfo);
                            ///SrmVmiShippingNoteDetailInfo -> WmsVmiInboundOrderDetailInfo
                            WmsVmiInboundOrderDetailBLL.GetWmsVmiInboundOrderDetailInfo(srmVmiShippingNoteDetail, ref wmsVmiInboundOrderDetailInfo);
                            ///生成WMS入库单明细语句
                            @string.AppendLine(WmsVmiInboundOrderDetailDAL.GetInsertSql(wmsVmiInboundOrderDetailInfo));
                        }
                        ///
                        string targetSystem = "VMI";
                        string methodCode   = "LES-WMS-001";
                        @string.AppendLine(BLL.LES.CommonBLL.GetCreateOutboundLogSql(
                                               targetSystem,
                                               wmsVmiInboundOrderInfo.LogFid.GetValueOrDefault(),
                                               methodCode,
                                               srmVmiShippingNoteInfo.ShippingCode,
                                               loginUser));
                        dealedIds.Add(srmVmiShippingNoteInfo.Id);
                        continue;
                    }
                    @string.AppendLine("update [LES].[TI_IFM_SRM_VMI_SHIPPING_NOTE] set " +
                                       "[PROCESS_FLAG] = " + (int)ProcessFlagConstants.Suspend + "," +
                                       "[PROCESS_TIME] = GETDATE()," +
                                       "[COMMENTS] = N'0x00000466' where " +///该供应商未启用WMS功能
                                       "[ID] = " + srmVmiShippingNoteInfo.Id + ";");
                    continue;
                }
            }
            if (dealedIds.Count > 0)
            {
                ///已处理的中间表数据更新为已处理状态
                @string.AppendLine("update [LES].[TI_IFM_SRM_VMI_SHIPPING_NOTE] set " +
                                   "[PROCESS_FLAG] = " + (int)ProcessFlagConstants.Processed + "," +
                                   "[PROCESS_TIME] = GETDATE() where " +
                                   "[ID] in (" + string.Join(",", dealedIds.ToArray()) + ");");
            }
            ///执行
            using (var trans = new TransactionScope())
            {
                if (@string.Length > 0)
                {
                    BLL.SYS.CommonBLL.ExecuteNonQueryBySql(@string.ToString());
                }
                trans.Complete();
            }
        }
Ejemplo n.º 3
0
        /// <summary>
        /// 发布(提交)
        /// </summary>
        /// <param name="id"></param>
        /// <param name="loginUser"></param>
        /// <returns></returns>
        public bool ReleaseInfos(List <string> rowsKeyValues, string loginUser)
        {
            ///入库单
            List <VmiReceiveInfo> vmiReceiveInfos = dal.GetList("[ID] in (" + string.Join(",", rowsKeyValues.ToArray()) + ")", "[ID]");

            if (vmiReceiveInfos.Count == 0)
            {
                throw new Exception("MC:0x00000084");///数据错误
            }
            ///入库单明细
            List <VmiReceiveDetailInfo> vmiReceiveDetailInfos = new VmiReceiveDetailDAL().GetList("[RECEIVE_FID] in ('" + string.Join("','", vmiReceiveInfos.Select(d => d.Fid.GetValueOrDefault()).ToArray()) + "')", "[ID]");

            if (vmiReceiveDetailInfos.Count == 0)
            {
                throw new Exception("MC:0x00000367");///入库单没有明细
            }
            ///获取系统配置
            Dictionary <string, string> configs = new ConfigDAL().GetValuesByCodes(new string[] {
                "RELEASE_VMI_RECEIVE_ACTUAL_QTY_EQUALS_REQUIRED",
                "MANUAL_VMI_RECEIVE_ORDER_RELEASE_CREATE_BARCODE",
                "RELEASE_VMI_RECEIVE_LOAD_PART_INSPECTION_MODE"
            });
            ///已生成的标签
            List <BarcodeInfo> barcodeInfos = new BarcodeDAL().GetList("" +
                                                                       "[BARCODE_STATUS] = " + (int)BarcodeStatusConstants.Created + " and " +
                                                                       "[CREATE_SOURCE_FID] in ('" + string.Join("','", vmiReceiveDetailInfos.Select(d => d.Fid.GetValueOrDefault()).ToArray()) + "')", string.Empty);

            ///执行语句
            StringBuilder @string = new StringBuilder();

            foreach (var vmiReceiveInfo in vmiReceiveInfos)
            {
                ///一般手工创建入库单会用到此功能,入库单必须为10.已创建状态⑫
                if (vmiReceiveInfo.Status.GetValueOrDefault() != (int)WmmOrderStatusConstants.Created)
                {
                    throw new Exception("MC:0x00000683");///状态必须为已创建
                }
                ///VMI入库单明细
                List <VmiReceiveDetailInfo> vmiReceiveDetails = vmiReceiveDetailInfos.Where(d => d.ReceiveFid.GetValueOrDefault() == vmiReceiveInfo.Fid.GetValueOrDefault()).ToList();
                ///VMI入库单对应的标签数据
                List <BarcodeInfo> barcodes = barcodeInfos.Where(d => vmiReceiveDetails.Select(f => f.Fid.GetValueOrDefault()).Contains(d.CreateSourceFid.GetValueOrDefault())).ToList();
                ///将VMI入库单明细对象转换为普通入库单对象,方便后续函数处理
                List <ReceiveDetailInfo> receiveDetailInfos = ReceiveDetailBLL.GetReceiveDetailInfos(vmiReceiveDetails);
                ///手工创建VMI入库单时创建条码标签
                configs.TryGetValue("MANUAL_VMI_RECEIVE_ORDER_RELEASE_CREATE_BARCODE", out string manual_vmi_receive_order_release_create_barcode);
                if (!string.IsNullOrEmpty(manual_vmi_receive_order_release_create_barcode) && manual_vmi_receive_order_release_create_barcode.ToLower() == "true")
                {
                    @string.AppendLine(MaterialPullingCommonBLL.GetCreateBarcodesSql(receiveDetailInfos, barcodes, loginUser));
                }
                ///
                ReceiveInfo receiveInfo = ReceiveBLL.CreateReceiveInfo(loginUser);
                ///VmiReceiveInfo -> ReceiveInfo
                ReceiveBLL.GetReceiveInfo(vmiReceiveInfo, ref receiveInfo);
                ///VMI入库单发布时是否加载物料检验模式,TODO:此处函数内有与入库单共用的系统配置
                configs.TryGetValue("RELEASE_VMI_RECEIVE_LOAD_PART_INSPECTION_MODE", out string release_vmi_receive_load_part_inspection_mode);
                if (!string.IsNullOrEmpty(release_vmi_receive_load_part_inspection_mode) && release_vmi_receive_load_part_inspection_mode.ToLower() == "true")
                {
                    @string.AppendLine(PartInspectionModeBLL.LoadInspectionMode(ref receiveInfo, ref receiveDetailInfos, loginUser));
                }
                ///行号更新
                int rowNo = 0;
                ///发布VMI入库单时实收数量默认等于需求数量
                configs.TryGetValue("RELEASE_VMI_RECEIVE_ACTUAL_QTY_EQUALS_REQUIRED", out string release_vmi_receive_actual_qty_equals_required);
                foreach (var receiveDetailInfo in receiveDetailInfos)
                {
                    if (!string.IsNullOrEmpty(release_vmi_receive_actual_qty_equals_required) && release_vmi_receive_actual_qty_equals_required.ToLower() == "true")
                    {
                        if (receiveDetailInfo.ActualBoxNum == null)
                        {
                            receiveDetailInfo.ActualBoxNum = receiveDetailInfo.RequiredBoxNum;
                        }
                        if (receiveDetailInfo.ActualQty == null)
                        {
                            receiveDetailInfo.ActualQty = receiveDetailInfo.RequiredQty;
                        }
                    }
                    ///更新入库单明细需要注意不能覆盖明细中原内容
                    @string.AppendLine("update [LES].[TT_WMM_VMI_RECEIVE_DETAIL] set " +
                                       "[ROW_NO] = " + ++rowNo + "," +
                                       (receiveDetailInfo.ActualBoxNum == null ? string.Empty : "[ACTUAL_BOX_NUM] = " + receiveDetailInfo.ActualBoxNum.GetValueOrDefault() + ",") +
                                       (receiveDetailInfo.ActualQty == null ? string.Empty : "[ACTUAL_QTY] = " + receiveDetailInfo.ActualQty.GetValueOrDefault() + ",") +
                                       (receiveDetailInfo.InspectionMode == null ? string.Empty : "[INSPECTION_MODE] = " + receiveDetailInfo.InspectionMode.GetValueOrDefault() + ",") +
                                       (string.IsNullOrEmpty(receiveDetailInfo.SupplierNum) ? "[SUPPLIER_NUM] = N'" + receiveInfo.SupplierNum + "'," : string.Empty) +
                                       "[WM_NO] = N'" + receiveInfo.WmNo + "'," +
                                       "[ZONE_NO] = N'" + receiveInfo.ZoneName + "'," +
                                       "[TARGET_WM] = N'" + receiveInfo.WmNo + "'," +
                                       "[TARGET_ZONE] = N'" + receiveInfo.ZoneNo + "'," +
                                       (string.IsNullOrEmpty(receiveDetailInfo.RunsheetNo) ? "[RUNSHEET_NO] = N'" + receiveInfo.RunsheetNo + "'," : string.Empty) +
                                       "[MODIFY_DATE] = GETDATE()," +
                                       "[MODIFY_USER] = N'" + loginUser + "' where " +
                                       "[ID] = " + receiveDetailInfo.Id + ";");
                }
                ///更新入库单
                @string.AppendLine("update [LES].[TT_WMM_VMI_RECEIVE] set " +
                                   "[SUM_PART_QTY] = " + vmiReceiveDetails.Sum(d => d.RequiredQty.GetValueOrDefault()) + "," +
                                   "[SUM_OF_PRICE] = " + vmiReceiveDetails.Sum(d => d.PartPrice.GetValueOrDefault()) + "," +
                                   "[SUM_WEIGHT] = " + vmiReceiveDetails.Sum(d => d.SumWeight.GetValueOrDefault()) + "," +
                                   "[SUM_VOLUME] = " + vmiReceiveDetails.Sum(d => d.SumVolume.GetValueOrDefault()) + "," +
                                   "[SUM_PACKAGE_QTY] = " + vmiReceiveDetails.Sum(d => d.RequiredBoxNum.GetValueOrDefault()) + "," +
                                   //"[INSPECTION_FLAG] = " + (receiveInfo.InspectionFlag.GetValueOrDefault() ? 1 : 0) + "," +
                                   "[STATUS] = " + (int)WmmOrderStatusConstants.Published + "," +
                                   "[MODIFY_USER] = N'" + loginUser + "' ," +
                                   "[MODIFY_DATE] = GETDATE() where " +
                                   "[ID] = " + vmiReceiveInfo.Id + ";");
            }
            ///删除已删除VMI入库单明细的标签
            @string.AppendLine("update [LES].[TT_WMM_BARCODE] " +
                               "set [VALID_FLAG] = 0 " +
                               "where [CREATE_SOURCE_FID] in (select [FID] from [LES].[TT_WMM_VMI_RECEIVE_DETAIL] with(nolock) " +
                               "where [VALID_FLAG] = 0 and [RECEIVE_FID] in ('" + string.Join("','", vmiReceiveInfos.Select(d => d.Fid.GetValueOrDefault()).ToArray()) + "'));");
            ///执行
            using (TransactionScope trans = new TransactionScope())
            {
                if (@string.Length > 0)
                {
                    CommonDAL.ExecuteNonQueryBySql(@string.ToString());
                }
                trans.Complete();
            }
            return(true);
        }