wangxinhui
2025-09-11 fb745c842df36edc5101291a7f239c11c97bcc2f
最新代码更新,BST,MES部分
已修改26个文件
已添加13个文件
1519 ■■■■ 文件已修改
项目代码/WMS/WMSServices/WIDESEA_BasicService/Base/MaterielInfoService.cs 71 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_BasicService/Service/LocationInfoService_Common.cs 194 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_BasicService/SupplierInfoService.cs 70 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_Common/LocationEnum/LocationStatusEnum.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_Common/StockEnum/StockStatusMenu.cs 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_Common/WareHouseEnum/WarehouseEnum.cs 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_DTO/Basic/BSTSupplierDTO.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_DTO/ERP/BSTOutOrderDTO.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_DTO/ERP/BSTPurchaseOrderDTO.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_DTO/ERP/BSTReturnOrderDTO.cs 103 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_External/ERPService/InvokeERPService.cs 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_External/Model/BSTPurchaseUpModel.cs 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_IInboundRepository/IReturnBSTOrderDetailRepository.cs 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_IInboundRepository/IReturnBSTOrderRepository.cs 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_IInboundService/IPurchaseBSTOrderService.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_IInboundService/IReturnBSTOrderDetailService.cs 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_IInboundService/IReturnBSTOrderService.cs 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_ITaskInfoService/ITaskService.cs 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_InboundRepository/ReturnBSTOrderDetailRepository.cs 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_InboundRepository/ReturnBSTOrderRepository.cs 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_InboundService/PurchaseBSTOrderService.cs 65 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_InboundService/ReturnBSTOrderDetailService.cs 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_InboundService/ReturnBSTOrderService.cs 164 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_Model/Models/Basic/Dt_AGVStationInfo.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_Model/Models/Inbound/Dt_PurchaseBSTOrder.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_Model/Models/Inbound/Dt_PurchaseBSTOrderDetail.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_Model/Models/Inbound/Dt_ReturnBSTOrder.cs 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_Model/Models/Inbound/Dt_ReturnBSTOrderDetail.cs 101 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_OutboundService/OutBSTOrderService.cs 56 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_StockService/StockInfoService.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_TaskInfoService/TaskService_Inbound.cs 124 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_TaskInfoService/TaskService_Outbound.cs 170 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_WMSServer/Controllers/ERP/ErpBSTController.cs 37 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_WMSServer/Controllers/Inbound/ReturnBSTOrderController.cs 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_WMSServer/Controllers/Inbound/ReturnBSTOrderDetailController.cs 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_WMSServer/Controllers/TaskInfo/TaskController.cs 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_WMSServer/Filter/CustomProfile.cs 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目资料/接口协议/博思通利拓接口.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
项目资料/接口协议/龙利得MES接口.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_BasicService/Base/MaterielInfoService.cs
@@ -40,19 +40,72 @@
            try
            {
                List<Dt_MaterielInfo> OldMaterielInfos = BaseDal.QueryData(x => x.WarehouseId == WarehouseEnum.LLDYL.ObjToInt());
                //判断重复插入
                Dt_MaterielInfo? ExistMaterial = OldMaterielInfos.FirstOrDefault(x => bSTMaterialDTOs.Where(x => x.Way == 1).Select(x => x.MaterialId).Contains(x.MaterialSourceId));
                if (ExistMaterial != null)
                //新增
                List<BSTMaterialDTO> bSTMaterialsDTOAdd = bSTMaterialDTOs.Where(x => x.Way == 1).ToList();
                //修改
                List<BSTMaterialDTO> bSTMaterialsDTOUpdate = bSTMaterialDTOs.Where(x => x.Way == 2).ToList();
                //删除
                List<BSTMaterialDTO> bSTMaterialsDTODel = bSTMaterialDTOs.Where(x => x.Way == 3).ToList();
                List<Dt_MaterielInfo> materielInfosAdd = new List<Dt_MaterielInfo>();
                List<Dt_MaterielInfo> materielInfosUpdate = new List<Dt_MaterielInfo>();
                //新增
                if (bSTMaterialsDTOAdd.Count>0)
                {
                    return content.Error($"物料Id{nameof(BSTMaterialDTO.MaterialId)}:{ExistMaterial.MaterialSourceId}已存在");
                    //判断重复插入
                    Dt_MaterielInfo? ExistMaterial = OldMaterielInfos.FirstOrDefault(x => bSTMaterialsDTOAdd.Select(x => x.MaterialId).Contains(x.MaterialSourceId));
                    if (ExistMaterial != null)
                    {
                        return content.Error($"物料{nameof(BSTMaterialDTO.MaterialId)}:{ExistMaterial.MaterialSourceId}已存在");
                    }
                    foreach (var item in bSTMaterialsDTOAdd)
                    {
                        if (bSTMaterialsDTOUpdate.FirstOrDefault(x=>x.MaterialId==item.MaterialId)!=null)
                        {
                            continue;
                        }
                        Dt_MaterielInfo materielInfo = _mapper.Map<Dt_MaterielInfo>(item);
                        materielInfosAdd.Add(materielInfo);
                    }
                }
                List<Dt_MaterielInfo> materielInfos = new List<Dt_MaterielInfo>();
                foreach (var item in bSTMaterialDTOs)
                //更新
                if (bSTMaterialsDTOUpdate.Count > 0)
                {
                    Dt_MaterielInfo materielInfo = _mapper.Map<Dt_MaterielInfo>(item);
                    materielInfos.Add(materielInfo);
                    //获取已存在的物料
                    List<Dt_MaterielInfo>? ExistbSTMaterialsUpdate = OldMaterielInfos.Where(x => bSTMaterialsDTOUpdate.Select(x => x.MaterialId).Contains(x.MaterialSourceId)).ToList();
                    foreach (var item in bSTMaterialsDTOUpdate)
                    {
                        Dt_MaterielInfo? materielInfoUpdate = ExistbSTMaterialsUpdate.FirstOrDefault(x => x.MaterialSourceId == item.MaterialId);
                        //如果物料已存在则进行更改
                        if (materielInfoUpdate!=null)
                        {
                            materielInfoUpdate.MaterielCode = item.MaterialNo;
                            materielInfoUpdate.MaterielName = item.Name;
                            materielInfoUpdate.MaterielSpec = item.Spec;
                            materielInfoUpdate.MaterielWide = item.MaterielWide;
                            materielInfoUpdate.MaterielThickness = item.MaterielThickness;
                            materielInfoUpdate.MaterielLength = item.MaterielLength;
                            materielInfoUpdate.MaterielWeight = item.Weight;
                            materielInfoUpdate.MaterielUnit = item.Unit;
                            materielInfosUpdate.Add(materielInfoUpdate);
                        }
                        else//如果不存在则进行新增
                        {
                            Dt_MaterielInfo materielInfo = _mapper.Map<Dt_MaterielInfo>(item);
                            materielInfosAdd.Add(materielInfo);
                        }
                    }
                }
                BaseDal.AddData(materielInfos);
                //删除
                if (bSTMaterialsDTODel.Count > 0)
                {
                }
                //更新数据
                _unitOfWorkManage.CommitTran();
                BaseDal.AddData(materielInfosAdd);
                BaseDal.UpdateData(materielInfosUpdate);
                _unitOfWorkManage.CommitTran();
                return content.OK("接收成功");
            }
            catch (Exception ex)
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_BasicService/Service/LocationInfoService_Common.cs
@@ -20,6 +20,7 @@
using WIDESEA_Common.LocationEnum;
using WIDESEA_Common.TaskEnum;
using WIDESEA_Common.WareHouseEnum;
using OfficeOpenXml.FormulaParsing.Excel.Functions.RefAndLookup;
namespace WIDESEA_BasicService
{
@@ -35,33 +36,28 @@
            {
                throw new Exception($"未找到仓库信息");
            }
            //Dt_PalletTypeInfo? palletTypeInfo = _basicRepository.PalletTypeInfoRepository.QueryFirst(x => x.PalletType == palletType && x.WarehouseId == warehouseId);
            //if (palletTypeInfo == null)
            //{
            //    if (warehouse.WarehouseCode == WarehouseEnum.HA153.ToString() && warehouse.WarehouseCode == WarehouseEnum.HA71.ToString() && warehouse.WarehouseCode == WarehouseEnum.HA60.ToString())
            //    {
            //        palletTypeInfo = new Dt_PalletTypeInfo()
            //        {
            //            LocaitonCount = 1,
            //            PalletType = 0,
            //            IsOdd = false,
            //        };
            //    }
            //    else
            //        throw new Exception($"请配置托盘类型信息");
            //}
            Dt_PalletTypeInfo? palletTypeInfo = _basicRepository.PalletTypeInfoRepository.QueryFirst(x => x.PalletType == palletType && x.WarehouseId == warehouseId);
            if (palletTypeInfo == null)
            {
                if (warehouse.WarehouseCode == WarehouseEnum.LLDYL.ToString())
                {
                    throw new Exception($"请配置托盘类型信息");
                }
            }
            return warehouse.WarehouseCode switch
            {
                "LLDCP" or "LLDYL"=> AssignLocation(roadwayNo),
                "LLDCP" or  "LLDFL" => AssignLocation(roadwayNo),
                "LLDYL" => AssignLocationYL(roadwayNo, palletTypeInfo),
                _ => throw new Exception($"未找到仓库货位分配方法")
            };
        }
        private readonly static object _locker = new object();
        private readonly static object _AssignLocationYL = new object();
        private static List<LocationCache> locationCaches = new List<LocationCache>();
        /// <summary>
        ///
        /// åˆ†é…è´§ä½
        /// </summary>
        /// <param name="roadwayNo"></param>
        /// <returns></returns>
@@ -78,11 +74,8 @@
                List<string> lockLocations = locationCaches.Select(x => x.LocationCode).ToList();
                List<Dt_LocationInfo> locationInfos = BaseDal.QueryData(x => x.RoadwayNo == roadwayNo);//查询巷道所有货位信息
                Dictionary<string, OrderByType> orderBy = new Dictionary<string, OrderByType>()
                {
                    { nameof(Dt_LocationInfo.Column),OrderByType.Desc },
                    { nameof(Dt_LocationInfo.Layer),OrderByType.Asc },
                    { nameof(Dt_LocationInfo.Depth),OrderByType.Desc },
@@ -92,7 +85,62 @@
                return BaseDal.QueryFirst(x => x.RoadwayNo == roadwayNo && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && x.EnableStatus != EnableStatusEnum.Disable.ObjToInt() && !lockLocations.Contains(x.LocationCode), orderBy);//查询空货位信息并排除5分钟内分配的货位,根据层、列、深度、行排序
            }
        }
        public Dt_LocationInfo? AssignLocationYL(string roadwayNo, Dt_PalletTypeInfo palletTypeInfo)
        {
            lock (_AssignLocationYL)
            {
                List<LocationCache> removeItems = locationCaches.Where(x => (DateTime.Now - x.DateTime).TotalMinutes > 5).ToList();//查询添加静态变量超过5分钟的货位
                int count = removeItems.Count;
                for (int i = 0; i < count; i++)
                {
                    locationCaches.Remove(removeItems[i]);//移除查询添加静态变量超过5分钟的货位
                }
                List<string> lockLocations = locationCaches.Select(x => x.LocationCode).ToList();
                List<Dt_LocationInfo> locationInfos = BaseDal.QueryData(x => x.RoadwayNo == roadwayNo);//查询巷道所有货位信息
                Dictionary<string, OrderByType> orderBy = new Dictionary<string, OrderByType>()
                {
                    { nameof(Dt_LocationInfo.Column),OrderByType.Desc },
                    { nameof(Dt_LocationInfo.Layer),OrderByType.Asc },
                    { nameof(Dt_LocationInfo.Depth),OrderByType.Desc },
                    { nameof(Dt_LocationInfo.Row),OrderByType.Asc }
                };
                if (roadwayNo.Contains("YLDual"))
                {
                    if (palletTypeInfo.LocaitonCount==1)
                    {
                        return BaseDal.QueryFirst(x => x.LocationType == LocationTypeEnum.SmallPallet.ObjToInt() && x.RoadwayNo == roadwayNo && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && x.EnableStatus != EnableStatusEnum.Disable.ObjToInt() && !lockLocations.Contains(x.LocationCode), orderBy);//查询空货位信息并排除5分钟内分配的货位,根据层、列、深度、行排序
                    }
                    else
                    {
                        //查询空货位信息并排除5分钟内分配的货位,根据层、列、深度、行排序
                        List<Dt_LocationInfo> locationInfosMedium = BaseDal.QueryData(x => x.LocationType == LocationTypeEnum.MediumPallet.ObjToInt() && x.RoadwayNo == roadwayNo && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && x.EnableStatus != EnableStatusEnum.Disable.ObjToInt() && !lockLocations.Contains(x.LocationCode), orderBy);
                        Dt_LocationInfo locationInfo = new Dt_LocationInfo();
                        foreach (var item in locationInfosMedium)
                        {
                            //获取更改库位
                            Dt_LocationInfo? nearLocation1;
                            Dt_LocationInfo? nearLocation2;
                            nearLocation1 = locationInfos.FirstOrDefault(x => x.LocationType == LocationTypeEnum.SmallPallet.ObjToInt() && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && x.Row == item.Row && x.Layer == item.Layer && x.Depth == item.Depth && x.Column == item.Column - 1);
                            nearLocation2 = locationInfos.FirstOrDefault(x => x.LocationType == LocationTypeEnum.SmallPallet.ObjToInt() && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && x.Row == item.Row && x.Layer == item.Layer && x.Depth == item.Depth && x.Column == item.Column + 1);
                            if (nearLocation1!=null && nearLocation2!=null)
                            {
                                locationInfo = item;
                            }
                        }
                        return locationInfo;
                    }
                }
                else
                {
                    return BaseDal.QueryFirst(x => x.RoadwayNo == roadwayNo && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && x.EnableStatus != EnableStatusEnum.Disable.ObjToInt() && !lockLocations.Contains(x.LocationCode), orderBy);//查询空货位信息并排除5分钟内分配的货位,根据层、列、深度、行排序
                }
            }
        }
        /// <summary>
        /// ä¿®æ”¹è´§ä½çŠ¶æ€åŠç±»åž‹
        /// </summary>
@@ -263,27 +311,21 @@
        //    Repository.UpdateData(locations);
        //}
        public void UpdateLocationStatus(Dt_LocationInfo location, int palletType, LocationStatusEnum locationStatus, int warehousId)
        public void UpdateLocationStatus(Dt_LocationInfo location, int palletType, LocationStatusEnum locationStatus, int warehouseId)
        {
            List<Dt_LocationInfo> locationInfos = Repository.QueryData(x => x.RoadwayNo == location.RoadwayNo);
            List<Dt_PalletTypeInfo> palletTypeInfos = _basicRepository.PalletTypeInfoRepository.QueryData(x => x.WarehouseId == warehousId);
            Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseId == warehousId);
            //Dt_PalletTypeInfo? palletTypeInfo = palletTypeInfos.FirstOrDefault(x => x.PalletType == palletType && x.WarehouseId == warehousId);
            //if (palletTypeInfo == null || warehouse.WarehouseCode == WarehouseEnum.HA60.ToString())
            //{
            //    if (warehouse.WarehouseCode == WarehouseEnum.HA153.ToString() || warehouse.WarehouseCode == WarehouseEnum.HA71.ToString() || warehouse.WarehouseCode == WarehouseEnum.HA60.ToString())
            //    {
            //        palletTypeInfo = new Dt_PalletTypeInfo()
            //        {
            //            LocaitonCount = 1,
            //            PalletType = 0,
            //            IsOdd = false,
            //        };
            //    }
            //    else
            //        throw new Exception($"请配置托盘类型信息");
            //}
            List<Dt_PalletTypeInfo> palletTypeInfos = _basicRepository.PalletTypeInfoRepository.QueryData(x => x.WarehouseId == warehouseId);
            Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseId == warehouseId);
            Dt_PalletTypeInfo? palletTypeInfo = _basicRepository.PalletTypeInfoRepository.QueryFirst(x => x.PalletType == palletType && x.WarehouseId == warehouseId);
            if (palletTypeInfo == null)
            {
                if (warehouse.WarehouseCode == WarehouseEnum.LLDYL.ToString())
                {
                    throw new Exception($"请配置托盘类型信息");
                }
            }
            List<Dt_LocationInfo> locations = GetGroupLocations(locationInfos, location);
            if (locationInfos.Max(x => x.Depth) < 3)
            {
@@ -327,76 +369,42 @@
                if (palletTypeInfos.FirstOrDefault(x => x.LocaitonCount == 2) != null)
                {
                    Dt_LocationInfo? nearLocation;
                    //if (palletTypeInfo.IsOdd)
                    //{
                    //    nearLocation = locationInfos.FirstOrDefault(x => x.Row == location.Row && x.Layer == location.Layer && x.Depth == location.Depth && x.Column == location.Column + 1);
                    //}
                    //else
                    //{
                        nearLocation = locationInfos.FirstOrDefault(x => x.Row == location.Row && x.Layer == location.Layer && x.Depth == location.Depth && x.Column == location.Column - 1);
                    //}
                    //获取更改库位
                    Dt_LocationInfo? nearLocation1;
                    Dt_LocationInfo? nearLocation2;
                    if (nearLocation!=null && location.RoadwayNo.Contains("BC"))
                    {
                        if (nearLocation?.LocationType == LocationTypeEnum.SmallPallet.ObjToInt())
                        {
                            nearLocation = null;
                        }
                    }
                    if (location.RoadwayNo == "SC01_BC" && palletType != PalletTypeEnum.SmallPallet.ObjToInt())
                    {
                        nearLocation = locationInfos.FirstOrDefault(x => x.Row == location.Row && x.Layer == location.Layer && x.Depth == location.Depth && x.Column == location.Column - 1);
                        if (nearLocation?.LocationType == LocationTypeEnum.SmallPallet.ObjToInt())
                        {
                            nearLocation = null;
                        }
                    }
                    nearLocation1 = locationInfos.FirstOrDefault(x => x.LocationType == LocationTypeEnum.SmallPallet.ObjToInt() && x.Row == location.Row && x.Layer == location.Layer && x.Depth == location.Depth && x.Column == location.Column - 1);
                    nearLocation2 = locationInfos.FirstOrDefault(x => x.LocationType == LocationTypeEnum.SmallPallet.ObjToInt() && x.Row == location.Row && x.Layer == location.Layer && x.Depth == location.Depth && x.Column == location.Column + 1);
                    if (nearLocation != null)
                    if (nearLocation1 != null && nearLocation2 != null)
                    {
                        List<Dt_LocationInfo> nearLocations = GetGroupLocations(locationInfos, nearLocation);
                        //双辅料
                        List<Dt_LocationInfo> nearLocations = new List<Dt_LocationInfo>()
                        {
                            nearLocation1,
                            nearLocation2
                        };
                        for (int i = 0; i < nearLocations.Count; i++)
                        {
                            List<int> palletTypes = palletTypeInfos.Select(x => x.PalletType).ToList();
                            palletTypes.Add(0);
                            if (palletTypes.Contains(nearLocations[i].LocationType))
                            if (locationStatus == LocationStatusEnum.Lock)
                            {
                                if (nearLocations[i].LocationType != palletType)
                                if (nearLocations[i].LocationStatus == LocationStatusEnum.Free.ObjToInt())
                                {
                                    nearLocations[i].LocationType = palletType;
                                    nearLocations[i].LocationStatus = LocationStatusEnum.FreeLock.ObjToInt();
                                }
                                if (locationStatus == LocationStatusEnum.Lock)
                            }
                            else if (locationStatus == LocationStatusEnum.Free)
                            {
                                if (nearLocations[i].LocationStatus == LocationStatusEnum.FreeLock.ObjToInt())
                                {
                                    if (nearLocations[i].LocationStatus == LocationStatusEnum.InStock.ObjToInt())
                                    {
                                        nearLocations[i].LocationStatus = LocationStatusEnum.InStockLock.ObjToInt();
                                    }
                                    else if (nearLocations[i].LocationStatus == LocationStatusEnum.Free.ObjToInt())
                                    {
                                        nearLocations[i].LocationStatus = LocationStatusEnum.FreeLock.ObjToInt();
                                    }
                                }
                                else if (locationStatus == LocationStatusEnum.Free || locationStatus == LocationStatusEnum.InStock)
                                {
                                    if (nearLocations[i].LocationStatus == LocationStatusEnum.InStockLock.ObjToInt())
                                    {
                                        nearLocations[i].LocationStatus = LocationStatusEnum.InStock.ObjToInt();
                                    }
                                    else if (nearLocations[i].LocationStatus == LocationStatusEnum.FreeLock.ObjToInt())
                                    {
                                        nearLocations[i].LocationStatus = LocationStatusEnum.Free.ObjToInt();
                                    }
                                    nearLocations[i].LocationStatus = LocationStatusEnum.Free.ObjToInt();
                                }
                            }
                        }
                        locations.AddRange(nearLocations);
                    }
                }
            }
            else
            {
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_BasicService/SupplierInfoService.cs
@@ -39,19 +39,71 @@
            try
            {
                List<Dt_SupplierInfo> OldsupplierInfos = BaseDal.QueryData(x => x.InvOrgId == MaterielInvOrgEnum.老厂.ObjToInt());
                //判断重复插入
                Dt_SupplierInfo? ExistSupplier = OldsupplierInfos.FirstOrDefault(x => bSTSupplierDTOs.Where(x => x.Way == 1).Select(x => x.VendId).Contains(x.SupplierSourceId));
                if (ExistSupplier != null)
                //新增
                List<BSTSupplierDTO> bSTSupplierDTOsAdd = bSTSupplierDTOs.Where(x => x.Way == 1).ToList();
                //修改
                List<BSTSupplierDTO> bSTSupplierDTOsUpdate = bSTSupplierDTOs.Where(x => x.Way == 2).ToList();
                //删除
                List<BSTSupplierDTO> bSTSupplierDTOsDTODel = bSTSupplierDTOs.Where(x => x.Way == 3).ToList();
                List<Dt_SupplierInfo> supplierInfosAdd = new List<Dt_SupplierInfo>();
                List<Dt_SupplierInfo> supplierInfosUpdate = new List<Dt_SupplierInfo>();
                //新增
                if (bSTSupplierDTOsAdd.Count > 0)
                {
                    return content.Error($"物料Id{nameof(BSTSupplierDTO.VendId)}:{ExistSupplier.SupplierSourceId}已存在");
                    //判断重复插入
                    Dt_SupplierInfo? ExistSupplier = OldsupplierInfos.FirstOrDefault(x => bSTSupplierDTOsAdd.Select(x => x.VendId).Contains(x.SupplierSourceId));
                    if (ExistSupplier != null)
                    {
                        return content.Error($"供应商{nameof(BSTSupplierDTO.VendId)}:{ExistSupplier.SupplierSourceId}已存在");
                    }
                    foreach (var item in bSTSupplierDTOsAdd)
                    {
                        if (bSTSupplierDTOsUpdate.FirstOrDefault(x => x.VendId == item.VendId) != null)
                        {
                            continue;
                        }
                        Dt_SupplierInfo supplierInfo = _mapper.Map<Dt_SupplierInfo>(item);
                        supplierInfosAdd.Add(supplierInfo);
                    }
                }
                List<Dt_SupplierInfo> supplierInfos = new List<Dt_SupplierInfo>();
                foreach (var item in bSTSupplierDTOs)
                //更新
                if (bSTSupplierDTOsUpdate.Count > 0)
                {
                    Dt_SupplierInfo supplierInfo = _mapper.Map<Dt_SupplierInfo>(item);
                    supplierInfos.Add(supplierInfo);
                    //获取已存在的物料
                    List<Dt_SupplierInfo>? ExistbSTSuppliersUpdate = OldsupplierInfos.Where(x => bSTSupplierDTOsUpdate.Select(x => x.VendId).Contains(x.SupplierSourceId)).ToList();
                    foreach (var item in bSTSupplierDTOsUpdate)
                    {
                        Dt_SupplierInfo? supplierInfoUpdate = ExistbSTSuppliersUpdate.FirstOrDefault(x => x.SupplierSourceId == item.VendId);
                        //如果物料已存在则进行更改
                        if (supplierInfoUpdate != null)
                        {
                            supplierInfoUpdate.SupplierSourceId = item.VendId;
                            supplierInfoUpdate.SupplierCode = item.VendNo;
                            supplierInfoUpdate.SupplierShortName = item.ShortName;
                            supplierInfoUpdate.SupplierName = item.ShortName;
                            supplierInfoUpdate.Contacts = item.BusinessContact;
                            supplierInfoUpdate.ContactNumber = item.Tel;
                            supplierInfoUpdate.ContactAddress = item.Address;
                            supplierInfosUpdate.Add(supplierInfoUpdate);
                        }
                        else//如果不存在则进行新增
                        {
                            Dt_SupplierInfo supplierInfo = _mapper.Map<Dt_SupplierInfo>(item);
                            supplierInfosAdd.Add(supplierInfo);
                        }
                    }
                }
                BaseDal.AddData(supplierInfos);
                //删除
                if (bSTSupplierDTOsDTODel.Count > 0)
                {
                }
                //更新数据
                _unitOfWorkManage.CommitTran();
                BaseDal.AddData(supplierInfosAdd);
                BaseDal.UpdateData(supplierInfosUpdate);
                _unitOfWorkManage.CommitTran();
                content.OK("接收成功");
            }
            catch (Exception ex)
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_Common/LocationEnum/LocationStatusEnum.cs
@@ -30,7 +30,7 @@
        InStockLock = 10,
        /// <summary>
        /// æœ‰è´§é”å®š
        /// ç©ºé—²é”å®š
        /// </summary>
        [Description("空闲锁定")]
        FreeLock = 20,
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_Common/StockEnum/StockStatusMenu.cs
@@ -56,8 +56,10 @@
    /// <summary>
    /// æˆå“åº“存属性:<br/>
    /// 1:成品<br/>
    /// 2:尾数<br/>
    /// 3:研发<br/>
    /// 2:半成品<br/>
    /// 3:原材料<br/>
    /// 4:辅料备件<br/>
    /// 5:空托<br/>
    /// </summary>
    public enum ProStockAttributeEnum
    {
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_Common/WareHouseEnum/WarehouseEnum.cs
@@ -28,7 +28,11 @@
        /// è¾…料库
        /// </summary>
        [Description("辅料库")]
        LLDFL = 3
        LLDFL = 3,
        /// <summary>
        /// è€åŽ‚æš‚å­˜åŒº
        /// </summary>
        [Description("老厂暂存区")]
        LLDOldCache = 4
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_DTO/Basic/BSTSupplierDTO.cs
@@ -41,7 +41,7 @@
        /// <summary>
        /// å•†åŠ¡è”ç³»äºº
        /// </summary>
        [PropertyValidate("供应商简称", NotNullAndEmpty = true)]
        [PropertyValidate("summary", NotNullAndEmpty = true)]
        public string BusinessContact { get; set; }
        /// <summary>
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_DTO/ERP/BSTOutOrderDTO.cs
@@ -6,7 +6,7 @@
using System.Threading.Tasks;
using WIDESEA_Core.Attributes;
namespace WIDESEA_DTO.Basic
namespace WIDESEA_DTO.ERP
{
    /// <summary>
    /// åšæ€é€šé‡‡è´­å…¥åº“单接收实体
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_DTO/ERP/BSTPurchaseOrderDTO.cs
@@ -6,7 +6,7 @@
using System.Threading.Tasks;
using WIDESEA_Core.Attributes;
namespace WIDESEA_DTO.Basic
namespace WIDESEA_DTO.ERP
{
    /// <summary>
    /// åšæ€é€šé‡‡è´­å…¥åº“单接收实体
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_DTO/ERP/BSTReturnOrderDTO.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,103 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Core.Attributes;
namespace WIDESEA_DTO.ERP
{
    /// <summary>
    /// åšæ€é€šé€€æ–™æŽ¥æ”¶å®žä½“
    /// </summary>
    [ModelValidate]
    public class BSTReturnOrderDTO
    {
        /// <summary>
        /// æ•°æ®èŽ·å–æ–¹å¼æ ‡è¯†(1:新增 2:修改 3:删除)
        /// </summary>
        [PropertyValidate("数据获取方式标识(1:新增 2:修改 3:删除)", NotNullAndEmpty = true)]
        public int Way { get; set; }
        /// <summary>
        /// é€€æ–™å•ID
        /// </summary>
        [PropertyValidate("退料单ID", NotNullAndEmpty = true)]
        public int PaperWreturnId { get; set; }
        /// <summary>
        /// é€€æ–™å•编号
        /// </summary>
        [PropertyValidate("退料单编号", NotNullAndEmpty = true)]
        public string PaperWreturnNo { get; set; }
        /// <summary>
        /// é€€æ–™æ—¥æœŸ
        /// </summary>
        [PropertyValidate("退料日期", NotNullAndEmpty = true)]
        public long WreturnDate { get; set; }
        /// <summary>
        /// é€€æ–™å‘˜å·¥
        /// </summary>
        [PropertyValidate("退料员工", NotNullAndEmpty = false)]
        public string EmployeeName { get; set; }
        /// <summary>
        /// é€€æ–™æ˜Žç»†
        /// </summary>
        [PropertyValidate("退料明细", NotNullAndEmpty = true)]
        public List<BSTReturnOrderDTOItem> BstPaperWreturnDetails { get; set; }
    }
    /// <summary>
    /// é€€æ–™æ˜Žç»†
    /// </summary>
    public class BSTReturnOrderDTOItem
    {
        /// <summary>
        /// é€€æ–™ID
        /// </summary>
        [PropertyValidate("退料ID", NotNullAndEmpty = true)]
        public int PaperWreturnId { get; set; }
        /// <summary>
        /// ç‰©æ–™ID
        /// </summary>
        [PropertyValidate("物料ID", NotNullAndEmpty = true)]
        public int MaterialId { get; set; }
        /// <summary>
        /// ç‰©æ–™æ¡ç 
        /// </summary>
        [PropertyValidate("物料条码", NotNullAndEmpty = true)]
        public string Barcode { get; set; }
        /// <summary>
        /// ç‰©æ–™ç¼–号
        /// </summary>
        [PropertyValidate("物料编号", NotNullAndEmpty = true)]
        public string MaterialNo { get; set; }
        /// <summary>
        /// ç‰©æ–™æ‰¹æ¬¡åºå·
        /// </summary>
        [PropertyValidate("物料批次序号", NotNullAndEmpty = true)]
        public int SeqNo { get; set; }
        /// <summary>
        /// å¹…宽(mm)
        /// </summary>
        [PropertyValidate("幅宽(mm)", NotNullAndEmpty = true)]
        public decimal W { get; set; }
        /// <summary>
        /// ç›´å¾„
        /// </summary>
        [PropertyValidate("直径", NotNullAndEmpty = true)]
        public decimal Thick { get; set; }
        /// <summary>
        /// é•¿åº¦
        /// </summary>
        [PropertyValidate("长度", NotNullAndEmpty = true)]
        public decimal ProcurementLength { get; set; }
        /// <summary>
        /// é€€è´§æ•°é‡
        /// </summary>
        [PropertyValidate("退货数量", NotNullAndEmpty = true)]
        public decimal Qty { get; set; }
        /// <summary>
        /// å•位
        /// </summary>
        [PropertyValidate("单位", NotNullAndEmpty = true)]
        public string Unit { get; set; }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_External/ERPService/InvokeERPService.cs
@@ -28,7 +28,9 @@
        {
            ContractResolver = new CamelCasePropertyNamesContractResolver()
        };
        /// <summary>
        /// è°ƒç”¨ERP接口
        /// </summary>
        public string BSTPurchaseUp(BSTPurchaseUpModel bSTPurchaseUpModel)
        {
            Dt_ApiInfo apiInfo = _apiInfoRepository.QueryFirst(x=>x.ApiCode==APIEnum.BSTPurchaseUp.ToString());
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_External/Model/BSTPurchaseUpModel.cs
@@ -11,8 +11,21 @@
    /// </summary>
    public class BSTPurchaseUpModel
    {
        /// <summary>
        /// æ¡ç 
        /// </summary>
        public string Barcode { get; set; }
        /// <summary>
        /// æ•°é‡
        /// </summary>
        public int BarcodeQty { get; set;}
        /// <summary>
        /// RFID
        /// </summary>
        public string Rfid { get; set; }
        /// <summary>
        /// å…¥åº“æ—¶é—´
        /// </summary>
        public string RfidUpdateTime { get; set; }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_IInboundRepository/IReturnBSTOrderDetailRepository.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Core.BaseRepository;
using WIDESEA_Model.Models;
namespace WIDESEA_IInboundRepository
{
    /// <summary>
    /// é€€æ–™æ˜Žç»†ä»“储接口层
    /// </summary>
    public interface IReturnBSTOrderDetailRepository : IRepository<Dt_ReturnBSTOrderDetail>
    {
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_IInboundRepository/IReturnBSTOrderRepository.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Core.BaseRepository;
using WIDESEA_Model.Models;
namespace WIDESEA_IInboundRepository
{
    /// <summary>
    /// é€€æ–™å•仓储接口层
    /// </summary>
    public interface IReturnBSTOrderRepository : IRepository<Dt_ReturnBSTOrder>
    {
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_IInboundService/IPurchaseBSTOrderService.cs
@@ -6,7 +6,7 @@
using WIDESEA_Core;
using WIDESEA_Core.BaseServices;
using WIDESEA_DTO;
using WIDESEA_DTO.Basic;
using WIDESEA_DTO.ERP;
using WIDESEA_IInboundRepository;
using WIDESEA_Model.Models;
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_IInboundService/IReturnBSTOrderDetailService.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Core.BaseServices;
using WIDESEA_IInboundRepository;
using WIDESEA_Model.Models;
namespace WIDESEA_IInboundService
{
    public interface IReturnBSTOrderDetailService : IService<Dt_ReturnBSTOrderDetail>
    {
        IReturnBSTOrderDetailRepository Repository { get; }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_IInboundService/IReturnBSTOrderService.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Core;
using WIDESEA_Core.BaseServices;
using WIDESEA_DTO.ERP;
using WIDESEA_IInboundRepository;
using WIDESEA_Model.Models;
namespace WIDESEA_IInboundService
{
    public interface IReturnBSTOrderService : IService<Dt_ReturnBSTOrder>
    {
        IReturnBSTOrderRepository Repository { get; }
        /// <summary>
        /// æŽ¥æ”¶åšæ€é€šé€€æ–™ä¿¡æ¯
        /// </summary>
        /// <returns></returns>
        WebResponseContent ReceiveReturnOrder(List<BSTReturnOrderDTO> bSTReturnOrderDTOs);
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_ITaskInfoService/ITaskService.cs
@@ -171,16 +171,15 @@
        /// <summary>
        /// æˆå“å‡ºåº“
        /// </summary>
        /// <param name="Count"></param>
        /// <returns></returns>
        WebResponseContent RequestCPWMSTaskOut(int Count);
        WebResponseContent RequestCPWMSTaskOut(string materialCode, int Count,int targetId);
        /// <summary>
        /// æ— çººå¸ƒå‡ºåº“
        /// </summary>
        /// <param name="Count"></param>
        /// <returns></returns>
        WebResponseContent RequestWFBWMSTaskOut(int Count);
        ///// <summary>
        ///// æ— çººå¸ƒå‡ºåº“
        ///// </summary>
        ///// <param name="Count"></param>
        ///// <returns></returns>
        //WebResponseContent RequestWFBWMSTaskOut(int Count);
        /// <summary>
        /// åŽŸæ–™å‡ºåº“ä»»åŠ¡
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_InboundRepository/ReturnBSTOrderDetailRepository.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Core.BaseRepository;
using WIDESEA_IInboundRepository;
using WIDESEA_Model.Models;
namespace WIDESEA_InboundRepository
{
    /// <summary>
    /// é€€æ–™å•明细仓储实现层
    /// </summary>
    public class ReturnBSTOrderDetailRepository : RepositoryBase<Dt_ReturnBSTOrderDetail>, IReturnBSTOrderDetailRepository
    {
        public ReturnBSTOrderDetailRepository(IUnitOfWorkManage unitOfWorkManage) : base(unitOfWorkManage)
        {
        }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_InboundRepository/ReturnBSTOrderRepository.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Core.BaseRepository;
using WIDESEA_IInboundRepository;
using WIDESEA_Model.Models;
namespace WIDESEA_InboundRepository
{
    /// <summary>
    /// é€€æ–™å•仓储实现层
    /// </summary>
    public class ReturnBSTOrderRepository : RepositoryBase<Dt_ReturnBSTOrder>, IReturnBSTOrderRepository
    {
        public ReturnBSTOrderRepository(IUnitOfWorkManage unitOfWorkManage) : base(unitOfWorkManage)
        {
        }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_InboundService/PurchaseBSTOrderService.cs
@@ -15,7 +15,7 @@
using WIDESEA_Core.Enums;
using WIDESEA_Core.Helper;
using WIDESEA_DTO;
using WIDESEA_DTO.Basic;
using WIDESEA_DTO.ERP;
using WIDESEA_IBasicRepository;
using WIDESEA_IInboundRepository;
using WIDESEA_IInboundService;
@@ -67,6 +67,8 @@
                List<Dt_PurchaseBSTOrder> purchaseAddBSTOrders = new List<Dt_PurchaseBSTOrder>();
                List<Dt_PurchaseBSTOrder> purchaseUpdateBSTOrders = new List<Dt_PurchaseBSTOrder>();
                List<Dt_PurchaseBSTOrder> purchaseDeleteBSTOrders = new List<Dt_PurchaseBSTOrder>();
                List<Dt_PurchaseBSTOrderDetail> purchaseBSTOrderDetailsDel = new List<Dt_PurchaseBSTOrderDetail>();
                //新增
                if (bSTPurchaseOrderDTOsAdd.Count>0)
                {
                    //判断供应商
@@ -83,41 +85,73 @@
                    }
                    //验证条码重复
                    List<Dt_PurchaseBSTOrderDetail> purchaseBSTOrderDetails = OldpurchaseBSTOrders.SelectMany(x => x.Details).ToList();
                    List<PaperReceiptDetailsItem> paperReceiptDetailsItems = bSTPurchaseOrderDTOsAdd.SelectMany(x => x.PaperReceiptDetails).ToList();
                    var ExistDetail = purchaseBSTOrderDetails.FirstOrDefault(x => paperReceiptDetailsItems.Select(x => x.Barcode).Contains(x.Barcode));
                    List<PaperReceiptDetailsItem> paperReceiptDetailsItemsAdd = bSTPurchaseOrderDTOsAdd.SelectMany(x => x.PaperReceiptDetails).ToList();
                    var ExistDetail = purchaseBSTOrderDetails.FirstOrDefault(x => paperReceiptDetailsItemsAdd.Select(x => x.Barcode).Contains(x.Barcode));
                    if (ExistDetail!=null)
                    {
                        return content.Error($"采购条码{nameof(ExistDetail.Barcode)}:{ExistDetail.Barcode}已存在");
                    }
                    //判断是否存在物料
                    PaperReceiptDetailsItem? paperReceiptDetailsItem = paperReceiptDetailsItems.FirstOrDefault(x => !materielInfos.Select(x => x.MaterialSourceId).Contains(x.MaterialId));
                    PaperReceiptDetailsItem? paperReceiptDetailsItem = paperReceiptDetailsItemsAdd.FirstOrDefault(x => !materielInfos.Select(x => x.MaterialSourceId).Contains(x.MaterialId));
                    if (paperReceiptDetailsItem!=null)
                    {
                        return content.Error($"采购条码{nameof(ExistDetail.Barcode)}:{ExistDetail.Barcode}物料Id:{paperReceiptDetailsItem.MaterialId}不存在");
                        return content.Error($"采购条码{nameof(paperReceiptDetailsItem.Barcode)}:{paperReceiptDetailsItem.Barcode}物料Id:{paperReceiptDetailsItem.MaterialId}不存在");
                    }
                    foreach (var item in bSTPurchaseOrderDTOsAdd)
                    {
                        if (bSTPurchaseOrderDTOsUpdate.FirstOrDefault(x=>x.PaperReceiptId== item.PaperReceiptId)!=null)
                        {
                            continue;
                        }
                        List<Dt_PurchaseBSTOrderDetail> bSTOrderDetails = item.PaperReceiptDetails.Select(x=>_mapper.Map<Dt_PurchaseBSTOrderDetail>(x)).ToList();
                        Dt_PurchaseBSTOrder purchaseBSTOrder = _mapper.Map<Dt_PurchaseBSTOrder>(item);
                        purchaseBSTOrder.Details = bSTOrderDetails;
                        purchaseAddBSTOrders.Add(purchaseBSTOrder);
                    }
                }
                //更新
                if (bSTPurchaseOrderDTOsUpdate.Count > 0)
                {
                    List<Dt_PurchaseBSTOrder>? ExistUpdatePurchase = OldpurchaseBSTOrders.Where(x => bSTPurchaseOrderDTOsUpdate.Select(x => x.PaperReceiptId).Contains(x.PaperReceiptId)).ToList();
                    //更新的单据是否存在
                    if (ExistUpdatePurchase.Count == bSTPurchaseOrderDTOsUpdate.Count)
                    {
                    //存在的采购单
                    List<Dt_PurchaseBSTOrder>? ExistpurchaseBSTOrders = OldpurchaseBSTOrders.Where(x => bSTPurchaseOrderDTOsUpdate.Select(x => x.PaperReceiptId).Contains(x.PaperReceiptId)).Distinct().ToList();
                    }
                    else
                    foreach (var item in bSTPurchaseOrderDTOsUpdate)
                    {
                        BSTPurchaseOrderDTO? bSTPurchaseOrderDTO = bSTPurchaseOrderDTOsUpdate.FirstOrDefault(x => !ExistUpdatePurchase.Select(x => x.PaperReceiptId).Contains(x.PaperReceiptId));
                        return content.Error($"未找到指定采购收货单{nameof(BSTPurchaseOrderDTO.PaperReceiptId)}:{bSTPurchaseOrderDTO?.PaperReceiptId}");
                        Dt_PurchaseBSTOrder? purchaseBSTOrderUpdate = ExistpurchaseBSTOrders.FirstOrDefault(x => x.PaperReceiptId == item.PaperReceiptId);
                        //如果订单已存在则进行更改
                        if (purchaseBSTOrderUpdate != null)
                        {
                            if (purchaseBSTOrderUpdate.PurchaseOrderStatus!=InOrderStatusEnum.未开始.ObjToInt())
                            {
                                return content.Error($"采购{nameof(purchaseBSTOrderUpdate.PaperReceiptId)}:{purchaseBSTOrderUpdate.PaperReceiptId}订单入库中,不可更改");
                            }
                            purchaseBSTOrderDetailsDel.AddRange(purchaseBSTOrderUpdate.Details);
                            //更新
                            List<Dt_PurchaseBSTOrderDetail> bSTOrderDetails = item.PaperReceiptDetails.Select(x => _mapper.Map<Dt_PurchaseBSTOrderDetail>(x)).ToList();
                            bSTOrderDetails.ForEach(x =>
                            {
                                x.PurchaseBSTOrderId = purchaseBSTOrderUpdate.Id;
                            });
                            purchaseBSTOrderUpdate.Details = bSTOrderDetails;
                            purchaseBSTOrderUpdate.PaperReceiptId = item.PaperReceiptId;
                            purchaseBSTOrderUpdate.PaperReceiptNo = item.PaperReceiptNo;
                            purchaseBSTOrderUpdate.VendNo = item.VendNo;
                            purchaseBSTOrderUpdate.ReceiptDate = DateTimeOffset.FromUnixTimeMilliseconds(item.ReceiptDate).DateTime;
                            purchaseBSTOrderUpdate.TotalProcurementLength = item.TotalProcurementLength;
                            purchaseUpdateBSTOrders.Add(purchaseBSTOrderUpdate);
                        }
                        else //如果不存在则进行新增
                        {
                            List<Dt_PurchaseBSTOrderDetail> bSTOrderDetails = item.PaperReceiptDetails.Select(x => _mapper.Map<Dt_PurchaseBSTOrderDetail>(x)).ToList();
                            Dt_PurchaseBSTOrder purchaseBSTOrder = _mapper.Map<Dt_PurchaseBSTOrder>(item);
                            purchaseBSTOrder.Details = bSTOrderDetails;
                            purchaseAddBSTOrders.Add(purchaseBSTOrder);
                        }
                    }
                }
                //删除
                if (bSTPurchaseOrderDTOsDel.Count>0)
                {
                    List<Dt_PurchaseBSTOrder>? ExistDelPurchase = OldpurchaseBSTOrders.Where(x => bSTPurchaseOrderDTOsDel.Select(x => x.PaperReceiptId).Contains(x.PaperReceiptId)).ToList();
@@ -132,8 +166,11 @@
                        return content.Error($"未找到指定采购收货单{nameof(BSTPurchaseOrderDTO.PaperReceiptId)}:{bSTPurchaseOrderDTO?.PaperReceiptId}");
                    }
                }
                //更新数据
                _unitOfWorkManage.BeginTran();
                BaseDal.Db.InsertNav(purchaseAddBSTOrders).Include(x => x.Details).ExecuteCommand();
                _purchaseBSTOrderDetailRepository.DeleteData(purchaseBSTOrderDetailsDel);
                BaseDal.Db.UpdateNav(purchaseUpdateBSTOrders).Include(x => x.Details).ExecuteCommand();
                _unitOfWorkManage.CommitTran();
                content.OK("接收成功");
            }
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_InboundService/ReturnBSTOrderDetailService.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Core.BaseServices;
using WIDESEA_IInboundRepository;
using WIDESEA_IInboundService;
using WIDESEA_Model.Models;
namespace WIDESEA_InboundService
{
    public class ReturnBSTOrderDetailService : ServiceBase<Dt_ReturnBSTOrderDetail, IReturnBSTOrderDetailRepository>, IReturnBSTOrderDetailService
    {
        public IReturnBSTOrderDetailRepository Repository => BaseDal;
        public ReturnBSTOrderDetailService(IReturnBSTOrderDetailRepository BaseDal) : base(BaseDal)
        {
        }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_InboundService/ReturnBSTOrderService.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,164 @@
using AutoMapper;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Common.MaterielEnum;
using WIDESEA_Common.OrderEnum;
using WIDESEA_Common.WareHouseEnum;
using WIDESEA_Core;
using WIDESEA_Core.BaseRepository;
using WIDESEA_Core.BaseServices;
using WIDESEA_Core.Helper;
using WIDESEA_DTO.ERP;
using WIDESEA_IBasicRepository;
using WIDESEA_IInboundRepository;
using WIDESEA_IInboundService;
using WIDESEA_InboundRepository;
using WIDESEA_IStockRepository;
using WIDESEA_Model.Models;
namespace WIDESEA_InboundService
{
    public class ReturnBSTOrderService : ServiceBase<Dt_ReturnBSTOrder, IReturnBSTOrderRepository>, IReturnBSTOrderService
    {
        public IReturnBSTOrderRepository Repository => BaseDal;
        private IUnitOfWorkManage _unitOfWorkManage;
        private IBasicRepository _basicRepository;
        private IStockInfoRepository _stockInfoRepository;
        private IReturnBSTOrderDetailRepository _returnBSTOrderDetailRepository;
        private IMapper _mapper;
        public ReturnBSTOrderService(IReturnBSTOrderRepository BaseDal,IUnitOfWorkManage unitOfWorkManage,IBasicRepository basicRepository, IStockInfoRepository stockInfoRepository, IReturnBSTOrderDetailRepository returnBSTOrderDetailRepository, IMapper mapper) : base(BaseDal)
        {
            _unitOfWorkManage = unitOfWorkManage;
            _basicRepository = basicRepository;
            _stockInfoRepository = stockInfoRepository;
            _returnBSTOrderDetailRepository = returnBSTOrderDetailRepository;
            _mapper = mapper;
        }
        /// <summary>
        /// æŽ¥æ”¶åšæ€é€šé€€æ–™ä¿¡æ¯
        /// </summary>
        /// <returns></returns>
        public WebResponseContent ReceiveReturnOrder(List<BSTReturnOrderDTO> bSTReturnOrderDTOs)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                List<Dt_ReturnBSTOrder> OldreturnBSTOrders = BaseDal.Db.Queryable<Dt_ReturnBSTOrder>().Includes(x => x.Details).ToList();
                List<Dt_StockInfo> ExiststockInfos = _stockInfoRepository.QueryData(x=>x.WarehouseId==WarehouseEnum.LLDOldCache.ObjToInt());
                //新增
                List<BSTReturnOrderDTO> bSTReturnOrderDTOsAdd = bSTReturnOrderDTOs.Where(x => x.Way == 1).ToList();
                //修改
                List<BSTReturnOrderDTO> bSTReturnOrderDTOsUpdate = bSTReturnOrderDTOs.Where(x => x.Way == 2).ToList();
                //删除
                List<BSTReturnOrderDTO> bSTReturnOrderDTOsDel = bSTReturnOrderDTOs.Where(x => x.Way == 3).ToList();
                //获取所有物料
                List<Dt_MaterielInfo> materielInfos = _basicRepository.MaterielInfoRepository.QueryData(x => x.WarehouseId == WarehouseEnum.LLDYL.ObjToInt() && x.MaterielInvOrgId == MaterielInvOrgEnum.老厂.ObjToInt() && x.MaterialSourceId != 0);
                List<Dt_ReturnBSTOrder> returnAddBSTOrders = new List<Dt_ReturnBSTOrder>();
                List<Dt_ReturnBSTOrder> returnUpdateBSTOrders  = new List<Dt_ReturnBSTOrder>();
                List<Dt_ReturnBSTOrder> returnDeleteBSTOrders = new List<Dt_ReturnBSTOrder>();
                List<Dt_ReturnBSTOrderDetail> returnBSTOrderDetailsDel = new List<Dt_ReturnBSTOrderDetail>();
                List<Dt_StockInfo> stockInfosUpdate = new List<Dt_StockInfo>();
                //新增
                if (bSTReturnOrderDTOsAdd.Count > 0)
                {
                    //判断单据
                    Dt_ReturnBSTOrder? ExistAddReturn = OldreturnBSTOrders.FirstOrDefault(x => bSTReturnOrderDTOsAdd.Select(x => x.PaperWreturnId).Contains(x.PaperWreturnId));
                    if (ExistAddReturn != null)
                    {
                        return content.Error($"退料单{nameof(BSTReturnOrderDTO.PaperWreturnId)}:{ExistAddReturn.PaperWreturnId}已存在");
                    }
                    List<BSTReturnOrderDTOItem> bSTReturnOrderDTOItemsAdd = bSTReturnOrderDTOsAdd.SelectMany(x => x.BstPaperWreturnDetails).ToList();
                    //判断是否存在物料
                    BSTReturnOrderDTOItem? bSTReturnOrderDTOItem = bSTReturnOrderDTOItemsAdd.FirstOrDefault(x => !materielInfos.Select(x => x.MaterialSourceId).Contains(x.MaterialId));
                    if (bSTReturnOrderDTOItem != null)
                    {
                        return content.Error($"退料{nameof(bSTReturnOrderDTOItem.Barcode)}:{bSTReturnOrderDTOItem.Barcode}物料{nameof(BSTReturnOrderDTOItem.MaterialId)}:{bSTReturnOrderDTOItem.MaterialId}不存在");
                    }
                    //验证退料条码是否在库存中
                    var ExiststockInfo = bSTReturnOrderDTOItemsAdd.FirstOrDefault(x => !ExiststockInfos.Select(x => x.PalletCode).Contains(x.Barcode));
                    if (ExiststockInfo != null)
                    {
                        return content.Error($"退料条码{nameof(ExiststockInfo.Barcode)}:{ExiststockInfo.Barcode}物料未在老厂暂存区");
                    }
                    //获取对应库存修正库存数量
                    List<Dt_StockInfo> returnStockinfos = ExiststockInfos.Where(x => bSTReturnOrderDTOItemsAdd.Select(x => x.Barcode).Contains(x.PalletCode)).ToList();
                    foreach (var item in bSTReturnOrderDTOsAdd)
                    {
                        if (bSTReturnOrderDTOsUpdate.FirstOrDefault(x => x.PaperWreturnId == item.PaperWreturnId) != null)
                        {
                            continue;
                        }
                        List<Dt_ReturnBSTOrderDetail> bSTOrderDetails = item.BstPaperWreturnDetails.Select(x => _mapper.Map<Dt_ReturnBSTOrderDetail>(x)).ToList();
                        Dt_ReturnBSTOrder returnBSTOrder = _mapper.Map<Dt_ReturnBSTOrder>(item);
                        returnBSTOrder.Details = bSTOrderDetails;
                        returnAddBSTOrders.Add(returnBSTOrder);
                    }
                }
                //更新
                if (bSTReturnOrderDTOsUpdate.Count > 0)
                {
                    //存在的采购单
                    List<Dt_ReturnBSTOrder>? ExistreturnBSTOrders = OldreturnBSTOrders.Where(x => bSTReturnOrderDTOsUpdate.Select(x => x.PaperWreturnId).Contains(x.PaperWreturnId)).Distinct().ToList();
                    foreach (var item in bSTReturnOrderDTOsUpdate)
                    {
                        Dt_ReturnBSTOrder? returnBSTOrderUpdate = ExistreturnBSTOrders.FirstOrDefault(x => x.PaperWreturnId == item.PaperWreturnId);
                        //如果订单已存在则进行更改
                        if (returnBSTOrderUpdate != null)
                        {
                            if (returnBSTOrderUpdate.ReturnOrderStatus != InOrderStatusEnum.未开始.ObjToInt())
                            {
                                return content.Error($"退料{nameof(returnBSTOrderUpdate.PaperWreturnId)}:{returnBSTOrderUpdate.PaperWreturnId}订单退料入库中,不可更改");
                            }
                            returnBSTOrderDetailsDel.AddRange(returnBSTOrderUpdate.Details);
                            //更新
                            List<Dt_ReturnBSTOrderDetail> bSTOrderDetails = item.BstPaperWreturnDetails.Select(x => _mapper.Map<Dt_ReturnBSTOrderDetail>(x)).ToList();
                            bSTOrderDetails.ForEach(x =>
                            {
                                x.ReturnBSTOrderId = returnBSTOrderUpdate.Id;
                            });
                            returnBSTOrderUpdate.Details = bSTOrderDetails;
                            returnBSTOrderUpdate.PaperWreturnId = item.PaperWreturnId;
                            returnBSTOrderUpdate.PaperWreturnNo = item.PaperWreturnNo;
                            returnBSTOrderUpdate.EmployeeName = item.EmployeeName;
                            returnBSTOrderUpdate.WreturnDate = DateTimeOffset.FromUnixTimeMilliseconds(item.WreturnDate).DateTime;
                            returnUpdateBSTOrders.Add(returnBSTOrderUpdate);
                        }
                        else //如果不存在则进行新增
                        {
                            List<Dt_ReturnBSTOrderDetail> bSTOrderDetails = item.BstPaperWreturnDetails.Select(x => _mapper.Map<Dt_ReturnBSTOrderDetail>(x)).ToList();
                            Dt_ReturnBSTOrder returnBSTOrder = _mapper.Map<Dt_ReturnBSTOrder>(item);
                            returnBSTOrder.Details = bSTOrderDetails;
                            returnAddBSTOrders.Add(returnBSTOrder);
                        }
                    }
                }
                //删除
                if (bSTReturnOrderDTOsDel.Count > 0)
                {
                }
                //更新数据
                _unitOfWorkManage.BeginTran();
                BaseDal.Db.InsertNav(returnAddBSTOrders).Include(x => x.Details).ExecuteCommand();
                _returnBSTOrderDetailRepository.DeleteData(returnBSTOrderDetailsDel);
                BaseDal.Db.UpdateNav(returnUpdateBSTOrders).Include(x => x.Details).ExecuteCommand();
                _unitOfWorkManage.CommitTran();
                content.OK("接收成功");
            }
            catch (Exception ex)
            {
                _unitOfWorkManage.RollbackTran();
                content.Error(ex.Message);
            }
            return content;
        }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_Model/Models/Basic/Dt_AGVStationInfo.cs
@@ -9,7 +9,7 @@
namespace WIDESEA_Model.Models
{
    /// <summary>
    /// æŽ¥å£ä¿¡æ¯
    /// AGV站点信息表
    /// </summary>
    [SugarTable(nameof(Dt_AGVStationInfo), "AGV站点信息表")]
    public class Dt_AGVStationInfo : BaseEntity
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_Model/Models/Inbound/Dt_PurchaseBSTOrder.cs
@@ -12,7 +12,7 @@
    /// <summary>
    /// BST采购入库单
    /// </summary>
    [SugarTable(nameof(Dt_PurchaseBSTOrder), "BST采购入库单"), ModelValidate]
    [SugarTable(nameof(Dt_PurchaseBSTOrder), "BST采购入库单")]
    public class Dt_PurchaseBSTOrder : BaseEntity
    {
        /// <summary>
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_Model/Models/Inbound/Dt_PurchaseBSTOrderDetail.cs
@@ -12,7 +12,7 @@
    /// <summary>
    /// BST采购入库单明细
    /// </summary>
    [SugarTable(nameof(Dt_PurchaseBSTOrderDetail), "BST采购入库单明细"), ModelValidate]
    [SugarTable(nameof(Dt_PurchaseBSTOrderDetail), "BST采购入库单明细")]
    public class Dt_PurchaseBSTOrderDetail : BaseEntity
    {
        /// <summary>
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_Model/Models/Inbound/Dt_ReturnBSTOrder.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,85 @@
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Core.Attributes;
using WIDESEA_Core.CodeConfigEnum;
using WIDESEA_Core.DB.Models;
namespace WIDESEA_Model.Models
{
    /// <summary>
    /// BST退料单
    /// </summary>
    [SugarTable(nameof(Dt_ReturnBSTOrder), "BST退料单")]
    public class Dt_ReturnBSTOrder : BaseEntity
    {
        /// <summary>
        /// ä¸»é”®
        /// </summary>
        [SugarColumn(IsPrimaryKey = true, IsIdentity = true, ColumnDescription = "主键")]
        public int Id { get; set; }
        /// <summary>
        /// ä»“库主键
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "仓库主键")]
        public int WarehouseId { get; set; }
        /// <summary>
        /// é€€æ–™å•来源ID
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "退料单来源ID")]
        public int PaperWreturnId { get; set; }
        /// <summary>
        /// WMS单据编号
        /// </summary>
        [CodeRule(RuleCodeEnum.TLCodeRule)]
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "WMS单据编号", IsOnlyIgnoreUpdate = true)]
        public string ReturnInboundNo { get; set; }
        /// <summary>
        /// é€€æ–™å•编号(上游)
        /// </summary>
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "退料单编号(上游)")]
        public string PaperWreturnNo { get; set; }
        /// <summary>
        /// é€€æ–™å‘˜å·¥
        /// </summary>
        [SugarColumn(IsNullable = true, Length = 50, ColumnDescription = "退料员工")]
        public string EmployeeName { get; set; }
        /// <summary>
        /// é€€æ–™æ€»é•¿åº¦
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "退料总长度")]
        public decimal TotalPaperWreturnLength { get; set; }
        /// <summary>
        /// é€€æ–™å•状态
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "退料单入库状态")]
        public int ReturnOrderStatus { get; set; }
        /// <summary>
        /// é€€æ–™æ—¥æœŸ
        /// </summary>
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "退料日期")]
        public DateTime WreturnDate { get; set; }
        /// <summary>
        /// å¤‡æ³¨
        /// </summary>
        [SugarColumn(IsNullable = true, Length = 200, ColumnDescription = "备注")]
        public string Remark { get; set; }
        /// <summary>
        /// é‡‡è´­åˆ—表
        /// </summary>
        [Navigate(NavigateType.OneToMany, nameof(Dt_ReturnBSTOrderDetail.ReturnBSTOrderId), nameof(Id))]
        public List<Dt_ReturnBSTOrderDetail> Details { get; set; }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_Model/Models/Inbound/Dt_ReturnBSTOrderDetail.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,101 @@
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Core.DB.Models;
namespace WIDESEA_Model.Models
{
    /// <summary>
    /// BST退料单明细
    /// </summary>
    [SugarTable(nameof(Dt_ReturnBSTOrderDetail), "BST退料单明细")]
    public class Dt_ReturnBSTOrderDetail : BaseEntity
    {
        /// <summary>
        /// ä¸»é”®
        /// </summary>
        [SugarColumn(IsPrimaryKey = true, IsIdentity = true, ColumnDescription = "主键")]
        public int Id { get; set; }
        /// <summary>
        /// å¤´è¡¨ä¸»é”®
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "头表主键")]
        public int ReturnBSTOrderId { get; set; }
        /// <summary>
        /// é€€æ–™æ¥æºID
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "退料来源ID")]
        public int PaperWreturnId { get; set; }
        /// <summary>
        /// ç‰©æ–™æ¥æºID(上游)
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "物料来源ID(上游)")]
        public int MaterialId { get; set; }
        /// <summary>
        /// ç‰©æ–™æ¡ç 
        /// </summary>
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "物料条码")]
        public string Barcode { get; set; }
        /// <summary>
        /// ç‰©æ–™ç¼–号
        /// </summary>
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "物料编号")]
        public string MaterialNo { get; set; }
        /// <summary>
        /// æ‰¹æ¬¡åºåˆ—号
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "批次序列号")]
        public int SeqNo { get; set; }
        /// <summary>
        /// å¹…宽
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "幅宽")]
        public decimal MaterialWide { get; set; }
        /// <summary>
        /// ç›´å¾„
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "直径")]
        public decimal MaterialThick { get; set; }
        /// <summary>
        /// é€€æ–™é•¿åº¦
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "退料长度")]
        public decimal ProcurementLength { get; set; }
        /// <summary>
        /// é€€è´§æ•°é‡
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "退货数量")]
        public decimal Qty { get; set; }
        /// <summary>
        /// é€€æ–™å•明细状态
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "退料单明细状态")]
        public int ReturnBSTOrderDetailStatus { get; set; }
        /// <summary>
        /// å•位
        /// </summary>
        [SugarColumn(IsNullable = false, Length = 20, ColumnDescription = "单位")]
        public string Unit { get; set; }
        /// <summary>
        /// ç‰©æ–™åç§°
        /// </summary>
        [SugarColumn(IsNullable = true, Length = 200, ColumnDescription = "物料名称")]
        public string MaterielName { get; set; }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_OutboundService/OutBSTOrderService.cs
@@ -5,12 +5,13 @@
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Common.MaterielEnum;
using WIDESEA_Common.OrderEnum;
using WIDESEA_Common.WareHouseEnum;
using WIDESEA_Core;
using WIDESEA_Core.BaseRepository;
using WIDESEA_Core.BaseServices;
using WIDESEA_Core.Helper;
using WIDESEA_DTO.Basic;
using WIDESEA_DTO.ERP;
using WIDESEA_IBasicRepository;
using WIDESEA_IOutboundRepository;
using WIDESEA_IOutboundService;
@@ -24,12 +25,14 @@
        private readonly IBasicRepository _basicRepository;
        private readonly IMapper _mapper;
        private readonly IUnitOfWorkManage _unitOfWorkManage;
        private readonly IOutBSTOrderDetailRepository _outBSTOrderDetailRepository;
        public OutBSTOrderService(IOutBSTOrderRepository BaseDal,IBasicRepository basicRepository,IMapper mapper,IUnitOfWorkManage unitOfWorkManage) : base(BaseDal)
        public OutBSTOrderService(IOutBSTOrderRepository BaseDal,IBasicRepository basicRepository,IMapper mapper,IUnitOfWorkManage unitOfWorkManage,IOutBSTOrderDetailRepository outBSTOrderDetailRepository) : base(BaseDal)
        {
            _basicRepository = basicRepository;
            _mapper = mapper;
            _unitOfWorkManage = unitOfWorkManage;
            _outBSTOrderDetailRepository = outBSTOrderDetailRepository;
        }
        /// <summary>
        /// æ·»åŠ å‡ºåº“æŽ’ç¨‹ä¿¡æ¯
@@ -53,6 +56,7 @@
                List<Dt_OutBSTOrder> outBSTAddOrders = new List<Dt_OutBSTOrder>();
                List<Dt_OutBSTOrder> outBSTUpOrders = new List<Dt_OutBSTOrder>();
                List<Dt_OutBSTOrder> outBSTDelOrders = new List<Dt_OutBSTOrder>();
                List<Dt_OutBSTOrderDetail> outBSTOrderDetailsDel = new List<Dt_OutBSTOrderDetail>();
                //新增
                if (outOrderDTOsAdd.Count>0)
                {
@@ -62,8 +66,8 @@
                    {
                        return content.Error($"出库排程Id{nameof(BSTOutOrderDTO.BoardMpsId)}:{ExistAddOutOrder.BoardMpsId}已存在");
                    }
                    List<BstBoardMpsDetailItem> bstBoardMpsDetailItems = outOrderDTOsAdd.SelectMany(x => x.BstBoardMpsDetails).ToList();
                    //判断是否存在物料
                    List<BstBoardMpsDetailItem> bstBoardMpsDetailItems = outOrderDTOsAdd.SelectMany(x => x.BstBoardMpsDetails).ToList();
                    BstBoardMpsDetailItem? bstBoardMpsDetailItem = bstBoardMpsDetailItems.FirstOrDefault(x => !materielInfos.Select(x => x.MaterialSourceId).Contains(x.MaterialId));
                    if (bstBoardMpsDetailItem != null)
                    {
@@ -71,6 +75,10 @@
                    }
                    foreach (var item in outOrderDTOsAdd)
                    {
                        if (outOrderDTOsUpdate.FirstOrDefault(x => x.BoardMpsId == item.BoardMpsId) != null)
                        {
                            continue;
                        }
                        List<Dt_OutBSTOrderDetail> bSTOrderDetails = item.BstBoardMpsDetails.Select(x => _mapper.Map<Dt_OutBSTOrderDetail>(x)).ToList();
                        Dt_OutBSTOrder outBSTOrder = _mapper.Map<Dt_OutBSTOrder>(item);
                        outBSTOrder.Details=bSTOrderDetails;
@@ -80,16 +88,38 @@
                //修改
                if (outOrderDTOsUpdate.Count > 0)
                {
                    List<Dt_OutBSTOrder>? ExistUpdateoutBSTOrders = OldoutBSTOrders.Where(x => outOrderDTOsUpdate.Select(x => x.BoardMpsId).Contains(x.BoardMpsId)).ToList();
                    //更新的单据是否存在
                    if (ExistUpdateoutBSTOrders.Count == outOrderDTOsUpdate.Count)
                    List<Dt_OutBSTOrder>? ExistUpdateOutBSTOrders = OldoutBSTOrders.Where(x => outOrderDTOsUpdate.Select(x => x.BoardMpsId).Contains(x.BoardMpsId)).ToList();
                    foreach (var item in outOrderDTOsUpdate)
                    {
                    }
                    else
                    {
                        BSTOutOrderDTO? bSTOutOrderDTO = outOrderDTOsUpdate.FirstOrDefault(x => !ExistUpdateoutBSTOrders.Select(x => x.BoardMpsId).Contains(x.BoardMpsId));
                        return content.Error($"未找到指定生产排程单Id{nameof(BSTOutOrderDTO.BoardMpsId)}:{bSTOutOrderDTO?.BoardMpsId}");
                        Dt_OutBSTOrder? outBSTOrderUpdate = ExistUpdateOutBSTOrders.FirstOrDefault(x=>x.BoardMpsId==item.BoardMpsId);
                        //如果订单已存在则进行更改
                        if (outBSTOrderUpdate != null)
                        {
                            if (outBSTOrderUpdate.OutBSTOrderStatus != OutOrderStatusEnum.未开始.ObjToInt())
                            {
                                return content.Error($"采购{nameof(outBSTOrderUpdate.BoardMpsId)}:{outBSTOrderUpdate.BoardMpsId}订单出库中,不可更改");
                            }
                            //更新数据
                            outBSTOrderDetailsDel.AddRange(outBSTOrderUpdate.Details);
                            List<Dt_OutBSTOrderDetail> bSTOrderDetails = item.BstBoardMpsDetails.Select(x => _mapper.Map<Dt_OutBSTOrderDetail>(x)).ToList();
                            bSTOrderDetails.ForEach(x =>
                            {
                                x.OutBSTOrderId = outBSTOrderUpdate.Id;
                            });
                            outBSTOrderUpdate.Details = bSTOrderDetails;
                            outBSTOrderUpdate.BoardMpsId= item.BoardMpsId;
                            outBSTOrderUpdate.BoardMpsNo= item.BoardMpsNo;
                            outBSTOrderUpdate.ProductionDate = DateTimeOffset.FromUnixTimeMilliseconds(item.ProductionDate).DateTime;
                            outBSTUpOrders.Add(outBSTOrderUpdate);
                        }
                        else//如果不存在则进行新增
                        {
                            List<Dt_OutBSTOrderDetail> bSTOrderDetails = item.BstBoardMpsDetails.Select(x => _mapper.Map<Dt_OutBSTOrderDetail>(x)).ToList();
                            Dt_OutBSTOrder outBSTOrder = _mapper.Map<Dt_OutBSTOrder>(item);
                            outBSTOrder.Details = bSTOrderDetails;
                            outBSTAddOrders.Add(outBSTOrder);
                        }
                    }
                }
                //删除
@@ -109,6 +139,8 @@
                }
                _unitOfWorkManage.BeginTran();
                BaseDal.Db.InsertNav(outBSTAddOrders).Include(x => x.Details).ExecuteCommand();
                _outBSTOrderDetailRepository.DeleteData(outBSTOrderDetailsDel);
                BaseDal.Db.UpdateNav(outBSTUpOrders).Include(x => x.Details).ExecuteCommand();
                _unitOfWorkManage.CommitTran();
                content.OK("接收成功");
            }
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_StockService/StockInfoService.cs
@@ -71,7 +71,7 @@
                var weight = saveModel.MainData["weight"].ObjToInt();
                //幅宽
                var wide = saveModel.MainData["wide"].ObjToInt();
                Dt_MaterielInfo? materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x=>x.MaterielCode== materSn);
                Dt_MaterielInfo? materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.MaterielCode == materSn);
                if (materielInfo==null)
                {
                    return content.Error("未找到物料信息");
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_TaskInfoService/TaskService_Inbound.cs
@@ -277,28 +277,59 @@
                }
                string roadwayNo = "";
                //限制直径
                if (stockInfo.MaterielThickness > 800)
                if (stockInfo.MaterielInvOrgId==MaterielInvOrgEnum.新厂.ObjToInt())
                {
                    //获取分配
                    List<LocationCount> locationCounts = Db.Queryable<Dt_LocationInfo>().Where(x => x.WarehouseId == warehouse.WarehouseId && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && (x.EnableStatus == EnableStatusEnum.OnlyIn.ObjToInt() || x.EnableStatus == EnableStatusEnum.Normal.ObjToInt()) && x.RoadwayNo.Contains("YL")).GroupBy(x => x.RoadwayNo).Select(x => new LocationCount { RoadwayNo = x.RoadwayNo, Count = SqlFunc.AggregateCount(x) }).ToList();
                    if (stockInfo.MaterielWide > 2200)
                    //限制直径
                    if (stockInfo.MaterielThickness <= 1200)
                    {
                        locationCounts = Db.Queryable<Dt_LocationInfo>().Where(x => x.WarehouseId == warehouse.WarehouseId && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && (x.EnableStatus == EnableStatusEnum.OnlyIn.ObjToInt() || x.EnableStatus == EnableStatusEnum.Normal.ObjToInt()) && x.RoadwayNo=="SC02_YL").GroupBy(x => x.RoadwayNo).Select(x => new LocationCount { RoadwayNo = x.RoadwayNo, Count = SqlFunc.AggregateCount(x) }).ToList();
                    }
                    List<LocationCount> useLocationCounts = Db.Queryable<Dt_Task>().Where(x => x.WarehouseId == warehouse.WarehouseId
                    && locationCounts.Select(j => j.RoadwayNo).Contains(x.Roadway)
                    && TaskInboundTypes.Contains(x.TaskType)).GroupBy(x => x.Roadway).Select(x => new LocationCount { RoadwayNo = x.Roadway, Count = SqlFunc.AggregateCount(x) }).ToList();
                    foreach (var item in locationCounts)
                    {
                        LocationCount? count = useLocationCounts.FirstOrDefault(x => x.RoadwayNo == item.RoadwayNo);
                        if (count != null)
                        //获取分配
                        List<LocationCount> locationCounts = Db.Queryable<Dt_LocationInfo>().Where(x => x.WarehouseId == warehouse.WarehouseId && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && (x.EnableStatus == EnableStatusEnum.OnlyIn.ObjToInt() || x.EnableStatus == EnableStatusEnum.Normal.ObjToInt()) && x.RoadwayNo.Contains("YLDual")).GroupBy(x => x.RoadwayNo).Select(x => new LocationCount { RoadwayNo = x.RoadwayNo, Count = SqlFunc.AggregateCount(x) }).ToList();
                        //巷道任务分配数量
                        List<LocationCount> useLocationCounts = Db.Queryable<Dt_Task>().Where(x => x.WarehouseId == warehouse.WarehouseId
                        && locationCounts.Select(j => j.RoadwayNo).Contains(x.Roadway)
                        && TaskInboundTypes.Contains(x.TaskType)).GroupBy(x => x.Roadway).Select(x => new LocationCount { RoadwayNo = x.Roadway, Count = SqlFunc.AggregateCount(x) }).ToList();
                        foreach (var item in locationCounts)
                        {
                            item.Count -= count.Count;
                            LocationCount? count = useLocationCounts.FirstOrDefault(x => x.RoadwayNo == item.RoadwayNo);
                            if (count != null)
                            {
                                item.Count -= count.Count;
                            }
                        }
                        roadwayNo = locationCounts.OrderByDescending(x => x.Count).FirstOrDefault()?.RoadwayNo ?? "";
                    }
                    roadwayNo = locationCounts.OrderByDescending(x => x.Count).FirstOrDefault()?.RoadwayNo ?? "";
                }
                else
                {
                    //限制直径
                    if (stockInfo.MaterielThickness >= 800 && stockInfo.MaterielThickness <= 1500)
                    {
                        //获取分配
                        List<LocationCount> locationCounts = Db.Queryable<Dt_LocationInfo>().Where(x => x.WarehouseId == warehouse.WarehouseId && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && (x.EnableStatus == EnableStatusEnum.OnlyIn.ObjToInt() || x.EnableStatus == EnableStatusEnum.Normal.ObjToInt()) && x.RoadwayNo.Contains("YL") && !x.RoadwayNo.Contains("YLDual")).GroupBy(x => x.RoadwayNo).Select(x => new LocationCount { RoadwayNo = x.RoadwayNo, Count = SqlFunc.AggregateCount(x) }).ToList();
                        if (stockInfo.MaterielWide > 2200)
                        {
                            locationCounts = Db.Queryable<Dt_LocationInfo>().Where(x => x.WarehouseId == warehouse.WarehouseId && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && (x.EnableStatus == EnableStatusEnum.OnlyIn.ObjToInt() || x.EnableStatus == EnableStatusEnum.Normal.ObjToInt()) && x.RoadwayNo == "SC02_YL").GroupBy(x => x.RoadwayNo).Select(x => new LocationCount { RoadwayNo = x.RoadwayNo, Count = SqlFunc.AggregateCount(x) }).ToList();
                        }
                        //巷道任务分配数量
                        List<LocationCount> useLocationCounts = Db.Queryable<Dt_Task>().Where(x => x.WarehouseId == warehouse.WarehouseId
                        && locationCounts.Select(j => j.RoadwayNo).Contains(x.Roadway)
                        && TaskInboundTypes.Contains(x.TaskType)).GroupBy(x => x.Roadway).Select(x => new LocationCount { RoadwayNo = x.Roadway, Count = SqlFunc.AggregateCount(x) }).ToList();
                        foreach (var item in locationCounts)
                        {
                            LocationCount? count = useLocationCounts.FirstOrDefault(x => x.RoadwayNo == item.RoadwayNo);
                            if (count != null)
                            {
                                item.Count -= count.Count;
                            }
                        }
                        roadwayNo = locationCounts.OrderByDescending(x => x.Count).FirstOrDefault()?.RoadwayNo ?? "";
                    }
                }
                return !string.IsNullOrEmpty(roadwayNo) ? (roadwayNo) : throw new Exception("未找到可分配巷道");
            }
            catch (Exception ex)
@@ -316,7 +347,7 @@
            try
            {
                Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseId == task.WarehouseId);
                if (warehouse.WarehouseCode == WarehouseEnum.LLDCP.ToString()) //成品完成
                if (warehouse.WarehouseCode == WarehouseEnum.LLDCP.ToString() || warehouse.WarehouseCode == WarehouseEnum.LLDFL.ToString()) //成品/辅料完成
                {
                    Dt_LocationInfo locationInfoEnd = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == task.TargetAddress);
                    if (locationInfoEnd == null)
@@ -396,21 +427,23 @@
                    _stockService.StockInfoService.Repository.UpdateData(stockInfo);
                    _basicService.LocationInfoService.UpdateLocationStatus(locationInfoEnd, stockInfo.PalletType, LocationStatusEnum.InStock, stockInfo.WarehouseId);
                    BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId > 0 ? WIDESEA_Core.Enums.OperateTypeEnum.人工完成 : WIDESEA_Core.Enums.OperateTypeEnum.自动完成);
                    //if (stockInfo.MaterielInvOrgId==MaterielInvOrgEnum.老厂.ObjToInt())
                    //{
                    //    int Qty = Convert.ToInt32(stockInfo.MaterielWeight);
                    //    BSTPurchaseUpModel bSTPurchaseUpModel = new BSTPurchaseUpModel()
                    //    {
                    //        Barcode = stockInfo.PalletCode,
                    //        BarcodeQty = Qty,
                    //        Rfid = stockInfo.PalletCode
                    //    };
                    //    BSTResponse bSTResponse = _invokeERPService.BSTPurchaseUp(bSTPurchaseUpModel).DeserializeObject<BSTResponse>();
                    //    if (bSTResponse.Code==500)
                    //    {
                    //        throw new Exception($"BST一期ERP同步入库信息失败,错误信息{bSTResponse.Msg}");
                    //    }
                    //}
                    //上报老厂ERP
                    if (stockInfo.MaterielInvOrgId == MaterielInvOrgEnum.老厂.ObjToInt())
                    {
                        int Qty = Convert.ToInt32(stockInfo.MaterielWeight);
                        BSTPurchaseUpModel bSTPurchaseUpModel = new BSTPurchaseUpModel()
                        {
                            Barcode = stockInfo.PalletCode,
                            BarcodeQty = Qty,
                            Rfid = stockInfo.PalletCode,
                            RfidUpdateTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
                        };
                        BSTResponse bSTResponse = _invokeERPService.BSTPurchaseUp(bSTPurchaseUpModel).DeserializeObject<BSTResponse>();
                        if (bSTResponse.Code == 500)
                        {
                            throw new Exception($"BST一期ERP同步入库信息失败,错误信息:{bSTResponse.Msg}");
                        }
                    }
                    _unitOfWorkManage.CommitTran();
                }
                return content.OK();
@@ -430,16 +463,11 @@
        {
            try
            {
                Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseId == 2);
                if (warehouse == null)
                {
                    throw new Exception($"未找到巷道对应仓库信息");
                }
                string roadwayNo = "";
                List<LocationCount> locationCounts = Db.Queryable<Dt_LocationInfo>().Where(x => x.WarehouseId == warehouse.WarehouseId && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && (x.EnableStatus == EnableStatusEnum.OnlyIn.ObjToInt() || x.EnableStatus == EnableStatusEnum.Normal.ObjToInt()) && x.RoadwayNo.Contains("CP")).GroupBy(x => x.RoadwayNo).Select(x => new LocationCount { RoadwayNo = x.RoadwayNo, Count = SqlFunc.AggregateCount(x) }).ToList();
                //获取巷道可分配的货位数量
                List<LocationCount> locationCounts = Db.Queryable<Dt_LocationInfo>().Where(x => x.WarehouseId == WarehouseEnum.LLDCP.ObjToInt() && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && (x.EnableStatus == EnableStatusEnum.OnlyIn.ObjToInt() || x.EnableStatus == EnableStatusEnum.Normal.ObjToInt()) && x.RoadwayNo.Contains("CP")).GroupBy(x => x.RoadwayNo).Select(x => new LocationCount { RoadwayNo = x.RoadwayNo, Count = SqlFunc.AggregateCount(x) }).ToList();
                //筛选当前入库任务中已分配巷道任务数量
                List<LocationCount> useLocationCounts = Db.Queryable<Dt_Task>().Where(x => x.WarehouseId == warehouse.WarehouseId
                List<LocationCount> useLocationCounts = Db.Queryable<Dt_Task>().Where(x => (x.WarehouseId == WarehouseEnum.LLDCP.ObjToInt()|| x.WarehouseId == WarehouseEnum.LLDFL.ObjToInt())
                && locationCounts.Select(j=>j.RoadwayNo).Contains(x.Roadway)
                && TaskInboundTypes.Contains(x.TaskType)).GroupBy(x => x.Roadway).Select(x => new LocationCount { RoadwayNo = x.Roadway, Count = SqlFunc.AggregateCount(x) }).ToList();
                foreach (var item in locationCounts)
@@ -450,6 +478,7 @@
                        item.Count -= count.Count;
                    }
                }
                //通过可用货位数量排序,最多的优先分配
                roadwayNo = locationCounts.OrderByDescending(x => x.Count).FirstOrDefault()?.RoadwayNo ?? "";
                return !string.IsNullOrEmpty(roadwayNo) ? (roadwayNo) : throw new Exception("未找到可分配巷道");
            }
@@ -600,15 +629,13 @@
                //分配巷道
                string roadWay=AssignCPRoadwayNo();
                
                //获取成品库
                Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.LLDCP.ToString());
                Dt_ProStockInfo proStockInfo = new Dt_ProStockInfo()
                {
                    PalletCode=barCode,
                    ProStockAttribute=ProStockAttributeEnum.空托.ObjToInt(),
                    PalletType=1,
                    LocationCode="",
                    WarehouseId=warehouse.WarehouseId,
                    WarehouseId= WarehouseEnum.LLDFL.ObjToInt(),
                    StockStatus=StockStatusEmun.MES空托退库.ObjToInt()
                }; 
@@ -623,7 +650,7 @@
                    TargetAddress = "",
                    TaskType = TaskTypeEnum.EmptyProductBack.ObjToInt(),
                    TaskStatus = TaskStatusEnum.New.ObjToInt(),
                    WarehouseId = warehouse.WarehouseId,
                    WarehouseId = WarehouseEnum.LLDFL.ObjToInt(),
                    PalletType = 1
                };
                _unitOfWorkManage.BeginTran();
@@ -660,7 +687,8 @@
                    //{
                    //    return content.Error($"框码格式错误{barCode}");
                    //}
                    Dt_MaterielInfo materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.MaterielCode == matCode && x.MaterielInvOrgId == MaterielInvOrgEnum.新厂.ObjToInt() && x.WarehouseId==WarehouseEnum.LLDCP.ObjToInt());
                    //获取物料
                    Dt_MaterielInfo materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.MaterielCode == matCode && x.MaterielInvOrgId == MaterielInvOrgEnum.新厂.ObjToInt() && (x.WarehouseId==WarehouseEnum.LLDCP.ObjToInt() || x.WarehouseId == WarehouseEnum.LLDFL.ObjToInt()));
                    if (materielInfo == null)
                    {
                        return content.Error($"未找到物料信息{matCode}");
@@ -690,7 +718,7 @@
                    string roadWay = AssignCPRoadwayNo();
                    //获取成品库
                    Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.LLDCP.ToString());
                    WarehouseEnum warehouseEnum = materielInfo.MaterielSourceType == MaterielTypeEnum.成品.ObjToInt() ? WarehouseEnum.LLDCP : WarehouseEnum.LLDFL;
                    Dt_ProStockInfoDetail proStockInfoDetail = new Dt_ProStockInfoDetail()
                    {
                        ProductCode = materielInfo.MaterielCode,
@@ -706,7 +734,7 @@
                        ProStockAttribute = materielInfo.MaterielSourceType,
                        PalletType = 1,
                        LocationCode = "",
                        WarehouseId = warehouse.WarehouseId,
                        WarehouseId = warehouseEnum.ObjToInt(),
                        StockStatus = StockStatusEmun.手动组盘入库确认.ObjToInt(),
                        proStockInfoDetails = new List<Dt_ProStockInfoDetail> { proStockInfoDetail }
                    };
@@ -722,7 +750,7 @@
                        TargetAddress = "",
                        TaskType = TaskTypeEnum.Inbound.ObjToInt(),
                        TaskStatus = TaskStatusEnum.New.ObjToInt(),
                        WarehouseId = warehouse.WarehouseId,
                        WarehouseId = warehouseEnum.ObjToInt(),
                        PalletType = 1
                    };
                    _unitOfWorkManage.BeginTran();
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_TaskInfoService/TaskService_Outbound.cs
@@ -87,7 +87,7 @@
            try
            {
                Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseId == task.WarehouseId);
                if (warehouse.WarehouseCode == WarehouseEnum.LLDCP.ToString()) //成品完成
                if (warehouse.WarehouseCode == WarehouseEnum.LLDCP.ToString() || warehouse.WarehouseCode == WarehouseEnum.LLDFL.ToString()) //成品完成
                {
                    Dt_LocationInfo locationInfoStart = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == task.SourceAddress);
                    if (locationInfoStart == null)
@@ -189,7 +189,7 @@
            }
            return tasks;
        }
        public List<Dt_Task> GetTasks(List<Dt_ProStockInfo> stockInfos, TaskTypeEnum taskType)
        public List<Dt_Task> GetTasks(List<Dt_ProStockInfo> stockInfos, TaskTypeEnum taskType,List<Dt_LocationInfo> locationInfos)
        {
            List<Dt_Task> tasks = new List<Dt_Task>();
            for (int i = 0; i < stockInfos.Count; i++)
@@ -198,7 +198,7 @@
                if (stockInfo != null)
                {
                    Dt_LocationInfo locationInfo = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == stockInfo.LocationCode);
                    Dt_LocationInfo locationInfo = locationInfos.FirstOrDefault(x => x.LocationCode == stockInfo.LocationCode);
                    if (!tasks.Exists(x => x.PalletCode == stockInfo.PalletCode))
                    {
                        Dt_Task task = new()
@@ -226,37 +226,48 @@
        /// <summary>
        /// æˆå“å‡ºåº“
        /// </summary>
        /// <param name="Count"></param>
        /// <returns></returns>
        public WebResponseContent RequestCPWMSTaskOut(int Count)
        public WebResponseContent RequestCPWMSTaskOut(string materialCode,int Count, int targetId)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                List<Dt_AGVStationInfo> aGVStationInfos = _agvStationInfoRepository.QueryData(x=>x.StationArea==AGVStationAreaEnum.AreaA.ObjToInt() && x.IsOccupied==WhetherEnum.False.ObjToInt());
                List<Dt_AGVStationInfo> aGVStationInfos = _agvStationInfoRepository.QueryData(x=>x.StationArea == targetId && x.IsOccupied==WhetherEnum.False.ObjToInt());
                if (aGVStationInfos.Count< Count)
                {
                    return content.Error($"可用缓存数不足");
                }
                List<Dt_ProStockInfo> stockInfos = _stockRepository.ProStockInfoRepository.QueryData(x => x.ProStockAttribute == ProStockAttributeEnum.成品.ObjToInt() && x.StockStatus == StockStatusEmun.入库完成.ObjToInt()).OrderBy(x=>x.CreateDate).Take(Count).ToList();
                List<Dt_LocationInfo> locationInfos = _basicRepository.LocationInfoRepository.QueryData(x => stockInfos.Select(x => x.LocationCode).Contains(x.LocationCode));
                if (stockInfos.Count < Count)
                //获取货位
                List<Dt_LocationInfo> locationInfos = _basicRepository.LocationInfoRepository.QueryData(x => x.WarehouseId == WarehouseEnum.LLDCP.ObjToInt() && (x.EnableStatus == EnableStatusEnum.OnlyOut.ObjToInt() || x.EnableStatus == EnableStatusEnum.Normal.ObjToInt()) && x.LocationStatus == LocationStatusEnum.InStock.ObjToInt());
                //获取可用库存
                List<Dt_ProStockInfo> stockInfos = BaseDal.Db.Queryable<Dt_ProStockInfo>().Where(x => locationInfos.Select(x => x.LocationCode).Contains(x.LocationCode) && x.StockStatus == StockStatusEmun.入库完成.ObjToInt()).Includes(x => x.proStockInfoDetails)
                .Where(x => x.proStockInfoDetails
                .Any(v =>
                    v.ProductCode == materialCode)
                ).ToList();
                if (stockInfos.Count!=Count)
                {
                    return content.Error($"库存数量不足");
                    return content.Error($"库存{materialCode}数量不足");
                }
                List<Dt_LocationInfo> AssignLocations = new List<Dt_LocationInfo>();
                foreach (var item in stockInfos)
                {
                    Dt_LocationInfo? locationInfo = locationInfos.FirstOrDefault(x => x.LocationCode == item.LocationCode);
                    if (locationInfo != null && (locationInfo.EnableStatus == EnableStatusEnum.OnlyOut.ObjToInt() || locationInfo.EnableStatus == EnableStatusEnum.Normal.ObjToInt()) && locationInfo.LocationStatus == LocationStatusEnum.InStock.ObjToInt())
                    if (locationInfo != null)
                    {
                        AssignLocations.Add(locationInfo);
                        item.StockStatus = StockStatusEmun.出库锁定.ObjToInt();
                    }
                    else
                    {
                        return content.Error($"货位状态不正确");
                    }
                }
                List<Dt_Task> tasks = GetTasks(stockInfos, TaskTypeEnum.OutProduct);
                TaskTypeEnum typeEnum = targetId switch
                {
                    (int)AGVStationAreaEnum.AreaA => TaskTypeEnum.OutProduct,
                    (int)AGVStationAreaEnum.AreaC => TaskTypeEnum.OutWFB,
                    _ => throw new Exception("未找到对应任务")
                };
                List<Dt_Task> tasks = GetTasks(stockInfos, typeEnum, AssignLocations);
                if (tasks == null || tasks.Count <= 0)
                {
                    return content.Error($"生成任务失败");
@@ -272,9 +283,9 @@
                _stockRepository.ProStockInfoRepository.UpdateData(stockInfos);
                _agvStationInfoRepository.UpdateData(aGVStationInfos);
                //更新货位状态
                _basicRepository.LocationInfoRepository.UpdateLocationStatus(locationInfos, LocationStatusEnum.Lock);
                _basicRepository.LocationInfoRepository.UpdateLocationStatus(AssignLocations, LocationStatusEnum.Lock);
                //加入货位变动记录
                _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfos, LocationStatusEnum.Lock, LocationChangeType.OutboundAssignLocation, taskNums: tasks.Select(x => x.TaskNum).ToList());
                _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(AssignLocations, LocationStatusEnum.Lock, LocationChangeType.OutboundAssignLocation, taskNums: tasks.Select(x => x.TaskNum).ToList());
                //新建任务
                BaseDal.AddData(tasks);
                _unitOfWorkManage.CommitTran();
@@ -292,65 +303,65 @@
        /// </summary>
        /// <param name="Count"></param>
        /// <returns></returns>
        public WebResponseContent RequestWFBWMSTaskOut(int Count)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                List<Dt_AGVStationInfo> aGVStationInfos = _agvStationInfoRepository.QueryData(x => x.StationArea == AGVStationAreaEnum.AreaC.ObjToInt() && x.IsOccupied == WhetherEnum.False.ObjToInt());
                if (aGVStationInfos.Count < Count)
                {
                    return content.Error($"可用缓存数不足");
                }
                List<Dt_ProStockInfo> stockInfos = _stockRepository.ProStockInfoRepository.QueryData(x => x.ProStockAttribute == ProStockAttributeEnum.辅料备件.ObjToInt() && x.StockStatus == StockStatusEmun.入库完成.ObjToInt()).OrderBy(x => x.CreateDate).Take(Count).ToList();
                List<Dt_LocationInfo> locationInfos = _basicRepository.LocationInfoRepository.QueryData(x => stockInfos.Select(x => x.LocationCode).Contains(x.LocationCode));
                if (stockInfos.Count < Count)
                {
                    return content.Error($"库存数量不足");
                }
                foreach (var item in stockInfos)
                {
                    Dt_LocationInfo? locationInfo = locationInfos.FirstOrDefault(x => x.LocationCode == item.LocationCode);
                    if (locationInfo != null && (locationInfo.EnableStatus == EnableStatusEnum.OnlyOut.ObjToInt() || locationInfo.EnableStatus == EnableStatusEnum.Normal.ObjToInt()) && locationInfo.LocationStatus == LocationStatusEnum.InStock.ObjToInt())
                    {
                        item.StockStatus = StockStatusEmun.出库锁定.ObjToInt();
                    }
                    else
                    {
                        return content.Error($"货位状态不正确");
                    }
                }
                List<Dt_Task> tasks = GetTasks(stockInfos, TaskTypeEnum.OutWFB);
                if (tasks == null || tasks.Count <= 0)
                {
                    return content.Error($"生成任务失败");
                }
                for (int i = 0; i < tasks.Count; i++)
                {
                    aGVStationInfos[i].IsOccupied = WhetherEnum.True.ObjToInt();
                    tasks[i].TargetAddress = aGVStationInfos[i].AGVStationCode;
                }
                //判断是否有出库单信息
                _unitOfWorkManage.BeginTran();
                //更新库存状态
                _stockRepository.ProStockInfoRepository.UpdateData(stockInfos);
                _agvStationInfoRepository.UpdateData(aGVStationInfos);
                //更新货位状态
                _basicRepository.LocationInfoRepository.UpdateLocationStatus(locationInfos, LocationStatusEnum.Lock);
                //加入货位变动记录
                _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfos, LocationStatusEnum.Lock, LocationChangeType.OutboundAssignLocation, taskNums: tasks.Select(x => x.TaskNum).ToList());
                //新建任务
                BaseDal.AddData(tasks);
                _unitOfWorkManage.CommitTran();
                PushTasksToWCS(tasks);
                content.OK();
            }
            catch (Exception ex)
            {
                content.Error(ex.Message);
            }
            return content;
        }
        //public WebResponseContent RequestWFBWMSTaskOut(int Count)
        //{
        //    WebResponseContent content = new WebResponseContent();
        //    try
        //    {
        //        List<Dt_AGVStationInfo> aGVStationInfos = _agvStationInfoRepository.QueryData(x => x.StationArea == AGVStationAreaEnum.AreaC.ObjToInt() && x.IsOccupied == WhetherEnum.False.ObjToInt());
        //        if (aGVStationInfos.Count < Count)
        //        {
        //            return content.Error($"可用缓存数不足");
        //        }
        //        List<Dt_ProStockInfo> stockInfos = _stockRepository.ProStockInfoRepository.QueryData(x => x.ProStockAttribute == ProStockAttributeEnum.辅料备件.ObjToInt() && x.StockStatus == StockStatusEmun.入库完成.ObjToInt()).OrderBy(x => x.CreateDate).Take(Count).ToList();
        //        List<Dt_LocationInfo> locationInfos = _basicRepository.LocationInfoRepository.QueryData(x => stockInfos.Select(x => x.LocationCode).Contains(x.LocationCode));
        //        if (stockInfos.Count < Count)
        //        {
        //            return content.Error($"库存数量不足");
        //        }
        //        foreach (var item in stockInfos)
        //        {
        //            Dt_LocationInfo? locationInfo = locationInfos.FirstOrDefault(x => x.LocationCode == item.LocationCode);
        //            if (locationInfo != null && (locationInfo.EnableStatus == EnableStatusEnum.OnlyOut.ObjToInt() || locationInfo.EnableStatus == EnableStatusEnum.Normal.ObjToInt()) && locationInfo.LocationStatus == LocationStatusEnum.InStock.ObjToInt())
        //            {
        //                item.StockStatus = StockStatusEmun.出库锁定.ObjToInt();
        //            }
        //            else
        //            {
        //                return content.Error($"货位状态不正确");
        //            }
        //        }
        //        List<Dt_Task> tasks = GetTasks(stockInfos, TaskTypeEnum.OutWFB);
        //        if (tasks == null || tasks.Count <= 0)
        //        {
        //            return content.Error($"生成任务失败");
        //        }
        //        for (int i = 0; i < tasks.Count; i++)
        //        {
        //            aGVStationInfos[i].IsOccupied = WhetherEnum.True.ObjToInt();
        //            tasks[i].TargetAddress = aGVStationInfos[i].AGVStationCode;
        //        }
        //        //判断是否有出库单信息
        //        _unitOfWorkManage.BeginTran();
        //        //更新库存状态
        //        _stockRepository.ProStockInfoRepository.UpdateData(stockInfos);
        //        _agvStationInfoRepository.UpdateData(aGVStationInfos);
        //        //更新货位状态
        //        _basicRepository.LocationInfoRepository.UpdateLocationStatus(locationInfos, LocationStatusEnum.Lock);
        //        //加入货位变动记录
        //        _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfos, LocationStatusEnum.Lock, LocationChangeType.OutboundAssignLocation, taskNums: tasks.Select(x => x.TaskNum).ToList());
        //        //新建任务
        //        BaseDal.AddData(tasks);
        //        _unitOfWorkManage.CommitTran();
        //        PushTasksToWCS(tasks);
        //        content.OK();
        //    }
        //    catch (Exception ex)
        //    {
        //        content.Error(ex.Message);
        //    }
        //    return content;
        //}
        /// <summary>
        /// åŽŸæ–™å‡ºåº“ä»»åŠ¡
        /// </summary>
@@ -382,6 +393,7 @@
                        item.StockStatus = StockStatusEmun.出库锁定.ObjToInt();
                    }
                }
                //区分任务
                TaskTypeEnum taskTypeEnum = new();
                if (stockInfos.FirstOrDefault()?.MaterielInvOrgId==MaterielInvOrgEnum.老厂.ObjToInt())
                {
@@ -438,7 +450,7 @@
                List<Dt_OutBSTOrderDetail> outBSTOrderDetails = new List<Dt_OutBSTOrderDetail>();
                List<Dt_OutStockLockInfo> outStockLockInfos = new List<Dt_OutStockLockInfo>();
                List<Dt_LocationInfo> locationInfos = new List<Dt_LocationInfo>();
                //生成任务、库存等信息
                (List<Dt_Task>, List<Dt_StockInfo>?, List<Dt_OutBSTOrderDetail>?, List<Dt_OutStockLockInfo>?, List<Dt_LocationInfo>?) result = OutboundTaskDataHandle(keys);
                if (result.Item2 != null && result.Item2.Count > 0)
                {
@@ -460,7 +472,7 @@
                {
                    tasks.AddRange(result.Item1);
                }
                //处理出库数据
                return GenerateOutboundTaskDataUpdate(tasks, stockInfos, outBSTOrderDetails, outStockLockInfos, locationInfos);
            }
            catch (Exception ex)
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_WMSServer/Controllers/ERP/ErpBSTController.cs
@@ -33,13 +33,15 @@
        private readonly IInvokeERPService _invokeERPService;
        private readonly IPurchaseBSTOrderService _purchaseBSTOrderService;
        private readonly IOutBSTOrderService _outBSTOrderService;
        private readonly IReturnBSTOrderService _returnBSTOrderService;
        public ErpBSTController(IBasicService basicService, IInvokeERPService invokeERPService,IPurchaseBSTOrderService purchaseBSTOrderService,IOutBSTOrderService outBSTOrderService)
        public ErpBSTController(IBasicService basicService, IInvokeERPService invokeERPService,IPurchaseBSTOrderService purchaseBSTOrderService,IOutBSTOrderService outBSTOrderService,IReturnBSTOrderService returnBSTOrderService)
        {
            _basicService = basicService;
            _invokeERPService = invokeERPService;
            _purchaseBSTOrderService = purchaseBSTOrderService;
            _outBSTOrderService = outBSTOrderService;
            _returnBSTOrderService = returnBSTOrderService;
        }
        /// <summary>
        /// æ·»åŠ è€åŽ‚ç‰©æ–™
@@ -53,7 +55,7 @@
        }
        /// <summary>
        /// æ·»åŠ è€åŽ‚ä¾›åº”å•†ä¿¡æ¯
        /// æŽ¥æ”¶è€åŽ‚ä¾›åº”å•†ä¿¡æ¯
        /// </summary>
        /// <returns></returns>
        [HttpPost, HttpGet, Route("ReceiveSupplier"), AllowAnonymous]
@@ -64,7 +66,7 @@
        }
        /// <summary>
        /// æ·»åŠ è€åŽ‚é‡‡è´­å•ä¿¡æ¯
        /// æŽ¥æ”¶è€åŽ‚é‡‡è´­å•ä¿¡æ¯
        /// </summary>
        /// <returns></returns>
        [HttpPost, HttpGet, Route("ReceivePurchaseOrder"), AllowAnonymous]
@@ -74,7 +76,7 @@
        }
        /// <summary>
        /// æ·»åŠ å‡ºåº“æŽ’ç¨‹ä¿¡æ¯
        /// æŽ¥æ”¶å‡ºåº“排程信息
        /// </summary>
        /// <returns></returns>
        [HttpPost, HttpGet, Route("ReceiveOutOrder"), AllowAnonymous]
@@ -82,5 +84,32 @@
        {
            return _outBSTOrderService.AddOutBSTOrder(bSTOutOrderDTOs);
        }
        /// <summary>
        /// æŽ¥æ”¶åšæ€é€šé¢†æ–™ä¿¡æ¯
        /// </summary>
        /// <returns></returns>
        [HttpPost, HttpGet, Route("ReceivePicking"), AllowAnonymous]
        public WebResponseContent ReceivePicking()
        {
            return WebResponseContent.Instance.Error("未找到对应库存信息") ;
        }
        /// <summary>
        /// æŽ¥æ”¶åšæ€é€šé€€æ–™ä¿¡æ¯
        /// </summary>
        /// <returns></returns>
        [HttpPost, HttpGet, Route("ReceiveReturnOrder"), AllowAnonymous]
        public WebResponseContent ReceiveReturnOrder([FromBody] List<BSTReturnOrderDTO> bSTReturnOrderDTOs)
        {
            return _returnBSTOrderService.ReceiveReturnOrder(bSTReturnOrderDTOs);
        }
        /// <summary>
        /// æŽ¥æ”¶åšæ€é€šç›˜ç‚¹ä¿¡æ¯
        /// </summary>
        /// <returns></returns>
        [HttpPost, HttpGet, Route("ReceiveStockCheckOrder"), AllowAnonymous]
        public WebResponseContent ReceiveStockCheckOrder([FromBody] List<BSTOutOrderDTO> bSTOutOrderDTOs)
        {
            return _outBSTOrderService.AddOutBSTOrder(bSTOutOrderDTOs);
        }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_WMSServer/Controllers/Inbound/ReturnBSTOrderController.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
using Microsoft.AspNetCore.Mvc;
using WIDESEA_Core.BaseController;
using WIDESEA_IInboundService;
using WIDESEA_Model.Models;
namespace WIDESEA_WMSServer.Controllers.Inbound
{
    /// <summary>
    /// BST退料单
    /// </summary>
    [Route("api/ReturnBSTOrder")]
    [ApiController]
    public class ReturnBSTOrderController : ApiBaseController<IReturnBSTOrderService, Dt_ReturnBSTOrder>
    {
        public ReturnBSTOrderController(IReturnBSTOrderService service) : base(service)
        {
        }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_WMSServer/Controllers/Inbound/ReturnBSTOrderDetailController.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
using Microsoft.AspNetCore.Mvc;
using WIDESEA_Core.BaseController;
using WIDESEA_IInboundService;
using WIDESEA_Model.Models;
namespace WIDESEA_WMSServer.Controllers.Inbound
{
    /// <summary>
    /// BST退料单明细
    /// </summary>
    [Route("api/ReturnBSTOrderDetail")]
    [ApiController]
    public class ReturnBSTOrderDetailController : ApiBaseController<IReturnBSTOrderDetailService, Dt_ReturnBSTOrderDetail>
    {
        public ReturnBSTOrderDetailController(IReturnBSTOrderDetailService service) : base(service)
        {
        }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_WMSServer/Controllers/TaskInfo/TaskController.cs
@@ -210,23 +210,37 @@
        /// <summary>
        /// æˆå“å‡ºåº“任务请求
        /// <param name="targetId">
        /// 1 æœˆå°åŒº<br/>
        /// 2 å…¥åº“区<br/>
        /// 3 ç»‡å¸ƒåŒº<br/>
        /// 4 æ·‹è†œåŒº<br/>
        /// 5 æš‚存区<br/>
        /// 6 å°åˆ·åŒº<br/>
        /// 7 å†²åˆ‡åŒº<br/>
        /// 8 åŽŸæ–™åŒº<br/>
        /// 9 çº¸è¢‹åŒº<br/>
        /// 10 å¸ƒè¢‹åŒº<br/>
        /// 11 çº¸æ¯åŒº<br/>
        /// 12 é›¾åŒ–区<br/>
        /// </param>
        /// </summary>
        /// <returns></returns>
        [HttpPost, HttpGet, Route("RequestCPWMSTaskOut"), AllowAnonymous]
        public WebResponseContent RequestCPWMSTaskOut(int Count)
        public WebResponseContent RequestCPWMSTaskOut(string materialCode,int Count, int targetId)
        {
            return Service.RequestCPWMSTaskOut(Count);
            return Service.RequestCPWMSTaskOut(materialCode, Count, targetId);
        }
        /// <summary>
        /// æ— çººå¸ƒå‡ºåº“
        /// </summary>
        /// <returns></returns>
        [HttpPost, HttpGet, Route("RequestWFBWMSTaskOut"), AllowAnonymous]
        public WebResponseContent RequestWFBWMSTaskOut(int Count)
        {
            return Service.RequestWFBWMSTaskOut(Count);
        }
        ///// <summary>
        ///// æ— çººå¸ƒå‡ºåº“
        ///// </summary>
        ///// <returns></returns>
        //[HttpPost, HttpGet, Route("RequestWFBWMSTaskOut"), AllowAnonymous]
        //public WebResponseContent RequestWFBWMSTaskOut(int Count)
        //{
        //    return Service.RequestWFBWMSTaskOut(Count);
        //}
        /// <summary>
        /// åŽŸæ–™å‡ºåº“ä»»åŠ¡
@@ -292,8 +306,6 @@
        /// <summary>
        /// åˆ›å»ºåŽŸçº¸ç”Ÿäº§æŽ’ç¨‹å‡ºåº“ä»»åŠ¡
        /// </summary>
        /// <param name="saveModel"></param>
        /// <returns></returns>
        [HttpPost, HttpGet, Route("CreateBSTOutboundTasks"), AllowAnonymous]
        public WebResponseContent CreateBSTOutboundTasks([FromBody] int[] keys)
        {
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_WMSServer/Filter/CustomProfile.cs
@@ -40,6 +40,9 @@
            //BST出库排程实体转换
            CreateMap<BSTOutOrderDTO, Dt_OutBSTOrder>().ForMember(x => x.OutBSTOrderStatus, b => b.MapFrom(b => OutOrderStatusEnum.未开始.ObjToInt())).ForMember(x => x.ProductionDate, b => b.MapFrom(b => DateTimeOffset.FromUnixTimeMilliseconds(b.ProductionDate).DateTime)).ForMember(x => x.WarehouseId, b => b.MapFrom(b => WarehouseEnum.LLDYL.ObjToInt()));
            CreateMap<BstBoardMpsDetailItem, Dt_OutBSTOrderDetail>().ForMember(x => x.OutBSTOrderDetailStatus, b => b.MapFrom(b => OutOrderStatusEnum.未开始.ObjToInt()));
            //BST退料单实体转换
            CreateMap<BSTReturnOrderDTO, Dt_ReturnBSTOrder>().ForMember(x => x.ReturnOrderStatus, b => b.MapFrom(b => InOrderStatusEnum.未开始.ObjToInt())).ForMember(x => x.WreturnDate, b => b.MapFrom(b => DateTimeOffset.FromUnixTimeMilliseconds(b.WreturnDate).DateTime)).ForMember(x => x.WarehouseId, b => b.MapFrom(b => WarehouseEnum.LLDYL.ObjToInt()));
            CreateMap<BSTReturnOrderDTOItem, Dt_ReturnBSTOrderDetail>().ForMember(x => x.ReturnBSTOrderDetailStatus, b => b.MapFrom(b => OutOrderStatusEnum.未开始.ObjToInt())).ForMember(x => x.MaterialWide, b => b.MapFrom(b => b.W)).ForMember(x => x.MaterialThick, b => b.MapFrom(b => b.Thick));
        }
    }
}
ÏîÄ¿×ÊÁÏ/½Ó¿ÚЭÒé/²©Ë¼Í¨ÀûÍØ½Ó¿Ú.xlsx
Binary files differ
ÏîÄ¿×ÊÁÏ/½Ó¿ÚЭÒé/ÁúÀûµÃMES½Ó¿Ú.xlsx
Binary files differ