SxServiceHelp.cs 60 KB

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