BaseWorkflow.cs 60 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243
  1. using SqlSugar;
  2. using System;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. using System.Linq;
  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. using static WCS.PLC.Base_Conv;
  12. using static WCS.WMSWorkflow.ApiParam;
  13. namespace WCS.PLC
  14. {
  15. public class BaseWorkflow
  16. {
  17. private static int _putTaskStep = 0;
  18. #region private Method
  19. public static void MoveTaskToDis(WCS_TASK task)
  20. {
  21. TryCachHelper.TryTranExecute((db) =>
  22. {
  23. //添加机械手码垛位置条码信息
  24. var sysset = Current.SysSets.SingleOrDefault(v => v.SET_TYPE == "PalletizingPos" && v.SET_ID == task.TASK_POSIDTO && task.TASK_POSIDFROM != "1390");
  25. if (sysset != null)
  26. {
  27. string time = DateTime.Now.ToString("yyyyMMddhhmmss");
  28. db.Updateable<WCS_SYSSET>(it => new WCS_SYSSET()
  29. {
  30. SET_MEMO = task.TASK_BOXBARCODE,
  31. SET_EDITUSERNO = "wcs",
  32. SET_EDITTIME = time
  33. })
  34. .Where(it => it.SET_ID == sysset.SET_ID).ExecuteCommand();
  35. }
  36. //移动任务到历史列表
  37. var task_dis = ExtendsUtil.Mapper<WCS_TASK_DIS, WCS_TASK>(task);
  38. task_dis.TASK_DELETEUSER = "wcs";
  39. task_dis.TASK_DELETEDATE = db.GetDate();
  40. if (db.Insertable(task_dis).ExecuteCommand() <= 0)
  41. {
  42. throw new Exception(string.Format("任务[{0}]插入历史列表失败", task_dis.TASK_NO));
  43. }
  44. var taskdtlSet = db.Queryable<WCS_TASK_DTL>().Where(v => v.PARENTID == task.TASK_NO).ToList();
  45. foreach (var taskdtl in taskdtlSet)
  46. {
  47. var task_dis_dtl = ExtendsUtil.Mapper<WCS_TASK_DIS_DTL, WCS_TASK_DTL>(taskdtl);
  48. if (db.Insertable(task_dis_dtl).ExecuteCommand() <= 0)
  49. {
  50. throw new Exception(string.Format("任务[{0}]明细插入到历史列表失败", task_dis.TASK_NO));
  51. }
  52. if (db.Deleteable(taskdtl).ExecuteCommand() <= 0)
  53. {
  54. throw new Exception(string.Format("任务[{0}]明细删除失败", task_dis.TASK_NO));
  55. }
  56. }
  57. //删除当前任务
  58. if (db.Deleteable(task).ExecuteCommand() <= 0)
  59. {
  60. throw new Exception(string.Format("任务[{0}]删除失败", task_dis.TASK_NO));
  61. }
  62. });
  63. }
  64. public static void MoveAgvTaskToDis(Middle_AGVTask task)
  65. {
  66. TryCachHelper.TryTranExecute((db) =>
  67. {
  68. //移动任务到历史列表
  69. var task_dis = ExtendsUtil.Mapper<Middle_AGVTask_Dis, Middle_AGVTask>(task);
  70. task_dis.Task_FinishDate = db.GetDate();
  71. if (db.Insertable(task_dis).ExecuteCommand() <= 0)
  72. {
  73. throw new Exception(string.Format("任务[{0}]插入历史列表失败", task_dis.Task_Id));
  74. }
  75. //删除当前任务
  76. if (db.Deleteable(task).ExecuteCommand() <= 0)
  77. {
  78. throw new Exception(string.Format("任务[{0}]删除失败", task_dis.Task_Id));
  79. }
  80. });
  81. }
  82. #endregion private Method
  83. #region public Method
  84. /// <summary>
  85. /// 更新任务进程
  86. /// </summary>
  87. public static void PutTaskStep()
  88. {
  89. if (Interlocked.Exchange(ref _putTaskStep, 1) == 0)
  90. {
  91. try
  92. {
  93. var tasks = SugarBase.DB.Queryable<WCS_TASK>().Where(v => v.TASK_WKSTATUS >= 1).ToList();
  94. var agvtasks = Current.AgvTaskSet.Where(v => v.Task_WcsStatus == 106 || v.Task_WcsStatus == 99 || v.Task_WcsStatus == 4).ToList();
  95. if (tasks.Count == 0 && agvtasks.Count == 0) return;
  96. var tasks_NoFinish = tasks.Where(v => v.TASK_WKSTATUS < 99 && v.TASK_COMTYPE != 6 && (v.TASK_POSIDTO != "1288") && (v.TASK_POSIDTO != "1293")).ToList();
  97. if (tasks_NoFinish.Count > 0)
  98. {
  99. var PutTaskStepList = Current.WmsInterface.I_WCS_PutTaskStep(tasks_NoFinish);
  100. foreach (var item in PutTaskStepList)
  101. {
  102. var task = tasks.FirstOrDefault(v => v.TASK_WMSNO == item.WMSTaskNum);
  103. if (!item.ResType)
  104. {
  105. string msg = string.Format("任务[{0}]更新进程失败,原因:[{1}]", task.TASK_NO, item.ResMessage);
  106. LogMessageHelper.RecordLogMessage(msg);
  107. }
  108. }
  109. }
  110. var tasks_Finish = tasks.Where(v => v.TASK_WKSTATUS >= 99 && (v.TASK_POSIDTO != "1508") && (v.TASK_POSIDTO != "1509") && (v.TASK_POSIDTO != "1288") && (v.TASK_POSIDTO != "1293")).ToList();
  111. if (tasks_Finish.Count > 0)
  112. {
  113. var PutTaskStepList_finish = Current.WmsInterface.I_WCS_PutTaskStep(tasks_Finish);
  114. foreach (var item in PutTaskStepList_finish)
  115. {
  116. var task = tasks.FirstOrDefault(v => v.TASK_WMSNO == item.WMSTaskNum);
  117. if (item.ResType)
  118. {
  119. if (task.TASK_WKSTATUS >= 99)
  120. {
  121. MoveTaskToDis(task);
  122. }
  123. }
  124. else
  125. {
  126. string msg = string.Format("任务[{0}]更新进程失败,原因:[{1}]", task.TASK_NO, item.ResMessage);
  127. LogMessageHelper.RecordLogMessage(msg);
  128. }
  129. }
  130. }
  131. var task_Finish2 = tasks.FirstOrDefault(v => v.TASK_WKSTATUS >= 99 && v.TASK_POSIDTO == "1508");
  132. if (task_Finish2 != null)
  133. {
  134. var tasks_Finishs = new List<WCS_TASK>();
  135. tasks_Finishs.Add(task_Finish2);
  136. var PutTaskStepList_finish = Current.WmsInterface.I_WCS_PutTaskStep(tasks_Finishs);
  137. foreach (var item in PutTaskStepList_finish)
  138. {
  139. var task = tasks.FirstOrDefault(v => v.TASK_WMSNO == item.WMSTaskNum);
  140. if (item.ResType)
  141. {
  142. if (task.TASK_WKSTATUS >= 99)
  143. {
  144. if (Current.TaskSet.Any(v => v.TASK_BOXBARCODE == task_Finish2.TASK_BOXBARCODE && v.TASK_COMTYPE == 1))
  145. {
  146. MoveTaskToDis(task);
  147. }
  148. }
  149. }
  150. else
  151. {
  152. string msg = string.Format("任务[{0}]更新进程失败,原因:[{1}]", task.TASK_NO, item.ResMessage);
  153. LogMessageHelper.RecordLogMessage(msg);
  154. }
  155. }
  156. }
  157. var task_Finish3 = tasks.FirstOrDefault(v => v.TASK_WKSTATUS >= 99 && v.TASK_POSIDTO == "1509");
  158. if (task_Finish3 != null)
  159. {
  160. var tasks_F = new List<WCS_TASK>();
  161. tasks_F.Add(task_Finish3);
  162. var PutTaskStepList_finish = Current.WmsInterface.I_WCS_PutTaskStep(tasks_F);
  163. foreach (var item in PutTaskStepList_finish)
  164. {
  165. var task = tasks.FirstOrDefault(v => v.TASK_WMSNO == item.WMSTaskNum);
  166. if (item.ResType)
  167. {
  168. if (task.TASK_WKSTATUS >= 99)
  169. {
  170. if (Current.TaskSet.Any(v => v.TASK_BOXBARCODE == task_Finish3.TASK_BOXBARCODE && v.TASK_COMTYPE == 1))
  171. {
  172. MoveTaskToDis(task);
  173. }
  174. }
  175. }
  176. else
  177. {
  178. string msg = string.Format("任务[{0}]更新进程失败,原因:[{1}]", task.TASK_NO, item.ResMessage);
  179. LogMessageHelper.RecordLogMessage(msg);
  180. }
  181. }
  182. }
  183. var tasks_Exception = tasks.Where(v => v.TASK_WKSTATUS >= 99 && (v.TASK_COMTYPE == 6 || v.TASK_POSIDTO == "1288" || v.TASK_POSIDTO == "1293")).ToList();
  184. foreach (var item in tasks_Exception)
  185. {
  186. MoveTaskToDis(item);
  187. }
  188. foreach (var item in agvtasks)
  189. {
  190. if (item.Task_WcsStatus == 99 || item.Task_WcsStatus == 4)
  191. {
  192. //if (item.Task_Type == 3 || (item.Task_Type == 1 && (item.Task_WorkshopNo == "18" || item.Task_WorkshopNo == "4" || item.Task_WorkshopNo == "5")))
  193. if (item.Task_Type == 3 || (item.Task_Type == 1 && item.Task_WorkshopNo == "18"))
  194. {
  195. var wcstask = Current.TaskSet.SingleOrDefault(v => v.TASK_ITEM8 == item.Task_Id.ToString());
  196. if (wcstask == null || wcstask.TASK_WKSTATUS >= 99)
  197. {
  198. if (item.Task_WcsStatus == 99) MoveAgvTaskToDis(item);//任务完成
  199. continue;
  200. }
  201. wcstask.TASK_WKSTATUS = 99;
  202. wcstask.TASK_EDITUSERNO = "wcs";
  203. wcstask.TASK_EDITDATETIME = DateTime.Now;
  204. int updateresult = SugarBase.DB.Updateable(wcstask)
  205. .UpdateColumns(it => new { it.TASK_WKSTATUS, it.TASK_EDITUSERNO, it.TASK_EDITDATETIME })
  206. .ExecuteCommand();
  207. if (updateresult <= 0)
  208. {
  209. LogMessageHelper.RecordLogMessage(string.Format("空熟化架呼叫AGV任务[{0}]已完成,完成WCS任务[{1}]失败。", item.Task_Id, wcstask.TASK_NO));
  210. continue;
  211. }
  212. else
  213. {
  214. if (item.Task_WcsStatus == 99) MoveAgvTaskToDis(item);//任务完成
  215. }
  216. }
  217. else if (item.Task_Type == 1 || item.Task_Type == 2 || item.Task_Type == 4)
  218. {
  219. if (item.Task_WcsStatus == 99) MoveAgvTaskToDis(item);//任务完成
  220. }
  221. }
  222. else if (item.Task_WcsStatus == 106 && item.Task_AgvStatus == 106)
  223. {
  224. MoveAgvTaskToDis(item);//任务完成
  225. }
  226. }
  227. }
  228. catch (Exception ex)
  229. {
  230. LogMessageHelper.RecordLogMessage(ex);
  231. }
  232. finally
  233. {
  234. Interlocked.Exchange(ref _putTaskStep, 0);
  235. }
  236. }
  237. }
  238. public static WCS_TASK GetInTask(GetInTaskParam param)
  239. {
  240. WCS_TASK wcstask = null;
  241. try
  242. {
  243. wcstask = SugarBase.DB.Queryable<WCS_TASK>().First(v => v.TASK_BOXBARCODE == param.ContainerBarCode);
  244. if (wcstask == null)
  245. {
  246. var reply = Current.WmsInterface.I_WCS_GetInTask(param);
  247. string errormsg = CheckGetInTask(param, reply);
  248. if (string.IsNullOrWhiteSpace(errormsg))
  249. {
  250. //添加wcs任务
  251. wcstask = new WCS_TASK();
  252. wcstask.TASK_WMSNO = reply.WMSTaskNum;
  253. wcstask.TASK_COMTYPE = reply.TaskType;
  254. wcstask.TASK_SYSTYPE = "WMS";
  255. wcstask.TASK_POSIDFROM = param.EquipmentNo;//起点地址
  256. wcstask.TASK_POSIDCUR = param.EquipmentNo;
  257. wcstask.TASK_POSIDNEXT = param.EquipmentNo;
  258. wcstask.TASK_POSIDMOVE = "";
  259. wcstask.TASK_PRIORITY = reply.Priority;
  260. wcstask.TASK_WKSTATUS = 0;
  261. wcstask.TASK_WHID = reply.WareHouseName;
  262. wcstask.TASK_ADDUSERNO = "WMS";
  263. wcstask.TASK_ADDDATETIME = DateTime.Now;
  264. wcstask.TASK_EDITUSERNO = "WMS";
  265. wcstask.TASK_EDITDATETIME = DateTime.Now;
  266. wcstask.TASK_NOTES = "";
  267. wcstask.TASK_RGVNO = "";
  268. wcstask.TASK_BOXBARCODE = param.ContainerBarCode;
  269. wcstask.TASK_WEIGHT = reply.TASK_WEIGHT;
  270. wcstask.TASK_STACKINGTYPE = reply.TASK_STACKINGTYPE;
  271. if (!string.IsNullOrWhiteSpace(reply.Memo1))
  272. {
  273. wcstask.TASK_IsWrapFilm = reply.Memo1.Trim() == "1" ? true : false;
  274. }
  275. if (string.IsNullOrWhiteSpace(param.Memo1))
  276. {
  277. wcstask.TASK_POSIDTO = reply.EndPostion;
  278. wcstask.TASK_SRMNO = reply.EndPostion;
  279. wcstask.PalletizingBoxSize = reply.PalletizingBoxSize;
  280. wcstask.TASK_ORDERTYPE = reply.IsLastBox ? 1 : 0;
  281. }
  282. else if (param.Memo1.Trim() == "1")
  283. {
  284. string srmno = string.Empty;
  285. wcstask.TASK_EndTunnelNum = ConveyorHelper.QueryTunnel(wcstask.TASK_WMSNO, reply.TunnelNum, out srmno);
  286. wcstask.TASK_POSIDTO = srmno;
  287. wcstask.TASK_SRMNO = srmno;
  288. }
  289. else if (param.Memo1.Trim() == "2")
  290. {
  291. wcstask.TASK_POSIDTO = reply.EndPostion;
  292. wcstask.TASK_EndTunnelNum = reply.TunnelNum;
  293. wcstask.TASK_SRMNO = Current.SysSets.Where(v => v.SET_ID.Contains("Tunnel")).FirstOrDefault(v => v.SET_VALUE == reply.TunnelNum).SET_VALUE;
  294. }
  295. else
  296. {
  297. throw new Exception(string.Format("托盘[{0}]调用WMS入库接口传递参数Memo1错误.", param.ContainerBarCode));
  298. }
  299. if (param.EquipmentNo == "1109" || param.EquipmentNo == "1114" || param.EquipmentNo == "1102" || param.EquipmentNo == "1094")
  300. {
  301. wcstask.TASK_MatureType = reply.TASK_MatureType;
  302. wcstask.TASK_MatureTemperat = reply.TASK_MatureTemperat;
  303. wcstask.TASK_MatureDate = reply.TASK_MatureDate;
  304. }
  305. int id = SugarBase.DB.Insertable(wcstask).ExecuteReturnIdentity();
  306. if (id <= 0)
  307. {
  308. throw new Exception(string.Format("WMS任务[{0}]添加WCS任务失败", reply.WMSTaskNum));
  309. }
  310. else
  311. {
  312. wcstask.TASK_NO = id;
  313. }
  314. }
  315. else
  316. {
  317. LogMessageHelper.RecordLogMessage(errormsg);
  318. AddLedErrorMsg(param.EquipmentNo, errormsg, 0);
  319. if (!string.IsNullOrWhiteSpace(param.Memo2))
  320. {
  321. //wms任务异常需要生成退回托盘任务
  322. wcstask = new WCS_TASK()
  323. {
  324. TASK_WMSNO = "wcs_" + DateTime.Now.ToString("yyyyMMddhhmmss"),
  325. TASK_COMTYPE = (int)ComTypeEnum.托盘异常退回,
  326. TASK_SYSTYPE = "WCS",
  327. TASK_POSIDFROM = param.EquipmentNo,//起点地址
  328. TASK_POSIDCUR = param.EquipmentNo,
  329. TASK_POSIDNEXT = param.EquipmentNo,
  330. TASK_POSIDMOVE = "",
  331. TASK_PRIORITY = 1,
  332. TASK_WKSTATUS = 1,
  333. TASK_WHID = string.IsNullOrWhiteSpace(reply.WareHouseName) ? Current.WareNameList[0] : reply.WareHouseName,
  334. TASK_ADDUSERNO = "WCS",
  335. TASK_ADDDATETIME = DateTime.Now,
  336. TASK_EDITUSERNO = "WCS",
  337. TASK_EDITDATETIME = DateTime.Now,
  338. TASK_NOTES = "",
  339. TASK_RGVNO = "",
  340. TASK_BOXBARCODE = param.ContainerBarCode,
  341. TASK_POSIDTO = param.Memo2.Trim()
  342. };
  343. int id = SugarBase.DB.Insertable(wcstask).ExecuteReturnIdentity();
  344. if (id <= 0)
  345. {
  346. throw new Exception(string.Format("WMS任务[{0}]添加WCS任务失败", reply.WMSTaskNum));
  347. }
  348. else
  349. {
  350. wcstask.TASK_NO = id;
  351. }
  352. var task_dtl = new WCS_TASK_DTL()
  353. {
  354. ID = Guid.NewGuid().ToString(),
  355. PARENTID = wcstask.TASK_NO,
  356. TASKNO = wcstask.TASK_NO,
  357. POSIDCUR = param.EquipmentNo,
  358. POSIDNEXT = param.EquipmentNo,
  359. DESCRIPTION = errormsg,
  360. EXECUTEDATE = DateTime.Now
  361. };
  362. SugarBase.DB.Insertable(task_dtl).ExecuteReturnIdentity();
  363. }
  364. }
  365. }
  366. }
  367. catch (Exception ex)
  368. {
  369. LogMessageHelper.RecordLogMessage(ex);
  370. }
  371. return wcstask;
  372. }
  373. public static bool WCS_GetOutTask(GetOutTaskParam param)
  374. {
  375. bool result = false;
  376. WCS_TASK wcstask = null;
  377. try
  378. {
  379. var reply = Current.WmsInterface.I_WCS_GetOutTask(param);
  380. if (reply.ResType)
  381. {
  382. if (!string.IsNullOrWhiteSpace(param.Memo1))
  383. {
  384. if (param.Memo1.Trim() == "1")
  385. {
  386. var agvtask = Current.AgvTaskSet.FirstOrDefault(v => v.Task_Id.ToString() == param.OutId);
  387. if (agvtask != null)
  388. {
  389. DateTime dt = SugarBase.DB.GetDate();
  390. int task_id = Convert.ToInt32(param.OutId);
  391. SugarBase.DB.Updateable<Middle_AGVTask>(it => new Middle_AGVTask()
  392. {
  393. Task_WcsStatus = 5,
  394. Task_UpdateUser = "wcs",
  395. Task_UpdateDate = dt
  396. })
  397. .Where(it => it.Task_Id == task_id).ExecuteCommand();
  398. }
  399. result = true;
  400. return result;
  401. }
  402. }
  403. if (string.IsNullOrWhiteSpace(reply.WMSTaskNum))
  404. {
  405. throw new Exception(string.Format("工位[{0}]申请出库任务反馈WMS任务号不能为空。", param.OutEndPostion));
  406. }
  407. if (reply.TaskType <= 0)
  408. {
  409. throw new Exception(string.Format("工位[{0}]申请出库任务反馈任务类型必须大于零。", param.OutEndPostion));
  410. }
  411. if (string.IsNullOrWhiteSpace(reply.OutWareCellNo))
  412. {
  413. throw new Exception(string.Format("工位[{0}]申请出库任务反馈出库位置不能为空。", param.OutEndPostion));
  414. }
  415. if (string.IsNullOrWhiteSpace(reply.WareHouseName))
  416. {
  417. throw new Exception(string.Format("工位[{0}]申请出库任务反馈仓库不能为空。", param.OutEndPostion));
  418. }
  419. if (string.IsNullOrWhiteSpace(reply.ContainerBarCode))
  420. {
  421. throw new Exception(string.Format("工位[{0}]申请出库任务反馈条码编号不能为空。", param.OutEndPostion));
  422. }
  423. if (reply.TaskType == 2 && string.IsNullOrWhiteSpace(reply.TunnelNum))
  424. {
  425. throw new Exception(string.Format("工位[{0}]申请出库任务反馈巷道号不能为空。", param.OutEndPostion));
  426. }
  427. if (reply.TASK_STACKINGTYPE <= 0 && (param.OutEndPostion == "1251" || param.OutEndPostion == "1261" || param.OutEndPostion == "1226" || param.OutEndPostion == "1234" || param.OutEndPostion == "1257" || param.OutEndPostion == "1252" || param.OutEndPostion == "1231" || param.OutEndPostion == "1258" || param.OutEndPostion == "1278" || param.OutEndPostion == "1283"))
  428. {
  429. throw new Exception(string.Format("工位[{0}]申请出库任务[1]垛型存在问题,传递值必须大于零。", param.OutEndPostion, reply.WMSTaskNum));
  430. }
  431. if (string.IsNullOrWhiteSpace(reply.PalletizingBoxSize) && Convert.ToInt32(reply.PalletizingBoxSize) <= 0 && (param.OutEndPostion == "1251" || param.OutEndPostion == "1261" || param.OutEndPostion == "1226" || param.OutEndPostion == "1234" || param.OutEndPostion == "1257" || param.OutEndPostion == "1252" || param.OutEndPostion == "1231" || param.OutEndPostion == "1258" || param.OutEndPostion == "1278" || param.OutEndPostion == "1283"))
  432. {
  433. throw new Exception(string.Format("工位[{0}]申请出库任务[1]箱子尺寸存在问题,传递值必须大于零。", param.OutEndPostion, reply.WMSTaskNum));
  434. }
  435. var task = SugarBase.DB.Queryable<WCS_TASK>().First(v => v.TASK_WMSNO == reply.WMSTaskNum);
  436. if (task == null)
  437. {
  438. var agvtask = Current.AgvTaskSet.FirstOrDefault(v => v.Task_Id.ToString() == param.OutId);
  439. string msg = TryCachHelper.TryTranExecute((db) =>
  440. {
  441. if (agvtask != null)
  442. {
  443. DateTime dt = db.GetDate();
  444. int task_id = Convert.ToInt32(param.OutId);
  445. db.Updateable<Middle_AGVTask>(it => new Middle_AGVTask()
  446. {
  447. Task_WcsStatus = 5,
  448. Task_UpdateUser = "wcs",
  449. Task_UpdateDate = dt
  450. })
  451. .Where(it => it.Task_Id == task_id).ExecuteCommand();
  452. }
  453. //添加wcs任务
  454. wcstask = new WCS_TASK();
  455. wcstask.TASK_WMSNO = reply.WMSTaskNum;
  456. wcstask.TASK_COMTYPE = reply.TaskType;
  457. wcstask.TASK_SYSTYPE = "WMS";
  458. wcstask.TASK_POSIDFROM = reply.OutWareCellNo;//起点地址
  459. wcstask.TASK_POSIDCUR = reply.OutWareCellNo;
  460. wcstask.TASK_POSIDNEXT = reply.OutWareCellNo;
  461. wcstask.TASK_POSIDMOVE = "";
  462. wcstask.TASK_PRIORITY = reply.Priority;
  463. wcstask.TASK_WKSTATUS = 0;
  464. wcstask.TASK_WHID = reply.WareHouseName;
  465. wcstask.TASK_ADDUSERNO = "WMS";
  466. wcstask.TASK_ADDDATETIME = DateTime.Now;
  467. wcstask.TASK_EDITUSERNO = "WMS";
  468. wcstask.TASK_EDITDATETIME = DateTime.Now;
  469. wcstask.TASK_NOTES = "";
  470. wcstask.TASK_RGVNO = "";
  471. wcstask.TASK_BOXBARCODE = reply.ContainerBarCode;
  472. wcstask.TASK_POSIDTO = param.OutEndPostion;
  473. wcstask.TASK_PRIORITY = reply.Priority;
  474. wcstask.TASK_ITEM8 = param.OutId;
  475. wcstask.TASK_ITEM9 = reply.Memo4;
  476. wcstask.TASK_ITEM10 = reply.Memo5;
  477. wcstask.PalletizingSonTraySize = reply.PalletizingSonTraySize;
  478. wcstask.PalletizingBoxSize = reply.PalletizingBoxSize;
  479. wcstask.SonTrayColorNo = reply.SonTrayColorNo;
  480. wcstask.TASK_MatureDate = reply.MatureDateLength;
  481. wcstask.TASK_WEIGHT = reply.TASK_WEIGHT;
  482. wcstask.TASK_STACKINGTYPE = reply.TASK_STACKINGTYPE;
  483. if (param.TASK_MatureDate == 12 && wcstask.TASK_MatureDate == 48)
  484. {
  485. wcstask.MatureNum = 4;
  486. }
  487. else
  488. {
  489. wcstask.MatureNum = 1;
  490. }
  491. if (wcstask.TASK_BOXBARCODE.Substring(0, 2) == "SH")
  492. {
  493. wcstask.TASK_ITEM2 = "2";
  494. }
  495. else if (wcstask.TASK_BOXBARCODE.Substring(0, 3) == "TPC")
  496. {
  497. wcstask.TASK_ITEM2 = "1";
  498. }
  499. else
  500. {
  501. wcstask.TASK_ITEM2 = "3";
  502. }
  503. if (string.IsNullOrWhiteSpace(reply.TunnelNum))
  504. {
  505. //wcstask.TASK_SRMNO = reply.EndPostion;
  506. }
  507. else
  508. {
  509. wcstask.TASK_FromTunnelNum = reply.TunnelNum;
  510. wcstask.TASK_SRMNO = Current.SysSets.Where(v => v.SET_ID.Contains("Tunnel")).FirstOrDefault(v => v.SET_VALUE == reply.TunnelNum).SET_TYPE;
  511. }
  512. int id = db.Insertable(wcstask).ExecuteReturnIdentity();
  513. if (id <= 0)
  514. {
  515. throw new Exception(string.Format("WMS任务[{0}]添加WCS任务失败", reply.WMSTaskNum));
  516. }
  517. });
  518. if (string.IsNullOrWhiteSpace(msg))
  519. {
  520. result = true;
  521. }
  522. else
  523. {
  524. throw new Exception(string.Format("WMS任务[{0}]添加WCS任务失败,消息[{1}]", reply.WMSTaskNum, msg));
  525. }
  526. }
  527. //var task = SugarBase.DB.Queryable<WCS_TASK>().First(v => v.TASK_WMSNO == reply.WMSTaskNum);
  528. //if (task == null)
  529. //{
  530. // //添加wcs任务
  531. // wcstask = new WCS_TASK();
  532. // wcstask.TASK_WMSNO = reply.WMSTaskNum;
  533. // wcstask.TASK_COMTYPE = reply.TaskType;
  534. // wcstask.TASK_SYSTYPE = "WMS";
  535. // wcstask.TASK_POSIDFROM = reply.OutWareCellNo;//起点地址
  536. // wcstask.TASK_POSIDCUR = reply.OutWareCellNo;
  537. // wcstask.TASK_POSIDNEXT = reply.OutWareCellNo;
  538. // wcstask.TASK_POSIDMOVE = "";
  539. // wcstask.TASK_PRIORITY = reply.Priority;
  540. // wcstask.TASK_WKSTATUS = 0;
  541. // wcstask.TASK_WHID = reply.WareHouseName;
  542. // wcstask.TASK_ADDUSERNO = "WMS";
  543. // wcstask.TASK_ADDDATETIME = DateTime.Now;
  544. // wcstask.TASK_EDITUSERNO = "WMS";
  545. // wcstask.TASK_EDITDATETIME = DateTime.Now;
  546. // wcstask.TASK_NOTES = "";
  547. // wcstask.TASK_RGVNO = "";
  548. // wcstask.TASK_BOXBARCODE = reply.ContainerBarCode;
  549. // wcstask.TASK_POSIDTO = param.OutEndPostion;
  550. // wcstask.TASK_PRIORITY = reply.Priority;
  551. // wcstask.TASK_ITEM8 = param.OutId;
  552. // wcstask.TASK_ITEM9 = reply.Memo4;
  553. // wcstask.TASK_ITEM10 = reply.Memo5;
  554. // if (wcstask.TASK_BOXBARCODE.Substring(0, 2) == "SH")
  555. // {
  556. // wcstask.TASK_ITEM2 = "2";
  557. // }
  558. // else if (wcstask.TASK_BOXBARCODE.Substring(0, 3) == "TPC")
  559. // {
  560. // wcstask.TASK_ITEM2 = "1";
  561. // }
  562. // else
  563. // {
  564. // wcstask.TASK_ITEM2 = "3";
  565. // }
  566. // if (string.IsNullOrWhiteSpace(reply.TunnelNum))
  567. // {
  568. // //wcstask.TASK_SRMNO = reply.EndPostion;
  569. // }
  570. // else
  571. // {
  572. // wcstask.TASK_FromTunnelNum = reply.TunnelNum;
  573. // wcstask.TASK_SRMNO = Current.SysSets.Where(v => v.SET_ID.Contains("Tunnel")).FirstOrDefault(v => v.SET_VALUE == reply.TunnelNum).SET_TYPE;
  574. // }
  575. // int id = SugarBase.DB.Insertable(wcstask).ExecuteReturnIdentity();
  576. // if (id <= 0)
  577. // {
  578. // throw new Exception(string.Format("WMS任务[{0}]添加WCS任务失败", reply.WMSTaskNum));
  579. // }
  580. // else
  581. // {
  582. // result = true;
  583. // }
  584. //}
  585. }
  586. else
  587. {
  588. var msg = string.Format("目标位置[{0}]获取出库任务失败,原因:[{1}]", param.OutEndPostion, reply.ResMessage);
  589. throw new Exception(msg);
  590. }
  591. }
  592. catch (Exception ex)
  593. {
  594. AddLedErrorMsg(param.OutEndPostion, ex.Message, 0);
  595. LogMessageHelper.RecordLogMessage(ex);
  596. }
  597. return result;
  598. }
  599. private static string CheckGetInTask(GetInTaskParam param, GetInTaskReply reply)
  600. {
  601. string errorMsg = string.Empty;
  602. if (reply == null)
  603. {
  604. throw new Exception(string.Format("托盘[{0}]调用WMS入库接口,反馈的对象为空。", param.ContainerBarCode));
  605. }
  606. if (reply.ResType)
  607. {
  608. if (string.IsNullOrWhiteSpace(reply.WMSTaskNum))
  609. {
  610. errorMsg = string.Format("托盘[{0}]调用WMS入库接口,反馈的WMS任务号不能为空。", param.ContainerBarCode);
  611. }
  612. else if (string.IsNullOrWhiteSpace(reply.EndPostion))
  613. {
  614. errorMsg = string.Format("托盘[{0}]调用WMS入库接口,反馈的目标地址不能为空。", param.ContainerBarCode);
  615. }
  616. else if (string.IsNullOrWhiteSpace(reply.EndPostion))
  617. {
  618. errorMsg = string.Format("托盘[{0}]调用WMS入库接口,反馈的目标地址不能为空。", param.ContainerBarCode);
  619. }
  620. else if (string.IsNullOrWhiteSpace(reply.WareHouseName))
  621. {
  622. errorMsg = string.Format("托盘[{0}]调用WMS入库接口,反馈的仓库名称不能为空。", param.ContainerBarCode);
  623. }
  624. else if (reply.TASK_WEIGHT < 1 && param.EquipmentNo == "1390")
  625. {
  626. errorMsg = string.Format("料箱[{0}]调用WMS入库接口,反馈的重量要大于0。", param.ContainerBarCode);
  627. }
  628. else if (reply.TASK_STACKINGTYPE < 1 && param.EquipmentNo == "1390")
  629. {
  630. errorMsg = string.Format("料箱[{0}]调用WMS入库接口,反馈的垛型要大于0。", param.ContainerBarCode);
  631. }
  632. //else if (string.IsNullOrWhiteSpace(reply.Memo1) && param.EquipmentNo == "1200" && param.ContainerBarCode.Contains("TPA"))
  633. //{
  634. // errorMsg = string.Format("托盘[{0}]18#调用WMS入库接口,反馈的是否缠膜不能为空。", param.ContainerBarCode);
  635. //}
  636. else if (!string.IsNullOrWhiteSpace(param.Memo1))
  637. {
  638. if (string.IsNullOrWhiteSpace(reply.TunnelNum) || reply.TunnelNum.Trim() == "0")
  639. {
  640. errorMsg = string.Format("托盘[{0}]调用WMS入库接口,没有返回巷道。", param.ContainerBarCode);
  641. }
  642. if (param.Memo1.Trim() == "2")
  643. {
  644. if (reply.EndPostion.Length < 10)
  645. {
  646. errorMsg = string.Format("托盘[{0}]调用WMS入库接口,没有分配货位。", param.ContainerBarCode);
  647. }
  648. }
  649. else if (param.Memo1.Trim() == "1")
  650. {
  651. }
  652. else
  653. {
  654. errorMsg = string.Format("托盘[{0}]调用WMS入库接口传递参数Memo1[{1}]错误.", param.ContainerBarCode, param.Memo1);
  655. }
  656. }
  657. }
  658. else
  659. {
  660. if (reply == null)
  661. {
  662. errorMsg = string.Format("托盘[{0}]调用WMS入库接口,反馈的对象为空。", param.ContainerBarCode);
  663. }
  664. else
  665. {
  666. errorMsg = string.Format("位置[{0}]生产编码[{1}]获取入库任务失败,反馈结果:[{2}]", param.EquipmentNo, param.ContainerBarCode, reply.ResMessage);
  667. }
  668. }
  669. return errorMsg;
  670. }
  671. /// <summary>
  672. /// 获取入库任务
  673. /// </summary>
  674. /// <param name="param"></param>
  675. public static WCS_TASK GetInTask_2(GetInTaskParam param)
  676. {
  677. WCS_TASK wcstask = null;
  678. try
  679. {
  680. if (!string.IsNullOrWhiteSpace(param.ContainerBarCode))
  681. {
  682. wcstask = SugarBase.DB.Queryable<WCS_TASK>().First(v => v.TASK_BOXBARCODE == param.ContainerBarCode);
  683. }
  684. if (wcstask == null)
  685. {
  686. var reply = Current.WmsInterface.I_WCS_GetInTask(param);
  687. if (reply.ResType)
  688. {
  689. if (string.IsNullOrWhiteSpace(reply.EndPostion))
  690. {
  691. throw new Exception(string.Format("托盘[{0}]调用WMS入库接口返回成功,但是没有返回目标地址。", reply.EndPostion));
  692. }
  693. //添加wcs任务
  694. wcstask = new WCS_TASK();
  695. wcstask.TASK_WMSNO = reply.WMSTaskNum;
  696. wcstask.TASK_COMTYPE = reply.TaskType;
  697. wcstask.TASK_SYSTYPE = "WMS";
  698. wcstask.TASK_POSIDFROM = param.EquipmentNo;//起点地址
  699. wcstask.TASK_POSIDCUR = param.EquipmentNo;
  700. wcstask.TASK_POSIDNEXT = param.EquipmentNo;
  701. wcstask.TASK_POSIDMOVE = "";
  702. wcstask.TASK_PRIORITY = reply.Priority;
  703. wcstask.TASK_WKSTATUS = 0;
  704. wcstask.TASK_WHID = reply.WareHouseName;
  705. wcstask.TASK_ADDUSERNO = "WMS";
  706. wcstask.TASK_ADDDATETIME = DateTime.Now;
  707. wcstask.TASK_EDITUSERNO = "WMS";
  708. wcstask.TASK_EDITDATETIME = DateTime.Now;
  709. wcstask.TASK_NOTES = "";
  710. wcstask.TASK_RGVNO = "";
  711. wcstask.TASK_BOXBARCODE = param.ContainerBarCode;
  712. if (string.IsNullOrWhiteSpace(param.Memo1))
  713. {
  714. wcstask.TASK_POSIDTO = reply.EndPostion;
  715. wcstask.TASK_SRMNO = reply.EndPostion;
  716. }
  717. else if (param.Memo1.Trim() == "1")
  718. {
  719. if (string.IsNullOrWhiteSpace(reply.TunnelNum) || reply.TunnelNum.Trim() == "0")
  720. {
  721. throw new Exception(string.Format("托盘[{0}]申请入库没有分配巷道,生成WCS任务失败。", param.ContainerBarCode));
  722. }
  723. else
  724. {
  725. string srmno = string.Empty;
  726. wcstask.TASK_EndTunnelNum = ConveyorHelper.QueryTunnel(wcstask.TASK_WMSNO, param.EquipmentNo, out srmno);
  727. wcstask.TASK_POSIDTO = wcstask.TASK_EndTunnelNum;
  728. wcstask.TASK_SRMNO = srmno;
  729. }
  730. }
  731. else if (param.Memo1.Trim() == "2")
  732. {
  733. wcstask.TASK_POSIDTO = reply.EndPostion;
  734. wcstask.TASK_EndTunnelNum = reply.TunnelNum;
  735. wcstask.TASK_SRMNO = Current.SysSets.Where(v => v.SET_ID.Contains("Tunnel")).FirstOrDefault(v => v.SET_VALUE == reply.TunnelNum).SET_VALUE;
  736. }
  737. else
  738. {
  739. throw new Exception(string.Format("托盘[{0}]调用WMS入库接口传递参数Memo1错误.", param.ContainerBarCode));
  740. }
  741. int id = SugarBase.DB.Insertable(wcstask).ExecuteReturnIdentity();
  742. if (id <= 0)
  743. {
  744. throw new Exception(string.Format("WMS任务[{0}]添加WCS任务失败", reply.WMSTaskNum));
  745. }
  746. else
  747. {
  748. wcstask.TASK_NO = id;
  749. }
  750. }
  751. else
  752. {
  753. string msg = string.Format("位置[{0}]条码[{1}]获取入库任务失败,反馈结果:[{2}]", param.EquipmentNo, param.ContainerBarCode, reply.ResMessage);
  754. LogMessageHelper.RecordLogMessage(msg);
  755. }
  756. }
  757. }
  758. catch (Exception ex)
  759. {
  760. //ThreadHelper.TaskThread(UploadExcTask, new { EquipmentNo = param.EquipmentNo, Alaram = ex.Message });
  761. LogMessageHelper.RecordLogMessage(ex);
  762. }
  763. return wcstask;
  764. }
  765. /// <summary>
  766. /// 上传设备异常信息
  767. /// </summary>
  768. //public static void UploadExcTask(UploadExcTaskParam param)
  769. //{
  770. // try
  771. // {
  772. // Log4netHelper.Logger_Info.InfoFormat(string.Format("开始:输送线[{0}]报警信息[{1}]上传WMS。", param.EquipmentNo, param.ExcMessage));
  773. // var reply = Current.WmsInterface.I_WCS_UploadExcTask(param);
  774. // if (reply.ResType)
  775. // {
  776. // Log4netHelper.Logger_Info.InfoFormat(string.Format("成功:输送线[{0}]报警信息[{1}]上传WMS。", param.EquipmentNo, param.ExcMessage));
  777. // }
  778. // else
  779. // {
  780. // throw new Exception(string.Format("失败:输送线[{0}]报警信息[{1}]上传WMS。原因:[{2}]", param.EquipmentNo, param.ExcMessage, reply.ResMessage));
  781. // }
  782. // }
  783. // catch (Exception ex)
  784. // {
  785. // Log4netHelper.Logger_Error.ErrorFormat(ex.ToString());
  786. // }
  787. // finally
  788. // {
  789. // Log4netHelper.Logger_Info.InfoFormat(string.Format("结束:输送线[{0}]报警信息[{1}]上传WMS。", param.EquipmentNo, param.ExcMessage));
  790. // }
  791. //}
  792. /// <summary>
  793. /// 添加异常信息
  794. /// </summary>
  795. /// <param name="db"></param>
  796. /// <param name="equipmentNo"></param>
  797. /// <param name="alaram"></param>
  798. /// <param name="task_no"></param>
  799. public static void AddLedErrorMsg(SqlSugarClient db, string equipmentNo, string alaram, int task_no, int alaramCount = 10)
  800. {
  801. int wmstask_no = 0;
  802. var task = db.Queryable<WCS_TASK>().First(v => v.TASK_NO == task_no);
  803. if (task != null)
  804. {
  805. wmstask_no = Convert.ToInt32(task.TASK_WMSNO);
  806. }
  807. CommonData.AddLedErrorMsg(db, equipmentNo, alaram, task_no, wmstask_no, alaramCount);
  808. }
  809. /// <summary>
  810. /// 添加异常信息
  811. /// </summary>
  812. /// <param name="db"></param>
  813. /// <param name="equipmentNo"></param>
  814. /// <param name="alaram"></param>
  815. /// <param name="task_no"></param>
  816. public static void AddLedErrorMsg(string equipmentNo, string alaram, int task_no)
  817. {
  818. int wmstask_no = 0;
  819. var task = Current.TaskSet.FirstOrDefault(v => v.TASK_NO == task_no);
  820. if (task != null)
  821. {
  822. wmstask_no = Convert.ToInt32(task.TASK_WMSNO);
  823. }
  824. TryCachHelper.TryExecute((db) =>
  825. {
  826. CommonData.AddLedErrorMsg(db, equipmentNo, alaram, task_no, wmstask_no);
  827. });
  828. }
  829. private static int _upLoadExcToWMS = 0;
  830. /// <summary>
  831. /// 上传设备异常信息
  832. /// </summary>
  833. public static void UpLoadExcToWMS()
  834. {
  835. if (Interlocked.Exchange(ref _upLoadExcToWMS, 1) == 0)
  836. {
  837. string result = TryCachHelper.TryExecute((db) =>
  838. {
  839. var ExcMsg = db.Queryable<WCS_LEDALARMSMSG>().First(v => v.LED_ISUPLOADWMSFINISH == false);
  840. if (ExcMsg != null)
  841. {
  842. var param = new UploadExcTaskParam();
  843. param.OutId = ExcMsg.LED_ID;
  844. param.EquipmentNo = ExcMsg.LED_CONVYORNO;
  845. param.WCSTaskNum = ExcMsg.LED_WCSTASK_NO.ToString();
  846. param.WMSTaskNum = ExcMsg.LED_WMSTASK_NO.ToString();
  847. param.ExcCode = ExcMsg.LED_ALARMSMSG;
  848. param.ExcMessage = ExcMsg.LED_ALARMSMSG;
  849. var reply = Current.WmsInterface.I_WCS_UploadExcTask(param);
  850. if (reply.ResType)
  851. {
  852. //修改上传完成
  853. db.Updateable<WCS_LEDALARMSMSG>(it => new WCS_LEDALARMSMSG() { LED_ISUPLOADWMSFINISH = true, LED_UPDATETIME = DateTime.Now })
  854. .Where(it => it.LED_ID == ExcMsg.LED_ID)
  855. .ExecuteCommand();
  856. }
  857. }
  858. });
  859. Interlocked.Exchange(ref _upLoadExcToWMS, 0);
  860. }
  861. }
  862. private static int _putDevInfoToWMS = 0;
  863. /// <summary>
  864. /// 上传设PLC备信息
  865. /// </summary>
  866. public static void PutDevInfoToWMS()
  867. {
  868. if (Interlocked.Exchange(ref _putDevInfoToWMS, 1) == 0)
  869. {
  870. Thread.Sleep(2000);
  871. string result = TryCachHelper.TryTranExecute((db) =>
  872. {
  873. List<PutDevInfoParam> DevList = new List<PutDevInfoParam>();
  874. //var EquState = db.Queryable<WCS_EQUIPMENTINFO>().Where(v => v.Equ_Type == "srm").ToList();
  875. var EquState = Current.PlcSet.Where(v => v.PLC_EQUIPMENTTYPE == "srm" && v.PLC_WCSSYSTEM == Current.WcsSystem).ToList();
  876. foreach (var item in EquState)
  877. {
  878. var srmState = item.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == item.PLC_NAME);
  879. var param = new PutDevInfoParam();
  880. param.STA_EQUIPMENTNO = item.PLC_NAME;
  881. if (!string.IsNullOrWhiteSpace(srmState.EquSignal_Srm.SrmFault))
  882. {
  883. param.STA_ALARMS = string.Format("设备[{0}][{1}]", item.PLC_NAME, srmState.EquSignal_Srm.SrmFault);
  884. param.STA_ALARMSMSG = string.Format("设备[{0}][{1}]", item.PLC_NAME, srmState.EquSignal_Srm.SrmFault);
  885. }
  886. param.STA_DATA = srmState.EquSignal_Srm.ToJson();
  887. DevList.Add(param);
  888. }
  889. var convStatue = Current.PlcSet.Where(v => v.PLC_EQUIPMENTTYPE != "srm" && v.PLC_WCSSYSTEM == Current.WcsSystem).ToList();
  890. foreach (var item in convStatue)
  891. {
  892. foreach (var equinfo in item.WCS_EquipmentInfoSet)
  893. {
  894. var param = new PutDevInfoParam();
  895. if (equinfo.Equ_Type == EquipmentType.conveyor.ToString())
  896. {
  897. param.STA_EQUIPMENTNO = equinfo.Equ_No;
  898. string alarms = equinfo.EquSignal_Conv.ConvFault.ToString();
  899. if (string.IsNullOrWhiteSpace(alarms) == false && alarms != "0")
  900. {
  901. param.STA_ALARMS = string.Format("设备[{0}][{1}]", equinfo.Equ_No, alarms);
  902. param.STA_ALARMSMSG = string.Format("设备[{0}][{1}]", equinfo.Equ_No, alarms);
  903. }
  904. }
  905. else if (equinfo.Equ_Type == EquipmentType.rgv.ToString())
  906. {
  907. param.STA_EQUIPMENTNO = equinfo.Equ_No;
  908. string alarmagv = equinfo.EquSignal_Rgv.AlarmFault;
  909. if (string.IsNullOrWhiteSpace(alarmagv) == false && alarmagv != "0")
  910. {
  911. param.STA_ALARMS = string.Format("设备[{0}][{1}]", equinfo.Equ_No, alarmagv);
  912. param.STA_ALARMSMSG = string.Format("设备[{0}][{1}]", equinfo.Equ_No, alarmagv);
  913. }
  914. }
  915. DevList.Add(param);
  916. }
  917. }
  918. var reply = Current.WmsInterface.I_WCS_PutDevInfo(DevList);
  919. string resMessage = "接口返回Null";
  920. if (reply != null) resMessage = reply.ResMessage;
  921. if (reply == null || reply.ResType == false)
  922. {
  923. LogMessageHelper.RecordLogMessage(string.Format("上传设备PLC信息失败,原因:[{0}]。", resMessage));
  924. }
  925. });
  926. Interlocked.Exchange(ref _putDevInfoToWMS, 0);
  927. }
  928. }
  929. /// <summary>
  930. /// 熟化开始结束时间上传
  931. /// </summary>
  932. /// <param name="param"></param>
  933. /// <returns></returns>
  934. public static bool GetMatureContinueMode(GetMatureContinueParam param)
  935. {
  936. bool result = false;
  937. try
  938. {
  939. var reply = Current.WmsInterface.I_WCS_GetMatureContinueMode(param);
  940. if (!reply.ResType)
  941. {
  942. string error = string.Format("熟化房[{0}]上传失败,原因:[{1}]", param.MatureRoomNo, reply.ResMessage);
  943. throw new Exception(error);
  944. }
  945. else
  946. {
  947. #region tion
  948. //var converywrite = new WCSWriteToConveyorSignal();
  949. //converywrite.Plc = plc.Plc;
  950. //converywrite.DBName = plc.WriteDBName;
  951. //converywrite.ConveyorNo = convNo;
  952. //converywrite.WriteStartAddress = cs.EquDbInfo_ReadWrite.DBReadIndox;
  953. //if (judge == 1)//写入开始确认信号
  954. //{
  955. // converywrite.Confirm = true;
  956. //}
  957. //else if (judge == 2)//写入结束确认信号
  958. //{
  959. // converywrite.TaskDelete = true;
  960. //}
  961. //WriteTaskToBuffer(converywrite);
  962. #endregion
  963. result = true;
  964. }
  965. }
  966. catch (Exception ex)
  967. {
  968. result = false;
  969. LogMessageHelper.RecordLogMessage(ex.Message, ex);
  970. }
  971. return result;
  972. }
  973. private static bool WriteTaskToBuffer(WCSWriteToConveyorSignal conv)
  974. {
  975. List<byte> list = new List<byte>();
  976. //写入任务号
  977. list.AddRange(ExtendsUtil.UintToByte((uint)conv.Tasknum).ToList());
  978. //var codes = Encoding.UTF8.GetBytes(conv.Goodscode);
  979. //货物条码
  980. list.AddRange(ExtendsUtil.UintToByte((uint)conv.Goodscode).ToList());
  981. //货物类型
  982. list.AddRange(ExtendsUtil.UshortToByte((ushort)conv.Goodstype).ToList());
  983. //货位尺寸
  984. list.AddRange(ExtendsUtil.UshortToByte((ushort)conv.Goodssize).ToList());
  985. //写入起点地址
  986. list.AddRange(ExtendsUtil.UshortToByte((ushort)conv.Goodsstart).ToList());
  987. //写入目标地址
  988. list.AddRange(ExtendsUtil.UshortToByte((ushort)conv.Goodsend).ToList());
  989. BitArray bit16 = new BitArray(16);
  990. bit16[9] = conv.Confirm;
  991. if (conv.Remark == conv.Goodsend.ToString())
  992. {
  993. bit16[0] = conv.TrayColor_Three;
  994. bit16[14] = conv.TrayColor_One;
  995. bit16[15] = conv.TrayColor_Two;
  996. }
  997. bit16[5] = conv.UpMatRequest;
  998. bit16[6] = conv.Res01;
  999. bit16[7] = conv.Res02;
  1000. bit16[10] = conv.TaskDelete;//删除任务
  1001. bit16[11] = conv.Notask;
  1002. int BitInfo = ExtendsUtil.BitToInt(bit16);
  1003. list.AddRange(ExtendsUtil.UshortToByte((ushort)BitInfo).ToList());
  1004. if (conv.TASK_WEIGHT > 0)//1390获取重量值
  1005. {
  1006. list.AddRange(ExtendsUtil.UintToByte((uint)conv.TASK_WEIGHT).ToList());
  1007. }
  1008. else
  1009. {
  1010. list.AddRange(ExtendsUtil.UshortToByte((ushort)conv.Res03).ToList());
  1011. }
  1012. if (conv.Plc.Write((ushort)conv.DBName, (ushort)(conv.WriteStartAddress), list.ToArray()))
  1013. {
  1014. Log4netHelper.Logger_Info.InfoFormat(string.Format("输送机[{0}]写入任务[{1}]信息成功。", conv.Goodsstart, conv.Tasknum));
  1015. return true;
  1016. }
  1017. else
  1018. {
  1019. throw new Exception(string.Format("输送机[{0}]写入任务[{1}]信息失败。", conv.Goodsstart, conv.Tasknum));
  1020. }
  1021. }
  1022. /// <summary>
  1023. /// 称重上传
  1024. /// </summary>
  1025. /// <param name="param"></param>
  1026. public static bool GetWeight(GetWeightParam param)
  1027. {
  1028. bool result = true;
  1029. try
  1030. {
  1031. var reply = Current.WmsInterface.I_WCS_GetWeight(param);
  1032. var task = Current.TaskSet.FirstOrDefault(v => v.TASK_WMSNO == param.WMSTaskNum);
  1033. //修改任务,添加重量
  1034. string resultmsg = TryCachHelper.TryTranExecute((db) =>
  1035. {
  1036. db.Updateable<WCS_TASK>(it => new WCS_TASK()
  1037. {
  1038. TASK_GrossWeight = param.Weight
  1039. }).Where(it => it.TASK_NO == task.TASK_NO).ExecuteCommand();
  1040. string msg = string.Format("称重任务[{0}]已称重,重量[{1}]克。", task.TASK_NO, param.Weight);
  1041. CommonData.AddWCS_TASK_DTL(db, task.TASK_NO, task.TASK_NO, task.TASK_POSIDCUR, task.TASK_POSIDNEXT, msg);
  1042. });
  1043. if (!string.IsNullOrWhiteSpace(resultmsg))
  1044. {
  1045. throw new Exception(resultmsg);
  1046. }
  1047. if (!reply.ResType)
  1048. {
  1049. string error = string.Format("任务[{0}]重量[{1}]上传失败,原因:[{2}]", param.WMSTaskNum, param.Weight, reply.ResMessage);
  1050. throw new Exception(error);
  1051. }
  1052. }
  1053. catch (Exception ex)
  1054. {
  1055. result = false;
  1056. LogMessageHelper.RecordLogMessage(ex.Message, ex);
  1057. }
  1058. return result;
  1059. }
  1060. #region WMS接口调用
  1061. private static List<int> AssignSrmTaskNoSet = new List<int>();
  1062. public static void AssignSrm(WCS_TASK task)
  1063. {
  1064. if (AssignSrmTaskNoSet.Contains(task.TASK_NO))
  1065. {
  1066. Log4netHelper.Logger_Info.InfoFormat("任务[{0}]方法[AssignSrm]调用失败,WMS接口[I_WCS_GetTunnelList]调用正在执行中", task.TASK_NO);
  1067. }
  1068. else
  1069. {
  1070. AssignSrmTaskNoSet.Add(task.TASK_NO);
  1071. ConveyorHelper.AssignSrm(task);
  1072. AssignSrmTaskNoSet.Remove(task.TASK_NO);
  1073. }
  1074. }
  1075. private static List<int> PreparatoryAssignSrmTaskNoSet = new List<int>();
  1076. public static void PreparatoryAssignSrmTunnel(WCS_TASK task)
  1077. {
  1078. if (PreparatoryAssignSrmTaskNoSet.Contains(task.TASK_NO))
  1079. {
  1080. Log4netHelper.Logger_Info.InfoFormat("任务[{0}]方法[AssignSrm]调用失败,WMS接口[I_WCS_GetTunnelList]调用正在执行中", task.TASK_NO);
  1081. }
  1082. else
  1083. {
  1084. PreparatoryAssignSrmTaskNoSet.Add(task.TASK_NO);
  1085. ConveyorHelper.PreparatoryAssignSrmTunnel(task);
  1086. PreparatoryAssignSrmTaskNoSet.Remove(task.TASK_NO);
  1087. }
  1088. }
  1089. private static List<string> TrayList = new List<string>();
  1090. public static WCS_TASK GetWcsInTask(GetInTaskParam param)
  1091. {
  1092. WCS_TASK task = null;
  1093. if (TrayList.Contains(param.ContainerBarCode))
  1094. {
  1095. Log4netHelper.Logger_Info.InfoFormat("托盘[{0}]方法[GetInTask]调用失败,WMS接口[I_WCS_GetInTask]调用正在执行中", param.ContainerBarCode);
  1096. }
  1097. else
  1098. {
  1099. TrayList.Add(param.ContainerBarCode);
  1100. task = GetInTask(param);
  1101. TrayList.Remove(param.ContainerBarCode);
  1102. }
  1103. return task;
  1104. }
  1105. private static List<string> AgvTaskNoSet = new List<string>();
  1106. /// <summary>
  1107. /// 获取出库任务
  1108. /// </summary>
  1109. /// <param name="param"></param>
  1110. public static void GetOutTask(GetOutTaskParam param)
  1111. {
  1112. if (AgvTaskNoSet.Contains(param.OutId))
  1113. {
  1114. Log4netHelper.Logger_Info.InfoFormat("呼叫位置[{0}]方法[GetOutTask]调用失败,WMS接口[I_WCS_GetOutTask]调用正在执行中", param.OutEndPostion);
  1115. }
  1116. else
  1117. {
  1118. AgvTaskNoSet.Add(param.OutId);
  1119. WCS_GetOutTask(param);
  1120. AgvTaskNoSet.Remove(param.OutId);
  1121. }
  1122. }
  1123. private static List<string> GetWeightSet = new List<string>();
  1124. public static void ProInGetWeight(GetWeightParam param)
  1125. {
  1126. if (GetWeightSet.Contains(param.WMSTaskNum))
  1127. {
  1128. Log4netHelper.Logger_Info.InfoFormat("任务[{0}]调用方法[GetWeight]调用失败,WMS接口[I_WCS_GetWeight]调用正在执行中", param.WMSTaskNum);
  1129. }
  1130. else
  1131. {
  1132. GetWeightSet.Add(param.WMSTaskNum);
  1133. GetWeight(param);
  1134. GetWeightSet.Remove(param.WMSTaskNum);
  1135. }
  1136. }
  1137. #endregion WMS接口调用
  1138. private static int _putUpdateUnexecuteTask = 0;
  1139. /// <summary>
  1140. /// 更新未执行任务
  1141. /// </summary>
  1142. public static void UpdateUnexecuteTask()
  1143. {
  1144. if (Interlocked.Exchange(ref _putUpdateUnexecuteTask, 1) == 0)
  1145. {
  1146. Thread.Sleep(90000);
  1147. try
  1148. {
  1149. TryCachHelper.TryExecute((db) =>
  1150. {
  1151. //更新每台堆垛机未执行任务数量
  1152. var srmName = db.Queryable<WCS_PLC>().Where(v => v.PLC_EQUIPMENTTYPE == "srm").ToList();
  1153. foreach (var item in srmName)
  1154. {
  1155. var taskSRMCount = db.Queryable<WCS_TASK>().Where(v => (v.TASK_WKSTATUS == 0 || v.TASK_WKSTATUS == 1 || v.TASK_WKSTATUS == 5) && v.TASK_SRMNO == item.PLC_NAME).ToList();
  1156. //更新未执行任务数量
  1157. db.Updateable<WCS_PLC>(it => new WCS_PLC() { PLC_UNEXECUTETASK = taskSRMCount.Count }).Where(it => it.PLC_NAME == item.PLC_NAME).ExecuteCommand();
  1158. }
  1159. var rgvName = db.Queryable<WCS_PLC>().Where(v => v.PLC_EQUIPMENTTYPE == "rgv").ToList();
  1160. foreach (var item in rgvName)
  1161. {
  1162. var OutInMat = db.Queryable<WCS_RGVOutInInfo>().Where(v => v.RGVOUTIN_RGVNO == item.PLC_NAME && (v.RGVOUTIN_OUTINTYPE == "OnMat" || v.RGVOUTIN_OUTINTYPE == "OnUpMat")).Select(v => v.RGVOUTIN_CONVNO).ToList();
  1163. var taskRGVCount = db.Queryable<WCS_TASK>().Where(v => (OutInMat.Contains(v.TASK_POSIDCUR) && v.TASK_POSIDCUR == v.TASK_POSIDNEXT) || (v.TASK_WKSTATUS == 7 && v.TASK_RGVNO == item.PLC_NAME)).ToList();
  1164. db.Updateable<WCS_PLC>(it => new WCS_PLC() { PLC_UNEXECUTETASK = taskRGVCount.Count }).Where(it => it.PLC_NAME == item.PLC_NAME).ExecuteCommand();
  1165. }
  1166. });
  1167. }
  1168. catch (Exception ex)
  1169. {
  1170. LogMessageHelper.RecordLogMessage(ex);
  1171. }
  1172. finally
  1173. {
  1174. Interlocked.Exchange(ref _putUpdateUnexecuteTask, 0);
  1175. }
  1176. }
  1177. }
  1178. #endregion public Method
  1179. }
  1180. }