123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149 |
- using AutoMapper;
- using Microsoft.Extensions.Logging;
- using SqlSugar;
- using System;
- using System.Collections.Generic;
- using System.Data;
- using System.Globalization;
- using System.Linq;
- using WCS.Entity.sx;
- using wms.dto;
- using wms.dto.request.sx;
- using wms.dto.response;
- using wms.dto.response.hj;
- using wms.dto.response.sx;
- using wms.service.Service;
- using wms.sqlsugar;
- using wms.sqlsugar.model.sx;
- using wms.util.Check;
- using wms.util.Ext;
- namespace wms.service.Help
- {
- /// <summary>
- /// 时效服务扩展
- /// </summary>
- public static class SxServiceHelp
- {
- #region 焊点计算
- /// <summary>
- /// 装箱时处理焊点盘
- /// </summary>
- /// <param name="rule">箱号对应的装箱规则</param>
- /// <param name="invlist">库存信息</param>
- /// <param name="outInvlist">后续可用的不带焊点盘信息</param>
- /// <returns>填充后的焊点盘列表</returns>
- public static List<StockTemp> ProcessWeldingPointsBoxing(BillPboxrule rule, IEnumerable<StockTemp>? invlist, out IEnumerable<StockTemp>? outInvlist)
- {
- var solderinvlist = new List<StockTemp>();
- invlist ??= Enumerable.Empty<StockTemp>();
- // 如果不控制焊点盘数,则直接按生产时间排序后返回
- if (rule.SolderMaxCount <= 0)
- {
- outInvlist = invlist.OrderBy(p => p.ProductTime);
- return solderinvlist;
- }
- // 计算需要获取的焊点盘数量
- int itemsPerBox = rule.SpoolType == "BS60" || rule.SpoolType == "BS40" ? 72 : 36;
- int requiredSolderBoxes = Math.Max(0, rule.FullCountQty / itemsPerBox * rule.SolderMaxCount);
- // 获取所有带焊点的盘并排序
- var availableSolders = invlist.Where(p => p.SolderCount > 0).OrderBy(p => p.ProductTime).ThenByDescending(p => p.SolderCount).ToList();
- // 根据是否管控总焊点数量来选择不同的策略
- if (rule.PerSolderMaxCount <= 0)
- {
- // 不管控总焊点数量,直接取前 N 个
- solderinvlist = availableSolders.Take(requiredSolderBoxes).ToList();
- }
- else
- {
- // 管控总焊点数量,使用 GetWeldingPointsBoxing 方法
- solderinvlist = GetWeldingPointsBoxing(
- currentBoxes: solderinvlist,
- maxBoxCount: requiredSolderBoxes,
- maxTotalSolderCount: rule.PerSolderMaxCount,
- inventory: availableSolders
- );
- }
- // 剩余可用库存为无焊点的
- outInvlist = invlist.Where(p => p.SolderCount == 0);
- return solderinvlist;
- }
- /// <summary>
- /// 获取焊点盘(装箱处理)
- /// </summary>
- /// <param name="currentBoxes">已有的焊点盘</param>
- /// <param name="maxBoxCount">最大焊点盘数</param>
- /// <param name="maxTotalSolderCount">最大焊点总数</param>
- /// <param name="inventory">库存信息</param>
- /// <returns>填充后的焊点盘列表</returns>
- public static List<StockTemp> GetWeldingPointsBoxing(List<StockTemp> currentBoxes, int maxBoxCount, int maxTotalSolderCount, IEnumerable<StockTemp>? inventory)
- {
- if (inventory == null || !inventory.Any()) return currentBoxes;
- // 当前状态统计
- var currentBoxCount = currentBoxes.Count;
- var currentTotalSolderCount = currentBoxes.Sum(x => x.SolderCount);
- // 如果已经满载,直接返回
- if (currentBoxCount >= maxBoxCount || currentTotalSolderCount >= maxTotalSolderCount) return currentBoxes;
- // 将库存转换为列表并排序,避免重复排序
- var availableInventory = inventory.Where(p => p.SolderCount > 0).OrderBy(p => p.ProductTime).ThenByDescending(p => p.SolderCount).ToList();
- foreach (var item in availableInventory)
- {
- // 判断是否还能继续添加
- if (currentBoxCount >= maxBoxCount || currentTotalSolderCount >= maxTotalSolderCount) break;
- // 添加当前项
- currentBoxes.Add(item);
- currentBoxCount++;
- currentTotalSolderCount += item.SolderCount;
- }
- return currentBoxes;
- }
- #endregion 焊点计算
- #region 获取码垛位
- /// <summary>
- /// 根据配置信息获取可用码垛位
- /// </summary>
- /// <param name="palletizingList">现有码垛位</param>
- /// <param name="config">配置表</param>
- /// <param name="code">配置信息code</param>
- /// <returns></returns>
- public static List<sxSysConfig> GetAvailablePalletizingStationsByConfiguration(this List<sxSysConfig> palletizingList, Repository<sxSysConfig> config, string code)
- {
- // 获取配置中的机器人列表
- var configuredRobots = config.GetFirst(x => x.Code == code).SContent.Split("|").Select(x => ToTitleCase(x));
- // 定义机器人及其对应的码垛位映射关系
- var robotToPalletizingMap = new Dictionary<string, List<string>>
- {
- { "Robot1", new List<string> { "8090", "8092" } },
- { "Robot2", new List<string> { "8096", "8098" } },
- { "Robot3", new List<string> { "8307" } }
- };
- // 获取所有符合条件的码垛位
- var availablePalletizingCodes = configuredRobots
- .SelectMany(robot =>
- {
- if (robotToPalletizingMap.TryGetValue(robot, out var palletizing))
- {
- return palletizing;
- }
- return Enumerable.Empty<string>();
- })
- .Distinct();
- // 返回匹配的码垛位列表
- return palletizingList.Where(palletizing => availablePalletizingCodes.Contains(palletizing.Code)).ToList();
- }
- /// <summary>
- /// 根据配置信息获取可用机械臂
- /// </summary>
- /// <param name="palletizingList">现有码垛位</param>
- /// <param name="config">配置表</param>
- /// <param name="code">配置信息code</param>
- /// <returns></returns>
- public static List<string> GetAvailablePalletizingRobotsByConfiguration(this List<string> palletizingList, Repository<sxSysConfig> config, string code)
- {
- // 获取配置中的机器人列表
- var configuredRobots = config.GetFirst(x => x.Code == code).SContent.Split("|").Select(x => ToTitleCase(x));
- // 返回匹配的码垛位列表
- return palletizingList.Select(x => ToTitleCase(x)).Where(x => configuredRobots.Contains(x)).ToList();
- }
- /// <summary>
- /// 将字符串转换为首字母大写,其他全小写
- /// </summary>
- /// <param name="str"></param>
- /// <returns></returns>
- public static string ToTitleCase(string str)
- {
- if (string.IsNullOrEmpty(str))
- {
- return str;
- }
- // 将字符串转换为全小写
- string lowerStr = str.ToLower();
- // 使用 TextInfo.ToTitleCase 转换为标题大小写
- TextInfo textInfo = CultureInfo.CurrentCulture.TextInfo;
- string titleCasedStr = textInfo.ToTitleCase(lowerStr);
- return titleCasedStr;
- }
- #endregion 获取码垛位
- #region 分配货位
- /// <summary>
- /// 申请入库货位
- /// </summary>
- /// <param name="reqEntity">申请信息</param>
- /// <param name="_wcstaskoldrepository">任务表</param>
- /// <param name="_basewarehouserepository">仓库表</param>
- /// <param name="_billInvnowrepository">库存表</param>
- /// <param name="_basewarecellrepository">货位表</param>
- /// <param name="_db">数据库连接</param>
- /// <param name="_mapper">映射器</param>
- /// <param name="_logger">日志</param>
- /// <returns></returns>
- public static SRes<List<ApplyStockInLocResponse>> ApplyStockInLocTemp(
- this SxApplyStockInLocRequest reqEntity,
- RepositoryTask<WCS_TaskOld> _wcstaskoldrepository,
- Repository<BaseWarehouse> _basewarehouserepository,
- Repository<BillInvnow> _billInvnowrepository,
- Repository<BaseWarecell> _basewarecellrepository,
- ITenant _db,
- IMapper _mapper,
- ILogger<SXService> _logger)
- {
- var result = new SRes<List<ApplyStockInLocResponse>>() { ResData = new List<ApplyStockInLocResponse>() };
- var wcstask = _wcstaskoldrepository.AsQueryable().With(SqlWith.NoLock).Where(p => reqEntity.TaskNum.Contains(p.Id) && p.Status < TaskStatus.Finish).SplitTable(tabs => tabs.Take(2)).ToList();
- if (!wcstask.Any())
- {
- result.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
- result.ResMsg = string.Join(",", reqEntity.TaskNum) + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
- return result;
- }
- if (wcstask.Any(p => p.Type == TaskType.OutDepot))
- {
- result.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
- result.ResMsg = "该任务是出库任务,不能分配货位;wms任务号" + string.Join(",", reqEntity.TaskNum);
- return result;
- }
- if (reqEntity.TaskNum.Count != wcstask.Count)
- {
- result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
- result.ResMsg = string.Join(',', reqEntity.TaskNum) + "申请的任务数与实际任务数不符";
- return result;
- }
- var warehouse = _basewarehouserepository.GetFirst(p => p.Code == "sxhouse");
- if (warehouse == null)
- {
- result.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode();
- result.ResMsg = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription();
- return result;
- }
- var stocklist = _billInvnowrepository.GetList(p => wcstask.Select(p => p.BarCode).Contains(p.ContGrpBarCode) && p.InvStateCode == InvState.InvEcecState_BuildUp.ToString());
- if (!stocklist.Any())
- {
- result.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
- result.ResMsg = string.Join(",", reqEntity.TaskNum) + ResponseStatusCodeEnum.StockNotExist.GetDescription();
- return result;
- }
- if (reqEntity.TaskNum.Count != stocklist.Count)
- {
- result.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
- result.ResMsg = string.Join(",", reqEntity.TaskNum) + "申请的任务数与库存数量不符";
- return result;
- }
- if (wcstask.Count > 1)
- {
- List<ApplyStockInLocResponse> list = new List<ApplyStockInLocResponse>();
- var code = string.Empty;
- var num = new List<int>() { reqEntity.TaskNum[1], reqEntity.TaskNum[0] };
- foreach (var item in num)
- {
- //验证库存
- var task = wcstask.Where(p => p.Id == item).First();
- var stock = stocklist.Where(p => p.ContGrpBarCode == task.BarCode).First();
- if (!string.IsNullOrEmpty(task.AddrTo) && task.Fork != 0)
- {
- var applyCell = new ApplyStockInLocResponse()
- {
- TunnelNum = reqEntity.TunnelNum.ToString(),
- CellNo = task.AddrTo,
- Row = task.AddrTo.Split('-')[0] != null ? int.Parse(task.AddrTo.Split('-')[0]) : 0,
- Colomn = task.AddrTo.Split('-')[1] != null ? int.Parse(task.AddrTo.Split('-')[1]) : 0,
- Layer = task.AddrTo.Split('-')[2] != null ? int.Parse(task.AddrTo.Split('-')[2]) : 0,
- Fork = task.Fork,
- TaskNo = task.Id
- };
- result.ResData.Add(applyCell);
- continue;
- }
- if (!string.IsNullOrEmpty(code))
- {
- var cell2 = ApplyLoc(new ApplyLocRequest()
- {
- MaterialId = stock.MatId,
- MaterialCode = stock.MatCode,
- TunnelNum = reqEntity.TunnelNum,
- WarehuoseId = warehouse.Id,
- IsMove = task.Type == TaskType.TransferDepot,
- Floor = reqEntity.Floor,
- CellCode = code,
- Fork = 2,
- Wind = stock.Wind,
- IsControlpanel = stock.IsControlpanel,
- IsTorsChk = stock.IsTorsChk,
- TorsChkQty = stock.TorsChkQty,
- ProductTime = stock.ProductTime,
- Wbgroup = stock.WbGroupCode
- }, _basewarecellrepository, _basewarehouserepository, _billInvnowrepository, _logger);
- if (cell2.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
- {
- result.ResCode = cell2.ResCode;
- result.ResMsg = item + cell2.ResMsg;
- return result;
- }
- try
- {
- cell2.ResData.Fork = 2;
- cell2.ResData.TaskNo = item;
- _db.BeginTran();
- _wcstaskoldrepository.AsUpdateable().SetColumns(p => new WCS_TaskOld()
- {
- AddrTo = cell2.ResData.CellNo,
- Fork = cell2.ResData.Fork
- }).Where(p => p.Id == item).SplitTable(p => p.Take(2)).ExecuteCommand();
- _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = LocationState.LocationState_StockIn, ContGrpBarCode = "", ContGrpId = 0, EditTime = DateTime.Now },
- p => cell2.ResData.CellNo == p.Code);
- _db.CommitTran();
- result.ResData.Add(_mapper.Map<ApplyStockInLocResponse>(cell2.ResData));
- }
- catch (Exception ex)
- {
- _db.RollbackTran();
- result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
- result.ResMsg = item + ResponseStatusCodeEnum.DataSaveErr.GetDescription() + ex.Message;
- return result;
- }
- continue;
- }
- #region 处理两个任务都是一货叉情况
- if (item == reqEntity.TaskNum[0])
- {
- var cell2 = ApplyLoc(new ApplyLocRequest()
- {
- MaterialId = stock.MatId,
- MaterialCode = stock.MatCode,
- TunnelNum = reqEntity.TunnelNum,
- WarehuoseId = warehouse.Id,
- IsMove = task.Type == TaskType.TransferDepot,
- Floor = reqEntity.Floor,
- Fork = 2,
- Wind = stock.Wind,
- IsControlpanel = stock.IsControlpanel,
- IsTorsChk = stock.IsTorsChk,
- TorsChkQty = stock.TorsChkQty,
- ProductTime = stock.ProductTime,
- Wbgroup = stock.WbGroupCode
- }, _basewarecellrepository, _basewarehouserepository, _billInvnowrepository, _logger);
- if (cell2.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
- {
- result.ResCode = cell2.ResCode;
- result.ResMsg = item + cell2.ResMsg;
- return result;
- }
- try
- {
- cell2.ResData.Fork = 2;
- cell2.ResData.TaskNo = item;
- _db.BeginTran();
- _wcstaskoldrepository.AsUpdateable().SetColumns(p => new WCS_TaskOld()
- {
- AddrTo = cell2.ResData.CellNo,
- Fork = cell2.ResData.Fork
- }).Where(p => p.Id == item).SplitTable(p => p.Take(2)).ExecuteCommand();
- _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = LocationState.LocationState_StockIn, ContGrpBarCode = "", ContGrpId = 0, EditTime = DateTime.Now },
- p => cell2.ResData.CellNo == p.Code);
- _db.CommitTran();
- result.ResData.Add(_mapper.Map<ApplyStockInLocResponse>(cell2.ResData));
- }
- catch (Exception ex)
- {
- _db.RollbackTran();
- result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
- result.ResMsg = item + ResponseStatusCodeEnum.DataSaveErr.GetDescription() + ex.Message;
- return result;
- }
- continue;
- }
- #endregion 处理两个任务都是一货叉情况
- var cell1 = ApplyLoc(new ApplyLocRequest()
- {
- MaterialId = stock.MatId,
- MaterialCode = stock.MatCode,
- TunnelNum = reqEntity.TunnelNum,
- WarehuoseId = warehouse.Id,
- IsMove = task.Type == TaskType.TransferDepot,
- Floor = reqEntity.Floor,
- Fork = 1,
- Wind = stock.Wind,
- IsControlpanel = stock.IsControlpanel,
- IsTorsChk = stock.IsTorsChk,
- TorsChkQty = stock.TorsChkQty,
- ProductTime = stock.ProductTime,
- Wbgroup = stock.WbGroupCode
- }, _basewarecellrepository, _basewarehouserepository, _billInvnowrepository, _logger);
- if (cell1.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
- {
- result.ResCode = cell1.ResCode;
- result.ResMsg = item + cell1.ResMsg;
- return result;
- }
- try
- {
- cell1.ResData.Fork = 1;
- cell1.ResData.TaskNo = item;
- code = cell1.ResData.CellNo;
- _db.BeginTran();
- _wcstaskoldrepository.AsUpdateable().SetColumns(p => new WCS_TaskOld()
- {
- AddrTo = cell1.ResData.CellNo,
- Fork = cell1.ResData.Fork
- }).Where(p => p.Id == item).SplitTable(p => p.Take(2)).ExecuteCommand();
- _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = LocationState.LocationState_StockIn, ContGrpBarCode = "", ContGrpId = 0, EditTime = DateTime.Now },
- p => cell1.ResData.CellNo == p.Code);
- _db.CommitTran();
- result.ResData.Add(_mapper.Map<ApplyStockInLocResponse>(cell1.ResData));
- }
- catch (Exception ex)
- {
- _db.RollbackTran();
- result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
- result.ResMsg = item + ResponseStatusCodeEnum.DataSaveErr.GetDescription() + ex.Message;
- return result;
- }
- }
- }
- else
- {
- //验证库存
- var stock = stocklist.Where(p => p.ContGrpBarCode == wcstask.First().BarCode).First();
- if (stock == null)
- {
- result.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
- result.ResMsg = wcstask.First().Id + ResponseStatusCodeEnum.StockNotExist.GetDescription();
- return result;
- }
- if (!string.IsNullOrEmpty(wcstask.First().AddrTo) && wcstask.First().Fork != 0)
- {
- var applyCell = new ApplyStockInLocResponse()
- {
- TunnelNum = reqEntity.TunnelNum.ToString(),
- CellNo = wcstask.First().AddrTo,
- Row = wcstask.First().AddrTo.Split('-')[0] != null ? int.Parse(wcstask.First().AddrTo.Split('-')[0]) : 0,
- Colomn = wcstask.First().AddrTo.Split('-')[1] != null ? int.Parse(wcstask.First().AddrTo.Split('-')[1]) : 0,
- Layer = wcstask.First().AddrTo.Split('-')[2] != null ? int.Parse(wcstask.First().AddrTo.Split('-')[2]) : 0,
- Fork = wcstask.First().Fork,
- TaskNo = wcstask.First().Id
- };
- result.ResData.Add(applyCell);
- return result;
- }
- var cell1 = ApplyLoc(new ApplyLocRequest()
- {
- MaterialId = stock.MatId,
- MaterialCode = stock.MatCode,
- TunnelNum = reqEntity.TunnelNum,
- WarehuoseId = warehouse.Id,
- IsMove = wcstask.First().Type == TaskType.TransferDepot,
- Floor = reqEntity.Floor,
- Fork = 2,
- Wind = stock.Wind,
- IsControlpanel = stock.IsControlpanel,
- IsTorsChk = stock.IsTorsChk,
- TorsChkQty = stock.TorsChkQty,
- ProductTime = stock.ProductTime,
- Wbgroup = stock.WbGroupCode
- }, _basewarecellrepository, _basewarehouserepository, _billInvnowrepository, _logger);
- if (cell1.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
- {
- result.ResCode = cell1.ResCode;
- result.ResMsg = wcstask.First().Id + cell1.ResMsg;
- return result;
- }
- try
- {
- cell1.ResData.TaskNo = wcstask.First().Id;
- cell1.ResData.Fork = 2;
- _db.BeginTran();
- _wcstaskoldrepository.AsUpdateable().SetColumns(p => new WCS_TaskOld()
- {
- AddrTo = cell1.ResData.CellNo,
- Fork = cell1.ResData.Fork,
- }).Where(p => p.Id == wcstask.First().Id).SplitTable(p => p.Take(2)).ExecuteCommand();
- _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = LocationState.LocationState_StockIn, ContGrpBarCode = "", ContGrpId = 0, EditTime = DateTime.Now },
- p => p.Code == cell1.ResData.CellNo);
- _db.CommitTran();
- result.ResData.Add(_mapper.Map<ApplyStockInLocResponse>(cell1.ResData));
- }
- catch (Exception ex)
- {
- _db.RollbackTran();
- result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
- result.ResMsg = wcstask.First().Id + ResponseStatusCodeEnum.DataSaveErr.GetDescription() + ex.Message;
- }
- }
- return result;
- }
- /// <summary>
- /// 申请移库库位及创建移库任务
- /// </summary>
- /// <param name="Cell">目标货位</param>
- /// <param name="_wcstaskoldrepository">历史任务表</param>
- /// <param name="_basewarehouserepository">仓库表</param>
- /// <param name="_billInvnowrepository">库存表</param>
- /// <param name="_basewarecellrepository">货位表</param>
- /// <param name="_taskrepository">任务表</param>
- /// <param name="_taskdetailrepository">任务明细表</param>
- /// <param name="_db">数据库链接</param>
- /// <param name="_logger">日志</param>
- /// <param name="_mapper">映射器</param>
- /// <param name="lockerPalletizingPackTask">装箱任务锁</param>
- /// <param name="lockerApplyLoc">申请货位锁</param>
- /// <returns></returns>
- public static SRes MoveTask(
- this string Cell,
- RepositoryTask<WCS_TaskOld> _wcstaskoldrepository,
- Repository<BaseWarehouse> _basewarehouserepository,
- Repository<BillInvnow> _billInvnowrepository,
- Repository<BaseWarecell> _basewarecellrepository,
- RepositoryTask<WCS_TaskInfo> _taskrepository,
- RepositoryTask<WCS_TaskDtl> _taskdetailrepository,
- ITenant _db,
- ILogger<SXService> _logger,
- IMapper _mapper,
- object lockerPalletizingPackTask,
- object lockerApplyLoc)
- {
- lock (lockerPalletizingPackTask)
- {
- var res = new SRes() { Memo1 = "1" };
- var cellform = _basewarecellrepository.GetFirst(p => p.Code == Cell && p.Depth == 2);
- if (cellform == null)
- {
- res.ResCode = ResponseStatusCodeEnum.WareLocationCodeNotExist.GetHashCode();
- res.ResMsg = "该任务所在货位不是二深货位";
- res.Memo1 = "1";
- return res;
- }
- var cellTo = _basewarecellrepository.GetFirst(p => p.Col == cellform.Col && p.Layer == cellform.Layer && p.Shelf == cellform.Shelf && p.Depth == 1 && p.IsStop == 0 && p.Floor == cellform.Floor && p.Tunnel == cellform.Tunnel);
- if (cellTo == null)
- {
- res.ResCode = ResponseStatusCodeEnum.WareLocationCodeNotExist.GetHashCode();
- res.ResMsg = Cell + "对应一深位货位被禁用或者不存在";
- res.Memo1 = "1"; //1:不允许生成出库任务;2:允许
- return res;
- }
- lock (lockerApplyLoc)
- {
- try
- {
- if (cellTo.StateNum == LocationState.LocationState_Empty)
- {
- res.Memo1 = "2";
- return res;
- }
- else if (cellTo.StateNum == LocationState.LocationState_Full)
- {
- var stock = _billInvnowrepository.GetFirst(p => p.ContGrpBarCode == cellTo.ContGrpBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
- if (stock == null)
- {
- res.ResCode = WcsContractWcsMoveTaskEnum.失败.GetHashCode();
- res.ResMsg = "一深位库存信息异常,没有查到库存信息";
- res.Memo1 = "1";
- return res;
- }
- //库位
- var cell = ApplyLoc(new ApplyLocRequest()
- {
- IsMove = true,
- MaterialId = stock.MatId,
- MaterialCode = stock.MatCode,
- TunnelNum = cellTo.Tunnel,
- WarehuoseId = cellTo.WarehouseId,
- Floor = cellTo.Floor,
- Fork = 2,
- Wbgroup = stock.WbGroupCode,
- Wind = stock.Wind,
- IsControlpanel = stock.IsControlpanel,
- IsTorsChk = stock.IsTorsChk,
- TorsChkQty = stock.TorsChkQty,
- ProductTime = stock.ProductTime
- }, _basewarecellrepository, _basewarehouserepository, _billInvnowrepository, _logger);
- if (string.IsNullOrEmpty(cell.ResData.CellNo))
- {
- res.ResCode = WcsContractWcsMoveTaskEnum.失败.GetHashCode();
- res.ResMsg = cell.ResMsg;
- res.Memo1 = "1";
- return res;
- }
- if (!_basewarecellrepository.IsAny(p => p.Code == cell.ResData.CellNo && p.Row == cell.ResData.Row && p.Col == cell.ResData.Colomn && p.Layer == cell.ResData.Layer && p.StateNum == LocationState.LocationState_Empty && p.IsStop == 0))
- {
- res.ResCode = WcsContractWcsMoveTaskEnum.失败.GetHashCode();
- res.ResMsg = cell.ResData.CellNo + "已被使用";
- res.Memo1 = "1";
- return res;
- }
- if (_wcstaskoldrepository.AsQueryable().Where(p => p.Status < TaskStatus.Finish && (p.Type == TaskType.EnterDepot || p.Type == TaskType.TransferDepot) && p.AddrTo == cell.ResData.CellNo).SplitTable(p => p.Take(2)).Any())
- {
- res.ResCode = WcsContractWcsMoveTaskEnum.失败.GetHashCode();
- res.ResMsg = cell.ResData.CellNo + "存在未结束的入库任务或移库任务,不允许使用";
- res.Memo1 = "1";
- return res;
- }
- var wcs = new WCS_TaskInfo()
- {
- Type = TaskType.TransferDepot,
- Status = TaskStatus.NewBuild,
- Priority = 0,
- Device = cellTo.SCRel,
- SrmStation = "",
- AddrFrom = cellTo.Code,
- AddrTo = cell.ResData.CellNo,
- LastInteractionPoint = "",
- BarCode = stock.ContGrpBarCode,
- Length = stock.LengthQty,
- AddTime = DateTime.Now,
- StartTime = DateTime.Now,
- DocID = 0,
- PalletType = 1,
- ProdLine = 0,
- AddWho = "wms",
- WarehouseCode = cellTo.WarehouseCode,
- Enabled = true,
- WorkBench = "",
- Tunnel = cellTo.Tunnel.ToString(),
- Floor = cellTo.Floor,
- BusType = CpTaskBusType.TaskBusType_CP_Move.GetDescription()
- };
- _db.BeginTran();
- var celltemp = _basewarecellrepository.GetSingle(p => p.Code == cell.ResData.CellNo);
- if (celltemp.StateNum != LocationState.LocationState_Empty || celltemp.ContGrpId > 0 || !string.IsNullOrEmpty(celltemp.ContGrpBarCode))
- {
- _db.RollbackTran();
- res.ResCode = WcsContractWcsMoveTaskEnum.失败.GetHashCode();
- res.ResMsg = cell.ResData.CellNo + "已被使用";
- res.Memo1 = "1";
- _logger.LogInformation("货位状态1:" + celltemp.StateNum + ",code:" + cell.ResData.CellNo);
- return res;
- }
- _logger.LogInformation("货位状态2:" + celltemp.StateNum + ",code:" + cell.ResData.CellNo);
- var task = _taskrepository.InsertReturnEntity(wcs);
- _wcstaskoldrepository.InsertableSplitTable(_mapper.Map<WCS_TaskOld>(task));
- var taskdlt = new WCS_TaskDtl()
- {
- ID = Guid.NewGuid(),
- CurPoint = task.AddrFrom,
- AddTime = DateTime.Now,
- AddWho = "wms",
- Enabled = true,
- ParentTaskCode = task.ID,
- Desc = task.AddrFrom + "移库至" + task.AddrTo,
- };
- _taskdetailrepository.InsertableSplitTable(taskdlt);
- _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = LocationState.LocationState_StockMove, EditTime = DateTime.Now }, p => p.Code == task.AddrFrom);
- _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = LocationState.LocationState_StockMove, EditTime = DateTime.Now }, p => p.Code == task.AddrTo);
- _db.CommitTran();
- res.Memo1 = "2";
- }
- else if (cellTo.StateNum == LocationState.LocationState_StockIn)
- {
- res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
- res.ResMsg = "一升位有入库任务,二升位不允许出库";
- res.Memo1 = "1";
- return res;
- }
- else if (cellTo.StateNum == LocationState.LocationState_StockOut)
- {
- res.Memo1 = "2";
- return res;
- }
- else if (cellTo.StateNum == LocationState.LocationState_StockMove)
- {
- res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
- res.ResMsg = "一升位有移库任务,二升位不允许出库";
- res.Memo1 = "1";
- return res;
- }
- }
- catch (Exception ex)
- {
- _db.RollbackTran();
- _logger.LogInformation("移库任务创建失败" + ex.ToString());
- res.ResCode = WcsContractWcsMoveTaskEnum.失败.GetHashCode();
- res.ResMsg = WcsContractWcsMoveTaskEnum.失败.GetDescription();
- res.Memo1 = "1";
- }
- }
- return res;
- }
- }
- /// <summary>
- /// 申请货位
- /// </summary>
- /// <param name="reqEntity">申请信息</param>
- /// <param name="_basewarecellrepository">货位表</param>
- /// <param name="_basewarehouserepository">仓库表</param>
- /// <param name="_billInvnowrepository">库存表</param>
- /// <param name="_logger">日志</param>
- /// <returns></returns>
- public static SRes<ApplyStockInLocResponse> ApplyLoc(
- ApplyLocRequest reqEntity,
- Repository<BaseWarecell> _basewarecellrepository,
- Repository<BaseWarehouse> _basewarehouserepository,
- Repository<BillInvnow> _billInvnowrepository,
- ILogger<SXService> _logger)
- {
- var result = new SRes<ApplyStockInLocResponse>()
- {
- ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode(),
- ResMsg = ResponseStatusCodeEnum.Sucess.GetDescription(),
- ResData = new ApplyStockInLocResponse(),
- };
- //预留货位数量
- var emptyLoc = _basewarecellrepository.GetList(p => p.IsStop == 0
- && p.StateNum == LocationState.LocationState_Empty
- && p.TypeNum == LocationType.LocationType_StorageLocation
- && p.Tunnel == reqEntity.TunnelNum
- && p.WarehouseId == reqEntity.WarehuoseId
- && p.Floor == reqEntity.Floor
- );
- //判断是否移库
- if (!reqEntity.IsMove && (emptyLoc == null || emptyLoc.Count < 10))
- {
- result.ResCode = ResponseStatusCodeEnum.NotEnoughLocation.GetHashCode();
- result.ResMsg = ResponseStatusCodeEnum.NotEnoughLocation.GetDescription();
- return result;
- }
- var loc1ist = from loct1 in _basewarecellrepository.GetList(loc1 => loc1.IsStop == 0 && loc1.StateNum == LocationState.LocationState_Empty
- && loc1.TypeNum == LocationType.LocationType_StorageLocation
- && loc1.Tunnel == reqEntity.TunnelNum
- && loc1.WarehouseId == reqEntity.WarehuoseId
- && loc1.Floor == reqEntity.Floor && loc1.Depth == 1).ToList()
- join loct2 in _basewarecellrepository.GetList(loc2 => loc2.IsStop == 0 && loc2.IsStop == 0 && loc2.Depth == 2 && loc2.StateNum == LocationState.LocationState_Full
- && loc2.Tunnel == reqEntity.TunnelNum && loc2.Floor == reqEntity.Floor).ToList()
- on new { loct1.Shelf, loct1.Col, loct1.Layer } equals new { loct2.Shelf, loct2.Col, loct2.Layer }
- join stock in _billInvnowrepository.GetList(inv => inv.InvStateCode == InvState.InvEcecState_In.ToString() && string.IsNullOrEmpty(inv.PreStock))
- on loct2.ContGrpBarCode equals stock.ContGrpBarCode
- where loct1.Tunnel == reqEntity.TunnelNum && loct1.Floor == reqEntity.Floor
- select new stocktemp1
- {
- Code = loct1.Code.ToString(),
- Id = loct1.Id,
- Row = loct1.Row,
- Col = loct1.Col,
- Layer = loct1.Layer,
- Tunnel = loct1.Tunnel,
- Floor = loct1.Floor,
- ContGrpBarCode = loct2.ContGrpBarCode,
- Shelf = loct2.Shelf,
- MatCode = stock.MatCode,
- MatId = stock.MatId,
- WbGroupCode = stock.WbGroupCode,
- InDocsNo = stock.InDocsNo,
- Wind = stock.Wind,
- IsControlpanel = stock.IsControlpanel,
- IsTorsChk = stock.IsTorsChk,
- TorsChkQty = stock.TorsChkQty,
- ProductTime = stock.ProductTime
- };
- #region 非控制盘、已扭转的控制盘
- if (reqEntity.IsControlpanel == false)
- {
- if (loc1ist != null && loc1ist.ToList().Where(p => p.MatId == reqEntity.MaterialId && p.Wind == reqEntity.Wind && p.IsControlpanel == reqEntity.IsControlpanel
- && p.WbGroupCode == reqEntity.Wbgroup && Math.Abs((p.ProductTime - reqEntity.ProductTime).TotalHours) < 1).Any())
- {
- if (reqEntity.Fork == 1)
- {
- if (loc1ist.ToList().Where(p => p.MatId == reqEntity.MaterialId && p.Col < 70 && p.Wind == reqEntity.Wind && p.IsControlpanel == reqEntity.IsControlpanel
- && p.WbGroupCode == reqEntity.Wbgroup && Math.Abs((p.ProductTime - reqEntity.ProductTime).TotalHours) < 1).Any())
- {
- var resloc = loc1ist.ToList().Where(p => p.MatId == reqEntity.MaterialId && p.Col < 70 && p.Wind == reqEntity.Wind && p.IsControlpanel == reqEntity.IsControlpanel
- && p.WbGroupCode == reqEntity.Wbgroup && Math.Abs((p.ProductTime - reqEntity.ProductTime).TotalHours) < 1).OrderBy(p => p.ProductTime).ThenBy(p => p.Col).ThenBy(p => p.Layer).ThenBy(p => p.Row).First();
- result.ResData.TunnelNum = resloc.Tunnel.ToString();
- result.ResData.CellNo = resloc.Code;
- result.ResData.Row = resloc.Row;
- result.ResData.Colomn = resloc.Col;
- result.ResData.Layer = resloc.Layer;
- _logger.LogInformation("分货位埋点1:" + result.ResData.CellNo);
- return result;
- }
- }
- else
- {
- var resloc = loc1ist.ToList().Where(p => p.MatId == reqEntity.MaterialId && p.Wind == reqEntity.Wind && p.IsControlpanel == reqEntity.IsControlpanel
- && p.WbGroupCode == reqEntity.Wbgroup && Math.Abs((p.ProductTime - reqEntity.ProductTime).TotalHours) < 1).OrderBy(p => p.ProductTime).ThenBy(p => p.Col).ThenBy(p => p.Layer).ThenBy(p => p.Row).First();
- result.ResData.TunnelNum = resloc.Tunnel.ToString();
- result.ResData.CellNo = resloc.Code;
- result.ResData.Row = resloc.Row;
- result.ResData.Colomn = resloc.Col;
- result.ResData.Layer = resloc.Layer;
- _logger.LogInformation("分货位埋点2:" + result.ResData.CellNo);
- return result;
- }
- }
- }
- else
- {
- if (reqEntity.IsControlpanel == true && reqEntity.IsTorsChk == true && reqEntity.TorsChkQty > 0) //已扭转完
- {
- //var starttime = reqEntity.ProductTime.Date.AddHours(13);
- //var endtime = reqEntity.ProductTime.Date.AddDays(1).AddHours(8);
- if (loc1ist != null && loc1ist.ToList().Where(p => p.MatId == reqEntity.MaterialId && p.Wind == reqEntity.Wind && p.IsControlpanel == reqEntity.IsControlpanel
- && p.WbGroupCode == reqEntity.Wbgroup && reqEntity.IsTorsChk == p.IsTorsChk && p.TorsChkQty > 0).Any())// && p.ProductTime >= starttime && p.ProductTime <= endtime
- {
- if (reqEntity.Fork == 1)
- {
- if (loc1ist.ToList().Where(p => p.MatId == reqEntity.MaterialId && p.Col < 70 && p.Wind == reqEntity.Wind && p.IsControlpanel == reqEntity.IsControlpanel
- && p.WbGroupCode == reqEntity.Wbgroup && reqEntity.IsTorsChk == p.IsTorsChk && p.TorsChkQty > 0).Any())//&& p.ProductTime >= starttime && p.ProductTime <= endtime
- {
- var resloc = loc1ist.ToList().Where(p => p.MatId == reqEntity.MaterialId && p.Col < 70 && p.Wind == reqEntity.Wind && p.IsControlpanel == reqEntity.IsControlpanel
- && p.WbGroupCode == reqEntity.Wbgroup && reqEntity.IsTorsChk == p.IsTorsChk && p.TorsChkQty > 0).OrderBy(p => p.Col).ThenBy(p => p.Layer).ThenBy(p => p.Row).First();//&& p.ProductTime >= starttime && p.ProductTime <= endtime
- result.ResData.TunnelNum = resloc.Tunnel.ToString();
- result.ResData.CellNo = resloc.Code;
- result.ResData.Row = resloc.Row;
- result.ResData.Colomn = resloc.Col;
- result.ResData.Layer = resloc.Layer;
- _logger.LogInformation("分货位埋点3:" + result.ResData.CellNo);
- return result;
- }
- }
- else
- {
- var resloc = loc1ist.ToList().Where(p => p.MatId == reqEntity.MaterialId && p.Wind == reqEntity.Wind && p.IsControlpanel == reqEntity.IsControlpanel
- && p.WbGroupCode == reqEntity.Wbgroup && reqEntity.IsTorsChk == p.IsTorsChk && p.TorsChkQty > 0).OrderBy(p => p.Col).ThenBy(p => p.Layer).ThenBy(p => p.Row).First();//&& p.ProductTime >= starttime && p.ProductTime <= endtime
- result.ResData.TunnelNum = resloc.Tunnel.ToString();
- result.ResData.CellNo = resloc.Code;
- result.ResData.Row = resloc.Row;
- result.ResData.Colomn = resloc.Col;
- result.ResData.Layer = resloc.Layer;
- _logger.LogInformation("分货位埋点4:" + result.ResData.CellNo);
- return result;
- }
- }
- }
- }
- #endregion 非控制盘、已扭转的控制盘
- //再找二深位空的
- if (emptyLoc.Where(p => p.Depth == 2).Any())
- {
- //一深位必须空
- var templist = from loc1 in _basewarecellrepository.GetList(p => p.Depth == 1 && p.StateNum == LocationState.LocationState_Empty && p.IsStop == 0 && p.Floor == reqEntity.Floor && p.Tunnel == reqEntity.TunnelNum)
- join loc2 in emptyLoc.Where(p => p.Depth == 2) on new { loc1.Col, loc1.Layer } equals new { loc2.Col, loc2.Layer }
- select loc2;
- if (templist == null || !templist.Any())
- {
- result.ResCode = ResponseStatusCodeEnum.NotEnoughLocation.GetHashCode();
- result.ResMsg = ResponseStatusCodeEnum.NotEnoughLocation.GetDescription() + "没有可用的二升位";
- _logger.LogInformation("分货位埋点5:" + result.ResData.CellNo);
- return result;
- }
- if (!string.IsNullOrEmpty(reqEntity.CellCode))
- {
- var cell = reqEntity.CellCode.Split('-');
- if (cell[4] == "2")
- {
- var cell2 = templist.Where(p => p.Depth == 2 && p.Shelf == cell[3]).OrderBy(p => p.Layer).ThenBy(p => p.Col).ThenBy(p => p.Row); //优先同货架相邻同层货位
- if (cell2.Where(p => p.Depth == 2 && p.Shelf == cell[3] && p.Layer == int.Parse(cell[2])).Any())
- {
- var cell3 = templist.Where(p => p.Depth == 2 && p.Shelf == cell[3] && p.Layer == int.Parse(cell[2])).OrderBy(p => p.Col).ThenBy(p => p.Row).First();
- result.ResData.TunnelNum = cell3.Tunnel.ToString();
- result.ResData.CellNo = cell3.Code;
- result.ResData.Row = cell3.Row;
- result.ResData.Colomn = cell3.Col;
- result.ResData.Layer = cell3.Layer;
- result.ResData.Fork = 2;
- _logger.LogInformation("分货位埋点6:" + result.ResData.CellNo);
- return result;
- }
- else
- {
- if (cell2.Any())
- {
- var cell4 = cell2.First();
- result.ResData.TunnelNum = cell4.Tunnel.ToString();
- result.ResData.CellNo = cell4.Code;
- result.ResData.Row = cell4.Row;
- result.ResData.Colomn = cell4.Col;
- result.ResData.Layer = cell4.Layer;
- result.ResData.Fork = 2;
- _logger.LogInformation("分货位埋点7:" + result.ResData.CellNo);
- return result;
- }
- else
- {
- var cell4 = templist.OrderBy(p => p.Col).ThenBy(p => p.Layer).ThenBy(p => p.Row).First();
- result.ResData.TunnelNum = cell4.Tunnel.ToString();
- result.ResData.CellNo = cell4.Code;
- result.ResData.Row = cell4.Row;
- result.ResData.Colomn = cell4.Col;
- result.ResData.Layer = cell4.Layer;
- result.ResData.Fork = 2;
- _logger.LogInformation("分货位埋点8:" + result.ResData.CellNo);
- return result;
- }
- }
- }
- }
- if (reqEntity.Fork == 2)
- {
- //var resloc = templist.Where(p => p.Depth == 2).OrderBy(p => p.Layer).ThenBy(p => p.Col).ThenBy(p => p.Row).First();
- var resloc = templist.Where(p => p.Depth == 2).OrderBy(p => p.Col).ThenBy(p => p.Layer).ThenBy(p => p.Row).First();
- result.ResData.TunnelNum = resloc.Tunnel.ToString();
- result.ResData.CellNo = resloc.Code;
- result.ResData.Row = resloc.Row;
- result.ResData.Colomn = resloc.Col;
- result.ResData.Layer = resloc.Layer;
- _logger.LogInformation("分货位埋点9:" + result.ResData.CellNo);
- return result;
- }
- else
- {
- //templist.Where(p => p.Depth == 2 && p.Col < 70).OrderBy(p => p.Layer).ThenBy(p => p.Col).ThenBy(p => p.Row).Any()
- if (templist.Where(p => p.Depth == 2 && p.Col < 70).OrderBy(p => p.Col).ThenBy(p => p.Layer).ThenBy(p => p.Row).Any())
- {
- //var resloc = templist.Where(p => p.Depth == 2 && p.Col < 70).OrderBy(p => p.Layer).ThenBy(p => p.Col).ThenBy(p => p.Row).First();
- var resloc = templist.Where(p => p.Depth == 2 && p.Col < 70).OrderBy(p => p.Col).ThenBy(p => p.Layer).ThenBy(p => p.Row).First();
- result.ResData.TunnelNum = resloc.Tunnel.ToString();
- result.ResData.CellNo = resloc.Code;
- result.ResData.Row = resloc.Row;
- result.ResData.Colomn = resloc.Col;
- result.ResData.Layer = resloc.Layer;
- _logger.LogInformation("分货位埋点10:" + result.ResData.CellNo);
- return result;
- }
- else
- {
- }
- }
- }
- if (loc1ist == null || !loc1ist.Any())
- {
- result.ResCode = ResponseStatusCodeEnum.NotEnoughLocation.GetHashCode();
- result.ResMsg = ResponseStatusCodeEnum.NotEnoughLocation.GetDescription() + "没有可用的一升位货位";
- _logger.LogInformation("分货位埋点11:" + result.ResData.CellNo);
- return result;
- }
- if (reqEntity.Fork == 1)
- {
- if (loc1ist.ToList().Where(p => p.Col < 70).Any())
- {
- var aa = loc1ist.ToList();
- var code = aa.Where(p => p.Col < 70).OrderBy(p => p.Col).ThenBy(p => p.Layer).ThenBy(p => p.Row).First();
- result.ResData.TunnelNum = code.Tunnel.ToString();
- result.ResData.CellNo = code.Code;
- result.ResData.Row = code.Row;
- result.ResData.Colomn = code.Col;
- result.ResData.Layer = code.Layer;
- _logger.LogInformation("分货位埋点12:" + result.ResData.CellNo);
- return result;
- }
- else
- {
- result.ResCode = ResponseStatusCodeEnum.NotEnoughLocation.GetHashCode();
- result.ResMsg = "一货叉没有可用库位";
- _logger.LogInformation("分货位埋点13:" + result.ResData.CellNo);
- return result;
- }
- }
- var loc1ist11 = from loct1 in _basewarecellrepository.GetList(loc1 => loc1.IsStop == 0 && loc1.StateNum == LocationState.LocationState_Empty
- && loc1.TypeNum == LocationType.LocationType_StorageLocation
- && loc1.Tunnel == reqEntity.TunnelNum
- && loc1.WarehouseId == reqEntity.WarehuoseId
- && loc1.Floor == reqEntity.Floor && loc1.Depth == 1 && loc1.Floor == reqEntity.Floor).ToList()
- join loct2 in _basewarecellrepository.GetList(loc2 => loc2.IsStop == 0 && loc2.Depth == 2 && loc2.StateNum == LocationState.LocationState_Full
- && loc2.Tunnel == reqEntity.TunnelNum && loc2.Floor == reqEntity.Floor
- ).ToList()
- on new { loct1.Shelf, loct1.Col, loct1.Layer } equals new { loct2.Shelf, loct2.Col, loct2.Layer }
- select loct1;
- var loc = loc1ist11.ToList().OrderBy(p => p.Col).ThenBy(p => p.Layer).ThenBy(p => p.Row).First();
- //var loc = loc1ist.First();
- result.ResData.TunnelNum = loc.Tunnel.ToString();
- result.ResData.CellNo = loc.Code;
- result.ResData.Row = loc.Row;
- result.ResData.Colomn = loc.Col;
- result.ResData.Layer = loc.Layer;
- _logger.LogInformation("分货位埋点14:" + result.ResData.CellNo);
- return result;
- }
- #endregion 分配货位
- /// <summary>
- /// 码垛工位与对应的机器人的关系
- /// </summary>
- /// <param name="palletequip"></param>
- /// <returns></returns>
- public static string DetermineRoot(string palletequip)
- {
- return palletequip switch
- {
- "8090" => "Robot1",
- "8092" => "Robot1",
- "8096" => "Robot2",
- "8098" => "Robot2",
- "8307" => "Robot3",
- "5434" => "Robot10",
- _ => string.Empty // 默认值或其他处理
- };
- }
- /// <summary>
- /// 创建码垛任务
- /// </summary>
- /// <param name="request"></param>
- /// <param name="_wareCell"></param>
- /// <param name="_invNow"></param>
- /// <param name="_invFlow"></param>
- /// <param name="_task"></param>
- /// <param name="_wcsTaskOld"></param>
- /// <param name="_taskDetail"></param>
- /// <param name="_db"></param>
- /// <param name="_mapper"></param>
- /// <param name="lockerPalletizingPackTask"></param>
- /// <returns></returns>
- public static SRes PalletizingPackTask(
- PalletizingPackTaskRequest request,
- Repository<BaseWarecell> _wareCell,
- Repository<BillInvnow> _invNow,
- Repository<BillInvflow> _invFlow,
- RepositoryTask<WCS_TaskInfo> _task,
- RepositoryTask<WCS_TaskOld> _wcsTaskOld,
- RepositoryTask<WCS_TaskDtl> _taskDetail,
- ITenant _db,
- IMapper _mapper,
- object lockerPalletizingPackTask)
- {
- lock (lockerPalletizingPackTask)
- {
- var res = new SRes();
- try
- {
- var wcs = new WCS_TaskInfo()
- {
- Status = TaskStatus.NewBuild,
- Type = TaskType.OutDepot,
- Priority = 0,
- Device = request.Srm,
- SrmStation = request.Srm,
- AddrFrom = request.CellCode,
- BarCode = request.Code,
- AddWho = "wms",
- EditWho = "wms",
- WarehouseCode = "sxhouse",
- AddrTo = request.Equip,
- FullQty = 1,
- AgvTaskID = request.PalletLayer, //层配层数
- Tunnel = request.Tunnel,
- MaterialCode = request.Mater,
- MatCode = request.Mater,
- OutType = OutTypeEnum.自动出库任务,
- BusType = SxTaskBusType.TaskBusType_SX_StackStockOut.GetDescription(),
- Floor = request.Floor,
- Grade = request.Grade,
- WorkBench = request.ProductMachCode,
- PalletizingId = request.PalletizingId,
- Robot = request.Robot,
- GoodsType = request.GoodsType,
- ManualRemarks = request.Memo,
- DocID = request.DocId
- };
- _db.BeginTran();
- _invNow.UpdateSetColumnsTrue(p => new BillInvnow()
- {
- InvStateCode = InvState.InvEcecState_OutGoing.ToString(),
- EditTime = DateTime.Now
- }, p => p.ContGrpBarCode == request.Code);
- _wareCell.UpdateSetColumnsTrue(p => new BaseWarecell()
- {
- StateNum = LocationState.LocationState_StockOut,
- EditTime = DateTime.Now
- }, p => p.Code == request.CellCode);
- var stock = _invNow.GetSingle(p => p.ContGrpBarCode == request.Code);
- var flow = _mapper.Map<BillInvflow>(stock);
- flow.Id = GetId();
- flow.AddTime = DateTime.Now;
- flow.EditTime = DateTime.Now;
- flow.InvStateCode = InvState.InvEcecState_OutGoing.ToString();
- flow.Memo = "装箱码垛出库";
- _invFlow.Insert(flow);
- var wcstask = _task.InsertReturnEntity(wcs);
- _wcsTaskOld.InsertableSplitTable(_mapper.Map<WCS_TaskOld>(wcstask));
- var wcsdtl = new WCS_TaskDtl()
- {
- ID = Guid.NewGuid(),
- CurPoint = request.Code,
- AddTime = DateTime.Now,
- AddWho = "wms",
- Enabled = true,
- ParentTaskCode = wcstask.ID,
- Desc = wcstask.BusType
- };
- _taskDetail.InsertableSplitTable(wcsdtl);
- _db.CommitTran();
- }
- catch (Exception ex)
- {
- _db.RollbackTran();
- res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
- res.ResMsg = ResponseStatusCodeEnum.DataSaveErr.GetDescription();
- return res;
- }
- return res;
- }
- }
- /// <summary>
- /// 获取ID
- /// </summary>
- /// <returns></returns>
- public static long GetId()
- {
- return IdFactory.NewId();
- }
- }
- }
|