| | |
| | | using Mapster; |
| | | using Masuit.Tools; |
| | | using Microsoft.EntityFrameworkCore.Storage.ValueConversion.Internal; |
| | | using OfficeOpenXml.FormulaParsing.Excel.Functions.Math; |
| | | using OfficeOpenXml.FormulaParsing.Excel.Functions.RefAndLookup; |
| | | using OfficeOpenXml.Table.PivotTable; |
| | | using SixLabors.Fonts.Tables.AdvancedTypographic; |
| | | using SqlSugar; |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.Linq.Expressions; |
| | | using System.Reflection; |
| | | using System.Reflection.Metadata; |
| | | using System.Security.Policy; |
| | | using System.Text.RegularExpressions; |
| | | using System.Threading.Tasks; |
| | | using WIDESEA_Cache; |
| | |
| | | WebResponseContent content = new WebResponseContent(); |
| | | try |
| | | { |
| | | var locationStart = await _locationRepository.QueryFirstAsync(x => x.LocationCode == task.SourceAddress); |
| | | var locationEnd = await _locationRepository.QueryFirstAsync(x => x.LocationCode == task.TargetAddress); |
| | | |
| | | task.TaskState = (int)TaskOutStatusEnum.OutFinish; |
| | | var taskHty = task.Adapt<Dt_Task_Hty>(); |
| | | taskHty.FinishTime = DateTime.Now; |
| | | taskHty.OperateType = App.User.UserName != null ? (int)OperateTypeEnum.äººå·¥å®æ : (int)OperateTypeEnum.èªå¨å®æ; |
| | | taskHty.Creater = App.User.UserName != null ? App.User.UserName : "System"; |
| | | |
| | | //DtStockInfo_Hty stockInfo_Hty = stock.Adapt<DtStockInfo_Hty>(); |
| | | //stockInfo_Hty.ModifyDate = DateTime.Now; |
| | | stock.ModifyDate = DateTime.Now; |
| | | stock.LocationCode = task.TargetAddress; |
| | | await _unitOfWorkManage.UseTranAsync(async () => |
| | | { |
| | | //await DeleteStockInfoAsync(stock.Id); |
| | | //await DeleteStockInfoDetailsAsync(stock.StockInfoDetails); |
| | | //await AddStockInfoHtyAsync(stockInfo_Hty); |
| | | _stockInfoRepository.UpdateData(stock); |
| | | |
| | | UpdateLocationStatus(locationStart, LocationEnum.Free, task.TaskNum.Value, (int)StatusChangeTypeEnum.AutomaticOutbound); |
| | | UpdateLocationStatus(locationEnd, LocationEnum.InStock, task.TaskNum.Value, (int)StatusChangeTypeEnum.AutomaticOutbound); |
| | | |
| | | await DeleteTaskAsync(task.TaskId); |
| | | await AddTaskHtyAsync(taskHty); |
| | | }); |
| | | content.OK("åºåºå®æ"); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | |
| | | WebResponseContent content = new WebResponseContent(); |
| | | try |
| | | { |
| | | // æ´æ°è´§ä½ååºåä¿¡æ¯ |
| | | (DtStockInfo updateStock, DtLocationInfo locationInForm, DtLocationInfo locationInfoTo) = UpdateStockLocation(stock, task); |
| | | var taskHty = CreateHistoricalTask(task); |
| | | LogFactory.GetLog("ä»»å¡å®æ").InfoFormat(true, "ç§»åºä»»å¡å®æ", $"è´§ä½å°åï¼{task.TargetAddress},ä¿®æ¹ååºåæ°æ®ï¼{JsonConvert.SerializeObject(updateStock)}ï¼åå
è´§ä½æ°æ®ï¼{locationInForm}"); |
| | | var locationStart = await _locationRepository.QueryFirstAsync(x => x.LocationCode == task.SourceAddress); |
| | | var locationEnd = await _locationRepository.QueryFirstAsync(x => x.LocationCode == task.TargetAddress); |
| | | |
| | | // æ§è¡æ°æ®åºäºå¡ |
| | | bool isResult = false; |
| | | if (isResult) |
| | | content.OK("ç§»åºä»»å¡å®ææå"); |
| | | else |
| | | content.Error("ç§»åºä»»å¡å®æå¤±è´¥"); |
| | | task.TaskState = (int)TaskOutStatusEnum.OutFinish; |
| | | var taskHty = task.Adapt<Dt_Task_Hty>(); |
| | | taskHty.FinishTime = DateTime.Now; |
| | | taskHty.OperateType = App.User.UserName != null ? (int)OperateTypeEnum.äººå·¥å®æ : (int)OperateTypeEnum.èªå¨å®æ; |
| | | taskHty.Creater = App.User.UserName != null ? App.User.UserName : "System"; |
| | | |
| | | stock.ModifyDate = DateTime.Now; |
| | | stock.LocationCode = task.TargetAddress; |
| | | |
| | | await _unitOfWorkManage.UseTranAsync(async () => |
| | | { |
| | | //UpdateLocationStatus(locationStart, LocationEnum.Free, task.TaskNum.Value, (int)StatusChangeTypeEnum.AutomaticInbound); |
| | | UpdateLocationStatus(locationEnd, LocationEnum.InStock, task.TaskNum.Value, (int)StatusChangeTypeEnum.AutomaticRelocation); |
| | | _stockInfoRepository.UpdateData(stock); |
| | | await DeleteTaskAsync(task.TaskId); |
| | | await AddTaskHtyAsync(taskHty); |
| | | }); |
| | | content.OK("ç§»åºå®æ"); |
| | | } |
| | | catch (Exception err) |
| | | { |
| | |
| | | await _boxingInfoRepository.Db.DeleteNav<DtBoxingInfo>(x => x.Id == boxing.Id) |
| | | .Include(x => x.BoxingInfoDetails) |
| | | .ExecuteCommandAsync(); |
| | | UpdateLocationStatus(locationStart, LocationEnum.Free, task.TaskNum.Value, (int)StatusChangeTypeEnum.AutomaticInbound); |
| | | UpdateLocationStatus(locationEnd, LocationEnum.InStock, task.TaskNum.Value, (int)StatusChangeTypeEnum.AutomaticInbound); |
| | | await AddBoxingHtyAsync(boxingInfo_Hty); |
| | | }); |
| | | content.OK("å
¥åºå®æ"); |
| | |
| | | |
| | | |
| | | // éªè¯åºåæ¯å¦åå¨ |
| | | //var stock = await _stockInfoRepository.QueryFirstNavAsync(x => x.PalletCode == task.PalletCode); |
| | | DtStockInfo stock = null; |
| | | var stock = await _stockInfoRepository.QueryFirstNavAsync(x => x.PalletCode == task.PalletCode); |
| | | |
| | | if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup) |
| | | { |
| | |
| | | |
| | | #endregion ä»»å¡å®æ |
| | | |
| | | #region åæ¶ä»»å¡ |
| | | public WebResponseContent TaskCancel(int taskNum) |
| | | { |
| | | WebResponseContent content = new WebResponseContent(); |
| | | try |
| | | { |
| | | Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum); |
| | | if (task == null) |
| | | { |
| | | return content = WebResponseContent.Instance.Error("æªæ¾å°ä»»å¡ä¿¡æ¯"); |
| | | } |
| | | _unitOfWorkManage.BeginTran(); |
| | | MethodInfo? methodInfo = GetType().GetMethod(((TaskTypeEnum)task.TaskType) + "TaskCancel"); |
| | | if (methodInfo != null) |
| | | { |
| | | WebResponseContent? responseContent = (WebResponseContent?)methodInfo.Invoke(this, new object[] { task }); |
| | | if (responseContent != null) |
| | | { |
| | | if (responseContent != null) |
| | | { |
| | | |
| | | } |
| | | } |
| | | } |
| | | return content = WebResponseContent.Instance.Error("æªæ¾å°ä»»å¡ç±»å对åºä¸å¡å¤çé»è¾"); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | _unitOfWorkManage.RollbackTran(); |
| | | return content = WebResponseContent.Instance.Error(ex.Message); |
| | | } |
| | | } |
| | | #endregion |
| | | |
| | | #region 请æ±ä»»å¡å
¥åº |
| | | |
| | | public async Task<WebResponseContent> RequestInboundTaskAsync(RequestTaskDto taskDto) |
| | |
| | | return content.Error("æçä¿¡æ¯ä¸åå¨ï¼è¯·ç¡®è®¤æçå·²ç»çæå"); |
| | | } |
| | | |
| | | foreach (var item in boxingInfo.BoxingInfoDetails) |
| | | { |
| | | var ERPStock = SqlSugarHelper.DBERP.Queryable<WMS_ç¨ååºåä¸è§è¡¨_ST>().Where(x => x.ä»åºåç§° == item.Warehouse && x.æå· == item.MaterielCode && x.åå == item.MaterielName).ToList().FirstOrDefault(); |
| | | if (ERPStock == null) |
| | | { |
| | | return content.Error($"ç»çæ°æ®æªå¨ERPåºåæ°æ®ä¸ï¼è¯·äººå·¥ç¡®è®¤æ°æ®æ¯å¦æ£ç¡®"); |
| | | } |
| | | } |
| | | //foreach (var item in boxingInfo.BoxingInfoDetails) |
| | | //{ |
| | | // var ERPStock = SqlSugarHelper.DBERP.Queryable<WMS_ç¨ååºåä¸è§è¡¨_ST>().Where(x => x.ä»åºåç§° == item.Warehouse && x.æå· == item.MaterielCode && x.åå == item.MaterielName).ToList().FirstOrDefault(); |
| | | // if (ERPStock == null) |
| | | // { |
| | | // return content.Error($"ç»çæ°æ®æªå¨ERPåºåæ°æ®ä¸ï¼è¯·äººå·¥ç¡®è®¤æ°æ®æ¯å¦æ£ç¡®"); |
| | | // } |
| | | //} |
| | | |
| | | var StartAddress = await _locationRepository.QueryFirstAsync(x => x.LocationCode == taskDto.Position); |
| | | if (StartAddress == null) |
| | |
| | | var location = _locationRepository.QueryFirst(x => x.LocationCode == taskDto.TargetAddress); |
| | | if (location != null && location.LocationStatus == (int)LocationEnum.Free && location.EnalbeStatus == 1) |
| | | { |
| | | switch (taskDto.AreaId) |
| | | switch (location.AreaId) |
| | | { |
| | | case 1: |
| | | return await InboundStakerArea(taskDto, location, StartAddress); |
| | | return await InboundStakerArea(taskDto, StartAddress, location); |
| | | case 2: |
| | | case 3: |
| | | case 4: |
| | | case 5: |
| | | case 6: |
| | | return await InboundAGVCacheArea(taskDto, location, StartAddress); |
| | | return await InboundAGVCacheArea(taskDto, StartAddress, location); |
| | | default: |
| | | return content.Error("è´§ä½åºåæªæ¾å°"); |
| | | } |
| | |
| | | #endregion |
| | | |
| | | #region 请æ±åºåº |
| | | public async Task<WebResponseContent> OtherOutBoundTaskAsync(string palletCode) |
| | | { |
| | | WebResponseContent content = new WebResponseContent(); |
| | | try |
| | | { |
| | | DtStockInfo stcok = await _stockInfoRepository.QueryFirstAsync(x => x.PalletCode == palletCode); |
| | | if (stcok == null) |
| | | { |
| | | return content.Error("æçä¿¡æ¯ä¸åå¨ï¼è¯·ç¡®è®¤æçå·²å
¥åºæå"); |
| | | } |
| | | var location = await _locationRepository.QueryFirstAsync(x => x.LocationCode == stcok.LocationCode); |
| | | if (location.AreaId == 2) |
| | | { |
| | | return content.Error("该æçåºåå·²å¨åºåºç¼ååº"); |
| | | } |
| | | return await RequestOutboundTaskAsync(new RequestTaskDto { PalletCode = palletCode, AreaId = 2, Position = stcok.LocationCode ,TaskType = (int)TaskOutboundTypeEnum.OutOther }); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | return content.Error(ex.Message); |
| | | } |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// 请æ±åºåºä»»å¡ |
| | |
| | | WebResponseContent content = new WebResponseContent(); |
| | | try |
| | | { |
| | | //DtStockInfo stcok= await _stockInfoRepository.QueryFirstAsync(x => x.PalletCode == taskDto.PalletCode); |
| | | //if (stcok == null) |
| | | //{ |
| | | // return content.Error("æçä¿¡æ¯ä¸åå¨ï¼è¯·ç¡®è®¤æçå·²å
¥åºæå"); |
| | | //} |
| | | DtStockInfo stcok = await _stockInfoRepository.QueryFirstAsync(x => x.PalletCode == taskDto.PalletCode); |
| | | if (stcok == null) |
| | | { |
| | | return content.Error("æçä¿¡æ¯ä¸åå¨ï¼è¯·ç¡®è®¤æçå·²å
¥åºæå"); |
| | | } |
| | | |
| | | var StartAddress = await _locationRepository.QueryFirstAsync(x => x.LocationCode == taskDto.Position); |
| | | if (StartAddress == null) |
| | |
| | | Floor = stationManager.stationFloor, |
| | | }; |
| | | var taskDTO = CreateTaskDTO(taskNew); |
| | | |
| | | task.TaskState = (int)TaskAcrossFloorStatusEnum.FirstCarryFinish; |
| | | var taskHty = task.Adapt<Dt_Task_Hty>(); |
| | | taskHty.FinishTime = DateTime.Now; |
| | | taskHty.OperateType = App.User.UserName != null ? (int)OperateTypeEnum.äººå·¥å®æ : (int)OperateTypeEnum.èªå¨å®æ; |
| | | taskHty.Creater = App.User.UserName != null ? App.User.UserName : "System"; |
| | | await _unitOfWorkManage.UseTranAsync(async () => |
| | | { |
| | | BaseDal.AddData(taskNew); |
| | | |
| | | await DeleteTaskAsync(task.TaskId); |
| | | await AddTaskHtyAsync(taskHty); |
| | | BaseDal.AddData(taskNew); |
| | | }); |
| | | return content.OK(data: taskDTO); |
| | | } |
| | |
| | | } |
| | | #endregion |
| | | |
| | | #region è·åä»»å¡ä¿¡æ¯ |
| | | public WebResponseContent GetTaskInfo() |
| | | { |
| | | WebResponseContent content = new WebResponseContent(); |
| | | try |
| | | { |
| | | Expression<Func<Dt_Task, bool>> expression = x => true; |
| | | if (!App.User.IsSuperAdmin) |
| | | { |
| | | expression = x => x.Creater == App.User.UserName; |
| | | } |
| | | var task = BaseDal.Db.Queryable<Dt_Task>().OrderByDescending(x => x.CreateDate).Take(100).Select(x => new Dt_Task { TaskNum = x.TaskNum, PalletCode = x.PalletCode, TaskType = x.TaskType, SourceAddress = x.SourceAddress, TargetAddress = x.TargetAddress }).ToList(); |
| | | content = WebResponseContent.Instance.OK(data: task); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | content = WebResponseContent.Instance.Error(ex.Message); |
| | | } |
| | | return content; |
| | | } |
| | | #endregion |
| | | |
| | | #endregion å¤é¨æ¥å£æ¹æ³ |
| | | |
| | | #region è°ç¨WCSæ¥å£ |
| | | private string GetAGVIPAddress(string baseIp, string name) |
| | | private string GetWCSIPAddress(string baseIp, string name) |
| | | { |
| | | var configz = _configService.GetConfigsByCategory(CateGoryConst.CONFIG_SYS_IPAddress); |
| | | var wcsBasez = configz.Where(x => x.ConfigKey == baseIp).FirstOrDefault()?.ConfigValue; |
| | |
| | | public async Task<WebResponseContent> SendWCSTask(List<WMSTaskDTO> taskDTO) |
| | | { |
| | | WebResponseContent content = new WebResponseContent(); |
| | | var AgvSendTaskAddrss = GetAGVIPAddress(SysConfigConst.WCSIPAddress, SysConfigConst.ReceiveTask); |
| | | var AgvSendTaskAddrss = GetWCSIPAddress(SysConfigConst.WCSIPAddress, SysConfigConst.ReceiveTask); |
| | | // åé请æ±å¹¶çå¾
ååº |
| | | var result = await HttpHelper.PostAsync(AgvSendTaskAddrss, taskDTO.ToJsonString()); |
| | | |
| | |
| | | } |
| | | #endregion |
| | | |
| | | #region ERPæ¥å£è°ç¨ |
| | | public string GetERPIPAddress(string baseIp, string name) |
| | | { |
| | | var configz = _configService.GetConfigsByCategory(CateGoryConst.CONFIG_SYS_IPAddress); |
| | | var wcsBasez = configz.Where(x => x.ConfigKey == baseIp).FirstOrDefault()?.ConfigValue; |
| | | var address = configz.Where(x => x.ConfigKey == name).FirstOrDefault()?.ConfigValue; |
| | | if (wcsBasez == null || address == null) |
| | | { |
| | | throw new InvalidOperationException("WMS IP æªé
ç½®"); |
| | | } |
| | | return wcsBasez + address; |
| | | } |
| | | |
| | | public async Task<WebResponseContent> SendERPTaskCompletion(string palletCode) |
| | | { |
| | | WebResponseContent content = new WebResponseContent(); |
| | | try |
| | | { |
| | | DtStockInfo stock = await _stockInfoRepository.QueryFirstNavAsync(x=>x.PalletCode== palletCode); |
| | | Allocate allocate = new Allocate |
| | | { |
| | | context = new Context |
| | | { |
| | | CultureName = "zh-CN", |
| | | EntCode = "001", |
| | | OrgCode = "102", |
| | | UserCode = "MH0551" |
| | | }, |
| | | documentTypeCode = "TransIn002", |
| | | businessDate = DateTime.Now.ToString("yyyy-MM-dd"), |
| | | isApproved = true, |
| | | |
| | | transferInList = stock.StockInfoDetails.Select(item => new transferInList |
| | | { |
| | | ItemCode = item.MaterielCode, |
| | | TransInWHCode = item.Warehouse, |
| | | TransInQty = item.Quantity, |
| | | TransOutWHCode = "001", |
| | | }).ToList() |
| | | }; |
| | | return content.OK(data: allocate); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | return content.Error(ex.Message); |
| | | } |
| | | } |
| | | |
| | | |
| | | #endregion |
| | | |
| | | #region å
é¨è°ç¨æ¹æ³ |
| | | |
| | | public void UpdateLocationStatus(DtLocationInfo location, LocationEnum locationStatus, int taskNum, int StatusChangeType) |
| | | { |
| | | List<DtLocationInfo> locations = GetGroupLocations(location); |
| | | |
| | | List<DtLocationInfo> Beforelocation = locations; |
| | | List<DtLocationInfo> Beforelocation = locations.Select(x => new DtLocationInfo |
| | | { |
| | | Id = x.Id, |
| | | LocationCode = x.LocationCode, |
| | | LocationStatus = x.LocationStatus |
| | | }).ToList(); |
| | | |
| | | foreach (var item in locations) |
| | | { |
| | |
| | | }; |
| | | } |
| | | |
| | | private bool IsAcrossFloor(DtLocationInfo Sourcelocation,DtLocationInfo Targetlocation) |
| | | { |
| | | return Sourcelocation.Floor == Targetlocation.Floor; |
| | | } |
| | | |
| | | private bool IsSamefloor(DtLocationInfo Sourcelocation, DtLocationInfo Targetlocation) |
| | | { |
| | | return Sourcelocation.Floor == Targetlocation.Floor; |
| | | } |
| | | private async Task DeleteStockInfoAsync(int stockId) |
| | | { |
| | | var isStockUpdated = await _stockInfoRepository.DeleteDataByIdAsync(stockId); |
| | |
| | | } |
| | | } |
| | | |
| | | private async Task UpdateLocationAsync(DtLocationInfo info) |
| | | { |
| | | var isStockUpdated = await _locationRepository.UpdateDataAsync(info); |
| | | if (!isStockUpdated) |
| | | { |
| | | throw new Exception("åºä½ä¿¡æ¯æ´æ°å¤±è´¥"); |
| | | } |
| | | } |
| | | |
| | | private async Task DeleteStockInfoDetailsAsync(IEnumerable<DtStockInfoDetail> details) |
| | | { |
| | |
| | | return taskHty; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ´æ°åºåä½ç½® |
| | | /// </summary> |
| | | /// <param name="stock">åºå对象</param> |
| | | /// <param name="toLocation">ç®æ ä½ç½®</param> |
| | | // æ´æ°åºååä½ç½®ä¿¡æ¯ |
| | | private (DtStockInfo, DtLocationInfo, DtLocationInfo) UpdateStockLocation(DtStockInfo stock, Dt_Task task) |
| | | { |
| | | //ä¿®æ¹æ¥æºåºä½å ç®æ åºä½ç¶æ |
| | | var fromLocation = _locationRepository.QueryFirst(x => x.LocationCode == task.SourceAddress && x.RoadwayNo == task.Roadway); |
| | | fromLocation.LocationStatus = LocationEnum.Free.ObjToInt(); |
| | | var toLocation = _locationRepository.QueryFirst(x => x.LocationCode == task.SourceAddress && x.RoadwayNo == task.Roadway); |
| | | toLocation.LocationStatus = LocationEnum.InStock.ObjToInt(); |
| | | |
| | | // å°åºåä½ç½®è®¾ç½®ä¸ºç®æ ä½ç½® |
| | | stock.LocationCode = task.TargetAddress; |
| | | |
| | | // è¿åæ´æ°åçåºååä½ç½®ä¿¡æ¯ |
| | | return (stock, fromLocation, toLocation); |
| | | } |
| | | |
| | | #region ä»»å¡è¯·æ±æ¹æ³ |
| | | |