SRM_Tray.cs 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470
  1. using SqlSugar;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using WCS.Data;
  7. using WCS.Data.Models;
  8. using WCS.PLC;
  9. using WCS.PLC.Model.Equipment;
  10. namespace WCS.Workflow
  11. {
  12. public class SRM_Tray : Base_Srm
  13. {
  14. private string Conv_1508 = "1508";
  15. private string Conv_1509 = "1509";
  16. //private string Conv_1445 = "1445";
  17. //private string Conv_1447 = "1447";
  18. //private string Conv_1449 = "1449";
  19. /// <summary>
  20. /// 涂布车间出口集合
  21. /// </summary>
  22. private List<string> CoatingWorkshopList = new List<string>();
  23. /// <summary>
  24. /// 原膜卷出口集合(二楼)
  25. /// </summary>
  26. private List<string> OriginalFilmRollOutList = new List<string>();
  27. /// <summary>
  28. /// 一楼发货口集合
  29. /// </summary>
  30. private List<string> SendGoodsConvList = new List<string>();
  31. #region Constructor
  32. public SRM_Tray() : base()
  33. {
  34. CoatingWorkshopList.Add("1097");//4#涂布车间
  35. CoatingWorkshopList.Add("1104");//5#涂布车间
  36. CoatingWorkshopList.Add("1107");//6#涂布车间
  37. CoatingWorkshopList.Add("1112");//7#涂布车间
  38. CoatingWorkshopList.Add("1072");//空原膜托盘二坐标位置
  39. OriginalFilmRollOutList.Add("Pvc_4_A");
  40. OriginalFilmRollOutList.Add("Pvc_4_B");
  41. OriginalFilmRollOutList.Add("Pvc_4_C");
  42. OriginalFilmRollOutList.Add("Pvc_5_D");
  43. OriginalFilmRollOutList.Add("Pvc_5_E");
  44. OriginalFilmRollOutList.Add("Pvc_5_F");
  45. OriginalFilmRollOutList.Add("Pvc_6_G");
  46. OriginalFilmRollOutList.Add("Pvc_6_H");
  47. OriginalFilmRollOutList.Add("Pvc_6_J");
  48. OriginalFilmRollOutList.Add("Pvc_7_AA");
  49. OriginalFilmRollOutList.Add("Pvc_7_AB");
  50. OriginalFilmRollOutList.Add("Pvc_7_AK");
  51. OriginalFilmRollOutList.Add("1036");
  52. OriginalFilmRollOutList.Add("1035");
  53. SendGoodsConvList.Add("1445");
  54. SendGoodsConvList.Add("1447");
  55. SendGoodsConvList.Add("1449");
  56. }
  57. #endregion;
  58. protected override WCS_EQUIPMENTROUTE QueryOutEquRouteItem(WCS_TASK task, List<WCS_EQUIPMENTROUTE> routeSet)
  59. {
  60. WCS_EQUIPMENTROUTE routeItem = null;
  61. if (task.TASK_POSIDTO == "Out_Area_A")
  62. {
  63. if (task.FromRow == 1 || task.FromRow == 2)
  64. {
  65. routeItem = routeSet.FirstOrDefault(v => v.ROUTE_SONPOS == "1455");
  66. }
  67. else
  68. {
  69. routeItem = routeSet.FirstOrDefault(v => v.ROUTE_SONPOS == "1454");
  70. }
  71. }
  72. else if (task.TASK_POSIDTO == "1454")
  73. {
  74. routeItem = routeSet.FirstOrDefault(v => v.ROUTE_SONPOS == "1454");
  75. }
  76. else if (task.TASK_POSIDTO == "1455")
  77. {
  78. routeItem = routeSet.FirstOrDefault(v => v.ROUTE_SONPOS == "1455");
  79. }
  80. else if (task.TASK_FromTunnelNum == "1")
  81. {
  82. routeItem = routeSet.FirstOrDefault(v => v.ROUTE_SONPOS == "1036");
  83. }
  84. else if (task.TASK_FromTunnelNum == "2")
  85. {
  86. routeItem = routeSet.FirstOrDefault(v => v.ROUTE_SONPOS == "1035");
  87. }
  88. else
  89. {
  90. routeItem = base.QueryOutEquRouteItem(task, routeSet);
  91. }
  92. return routeItem;
  93. }
  94. protected override bool CheckAreaOutAddress(WCS_TASK task, WCS_EQUIPMENTROUTE route)
  95. {
  96. bool result = true;
  97. if (task.TASK_POSIDTO == "Out_Area_A")
  98. {
  99. if (task.FromRow == 1 || task.FromRow == 2)
  100. {
  101. if (route.ROUTE_SONPOS == "1454")
  102. {
  103. result = false;
  104. //var cv = ConveyorHelper.GetConveyorSignal("conveyor01", "1455");
  105. //if (cv.DB521_Request == false && cv.DB521_Tasknum == 0 && cv.CvDB51_PH_Status == false)
  106. //{
  107. // result = false;
  108. //}
  109. }
  110. }
  111. else
  112. {
  113. if (route.ROUTE_SONPOS == "1455")
  114. {
  115. var cv = ConveyorHelper.GetConveyorSignal("conveyor01", "1454");
  116. if (cv.DB521_Request == false && cv.DB521_Tasknum == 0 && cv.CvDB51_PH_Status == false)
  117. {
  118. result = false;
  119. }
  120. }
  121. }
  122. }
  123. if (route.ROUTE_SONPOS == "1036")
  124. {
  125. if (task.TASK_FromTunnelNum != "1")
  126. {
  127. result = false;
  128. }
  129. }
  130. else if (route.ROUTE_SONPOS == "1035")
  131. {
  132. if (task.TASK_FromTunnelNum != "2")
  133. {
  134. result = false;
  135. }
  136. }
  137. return result;
  138. }
  139. protected override WCS_TASK QueryInConvTask(WCS_SrmOutInInfo outininfo, WCS_TASK tasks)
  140. {
  141. var wcstask = SugarBase.DB.Queryable<WCS_TASK>().First(v => v.TASK_COMTYPE == 2 &&
  142. v.TASK_SRMNO == PlcName &&
  143. v.TASK_WKSTATUS <= 1 &&
  144. !SqlFunc.IsNullOrEmpty(v.TASK_POSIDMOVE));
  145. if (wcstask == null)
  146. {
  147. return base.QueryInConvTask(outininfo, tasks);
  148. }
  149. else
  150. {
  151. return null;
  152. }
  153. }
  154. protected override WCS_TASK QueryOutTask(SqlSugarClient db, List<WCS_TASK> taskSet)
  155. {
  156. WCS_TASK taskitem = null;
  157. List<WCS_TASK> taskList = new List<WCS_TASK>();
  158. if (PlcName == "srm01")
  159. {
  160. var lastTask = SugarBase.DB.Queryable<WCS_TASK>().Where(v => v.TASK_SRMNO == PlcName && v.TASK_WKSTATUS <= 1 && v.TASK_COMTYPE == 2 && (OriginalFilmRollOutList.Contains(v.TASK_POSIDTO))).OrderBy(v => v.TASK_ADDDATETIME).First();
  161. //var lastTask = taskSet.OrderBy(v => v.TASK_ADDDATETIME).FirstOrDefault();
  162. if (lastTask != null)
  163. {
  164. if (lastTask.TASK_ADDDATETIME.AddMinutes(60) < db.GetDate())//1小时未动作
  165. {
  166. //查询到2条任务
  167. var temptasks = SugarBase.DB.Queryable<WCS_TASK>().Where(v => v.TASK_ITEM8 == lastTask.TASK_ITEM8 && v.TASK_WKSTATUS <= 1 && v.TASK_COMTYPE == 2 && v.TASK_SRMNO == PlcName).ToList();
  168. //查询当前巷道任务
  169. var curTunnelSet = temptasks.Where(v => taskSet.Any(t => t.TASK_NO == v.TASK_NO));
  170. if (curTunnelSet.Count() > 0)
  171. {
  172. taskList.AddRange(curTunnelSet);
  173. }
  174. //查询非当前巷道任务
  175. var noCurTunnelSet = temptasks.Where(v => !taskSet.Any(t => t.TASK_NO == v.TASK_NO));
  176. if (noCurTunnelSet.Count() > 0)
  177. {
  178. taskList.AddRange(noCurTunnelSet);
  179. }
  180. //taskList.AddRange(temptasks);
  181. }
  182. }
  183. var taskgroup_1 = taskSet.Where(v => v.TASK_FromTunnelNum == "1").OrderBy(v => v.TASK_ADDDATETIME)
  184. .GroupBy(v => v.TASK_ITEM8)
  185. .Select(g => new { agvId = g.Key, count = g.Count() }).OrderByDescending(v => v.count);
  186. var taskgroup_2 = taskSet.Where(v => v.TASK_FromTunnelNum == "2").OrderBy(v => v.TASK_ADDDATETIME)
  187. .GroupBy(v => v.TASK_ITEM8)
  188. .Select(g => new { agvId = g.Key, count = g.Count() }).OrderByDescending(v => v.count);
  189. if (EquSignal.DB521_ToRowPos == 1 || EquSignal.DB521_ToRowPos == 2)
  190. {
  191. //添加1巷道分组排序任务
  192. foreach (var item in taskgroup_1)
  193. {
  194. if (!taskList.Any(v => v.TASK_ITEM8 == item.agvId))
  195. {
  196. taskList.AddRange(taskSet.Where(v => v.TASK_ITEM8 == item.agvId));
  197. }
  198. }
  199. //添加2巷道分组排序任务
  200. foreach (var item in taskgroup_2)
  201. {
  202. if (!taskList.Any(v => v.TASK_ITEM8 == item.agvId))
  203. {
  204. taskList.AddRange(taskSet.Where(v => v.TASK_ITEM8 == item.agvId));
  205. }
  206. }
  207. }
  208. else
  209. {
  210. //添加2巷道分组排序任务
  211. foreach (var item in taskgroup_2)
  212. {
  213. if (!taskList.Any(v => v.TASK_ITEM8 == item.agvId))
  214. {
  215. taskList.AddRange(taskSet.Where(v => v.TASK_ITEM8 == item.agvId));
  216. }
  217. }
  218. //添加1巷道分组排序任务
  219. foreach (var item in taskgroup_1)
  220. {
  221. if (!taskList.Any(v => v.TASK_ITEM8 == item.agvId))
  222. {
  223. taskList.AddRange(taskSet.Where(v => v.TASK_ITEM8 == item.agvId));
  224. }
  225. }
  226. }
  227. }
  228. else
  229. {
  230. taskList = taskSet;
  231. }
  232. foreach (var task in taskList)
  233. {
  234. if (task.TASK_POSIDTO == Conv_1508)
  235. {
  236. if (!SugarBase.DB.Queryable<WCS_TASK>().Any(v => v.TASK_POSIDTO == Conv_1508 && (v.TASK_WKSTATUS == 2 || v.TASK_WKSTATUS == 7 || v.TASK_WKSTATUS == 9)))
  237. {
  238. taskitem = task;
  239. break;
  240. }
  241. }
  242. else if (task.TASK_POSIDTO == Conv_1509)
  243. {
  244. if (!SugarBase.DB.Queryable<WCS_TASK>().Any(v => v.TASK_POSIDTO == Conv_1509 && (v.TASK_WKSTATUS == 2 || v.TASK_WKSTATUS == 7 || v.TASK_WKSTATUS == 9)))
  245. {
  246. taskitem = task;
  247. break;
  248. }
  249. }
  250. if (CoatingWorkshopList.Contains(task.TASK_POSIDTO) && (PlcName == "srm05" || PlcName == "srm04"))
  251. {
  252. //string taryType = string.IsNullOrWhiteSpace(task.TASK_ITEM2) ? string.Empty : task.TASK_ITEM2.Trim();
  253. //string isEmpty = string.IsNullOrWhiteSpace(task.TASK_ITEM3) ? string.Empty : task.TASK_ITEM3.Trim();
  254. if (task.TASK_POSIDTO == "1072")
  255. {
  256. //检查缓存数量
  257. var count = SugarBase.DB.Queryable<WCS_TASK>().Where(v => v.TASK_WKSTATUS > 1 && v.TASK_POSIDTO == "1072").Count();
  258. if (count < 2)
  259. {
  260. taskitem = task;
  261. break;
  262. }
  263. }
  264. else
  265. {
  266. //检查缓存数量
  267. var count = SugarBase.DB.Queryable<WCS_TASK>().Where(v => v.TASK_WKSTATUS == 2 && (v.TASK_POSIDNEXT == "1085")).Count();
  268. if (count < 10)
  269. {
  270. taskitem = task;
  271. break;
  272. }
  273. }
  274. }
  275. else if (SendGoodsConvList.Contains(task.TASK_POSIDTO))
  276. {
  277. int taskcount = QueryOutConvTaskCount(task.TASK_POSIDTO);
  278. if (taskcount < 2)
  279. {
  280. taskitem = task;
  281. break;
  282. }
  283. }
  284. else if (OriginalFilmRollOutList.Contains(task.TASK_POSIDTO) && PlcName == "srm01")
  285. {
  286. if (SugarBase.DB.Queryable<WCS_TASK>().Any(v => v.TASK_POSIDNEXT == "1035" || v.TASK_POSIDNEXT == "1036"))
  287. {
  288. break;
  289. }
  290. var originalTrayTasks = SugarBase.DB.Queryable<WCS_TASK>().Where(v => v.TASK_WKSTATUS == 2 && v.TASK_POSIDNEXT == "1072").ToList();
  291. //检查是否已组盘一个卷,未组盘第二卷
  292. var originalTrayTask = originalTrayTasks.FirstOrDefault(v => string.IsNullOrWhiteSpace(v.TASK_ITEM6));
  293. if (originalTrayTask != null)//已组盘第一个
  294. {
  295. if (task.TASK_ITEM1.Trim() == originalTrayTask.TASK_ITEM1.Trim())
  296. {
  297. taskitem = task;
  298. break;
  299. }
  300. if (SugarBase.DB.Queryable<WCS_TASK>().Any(v => v.TASK_WKSTATUS == 2 && (v.TASK_POSIDNEXT == "1036" || v.TASK_POSIDNEXT == "1035" || v.TASK_POSIDNEXT == "1070") && v.TASK_ITEM1 == originalTrayTask.TASK_ITEM1))
  301. {
  302. if (CheckOutTask(task))
  303. {
  304. taskitem = task;
  305. break;
  306. }
  307. }
  308. //if (task.TASK_ITEM1.Trim() == originalTrayTask.TASK_ITEM1.Trim() ||
  309. // SugarBase.DB.Queryable<WCS_TASK>().Any(v => v.TASK_WKSTATUS == 2 && (v.TASK_POSIDNEXT == "1036" || v.TASK_POSIDNEXT == "1035" || v.TASK_POSIDNEXT == "1070") && v.TASK_ITEM1 == originalTrayTask.TASK_ITEM1))
  310. //{
  311. // taskitem = task;
  312. // break;
  313. //}
  314. }
  315. else
  316. {
  317. //查询已出库的原膜卷任务
  318. var originalTask = SugarBase.DB.Queryable<WCS_TASK>().Single(v => v.TASK_POSIDNEXT == "1036" || v.TASK_POSIDNEXT == "1035" || v.TASK_POSIDNEXT == "1070");
  319. if (originalTask == null)//二楼没有出库待组盘的原膜卷
  320. {
  321. if (CheckOutTask(task))
  322. {
  323. taskitem = task;
  324. break;
  325. }
  326. }
  327. else if (originalTask.TASK_ITEM1.Trim() == task.TASK_ITEM1.Trim())
  328. {
  329. //二楼已经出库一个待组盘的原膜卷
  330. taskitem = task;
  331. break;
  332. }
  333. else if (SugarBase.DB.Queryable<WCS_TASK>().Count(v => v.TASK_WKSTATUS <= 1 && v.TASK_SRMNO == "srm01" && v.TASK_ITEM1 == originalTask.TASK_ITEM1) == 0)//二楼出库的原膜卷是单卷
  334. {
  335. if (CheckOutTask(task))
  336. {
  337. taskitem = task;
  338. break;
  339. }
  340. }
  341. ////查询已出库的原膜卷任务
  342. //var originalTask = SugarBase.DB.Queryable<WCS_TASK>().Single(v => v.TASK_POSIDNEXT == "1036" || v.TASK_POSIDNEXT == "1035" || v.TASK_POSIDNEXT == "1070");
  343. //if (originalTask == null || //二楼没有出库待组盘的原膜卷
  344. // originalTask.TASK_ITEM1.Trim() == task.TASK_ITEM1.Trim() || //二楼已经出库一个待组盘的原膜卷
  345. // SugarBase.DB.Queryable<WCS_TASK>().Count(v => v.TASK_WKSTATUS <= 1 && v.TASK_SRMNO == "srm01" && v.TASK_ITEM1 == originalTask.TASK_ITEM1) == 0)//二楼出库的原膜卷是单卷
  346. //{
  347. // taskitem = task;
  348. // break;
  349. //}
  350. }
  351. }
  352. else if (task.TASK_POSIDTO.Contains("Pvc_18"))
  353. {
  354. int count = SugarBase.DB.Queryable<WCS_TASK>().Count(v => v.TASK_WKSTATUS > 1 && v.TASK_POSIDTO.Contains("Pvc_18"));
  355. if (count < 9)
  356. {
  357. taskitem = task;
  358. break;
  359. }
  360. }
  361. else
  362. {
  363. taskitem = task;
  364. break;
  365. }
  366. }
  367. var wcstask = SugarBase.DB.Queryable<WCS_TASK>().First(v => v.TASK_COMTYPE == 2 &&
  368. v.TASK_SRMNO == PlcName &&
  369. v.TASK_WKSTATUS <= 1 &&
  370. !SqlFunc.IsNullOrEmpty(v.TASK_POSIDMOVE));
  371. if (wcstask != null)
  372. {
  373. taskitem = wcstask;
  374. }
  375. return taskitem;
  376. }
  377. private int QueryOutConvTaskCount(string conv)
  378. {
  379. int taskcount = 0;
  380. var cv = ConveyorHelper.GetConveyorSignal("conveyor01", conv);
  381. if (cv.DB521_Tasknum > 0) taskcount++;
  382. int count = SugarBase.DB.Queryable<WCS_TASK>().Count(v => v.TASK_POSIDTO == conv && v.TASK_POSIDCUR != conv && v.TASK_WKSTATUS > 1 && v.TASK_WKSTATUS < 99);
  383. taskcount = taskcount + count;
  384. return taskcount;
  385. }
  386. private bool CheckOutTask(WCS_TASK task)
  387. {
  388. string srm01 = "srm01";
  389. bool isOk = false;
  390. string tunnelNum = string.Empty;
  391. var inTask = SugarBase.DB.Queryable<WCS_TASK>().First(v => v.TASK_SRMNO == srm01 && v.TASK_COMTYPE == 1 && v.TASK_WKSTATUS == 2);
  392. if (inTask == null)
  393. {
  394. if (EquSignal.DB521_ToRowPos == 1 || EquSignal.DB521_ToRowPos == 2)
  395. {
  396. tunnelNum = "1";
  397. }
  398. else
  399. {
  400. tunnelNum = "2";
  401. }
  402. }
  403. else
  404. {
  405. tunnelNum = inTask.TASK_EndTunnelNum;
  406. }
  407. if (tunnelNum == "1")
  408. {
  409. if (task.TASK_FromTunnelNum == "1")
  410. {
  411. isOk = true;
  412. }
  413. else
  414. {
  415. //没有1号巷道的未执行出库任务
  416. if (!SugarBase.DB.Queryable<WCS_TASK>().Any(v => v.TASK_SRMNO == srm01 &&
  417. v.TASK_COMTYPE == 2 &&
  418. v.TASK_WKSTATUS <= 1 &&
  419. v.TASK_FromTunnelNum == "1" &&
  420. v.TASK_POSIDTO == "1036"))
  421. {
  422. isOk = true;
  423. }
  424. }
  425. }
  426. else
  427. {
  428. if (task.TASK_FromTunnelNum == "2")
  429. {
  430. isOk = true;
  431. }
  432. else
  433. {
  434. //没有2号巷道的未执行出库任务
  435. if (!SugarBase.DB.Queryable<WCS_TASK>().Any(v => v.TASK_SRMNO == srm01 &&
  436. v.TASK_COMTYPE == 2 &&
  437. v.TASK_WKSTATUS <= 1 &&
  438. v.TASK_FromTunnelNum == "2" &&
  439. v.TASK_POSIDTO == "1035"))
  440. {
  441. isOk = true;
  442. }
  443. }
  444. }
  445. return isOk;
  446. }
  447. }
  448. }