Example #1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="info"></param>
        /// <returns></returns>
        public long InsertInfo(WarehouseInfo info)
        {
            ///仓库代码①、仓库名称②不允许重复,且必填,单字段进行全表校验
            int cnt = dal.GetCounts("[WAREHOUSE] = N'" + info.Warehouse + "'");

            if (cnt > 0)
            {
                throw new Exception("MC:0x00000260");///仓库代码重复
            }
            cnt = dal.GetCounts("[WAREHOUSE_NAME] = N'" + info.WarehouseName + "'");
            if (cnt > 0)
            {
                throw new Exception("MC:0x00000160");///仓库名称重复
            }
            ///如选定仓库类型为外部仓库VMI时,新增或更新供应商信息中的储运供应商
            new SupplierBLL().SyncSupplierByWarehouse(info, info.CreateUser);

            if (info.WarehouseType == (int)WarehouseTypeConstants.VMI)
            {
                var zoneInfo = new ZonesInfo()
                {
                    ZoneNo   = info.Warehouse,
                    ZoneName = info.WarehouseName,
                    Plant    = info.Plant,
                    WmNo     = info.Warehouse,

                    CreateUser = info.CreateUser,
                    CreateDate = DateTime.Now,
                    Fid        = Guid.NewGuid(),
                    ValidFlag  = true,
                };
                new ZonesBLL().InsertInfo(zoneInfo);
            }
            return(dal.Add(info));
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="fields"></param>
        /// <param name="id"></param>
        /// <returns></returns>
        public bool UpdateInfo(string fields, long id)
        {
            ZonesInfo info = dal.GetInfo(id);

            if (info == null)
            {
                throw new Exception("MC:0x00000084");///数据错误
            }
            ///存储区名称
            info.ZoneName = CommonBLL.GetFieldValue(fields, "ZONE_NAME");
            ///仓库代码
            info.WmNo = CommonBLL.GetFieldValue(fields, "WM_NO");
            WarehouseInfo warehouseInfo = new WarehouseDAL().GetWarehouseInfo(info.WmNo);

            if (warehouseInfo == null)
            {
                throw new Exception("MC:0x00000230");///仓库信息不存在
            }
            ///是否结算
            string settlement_flag = CommonBLL.GetFieldValue(fields, "SETTLEMENT_FLAG");

            if (bool.TryParse(settlement_flag, out bool bool_settlement_flag))
            {
                info.Settlementflag = bool_settlement_flag;
            }
            ///SAP库存地点
            info.StockPlaceNo = CommonBLL.GetFieldValue(fields, "STOCK_PLACE_NO");
            ///允许存储区代码在不同的仓库中重复使用
            string allow_zoneno_repeat_at_different_warehouse = new ConfigDAL().GetValueByCode("ALLOW_ZONENO_REPEAT_AT_DIFFERENT_WAREHOUSE");

            ///数据校验
            ValidInfo(info, allow_zoneno_repeat_at_different_warehouse);

            return(dal.UpdateInfo(fields, id) > 0 ? true : false);
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="info"></param>
        /// <returns></returns>
        public long InsertInfo(ZonesInfo info)
        {
            WarehouseInfo warehouseInfo = new WarehouseDAL().GetWarehouseInfo(info.WmNo);

            if (warehouseInfo == null)
            {
                throw new Exception("MC:0x00000230");///仓库信息不存在
            }
            ///允许存储区代码在不同的仓库中重复使用
            string allow_zoneno_repeat_at_different_warehouse = new ConfigDAL().GetValueByCode("ALLOW_ZONENO_REPEAT_AT_DIFFERENT_WAREHOUSE");

            ///数据校验
            ValidInfo(info, allow_zoneno_repeat_at_different_warehouse);

            return(dal.Add(info));
        }
        /// <summary>
        /// 数据校验
        /// </summary>
        /// <param name="info"></param>
        /// <param name="allow_zoneno_repeat_at_different_warehouse"></param>
        private void ValidInfo(ZonesInfo info, string allow_zoneno_repeat_at_different_warehouse)
        {
            if (string.IsNullOrEmpty(info.ZoneNo))
            {
                throw new Exception("MC:0x00000527");///存储区代码不能为空
            }
            if (string.IsNullOrEmpty(info.WmNo))
            {
                throw new Exception("MC:0x00000528");///仓库代码不能为空
            }
            string wmNoCondition = string.Empty;

            if (!string.IsNullOrEmpty(allow_zoneno_repeat_at_different_warehouse) && allow_zoneno_repeat_at_different_warehouse.ToLower() == "true")
            {
                wmNoCondition = "and [WM_NO] = N'" + info.WmNo + "' ";
            }
            ///存储区代码①不允许重复,单字段进行全表校
            int cnt = dal.GetCounts("[ZONE_NO] = N'" + info.ZoneNo + "' " + wmNoCondition);

            if (cnt > 0)
            {
                throw new Exception("MC:0x00000162");///存储区代码重复
            }
            if (string.IsNullOrEmpty(info.ZoneName))
            {
                throw new Exception("MC:0x00000739");///存储区名称不能为空
            }
            ///存储区名称②在同一仓库范围下不允许重复
            cnt = dal.GetCounts("[ZONE_NAME] = N'" + info.ZoneName + "' " + wmNoCondition);
            if (cnt > 0)
            {
                throw new Exception("MC:0x00000161");///存储区名称重复
            }
            if (info.Settlementflag.GetValueOrDefault() && string.IsNullOrEmpty(info.StockPlaceNo))
            {
                throw new Exception("MC:0x00000218");///结算存储区的库存地点不能为空
            }
        }
Example #5
0
        /// <summary>
        /// 同步
        /// </summary>
        /// <param name="loginUser"></param>
        public static void Sync(string loginUser)
        {
            ///获取没有处理的送货单数据
            List <SrmDeliveryNoteInfo> srmDeliveryNoteInfos = new SrmDeliveryNoteBLL().GetList("[PROCESS_FLAG] = " + (int)ProcessFlagConstants.Untreated + "", string.Empty);

            if (srmDeliveryNoteInfos.Count == 0)
            {
                return;
            }
            ///获取没有处理的送货单详情数据- 没有数据主表报错
            List <SrmDeliveryNoteDetailInfo> srmDeliveryNoteDetailInfos = new SrmDeliveryNoteDetailBLL().GetList("[ORDER_FID] in ('" + string.Join("','", srmDeliveryNoteInfos.Select(d => d.Fid.GetValueOrDefault()).ToArray()) + "')", string.Empty);

            if (srmDeliveryNoteDetailInfos.Count == 0)
            {
                return;
            }
            ///获取相关物料供应商信息
            List <SupplierInfo> supplierInfos = new SupplierBLL().GetList("" +
                                                                          "[SUPPLIER_NUM] in ('" + string.Join("','", srmDeliveryNoteInfos.Select(d => d.Suppliercode).ToArray()) + "') and " +
                                                                          "[SUPPLIER_TYPE] = " + (int)SupplierTypeConstants.MaterialSupplier + "", string.Empty);
            ///
            StringBuilder @string = new StringBuilder();

            if (supplierInfos.Count == 0)
            {
                @string.AppendLine("update [LES].[TI_IFM_SRM_DELIVERY_NOTE] set " +
                                   "[PROCESS_FLAG] = " + (int)ProcessFlagConstants.Suspend + "," +
                                   "[PROCESS_TIME] = GETDATE()," +
                                   "[COMMENTS] = N'0x00000475' where " +///送货单中供应商信息无效
                                   "[ID] in (" + string.Join(",", srmDeliveryNoteInfos.Select(d => d.Id).ToArray()) + ");");
                BLL.SYS.CommonBLL.ExecuteNonQueryBySql(@string.ToString());
                return;
            }
            ///获取相关存储区信息
            List <string> zoneNos = srmDeliveryNoteInfos.Where(d => !string.IsNullOrEmpty(d.Targetzoneno)).Select(d => d.Targetzoneno).ToList();

            zoneNos.AddRange(srmDeliveryNoteInfos.Where(d => !string.IsNullOrEmpty(d.Sourcezoneno)).Select(d => d.Sourcezoneno).ToList());
            List <ZonesInfo> zonesInfos = new ZonesBLL().GetList("" +
                                                                 "[ZONE_NO] in ('" + string.Join("','", zoneNos.ToArray()) + "') and " +
                                                                 "[PLANT] in ('" + string.Join("','", srmDeliveryNoteInfos.Select(d => d.Plant).ToArray()) + "')", string.Empty);

            if (zonesInfos.Count == 0)
            {
                @string.AppendLine("update [LES].[TI_IFM_SRM_DELIVERY_NOTE] set " +
                                   "[PROCESS_FLAG] = " + (int)ProcessFlagConstants.Suspend + "," +
                                   "[PROCESS_TIME] = GETDATE()," +
                                   "[COMMENTS] = N'0x00000485' where " +///送货单中存储区信息不存在
                                   "[ID] in (" + string.Join(",", srmDeliveryNoteInfos.Select(d => d.Id).ToArray()) + ");");
                BLL.SYS.CommonBLL.ExecuteNonQueryBySql(@string.ToString());
                return;
            }
            ///
            List <long> dealedIds = new List <long>();

            ///循环写入数据
            foreach (SrmDeliveryNoteInfo srmDeliveryNoteInfo in srmDeliveryNoteInfos)
            {
                ///获取送货单明细
                List <SrmDeliveryNoteDetailInfo> srmDeliveryNoteDetails = srmDeliveryNoteDetailInfos.Where(d => d.OrderFid.GetValueOrDefault() == srmDeliveryNoteInfo.Fid.GetValueOrDefault()).ToList();
                if (srmDeliveryNoteDetails.Count == 0)
                {
                    @string.AppendLine("update [LES].[TI_IFM_SRM_DELIVERY_NOTE] set " +
                                       "[PROCESS_FLAG] = " + (int)ProcessFlagConstants.Suspend + "," +
                                       "[PROCESS_TIME] = GETDATE()," +
                                       "[COMMENTS] = N'0x00000473' where " +///送货单无物料明细
                                       "[ID] = " + srmDeliveryNoteInfo.Id + ";");
                    continue;
                }
                ///供应商信息
                SupplierInfo supplierInfo = supplierInfos.FirstOrDefault(d => d.SupplierNum == srmDeliveryNoteInfo.Suppliercode);
                if (supplierInfo == null)
                {
                    @string.AppendLine("update [LES].[TI_IFM_SRM_DELIVERY_NOTE] set " +
                                       "[PROCESS_FLAG] = " + (int)ProcessFlagConstants.Suspend + "," +
                                       "[PROCESS_TIME] = GETDATE()," +
                                       "[COMMENTS] = N'0x00000484' where " +///该送货单中供应商信息不存在
                                       "[ID] = " + srmDeliveryNoteInfo.Id + ";");
                    continue;
                }
                ///校验供应商是否启用了ASN功能
                if (!supplierInfo.AsnFlag.GetValueOrDefault())
                {
                    @string.AppendLine("update [LES].[TI_IFM_SRM_DELIVERY_NOTE] set " +
                                       "[PROCESS_FLAG] = " + (int)ProcessFlagConstants.Suspend + "," +
                                       "[PROCESS_TIME] = GETDATE()," +
                                       "[COMMENTS] = N'0x00000486' where " +///该供应商未启用ASN功能
                                       "[ID] = " + srmDeliveryNoteInfo.Id + ";");
                    continue;
                }
                ///目标存储区
                ZonesInfo zonesInfo = zonesInfos.FirstOrDefault(d => d.ZoneNo == srmDeliveryNoteInfo.Targetzoneno && d.Plant == srmDeliveryNoteInfo.Plant);
                if (zonesInfo == null)
                {
                    @string.AppendLine("update [LES].[TI_IFM_SRM_DELIVERY_NOTE] set " +
                                       "[PROCESS_FLAG] = " + (int)ProcessFlagConstants.Suspend + "," +
                                       "[PROCESS_TIME] = GETDATE()," +
                                       "[COMMENTS] = N'0x00000246' where " +///存储区数据错误
                                       "[ID] = " + srmDeliveryNoteInfo.Id + ";");
                    continue;
                }
                ///单据衔接对象创建
                MaterialPullingOrderInfo materialPullingOrderInfo = MaterialPullingCommonBLL.CreateMaterialPullingOrderInfo();
                ///SrmDeliveryNoteInfo -> MaterialPullingOrderInfo
                MaterialPullingCommonBLL.GetMaterialPullingOrderInfo(srmDeliveryNoteInfo, ref materialPullingOrderInfo);
                ///SupplierInfo -> MaterialPullingOrderInfo
                MaterialPullingCommonBLL.GetMaterialPullingOrderInfo(supplierInfo, ref materialPullingOrderInfo);
                ///
                materialPullingOrderInfo.TargetWmNo = zonesInfo.WmNo;
                ///PART_BOX_CODE,TODO:考虑由SRM增加字段?
                materialPullingOrderInfo.PartBoxCode = string.Empty;
                ///PART_BOX_NAME,11
                materialPullingOrderInfo.PartBoxName = string.Empty;
                ///
                materialPullingOrderInfo.Route = null;
                ///
                foreach (SrmDeliveryNoteDetailInfo srmDeliveryNoteDetail in srmDeliveryNoteDetails)
                {
                    ///单据衔接明细对象创建
                    MaterialPullingOrderDetailInfo materialPullingOrderDetailInfo = MaterialPullingCommonBLL.CreateMaterialPullingOrderDetailInfo();
                    ///SrmDeliveryNoteDetailInfo -> MaterialPullingOrderDetailInfo
                    MaterialPullingCommonBLL.GetMaterialPullingOrderDetailInfo(srmDeliveryNoteDetail, ref materialPullingOrderDetailInfo);
                    ///SRM拉动单明细中的供应商必须为单据的供应商
                    materialPullingOrderDetailInfo.SupplierNum = srmDeliveryNoteInfo.Suppliercode;
                    ///
                    materialPullingOrderInfo.MaterialPullingOrderDetailInfos.Add(materialPullingOrderDetailInfo);
                }
                ///生成创建入库单的语句
                @string.Append(MaterialPullingCommonBLL.CreateReceiveSql(materialPullingOrderInfo, new List <PartsStockInfo>(), loginUser));
                ///执行成功的ID
                dealedIds.Add(srmDeliveryNoteInfo.Id);
            }
            if (dealedIds.Count > 0)
            {
                ///已处理的中间表数据更新为已处理状态
                @string.AppendLine("update [LES].[TI_IFM_SRM_DELIVERY_NOTE] set " +
                                   "[PROCESS_FLAG] = " + (int)ProcessFlagConstants.Processed + "," +
                                   "[PROCESS_TIME] = GETDATE() where " +
                                   "[ID] in (" + string.Join(",", dealedIds.ToArray()) + ");");
            }
            ///执行
            using (TransactionScope trans = new TransactionScope())
            {
                if (@string.Length > 0)
                {
                    BLL.SYS.CommonBLL.ExecuteNonQueryBySql(@string.ToString());
                }
                trans.Complete();
            }
        }
        /// <summary>
        /// 执行导入EXCEL数据
        /// </summary>
        /// <param name="dataTable"></param>
        /// <param name="fieldNames"></param>
        /// <returns></returns>
        public bool ImportDataByExcel(DataTable dataTable, Dictionary <string, string> fieldNames, string loginUser)
        {
            List <ZonesInfo> zonesExcelInfos = CommonDAL.DatatableConvertToList <ZonesInfo>(dataTable).ToList();

            if (zonesExcelInfos.Count == 0)
            {
                throw new Exception("MC:1x00000043");///数据格式不符合导入规范
            }
            ///获取业务表中要变更的数据集合,准备对比
            List <ZonesInfo> zonesInfos = new ZonesDAL().GetList("" +
                                                                 "[ZONE_NO] in ('" + string.Join("','", zonesExcelInfos.Select(d => d.ZoneNo).ToArray()) + "')", string.Empty);
            ///仓库
            List <WarehouseInfo> warehouseInfos = new WarehouseDAL().GetList("" +
                                                                             "[WAREHOUSE] in ('" + string.Join("','", zonesExcelInfos.Select(d => d.WmNo).ToArray()) + "')", string.Empty);
            ///允许存储区代码在不同的仓库中重复使用
            string allow_zoneno_repeat_at_different_warehouse = new ConfigDAL().GetValueByCode("ALLOW_ZONENO_REPEAT_AT_DIFFERENT_WAREHOUSE");
            ///执行的SQL语句
            StringBuilder @string = new StringBuilder();

            List <string> fields = new List <string>(fieldNames.Keys);

            ///逐条处理中间表数据
            foreach (var zonesExcelInfo in zonesExcelInfos)
            {
                WarehouseInfo warehouseInfo = warehouseInfos.FirstOrDefault(d => d.Warehouse == zonesExcelInfo.WmNo);
                if (warehouseInfo == null)
                {
                    throw new Exception("MC:0x00000230");///仓库信息不存在
                }
                ///数据校验
                ValidInfo(zonesExcelInfo, allow_zoneno_repeat_at_different_warehouse);

                ///当前业务数据表中此工厂的该物流路线时需要新增
                ZonesInfo zonesInfo = zonesInfos.FirstOrDefault(d => d.ZoneNo == zonesExcelInfo.ZoneNo && d.WmNo == zonesExcelInfo.WmNo);
                if (zonesInfo == null)
                {
                    ///字段
                    string insertFieldString = string.Empty;
                    ///值
                    string insertValueString = string.Empty;
                    for (int i = 0; i < fields.Count; i++)
                    {
                        string valueStr = CommonDAL.GetFieldValueForSql <ZonesInfo>(zonesExcelInfo, fields[i]);
                        if (string.IsNullOrEmpty(valueStr))
                        {
                            throw new Exception("MC:1x00000043");///数据格式不符合导入规范
                        }
                        insertFieldString += "[" + fieldNames[fields[i]] + "],";
                        insertValueString += valueStr + ",";
                    }
                    ///
                    zonesExcelInfo.Fid = Guid.NewGuid();
                    ///判断业务主键是否重复,以防止EXCEL中有重复数据,适用于基础数据导入
                    @string.AppendLine("if not exists (select * from [LES].[TM_WMM_ZONES] with(nolock) where [ZONE_NO] = N'" + zonesExcelInfo.ZoneNo + "' and [VALID_FLAG] = 1) " +
                                       "insert into [LES].[TM_WMM_ZONES] " +
                                       "([FID]," + insertFieldString + "[CREATE_USER]," + "[CREATE_DATE]," + "[VALID_FLAG]) values " +
                                       "(N'" + zonesExcelInfo.Fid.GetValueOrDefault() + "'," + insertValueString + "N'" + loginUser + "'," + "GETDATE()," + "1);");

                    zonesInfos.Add(zonesExcelInfo);
                    continue;
                }

                if (string.IsNullOrEmpty(zonesExcelInfo.ZoneName))
                {
                    throw new Exception("MC:0x00000739");///存储区名称不能为空
                }
                if (string.IsNullOrEmpty(zonesExcelInfo.WmNo))
                {
                    throw new Exception("MC:0x00000528");///仓库代码不能为空
                }
                if (zonesExcelInfo.Settlementflag == null)
                {
                    throw new Exception("MC:0x00000529");///结算标记不能为空
                }
                ///值
                string valueString = string.Empty;
                for (int i = 0; i < fields.Count; i++)
                {
                    string valueStr = CommonDAL.GetFieldValueForSql <ZonesInfo>(zonesExcelInfo, fields[i]);
                    if (string.IsNullOrEmpty(valueStr))
                    {
                        throw new Exception("MC:1x00000043");///数据格式不符合导入规范
                    }
                    valueString += "[" + fieldNames[fields[i]] + "] = " + valueStr + ",";
                }
                @string.AppendLine("update [LES].[TM_WMM_ZONES] " +
                                   "set " + valueString + "[MODIFY_USER] = N'" + loginUser + "'," + "[MODIFY_DATE] = GETDATE() " +
                                   "where [FID] = N'" + zonesInfo.Fid.GetValueOrDefault() + "';");
            }
            ///执行
            using (var trans = new TransactionScope())
            {
                if (@string.Length > 0)
                {
                    CommonDAL.ExecuteNonQueryBySql(@string.ToString());
                }
                trans.Complete();
            }
            return(true);
        }
        /// <summary>
        /// 根据仓库信息同步供应商信息
        /// </summary>
        /// <param name="warehouseInfo"></param>
        public void SyncSupplierByWarehouse(WarehouseInfo warehouseInfo, string loginUser)
        {
            ///类型为内部仓库时不同步供应商信息
            if (warehouseInfo.WarehouseType.GetValueOrDefault() != (int)WarehouseTypeConstants.VMI)
            {
                return;
            }
            StringBuilder @string = new StringBuilder();
            ///是否存在供应商信息
            SupplierInfo supplierInfo = dal.GetSupplierInfo(warehouseInfo.Warehouse);

            if (supplierInfo == null)
            {
                supplierInfo              = new SupplierInfo();
                supplierInfo.Fid          = Guid.NewGuid();
                supplierInfo.SupplierNum  = warehouseInfo.Warehouse;
                supplierInfo.SupplierName = warehouseInfo.WarehouseName;
                supplierInfo.SupplierType = (int)SupplierTypeConstants.LogisticsSupplier;
                supplierInfo.ValidFlag    = true;
                supplierInfo.CreateUser   = loginUser;
                supplierInfo.CreateDate   = DateTime.Now;
                @string.AppendLine(SupplierDAL.GetInsertSql(supplierInfo));
            }
            else
            {
                ///当供应商类型为储运供应商时才更新其信息
                if (supplierInfo.SupplierType.GetValueOrDefault() == (int)SupplierTypeConstants.LogisticsSupplier)
                {
                    @string.AppendLine("update [LES].[TM_BAS_SUPPLIER] " +
                                       "set [SUPPLIER_NAME] = N'" + warehouseInfo.WarehouseName + "'," +
                                       "[MODIFY_USER] = N'" + loginUser + "'," +
                                       "[MODIFY_DATE] = GETDATE() " +
                                       "where [ID] = " + supplierInfo.Id + ";");
                }
            }
            ///同步创建或更新存储区信息
            ///获取相同代码的存储区
            ZonesInfo zonesInfo = new ZonesDAL().GetZonesInfo(warehouseInfo.Warehouse, warehouseInfo.Warehouse);

            if (zonesInfo == null)
            {
                zonesInfo                = new ZonesInfo();
                zonesInfo.ZoneNo         = warehouseInfo.Warehouse;
                zonesInfo.ZoneName       = warehouseInfo.WarehouseName;
                zonesInfo.WmNo           = warehouseInfo.Warehouse;
                zonesInfo.Plant          = warehouseInfo.Plant;
                zonesInfo.Settlementflag = false;
                zonesInfo.CreateUser     = loginUser;
                zonesInfo.CreateDate     = DateTime.Now;
                @string.AppendLine(ZonesDAL.GetInsertSql(zonesInfo));
            }
            else
            {
                @string.AppendLine("update [LES].[TM_WMM_ZONES] " +
                                   "set [ZONE_NAME] = N'" + warehouseInfo.WarehouseName + "'," +
                                   "[WM_NO] = N'" + warehouseInfo.Warehouse + "'," +
                                   "[PLANT] = N'" + warehouseInfo.Plant + "'," +
                                   "[MODIFY_USER] = N'" + loginUser + "'," +
                                   "[MODIFY_DATE] = GETDATE() " +
                                   "where [ID] = " + zonesInfo.Id + ";");
            }
            CommonDAL.ExecuteNonQueryBySql(@string.ToString());
        }
Example #8
0
        /// <summary>
        /// SyncMaterialReservation
        /// </summary>
        /// <param name="loginUser"></param>
        public static void Sync(string loginUser)
        {
            List <SapMaterialReservationInfo> sapMaterialReservationInfos = new SapMaterialReservationBLL().GetListByPage("" +
                                                                                                                          "DATEDIFF(MINUTE,[CREATE_DATE],GETDATE()) > " + sapMaterialReservationSyncDelayMinute + " and " +
                                                                                                                          "[PROCESS_FLAG] in (" + (int)ProcessFlagConstants.Untreated + "," + (int)ProcessFlagConstants.Resend + ")", "[ID]", 1, int.MaxValue, out int dataCnt);

            if (dataCnt == 0)
            {
                return;
            }
            ///带有库存地点信息的存储区数据
            ///TODO:存储区基础数据维护时限制SAP库存地点编号不能重复
            List <ZonesInfo> zonesInfos = new ZonesBLL().GetList("len([STOCK_PLACE_NO]) > 0", string.Empty);
            ///供应商信息
            List <SupplierInfo> supplierInfos = new SupplierBLL().GetListForInterfaceDataSync(sapMaterialReservationInfos.Select(d => d.Lifnr).ToList());
            ///物料基础信息
            List <MaintainPartsInfo> maintainPartsInfos = new MaintainPartsBLL().GetListForInterfaceDataSync(sapMaterialReservationInfos.Select(d => d.Matnr).ToList());
            ///物料仓储信息
            List <PartsStockInfo> partsStockInfos = new PartsStockBLL().GetList("[PART_NO] in ('" + string.Join("','", sapMaterialReservationInfos.Select(d => d.Matnr).ToArray()) + "')", string.Empty);
            ///已处理完成的ID
            List <long>   dealedIds     = new List <long>();
            StringBuilder stringBuilder = new StringBuilder();
            ///Bwart-移动类型
            ///Kostl-成本中心
            ///Lgort-中转库存地点
            ///Umlgo-接收库存地点
            ///Wempf-收货方
            ///Lifnr-供应商
            ///Rsnum-预留单号
            ///Ebeln-采购订单号
            ///Bdter-需求日期
            var gSapMaterialReservationInfos = from p in sapMaterialReservationInfos
                                               group p by new { p.Bwart, p.Kostl, p.Lgort, p.Umlgo, p.Wempf, p.Lifnr, p.Rsnum, p.Ebeln, p.Bdter } into g
                select new { g.Key };

            foreach (var gSapMaterialReservationInfo in gSapMaterialReservationInfos)
            {
                ///校验接收库存地点
                ZonesInfo tZone = zonesInfos.FirstOrDefault(d => d.StockPlaceNo == gSapMaterialReservationInfo.Key.Umlgo);
                if (!string.IsNullOrEmpty(gSapMaterialReservationInfo.Key.Umlgo) && tZone == null)
                {
                    stringBuilder.AppendLine("update [LES].[TI_IFM_SAP_MATERIAL_RESERVATION] " +
                                             "set [PROCESS_FLAG] = " + (int)ProcessFlagConstants.Suspend + "," +
                                             "[PROCESS_TIME] = GETDATE()," +
                                             "[COMMENTS] = N'0x00000418'," +///库存地点不存在
                                             "[MODIFY_USER] = N'" + loginUser + "'," +
                                             "[MODIFY_DATE] = GETDATE() " +
                                             "where [EBELN] = '" + gSapMaterialReservationInfo.Key.Ebeln + "';");
                    continue;
                }
                ///校验中转库存地点
                ZonesInfo sZone = zonesInfos.FirstOrDefault(d => d.StockPlaceNo == gSapMaterialReservationInfo.Key.Lgort);
                if (!string.IsNullOrEmpty(gSapMaterialReservationInfo.Key.Lgort) && sZone == null)
                {
                    stringBuilder.AppendLine("update [LES].[TI_IFM_SAP_MATERIAL_RESERVATION] " +
                                             "set [PROCESS_FLAG] = " + (int)ProcessFlagConstants.Suspend + "," +
                                             "[PROCESS_TIME] = GETDATE()," +
                                             "[COMMENTS] = N'0x00000418'," +///库存地点不存在
                                             "[MODIFY_USER] = N'" + loginUser + "'," +
                                             "[MODIFY_DATE] = GETDATE() " +
                                             "where [EBELN] = '" + gSapMaterialReservationInfo.Key.Ebeln + "';");
                    continue;
                }
                ///校验供应商
                SupplierInfo supplierInfo = supplierInfos.FirstOrDefault(d => d.SupplierNum == gSapMaterialReservationInfo.Key.Lifnr);
                if (!string.IsNullOrEmpty(gSapMaterialReservationInfo.Key.Lifnr) && supplierInfo == null)
                {
                    stringBuilder.AppendLine("update [LES].[TI_IFM_SAP_MATERIAL_RESERVATION] " +
                                             "set [PROCESS_FLAG] = " + (int)ProcessFlagConstants.Suspend + "," +
                                             "[PROCESS_TIME] = GETDATE()," +
                                             "[COMMENTS] = N'0x00000239'," +///供应商数据错误
                                             "[MODIFY_USER] = N'" + loginUser + "'," +
                                             "[MODIFY_DATE] = GETDATE() " +
                                             "where [EBELN] = '" + gSapMaterialReservationInfo.Key.Ebeln + "';");
                    continue;
                }
                ///是否存在单据明细数据
                List <SapMaterialReservationInfo> sapMaterialReservations = sapMaterialReservationInfos.Where(d => d.Ebeln == gSapMaterialReservationInfo.Key.Ebeln).ToList();
                if (sapMaterialReservations.Count == 0)
                {
                    stringBuilder.AppendLine("update [LES].[TI_IFM_SAP_MATERIAL_RESERVATION] " +
                                             "set [PROCESS_FLAG] = " + (int)ProcessFlagConstants.Suspend + "," +
                                             "[PROCESS_TIME] = GETDATE()," +
                                             "[COMMENTS] = N'0x00000084'," +///数据错误
                                             "[MODIFY_USER] = N'" + loginUser + "'," +
                                             "[MODIFY_DATE] = GETDATE() " +
                                             "where [EBELN] = '" + gSapMaterialReservationInfo.Key.Ebeln + "';");
                    continue;
                }

                #region TT_MPM_SAP_PURCHASE_ORDER
                ///采购订单号默认为SAP采购订单号
                string orderCode = gSapMaterialReservationInfo.Key.Ebeln;
                ///如果采购订单号为空,则以预留单号作为采购订单号
                ///TODO:后期考虑这种形式直接写入供应商退货单表
                if (string.IsNullOrEmpty(orderCode))
                {
                    orderCode = gSapMaterialReservationInfo.Key.Rsnum;
                }

                SapPurchaseOrderInfo sapPurchaseOrderInfo = new SapPurchaseOrderInfo();
                sapPurchaseOrderInfo.Fid           = Guid.NewGuid();
                sapPurchaseOrderInfo.OrderCode     = orderCode;
                sapPurchaseOrderInfo.SWmNo         = sZone == null ? string.Empty : sZone.WmNo;
                sapPurchaseOrderInfo.SZoneNo       = sZone == null ? string.Empty : sZone.ZoneNo;
                sapPurchaseOrderInfo.TWmNo         = tZone == null ? string.Empty : tZone.WmNo;
                sapPurchaseOrderInfo.TZoneNo       = tZone == null ? string.Empty : tZone.ZoneNo;
                sapPurchaseOrderInfo.RequireDate   = gSapMaterialReservationInfo.Key.Bdter;
                sapPurchaseOrderInfo.SupplierNum   = supplierInfo == null ? string.Empty : supplierInfo.SupplierNum;
                sapPurchaseOrderInfo.SupplierSname = supplierInfo == null ? string.Empty : supplierInfo.SupplierSname;
                sapPurchaseOrderInfo.SupplierName  = supplierInfo == null ? string.Empty : supplierInfo.SupplierName;
                sapPurchaseOrderInfo.CustCode      = gSapMaterialReservationInfo.Key.Wempf;
                sapPurchaseOrderInfo.SapBwart      = gSapMaterialReservationInfo.Key.Bwart;
                sapPurchaseOrderInfo.SapKostl      = gSapMaterialReservationInfo.Key.Kostl;
                sapPurchaseOrderInfo.SapLgort      = gSapMaterialReservationInfo.Key.Lgort;
                sapPurchaseOrderInfo.SapUmlgo      = gSapMaterialReservationInfo.Key.Umlgo;
                sapPurchaseOrderInfo.SapWempf      = gSapMaterialReservationInfo.Key.Wempf;
                sapPurchaseOrderInfo.SapLifnr      = gSapMaterialReservationInfo.Key.Lifnr;
                sapPurchaseOrderInfo.SapRsnum      = gSapMaterialReservationInfo.Key.Rsnum;
                sapPurchaseOrderInfo.SapEbeln      = gSapMaterialReservationInfo.Key.Ebeln;
                sapPurchaseOrderInfo.Status        = (int)PullOrderStatusConstants.Released;
                sapPurchaseOrderInfo.CreateUser    = loginUser;
                stringBuilder.AppendLine(SapPurchaseOrderDAL.GetInsertSql(sapPurchaseOrderInfo));
                #endregion

                List <SapPurchaseOrderDetailInfo> sapPurchaseOrderDetailInfos = new List <SapPurchaseOrderDetailInfo>();
                foreach (var sapMaterialReservation in sapMaterialReservations)
                {
                    ///校验物料基础信息
                    MaintainPartsInfo maintainPartsInfo = maintainPartsInfos.FirstOrDefault(d => d.PartNo == sapMaterialReservation.Matnr);
                    if (maintainPartsInfo == null)
                    {
                        stringBuilder.AppendLine("update [LES].[TI_IFM_SAP_MATERIAL_RESERVATION] " +
                                                 "set [PROCESS_FLAG] = " + (int)ProcessFlagConstants.Suspend + "," +
                                                 "[PROCESS_TIME] = GETDATE()," +
                                                 "[COMMENTS] = N'0x00000417', " +///物料信息数据错误
                                                 "[MODIFY_USER] = N'" + loginUser + "'," +
                                                 "[MODIFY_DATE] = GETDATE() " +
                                                 "where [ID] = '" + sapMaterialReservation.Id + "';");
                        continue;
                    }
                    ///中转库存地点的物料仓储信息
                    PartsStockInfo partsStockInfo = partsStockInfos.FirstOrDefault(d =>
                                                                                   d.PartNo == maintainPartsInfo.PartNo &&
                                                                                   d.SupplierNum == supplierInfo.SupplierNum &&
                                                                                   d.ZoneNo == sZone.ZoneNo &&
                                                                                   d.WmNo == sZone.WmNo);


                    if (!string.IsNullOrEmpty(gSapMaterialReservationInfo.Key.Lgort) && partsStockInfo == null)
                    {
                        stringBuilder.AppendLine("update [LES].[TI_IFM_SAP_MATERIAL_RESERVATION] " +
                                                 "set [PROCESS_FLAG] = " + (int)ProcessFlagConstants.Suspend + "," +
                                                 "[PROCESS_TIME] = GETDATE()," +
                                                 "[COMMENTS] = N'0x00000241'," + ///物料仓储信息数据错误
                                                 "[MODIFY_USER] = N'" + loginUser + "'," +
                                                 "[MODIFY_DATE] = GETDATE() " +
                                                 "where [ID] = " + sapMaterialReservation.Id + ";");
                        continue;
                    }
                    ///接收库存地点的物料仓储信息
                    if (tZone != null)
                    {
                        PartsStockInfo tPartsStockInfo = partsStockInfos.FirstOrDefault(d =>
                                                                                        d.PartNo == maintainPartsInfo.PartNo &&
                                                                                        d.SupplierNum == supplierInfo.SupplierNum &&
                                                                                        d.ZoneNo == tZone.ZoneNo &&
                                                                                        d.WmNo == tZone.WmNo);
                        if (tPartsStockInfo == null)
                        {
                            stringBuilder.AppendLine("update [LES].[TI_IFM_SAP_MATERIAL_RESERVATION] " +
                                                     "set [PROCESS_FLAG] = " + (int)ProcessFlagConstants.Suspend + "," +
                                                     "[PROCESS_TIME] = GETDATE()," +
                                                     "[COMMENTS] = N'0x00000241'," +///物料仓储信息数据错误
                                                     "[MODIFY_USER] = N'" + loginUser + "'," +
                                                     "[MODIFY_DATE] = GETDATE() " +
                                                     "where [ID] = " + sapMaterialReservation.Id + ";");
                            continue;
                        }
                    }

                    #region TT_MPM_SAP_PURCHASE_ORDER_DETAIL
                    SapPurchaseOrderDetailInfo sapPurchaseOrderDetailInfo = new SapPurchaseOrderDetailInfo();
                    sapPurchaseOrderDetailInfo.OrderFid        = sapPurchaseOrderInfo.Fid;
                    sapPurchaseOrderDetailInfo.PartNo          = maintainPartsInfo.PartNo;
                    sapPurchaseOrderDetailInfo.PartCname       = maintainPartsInfo.PartCname;
                    sapPurchaseOrderDetailInfo.PartEname       = maintainPartsInfo.PartEname;
                    sapPurchaseOrderDetailInfo.PartQty         = sapMaterialReservation.Menge;
                    sapPurchaseOrderDetailInfo.PartPurchaseUom = maintainPartsInfo.PartUnits;
                    sapPurchaseOrderDetailInfo.PartUom         = maintainPartsInfo.PartUnits;
                    sapPurchaseOrderDetailInfo.Package         = partsStockInfo.InboundPackage;
                    sapPurchaseOrderDetailInfo.PackageModel    = partsStockInfo.InboundPackageModel;
                    if (partsStockInfo.InboundPackage.GetValueOrDefault() > 0)
                    {
                        sapPurchaseOrderDetailInfo.RequirePackageQty = Convert.ToInt32(Math.Ceiling(decimal.Parse(sapMaterialReservation.Menge.GetValueOrDefault().ToString()) / partsStockInfo.InboundPackage.GetValueOrDefault()));
                    }
                    sapPurchaseOrderDetailInfo.SapMenge = sapMaterialReservation.Menge;
                    sapPurchaseOrderDetailInfo.SapRsnum = sapMaterialReservation.Rsnum;

                    if (!int.TryParse(sapMaterialReservation.Rspos, out int converintRspos))
                    {
                        throw new Exception("MC:0x00000397");///预留行号错误
                    }
                    sapPurchaseOrderDetailInfo.SapRspos   = converintRspos;
                    sapPurchaseOrderDetailInfo.SapEbeln   = sapMaterialReservation.Ebeln;
                    sapPurchaseOrderDetailInfo.SapEbelp   = sapMaterialReservation.Ebelp;
                    sapPurchaseOrderDetailInfo.SapBwart   = sapMaterialReservation.Bwart;
                    sapPurchaseOrderDetailInfo.SapKostl   = sapMaterialReservation.Kostl;
                    sapPurchaseOrderDetailInfo.SapLgort   = sapMaterialReservation.Lgort;
                    sapPurchaseOrderDetailInfo.SapUmlgo   = sapMaterialReservation.Umlgo;
                    sapPurchaseOrderDetailInfo.SapWempf   = sapMaterialReservation.Wempf;
                    sapPurchaseOrderDetailInfo.SapLifnr   = sapMaterialReservation.Lifnr;
                    sapPurchaseOrderDetailInfo.Status     = (int)PullOrderStatusConstants.Released;
                    sapPurchaseOrderDetailInfo.CreateUser = loginUser;
                    stringBuilder.AppendLine(SapPurchaseOrderDetailDAL.GetInsertSql(sapPurchaseOrderDetailInfo));
                    #endregion

                    sapPurchaseOrderDetailInfos.Add(sapPurchaseOrderDetailInfo);
                    dealedIds.Add(sapMaterialReservation.Id);
                }

                #region 单据衔接
                if (sapPurchaseOrderDetailInfos.Count > 0)
                {
                    int orderType = (int)SapPurchaseOrderTypeConstants.PurchaseOrder;

                    ///若SAP预留单号不为空时,系统认为是预留订单
                    //todo 0是否为空
                    if (!string.IsNullOrEmpty(sapPurchaseOrderInfo.SapRsnum) && sapPurchaseOrderInfo.SapRsnum.ToString() != "0")
                    {
                        orderType = (int)SapPurchaseOrderTypeConstants.ReservationOrder;
                    }
                    ///若SAP采购订单号为空时,系统认为是物料退货
                    if (string.IsNullOrEmpty(sapPurchaseOrderInfo.SapEbeln))
                    {
                        orderType = (int)SapPurchaseOrderTypeConstants.ReturnOrder;
                    }

                    MaterialPullingOrderInfo mpOrder = new MaterialPullingOrderInfo();
                    mpOrder.OrderNo          = sapPurchaseOrderInfo.OrderCode;
                    mpOrder.PartBoxCode      = string.Empty;                                 ///零件类2
                    mpOrder.PartBoxName      = string.Empty;                                 ///零件类名称3
                    mpOrder.Plant            = (sZone == null ? string.Empty : sZone.Plant); ///工厂4,TODO:是否增加工厂字段
                    mpOrder.Workshop         = string.Empty;                                 ///车间5
                    mpOrder.AssemblyLine     = string.Empty;                                 ///流水线6
                    mpOrder.SupplierNum      = sapPurchaseOrderInfo.SupplierNum;             ///供应商代码7
                    mpOrder.SupplierName     = sapPurchaseOrderInfo.SupplierName;            ///供应商名称
                    mpOrder.SourceZoneNo     = sapPurchaseOrderInfo.TZoneNo;                 ///接收存储区
                    mpOrder.SourceWmNo       = sapPurchaseOrderInfo.TWmNo;                   ///接收仓库
                    mpOrder.TargetZoneNo     = sapPurchaseOrderInfo.SZoneNo;                 ///中转存储区
                    mpOrder.TargetWmNo       = sapPurchaseOrderInfo.SWmNo;                   ///中转仓库
                    mpOrder.TargetDock       = string.Empty;                                 ///道口12,TODO:是否增加道口字段
                    mpOrder.PlanShippingTime = sapPurchaseOrderInfo.RequireDate;             ///建议交货时间
                    mpOrder.PlanDeliveryTime = sapPurchaseOrderInfo.RequireDate;             ///预计到厂时间
                    mpOrder.PublishTime      = DateTime.Now;
                    mpOrder.OrderType        = orderType;                                    ///SAP订单类型
                    mpOrder.PullMode         = (int)PullModeConstants.PurchaseOrder;
                    mpOrder.MaterialPullingOrderDetailInfos = (from m in sapPurchaseOrderDetailInfos
                                                               select new MaterialPullingOrderDetailInfo
                    {
                        OrderNo = sapPurchaseOrderInfo.OrderCode,                    ///拉动单号1
                        SupplierNum = sapPurchaseOrderInfo.SupplierNum,              ///供应商2
                        PartNo = m.PartNo,                                           ///物料号3
                        PartCname = m.PartCname,                                     ///物料号中文名称4
                        PartEname = m.PartEname,                                     ///物料号英文名称5
                        Uom = m.PartUom,                                             ///计量单位6
                        PackageQty = m.Package.GetValueOrDefault(),                  ///入库单包装数量7
                        PackageModel = m.PackageModel,                               ///入库包装编号8
                        RequirePackageQty = m.RequirePackageQty.GetValueOrDefault(), ///需求包装数量9
                        RequirePartQty = m.PartQty.GetValueOrDefault(),              ///需求物料数量10
                        SourceWmNo = sapPurchaseOrderInfo.TWmNo,                     ///接收仓库
                        SourceZoneNo = sapPurchaseOrderInfo.TZoneNo,                 ///接收存储区
                        TargetWmNo = sapPurchaseOrderInfo.SWmNo,                     ///中转仓库
                        TargetZoneNo = sapPurchaseOrderInfo.SZoneNo                  ///中转存储区
                    }).ToList();
                    ///执行单据衔接
                    stringBuilder.AppendLine(MaterialPullingCommonBLL.Handler(mpOrder, loginUser));
                }
                #endregion
            }
            if (dealedIds.Count > 0)
            {
                ///已处理的中间表数据更新为已处理状态
                stringBuilder.Append("update [LES].[TI_IFM_SAP_MATERIAL_RESERVATION] " +
                                     "set [PROCESS_FLAG] = " + (int)ProcessFlagConstants.Processed + "," +
                                     "[PROCESS_TIME] = GETDATE()," +
                                     "[COMMENTS] = NULL," +
                                     "[MODIFY_USER] = N'" + loginUser + "'," +
                                     "[MODIFY_DATE] = GETDATE() " +
                                     "where [ID] in (" + string.Join(",", dealedIds.ToArray()) + ");");
            }
            ///执行
            using (var trans = new TransactionScope())
            {
                if (stringBuilder.Length > 0)
                {
                    BLL.SYS.CommonBLL.ExecuteNonQueryBySql(stringBuilder.ToString());
                }
                trans.Complete();
            }
        }
Example #9
0
        /// <summary>
        /// Handler
        /// </summary>
        public void Handler()
        {
            InitConfigFlag();
            ///获取未同步的交易记录
            List <TranDetailsInfo> tranDetailsInfos = new TranDetailsBLL().GetList("[TRAN_STATE] = " + (int)WmmTranStateConstants.Created + "", "[ID]");

            if (tranDetailsInfos.Count == 0)
            {
                return;
            }
            ///仓库
            List <string> wmNos = tranDetailsInfos.Where(d => !string.IsNullOrEmpty(d.WmNo)).Select(d => d.WmNo).ToList();

            wmNos.AddRange(tranDetailsInfos.Where(d => !string.IsNullOrEmpty(d.TargetWm)).Select(d => d.TargetWm).ToList());
            List <WarehouseInfo> warehouseInfos = new WarehouseBLL().GetList("[WAREHOUSE] in ('" + string.Join("','", wmNos.ToArray()) + "')", string.Empty);
            ///存储区
            List <string> zoneNos = tranDetailsInfos.Where(d => !string.IsNullOrEmpty(d.ZoneNo)).Select(d => d.ZoneNo).ToList();

            zoneNos.AddRange(tranDetailsInfos.Where(d => !string.IsNullOrEmpty(d.TargetZone)).Select(d => d.TargetZone).ToList());
            List <ZonesInfo> zonesInfos = new ZonesBLL().GetList("[ZONE_NO] in ('" + string.Join("','", zoneNos.ToArray()) + "')", string.Empty);
            ///工厂
            List <PlantInfo> plantInfos = new PlantBLL().GetListForInterfaceDataSync();
            ///供应商
            List <SupplierInfo> supplierInfos = new SupplierBLL().GetListForInterfaceDataSync(tranDetailsInfos.Select(d => d.SupplierNum).ToList());
            ///物料
            List <MaintainPartsInfo> maintainPartsInfos = new MaintainPartsBLL().GetListForInterfaceDataSync(tranDetailsInfos.Select(d => d.PartNo).ToList());


            ///逐条处理
            foreach (var tranDetailsInfo in tranDetailsInfos)
            {
                StringBuilder stringBuilder = new StringBuilder();
                ///工厂
                PlantInfo plantInfo = plantInfos.FirstOrDefault(d => d.Plant == tranDetailsInfo.Plant);
                ///供应商
                SupplierInfo supplierInfo = supplierInfos.FirstOrDefault(d => d.SupplierNum == tranDetailsInfo.SupplierNum);
                ///目标仓库
                WarehouseInfo targetWarehouseInfo = warehouseInfos.FirstOrDefault(d => d.Warehouse == tranDetailsInfo.TargetWm);
                ///目标存储区
                ZonesInfo targetZonesInfo = zonesInfos.FirstOrDefault(d => d.ZoneNo == tranDetailsInfo.TargetZone);
                ///目标工厂
                PlantInfo targetPlantInfo = targetZonesInfo == null ? null : plantInfos.FirstOrDefault(d => d.Plant == targetZonesInfo.Plant);
                ///来源
                ZonesInfo sourceZonesInfo = zonesInfos.FirstOrDefault(d => d.ZoneNo == tranDetailsInfo.ZoneNo);
                ///来源工厂
                PlantInfo sourcePlantInfo = sourceZonesInfo == null ? null : plantInfos.FirstOrDefault(d => d.Plant == sourceZonesInfo.Plant);
                ///物料信息
                MaintainPartsInfo maintainPartsInfo = maintainPartsInfos.FirstOrDefault(d => d.PartNo == tranDetailsInfo.PartNo && d.Plant == tranDetailsInfo.Plant);
                ///创建库存对象
                StocksInfo stocksInfo = null;
                ///
                switch (tranDetailsInfo.TranType.GetValueOrDefault())
                {
                ///物料入库
                case (int)WmmTranTypeConstants.Inbound:
                    ///目标可用库存增加
                    stocksInfo = HandlingStocksData(tranDetailsInfo, maintainPartsInfo, targetZonesInfo, false);
                    stringBuilder.AppendFormat(stocksBLL.StocksRaiseSql(stocksInfo, tranDetailsInfo.Id, loginUser));
                    break;

                ///撤销入库
                case (int)WmmTranTypeConstants.UndoInbound:
                    stocksInfo = HandlingStocksData(tranDetailsInfo, maintainPartsInfo, targetZonesInfo, false);
                    UndoStock(ref stocksInfo);
                    stringBuilder.AppendFormat(stocksBLL.StocksRaiseSql(stocksInfo, tranDetailsInfo.Id, loginUser));
                    break;

                ///物料出库
                case (int)WmmTranTypeConstants.Outbound:
                    ///来源可用库存减少
                    stocksInfo = HandlingStocksData(tranDetailsInfo, maintainPartsInfo, sourceZonesInfo, true);
                    stringBuilder.AppendFormat(stocksBLL.StocksReduceSql(stocksInfo, tranDetailsInfo.Id, loginUser));
                    break;

                ///撤销出库
                case (int)WmmTranTypeConstants.UndoOutbound:
                    stocksInfo = HandlingStocksData(tranDetailsInfo, maintainPartsInfo, sourceZonesInfo, true);
                    UndoStock(ref stocksInfo);
                    stringBuilder.AppendFormat(stocksBLL.StocksReduceSql(stocksInfo, tranDetailsInfo.Id, loginUser));
                    break;

                ///冻结入库
                case (int)WmmTranTypeConstants.FrozenInbound:
                    ///目标冻结库存增加
                    stocksInfo = HandlingStocksData(tranDetailsInfo, maintainPartsInfo, targetZonesInfo, false);
                    stringBuilder.AppendFormat(stocksBLL.FrozenRaiseSql(stocksInfo, tranDetailsInfo.Id, loginUser));
                    break;

                ///冻结出库
                case (int)WmmTranTypeConstants.FrozenOutbound:
                    ///来源冻结库存减少
                    stocksInfo = HandlingStocksData(tranDetailsInfo, maintainPartsInfo, sourceZonesInfo, true);
                    stringBuilder.AppendFormat(stocksBLL.FrozenReduceSql(stocksInfo, tranDetailsInfo.Id, loginUser));
                    break;

                ///物料冻结
                case (int)WmmTranTypeConstants.MaterialFreezing:
                    ///来源可用库存减少
                    stocksInfo = HandlingStocksData(tranDetailsInfo, maintainPartsInfo, sourceZonesInfo, true);
                    stringBuilder.AppendFormat(stocksBLL.StocksReduceSql(stocksInfo, tranDetailsInfo.Id, loginUser));
                    ///目标冻结库存增加
                    stocksInfo = HandlingStocksData(tranDetailsInfo, maintainPartsInfo, targetZonesInfo, false);
                    stringBuilder.AppendFormat(stocksBLL.FrozenRaiseSql(stocksInfo, tranDetailsInfo.Id, loginUser));
                    break;

                ///状态冻结
                case (int)WmmTranTypeConstants.StateFreezing:
                    ///来源可用库存减少
                    stocksInfo = HandlingStocksData(tranDetailsInfo, maintainPartsInfo, sourceZonesInfo, true);
                    stringBuilder.AppendFormat(stocksBLL.StocksReduceSql(stocksInfo, tranDetailsInfo.Id, loginUser));
                    ///来源冻结库存增加
                    stocksInfo = HandlingStocksData(tranDetailsInfo, maintainPartsInfo, sourceZonesInfo, true);
                    stringBuilder.AppendFormat(stocksBLL.FrozenRaiseSql(stocksInfo, tranDetailsInfo.Id, loginUser));
                    break;

                ///物料解冻
                case (int)WmmTranTypeConstants.MaterialThawing:
                    ///来源冻结库存减少
                    stocksInfo = HandlingStocksData(tranDetailsInfo, maintainPartsInfo, sourceZonesInfo, true);
                    stringBuilder.AppendFormat(stocksBLL.FrozenReduceSql(stocksInfo, tranDetailsInfo.Id, loginUser));
                    ///目标可用库存增加
                    stocksInfo = HandlingStocksData(tranDetailsInfo, maintainPartsInfo, targetZonesInfo, false);
                    stringBuilder.AppendFormat(stocksBLL.StocksRaiseSql(stocksInfo, tranDetailsInfo.Id, loginUser));
                    break;

                ///状态解冻
                case (int)WmmTranTypeConstants.StateThawing:
                    ///来源可用库存增加
                    stocksInfo = HandlingStocksData(tranDetailsInfo, maintainPartsInfo, sourceZonesInfo, true);
                    stringBuilder.AppendFormat(stocksBLL.StocksRaiseSql(stocksInfo, tranDetailsInfo.Id, loginUser));
                    ///来源冻结库存减少
                    stocksInfo = HandlingStocksData(tranDetailsInfo, maintainPartsInfo, sourceZonesInfo, true);
                    stringBuilder.AppendFormat(stocksBLL.FrozenReduceSql(stocksInfo, tranDetailsInfo.Id, loginUser));
                    break;

                ///冻结移动
                case (int)WmmTranTypeConstants.FrozenMovement:
                    ///来源冻结库存减少
                    stocksInfo = HandlingStocksData(tranDetailsInfo, maintainPartsInfo, sourceZonesInfo, true);
                    stringBuilder.AppendFormat(stocksBLL.FrozenReduceSql(stocksInfo, tranDetailsInfo.Id, loginUser));
                    ///目标冻结库存增加
                    stocksInfo = HandlingStocksData(tranDetailsInfo, maintainPartsInfo, targetZonesInfo, false);
                    stringBuilder.AppendFormat(stocksBLL.FrozenRaiseSql(stocksInfo, tranDetailsInfo.Id, loginUser));
                    break;

                ///物料移动
                case (int)WmmTranTypeConstants.Movement:
                    ///来源可用库存减少
                    stocksInfo = HandlingStocksData(tranDetailsInfo, maintainPartsInfo, sourceZonesInfo, true);
                    stringBuilder.AppendFormat(stocksBLL.StocksReduceSql(stocksInfo, tranDetailsInfo.Id, loginUser));
                    ///目标可用库存增加
                    stocksInfo = HandlingStocksData(tranDetailsInfo, maintainPartsInfo, targetZonesInfo, false);
                    stringBuilder.AppendFormat(stocksBLL.StocksRaiseSql(stocksInfo, tranDetailsInfo.Id, loginUser));
                    break;

                default: continue;
                }
                ///SAP移动数据
                stringBuilder.AppendFormat(CreateSapTranData(tranDetailsInfo, sourceZonesInfo, targetZonesInfo, sourcePlantInfo, targetPlantInfo));
                ///SRM入库数据
                stringBuilder.AppendFormat(CreateSrmTranData(tranDetailsInfo, supplierInfo, targetWarehouseInfo));
                ///WMS入库数据
                stringBuilder.AppendFormat(CreateVmiTranData(tranDetailsInfo, supplierInfo, targetWarehouseInfo));


                #region 执行
                using (TransactionScope trans = new TransactionScope())
                {
                    if (stringBuilder.Length > 0)
                    {
                        BLL.LES.CommonBLL.ExecuteNonQueryBySql(stringBuilder.ToString());
                    }
                    trans.Complete();
                }
                #endregion
                Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + ":" + stocksInfo.PartNo + "|" + tranDetailsInfo.TranType.GetValueOrDefault() + "|" + stocksInfo.WmNo + "|" + stocksInfo.ZoneNo + "|" + stocksInfo.Dloc + "|");
            }
        }
Example #10
0
        /// <summary>
        /// 根据交易记录以及基础数据配置数据,产生交易接口数据 Create By Xue
        /// </summary>
        private string CreateSapTranData(TranDetailsInfo tranDetailsInfo, ZonesInfo sourceZonesInfo, ZonesInfo targetZonesInfo, PlantInfo sourcePlantInfo, PlantInfo targetPlantInfo)
        {
            ///
            if (tranDetailsInfo == null)
            {
                return(string.Empty);
            }
            ///是否启用SAP交易记录同步接口
            if (string.IsNullOrEmpty(sapTranDataEnableFlag) || sapTranDataEnableFlag.ToLower() != "true")
            {
                return(string.Empty);
            }
            ///
            StringBuilder stringBuilder = new StringBuilder();

            #region SapTranOutInfo
            SapTranOutInfo sapTranOutInfo = new SapTranOutInfo();
            sapTranOutInfo.Matnr       = tranDetailsInfo.PartNo;
            sapTranOutInfo.Menge       = tranDetailsInfo.ActualQty;
            sapTranOutInfo.Budat       = tranDetailsInfo.TranDate;
            sapTranOutInfo.Lifnr       = tranDetailsInfo.SupplierNum;
            sapTranOutInfo.ProcessFlag = (int)ProcessFlagConstants.Untreated;
            sapTranOutInfo.CreateUser  = loginUser;
            #endregion

            ///如果没有目标库区则有可能是出成本中心的业务数据
            if (targetZonesInfo == null)
            {
                ///若单据类型为物料预留、物料退货
                if (tranDetailsInfo.TranOrderType.GetValueOrDefault() == ((int)OutboundTypeConstants.ReserveOutbound + 2000) ||
                    tranDetailsInfo.TranOrderType.GetValueOrDefault() == ((int)OutboundTypeConstants.MaterialReturns + 2000))
                {
                    SapPurchaseOrderDetailInfo sapPurchaseOrderDetailInfo = new SapPurchaseOrderDetailBLL().GetInfo(tranDetailsInfo.TranNo, tranDetailsInfo.PartNo);
                    if (sapPurchaseOrderDetailInfo == null)
                    {
                        return(string.Empty);                                   ///TODO:物料预留未能找到原始单据
                    }
                    ///如果没有成本中心则不具备产生SAP事务数据的条件
                    if (string.IsNullOrEmpty(sapPurchaseOrderDetailInfo.SapKostl))
                    {
                        return(string.Empty);
                    }

                    ///采购订单中有SAP采购订单号的需要生成101入库交易
                    if (!string.IsNullOrEmpty(sapPurchaseOrderDetailInfo.SapEbeln))
                    {
                        #region 转入库存地点收货数据
                        SapTranOutInfo sapTranOut = sapTranOutInfo.Clone();
                        ///目标库存地点
                        sapTranOut.Lgort = sapPurchaseOrderDetailInfo.SapLgort;
                        sapTranOut.Werks = sourcePlantInfo == null ? string.Empty : sourcePlantInfo.SapPlantCode;
                        ///采购订单
                        sapTranOut.Ebeln = sapPurchaseOrderDetailInfo.SapEbeln;
                        sapTranOut.Ebelp = sapPurchaseOrderDetailInfo.SapEbelp;
                        ///101
                        sapTranOut.Bwart = ((int)SapTranTypeConstants.Inbound).ToString();
                        #endregion
                        stringBuilder.AppendLine(SapTranOutDAL.GetInsertSql(sapTranOut));
                    }
                    ///来源库存地点
                    sapTranOutInfo.Lgort = sapPurchaseOrderDetailInfo.SapLgort;
                    sapTranOutInfo.Werks = sourcePlantInfo == null ? string.Empty : sourcePlantInfo.SapPlantCode;
                    ///目标库存地点
                    sapTranOutInfo.Umlgo = sapPurchaseOrderDetailInfo.SapUmlgo;
                    sapTranOutInfo.Unwrk = targetPlantInfo == null ? string.Empty : targetPlantInfo.SapPlantCode;
                    ///成本中心
                    sapTranOutInfo.Kostl = sapPurchaseOrderDetailInfo.SapKostl;
                    ///预留单号
                    sapTranOutInfo.Rsnum = sapPurchaseOrderDetailInfo.SapRsnum;
                    ///采购订单
                    sapTranOutInfo.Ebeln = sapPurchaseOrderDetailInfo.SapEbeln;
                    sapTranOutInfo.Ebelp = sapPurchaseOrderDetailInfo.SapEbelp;
                    ///移动类型
                    sapTranOutInfo.Bwart = sapPurchaseOrderDetailInfo.SapBwart;
                    stringBuilder.AppendLine(SapTranOutDAL.GetInsertSql(sapTranOutInfo));
                    return(stringBuilder.ToString());
                }
            }
            ///据交易记录中的目标存储区是否结算标记
            //todo
            if (targetZonesInfo != null /*&& targetZonesInfo.SettlementFlag.GetValueOrDefault()*/)
            {
                ///接收工厂
                sapTranOutInfo.Unwrk = targetPlantInfo == null ? string.Empty : targetPlantInfo.SapPlantCode;
                ///接收库存地点
                sapTranOutInfo.Umlgo = targetZonesInfo.StockPlaceNo;
                ///发出工厂
                string werks = (sourcePlantInfo == null ? string.Empty : sourcePlantInfo.SapPlantCode);
                ///发出库存地点
                string lgort = (sourceZonesInfo == null ? string.Empty : sourceZonesInfo.StockPlaceNo);

                ///如果没有来源库存地点,并且物料未结算
                if (string.IsNullOrEmpty(lgort) && !tranDetailsInfo.SettledFlag.GetValueOrDefault())
                {
                    ///正常入库
                    if (tranDetailsInfo.TranOrderType.GetValueOrDefault() == ((int)InboundTypeConstants.NormalInbound + 1000))
                    {
                        sapTranOutInfo.Bwart = ((int)SapTranTypeConstants.Inbound).ToString();
                    }
                    ///返利入库单 -> 免费收货
                    if (tranDetailsInfo.TranOrderType.GetValueOrDefault() == ((int)InboundTypeConstants.RebateInbound + 1000))
                    {
                        sapTranOutInfo.Bwart = ((int)SapTranTypeConstants.RebateInbound).ToString();
                    }
                    ///采购订单 -> 正常入库
                    if (tranDetailsInfo.TranOrderType.GetValueOrDefault() == ((int)InboundTypeConstants.PurchaseOrder + 1000))
                    {
                        SapPurchaseOrderDetailInfo sapPurchaseOrderDetailInfo = new SapPurchaseOrderDetailBLL().GetInfo(tranDetailsInfo.RunsheetNo, tranDetailsInfo.PartNo);
                        if (sapPurchaseOrderDetailInfo == null)
                        {
                            return(string.Empty);                                   ///TODO:物料预留未能找到原始单据
                        }
                        sapTranOutInfo.Umlgo = sapPurchaseOrderDetailInfo.SapUmlgo;
                        sapTranOutInfo.Bwart = ((int)SapTranTypeConstants.Inbound).ToString();
                        sapTranOutInfo.Ebeln = sapPurchaseOrderDetailInfo.SapEbeln;
                        sapTranOutInfo.Ebelp = sapPurchaseOrderDetailInfo.SapEbelp;
                    }
                    return(SapTranOutDAL.GetInsertSql(sapTranOutInfo));
                }
                ///如果有发出库存地点,并且物料已结算
                if (!string.IsNullOrEmpty(lgort) && tranDetailsInfo.SettledFlag.GetValueOrDefault())
                {
                    ///如果来源与目标的SAP库存地点相同则不产生移动数据
                    if (lgort == sapTranOutInfo.Umlgo)
                    {
                        return(string.Empty);
                    }
                    sapTranOutInfo.Lgort = lgort;
                    sapTranOutInfo.Werks = werks;
                    sapTranOutInfo.Bwart = ((int)SapTranTypeConstants.Movement).ToString();
                    return(SapTranOutDAL.GetInsertSql(sapTranOutInfo));
                }
            }
            return(string.Empty);
        }
Example #11
0
        /// <summary>
        /// 将交易记录加工为库存投放数据
        /// </summary>
        /// <param name="tranDetailsInfo"></param>
        /// <param name="zonesInfo"></param>
        /// <param name="sourceFlag"></param>
        /// <returns></returns>
        private StocksInfo HandlingStocksData(TranDetailsInfo tranDetailsInfo, MaintainPartsInfo maintainPartsInfo, ZonesInfo zonesInfo, bool sourceFlag)
        {
            ///新建库存对象
            StocksInfo stocksInfo = stocksBLL.CreateStocksInfo(loginUser);

            ///更新物料基础信息
            stocksBLL.UpdateMaintainPartsInfo(maintainPartsInfo, ref stocksInfo);
            ///来源库存对象信息填充
            if (sourceFlag)
            {
                stocksBLL.GetSourceStocksInfo(tranDetailsInfo, ref stocksInfo);
            }
            ///目标库存对象信息填充
            else
            {
                stocksBLL.GetTargetStocksInfo(tranDetailsInfo, zonesInfo, ref stocksInfo);
            }
            ///根据库存管理维度获取更新条件
            string stockUpdateConditions = GetStockUpdateConditions(ref stocksInfo);

            ///若交易数据指定了库存数据外键,则根据外键获取主键
            if (sourceFlag && tranDetailsInfo.StocksFid != null)
            {
                stocksInfo.Id = stocksBLL.GetStocksId(tranDetailsInfo.StocksFid.GetValueOrDefault());
            }
            ///获取库存数据主键
            if (stocksInfo.Id == 0)
            {
                stocksInfo.Id = stocksBLL.GetStocksId(stocksInfo, stockUpdateConditions);
            }
            return(stocksInfo);
        }