Base_Srm_text.cs 48 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009
  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 WCS.Data;
  8. using WCS.Data.Models;
  9. using WCS.Data.Utils;
  10. using WCS.PLC.Model.Equipment;
  11. namespace WCS.PLC.Equipment
  12. {
  13. public class Base_Srm_text : Base_EquPlc
  14. {
  15. private readonly string SrmOutInInfo_in = "in";
  16. private readonly string SrmOutInInfo_out = "out";
  17. private readonly string SrmOutInInfo_outIn = "outIn";
  18. #region Properties
  19. /// <summary>
  20. /// 堆垛机信号
  21. /// </summary>
  22. protected SrmSignal EquSignal
  23. {
  24. get
  25. {
  26. return WCS_PLCItem.WCS_EquipmentInfoSet[0].EquSignal_Srm;
  27. }
  28. }
  29. /// <summary>
  30. /// 写入DB名称
  31. /// </summary>
  32. protected int WriteDbName
  33. {
  34. get
  35. {
  36. return WCS_PLCItem.WCS_DBSet[0].DB_NAME;
  37. }
  38. }
  39. /// <summary>
  40. /// 堆垛机出入库口设置列表
  41. /// </summary>
  42. protected List<WCS_SrmOutInInfo> SrmOutInInfoSet = new List<WCS_SrmOutInInfo>();
  43. #endregion;
  44. #region Constructor
  45. public Base_Srm_text() : base()
  46. {
  47. }
  48. #endregion;
  49. #region Method
  50. private int _locExecute = 0;
  51. public override void Run()
  52. {
  53. if (Interlocked.Exchange(ref _locExecute, 1) == 0)
  54. {
  55. try
  56. {
  57. //加载刷新堆垛机执行需要的最新参数设置
  58. Init_Refresh();
  59. //分配入库货位
  60. ThreadHelper.TaskThread(AssignInWareCell);
  61. if (WCS_PLCItem.IsConnSuccess == false) return;
  62. if (string.IsNullOrWhiteSpace(PlcName)) return;
  63. //完成任务
  64. SRMCompleteTask();
  65. //执行任务
  66. SRMStartExecuteTask();
  67. }
  68. catch (Exception ex)
  69. {
  70. string errormsg = string.Format("堆垛机[{0}]执行异常,消息:{1}", PlcName, ex.ToString());
  71. LogMessageHelper.RecordLogMessage(errormsg, ex);
  72. }
  73. finally
  74. {
  75. Interlocked.Exchange(ref _locExecute, 0);
  76. }
  77. }
  78. }
  79. /// <summary>
  80. /// 堆垛机任务完成
  81. /// </summary>
  82. protected virtual void SRMCompleteTask()
  83. {
  84. try
  85. {
  86. //当前任务完成
  87. if (EquSignal.DB521_Task_Finishi == false) return;
  88. //查询任务
  89. var task = SugarBase.DB.Queryable<WCS_TASK>().First(v => v.TASK_NO == EquSignal.DB521_Taskfinishi_ID);
  90. if (task == null) return;
  91. if (task.TASK_WKSTATUS >= 99) return;
  92. if ((task.TASK_COMTYPE == (int)ComTypeEnum.入库 && task.TASK_POSIDTO.Length > 5) || task.TASK_COMTYPE == (int)ComTypeEnum.移库)
  93. {
  94. //完成任务
  95. string result = TryCachHelper.TryTranExecute((db) =>
  96. {
  97. //修改任务的状态
  98. db.Updateable<WCS_TASK>(it => new WCS_TASK() { TASK_WKSTATUS = 99, TASK_EDITUSERNO = "WCS", TASK_EDITDATETIME = DateTime.Now })
  99. .Where(it => it.TASK_NO == task.TASK_NO)
  100. .ExecuteCommand();
  101. //添加修改明细
  102. string msg = string.Format("任务[{0}]完成", task.TASK_NO);
  103. CommonData.AddWCS_TASK_DTL(db, task.TASK_NO, task.TASK_NO, task.TASK_POSIDCUR, task.TASK_POSIDTO, msg);
  104. });
  105. if (string.IsNullOrWhiteSpace(result))
  106. {
  107. if (task.TASK_COMTYPE == (int)ComTypeEnum.入库)
  108. {
  109. SrmConvNoMoveToLast(task.TASK_POSIDCUR);
  110. }
  111. }
  112. }
  113. else if (task.TASK_COMTYPE == (int)ComTypeEnum.出库 || task.TASK_COMTYPE == (int)ComTypeEnum.搬运)
  114. {
  115. if (task.TASK_WKSTATUS == (int)WkStatus.堆垛机执行)
  116. {
  117. //var routeSet = EquRouteHelper.QueryRoute(task.TASK_SRMNO, task.TASK_POSIDTO);
  118. //var routes = routeSet.Where(v => v.ROUTE_STARTPOS == task.TASK_SRMNO).ToList();
  119. //var route = QueryOutEquRouteItem(task, routes);
  120. int wksstatus = 6;
  121. //if (route.ISEND)
  122. //{
  123. // wksstatus = 99;
  124. //}
  125. string result = TryCachHelper.TryTranExecute((db) =>
  126. {
  127. //修改任务的状态
  128. db.Updateable<WCS_TASK>(it => new WCS_TASK() { TASK_WKSTATUS = wksstatus, TASK_POSIDCUR = task.TASK_POSIDNEXT, TASK_EDITUSERNO = "WCS", TASK_EDITDATETIME = DateTime.Now })
  129. .Where(it => it.TASK_NO == task.TASK_NO)
  130. .ExecuteCommand();
  131. //添加修改明细
  132. string msg = string.Format("任务[{0}]堆垛机完成,修改当前地址为[{1}]", task.TASK_NO, task.TASK_POSIDNEXT);
  133. CommonData.AddWCS_TASK_DTL(db, task.TASK_NO, task.TASK_NO, task.TASK_POSIDNEXT, task.TASK_POSIDNEXT, msg);
  134. });
  135. if (string.IsNullOrWhiteSpace(result))
  136. {
  137. SrmConvNoMoveToLast(task.TASK_POSIDNEXT);
  138. }
  139. }
  140. }
  141. //TaskComplete(task.TASK_SRMNO, task.TASK_ID, task.TASK_COMTYPE);
  142. }
  143. catch (Exception ex)
  144. {
  145. LogMessageHelper.RecordLogMessage(ex);
  146. }
  147. }
  148. private void SRMStartExecuteTask()
  149. {
  150. //检测堆垛机模式
  151. if (EquSignal.DB521_Auto_status != (int)SrmModeEnum.远程) return;
  152. //检测堆垛机报警
  153. if (EquSignal.SrmDB541_Alarm) return;
  154. //检测堆垛机状态
  155. if (EquSignal.DB521_Srm_Status != (int)SrmStateFork1Enum.空闲) return;
  156. if (EquSignal.DB520_Task_trigger != 0) return;
  157. //检测堆垛机禁用
  158. //if (Current.SysSets.FirstOrDefault(v => v.SET_ID == SrmNo).SET_VALUE.Trim() == "1") return;
  159. var taskSet = SugarBase.DB.Queryable<WCS_TASK>().Where(v => v.TASK_SRMNO == PlcName).ToList();
  160. var task = taskSet.FirstOrDefault(v => (v.TASK_WKSTATUS == (int)WkStatus.堆垛机执行));
  161. if (task == null)
  162. {
  163. taskSet = taskSet.Where(v => v.TASK_COMTYPE == (int)TaskTypeEnum.TaskType_StockTransfer && v.TASK_WKSTATUS <= 1 && v.TASK_SRMNO == WCS_PLCItem.PLC_NAME).ToList();
  164. if (taskSet.Count() > 0)
  165. {
  166. //移库
  167. MoveStock(taskSet.First());
  168. }
  169. else
  170. {
  171. taskSet = taskSet.Where(v => v.TASK_WKSTATUS <= 2).ToList();
  172. OutInStock(taskSet);
  173. }
  174. }
  175. else
  176. {
  177. Log4netHelper.Logger_Error.ErrorFormat(string.Format("堆垛机[{0}]状态正常,但是存在执行中的任务[{1}]", PlcName, task.TASK_NO));
  178. }
  179. }
  180. private void OutInStock(List<WCS_TASK> tasks)
  181. {
  182. if (tasks.Count == 0) return;
  183. int taskMaxPriority = tasks.Max(v => v.TASK_PRIORITY);
  184. for (int index = taskMaxPriority; index >= 0; index--)
  185. {
  186. var tasks_Temp = tasks.Where(v => v.TASK_PRIORITY == index).ToList();
  187. if (tasks_Temp.Count > 0)
  188. {
  189. //查询硬件条件满足的可用出入库任务
  190. var taskSet = QueryTask(tasks_Temp);
  191. //调用扩展函数返回可用出入库任务
  192. var taskList = QueryOutTasks(taskSet);
  193. //克隆集合
  194. List<WCS_SrmOutInInfo> outininfoSet = SrmOutInInfoSet.GetRange(0, SrmOutInInfoSet.Count);
  195. foreach (var outininfo in outininfoSet)
  196. {
  197. if (outininfo.SRMOUTIN_OUTINTYPE == SrmOutInInfo_in || outininfo.SRMOUTIN_OUTINTYPE == SrmOutInInfo_outIn)
  198. {
  199. var taskitem = taskList.SingleOrDefault(v => v.TASK_POSIDCUR == outininfo.SRMOUTIN_CONVNO);
  200. if (taskitem != null)
  201. {
  202. if (taskitem.TASK_COMTYPE == (int)TaskTypeEnum.TaskType_InStorage)
  203. {
  204. if (InStock(taskitem))
  205. {
  206. break;
  207. }
  208. }
  209. else if (taskitem.TASK_COMTYPE == (int)TaskTypeEnum.TaskType_Carry)
  210. {
  211. if (Carry(taskitem))
  212. {
  213. break;
  214. }
  215. }
  216. }
  217. }
  218. if (outininfo.SRMOUTIN_OUTINTYPE == SrmOutInInfo_out || outininfo.SRMOUTIN_OUTINTYPE == SrmOutInInfo_outIn)
  219. {
  220. var tasktempList = taskList.Where(v => v.TASK_COMTYPE == (int)TaskTypeEnum.TaskType_OutStorage).ToList();
  221. bool iscreateSuccess = false;
  222. foreach (var item in tasktempList)
  223. {
  224. //检测是否允许出库
  225. if (QueryOutTask(item))
  226. {
  227. if (OutStock(item))
  228. {
  229. iscreateSuccess = true;
  230. break;
  231. }
  232. }
  233. }
  234. if (iscreateSuccess)
  235. {
  236. break;
  237. }
  238. }
  239. }
  240. }
  241. }
  242. }
  243. protected virtual bool QueryOutTask(WCS_TASK task) { return true; }
  244. private bool ExecuteTask(WCS_TASK task)
  245. {
  246. bool isExecuteFinish = false;
  247. if (task.TASK_COMTYPE == (int)ComTypeEnum.入库)
  248. {
  249. if (InStock(task)) isExecuteFinish = true;
  250. }
  251. else if (task.TASK_COMTYPE == (int)ComTypeEnum.出库)
  252. {
  253. if (OutStock(task)) isExecuteFinish = true;
  254. }
  255. else if (task.TASK_COMTYPE == (int)ComTypeEnum.搬运)
  256. {
  257. if (Carry(task)) isExecuteFinish = true;
  258. }
  259. return isExecuteFinish;
  260. }
  261. protected virtual List<WCS_TASK> QueryOutTasks(List<WCS_TASK> taskSet) { return taskSet.OrderBy(n => n.TASK_ADDDATETIME).ToList(); }
  262. private List<WCS_TASK> QueryTask(List<WCS_TASK> tasks)
  263. {
  264. List<WCS_TASK> wcs_taskSet = new List<WCS_TASK>();
  265. //克隆集合
  266. List<WCS_SrmOutInInfo> outininfoSet = SrmOutInInfoSet.GetRange(0, SrmOutInInfoSet.Count);
  267. foreach (var outininfo in outininfoSet)
  268. {
  269. if (outininfo.SRMOUTIN_OUTINTYPE == SrmOutInInfo_in || outininfo.SRMOUTIN_OUTINTYPE == SrmOutInInfo_outIn)
  270. {
  271. var intasks = tasks.SingleOrDefault(v => v.TASK_WKSTATUS != (int)WkStatus.堆垛机执行 &&
  272. v.TASK_POSIDCUR == outininfo.SRMOUTIN_CONVNO &&
  273. //v.TASK_POSIDNEXT == outininfo.SRMOUTIN_CONVNO &&
  274. (v.TASK_COMTYPE == 1 || v.TASK_COMTYPE == 4));
  275. if (intasks != null)
  276. {
  277. var temptask = QueryInConvTask(outininfo, intasks);
  278. if (temptask != null)
  279. {
  280. wcs_taskSet.Add(temptask);
  281. continue;
  282. }
  283. }
  284. }
  285. if (outininfo.SRMOUTIN_OUTINTYPE == SrmOutInInfo_out || outininfo.SRMOUTIN_OUTINTYPE == SrmOutInInfo_outIn)
  286. {
  287. //检测出口状态
  288. var convSignal = ConveyorHelper.GetConveyorSignal(outininfo.SRMOUTIN_CONVPLCNAME, outininfo.SRMOUTIN_CONVNO);
  289. if (convSignal.DB521_Request == false && convSignal.DB521_Tasknum <= 0 && convSignal.CvDB51_PH_Status == false)
  290. {
  291. var outTask = SugarBase.DB.Queryable<WCS_TASK>().First(v => v.TASK_POSIDCUR == outininfo.SRMOUTIN_CONVNO);
  292. if (outTask == null ||
  293. ((outTask.TASK_WKSTATUS != (int)WkStatus.输送机执行) && (outTask.TASK_WKSTATUS != (int)WkStatus.堆垛机完成)))
  294. {
  295. //检测是否存在该出口的任务列表
  296. List<WCS_TASK> list = new List<WCS_TASK>();
  297. var taskList = tasks.Where(v => v.TASK_COMTYPE == 2 && v.TASK_WKSTATUS <= 1).ToList();
  298. foreach (var task in taskList)
  299. {
  300. var routes = EquRouteHelper.QueryRoute(task.TASK_SRMNO, task.TASK_POSIDTO).Where(v => v.ROUTE_STARTPOS == PlcName).ToList();
  301. var routeitem = routes.FirstOrDefault(v => v.ROUTE_SONPOS == outininfo.SRMOUTIN_CONVNO);
  302. if (routeitem != null && CheckAreaOutAddress(task, routeitem))
  303. {
  304. if (wcs_taskSet.Any(v => v.TASK_NO == task.TASK_NO) == false)
  305. {
  306. list.Add(task);
  307. }
  308. }
  309. }
  310. if (list.Count() > 0) wcs_taskSet.AddRange(list);
  311. }
  312. }
  313. }
  314. }
  315. return wcs_taskSet;
  316. }
  317. /// <summary>
  318. /// 检测区域出口地址(弯轨堆垛机,多项道转换堆垛机)
  319. /// </summary>
  320. protected virtual bool CheckAreaOutAddress(WCS_TASK task, WCS_EQUIPMENTROUTE route)
  321. {
  322. return true;
  323. }
  324. protected virtual WCS_EQUIPMENTROUTE QueryOutEquRouteItem(WCS_TASK task, List<WCS_EQUIPMENTROUTE> routeSet)
  325. {
  326. return routeSet.Single();
  327. }
  328. /// <summary>
  329. /// 查询堆垛机入库口任务
  330. /// </summary>
  331. protected virtual WCS_TASK QueryInConvTask(WCS_SrmOutInInfo outininfo, WCS_TASK task)
  332. {
  333. WCS_TASK wcs_task = null;
  334. var convSignal = ConveyorHelper.GetConveyorSignal(outininfo.SRMOUTIN_CONVPLCNAME, outininfo.SRMOUTIN_CONVNO);
  335. if (convSignal.DB521_Tasknum == task.TASK_NO && convSignal.CvDB51_PH_Status
  336. //&& convSignal.DB521_Goodsend.ToString() == outininfo.SRMOUTIN_CONVNO
  337. )
  338. {
  339. if (task.TASK_COMTYPE == 1)
  340. {
  341. if (string.IsNullOrWhiteSpace(task.TASK_POSIDTO) || task.TASK_POSIDTO == PlcName)
  342. {
  343. wcs_task = null;
  344. }
  345. else
  346. {
  347. wcs_task = task;
  348. }
  349. }
  350. else if (task.TASK_COMTYPE == 4)
  351. {
  352. var route = EquRouteHelper.QueryRoute(task.TASK_SRMNO, task.TASK_POSIDTO).FirstOrDefault(v => v.ROUTE_STARTPOS == PlcName);
  353. var srmoutin = SrmOutInInfoSet.SingleOrDefault(v => v.SRMOUTIN_CONVNO == route.ROUTE_NEXTPOS && v.SRMOUTIN_SRMNO == PlcName);
  354. //检测出口状态
  355. var outConv = ConveyorHelper.GetConveyorSignal(srmoutin.SRMOUTIN_CONVPLCNAME, srmoutin.SRMOUTIN_CONVNO);
  356. if (outConv.DB521_Tasknum == 0 && outConv.CvDB51_PH_Status == false)
  357. {
  358. wcs_task = task;
  359. }
  360. }
  361. }
  362. return wcs_task;
  363. }
  364. protected bool InStock(WCS_TASK task)
  365. {
  366. bool result = true;
  367. try
  368. {
  369. if (task != null)
  370. {
  371. //检测任务当前位置存在于srm当前入口输送线列表中
  372. if (SrmOutInInfoSet.Any(v => v.SRMOUTIN_CONVNO == task.TASK_POSIDCUR && (v.SRMOUTIN_OUTINTYPE == SrmOutInInfo_in || v.SRMOUTIN_OUTINTYPE == SrmOutInInfo_outIn)))
  373. {
  374. if (string.IsNullOrWhiteSpace(task.TASK_POSIDTO) || task.TASK_POSIDTO == PlcName)
  375. {
  376. //分配货位
  377. //bool assignresult = GetWareCell(task); //WareCell_Assign(db, task);
  378. //if (assignresult == false) return false;
  379. Log4netHelper.Logger_Error.ErrorFormat(string.Format("任务[{0}]未分配货位,堆垛机不能执行", task.TASK_NO));
  380. return false;
  381. }
  382. //task = db.Queryable<WCS_TASK>().First(v => v.TASK_NO == task.TASK_NO);
  383. //if (string.IsNullOrWhiteSpace(task.TASK_POSIDTO) || task.TASK_POSIDTO == SrmNo)
  384. //{
  385. // throw new Exception(string.Format("任务[{0}]未分配货位。", task.TASK_NO));
  386. //}
  387. //else
  388. //{
  389. // Log4netHelper.Logger_Info.InfoFormat("任务[{0}]货位分配成功", task.TASK_NO);
  390. //}
  391. var writeSignal = new WCSWriteToSrmSignal();
  392. writeSignal.Start_number = 0;
  393. writeSignal.Goodtype = 0;
  394. if (task.TASK_COMTYPE == 4)//移动
  395. {
  396. //var startCvToEnd = ConveyorHelper.SrmMoveCvSet.FirstOrDefault(v => v.StartConveyor == task.TASK_POSIDCUR);
  397. //writeSignal.RowPos1 = startCvToEnd.SrmStartRow;
  398. //writeSignal.Travelpos1 = startCvToEnd.SrmStartColumn;
  399. //writeSignal.Liftpos1 = startCvToEnd.SrmStartLayer;
  400. //writeSignal.Fork_start_pos1 = startCvToEnd.SrmStartDepth;
  401. //writeSignal.RowPos2 = startCvToEnd.SrmEndRow;
  402. //writeSignal.Travelpos2 = startCvToEnd.SrmEndColumn;
  403. //writeSignal.Liftpos2 = startCvToEnd.SrmEndLayer;
  404. //writeSignal.Fork_dest_pos2 = startCvToEnd.SrmEndDepth;
  405. }
  406. else
  407. {
  408. var route = Current.EquRouteSet.FirstOrDefault(v => v.ROUTE_STARTPOS == task.TASK_POSIDCUR);
  409. writeSignal.RowPos1 = (int)route.SRMROW;
  410. writeSignal.Travelpos1 = (int)route.SRMCOLUMN;
  411. writeSignal.Liftpos1 = (int)route.SRMLAYER;
  412. //writeSignal.Fork_start_pos1 = (int)route.DEPTH;
  413. //查询货位表巷道,深度
  414. //var location = db.Queryable<Base_Location>().First(v => v.Loc_No == task.TASK_POSIDTO);
  415. writeSignal.RowPos2 = task.ToRow;// location.Loc_Tunnel;
  416. writeSignal.Travelpos2 = task.ToCol;
  417. writeSignal.Liftpos2 = task.ToLayer;
  418. //writeSignal.Fork_dest_pos2 = task.ToDepth; //location.Loc_Depth;
  419. }
  420. //if (task.TASK_COMTYPE == 5)
  421. //{
  422. // var warecell = db.Queryable<BASE_WARECELL>().First(v => v.F_NO == task.TASK_POSIDTO);
  423. // int count = db.Queryable<BILL_INVCONTR>().Where(v => v.F_CONTRGRPNO == warecell.F_CNTRGRPNO).Count();
  424. // writeSignal.End_number = count;
  425. //}
  426. writeSignal.TaskID = task.TASK_NO;
  427. //执行任务
  428. SrmOutIn(writeSignal, task.TASK_POSIDCUR, task.TASK_POSIDTO);
  429. }
  430. }
  431. }
  432. catch (Exception ex)
  433. {
  434. result = false;
  435. }
  436. return result;
  437. }
  438. protected bool OutStock(WCS_TASK task)
  439. {
  440. bool result = true;
  441. try
  442. {
  443. var writeSignal = new WCSWriteToSrmSignal();
  444. writeSignal.Start_number = 0;
  445. writeSignal.End_number = 0;
  446. writeSignal.Goodtype = 0;
  447. //查询货位表巷道,深度
  448. //var location = db.Queryable<Base_Location>().First(v => v.Loc_No == outtask.TASK_POSIDFROM);
  449. if (task.TASK_POSIDCUR == task.TASK_POSIDFROM)
  450. {
  451. //堆垛机出库
  452. writeSignal.RowPos1 = task.FromRow;//location.Loc_Tunnel;
  453. writeSignal.Travelpos1 = task.FromCol;//outtask.ToCol;
  454. writeSignal.Liftpos1 = task.FromLayer;//outtask.ToLayer;
  455. }
  456. else
  457. {
  458. //堆垛机搬运任务
  459. var routeSet = Current.EquRouteSet.Where(v => v.ROUTE_STARTPOS == task.TASK_POSIDCUR).ToList();
  460. var routes = routeSet.Where(v => v.ROUTE_SONPOS == PlcName).ToList();
  461. var route = QueryOutEquRouteItem(task, routes);
  462. writeSignal.RowPos1 = (int)route.SRMROW;//location.Loc_Tunnel;
  463. writeSignal.Travelpos1 = (int)route.SRMCOLUMN;//outtask.ToCol;
  464. writeSignal.Liftpos1 = (int)route.SRMLAYER;//outtask.ToLayer;
  465. }
  466. //writeSignal.Fork_start_pos1 = outtask.FromDepth;// location.Loc_Depth; location.Loc_EquimentNo
  467. if (task.TASK_COMTYPE == 2)
  468. {
  469. var routeSet = EquRouteHelper.QueryRoute(task.TASK_SRMNO, task.TASK_POSIDTO);
  470. var routes = routeSet.Where(v => v.ROUTE_STARTPOS == task.TASK_SRMNO).ToList();
  471. var route = QueryOutEquRouteItem(task, routes);
  472. writeSignal.RowPos2 = (int)route.SRMROW;
  473. writeSignal.Travelpos2 = (int)route.SRMCOLUMN;
  474. writeSignal.Liftpos2 = (int)route.SRMLAYER;
  475. //writeSignal.Fork_dest_pos2 = (int)route.DEPTH;
  476. writeSignal.TaskID = task.TASK_NO;
  477. //执行任务
  478. SrmOutIn(writeSignal, task.TASK_POSIDFROM, route.ROUTE_SONPOS);
  479. }
  480. else if (task.TASK_COMTYPE == 3)
  481. {
  482. if (string.IsNullOrWhiteSpace(task.TASK_POSIDTO) || task.TASK_POSIDTO == WCS_PLCItem.PLC_NAME)
  483. {
  484. bool assignresult = GetWareCell(task);
  485. if (assignresult == false) return result;
  486. }
  487. writeSignal.RowPos2 = task.ToRow;
  488. writeSignal.Travelpos2 = task.ToCol;
  489. writeSignal.Liftpos2 = task.ToLayer;
  490. //writeSignal.Fork_dest_pos2 = outtask.ToDepth;
  491. writeSignal.TaskID = task.TASK_NO;
  492. //执行任务
  493. SrmOutIn(writeSignal, task.TASK_POSIDFROM, task.TASK_POSIDTO);
  494. }
  495. }
  496. catch (Exception ex)
  497. {
  498. LogMessageHelper.RecordLogMessage(ex);
  499. result = false;
  500. }
  501. return result;
  502. }
  503. protected bool Carry(WCS_TASK task)
  504. {
  505. bool result = true;
  506. try
  507. {
  508. var writeSignal = new WCSWriteToSrmSignal();
  509. writeSignal.Start_number = 0;
  510. writeSignal.End_number = 0;
  511. writeSignal.Goodtype = 0;
  512. var routeItem = Current.EquRouteSet.SingleOrDefault(v => v.ROUTE_STARTPOS == task.TASK_POSIDNEXT && v.ROUTE_SONPOS == PlcName);
  513. //查询货位表巷道,深度
  514. //var location = db.Queryable<Base_Location>().First(v => v.Loc_No == outtask.TASK_POSIDFROM);
  515. writeSignal.RowPos1 = (int)routeItem.SRMROW;//task.FromRow;//location.Loc_Tunnel;
  516. writeSignal.Travelpos1 = (int)routeItem.SRMCOLUMN; //task.FromCol;//outtask.ToCol;
  517. writeSignal.Liftpos1 = (int)routeItem.SRMLAYER;//task.FromLayer;//outtask.ToLayer;
  518. //writeSignal.Fork_start_pos1 = outtask.FromDepth;// location.Loc_Depth; location.Loc_EquimentNo
  519. var routeSet = EquRouteHelper.QueryRoute(task.TASK_SRMNO, task.TASK_POSIDTO);
  520. var route = routeSet.FirstOrDefault(v => v.ROUTE_STARTPOS == task.TASK_SRMNO);
  521. writeSignal.RowPos2 = (int)route.SRMROW;
  522. writeSignal.Travelpos2 = (int)route.SRMCOLUMN;
  523. writeSignal.Liftpos2 = (int)route.SRMLAYER;
  524. //writeSignal.Fork_dest_pos2 = (int)route.DEPTH;
  525. writeSignal.TaskID = task.TASK_NO;
  526. //执行任务
  527. SrmOutIn(writeSignal, task.TASK_POSIDNEXT, route.ROUTE_SONPOS);
  528. }
  529. catch (Exception ex)
  530. {
  531. LogMessageHelper.RecordLogMessage(ex);
  532. result = false;
  533. }
  534. return result;
  535. }
  536. protected void MoveStock(WCS_TASK task)
  537. {
  538. var writeSignal = new WCSWriteToSrmSignal();
  539. writeSignal.Start_number = 0;
  540. writeSignal.End_number = 0;
  541. writeSignal.Goodtype = 0;
  542. //查询货位表巷道,深度
  543. //var location1 = db.Queryable<BASE_WARECELL>().First(v => v.F_NO == task.TASK_POSIDFROM);
  544. writeSignal.RowPos1 = task.FromRow; // location1.F_LINE;
  545. writeSignal.Travelpos1 = task.FromCol;
  546. writeSignal.Liftpos1 = task.FromLayer;
  547. //writeSignal.Fork_start_pos1 = location1.F_DEPTH;
  548. writeSignal.End_number = 0;
  549. //查询货位表巷道,深度
  550. //var location2 = db.Queryable<BASE_WARECELL>().First(v => v.F_NO == task.TASK_POSIDTO);
  551. writeSignal.RowPos2 = task.ToRow;//location2.F_LINE;
  552. writeSignal.Travelpos2 = task.ToCol;
  553. writeSignal.Liftpos2 = task.ToLayer;
  554. //writeSignal.Fork_dest_pos2 = location2.F_DEPTH;
  555. writeSignal.TaskID = task.TASK_NO;
  556. writeSignal.End_number = 0;
  557. //执行任务
  558. SrmOutIn(writeSignal, task.TASK_POSIDFROM, task.TASK_POSIDTO);
  559. }
  560. private void SrmOutIn(WCSWriteToSrmSignal srmSignal, string startPos, string posIdnext)
  561. {
  562. var task = Current.TaskSet.First(v => v.TASK_NO == srmSignal.TaskID);
  563. WCS_CacheInfo cahcheinfo = null;//Current.WCS_CacheInfoSet.FirstOrDefault(v => v.Cache_ConvNo == task.TASK_POSIDTO || v.Cache_AreaName == task.TASK_POSIDTO);
  564. string cacheAreaName = cahcheinfo == null ? srmSignal.TaskID.ToString() : cahcheinfo.Cache_AreaName;
  565. //string errorMsg = ThreadLockHelper.SrmOutIn(EquSignal, srmSignal, WCS_PLCItem.Plc, WriteDbName, startPos, posIdnext, cacheAreaName, PlcName);
  566. string errorMsg = SrmOutIn(EquSignal, srmSignal, startPos, posIdnext, cacheAreaName);
  567. if (!string.IsNullOrWhiteSpace(errorMsg)) throw new Exception(errorMsg);
  568. }
  569. public string SrmOutIn(SrmSignal equSignal, WCSWriteToSrmSignal srmSignal, string startPos, string posIdnext, string cacheAreaName)
  570. {
  571. using (var mutex = new Mutex(false, cacheAreaName))
  572. {
  573. string resultMsg = string.Empty;
  574. try
  575. {
  576. if (mutex.WaitOne(-1, false))
  577. {
  578. SrmTaskRun(equSignal, srmSignal, startPos, posIdnext, cacheAreaName);
  579. }
  580. }
  581. catch (Exception ex)
  582. {
  583. resultMsg = ex.Message;
  584. }
  585. finally
  586. {
  587. mutex.ReleaseMutex();
  588. }
  589. return resultMsg;
  590. }
  591. }
  592. private void SrmTaskRun(SrmSignal equSignal, WCSWriteToSrmSignal srmSignal, string startPos, string posIdnext, string cacheAreaName)
  593. {
  594. //检测并生成移库任务
  595. CheckCreateMoveTask(srmSignal, ref startPos, ref posIdnext);
  596. bool isExecute = CheckIsExecuteTask(cacheAreaName);
  597. if (isExecute)
  598. {
  599. WriteTaskToSrm(srmSignal);
  600. string convNo = string.Empty;
  601. string result = TryCachHelper.TryTranExecute((db) =>
  602. {
  603. var task = db.Queryable<WCS_TASK>().First(t => t.TASK_NO == srmSignal.TaskID);
  604. if (task.TASK_COMTYPE == (int)TaskTypeEnum.TaskType_OutStorage)
  605. {
  606. convNo = posIdnext;
  607. }
  608. else if (task.TASK_COMTYPE == (int)TaskTypeEnum.TaskType_InStorage ||
  609. task.TASK_COMTYPE == (int)TaskTypeEnum.TaskType_Carry)
  610. {
  611. convNo = task.TASK_POSIDCUR;
  612. }
  613. int updateresult = db.Updateable<WCS_TASK>(it => new WCS_TASK()
  614. {
  615. TASK_WKSTATUS = (int)WkStatus.堆垛机执行,
  616. TASK_POSIDNEXT = posIdnext,
  617. TASK_EDITUSERNO = "WCS",
  618. TASK_EDITDATETIME = DateTime.Now
  619. })
  620. .Where(it => it.TASK_NO == srmSignal.TaskID).ExecuteCommand();
  621. if (updateresult <= 0)
  622. {
  623. throw new Exception(string.Format("任务[{0}]堆垛机执行修改状态失败。", srmSignal.TaskID));
  624. }
  625. string msg = string.Format("任务[{0}]已下发给堆垛机执行,起点位置[{1}]目标地址[{2}]", task.TASK_NO, startPos, posIdnext);
  626. CommonData.AddWCS_TASK_DTL(db, task.TASK_NO, task.TASK_NO, task.TASK_POSIDCUR, posIdnext, msg);
  627. if (equSignal.DB520_Task_trigger != 1)
  628. {
  629. string mes = string.Format("读取上次plc信息:任务号[{0}]起始行[{1}]起始列[{2}]起始层[{3}]目标行[{4}]目标列[{5}]目标层[{6}]",
  630. equSignal.DB520_TaskID, equSignal.DB520_FromRowPos, equSignal.DB520_FromColumnPos, equSignal.DB520_FromLayerPos,
  631. equSignal.DB520_ToRowPos, equSignal.DB520_ToColumnPos, equSignal.DB520_ToLayerPos);
  632. Log4netHelper.Logger_Info.InfoFormat(mes);
  633. if (WCS_PLCItem.Plc.WriteSignal((ushort)WriteDbName, 30, 2, 1))
  634. {
  635. Log4netHelper.Logger_Info.InfoFormat(string.Format("任务[{0}]写入触发信号成功。", srmSignal.TaskID));
  636. }
  637. else
  638. {
  639. throw new Exception(string.Format("任务[{0}]520写入触发信号失败。", srmSignal.TaskID));
  640. }
  641. }
  642. });
  643. if (string.IsNullOrWhiteSpace(result))
  644. {
  645. //移动到最后
  646. SrmConvNoMoveToLast(convNo);
  647. }
  648. else
  649. {
  650. throw new Exception(string.Format("任务[{0}]堆垛机执行失败,原因:[{1}]", srmSignal.TaskID, result));
  651. }
  652. }
  653. else
  654. {
  655. throw new Exception(string.Format("目标地址[{0}]交通管制,暂无法执行出库任务,将优先执行其它任务。", cacheAreaName));
  656. }
  657. }
  658. private void CheckCreateMoveTask(WCSWriteToSrmSignal srmSignal, ref string startPos, ref string posIdnext)
  659. {
  660. var task = SugarBase.DB.Queryable<WCS_TASK>().Single(v => v.TASK_NO == srmSignal.TaskID);
  661. if (task == null)
  662. {
  663. throw new Exception(string.Format("堆垛机[{0}]执行的任务[{1}]不存在", PlcName, srmSignal.TaskID));
  664. }
  665. if (task.TASK_COMTYPE == (int)TaskTypeEnum.TaskType_OutStorage &&
  666. task.FromDepth == 2 &&
  667. task.TASK_POSIDCUR == task.TASK_POSIDFROM &&
  668. string.IsNullOrWhiteSpace(task.TASK_POSIDMOVE))
  669. {
  670. var tasktemps = SugarBase.DB.Queryable<WCS_TASK>().Where(v => v.TASK_SRMNO == PlcName).ToList();
  671. var task_DepthOne = tasktemps.FirstOrDefault(v => v.FromNo == task.FromNo &&
  672. v.FromCol == task.FromCol &&
  673. v.FromLayer == task.FromLayer &&
  674. v.FromDepth == 1 &&
  675. v.TASK_WKSTATUS <= 1 &&
  676. v.TASK_COMTYPE == 2 || v.TASK_COMTYPE == 3);
  677. if (task_DepthOne == null)
  678. {
  679. //调用生成移库任务接口
  680. var moveTaskresult = Current.WmsInterface.I_WCS_GetMoveTask(new GetMoveTaskParam() { WMSTaskNum = task.TASK_WMSNO });
  681. if (moveTaskresult.ResType == 0)
  682. {
  683. throw new Exception(string.Format("任务[{0}]调用移库接口报错:[{1}]", task.TASK_NO, moveTaskresult.ResMessage));
  684. }
  685. else if (moveTaskresult.ResType == 2)
  686. {
  687. //创建移库任务并执行
  688. var moveTask = new WCS_TASK()
  689. {
  690. TASK_WMSNO = moveTaskresult.WMSTaskNum,
  691. TASK_COMTYPE = 3,
  692. TASK_SYSTYPE = "wcs",
  693. TASK_POSIDFROM = moveTaskresult.MoveStartWareCell,
  694. TASK_POSIDCUR = moveTaskresult.MoveStartWareCell,
  695. TASK_POSIDNEXT = moveTaskresult.MoveStartWareCell,
  696. TASK_POSIDTO = moveTaskresult.MoveEndWareCell,
  697. TASK_POSIDMOVE = moveTaskresult.MoveEndWareCell,
  698. TASK_PRIORITY = 0,
  699. TASK_WKSTATUS = 0,
  700. TASK_WHID = moveTaskresult.WareHouseName,
  701. TASK_ADDUSERNO = "wcs",
  702. TASK_ADDDATETIME = SugarBase.DB.GetDate(),
  703. TASK_EDITUSERNO = "wcs",
  704. TASK_EDITDATETIME = SugarBase.DB.GetDate(),
  705. TASK_NOTES = string.Empty,
  706. TASK_SRMNO = PlcName,
  707. TASK_BOXBARCODE = moveTaskresult.ContainerBarCode,
  708. TASK_FromTunnelNum = moveTaskresult.FromTunnelNum,
  709. TASK_EndTunnelNum = moveTaskresult.EndTunnelNum
  710. };
  711. string result = TryCachHelper.TryTranExecute((db) =>
  712. {
  713. int inserttask = db.Insertable(moveTask).ExecuteCommand();
  714. if (inserttask <= 0)
  715. {
  716. throw new Exception(string.Format("任务[{0}]生成移库添加移库任务失败.", task.TASK_NO));
  717. }
  718. //修改任务的移库字段
  719. int updatetask = db.Updateable<WCS_TASK>(it => new WCS_TASK() { TASK_POSIDMOVE = moveTask.TASK_POSIDMOVE, TASK_PRIORITY = 111, TASK_EDITUSERNO = "WCS", TASK_EDITDATETIME = DateTime.Now })
  720. .Where(it => it.TASK_NO == task.TASK_NO)
  721. .ExecuteCommand();
  722. if (updatetask <= 0)
  723. {
  724. throw new Exception(string.Format("任务[{0}]生成移库时修改需要移库的任务失败.", task.TASK_NO));
  725. }
  726. });
  727. if (!string.IsNullOrWhiteSpace(result))
  728. {
  729. throw new Exception(result);
  730. }
  731. task = SugarBase.DB.Queryable<WCS_TASK>().First(v => v.TASK_WMSNO == moveTask.TASK_WMSNO);
  732. }
  733. else if (moveTaskresult.ResType == 3)
  734. {
  735. if (string.IsNullOrWhiteSpace(moveTaskresult.Memo1.Trim()))
  736. {
  737. throw new Exception(string.Format("调用移库接口报错:堆垛机[{0}]优先执行的入库任务号不能为空。", PlcName));
  738. }
  739. else
  740. {
  741. int task_no = Convert.ToInt16(moveTaskresult.Memo1.Trim());
  742. if (task_no <= 0)
  743. {
  744. throw new Exception(string.Format("调用移库接口报错:堆垛机[{0}]优先执行的入库任务号不能为零。", PlcName));
  745. }
  746. SugarBase.DB.Updateable<WCS_TASK>(it => new WCS_TASK() { TASK_PRIORITY = 10, TASK_EDITDATETIME = DateTime.Now })
  747. .Where(it => it.TASK_NO == task_no)
  748. .ExecuteCommand();
  749. }
  750. }
  751. }
  752. else if (task_DepthOne.TASK_WKSTATUS <= 1)
  753. {
  754. task = task_DepthOne;
  755. }
  756. }
  757. if (task.TASK_COMTYPE == 3)
  758. {
  759. srmSignal.TaskID = task.TASK_NO;
  760. #region 堆垛机取货地址
  761. srmSignal.RowPos1 = task.FromRow;
  762. srmSignal.Travelpos1 = task.FromCol;
  763. srmSignal.Liftpos1 = task.FromLayer;
  764. #endregion;
  765. #region 堆垛机放货地址
  766. srmSignal.RowPos2 = task.ToRow;
  767. srmSignal.Travelpos2 = task.ToCol;
  768. srmSignal.Liftpos2 = task.ToLayer;
  769. #endregion;
  770. startPos = task.TASK_POSIDFROM;
  771. posIdnext = task.TASK_POSIDTO;
  772. }
  773. }
  774. private static bool CheckIsExecuteTask(string cacheAreaName)
  775. {
  776. bool isExecute = false;
  777. var cacheInfoSet = Current.WCS_CacheInfoSet.Where(v => v.Cache_AreaName == cacheAreaName).ToList();
  778. if (cacheInfoSet.Count <= 0)
  779. {
  780. isExecute = true;
  781. }
  782. else
  783. {
  784. int cacheCount = cacheInfoSet.Sum(v => v.Cache_Count);
  785. var tasks = SugarBase.DB.Queryable<WCS_TASK>()
  786. .Where(v => v.TASK_COMTYPE == (int)TaskTypeEnum.TaskType_OutStorage &&
  787. (v.TASK_WKSTATUS > 1 || (v.TASK_WKSTATUS <= 1 && SqlFunc.IsNullOrEmpty(v.TASK_POSIDMOVE) == false)))
  788. .ToList();
  789. int curTaskCount = tasks.Count(v => v.TASK_POSIDTO == cacheAreaName || cacheInfoSet.Any(t => t.Cache_ConvNo == v.TASK_POSIDNEXT || t.Cache_ConvNo == v.TASK_POSIDTO));
  790. if (curTaskCount < cacheCount)
  791. {
  792. int ph_StatusCount = 0;//光电信号数量
  793. foreach (var item in cacheInfoSet)
  794. {
  795. var cv = ConveyorHelper.GetConveyorSignal(item.Cache_PlcName, item.Cache_ConvNo);
  796. if (cv.DB521_Tasknum > 0 || cv.CvDB51_PH_Status)
  797. {
  798. if (tasks.Any(v => v.TASK_NO == cv.DB521_Tasknum) == false)
  799. {
  800. ph_StatusCount++;
  801. }
  802. }
  803. }
  804. if ((curTaskCount + ph_StatusCount) < cacheCount)
  805. {
  806. isExecute = true;
  807. }
  808. }
  809. }
  810. return isExecute;
  811. }
  812. private void WriteTaskToSrm(WCSWriteToSrmSignal srmSignal)
  813. {
  814. List<byte> list = new List<byte>();
  815. list.AddRange(ExtendsUtil.UshortToByte((ushort)srmSignal.Start_number).ToList());
  816. list.AddRange(ExtendsUtil.UshortToByte((ushort)srmSignal.End_number).ToList());
  817. list.AddRange(ExtendsUtil.UshortToByte((ushort)srmSignal.Goodtype).ToList());
  818. list.AddRange(ExtendsUtil.UshortToByte((ushort)srmSignal.Runmode).ToList());
  819. list.AddRange(ExtendsUtil.UshortToByte((ushort)srmSignal.RowPos1).ToList());
  820. list.AddRange(ExtendsUtil.UshortToByte((ushort)srmSignal.Travelpos1).ToList());
  821. list.AddRange(ExtendsUtil.UshortToByte((ushort)srmSignal.Liftpos1).ToList());
  822. list.AddRange(ExtendsUtil.UshortToByte((ushort)srmSignal.Fork_start_pos1).ToList());
  823. list.AddRange(ExtendsUtil.UshortToByte((ushort)srmSignal.RowPos2).ToList());
  824. list.AddRange(ExtendsUtil.UshortToByte((ushort)srmSignal.Travelpos2).ToList());
  825. list.AddRange(ExtendsUtil.UshortToByte((ushort)srmSignal.Liftpos2).ToList());
  826. list.AddRange(ExtendsUtil.UshortToByte((ushort)srmSignal.Fork_dest_pos2).ToList());
  827. list.AddRange(ExtendsUtil.UintToByte((uint)srmSignal.TaskID).ToList());
  828. Log4netHelper.Logger_Info.InfoFormat(string.Format("写入任务[{0}]信息", srmSignal.TaskID));
  829. bool result = WCS_PLCItem.Plc.Write((ushort)WriteDbName, 2, list.ToArray());
  830. if (result)
  831. {
  832. Log4netHelper.Logger_Info.InfoFormat(string.Format("堆垛机[{0}]写入任务[{1}]信息成功", PlcName, srmSignal.TaskID));
  833. }
  834. else
  835. {
  836. throw new Exception(string.Format("堆垛机[{0}]写入任务[{1}]信息失败", PlcName, srmSignal.TaskID));
  837. }
  838. }
  839. private WCS_TASK QueryMoveTask()
  840. {
  841. WCS_TASK task = null;
  842. var movetaskSet = SugarBase.DB.Queryable<WCS_TASK>().Where(v => v.TASK_COMTYPE == (int)ComTypeEnum.移库 && v.TASK_WKSTATUS <= 1 && v.TASK_SRMNO == WCS_PLCItem.PLC_NAME).ToList();
  843. if (movetaskSet.Count > 0) task = movetaskSet[0];
  844. return task;
  845. }
  846. /// <summary>
  847. /// 调整堆垛机出入口顺序
  848. /// </summary>
  849. /// <param name="convNo"></param>
  850. private void SrmConvNoMoveToLast(string convNo)
  851. {
  852. try
  853. {
  854. if (!string.IsNullOrWhiteSpace(convNo))
  855. {
  856. //检测是否是最后一项
  857. if (SrmOutInInfoSet[SrmOutInInfoSet.Count() - 1].SRMOUTIN_CONVNO == convNo) return;
  858. //查询要调整执行顺序的输送线
  859. var outininfo = SrmOutInInfoSet.FirstOrDefault(v => v.SRMOUTIN_CONVNO == convNo);
  860. //删除当前
  861. SrmOutInInfoSet.Remove(outininfo);
  862. //添加到最后
  863. SrmOutInInfoSet.Add(outininfo);
  864. }
  865. }
  866. catch (Exception ex)
  867. {
  868. Log4netHelper.Logger_Info.ErrorFormat(ex.ToString());
  869. }
  870. }
  871. /// <summary>
  872. /// 加载堆垛机刷新数据
  873. /// </summary>
  874. private void Init_Refresh()
  875. {
  876. var srmconvinfoset = Current.WCS_SrmOutInInfoSet.Where(v => v.SRMOUTIN_SRMNO == PlcName && v.SRMOUTIN_ISSTOP == false).OrderBy(p => p.SRMOUTIN_PRIORITY).OrderBy(t => t.SRMOUTIN_SEQUENCE).ToList();
  877. if (SrmOutInInfoSet.Count != srmconvinfoset.Count || //元素个数不相同
  878. srmconvinfoset.Any(v => v.SRMOUTIN_ISUPDATE)) //元素已更新
  879. {
  880. SrmOutInInfoSet = srmconvinfoset;
  881. SugarBase.DB.Updateable<WCS_SrmOutInInfo>(it => new WCS_SrmOutInInfo() { SRMOUTIN_ISUPDATE = false })
  882. .Where(it => it.SRMOUTIN_SRMNO == PlcName)
  883. .ExecuteCommand();
  884. }
  885. }
  886. private int _assignInWareCell = 0;
  887. /// <summary>
  888. /// 分配入库货位
  889. /// </summary>
  890. private void AssignInWareCell()
  891. {
  892. if (Interlocked.Exchange(ref _assignInWareCell, 1) == 0)
  893. {
  894. try
  895. {
  896. var taskSet = SugarBase.DB.Queryable<WCS_TASK>().Where(v => v.TASK_SRMNO == PlcName && v.TASK_WKSTATUS != 5 && v.TASK_WKSTATUS > 1).ToList().OrderByDescending(v => v.TASK_PRIORITY).ToList();
  897. var taskSet_In = taskSet.Where(v => v.TASK_COMTYPE == 1).ToList();
  898. foreach (var task in taskSet_In)
  899. {
  900. if (SrmOutInInfoSet.Any(v => v.SRMOUTIN_CONVNO == task.TASK_POSIDCUR && (v.SRMOUTIN_OUTINTYPE == "in" || v.SRMOUTIN_OUTINTYPE == "outIn")) || task.TASK_POSIDCUR == "1025")
  901. {
  902. if (string.IsNullOrWhiteSpace(task.TASK_POSIDTO) || task.TASK_POSIDTO == PlcName)
  903. {
  904. //入库任务分配货位
  905. GetWareCell(task);
  906. }
  907. }
  908. }
  909. }
  910. catch (Exception ex)
  911. {
  912. LogMessageHelper.RecordLogMessage(string.Format("分配入库货位异常:[{0}]", ex.Message), ex);
  913. }
  914. finally
  915. {
  916. Interlocked.Exchange(ref _assignInWareCell, 0);
  917. }
  918. }
  919. }
  920. public bool GetWareCell(WCS_TASK task)
  921. {
  922. string resultMsg = string.Empty;
  923. //调度接口获取货位
  924. var getWareCell = Current.WmsInterface.I_WCS_GetWareCell(new GetWareCellParam() { WMSTaskNum = task.TASK_WMSNO.ToString(), TunnelNum = task.TASK_EndTunnelNum, PickUpEquipmentNo = task.TASK_POSIDNEXT });
  925. if (getWareCell.ResType)
  926. {
  927. resultMsg = TryCachHelper.TryTranExecute((db) =>
  928. {
  929. //修改任务分配货位
  930. db.Updateable<WCS_TASK>(it => new WCS_TASK() { TASK_WKSTATUS = 2, TASK_POSIDNEXT = getWareCell.CellNo, TASK_POSIDTO = getWareCell.CellNo, TASK_EDITUSERNO = "WCS", TASK_EDITDATETIME = DateTime.Now })
  931. .Where(it => it.TASK_NO == task.TASK_NO)
  932. .ExecuteCommand();
  933. //添加修改明细
  934. string msg = string.Format("任务[{0}]分配货位[{1}]成功。", task.TASK_NO, getWareCell.CellNo);
  935. CommonData.AddWCS_TASK_DTL(db, task.TASK_NO, task.TASK_NO, task.TASK_POSIDCUR, task.TASK_POSIDNEXT, msg);
  936. });
  937. }
  938. else
  939. {
  940. resultMsg = string.Format("任务[{0}]调用接口分配货位[{1}]失败,原因:{2}", task.TASK_NO, getWareCell.CellNo, getWareCell.ResMessage);
  941. LogMessageHelper.RecordLogMessage(resultMsg);
  942. }
  943. if (string.IsNullOrWhiteSpace(resultMsg))
  944. {
  945. task.TASK_POSIDNEXT = getWareCell.CellNo;
  946. task.TASK_POSIDTO = getWareCell.CellNo;
  947. return true;
  948. }
  949. else
  950. {
  951. return false;
  952. }
  953. }
  954. #endregion;
  955. }
  956. }