BaseWorkflow.cs 61 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242
  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, string convNo, WCS_PLC plc, int judge)
  935. {
  936. bool result = true;
  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. var conveyor = plc.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == convNo);
  948. var cs = conveyor.EquSignal_Conv;
  949. var converywrite = new WCSWriteToConveyorSignal();
  950. converywrite.Plc = plc.Plc;
  951. converywrite.DBName = plc.WriteDBName;
  952. converywrite.ConveyorNo = convNo;
  953. converywrite.WriteStartAddress = cs.EquDbInfo_ReadWrite.DBReadIndox;
  954. if (judge == 1)//写入开始确认信号
  955. {
  956. converywrite.Confirm = true;
  957. }
  958. else if (judge == 2)//写入结束确认信号
  959. {
  960. converywrite.TaskDelete = true;
  961. }
  962. WriteTaskToBuffer(converywrite);
  963. }
  964. }
  965. catch (Exception ex)
  966. {
  967. result = false;
  968. LogMessageHelper.RecordLogMessage(ex.Message, ex);
  969. }
  970. return result;
  971. }
  972. private static bool WriteTaskToBuffer(WCSWriteToConveyorSignal conv)
  973. {
  974. List<byte> list = new List<byte>();
  975. //写入任务号
  976. list.AddRange(ExtendsUtil.UintToByte((uint)conv.Tasknum).ToList());
  977. //var codes = Encoding.UTF8.GetBytes(conv.Goodscode);
  978. //货物条码
  979. list.AddRange(ExtendsUtil.UintToByte((uint)conv.Goodscode).ToList());
  980. //货物类型
  981. list.AddRange(ExtendsUtil.UshortToByte((ushort)conv.Goodstype).ToList());
  982. //货位尺寸
  983. list.AddRange(ExtendsUtil.UshortToByte((ushort)conv.Goodssize).ToList());
  984. //写入起点地址
  985. list.AddRange(ExtendsUtil.UshortToByte((ushort)conv.Goodsstart).ToList());
  986. //写入目标地址
  987. list.AddRange(ExtendsUtil.UshortToByte((ushort)conv.Goodsend).ToList());
  988. BitArray bit16 = new BitArray(16);
  989. bit16[9] = conv.Confirm;
  990. if (conv.Remark == conv.Goodsend.ToString())
  991. {
  992. bit16[0] = conv.TrayColor_Three;
  993. bit16[14] = conv.TrayColor_One;
  994. bit16[15] = conv.TrayColor_Two;
  995. }
  996. bit16[5] = conv.UpMatRequest;
  997. bit16[6] = conv.Res01;
  998. bit16[7] = conv.Res02;
  999. bit16[10] = conv.TaskDelete;//删除任务
  1000. bit16[11] = conv.Notask;
  1001. int BitInfo = ExtendsUtil.BitToInt(bit16);
  1002. list.AddRange(ExtendsUtil.UshortToByte((ushort)BitInfo).ToList());
  1003. if (conv.TASK_WEIGHT > 0)//1390获取重量值
  1004. {
  1005. list.AddRange(ExtendsUtil.UintToByte((uint)conv.TASK_WEIGHT).ToList());
  1006. }
  1007. else
  1008. {
  1009. list.AddRange(ExtendsUtil.UshortToByte((ushort)conv.Res03).ToList());
  1010. }
  1011. if (conv.Plc.Write((ushort)conv.DBName, (ushort)(conv.WriteStartAddress), list.ToArray()))
  1012. {
  1013. Log4netHelper.Logger_Info.InfoFormat(string.Format("输送机[{0}]写入任务[{1}]信息成功。", conv.Goodsstart, conv.Tasknum));
  1014. return true;
  1015. }
  1016. else
  1017. {
  1018. throw new Exception(string.Format("输送机[{0}]写入任务[{1}]信息失败。", conv.Goodsstart, conv.Tasknum));
  1019. }
  1020. }
  1021. /// <summary>
  1022. /// 称重上传
  1023. /// </summary>
  1024. /// <param name="param"></param>
  1025. public static bool GetWeight(GetWeightParam param)
  1026. {
  1027. bool result = true;
  1028. try
  1029. {
  1030. var reply = Current.WmsInterface.I_WCS_GetWeight(param);
  1031. var task = Current.TaskSet.FirstOrDefault(v => v.TASK_WMSNO == param.WMSTaskNum);
  1032. //修改任务,添加重量
  1033. string resultmsg = TryCachHelper.TryTranExecute((db) =>
  1034. {
  1035. db.Updateable<WCS_TASK>(it => new WCS_TASK()
  1036. {
  1037. TASK_GrossWeight = param.Weight
  1038. }).Where(it => it.TASK_NO == task.TASK_NO).ExecuteCommand();
  1039. string msg = string.Format("称重任务[{0}]已称重,重量[{1}]克。", task.TASK_NO, param.Weight);
  1040. CommonData.AddWCS_TASK_DTL(db, task.TASK_NO, task.TASK_NO, task.TASK_POSIDCUR, task.TASK_POSIDNEXT, msg);
  1041. });
  1042. if (!string.IsNullOrWhiteSpace(resultmsg))
  1043. {
  1044. throw new Exception(resultmsg);
  1045. }
  1046. if (!reply.ResType)
  1047. {
  1048. string error = string.Format("任务[{0}]重量[{1}]上传失败,原因:[{2}]", param.WMSTaskNum, param.Weight, reply.ResMessage);
  1049. throw new Exception(error);
  1050. }
  1051. }
  1052. catch (Exception ex)
  1053. {
  1054. result = false;
  1055. LogMessageHelper.RecordLogMessage(ex.Message, ex);
  1056. }
  1057. return result;
  1058. }
  1059. #region WMS接口调用
  1060. private static List<int> AssignSrmTaskNoSet = new List<int>();
  1061. public static void AssignSrm(WCS_TASK task)
  1062. {
  1063. if (AssignSrmTaskNoSet.Contains(task.TASK_NO))
  1064. {
  1065. Log4netHelper.Logger_Info.InfoFormat("任务[{0}]方法[AssignSrm]调用失败,WMS接口[I_WCS_GetTunnelList]调用正在执行中", task.TASK_NO);
  1066. }
  1067. else
  1068. {
  1069. AssignSrmTaskNoSet.Add(task.TASK_NO);
  1070. ConveyorHelper.AssignSrm(task);
  1071. AssignSrmTaskNoSet.Remove(task.TASK_NO);
  1072. }
  1073. }
  1074. private static List<int> PreparatoryAssignSrmTaskNoSet = new List<int>();
  1075. public static void PreparatoryAssignSrmTunnel(WCS_TASK task)
  1076. {
  1077. if (PreparatoryAssignSrmTaskNoSet.Contains(task.TASK_NO))
  1078. {
  1079. Log4netHelper.Logger_Info.InfoFormat("任务[{0}]方法[AssignSrm]调用失败,WMS接口[I_WCS_GetTunnelList]调用正在执行中", task.TASK_NO);
  1080. }
  1081. else
  1082. {
  1083. PreparatoryAssignSrmTaskNoSet.Add(task.TASK_NO);
  1084. ConveyorHelper.PreparatoryAssignSrmTunnel(task);
  1085. PreparatoryAssignSrmTaskNoSet.Remove(task.TASK_NO);
  1086. }
  1087. }
  1088. private static List<string> TrayList = new List<string>();
  1089. public static WCS_TASK GetWcsInTask(GetInTaskParam param)
  1090. {
  1091. WCS_TASK task = null;
  1092. if (TrayList.Contains(param.ContainerBarCode))
  1093. {
  1094. Log4netHelper.Logger_Info.InfoFormat("托盘[{0}]方法[GetInTask]调用失败,WMS接口[I_WCS_GetInTask]调用正在执行中", param.ContainerBarCode);
  1095. }
  1096. else
  1097. {
  1098. TrayList.Add(param.ContainerBarCode);
  1099. task = GetInTask(param);
  1100. TrayList.Remove(param.ContainerBarCode);
  1101. }
  1102. return task;
  1103. }
  1104. private static List<string> AgvTaskNoSet = new List<string>();
  1105. /// <summary>
  1106. /// 获取出库任务
  1107. /// </summary>
  1108. /// <param name="param"></param>
  1109. public static void GetOutTask(GetOutTaskParam param)
  1110. {
  1111. if (AgvTaskNoSet.Contains(param.OutId))
  1112. {
  1113. Log4netHelper.Logger_Info.InfoFormat("呼叫位置[{0}]方法[GetOutTask]调用失败,WMS接口[I_WCS_GetOutTask]调用正在执行中", param.OutEndPostion);
  1114. }
  1115. else
  1116. {
  1117. AgvTaskNoSet.Add(param.OutId);
  1118. WCS_GetOutTask(param);
  1119. AgvTaskNoSet.Remove(param.OutId);
  1120. }
  1121. }
  1122. private static List<string> GetWeightSet = new List<string>();
  1123. public static void ProInGetWeight(GetWeightParam param)
  1124. {
  1125. if (GetWeightSet.Contains(param.WMSTaskNum))
  1126. {
  1127. Log4netHelper.Logger_Info.InfoFormat("任务[{0}]调用方法[GetWeight]调用失败,WMS接口[I_WCS_GetWeight]调用正在执行中", param.WMSTaskNum);
  1128. }
  1129. else
  1130. {
  1131. GetWeightSet.Add(param.WMSTaskNum);
  1132. GetWeight(param);
  1133. GetWeightSet.Remove(param.WMSTaskNum);
  1134. }
  1135. }
  1136. #endregion WMS接口调用
  1137. private static int _putUpdateUnexecuteTask = 0;
  1138. /// <summary>
  1139. /// 更新未执行任务
  1140. /// </summary>
  1141. public static void UpdateUnexecuteTask()
  1142. {
  1143. if (Interlocked.Exchange(ref _putUpdateUnexecuteTask, 1) == 0)
  1144. {
  1145. Thread.Sleep(90000);
  1146. try
  1147. {
  1148. TryCachHelper.TryExecute((db) =>
  1149. {
  1150. //更新每台堆垛机未执行任务数量
  1151. var srmName = db.Queryable<WCS_PLC>().Where(v => v.PLC_EQUIPMENTTYPE == "srm").ToList();
  1152. foreach (var item in srmName)
  1153. {
  1154. 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();
  1155. //更新未执行任务数量
  1156. db.Updateable<WCS_PLC>(it => new WCS_PLC() { PLC_UNEXECUTETASK = taskSRMCount.Count }).Where(it => it.PLC_NAME == item.PLC_NAME).ExecuteCommand();
  1157. }
  1158. var rgvName = db.Queryable<WCS_PLC>().Where(v => v.PLC_EQUIPMENTTYPE == "rgv").ToList();
  1159. foreach (var item in rgvName)
  1160. {
  1161. 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();
  1162. 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();
  1163. db.Updateable<WCS_PLC>(it => new WCS_PLC() { PLC_UNEXECUTETASK = taskRGVCount.Count }).Where(it => it.PLC_NAME == item.PLC_NAME).ExecuteCommand();
  1164. }
  1165. });
  1166. }
  1167. catch (Exception ex)
  1168. {
  1169. LogMessageHelper.RecordLogMessage(ex);
  1170. }
  1171. finally
  1172. {
  1173. Interlocked.Exchange(ref _putUpdateUnexecuteTask, 0);
  1174. }
  1175. }
  1176. }
  1177. #endregion public Method
  1178. }
  1179. }