SxServiceHelp.cs 54 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014
  1. using AutoMapper;
  2. using Microsoft.Extensions.Logging;
  3. using SqlSugar;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Data;
  7. using System.Globalization;
  8. using System.Linq;
  9. using WCS.Entity.sx;
  10. using wms.dto;
  11. using wms.dto.request.sx;
  12. using wms.dto.response;
  13. using wms.dto.response.hj;
  14. using wms.dto.response.sx;
  15. using wms.service.Service;
  16. using wms.sqlsugar;
  17. using wms.sqlsugar.model.sx;
  18. using wms.util.Ext;
  19. namespace wms.service.Help
  20. {
  21. /// <summary>
  22. /// 时效服务扩展
  23. /// </summary>
  24. public static class SxServiceHelp
  25. {
  26. #region 焊点计算
  27. /// <summary>
  28. /// 装箱时处理焊点盘
  29. /// </summary>
  30. /// <param name="rule">箱号对应的装箱规则</param>
  31. /// <param name="invlist">库存信息</param>
  32. /// <param name="outInvlist">后续可用的不带焊点盘信息</param>
  33. /// <returns>填充后的焊点盘列表</returns>
  34. public static List<StockTemp> ProcessWeldingPointsBoxing(BillPboxrule rule, IEnumerable<StockTemp>? invlist, out IEnumerable<StockTemp>? outInvlist)
  35. {
  36. var solderinvlist = new List<StockTemp>();
  37. invlist ??= Enumerable.Empty<StockTemp>();
  38. // 如果不控制焊点盘数,则直接按生产时间排序后返回
  39. if (rule.SolderMaxCount <= 0)
  40. {
  41. outInvlist = invlist.OrderBy(p => p.ProductTime);
  42. return solderinvlist;
  43. }
  44. // 计算需要获取的焊点盘数量
  45. int itemsPerBox = rule.SpoolType == "BS60" || rule.SpoolType == "BS40" ? 72 : 36;
  46. int requiredSolderBoxes = Math.Max(0, rule.FullCountQty / itemsPerBox * rule.SolderMaxCount);
  47. // 获取所有带焊点的盘并排序
  48. var availableSolders = invlist.Where(p => p.SolderCount > 0).OrderBy(p => p.ProductTime).ThenByDescending(p => p.SolderCount).ToList();
  49. // 根据是否管控总焊点数量来选择不同的策略
  50. if (rule.PerSolderMaxCount <= 0)
  51. {
  52. // 不管控总焊点数量,直接取前 N 个
  53. solderinvlist = availableSolders.Take(requiredSolderBoxes).ToList();
  54. }
  55. else
  56. {
  57. // 管控总焊点数量,使用 GetWeldingPointsBoxing 方法
  58. solderinvlist = GetWeldingPointsBoxing(
  59. currentBoxes: solderinvlist,
  60. maxBoxCount: requiredSolderBoxes,
  61. maxTotalSolderCount: rule.PerSolderMaxCount,
  62. inventory: availableSolders
  63. );
  64. }
  65. // 剩余可用库存为无焊点的
  66. outInvlist = invlist.Where(p => p.SolderCount == 0);
  67. return solderinvlist;
  68. }
  69. /// <summary>
  70. /// 获取焊点盘(装箱处理)
  71. /// </summary>
  72. /// <param name="currentBoxes">已有的焊点盘</param>
  73. /// <param name="maxBoxCount">最大焊点盘数</param>
  74. /// <param name="maxTotalSolderCount">最大焊点总数</param>
  75. /// <param name="inventory">库存信息</param>
  76. /// <returns>填充后的焊点盘列表</returns>
  77. public static List<StockTemp> GetWeldingPointsBoxing(List<StockTemp> currentBoxes, int maxBoxCount, int maxTotalSolderCount, IEnumerable<StockTemp>? inventory)
  78. {
  79. if (inventory == null || !inventory.Any()) return currentBoxes;
  80. // 当前状态统计
  81. var currentBoxCount = currentBoxes.Count;
  82. var currentTotalSolderCount = currentBoxes.Sum(x => x.SolderCount);
  83. // 如果已经满载,直接返回
  84. if (currentBoxCount >= maxBoxCount || currentTotalSolderCount >= maxTotalSolderCount) return currentBoxes;
  85. // 将库存转换为列表并排序,避免重复排序
  86. var availableInventory = inventory.Where(p => p.SolderCount > 0).OrderBy(p => p.ProductTime).ThenByDescending(p => p.SolderCount).ToList();
  87. foreach (var item in availableInventory)
  88. {
  89. // 判断是否还能继续添加
  90. if (currentBoxCount >= maxBoxCount || currentTotalSolderCount >= maxTotalSolderCount) break;
  91. // 添加当前项
  92. currentBoxes.Add(item);
  93. currentBoxCount++;
  94. currentTotalSolderCount += item.SolderCount;
  95. }
  96. return currentBoxes;
  97. }
  98. #endregion 焊点计算
  99. #region 获取码垛位
  100. /// <summary>
  101. /// 根据配置信息获取可用码垛位
  102. /// </summary>
  103. /// <param name="palletizingList">现有码垛位</param>
  104. /// <param name="config">配置表</param>
  105. /// <param name="code">配置信息code</param>
  106. /// <returns></returns>
  107. public static List<sxSysConfig> GetAvailablePalletizingStationsByConfiguration(this List<sxSysConfig> palletizingList, Repository<sxSysConfig> config, string code)
  108. {
  109. // 获取配置中的机器人列表
  110. var configuredRobots = config.GetFirst(x => x.Code == code).SContent.Split("|").Select(x => ToTitleCase(x));
  111. // 定义机器人及其对应的码垛位映射关系
  112. var robotToPalletizingMap = new Dictionary<string, List<string>>
  113. {
  114. { "Robot1", new List<string> { "8090", "8092" } },
  115. { "Robot2", new List<string> { "8096", "8098" } },
  116. { "Robot3", new List<string> { "8307" } }
  117. };
  118. // 获取所有符合条件的码垛位
  119. var availablePalletizingCodes = configuredRobots
  120. .SelectMany(robot =>
  121. {
  122. if (robotToPalletizingMap.TryGetValue(robot, out var palletizing))
  123. {
  124. return palletizing;
  125. }
  126. return Enumerable.Empty<string>();
  127. })
  128. .Distinct();
  129. // 返回匹配的码垛位列表
  130. return palletizingList.Where(palletizing => availablePalletizingCodes.Contains(palletizing.Code)).ToList();
  131. }
  132. /// <summary>
  133. /// 根据配置信息获取可用机械臂
  134. /// </summary>
  135. /// <param name="palletizingList">现有码垛位</param>
  136. /// <param name="config">配置表</param>
  137. /// <param name="code">配置信息code</param>
  138. /// <returns></returns>
  139. public static List<string> GetAvailablePalletizingRobotsByConfiguration(this List<string> palletizingList, Repository<sxSysConfig> config, string code)
  140. {
  141. // 获取配置中的机器人列表
  142. var configuredRobots = config.GetFirst(x => x.Code == code).SContent.Split("|").Select(x => ToTitleCase(x));
  143. // 返回匹配的码垛位列表
  144. return palletizingList.Select(x => ToTitleCase(x)).Where(x => configuredRobots.Contains(x)).ToList();
  145. }
  146. /// <summary>
  147. /// 将字符串转换为首字母大写,其他全小写
  148. /// </summary>
  149. /// <param name="str"></param>
  150. /// <returns></returns>
  151. public static string ToTitleCase(string str)
  152. {
  153. if (string.IsNullOrEmpty(str))
  154. {
  155. return str;
  156. }
  157. // 将字符串转换为全小写
  158. string lowerStr = str.ToLower();
  159. // 使用 TextInfo.ToTitleCase 转换为标题大小写
  160. TextInfo textInfo = CultureInfo.CurrentCulture.TextInfo;
  161. string titleCasedStr = textInfo.ToTitleCase(lowerStr);
  162. return titleCasedStr;
  163. }
  164. #endregion 获取码垛位
  165. #region 分配货位
  166. /// <summary>
  167. /// 申请入库货位
  168. /// </summary>
  169. /// <param name="reqEntity">申请信息</param>
  170. /// <param name="_wcstaskoldrepository">任务表</param>
  171. /// <param name="_basewarehouserepository">仓库表</param>
  172. /// <param name="_billInvnowrepository">库存表</param>
  173. /// <param name="_basewarecellrepository">货位表</param>
  174. /// <param name="_db">数据库连接</param>
  175. /// <param name="_mapper">映射器</param>
  176. /// <param name="_logger">日志</param>
  177. /// <returns></returns>
  178. public static SRes<List<ApplyStockInLocResponse>> ApplyStockInLocTemp(
  179. this SxApplyStockInLocRequest reqEntity,
  180. RepositoryTask<WCS_TaskOld> _wcstaskoldrepository,
  181. Repository<BaseWarehouse> _basewarehouserepository,
  182. Repository<BillInvnow> _billInvnowrepository,
  183. Repository<BaseWarecell> _basewarecellrepository,
  184. ITenant _db,
  185. IMapper _mapper,
  186. ILogger<SXService> _logger)
  187. {
  188. var result = new SRes<List<ApplyStockInLocResponse>>() { ResData = new List<ApplyStockInLocResponse>() };
  189. var wcstask = _wcstaskoldrepository.AsQueryable().With(SqlWith.NoLock).Where(p => reqEntity.TaskNum.Contains(p.Id) && p.Status < TaskStatus.Finish).SplitTable(tabs => tabs.Take(2)).ToList();
  190. if (!wcstask.Any())
  191. {
  192. result.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  193. result.ResMsg = string.Join(",", reqEntity.TaskNum) + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
  194. return result;
  195. }
  196. if (wcstask.Any(p => p.Type == TaskType.OutDepot))
  197. {
  198. result.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  199. result.ResMsg = "该任务是出库任务,不能分配货位;wms任务号" + string.Join(",", reqEntity.TaskNum);
  200. return result;
  201. }
  202. if (reqEntity.TaskNum.Count != wcstask.Count)
  203. {
  204. result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  205. result.ResMsg = string.Join(',', reqEntity.TaskNum) + "申请的任务数与实际任务数不符";
  206. return result;
  207. }
  208. var warehouse = _basewarehouserepository.GetFirst(p => p.Code == "sxhouse");
  209. if (warehouse == null)
  210. {
  211. result.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode();
  212. result.ResMsg = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription();
  213. return result;
  214. }
  215. var stocklist = _billInvnowrepository.GetList(p => wcstask.Select(p => p.BarCode).Contains(p.ContGrpBarCode) && p.InvStateCode == InvState.InvEcecState_BuildUp.ToString());
  216. if (!stocklist.Any())
  217. {
  218. result.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  219. result.ResMsg = string.Join(",", reqEntity.TaskNum) + ResponseStatusCodeEnum.StockNotExist.GetDescription();
  220. return result;
  221. }
  222. if (reqEntity.TaskNum.Count != stocklist.Count)
  223. {
  224. result.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  225. result.ResMsg = string.Join(",", reqEntity.TaskNum) + "申请的任务数与库存数量不符";
  226. return result;
  227. }
  228. if (wcstask.Count > 1)
  229. {
  230. List<ApplyStockInLocResponse> list = new List<ApplyStockInLocResponse>();
  231. var code = string.Empty;
  232. var num = new List<int>() { reqEntity.TaskNum[1], reqEntity.TaskNum[0] };
  233. foreach (var item in num)
  234. {
  235. //验证库存
  236. var task = wcstask.Where(p => p.Id == item).First();
  237. var stock = stocklist.Where(p => p.ContGrpBarCode == task.BarCode).First();
  238. if (!string.IsNullOrEmpty(task.AddrTo) && task.Fork != 0)
  239. {
  240. var applyCell = new ApplyStockInLocResponse()
  241. {
  242. TunnelNum = reqEntity.TunnelNum.ToString(),
  243. CellNo = task.AddrTo,
  244. Row = task.AddrTo.Split('-')[0] != null ? int.Parse(task.AddrTo.Split('-')[0]) : 0,
  245. Colomn = task.AddrTo.Split('-')[1] != null ? int.Parse(task.AddrTo.Split('-')[1]) : 0,
  246. Layer = task.AddrTo.Split('-')[2] != null ? int.Parse(task.AddrTo.Split('-')[2]) : 0,
  247. Fork = task.Fork,
  248. TaskNo = task.Id
  249. };
  250. result.ResData.Add(applyCell);
  251. continue;
  252. }
  253. if (!string.IsNullOrEmpty(code))
  254. {
  255. var cell2 = ApplyLoc(new ApplyLocRequest()
  256. {
  257. MaterialId = stock.MatId,
  258. MaterialCode = stock.MatCode,
  259. TunnelNum = reqEntity.TunnelNum,
  260. WarehuoseId = warehouse.Id,
  261. IsMove = task.Type == TaskType.TransferDepot,
  262. Floor = reqEntity.Floor,
  263. CellCode = code,
  264. Fork = 2,
  265. Wind = stock.Wind,
  266. IsControlpanel = stock.IsControlpanel,
  267. IsTorsChk = stock.IsTorsChk,
  268. TorsChkQty = stock.TorsChkQty,
  269. ProductTime = stock.ProductTime,
  270. Wbgroup = stock.WbGroupCode
  271. }, _basewarecellrepository, _basewarehouserepository, _billInvnowrepository, _logger);
  272. if (cell2.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  273. {
  274. result.ResCode = cell2.ResCode;
  275. result.ResMsg = item + cell2.ResMsg;
  276. return result;
  277. }
  278. try
  279. {
  280. cell2.ResData.Fork = 2;
  281. cell2.ResData.TaskNo = item;
  282. _db.BeginTran();
  283. _wcstaskoldrepository.AsUpdateable().SetColumns(p => new WCS_TaskOld()
  284. {
  285. AddrTo = cell2.ResData.CellNo,
  286. Fork = cell2.ResData.Fork
  287. }).Where(p => p.Id == item).SplitTable(p => p.Take(2)).ExecuteCommand();
  288. _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = LocationState.LocationState_StockIn, ContGrpBarCode = "", ContGrpId = 0, EditTime = DateTime.Now },
  289. p => cell2.ResData.CellNo == p.Code);
  290. _db.CommitTran();
  291. result.ResData.Add(_mapper.Map<ApplyStockInLocResponse>(cell2.ResData));
  292. }
  293. catch (Exception ex)
  294. {
  295. _db.RollbackTran();
  296. result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  297. result.ResMsg = item + ResponseStatusCodeEnum.DataSaveErr.GetDescription() + ex.Message;
  298. return result;
  299. }
  300. continue;
  301. }
  302. #region 处理两个任务都是一货叉情况
  303. if (item == reqEntity.TaskNum[0])
  304. {
  305. var cell2 = ApplyLoc(new ApplyLocRequest()
  306. {
  307. MaterialId = stock.MatId,
  308. MaterialCode = stock.MatCode,
  309. TunnelNum = reqEntity.TunnelNum,
  310. WarehuoseId = warehouse.Id,
  311. IsMove = task.Type == TaskType.TransferDepot,
  312. Floor = reqEntity.Floor,
  313. Fork = 2,
  314. Wind = stock.Wind,
  315. IsControlpanel = stock.IsControlpanel,
  316. IsTorsChk = stock.IsTorsChk,
  317. TorsChkQty = stock.TorsChkQty,
  318. ProductTime = stock.ProductTime,
  319. Wbgroup = stock.WbGroupCode
  320. }, _basewarecellrepository, _basewarehouserepository, _billInvnowrepository, _logger);
  321. if (cell2.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  322. {
  323. result.ResCode = cell2.ResCode;
  324. result.ResMsg = item + cell2.ResMsg;
  325. return result;
  326. }
  327. try
  328. {
  329. cell2.ResData.Fork = 2;
  330. cell2.ResData.TaskNo = item;
  331. _db.BeginTran();
  332. _wcstaskoldrepository.AsUpdateable().SetColumns(p => new WCS_TaskOld()
  333. {
  334. AddrTo = cell2.ResData.CellNo,
  335. Fork = cell2.ResData.Fork
  336. }).Where(p => p.Id == item).SplitTable(p => p.Take(2)).ExecuteCommand();
  337. _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = LocationState.LocationState_StockIn, ContGrpBarCode = "", ContGrpId = 0, EditTime = DateTime.Now },
  338. p => cell2.ResData.CellNo == p.Code);
  339. _db.CommitTran();
  340. result.ResData.Add(_mapper.Map<ApplyStockInLocResponse>(cell2.ResData));
  341. }
  342. catch (Exception ex)
  343. {
  344. _db.RollbackTran();
  345. result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  346. result.ResMsg = item + ResponseStatusCodeEnum.DataSaveErr.GetDescription() + ex.Message;
  347. return result;
  348. }
  349. continue;
  350. }
  351. #endregion 处理两个任务都是一货叉情况
  352. var cell1 = ApplyLoc(new ApplyLocRequest()
  353. {
  354. MaterialId = stock.MatId,
  355. MaterialCode = stock.MatCode,
  356. TunnelNum = reqEntity.TunnelNum,
  357. WarehuoseId = warehouse.Id,
  358. IsMove = task.Type == TaskType.TransferDepot,
  359. Floor = reqEntity.Floor,
  360. Fork = 1,
  361. Wind = stock.Wind,
  362. IsControlpanel = stock.IsControlpanel,
  363. IsTorsChk = stock.IsTorsChk,
  364. TorsChkQty = stock.TorsChkQty,
  365. ProductTime = stock.ProductTime,
  366. Wbgroup = stock.WbGroupCode
  367. }, _basewarecellrepository, _basewarehouserepository, _billInvnowrepository, _logger);
  368. if (cell1.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  369. {
  370. result.ResCode = cell1.ResCode;
  371. result.ResMsg = item + cell1.ResMsg;
  372. return result;
  373. }
  374. try
  375. {
  376. cell1.ResData.Fork = 1;
  377. cell1.ResData.TaskNo = item;
  378. code = cell1.ResData.CellNo;
  379. _db.BeginTran();
  380. _wcstaskoldrepository.AsUpdateable().SetColumns(p => new WCS_TaskOld()
  381. {
  382. AddrTo = cell1.ResData.CellNo,
  383. Fork = cell1.ResData.Fork
  384. }).Where(p => p.Id == item).SplitTable(p => p.Take(2)).ExecuteCommand();
  385. _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = LocationState.LocationState_StockIn, ContGrpBarCode = "", ContGrpId = 0, EditTime = DateTime.Now },
  386. p => cell1.ResData.CellNo == p.Code);
  387. _db.CommitTran();
  388. result.ResData.Add(_mapper.Map<ApplyStockInLocResponse>(cell1.ResData));
  389. }
  390. catch (Exception ex)
  391. {
  392. _db.RollbackTran();
  393. result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  394. result.ResMsg = item + ResponseStatusCodeEnum.DataSaveErr.GetDescription() + ex.Message;
  395. return result;
  396. }
  397. }
  398. }
  399. else
  400. {
  401. //验证库存
  402. var stock = stocklist.Where(p => p.ContGrpBarCode == wcstask.First().BarCode).First();
  403. if (stock == null)
  404. {
  405. result.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  406. result.ResMsg = wcstask.First().Id + ResponseStatusCodeEnum.StockNotExist.GetDescription();
  407. return result;
  408. }
  409. if (!string.IsNullOrEmpty(wcstask.First().AddrTo) && wcstask.First().Fork != 0)
  410. {
  411. var applyCell = new ApplyStockInLocResponse()
  412. {
  413. TunnelNum = reqEntity.TunnelNum.ToString(),
  414. CellNo = wcstask.First().AddrTo,
  415. Row = wcstask.First().AddrTo.Split('-')[0] != null ? int.Parse(wcstask.First().AddrTo.Split('-')[0]) : 0,
  416. Colomn = wcstask.First().AddrTo.Split('-')[1] != null ? int.Parse(wcstask.First().AddrTo.Split('-')[1]) : 0,
  417. Layer = wcstask.First().AddrTo.Split('-')[2] != null ? int.Parse(wcstask.First().AddrTo.Split('-')[2]) : 0,
  418. Fork = wcstask.First().Fork,
  419. TaskNo = wcstask.First().Id
  420. };
  421. result.ResData.Add(applyCell);
  422. return result;
  423. }
  424. var cell1 = ApplyLoc(new ApplyLocRequest()
  425. {
  426. MaterialId = stock.MatId,
  427. MaterialCode = stock.MatCode,
  428. TunnelNum = reqEntity.TunnelNum,
  429. WarehuoseId = warehouse.Id,
  430. IsMove = wcstask.First().Type == TaskType.TransferDepot,
  431. Floor = reqEntity.Floor,
  432. Fork = 2,
  433. Wind = stock.Wind,
  434. IsControlpanel = stock.IsControlpanel,
  435. IsTorsChk = stock.IsTorsChk,
  436. TorsChkQty = stock.TorsChkQty,
  437. ProductTime = stock.ProductTime,
  438. Wbgroup = stock.WbGroupCode
  439. }, _basewarecellrepository, _basewarehouserepository, _billInvnowrepository, _logger);
  440. if (cell1.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  441. {
  442. result.ResCode = cell1.ResCode;
  443. result.ResMsg = wcstask.First().Id + cell1.ResMsg;
  444. return result;
  445. }
  446. try
  447. {
  448. cell1.ResData.TaskNo = wcstask.First().Id;
  449. cell1.ResData.Fork = 2;
  450. _db.BeginTran();
  451. _wcstaskoldrepository.AsUpdateable().SetColumns(p => new WCS_TaskOld()
  452. {
  453. AddrTo = cell1.ResData.CellNo,
  454. Fork = cell1.ResData.Fork,
  455. }).Where(p => p.Id == wcstask.First().Id).SplitTable(p => p.Take(2)).ExecuteCommand();
  456. _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = LocationState.LocationState_StockIn, ContGrpBarCode = "", ContGrpId = 0, EditTime = DateTime.Now },
  457. p => p.Code == cell1.ResData.CellNo);
  458. _db.CommitTran();
  459. result.ResData.Add(_mapper.Map<ApplyStockInLocResponse>(cell1.ResData));
  460. }
  461. catch (Exception ex)
  462. {
  463. _db.RollbackTran();
  464. result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  465. result.ResMsg = wcstask.First().Id + ResponseStatusCodeEnum.DataSaveErr.GetDescription() + ex.Message;
  466. }
  467. }
  468. return result;
  469. }
  470. /// <summary>
  471. /// 申请移库库位及创建移库任务
  472. /// </summary>
  473. /// <param name="Cell">目标货位</param>
  474. /// <param name="_wcstaskoldrepository">历史任务表</param>
  475. /// <param name="_basewarehouserepository">仓库表</param>
  476. /// <param name="_billInvnowrepository">库存表</param>
  477. /// <param name="_basewarecellrepository">货位表</param>
  478. /// <param name="_taskrepository">任务表</param>
  479. /// <param name="_taskdetailrepository">任务明细表</param>
  480. /// <param name="_db">数据库链接</param>
  481. /// <param name="_logger">日志</param>
  482. /// <param name="_mapper">映射器</param>
  483. /// <param name="lockerPalletizingPackTask">装箱任务锁</param>
  484. /// <param name="lockerApplyLoc">申请货位锁</param>
  485. /// <returns></returns>
  486. public static SRes MoveTask(
  487. this string Cell,
  488. RepositoryTask<WCS_TaskOld> _wcstaskoldrepository,
  489. Repository<BaseWarehouse> _basewarehouserepository,
  490. Repository<BillInvnow> _billInvnowrepository,
  491. Repository<BaseWarecell> _basewarecellrepository,
  492. RepositoryTask<WCS_TaskInfo> _taskrepository,
  493. RepositoryTask<WCS_TaskDtl> _taskdetailrepository,
  494. ITenant _db,
  495. ILogger<SXService> _logger,
  496. IMapper _mapper,
  497. object lockerPalletizingPackTask,
  498. object lockerApplyLoc)
  499. {
  500. lock (lockerPalletizingPackTask)
  501. {
  502. var res = new SRes() { Memo1 = "1" };
  503. var cellform = _basewarecellrepository.GetFirst(p => p.Code == Cell && p.Depth == 2);
  504. if (cellform == null)
  505. {
  506. res.ResCode = ResponseStatusCodeEnum.WareLocationCodeNotExist.GetHashCode();
  507. res.ResMsg = "该任务所在货位不是二深货位";
  508. res.Memo1 = "1";
  509. return res;
  510. }
  511. 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);
  512. if (cellTo == null)
  513. {
  514. res.ResCode = ResponseStatusCodeEnum.WareLocationCodeNotExist.GetHashCode();
  515. res.ResMsg = Cell + "对应一深位货位被禁用或者不存在";
  516. res.Memo1 = "1"; //1:不允许生成出库任务;2:允许
  517. return res;
  518. }
  519. lock (lockerApplyLoc)
  520. {
  521. try
  522. {
  523. if (cellTo.StateNum == LocationState.LocationState_Empty)
  524. {
  525. res.Memo1 = "2";
  526. return res;
  527. }
  528. else if (cellTo.StateNum == LocationState.LocationState_Full)
  529. {
  530. var stock = _billInvnowrepository.GetFirst(p => p.ContGrpBarCode == cellTo.ContGrpBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  531. if (stock == null)
  532. {
  533. res.ResCode = WcsContractWcsMoveTaskEnum.失败.GetHashCode();
  534. res.ResMsg = "一深位库存信息异常,没有查到库存信息";
  535. res.Memo1 = "1";
  536. return res;
  537. }
  538. //库位
  539. var cell = ApplyLoc(new ApplyLocRequest()
  540. {
  541. IsMove = true,
  542. MaterialId = stock.MatId,
  543. MaterialCode = stock.MatCode,
  544. TunnelNum = cellTo.Tunnel,
  545. WarehuoseId = cellTo.WarehouseId,
  546. Floor = cellTo.Floor,
  547. Fork = 2,
  548. Wbgroup = stock.WbGroupCode,
  549. Wind = stock.Wind,
  550. IsControlpanel = stock.IsControlpanel,
  551. IsTorsChk = stock.IsTorsChk,
  552. TorsChkQty = stock.TorsChkQty,
  553. ProductTime = stock.ProductTime
  554. }, _basewarecellrepository, _basewarehouserepository, _billInvnowrepository, _logger);
  555. if (string.IsNullOrEmpty(cell.ResData.CellNo))
  556. {
  557. res.ResCode = WcsContractWcsMoveTaskEnum.失败.GetHashCode();
  558. res.ResMsg = cell.ResMsg;
  559. res.Memo1 = "1";
  560. return res;
  561. }
  562. 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))
  563. {
  564. res.ResCode = WcsContractWcsMoveTaskEnum.失败.GetHashCode();
  565. res.ResMsg = cell.ResData.CellNo + "已被使用";
  566. res.Memo1 = "1";
  567. return res;
  568. }
  569. 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())
  570. {
  571. res.ResCode = WcsContractWcsMoveTaskEnum.失败.GetHashCode();
  572. res.ResMsg = cell.ResData.CellNo + "存在未结束的入库任务或移库任务,不允许使用";
  573. res.Memo1 = "1";
  574. return res;
  575. }
  576. var wcs = new WCS_TaskInfo()
  577. {
  578. Type = TaskType.TransferDepot,
  579. Status = TaskStatus.NewBuild,
  580. Priority = 0,
  581. Device = cellTo.SCRel,
  582. SrmStation = "",
  583. AddrFrom = cellTo.Code,
  584. AddrTo = cell.ResData.CellNo,
  585. LastInteractionPoint = "",
  586. BarCode = stock.ContGrpBarCode,
  587. Length = stock.LengthQty,
  588. AddTime = DateTime.Now,
  589. StartTime = DateTime.Now,
  590. DocID = 0,
  591. PalletType = 1,
  592. ProdLine = 0,
  593. AddWho = "wms",
  594. WarehouseCode = cellTo.WarehouseCode,
  595. Enabled = true,
  596. WorkBench = "",
  597. Tunnel = cellTo.Tunnel.ToString(),
  598. Floor = cellTo.Floor,
  599. BusType = CpTaskBusType.TaskBusType_CP_Move.GetDescription()
  600. };
  601. _db.BeginTran();
  602. var celltemp = _basewarecellrepository.GetSingle(p => p.Code == cell.ResData.CellNo);
  603. if (celltemp.StateNum != LocationState.LocationState_Empty || celltemp.ContGrpId > 0 || !string.IsNullOrEmpty(celltemp.ContGrpBarCode))
  604. {
  605. _db.RollbackTran();
  606. res.ResCode = WcsContractWcsMoveTaskEnum.失败.GetHashCode();
  607. res.ResMsg = cell.ResData.CellNo + "已被使用";
  608. res.Memo1 = "1";
  609. _logger.LogInformation("货位状态1:" + celltemp.StateNum + ",code:" + cell.ResData.CellNo);
  610. return res;
  611. }
  612. _logger.LogInformation("货位状态2:" + celltemp.StateNum + ",code:" + cell.ResData.CellNo);
  613. var task = _taskrepository.InsertReturnEntity(wcs);
  614. _wcstaskoldrepository.InsertableSplitTable(_mapper.Map<WCS_TaskOld>(task));
  615. var taskdlt = new WCS_TaskDtl()
  616. {
  617. ID = Guid.NewGuid(),
  618. CurPoint = task.AddrFrom,
  619. AddTime = DateTime.Now,
  620. AddWho = "wms",
  621. Enabled = true,
  622. ParentTaskCode = task.ID,
  623. Desc = task.AddrFrom + "移库至" + task.AddrTo,
  624. };
  625. _taskdetailrepository.InsertableSplitTable(taskdlt);
  626. _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = LocationState.LocationState_StockMove, EditTime = DateTime.Now }, p => p.Code == task.AddrFrom);
  627. _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = LocationState.LocationState_StockMove, EditTime = DateTime.Now }, p => p.Code == task.AddrTo);
  628. _db.CommitTran();
  629. res.Memo1 = "2";
  630. }
  631. else if (cellTo.StateNum == LocationState.LocationState_StockIn)
  632. {
  633. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  634. res.ResMsg = "一升位有入库任务,二升位不允许出库";
  635. res.Memo1 = "1";
  636. return res;
  637. }
  638. else if (cellTo.StateNum == LocationState.LocationState_StockOut)
  639. {
  640. res.Memo1 = "2";
  641. return res;
  642. }
  643. else if (cellTo.StateNum == LocationState.LocationState_StockMove)
  644. {
  645. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  646. res.ResMsg = "一升位有移库任务,二升位不允许出库";
  647. res.Memo1 = "1";
  648. return res;
  649. }
  650. }
  651. catch (Exception ex)
  652. {
  653. _db.RollbackTran();
  654. _logger.LogInformation("移库任务创建失败" + ex.ToString());
  655. res.ResCode = WcsContractWcsMoveTaskEnum.失败.GetHashCode();
  656. res.ResMsg = WcsContractWcsMoveTaskEnum.失败.GetDescription();
  657. res.Memo1 = "1";
  658. }
  659. }
  660. return res;
  661. }
  662. }
  663. /// <summary>
  664. /// 申请货位
  665. /// </summary>
  666. /// <param name="reqEntity">申请信息</param>
  667. /// <param name="_basewarecellrepository">货位表</param>
  668. /// <param name="_basewarehouserepository">仓库表</param>
  669. /// <param name="_billInvnowrepository">库存表</param>
  670. /// <param name="_logger">日志</param>
  671. /// <returns></returns>
  672. public static SRes<ApplyStockInLocResponse> ApplyLoc(
  673. ApplyLocRequest reqEntity,
  674. Repository<BaseWarecell> _basewarecellrepository,
  675. Repository<BaseWarehouse> _basewarehouserepository,
  676. Repository<BillInvnow> _billInvnowrepository,
  677. ILogger<SXService> _logger)
  678. {
  679. var result = new SRes<ApplyStockInLocResponse>()
  680. {
  681. ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode(),
  682. ResMsg = ResponseStatusCodeEnum.Sucess.GetDescription(),
  683. ResData = new ApplyStockInLocResponse(),
  684. };
  685. //预留货位数量
  686. var emptyLoc = _basewarecellrepository.GetList(p => p.IsStop == 0
  687. && p.StateNum == LocationState.LocationState_Empty
  688. && p.TypeNum == LocationType.LocationType_StorageLocation
  689. && p.Tunnel == reqEntity.TunnelNum
  690. && p.WarehouseId == reqEntity.WarehuoseId
  691. && p.Floor == reqEntity.Floor
  692. );
  693. //判断是否移库
  694. if (!reqEntity.IsMove && (emptyLoc == null || emptyLoc.Count < 10))
  695. {
  696. result.ResCode = ResponseStatusCodeEnum.NotEnoughLocation.GetHashCode();
  697. result.ResMsg = ResponseStatusCodeEnum.NotEnoughLocation.GetDescription();
  698. return result;
  699. }
  700. var loc1ist = from loct1 in _basewarecellrepository.GetList(loc1 => loc1.IsStop == 0 && loc1.StateNum == LocationState.LocationState_Empty
  701. && loc1.TypeNum == LocationType.LocationType_StorageLocation
  702. && loc1.Tunnel == reqEntity.TunnelNum
  703. && loc1.WarehouseId == reqEntity.WarehuoseId
  704. && loc1.Floor == reqEntity.Floor && loc1.Depth == 1).ToList()
  705. join loct2 in _basewarecellrepository.GetList(loc2 => loc2.IsStop == 0 && loc2.IsStop == 0 && loc2.Depth == 2 && loc2.StateNum == LocationState.LocationState_Full
  706. && loc2.Tunnel == reqEntity.TunnelNum && loc2.Floor == reqEntity.Floor).ToList()
  707. on new { loct1.Shelf, loct1.Col, loct1.Layer } equals new { loct2.Shelf, loct2.Col, loct2.Layer }
  708. join stock in _billInvnowrepository.GetList(inv => inv.InvStateCode == InvState.InvEcecState_In.ToString() && string.IsNullOrEmpty(inv.PreStock))
  709. on loct2.ContGrpBarCode equals stock.ContGrpBarCode
  710. where loct1.Tunnel == reqEntity.TunnelNum && loct1.Floor == reqEntity.Floor
  711. select new stocktemp1
  712. {
  713. Code = loct1.Code.ToString(),
  714. Id = loct1.Id,
  715. Row = loct1.Row,
  716. Col = loct1.Col,
  717. Layer = loct1.Layer,
  718. Tunnel = loct1.Tunnel,
  719. Floor = loct1.Floor,
  720. ContGrpBarCode = loct2.ContGrpBarCode,
  721. Shelf = loct2.Shelf,
  722. MatCode = stock.MatCode,
  723. MatId = stock.MatId,
  724. WbGroupCode = stock.WbGroupCode,
  725. InDocsNo = stock.InDocsNo,
  726. Wind = stock.Wind,
  727. IsControlpanel = stock.IsControlpanel,
  728. IsTorsChk = stock.IsTorsChk,
  729. TorsChkQty = stock.TorsChkQty,
  730. ProductTime = stock.ProductTime
  731. };
  732. #region 非控制盘、已扭转的控制盘
  733. if (reqEntity.IsControlpanel == false)
  734. {
  735. if (loc1ist != null && loc1ist.ToList().Where(p => p.MatId == reqEntity.MaterialId && p.Wind == reqEntity.Wind && p.IsControlpanel == reqEntity.IsControlpanel
  736. && p.WbGroupCode == reqEntity.Wbgroup && Math.Abs((p.ProductTime - reqEntity.ProductTime).TotalHours) < 1).Any())
  737. {
  738. if (reqEntity.Fork == 1)
  739. {
  740. if (loc1ist.ToList().Where(p => p.MatId == reqEntity.MaterialId && p.Col < 70 && p.Wind == reqEntity.Wind && p.IsControlpanel == reqEntity.IsControlpanel
  741. && p.WbGroupCode == reqEntity.Wbgroup && Math.Abs((p.ProductTime - reqEntity.ProductTime).TotalHours) < 1).Any())
  742. {
  743. var resloc = loc1ist.ToList().Where(p => p.MatId == reqEntity.MaterialId && p.Col < 70 && p.Wind == reqEntity.Wind && p.IsControlpanel == reqEntity.IsControlpanel
  744. && 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();
  745. result.ResData.TunnelNum = resloc.Tunnel.ToString();
  746. result.ResData.CellNo = resloc.Code;
  747. result.ResData.Row = resloc.Row;
  748. result.ResData.Colomn = resloc.Col;
  749. result.ResData.Layer = resloc.Layer;
  750. _logger.LogInformation("分货位埋点1:" + result.ResData.CellNo);
  751. return result;
  752. }
  753. }
  754. else
  755. {
  756. var resloc = loc1ist.ToList().Where(p => p.MatId == reqEntity.MaterialId && p.Wind == reqEntity.Wind && p.IsControlpanel == reqEntity.IsControlpanel
  757. && 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();
  758. result.ResData.TunnelNum = resloc.Tunnel.ToString();
  759. result.ResData.CellNo = resloc.Code;
  760. result.ResData.Row = resloc.Row;
  761. result.ResData.Colomn = resloc.Col;
  762. result.ResData.Layer = resloc.Layer;
  763. _logger.LogInformation("分货位埋点2:" + result.ResData.CellNo);
  764. return result;
  765. }
  766. }
  767. }
  768. else
  769. {
  770. if (reqEntity.IsControlpanel == true && reqEntity.IsTorsChk == true && reqEntity.TorsChkQty > 0) //已扭转完
  771. {
  772. //var starttime = reqEntity.ProductTime.Date.AddHours(13);
  773. //var endtime = reqEntity.ProductTime.Date.AddDays(1).AddHours(8);
  774. if (loc1ist != null && loc1ist.ToList().Where(p => p.MatId == reqEntity.MaterialId && p.Wind == reqEntity.Wind && p.IsControlpanel == reqEntity.IsControlpanel
  775. && p.WbGroupCode == reqEntity.Wbgroup && reqEntity.IsTorsChk == p.IsTorsChk && p.TorsChkQty > 0).Any())// && p.ProductTime >= starttime && p.ProductTime <= endtime
  776. {
  777. if (reqEntity.Fork == 1)
  778. {
  779. if (loc1ist.ToList().Where(p => p.MatId == reqEntity.MaterialId && p.Col < 70 && p.Wind == reqEntity.Wind && p.IsControlpanel == reqEntity.IsControlpanel
  780. && p.WbGroupCode == reqEntity.Wbgroup && reqEntity.IsTorsChk == p.IsTorsChk && p.TorsChkQty > 0).Any())//&& p.ProductTime >= starttime && p.ProductTime <= endtime
  781. {
  782. var resloc = loc1ist.ToList().Where(p => p.MatId == reqEntity.MaterialId && p.Col < 70 && p.Wind == reqEntity.Wind && p.IsControlpanel == reqEntity.IsControlpanel
  783. && 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
  784. result.ResData.TunnelNum = resloc.Tunnel.ToString();
  785. result.ResData.CellNo = resloc.Code;
  786. result.ResData.Row = resloc.Row;
  787. result.ResData.Colomn = resloc.Col;
  788. result.ResData.Layer = resloc.Layer;
  789. _logger.LogInformation("分货位埋点3:" + result.ResData.CellNo);
  790. return result;
  791. }
  792. }
  793. else
  794. {
  795. var resloc = loc1ist.ToList().Where(p => p.MatId == reqEntity.MaterialId && p.Wind == reqEntity.Wind && p.IsControlpanel == reqEntity.IsControlpanel
  796. && 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
  797. result.ResData.TunnelNum = resloc.Tunnel.ToString();
  798. result.ResData.CellNo = resloc.Code;
  799. result.ResData.Row = resloc.Row;
  800. result.ResData.Colomn = resloc.Col;
  801. result.ResData.Layer = resloc.Layer;
  802. _logger.LogInformation("分货位埋点4:" + result.ResData.CellNo);
  803. return result;
  804. }
  805. }
  806. }
  807. }
  808. #endregion 非控制盘、已扭转的控制盘
  809. //再找二深位空的
  810. if (emptyLoc.Where(p => p.Depth == 2).Any())
  811. {
  812. //一深位必须空
  813. 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)
  814. join loc2 in emptyLoc.Where(p => p.Depth == 2) on new { loc1.Col, loc1.Layer } equals new { loc2.Col, loc2.Layer }
  815. select loc2;
  816. if (templist == null || !templist.Any())
  817. {
  818. result.ResCode = ResponseStatusCodeEnum.NotEnoughLocation.GetHashCode();
  819. result.ResMsg = ResponseStatusCodeEnum.NotEnoughLocation.GetDescription() + "没有可用的二升位";
  820. _logger.LogInformation("分货位埋点5:" + result.ResData.CellNo);
  821. return result;
  822. }
  823. if (!string.IsNullOrEmpty(reqEntity.CellCode))
  824. {
  825. var cell = reqEntity.CellCode.Split('-');
  826. if (cell[4] == "2")
  827. {
  828. var cell2 = templist.Where(p => p.Depth == 2 && p.Shelf == cell[3]).OrderBy(p => p.Layer).ThenBy(p => p.Col).ThenBy(p => p.Row); //优先同货架相邻同层货位
  829. if (cell2.Where(p => p.Depth == 2 && p.Shelf == cell[3] && p.Layer == int.Parse(cell[2])).Any())
  830. {
  831. 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();
  832. result.ResData.TunnelNum = cell3.Tunnel.ToString();
  833. result.ResData.CellNo = cell3.Code;
  834. result.ResData.Row = cell3.Row;
  835. result.ResData.Colomn = cell3.Col;
  836. result.ResData.Layer = cell3.Layer;
  837. result.ResData.Fork = 2;
  838. _logger.LogInformation("分货位埋点6:" + result.ResData.CellNo);
  839. return result;
  840. }
  841. else
  842. {
  843. if (cell2.Any())
  844. {
  845. var cell4 = cell2.First();
  846. result.ResData.TunnelNum = cell4.Tunnel.ToString();
  847. result.ResData.CellNo = cell4.Code;
  848. result.ResData.Row = cell4.Row;
  849. result.ResData.Colomn = cell4.Col;
  850. result.ResData.Layer = cell4.Layer;
  851. result.ResData.Fork = 2;
  852. _logger.LogInformation("分货位埋点7:" + result.ResData.CellNo);
  853. return result;
  854. }
  855. else
  856. {
  857. var cell4 = templist.OrderBy(p => p.Col).ThenBy(p => p.Layer).ThenBy(p => p.Row).First();
  858. result.ResData.TunnelNum = cell4.Tunnel.ToString();
  859. result.ResData.CellNo = cell4.Code;
  860. result.ResData.Row = cell4.Row;
  861. result.ResData.Colomn = cell4.Col;
  862. result.ResData.Layer = cell4.Layer;
  863. result.ResData.Fork = 2;
  864. _logger.LogInformation("分货位埋点8:" + result.ResData.CellNo);
  865. return result;
  866. }
  867. }
  868. }
  869. }
  870. if (reqEntity.Fork == 2)
  871. {
  872. //var resloc = templist.Where(p => p.Depth == 2).OrderBy(p => p.Layer).ThenBy(p => p.Col).ThenBy(p => p.Row).First();
  873. var resloc = templist.Where(p => p.Depth == 2).OrderBy(p => p.Col).ThenBy(p => p.Layer).ThenBy(p => p.Row).First();
  874. result.ResData.TunnelNum = resloc.Tunnel.ToString();
  875. result.ResData.CellNo = resloc.Code;
  876. result.ResData.Row = resloc.Row;
  877. result.ResData.Colomn = resloc.Col;
  878. result.ResData.Layer = resloc.Layer;
  879. _logger.LogInformation("分货位埋点9:" + result.ResData.CellNo);
  880. return result;
  881. }
  882. else
  883. {
  884. //templist.Where(p => p.Depth == 2 && p.Col < 70).OrderBy(p => p.Layer).ThenBy(p => p.Col).ThenBy(p => p.Row).Any()
  885. if (templist.Where(p => p.Depth == 2 && p.Col < 70).OrderBy(p => p.Col).ThenBy(p => p.Layer).ThenBy(p => p.Row).Any())
  886. {
  887. //var resloc = templist.Where(p => p.Depth == 2 && p.Col < 70).OrderBy(p => p.Layer).ThenBy(p => p.Col).ThenBy(p => p.Row).First();
  888. var resloc = templist.Where(p => p.Depth == 2 && p.Col < 70).OrderBy(p => p.Col).ThenBy(p => p.Layer).ThenBy(p => p.Row).First();
  889. result.ResData.TunnelNum = resloc.Tunnel.ToString();
  890. result.ResData.CellNo = resloc.Code;
  891. result.ResData.Row = resloc.Row;
  892. result.ResData.Colomn = resloc.Col;
  893. result.ResData.Layer = resloc.Layer;
  894. _logger.LogInformation("分货位埋点10:" + result.ResData.CellNo);
  895. return result;
  896. }
  897. else
  898. {
  899. }
  900. }
  901. }
  902. if (loc1ist == null || !loc1ist.Any())
  903. {
  904. result.ResCode = ResponseStatusCodeEnum.NotEnoughLocation.GetHashCode();
  905. result.ResMsg = ResponseStatusCodeEnum.NotEnoughLocation.GetDescription() + "没有可用的一升位货位";
  906. _logger.LogInformation("分货位埋点11:" + result.ResData.CellNo);
  907. return result;
  908. }
  909. if (reqEntity.Fork == 1)
  910. {
  911. if (loc1ist.ToList().Where(p => p.Col < 70).Any())
  912. {
  913. var aa = loc1ist.ToList();
  914. var code = aa.Where(p => p.Col < 70).OrderBy(p => p.Col).ThenBy(p => p.Layer).ThenBy(p => p.Row).First();
  915. result.ResData.TunnelNum = code.Tunnel.ToString();
  916. result.ResData.CellNo = code.Code;
  917. result.ResData.Row = code.Row;
  918. result.ResData.Colomn = code.Col;
  919. result.ResData.Layer = code.Layer;
  920. _logger.LogInformation("分货位埋点12:" + result.ResData.CellNo);
  921. return result;
  922. }
  923. else
  924. {
  925. result.ResCode = ResponseStatusCodeEnum.NotEnoughLocation.GetHashCode();
  926. result.ResMsg = "一货叉没有可用库位";
  927. _logger.LogInformation("分货位埋点13:" + result.ResData.CellNo);
  928. return result;
  929. }
  930. }
  931. var loc1ist11 = from loct1 in _basewarecellrepository.GetList(loc1 => loc1.IsStop == 0 && loc1.StateNum == LocationState.LocationState_Empty
  932. && loc1.TypeNum == LocationType.LocationType_StorageLocation
  933. && loc1.Tunnel == reqEntity.TunnelNum
  934. && loc1.WarehouseId == reqEntity.WarehuoseId
  935. && loc1.Floor == reqEntity.Floor && loc1.Depth == 1 && loc1.Floor == reqEntity.Floor).ToList()
  936. join loct2 in _basewarecellrepository.GetList(loc2 => loc2.IsStop == 0 && loc2.Depth == 2 && loc2.StateNum == LocationState.LocationState_Full
  937. && loc2.Tunnel == reqEntity.TunnelNum && loc2.Floor == reqEntity.Floor
  938. ).ToList()
  939. on new { loct1.Shelf, loct1.Col, loct1.Layer } equals new { loct2.Shelf, loct2.Col, loct2.Layer }
  940. select loct1;
  941. var loc = loc1ist11.ToList().OrderBy(p => p.Col).ThenBy(p => p.Layer).ThenBy(p => p.Row).First();
  942. //var loc = loc1ist.First();
  943. result.ResData.TunnelNum = loc.Tunnel.ToString();
  944. result.ResData.CellNo = loc.Code;
  945. result.ResData.Row = loc.Row;
  946. result.ResData.Colomn = loc.Col;
  947. result.ResData.Layer = loc.Layer;
  948. _logger.LogInformation("分货位埋点14:" + result.ResData.CellNo);
  949. return result;
  950. }
  951. #endregion 分配货位
  952. }
  953. }