ConvPlc03.cs 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using WCS.Data;
  6. using WCS.Data.Models;
  7. using WCS.Data.Utils;
  8. using WCS.PLC;
  9. using WCS.PLC.Model.Equipment;
  10. namespace WCS.Workflow
  11. {
  12. public class ConvPlc03 : Base_Conv
  13. {
  14. #region 只读变量
  15. private readonly string Conv_1390 = "1390";
  16. private readonly string Conv_1418 = "1418";
  17. private readonly string Conv_1401 = "1401";
  18. private readonly string Conv_1416 = "1416";
  19. #endregion;
  20. public override void Run()
  21. {
  22. Conv_ScanBarCodeExeTask();
  23. ConvTaskFinish();
  24. }
  25. private void ConvTaskFinish()
  26. {
  27. ConveyorTaskFinish(PlcName, Conv_1401, false, true);
  28. ConveyorTaskFinish(PlcName, Conv_1416, false, true);
  29. ConveyorTaskFinish();
  30. }
  31. public void ConveyorTaskFinish()
  32. {
  33. try
  34. {
  35. //调用函数完成任务
  36. string result = TryCachHelper.TryExecute((db) =>
  37. {
  38. var task = db.Queryable<WCS_TASK>().First(v => v.TASK_POSIDTO == Conv_1418 && v.TASK_POSIDCUR != v.TASK_POSIDFROM);
  39. if (task == null) return;
  40. //修改任务的状态
  41. db.Updateable<WCS_TASK>(it => new WCS_TASK() { TASK_WKSTATUS = 99, TASK_EDITUSERNO = "WCS", TASK_EDITDATETIME = DateTime.Now })
  42. .Where(it => it.TASK_NO == task.TASK_NO)
  43. .ExecuteCommand();
  44. });
  45. if (!string.IsNullOrWhiteSpace(result))
  46. {
  47. throw new Exception(result);
  48. }
  49. }
  50. catch (Exception ex)
  51. {
  52. LogMessageHelper.RecordLogMessage(ex);
  53. }
  54. }
  55. /// <summary>
  56. /// 输送线任务完成
  57. /// </summary>
  58. /// <param name="plcName">Plc</param>
  59. /// <param name="convNo">输送线出口</param>
  60. /// <param name="isCheckEndPos">是否检测当前地址和任务目标地址一致</param>
  61. /// <param name="isTaskDelete">是否删除输送线任务</param>
  62. public override void ConveyorTaskFinish(string plcName, string convNo, bool isCheckEndPos = true, bool isTaskDelete = false)
  63. {
  64. try
  65. {
  66. var plc = Current.PlcSet.FirstOrDefault(v => v.PLC_NAME == plcName);
  67. var conveyorTo = plc.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == convNo);
  68. var cs = conveyorTo.EquSignal_Conv;
  69. if (cs.DB521_Tasknum > 0 && cs.DB521_Request)
  70. {
  71. if (convNo == "1401" || convNo == "1416")
  72. {
  73. Log4netHelper.Logger_Info.InfoFormat(string.Format("工位[{0}]获取删除任务请求信号成功!", convNo));
  74. }
  75. //调用函数完成任务
  76. string result = TryCachHelper.TryExecute((db) =>
  77. {
  78. WCS_TASK taskcur = db.Queryable<WCS_TASK>().First(v => v.TASK_NO == cs.DB521_Tasknum && v.TASK_WKSTATUS < 99);
  79. if (taskcur == null) return;
  80. if (isCheckEndPos)
  81. {
  82. if (taskcur.TASK_COMTYPE != 6 && taskcur.TASK_POSIDTO != convNo) return;
  83. }
  84. //任务类型不是出库/搬运/移动类型
  85. if (taskcur.TASK_COMTYPE != 2 && taskcur.TASK_COMTYPE != 4 && taskcur.TASK_COMTYPE != 5) return;
  86. //var task = db.Queryable<WCS_TASK>().First(v => v.TASK_WKSTATUS == 99 && v.TASK_POSIDFROM == "1390" && v.TASK_POSIDTO == taskcur.TASK_POSIDTO);
  87. //if (task == null)
  88. //{
  89. //修改任务的状态
  90. db.Updateable<WCS_TASK>(it => new WCS_TASK() { TASK_WKSTATUS = 99, TASK_EDITUSERNO = "WCS", TASK_EDITDATETIME = DateTime.Now })
  91. .Where(it => it.TASK_NO == taskcur.TASK_NO)
  92. .ExecuteCommand();
  93. //}
  94. //else
  95. //{
  96. // BaseWorkflow.AddLedErrorMsg(convNo, string.Format("目标工位[{0}]上一个箱子[{1}]存在未完成任务[{2}]",task.TASK_POSIDTO, task.TASK_BOXBARCODE,task.TASK_NO), 0);
  97. // // LogMessageHelper.RecordLogMessage(string.Format("上一个箱子[{0}]存在未完成任务", task.TASK_BOXBARCODE, task.TASK_NO), true, LogLevelEnum.INFO.ToString());
  98. // throw new Exception(string.Format("目标工位[{0}]上一个箱子[{1}]存在未完成任务[{2}]", task.TASK_POSIDTO, task.TASK_BOXBARCODE, task.TASK_NO));
  99. //}
  100. });
  101. if (!string.IsNullOrWhiteSpace(result))
  102. {
  103. throw new Exception(result);
  104. }
  105. else
  106. {
  107. if (convNo == "1401" || convNo == "1416")
  108. {
  109. Log4netHelper.Logger_Info.InfoFormat(string.Format("工位[{0}]任务[{1}]标识完成成功!", convNo, cs.DB521_Tasknum));
  110. }
  111. }
  112. if (isTaskDelete)
  113. {
  114. if (cs.DB521_Tasknum > 0 && cs.DB523_Fault == false && cs.CvDB51_PH_Status == false
  115. //&& cs.DB521_Goodsend == Convert.ToInt32(convNo)
  116. && cs.DB521_Request)
  117. {
  118. var converywrite = new WCSWriteToConveyorSignal()
  119. {
  120. Plc = plc.Plc,
  121. DBName = plc.WriteDBName,
  122. ConveyorNo = convNo,
  123. WriteStartAddress = cs.EquDbInfo_ReadWrite.DBReadIndox,
  124. TaskDelete = true
  125. };
  126. WriteInfoToConv(cs, converywrite, true);
  127. }
  128. }
  129. }
  130. }
  131. catch (Exception ex)
  132. {
  133. LogMessageHelper.RecordLogMessage(ex);
  134. }
  135. }
  136. private void Conv_ScanBarCodeExeTask()
  137. {
  138. Conv_ScanningRequest(Conv_1390, Current.Pvchouseputong, Conv_1418);
  139. }
  140. public string TranslationBarCode(string barCode)
  141. {
  142. var arr = barCode.Split('}');
  143. return arr[1];
  144. }
  145. protected virtual void Conv_ScanningRequest(string convPosFrom, string warehouseid, string exitNo = "")
  146. {
  147. try
  148. {
  149. var plc = Current.PlcSet.FirstOrDefault(v => v.PLC_NAME == PlcName);
  150. var conveyor = plc.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == convPosFrom);
  151. var cs = conveyor.EquSignal_Conv;
  152. if (!cs.DB521_Request) return;
  153. if (cs.DB520_Confirm) return;
  154. WCS_TASK task = QueryTaskByCode(cs, convPosFrom, exitNo);
  155. if (task == null)
  156. {
  157. if (WcsScanConvIsUsed(convPosFrom))
  158. {
  159. string code = TranslationBarCode(cs.BarCodeStr);
  160. var param = new GetInTaskParam()
  161. {
  162. ContainerBarCode = code,
  163. ContainerType = 1,
  164. MatBarCode = string.Empty,
  165. WareHouseId = warehouseid,
  166. EquipmentNo = convPosFrom,
  167. EndPostion = string.Empty,
  168. Memo2 = exitNo
  169. };
  170. task = BaseWorkflow.GetWcsInTask(param);
  171. }
  172. }
  173. if (task == null) return;
  174. //判断任务是否已经执行
  175. if (task.TASK_WKSTATUS >= 2)
  176. {
  177. if (task.TASK_POSIDFROM != task.TASK_POSIDCUR)
  178. {
  179. task = SugarBase.DB.Queryable<WCS_TASK>().First(v => v.TASK_POSIDFROM == convPosFrom && v.TASK_POSIDCUR == convPosFrom && v.TASK_COMTYPE == 6);
  180. if (task == null)
  181. {
  182. #region 重码异常口排出
  183. string message = string.Format("条码[{0}]是重码。", cs.BarCodeStr);
  184. LogMessageHelper.RecordLogMessage(message);
  185. var wcstask = new WCS_TASK()
  186. {
  187. TASK_WMSNO = "wcs_" + DateTime.Now.ToString("yyyyMMddhhmmss"),
  188. TASK_COMTYPE = (int)ComTypeEnum.托盘异常退回,
  189. TASK_SYSTYPE = "WCS",
  190. TASK_POSIDFROM = convPosFrom,//起点地址
  191. TASK_POSIDCUR = convPosFrom,
  192. TASK_POSIDNEXT = convPosFrom,
  193. TASK_POSIDMOVE = "",
  194. TASK_PRIORITY = 1,
  195. TASK_WKSTATUS = 1,
  196. TASK_WHID = Current.Pvchouseputong,
  197. TASK_ADDUSERNO = "WCS",
  198. TASK_ADDDATETIME = DateTime.Now,
  199. TASK_EDITUSERNO = "WCS",
  200. TASK_EDITDATETIME = DateTime.Now,
  201. TASK_NOTES = "",
  202. TASK_RGVNO = "",
  203. TASK_BOXBARCODE = "MultipleCoding_" + DateTime.Now.ToString("yyyyMMddhhmmss"),
  204. TASK_POSIDTO = Conv_1418
  205. };
  206. string result = TryCachHelper.TryTranExecute((db) =>
  207. {
  208. int id = db.Insertable(wcstask).ExecuteReturnIdentity();
  209. if (id <= 0)
  210. {
  211. throw new Exception(string.Format("重码[{0}]添加异常排出任务失败。", cs.BarCodeStr));
  212. }
  213. else
  214. {
  215. wcstask.TASK_NO = id;
  216. }
  217. var task_dtl = new WCS_TASK_DTL()
  218. {
  219. ID = Guid.NewGuid().ToString(),
  220. PARENTID = wcstask.TASK_NO,
  221. TASKNO = wcstask.TASK_NO,
  222. POSIDCUR = convPosFrom,
  223. POSIDNEXT = convPosFrom,
  224. DESCRIPTION = message,
  225. EXECUTEDATE = DateTime.Now
  226. };
  227. db.Insertable(task_dtl).ExecuteReturnIdentity();
  228. BaseWorkflow.AddLedErrorMsg(db, convPosFrom, message, wcstask.TASK_NO, 100);
  229. });
  230. if (!string.IsNullOrWhiteSpace(result))
  231. {
  232. throw new Exception(result);
  233. }
  234. #endregion;
  235. }
  236. }
  237. }
  238. if (task.TASK_WKSTATUS >= 2) return;
  239. //WCS_PalletizingCode palletizingCode = null;
  240. if (task.TASK_COMTYPE != 6)
  241. {
  242. //var PalletizingCodeSet = SugarBase.DB.Queryable<WCS_PalletizingCode>().ToList();
  243. //palletizingCode = Current.IsAvailableRange_BoxSize(PalletizingCodeSet, task.PalletizingBoxSize, task.TASK_NO);
  244. //palletizingCode = PalletizingCodeSet.FirstOrDefault(v => v.IsAvailableRange_BoxSize(task.PalletizingBoxSize, task.TASK_NO));
  245. if (task == null)
  246. {
  247. throw new Exception(string.Format("输送线[{0}]任务[{1}]未获取到码垛清单,请维护码垛信息.", convPosFrom, task.TASK_NO));
  248. }
  249. }
  250. bool notask = false;
  251. int goodsend = 0;
  252. if (task.TASK_COMTYPE == (int)ComTypeEnum.托盘异常退回)
  253. {
  254. notask = true;
  255. goodsend = Convert.ToInt32(exitNo);
  256. }
  257. else
  258. {
  259. var routeSet = EquRouteHelper.QueryRoute(convPosFrom, task.TASK_POSIDTO);
  260. var routes = routeSet.Where(v => v.ROUTE_STARTPOS == convPosFrom).ToList();
  261. if (routes.Count() == 0)
  262. {
  263. throw new Exception(string.Format("输送线扫描位置[{0}]任务[{1}]查询路由失败。", convPosFrom, task.TASK_NO));
  264. }
  265. else
  266. {
  267. goodsend = Convert.ToInt32(routes.First().ROUTE_SONPOS);
  268. }
  269. }
  270. if (goodsend == 0) return;
  271. var converywrite = new WCSWriteToConveyorSignal()
  272. {
  273. Plc = plc.Plc,
  274. DBName = plc.WriteDBName,
  275. ConveyorNo = convPosFrom,
  276. WriteStartAddress = cs.EquDbInfo_ReadWrite.DBReadIndox,
  277. Tasknum = task.TASK_NO,
  278. Goodstype = Convert.ToInt32(task.TASK_POSIDTO),
  279. Goodssize = task.TASK_COMTYPE != 6 ? Convert.ToInt32(task.PalletizingBoxSize) : 0,
  280. Goodsstart = Convert.ToInt32(convPosFrom),
  281. //UpMatRequest = task.TASK_ORDERTYPE >= 1 ? true : false,
  282. TASK_WEIGHT = task.TASK_COMTYPE != 6 ? Convert.ToInt32(task.TASK_WEIGHT) : 0,
  283. Notask = notask,
  284. Goodsend = goodsend
  285. };
  286. WriteInfoToConv(cs, converywrite);
  287. }
  288. catch (Exception ex)
  289. {
  290. BaseWorkflow.AddLedErrorMsg(convPosFrom, ex.Message, 0);
  291. LogMessageHelper.RecordLogMessage(ex);
  292. }
  293. }
  294. protected WCS_TASK QueryTaskByCode(ConvSignal cs, string convPosFrom,string exitNo)
  295. {
  296. WCS_TASK task = null;
  297. if (cs.DB521_BCR_Noread)
  298. {
  299. task = Current.TaskSet.SingleOrDefault(v => v.TASK_POSIDFROM == convPosFrom && v.TASK_POSIDCUR == convPosFrom);
  300. if (task == null)
  301. {
  302. string errormsg = string.Format("箱式输送线[{0}]条码未读出。", convPosFrom);
  303. LogMessageHelper.RecordLogMessage(errormsg);
  304. BaseWorkflow.AddLedErrorMsg(convPosFrom, errormsg, 0);
  305. string wmsno = "wcs_" + DateTime.Now.ToString("yyyyMMddhhmmss");
  306. //wms任务异常需要生成退回托盘任务
  307. task = new WCS_TASK()
  308. {
  309. TASK_WMSNO = wmsno,
  310. TASK_COMTYPE = (int)ComTypeEnum.托盘异常退回,
  311. TASK_SYSTYPE = "WCS",
  312. TASK_POSIDFROM = convPosFrom,//起点地址
  313. TASK_POSIDCUR = convPosFrom,
  314. TASK_POSIDNEXT = convPosFrom,
  315. TASK_POSIDMOVE = "",
  316. TASK_PRIORITY = 1,
  317. TASK_WKSTATUS = 1,
  318. TASK_WHID = "PVC普通立库",
  319. TASK_ADDUSERNO = "WCS",
  320. TASK_ADDDATETIME = DateTime.Now,
  321. TASK_EDITUSERNO = "WCS",
  322. TASK_EDITDATETIME = DateTime.Now,
  323. TASK_NOTES = "",
  324. TASK_RGVNO = "",
  325. TASK_BOXBARCODE = wmsno,
  326. TASK_POSIDTO = exitNo
  327. };
  328. int id = SugarBase.DB.Insertable(task).ExecuteReturnIdentity();
  329. if (id <= 0)
  330. {
  331. throw new Exception(string.Format("添加WCS读码异常任务失败"));
  332. }
  333. else
  334. {
  335. task.TASK_NO = id;
  336. }
  337. var task_dtl = new WCS_TASK_DTL()
  338. {
  339. ID = Guid.NewGuid().ToString(),
  340. PARENTID = task.TASK_NO,
  341. TASKNO = task.TASK_NO,
  342. POSIDCUR = convPosFrom,
  343. POSIDNEXT = convPosFrom,
  344. DESCRIPTION = errormsg,
  345. EXECUTEDATE = DateTime.Now
  346. };
  347. SugarBase.DB.Insertable(task_dtl).ExecuteReturnIdentity();
  348. }
  349. }
  350. else
  351. {
  352. if (string.IsNullOrWhiteSpace(cs.BarCodeStr)) throw new Exception(string.Format("输送线[{0}]存在请求信号,但没读取到条码信息。", convPosFrom));
  353. if (cs.BarCodeStr.ToUpper().Contains("ERROR") ||
  354. cs.BarCodeStr.ToUpper().Contains("N") ||
  355. cs.BarCodeStr.Contains("?"))
  356. {
  357. throw new Exception(string.Format("输送线[{0}]存在请求信号,但条码是:[{1}]存在报错,PLC应该报条码错误信号", convPosFrom, cs.BarCodeStr));
  358. }
  359. }
  360. if (task == null)
  361. {
  362. string code = TranslationBarCode(cs.BarCodeStr);
  363. task = Current.TaskSet.FirstOrDefault(v => v.TASK_BOXBARCODE == code);
  364. }
  365. if (task == null)
  366. {
  367. task = Current.TaskSet.FirstOrDefault(v => v.TASK_POSIDFROM == convPosFrom && v.TASK_POSIDCUR==convPosFrom && v.TASK_POSIDNEXT==convPosFrom && v.TASK_COMTYPE == (int)ComTypeEnum.托盘异常退回);
  368. }
  369. //if (task != null && task.TASK_COMTYPE == (int)ComTypeEnum.托盘异常退回 && task.TASK_WKSTATUS == 2)
  370. //{
  371. // int updateResult = SugarBase.DB.Updateable<WCS_TASK>(it => new WCS_TASK() { TASK_WKSTATUS = 99, TASK_EDITUSERNO = "wcs", TASK_EDITDATETIME = DateTime.Now })
  372. // .Where(it => it.TASK_NO == task.TASK_NO)
  373. // .ExecuteCommand();
  374. // if (updateResult <= 0)
  375. // {
  376. // throw new Exception(string.Format("异常任务[{0}]结束失败。", task.TASK_NO));
  377. // }
  378. // task = null;
  379. //}
  380. return task;
  381. }
  382. }
  383. }