Srm.cs 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570
  1. using SqlSugar;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading;
  7. using System.Threading.Tasks;
  8. using WCS.Data;
  9. using WCS.Data.Models;
  10. namespace WCS.PLC
  11. {
  12. public class Srm
  13. {
  14. #region 属性
  15. /// <summary>
  16. /// 堆垛机名称
  17. /// </summary>
  18. internal string SrmNo { get; set; }
  19. /// <summary>
  20. /// plc信息
  21. /// </summary>
  22. protected WCS_PLC WCS_PLCItem
  23. {
  24. get
  25. {
  26. return Current.PlcSet.FirstOrDefault(v => v.PLC_NAME == SrmNo);
  27. }
  28. }
  29. /// <summary>
  30. /// 堆垛机信号
  31. /// </summary>
  32. protected SrmSignal EquSignal
  33. {
  34. get
  35. {
  36. return WCS_PLCItem.WCS_StackerDataSet[0].StackerData;
  37. }
  38. }
  39. /// <summary>
  40. /// 写入DB名称
  41. /// </summary>
  42. protected int WriteDbName
  43. {
  44. get
  45. {
  46. return WCS_PLCItem.WCS_DBSet[0].DB_NAME;
  47. }
  48. }
  49. /// <summary>
  50. /// 堆垛机出入库口设置列表
  51. /// </summary>
  52. protected List<WCS_SrmOutInInfo> SrmOutInInfoSet = new List<WCS_SrmOutInInfo>();
  53. #endregion;
  54. #region 构造函数
  55. public Srm(string srmno)
  56. {
  57. SrmNo = srmno;
  58. }
  59. #endregion;
  60. #region 方法
  61. private int _locExecute = 0;
  62. internal void ExecuteSrm()
  63. {
  64. if (Interlocked.Exchange(ref _locExecute, 1) == 0)
  65. {
  66. try
  67. {
  68. if (WCS_PLCItem.IsConnSuccess == false) return;
  69. //写入心跳
  70. //WriteHandShake();
  71. //完成任务
  72. SRMCompleteTask();
  73. //执行任务
  74. SRMStartExecuteTask();
  75. //入库分配货位
  76. ThreadHelper.TaskThread(InTaskAssignWareCell);
  77. }
  78. catch (Exception ex)
  79. {
  80. string errormsg = string.Format("堆垛机[{0}]执行异常,消息:{1}", SrmNo, ex.ToString());
  81. Log4netHelper.Logger_Error.ErrorFormat(errormsg);
  82. }
  83. finally
  84. {
  85. Interlocked.Exchange(ref _locExecute, 0);
  86. }
  87. }
  88. }
  89. /// <summary>
  90. /// 堆垛机任务完成
  91. /// </summary>
  92. protected virtual void SRMCompleteTask()
  93. {
  94. try
  95. {
  96. //当前任务完成
  97. if (EquSignal.DB521_Task_Finishi == false) return;
  98. //查询任务
  99. var task = SugarBase.DB.Queryable<WCS_TASK>().First(v => v.TASK_NO == EquSignal.DB521_Taskfinishi_ID);
  100. if (task == null) return;
  101. if (task.TASK_WKSTATUS >= 99) return;
  102. if (task.TASK_COMTYPE == (int)ComTypeEnum.入库 || task.TASK_COMTYPE == (int)ComTypeEnum.移库)
  103. {
  104. //完成任务
  105. string result = TryCachHelper.TryTranExecute((db) =>
  106. {
  107. //修改任务的状态
  108. db.Updateable<WCS_TASK>(it => new WCS_TASK() { TASK_WKSTATUS = 99, TASK_EDITUSERNO = "WCS", TASK_EDITDATETIME = DateTime.Now })
  109. .Where(it => it.TASK_NO == task.TASK_NO)
  110. .ExecuteCommand();
  111. //添加修改明细
  112. string msg = string.Format("任务[{0}]完成", task.TASK_NO);
  113. CommonData.AddWCS_TASK_DTL(db, task.TASK_NO, task.TASK_NO, task.TASK_POSIDCUR, task.TASK_POSIDTO, msg);
  114. });
  115. if (string.IsNullOrWhiteSpace(result))
  116. {
  117. if (task.TASK_COMTYPE == (int)ComTypeEnum.入库)
  118. {
  119. SrmConvNoMoveToLast(task.TASK_POSIDCUR);
  120. }
  121. }
  122. }
  123. else if (task.TASK_COMTYPE == (int)ComTypeEnum.出库)
  124. {
  125. if (task.TASK_WKSTATUS == (int)WkStatus.堆垛机执行)
  126. {
  127. var routeSet = EquRouteHelper.QueryRoute(task.TASK_SRMNO, task.TASK_POSIDTO);
  128. var route = routeSet.FirstOrDefault(v => v.ROUTE_STARTPOS == task.TASK_SRMNO);
  129. string result = TryCachHelper.TryTranExecute((db) =>
  130. {
  131. //修改任务的状态
  132. db.Updateable<WCS_TASK>(it => new WCS_TASK() { TASK_WKSTATUS = 6, TASK_POSIDCUR = route.ROUTE_NEXTPOS, TASK_POSIDNEXT = route.ROUTE_NEXTPOS, TASK_EDITUSERNO = "WCS", TASK_EDITDATETIME = DateTime.Now })
  133. .Where(it => it.TASK_NO == task.TASK_NO)
  134. .ExecuteCommand();
  135. //添加修改明细
  136. string msg = string.Format("任务[{0}]堆垛机完成,修改当前地址为[{1}]", task.TASK_NO, route.ROUTE_NEXTPOS);
  137. CommonData.AddWCS_TASK_DTL(db, task.TASK_NO, task.TASK_NO, route.ROUTE_NEXTPOS, route.ROUTE_NEXTPOS, msg);
  138. });
  139. if (string.IsNullOrWhiteSpace(result))
  140. {
  141. SrmConvNoMoveToLast(task.TASK_POSIDNEXT);
  142. }
  143. }
  144. }
  145. //TaskComplete(task.TASK_SRMNO, task.TASK_ID, task.TASK_COMTYPE);
  146. }
  147. catch (Exception ex)
  148. {
  149. Log4netHelper.Logger_Error.ErrorFormat(ex.ToString());
  150. }
  151. }
  152. /// <summary>
  153. /// 调整堆垛机出入口顺序
  154. /// </summary>
  155. /// <param name="convNo"></param>
  156. private void SrmConvNoMoveToLast(string convNo)
  157. {
  158. //检测是否是最后一项
  159. if (SrmOutInInfoSet[SrmOutInInfoSet.Count() - 1].SRMOUTIN_CONVNO == convNo) return;
  160. //查询要调整执行顺序的输送线
  161. var outininfo = SrmOutInInfoSet.FirstOrDefault(v => v.SRMOUTIN_CONVNO == convNo);
  162. //删除当前
  163. SrmOutInInfoSet.Remove(outininfo);
  164. //添加到最后
  165. SrmOutInInfoSet.Add(outininfo);
  166. }
  167. /// <summary>
  168. /// 堆垛机执行任务
  169. /// </summary>
  170. private void SRMStartExecuteTask()
  171. {
  172. //检测堆垛机模式
  173. if (EquSignal.DB521_Auto_status != (int)SrmModeEnum.远程) return;
  174. //检测堆垛机报警
  175. if (EquSignal.SrmDB541_Alarm) return;
  176. //检测堆垛机状态
  177. if (EquSignal.DB521_Srm_Status != (int)SrmStateFork1Enum.空闲) return;
  178. TryCachHelper.TryExecute((db) =>
  179. {
  180. var taskSet = db.Queryable<WCS_TASK>().Where(v => v.TASK_SRMNO == SrmNo).ToList();
  181. var task = taskSet.FirstOrDefault(v => (v.TASK_WKSTATUS == (int)WkStatus.堆垛机执行));
  182. if (task == null)
  183. {
  184. //查询移库任务
  185. var moveTask = taskSet.FirstOrDefault(v => v.TASK_COMTYPE == 3 && v.TASK_WKSTATUS <= 1);
  186. if (moveTask != null)
  187. {
  188. WriteTaskInfoToSrm(task);
  189. }
  190. else
  191. {
  192. //查询出库任务
  193. var tasks = taskSet.Where(v => v.TASK_COMTYPE == 2 && v.TASK_WKSTATUS <= 1).ToList();
  194. //查询入库任务(已分配货位的任务)
  195. var inTasks = taskSet.Where(v => v.TASK_COMTYPE == 1 && v.TASK_WKSTATUS == 11).ToList();
  196. tasks.AddRange(inTasks);
  197. OutInStockByPriority(db, tasks);
  198. }
  199. }
  200. else
  201. {
  202. Log4netHelper.Logger_Error.ErrorFormat(string.Format("堆垛机[{0}]状态正常,但是存在执行中的任务[{1}]", SrmNo, task.TASK_NO));
  203. }
  204. });
  205. }
  206. private void SrmOutIn(WCSWriteToSrmSignal srmSignal, string posIdnext)
  207. {
  208. if (EquSignal.DB520_Start_number == srmSignal.Start_number &&
  209. EquSignal.DB520_End_number == srmSignal.End_number &&
  210. EquSignal.DB520_Goodtype == srmSignal.Goodtype &&
  211. EquSignal.DB520_Runmode == srmSignal.Runmode &&
  212. EquSignal.DB520_FromRowPos == srmSignal.RowPos1 &&
  213. EquSignal.DB520_FromColumnPos == srmSignal.Travelpos1 &&
  214. EquSignal.DB520_FromLayerPos == srmSignal.Liftpos1 &&
  215. EquSignal.DB520_Fork_start_pos1 == srmSignal.Fork_start_pos1 &&
  216. EquSignal.DB520_ToRowPos == srmSignal.RowPos2 &&
  217. EquSignal.DB520_ToColumnPos == srmSignal.Travelpos2 &&
  218. EquSignal.DB520_ToLayerPos == srmSignal.Liftpos2 &&
  219. EquSignal.DB520_Fork_dest_pos2 == srmSignal.Fork_dest_pos2 &&
  220. EquSignal.DB520_TaskID == srmSignal.TaskID)
  221. {
  222. string result = TryCachHelper.TryTranExecute((db) =>
  223. {
  224. var task = db.Queryable<WCS_TASK>().First(t => t.TASK_NO == srmSignal.TaskID);
  225. db.Updateable<WCS_TASK>(it => new WCS_TASK() { TASK_WKSTATUS = (int)WkStatus.堆垛机执行, TASK_POSIDNEXT = posIdnext, TASK_EDITUSERNO = "WCS", TASK_EDITDATETIME = DateTime.Now })
  226. .Where(it => it.TASK_NO == srmSignal.TaskID).ExecuteCommand();
  227. string msg = string.Format("任务[{0}]已下发给堆垛机执行。", task.TASK_NO);
  228. CommonData.AddWCS_TASK_DTL(db, task.TASK_NO, task.TASK_NO, task.TASK_POSIDCUR, posIdnext, msg);
  229. if (EquSignal.DB520_Task_trigger != 1)
  230. {
  231. if (!WCS_PLCItem.Plc.WriteSignal((ushort)WriteDbName, 28, 2, 1))
  232. {
  233. throw new Exception(string.Format("任务[{0}]写入触发信号失败!", task.TASK_NO));
  234. }
  235. }
  236. });
  237. if (!string.IsNullOrWhiteSpace(result))
  238. throw new Exception(string.Format("任务[{0}]堆垛机执行失败,原因:[{1}]", srmSignal.TaskID, result));
  239. }
  240. else
  241. {
  242. WriteTaskToSrm(srmSignal);
  243. }
  244. }
  245. /// <summary>
  246. /// 写入任务信息到堆垛机
  247. /// </summary>
  248. /// <param name="task"></param>
  249. private void WriteTaskInfoToSrm(WCS_TASK task)
  250. {
  251. var writeSignal = new WCSWriteToSrmSignal();
  252. writeSignal.Start_number = 0;
  253. writeSignal.End_number = 0;
  254. writeSignal.Goodtype = 0;
  255. if (task.TASK_COMTYPE == 1)
  256. {
  257. //入库
  258. var route = Current.EquRouteSet.FirstOrDefault(v => v.ROUTE_STARTPOS == task.TASK_POSIDCUR);
  259. writeSignal.RowPos1 = (int)route.SRMROW;
  260. writeSignal.Travelpos1 = (int)route.SRMCOLUMN;
  261. writeSignal.Liftpos1 = (int)route.SRMLAYER;
  262. writeSignal.RowPos2 = task.ToRow;
  263. writeSignal.Travelpos2 = task.ToCol;
  264. writeSignal.Liftpos2 = task.ToLayer;
  265. }
  266. else if (task.TASK_COMTYPE == 2)
  267. {
  268. //出库
  269. writeSignal.RowPos1 = task.FromRow;
  270. writeSignal.Travelpos1 = task.FromCol;
  271. writeSignal.Liftpos1 = task.FromLayer;
  272. var routeSet = EquRouteHelper.QueryRoute(task.TASK_SRMNO, task.TASK_POSIDTO);
  273. var route = routeSet.FirstOrDefault(v => v.ROUTE_STARTPOS == task.TASK_SRMNO);
  274. writeSignal.RowPos2 = (int)route.SRMROW;
  275. writeSignal.Travelpos2 = (int)route.SRMCOLUMN;
  276. writeSignal.Liftpos2 = (int)route.SRMLAYER;
  277. }
  278. else if (task.TASK_COMTYPE == 3)
  279. {
  280. //移库
  281. writeSignal.RowPos1 = task.FromRow;
  282. writeSignal.Travelpos1 = task.FromCol;
  283. writeSignal.Liftpos1 = task.FromLayer;
  284. writeSignal.RowPos2 = task.ToRow;
  285. writeSignal.Travelpos2 = task.ToCol;
  286. writeSignal.Liftpos2 = task.ToLayer;
  287. }
  288. writeSignal.TaskID = task.TASK_NO;
  289. //执行任务
  290. SrmOutIn(writeSignal, task.TASK_POSIDTO);
  291. }
  292. private void WriteTaskToSrm(WCSWriteToSrmSignal srmSignal)
  293. {
  294. List<byte> list = new List<byte>();
  295. list.AddRange(ExtendsUtil.UshortToByte((ushort)srmSignal.Start_number).ToList());
  296. list.AddRange(ExtendsUtil.UshortToByte((ushort)srmSignal.End_number).ToList());
  297. list.AddRange(ExtendsUtil.UshortToByte((ushort)srmSignal.Goodtype).ToList());
  298. list.AddRange(ExtendsUtil.UshortToByte((ushort)srmSignal.Runmode).ToList());
  299. list.AddRange(ExtendsUtil.UshortToByte((ushort)srmSignal.RowPos1).ToList());
  300. list.AddRange(ExtendsUtil.UshortToByte((ushort)srmSignal.Travelpos1).ToList());
  301. list.AddRange(ExtendsUtil.UshortToByte((ushort)srmSignal.Liftpos1).ToList());
  302. list.AddRange(ExtendsUtil.UshortToByte((ushort)srmSignal.Fork_start_pos1).ToList());
  303. list.AddRange(ExtendsUtil.UshortToByte((ushort)srmSignal.RowPos2).ToList());
  304. list.AddRange(ExtendsUtil.UshortToByte((ushort)srmSignal.Travelpos2).ToList());
  305. list.AddRange(ExtendsUtil.UshortToByte((ushort)srmSignal.Liftpos2).ToList());
  306. list.AddRange(ExtendsUtil.UshortToByte((ushort)srmSignal.Fork_dest_pos2).ToList());
  307. list.AddRange(ExtendsUtil.UintToByte((uint)srmSignal.TaskID).ToList());
  308. Log4netHelper.Logger_Info.InfoFormat(string.Format("写入任务[{0}]信息", srmSignal.TaskID));
  309. bool result = WCS_PLCItem.Plc.Write((ushort)WriteDbName, 2, list.ToArray());
  310. }
  311. private void OutInStockByPriority(SqlSugarClient db, List<WCS_TASK> tasks)
  312. {
  313. int taskMaxPriority = tasks.Max(v => v.TASK_PRIORITY);
  314. for (int index = 0; index < taskMaxPriority; index++)
  315. {
  316. var tasks_Temp = tasks.Where(v => v.TASK_PRIORITY == index).ToList();
  317. if (InOutStock(db, tasks_Temp)) break;
  318. }
  319. }
  320. private bool InOutStock(SqlSugarClient db, List<WCS_TASK> tasks)
  321. {
  322. bool result = false;
  323. if (tasks.Count == 0) return result;
  324. //克隆集合
  325. List<WCS_SrmOutInInfo> outininfoSet = SrmOutInInfoSet.GetRange(0, SrmOutInInfoSet.Count);
  326. foreach (var outininfo in outininfoSet)
  327. {
  328. if (outininfo.SRMOUTIN_OUTINTYPE == "in")
  329. {
  330. //检测入库口状态
  331. var convSignal = ConveyorHelper.GetConveyorSignal(outininfo.SRMOUTIN_CONVPLCNAME, outininfo.SRMOUTIN_CONVNO);
  332. if (convSignal.DB521_Tasknum > 0 &&
  333. convSignal.DB521_Goodsend.ToString() == outininfo.SRMOUTIN_CONVNO)
  334. {
  335. var curtask = tasks.FirstOrDefault(v => v.TASK_NO == convSignal.DB521_Tasknum);
  336. if (curtask != null)
  337. {
  338. WriteTaskInfoToSrm(curtask);
  339. result = true;
  340. break;
  341. }
  342. }
  343. }
  344. else if (outininfo.SRMOUTIN_OUTINTYPE == "out")
  345. {
  346. //检测出口状态
  347. var convSignal = ConveyorHelper.GetConveyorSignal(outininfo.SRMOUTIN_CONVPLCNAME, outininfo.SRMOUTIN_CONVNO);
  348. if (convSignal.DB521_Request == false && convSignal.DB521_Tasknum <= 0)
  349. {
  350. var curOutTask = db.Queryable<WCS_TASK>().First(v => v.TASK_POSIDCUR == outininfo.SRMOUTIN_CONVNO);
  351. if (curOutTask == null ||
  352. ((curOutTask.TASK_WKSTATUS != (int)WkStatus.输送机执行) && (curOutTask.TASK_WKSTATUS != (int)WkStatus.堆垛机完成)))
  353. {
  354. var outtaskSet = new List<WCS_TASK>();
  355. //检测是否存在该出口的任务
  356. foreach (var task in tasks)
  357. {
  358. var route = EquRouteHelper.QueryRoute(task.TASK_SRMNO, task.TASK_POSIDTO).FirstOrDefault(v => v.ROUTE_STARTPOS == SrmNo);
  359. if (route == null)
  360. {
  361. Log4netHelper.Logger_Error.ErrorFormat(string.Format("任务[{0}]目标地址[{1}]堆垛机[{2}]", task.TASK_NO, task.TASK_POSIDTO, SrmNo));
  362. }
  363. if (outininfo.SRMOUTIN_CONVNO == route.ROUTE_NEXTPOS)
  364. {
  365. //outtask = task;
  366. outtaskSet.Add(task);
  367. break;
  368. }
  369. }
  370. var temptask = QueryOutTask(db, outtaskSet);
  371. if (temptask != null)
  372. {
  373. WriteTaskInfoToSrm(temptask);
  374. result = true;
  375. break;
  376. }
  377. }
  378. }
  379. }
  380. //无任务则移动到最后
  381. SrmConvNoMoveToLast(outininfo.SRMOUTIN_CONVNO);
  382. }
  383. return result;
  384. }
  385. private WCS_TASK QueryOutTask(SqlSugarClient db, List<WCS_TASK> outtaskSet)
  386. {
  387. WCS_TASK temptask = null;
  388. var outtasks = QueryOutTask(outtaskSet);
  389. foreach (var outtask in outtasks)
  390. {
  391. if (outtask.FromDepth == 2)
  392. {
  393. var oneDepthTask = Current.TaskSet.First(v => v.FromRow == outtask.FromSingleDepthRow &&
  394. v.FromLayer == outtask.FromLayer &&
  395. v.FromCol == outtask.FromCol &&
  396. (v.TASK_WKSTATUS <= 1));
  397. if (oneDepthTask == null)
  398. {
  399. //调用WMS接口申请移库
  400. var moveTaskresult = Current.WmsInterface.I_WCS_GetMoveTask(new GetMoveTaskParam() { WMSTaskNum = outtask.TASK_WMSNO });
  401. if (moveTaskresult.ResType == 0)
  402. {
  403. Log4netHelper.Logger_Error.ErrorFormat(moveTaskresult.ResMessage);
  404. }
  405. else if (moveTaskresult.ResType == 2)
  406. {
  407. //创建移库任务并执行
  408. var moveTask = new WCS_TASK();
  409. db.Insertable(moveTask).ExecuteCommand();
  410. temptask = db.Queryable<WCS_TASK>().First(v => v.TASK_WMSNO == moveTask.TASK_WMSNO);
  411. break;
  412. }
  413. else if (moveTaskresult.ResType == 1)
  414. {
  415. temptask = outtask;
  416. break;
  417. }
  418. }
  419. else
  420. {
  421. if (oneDepthTask.TASK_COMTYPE == 2)
  422. {
  423. //判断是否是相同出口的任务
  424. if (outtasks.Any(v => v.TASK_NO == oneDepthTask.TASK_NO))
  425. {
  426. temptask = oneDepthTask;
  427. }
  428. else
  429. {
  430. var routeSet = EquRouteHelper.QueryRoute(oneDepthTask.TASK_SRMNO, oneDepthTask.TASK_POSIDTO);
  431. var route = routeSet.FirstOrDefault(v => v.ROUTE_STARTPOS == outtask.TASK_SRMNO);
  432. var outinitem = SrmOutInInfoSet.FirstOrDefault(v => v.SRMOUTIN_CONVNO == route.ROUTE_NEXTPOS);
  433. var convs = ConveyorHelper.GetConveyorSignal(outinitem.SRMOUTIN_CONVPLCNAME, outinitem.SRMOUTIN_CONVNO);
  434. if (convs.DB521_Tasknum > 0)
  435. {
  436. var ttask = Current.TaskSet.FirstOrDefault(v => v.TASK_NO == convs.DB521_Tasknum && v.TASK_WKSTATUS == 2);
  437. if (ttask != null && ttask.TASK_EDITDATETIME.AddMinutes(3) < db.GetDate())
  438. {
  439. //堆垛机出口输送线任务3分钟未执行,//调用WMS接口申请移库任务,同时建议WMS将出库任务修改为移库任务。
  440. //调用WMS接口申请移库
  441. var moveTaskresult = Current.WmsInterface.I_WCS_GetMoveTask(new GetMoveTaskParam() { WMSTaskNum = outtask.TASK_WMSNO });
  442. if (moveTaskresult.ResType == 0)
  443. {
  444. Log4netHelper.Logger_Error.ErrorFormat(moveTaskresult.ResMessage);
  445. }
  446. else if (moveTaskresult.ResType == 2)
  447. {
  448. //创建移库任务并执行
  449. var moveTask = new WCS_TASK();
  450. db.Insertable(moveTask).ExecuteCommand();
  451. temptask = db.Queryable<WCS_TASK>().First(v => v.TASK_WMSNO == moveTask.TASK_WMSNO);
  452. break;
  453. }
  454. else if (moveTaskresult.ResType == 1)
  455. {
  456. temptask = outtask;
  457. break;
  458. }
  459. }
  460. }
  461. }
  462. }
  463. }
  464. }
  465. }
  466. return temptask;
  467. }
  468. internal virtual List<WCS_TASK> QueryOutTask(List<WCS_TASK> taskSet)
  469. {
  470. return taskSet.OrderByDescending(v => v.TASK_PRIORITY).OrderBy(v => v.TASK_EDITDATETIME).ToList();
  471. }
  472. private int _locInTaskAssignWareCell = 0;
  473. /// <summary>
  474. /// 分配入库货位
  475. /// </summary>
  476. internal void InTaskAssignWareCell()
  477. {
  478. if (Interlocked.Exchange(ref _locInTaskAssignWareCell, 1) == 0)
  479. {
  480. try
  481. {
  482. var taskSet = Current.TaskSet.Where(v => v.TASK_COMTYPE == 1 &&
  483. v.TASK_SRMNO == SrmNo &&
  484. v.TASK_WKSTATUS != 11 &&
  485. SrmOutInInfoSet.Any(t => t.SRMOUTIN_CONVNO == v.TASK_POSIDCUR && t.SRMOUTIN_OUTINTYPE == "in"))
  486. .OrderByDescending(v => v.TASK_PRIORITY).ToList();
  487. foreach (var task in taskSet)
  488. {
  489. if (string.IsNullOrWhiteSpace(task.TASK_POSIDTO) || task.TASK_POSIDTO == SrmNo)
  490. {
  491. //入库任务分配货位
  492. GetWareCell(task);
  493. }
  494. }
  495. }
  496. catch (Exception ex)
  497. {
  498. Log4netHelper.Logger_Error.ErrorFormat(ex.ToString());
  499. }
  500. finally
  501. {
  502. Interlocked.Exchange(ref _locInTaskAssignWareCell, 0);
  503. }
  504. }
  505. }
  506. public bool GetWareCell(WCS_TASK task)
  507. {
  508. string resultMsg = string.Empty;
  509. //调度接口获取货位
  510. var getWareCell = Current.WmsInterface.I_WCS_GetWareCell(new GetWareCellParam() { WMSTaskNum = task.TASK_WMSNO.ToString(), TunnelNum = task.TASK_SRMNO, PickUpEquipmentNo = task.TASK_POSIDNEXT });
  511. if (getWareCell.ResType)
  512. {
  513. resultMsg = TryCachHelper.TryTranExecute((db) =>
  514. {
  515. //修改任务分配货位
  516. db.Updateable<WCS_TASK>(it => new WCS_TASK() { TASK_POSIDNEXT = getWareCell.CellNo, TASK_POSIDTO = getWareCell.CellNo, TASK_EDITUSERNO = "WCS", TASK_EDITDATETIME = DateTime.Now })
  517. .Where(it => it.TASK_NO == task.TASK_NO)
  518. .ExecuteCommand();
  519. //添加修改明细
  520. string msg = string.Format("任务[{0}]分配货位[{1}]成功。", task.TASK_NO, getWareCell.CellNo);
  521. CommonData.AddWCS_TASK_DTL(db, task.TASK_NO, task.TASK_NO, task.TASK_POSIDCUR, task.TASK_POSIDNEXT, msg);
  522. });
  523. }
  524. else
  525. {
  526. resultMsg = string.Format("任务[{0}]调用接口分配货位[{1}]失败,原因:{2}", task.TASK_NO, getWareCell.CellNo, getWareCell.ResMessage);
  527. Log4netHelper.Logger_Error.ErrorFormat(resultMsg);
  528. }
  529. if (string.IsNullOrWhiteSpace(resultMsg))
  530. {
  531. task.TASK_POSIDNEXT = getWareCell.CellNo;
  532. task.TASK_POSIDTO = getWareCell.CellNo;
  533. return true;
  534. }
  535. else
  536. {
  537. return false;
  538. }
  539. }
  540. #endregion;
  541. }
  542. }