ConvPlc04.cs 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767
  1. using SqlSugar;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading;
  7. using WCS.Data;
  8. using WCS.Data.Models;
  9. using WCS.Data.Utils;
  10. using WCS.PLC;
  11. using WCS.PLC.Model.Equipment;
  12. namespace WCS.Workflow
  13. {
  14. public class ConvPlc04 : Base_Conv
  15. {
  16. #region 只读变量
  17. private readonly string Conv_1143 = "1143";//4堆垛机出口
  18. private readonly string Conv_1141 = "1141";//5堆垛机出口
  19. private readonly string Conv_1508 = "1508";//熟化房一
  20. private readonly string Conv_1509 = "1509";//熟化房二
  21. private readonly string Conv_1136 = "1136";//熟化房入口一
  22. private readonly string Conv_1138 = "1138";//熟化房入口二
  23. private readonly string Conv_1137 = "1137";//熟化房出口一
  24. private readonly string Conv_1139 = "1139";//熟化房出口二
  25. private readonly string Conv_1161 = "1161";//2号堆垛机出库(3楼男面)
  26. private readonly string Conv_1159 = "1159";//3号堆垛机出库(3楼男面)
  27. private readonly string Conv_1160 = "1160";//3号堆垛机出库(3楼男面)
  28. private readonly string Conv_1152 = "1152";//4号堆垛机出库(3楼男面)
  29. private readonly string Conv_1151 = "1151";//5号堆垛机出库(3楼男面)
  30. private readonly string Conv_1155 = "1155";
  31. private readonly string Conv_1156 = "1156";
  32. private readonly string Conv_1157 = "1157";
  33. private readonly string Conv_1158 = "1158";
  34. #endregion;
  35. #region 重载实现
  36. public override void Run()
  37. {
  38. //刷新任务数据
  39. WCSWorkflow.RefreshData();
  40. //堆垛机出口执行
  41. SrmOutConvExeTask();
  42. //输送线执行
  43. ConveyorWriteTaskExecute();
  44. //扫描入库
  45. Conv_ScanBarCodeExeTask();
  46. //更新熟化房当前信息到数据库
  47. ThreadHelper.TaskThread(MatureRoomRefresh);
  48. //任务完成
  49. ConvTaskFinish();
  50. //熟化房申请出库熟化
  51. ThreadHelper.TaskThread(ReqestInByMatureRoom);
  52. //进入熟化房请求确认
  53. RequestInByMatureConv(Conv_1136, Conv_1508);
  54. RequestInByMatureConv(Conv_1138, Conv_1509);
  55. //熟化房完成
  56. MatureConvFinish(Conv_1137, Conv_1508);
  57. MatureConvFinish(Conv_1139, Conv_1509);
  58. //熟化房输送线请求入库
  59. RequestOutByMatureConv(Conv_1137, Conv_1508);
  60. RequestOutByMatureConv(Conv_1139,Conv_1509);
  61. }
  62. #endregion;
  63. #region 功能实现
  64. private static int _atureRoomRefresh = 0;
  65. private void MatureRoomRefresh()
  66. {
  67. if (Interlocked.Exchange(ref _atureRoomRefresh, 1) == 0)
  68. {
  69. try
  70. {
  71. Thread.Sleep(6000);
  72. var matureRoomSet = SugarBase.DB.Queryable<MatureRoomInfo>().ToList();
  73. List<string> list = new List<string>() { Conv_1508, Conv_1509 };
  74. foreach (var item in list)
  75. {
  76. var plc = Current.PlcSet.FirstOrDefault(v => v.PLC_NAME == PlcName);
  77. var conveyor = plc.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == item);
  78. var cs = conveyor.EquSignal_Conv;
  79. bool isOnLine = cs.DB521_Goodstype == 0 ? false : true;
  80. string faultMsg = cs.MatureRoomFault.ToString();
  81. var matureRoom = matureRoomSet.FirstOrDefault(v => v.MatureRoomNo == item);
  82. //修改熟化房的状态
  83. SugarBase.DB.Updateable<MatureRoomInfo>(it => new MatureRoomInfo()
  84. {
  85. MatureRoomTemperat = cs.DB521_Res04,
  86. MatureRoomDate = cs.DB521_Goodssize,
  87. MatureRoomIsOnLine = isOnLine,
  88. MatureRoomMode = cs.DB521_Goodsstart,
  89. MatureRoomTangentStatus = cs.DB521_Goodsend,
  90. MatureRoomAlaramsMsg = faultMsg
  91. })
  92. .Where(it => it.MatureRoomNo == item)
  93. .ExecuteCommand();
  94. }
  95. }
  96. catch (Exception ex)
  97. {
  98. LogMessageHelper.RecordLogMessage(ex);
  99. }
  100. finally
  101. {
  102. Interlocked.Exchange(ref _atureRoomRefresh, 0);
  103. }
  104. }
  105. }
  106. private void Conv_ScanBarCodeExeTask()
  107. {
  108. Conv_ScanningIn(Conv_1155, Conv_1155);
  109. //Conv_ScanningIn(Conv_1156, Conv_1156);
  110. //Conv_ScanningIn(Conv_1157, Conv_1157);
  111. Conv_ScanningIn(Conv_1158, Conv_1158);
  112. }
  113. private void ConvTaskFinish()
  114. {
  115. ConveyorTaskFinish(PlcName, Conv_1155, false, true);
  116. ConveyorTaskFinish(PlcName, Conv_1156, false, true);
  117. ConveyorTaskFinish(PlcName, Conv_1157, false, true);
  118. ConveyorTaskFinish(PlcName, Conv_1158, false, true);
  119. }
  120. protected override WCS_TASK ScanningCallWmsInterface(GetInTaskParam param)
  121. {
  122. if(param.EquipmentNo== Conv_1155 || param.EquipmentNo== Conv_1156 || param.EquipmentNo== Conv_1157 || param.EquipmentNo== Conv_1158)
  123. {
  124. param.Memo1 = "1";
  125. }
  126. return base.ScanningCallWmsInterface(param);
  127. }
  128. private void Conv_ScanningIn(string convNo,string exceptionConvNo, bool isCurAddressByNext=true)
  129. {
  130. try
  131. {
  132. var plc = Current.PlcSet.FirstOrDefault(v => v.PLC_NAME == PlcName);
  133. var conveyor = plc.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == convNo);
  134. var cs = conveyor.EquSignal_Conv;
  135. if (!cs.DB521_Request) return;
  136. if (cs.DB520_Confirm) return;
  137. var task = QueryTaskByBarcode(cs, convNo);
  138. if ((convNo == Conv_1155 || convNo == Conv_1158) && cs.DB521_Goodstype == 0)
  139. {
  140. LogMessageHelper.RecordLogMessage(string.Format("输送线[{0}]外捡高度为零,WCS默认标识为1", convNo), true, LogLevelEnum.INFO.ToString());
  141. }
  142. if (task == null)
  143. {
  144. var param = new GetInTaskParam();
  145. param.ContainerBarCode = cs.BarCodeStr;
  146. param.ContainerType = cs.DB521_Goodstype > 0 ? cs.DB521_Goodstype : 1;
  147. param.MatBarCode = string.Empty;
  148. param.WareHouseId = Current.Pvchouseputong;
  149. param.EquipmentNo = convNo;
  150. param.EndPostion = srm;
  151. param.Memo1 = "1";
  152. param.Memo2 = exceptionConvNo;
  153. task = ThreadHelper.TaskThread(BaseWorkflow.GetWcsInTask, param);
  154. }
  155. //判断任务是否存在,或已经执行
  156. if (task == null || task.TASK_WKSTATUS >= 2) return;
  157. var converywrite = new WCSWriteToConveyorSignal();
  158. converywrite.Plc = plc.Plc;
  159. converywrite.DBName = plc.WriteDBName;
  160. converywrite.ConveyorNo = convNo;
  161. converywrite.WriteStartAddress = cs.EquDbInfo_ReadWrite.DBReadIndox;
  162. converywrite.Tasknum = task.TASK_NO;
  163. converywrite.Goodssize = 0;//
  164. converywrite.Goodsstart = Convert.ToInt32(convNo);
  165. if (task.TASK_COMTYPE == (int)ComTypeEnum.托盘异常退回)
  166. {
  167. converywrite.Notask = true;
  168. converywrite.Goodsend = Convert.ToInt32(exceptionConvNo);
  169. }
  170. else if (SugarBase.DB.Queryable<WCS_TASK>().Any(v => v.TASK_COMTYPE == 2 && v.TASK_POSIDNEXT == convNo))
  171. {
  172. converywrite.Notask = true;
  173. converywrite.Goodsend = Convert.ToInt32(exceptionConvNo);
  174. LogMessageHelper.RecordLogMessage(string.Format("输送线[{0}]条码[{1}]不能入库,存在出库到该位置的任务。", convNo, cs.BarCodeStr), true, LogLevelEnum.INFO.ToString());
  175. }
  176. else
  177. {
  178. if (isCurAddressByNext)
  179. {
  180. converywrite.Goodsend = Convert.ToInt32(convNo);
  181. }
  182. else
  183. {
  184. var routeSet = EquRouteHelper.QueryRoute(convNo, task.TASK_POSIDTO);
  185. var route = routeSet.SingleOrDefault(v => v.ROUTE_STARTPOS == convNo);
  186. converywrite.Goodsend = Convert.ToInt32(route.ROUTE_SONPOS);
  187. }
  188. }
  189. if (convNo == Conv_1155)
  190. {
  191. LogMessageHelper.RecordLogMessage(string.Format("输送线[{0}]任务[{1}]条码[{2}]外检高度[{3}](零值默认为1)。", convNo, task.TASK_NO, cs.BarCodeStr, cs.DB521_Goodstype), true, LogLevelEnum.INFO.ToString());
  192. }
  193. WriteInfoToConv(cs, converywrite);
  194. }
  195. catch (Exception ex)
  196. {
  197. LogMessageHelper.RecordLogMessage(ex);
  198. }
  199. }
  200. private void MatureConvFinish(string convNo,string matureRoomNo)
  201. {
  202. try
  203. {
  204. var plc = Current.PlcSet.FirstOrDefault(v => v.PLC_NAME == PlcName);
  205. var conveyor = plc.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == convNo);
  206. var cs = conveyor.EquSignal_Conv;
  207. if (!cs.DB521_Request) return;
  208. if (cs.DB523_Fault) return;
  209. if (cs.DB521_Tasknum > 10000) return;
  210. //if (cs.DB521_BCR_Noread) throw new Exception(string.Format("输送线[{0}]报读码错误,但是存在请求。", convNo));
  211. //if (string.IsNullOrWhiteSpace(cs.BarCodeStr)) throw new Exception(string.Format("输送线[{0}]存在请求信号,但没读取到条码信息。", convNo));
  212. MatureRoomCache atureRooCache = null;
  213. string barcode = cs.BarCodeStr;
  214. if (barcode.ToUpper().Contains("ERROR") ||
  215. barcode.ToUpper().Contains("N") ||
  216. barcode.Contains("?") ||
  217. string.IsNullOrWhiteSpace(barcode))
  218. {
  219. if (SugarBase.DB.Queryable<WCS_TASK>().Any(v => v.TASK_COMTYPE == 1 && v.TASK_POSIDFROM == matureRoomNo &&
  220. (v.TASK_WKSTATUS <= 1 || v.TASK_WKSTATUS == 7 || v.TASK_WKSTATUS == 9 || (v.TASK_WKSTATUS == 2 && v.TASK_POSIDNEXT == convNo))))
  221. {
  222. throw new Exception(string.Format("扫码失败,熟化房[{0}]输送线[{1}]存在未完成的任务,不能重复请求生成任务,请检查熟化房与输送线对接是否存在问题。", matureRoomNo, convNo));
  223. }
  224. if (Current.TaskSet.Any(v => v.TASK_COMTYPE == 1 && v.TASK_OutMatureRoomDate != null &&
  225. (v.TASK_WKSTATUS <= 1 || v.TASK_WKSTATUS == 7 || v.TASK_WKSTATUS == 9 || (v.TASK_WKSTATUS == 2 && v.TASK_POSIDNEXT == convNo))))
  226. {
  227. throw new Exception(string.Format("扫码失败,熟化房[{0}]输送线[{1}]存在未完成的任务,不能重复请求生成任务,请检查熟化房与输送线对接是否存在问题。", matureRoomNo, convNo));
  228. }
  229. atureRooCache = SugarBase.DB.Queryable<MatureRoomCache>().Where(v => v.MatureRoomNo.Contains(matureRoomNo) && SqlFunc.IsNullOrEmpty(v.Remark)).OrderBy(v => v.InMatureRoomDate).First();
  230. barcode = atureRooCache.BARCODE;
  231. //throw new Exception(string.Format("扫码失败,熟化房[{0}]输送线[{1}]请求入库查询到队列中的条码[{2}]", matureRoomNo, convNo, barcode));
  232. LogMessageHelper.RecordLogMessage(string.Format("扫码失败,熟化房[{0}]输送线[{1}]请求入库查询到队列中的条码[{2}]", matureRoomNo, convNo, barcode), true);
  233. }
  234. else
  235. {
  236. atureRooCache = SugarBase.DB.Queryable<MatureRoomCache>().Where(v => v.MatureRoomNo.Contains(matureRoomNo) && SqlFunc.IsNullOrEmpty(v.Remark)).OrderBy(v => v.InMatureRoomDate).First();
  237. if (barcode != atureRooCache.BARCODE)
  238. {
  239. throw new Exception(string.Format("扫码成功,熟化房[{0}]读取到条码[{1}]但是与熟化房队列条码[{2}]不一致,请检查是否存在问题。", matureRoomNo, barcode, atureRooCache.BARCODE));
  240. }
  241. LogMessageHelper.RecordLogMessage(string.Format("扫码成功,读取到条码[{0}]熟化房[{1}]", barcode, matureRoomNo));
  242. }
  243. var task = Current.TaskSet.FirstOrDefault(v => v.TASK_BOXBARCODE == barcode);
  244. if (task == null) return;
  245. if (task.TASK_WKSTATUS == (int)WkStatus.熟化房熟化完成) return;
  246. if (task.TASK_WKSTATUS == (int)WkStatus.完成任务) return;
  247. if (task.TASK_WKSTATUS != (int)WkStatus.熟化房熟化中) return;
  248. if (task.TASK_WKSTATUS <= 1) return;
  249. //var matureTask = Current.TaskSet.Where(v => v.TASK_WKSTATUS == (int)WkStatus.熟化房熟化中).OrderBy(v => v.TASK_InMatureRoomDate).FirstOrDefault();
  250. //if (task.TASK_BOXBARCODE.Trim() != matureTask.TASK_BOXBARCODE.Trim())
  251. //{
  252. // throw new Exception(string.Format("熟化房[{0}]出口[{1}]扫描条码[{2}]与任务列表中条码[{3}]不一致,请检查条码问题。", matureRoomNo, convNo, cs.BarCodeStr, matureTask.TASK_BOXBARCODE));
  253. //}
  254. var roomNo = plc.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == matureRoomNo);
  255. var roomNocs = roomNo.EquSignal_Conv;
  256. int hours = roomNocs.DB521_Goodssize - 4;
  257. DateTime inMaturedate = task.TASK_InMatureRoomDate.GetValueOrDefault().AddHours(hours);
  258. if (inMaturedate > SugarBase.DB.GetDate())
  259. {
  260. throw new Exception(string.Format("条码[{0}]开始熟化时间[{1}]比要求烘烤时间低于4小时以上(严重错误),不能出库完成,请检查熟化是否存在问题。", task.TASK_BOXBARCODE, task.TASK_InMatureRoomDate, hours));
  261. }
  262. //修改状态
  263. string result = TryCachHelper.TryTranExecute((db) =>
  264. {
  265. DateTime dt = db.GetDate();
  266. int wkstatus = task.TASK_COMTYPE == 1 ? 14 : 99;
  267. if (atureRooCache.CurrentMatureNum < atureRooCache.MatureNum)
  268. {
  269. wkstatus = 14;
  270. //修改任务的状态
  271. db.Updateable<WCS_TASK>(it => new WCS_TASK()
  272. {
  273. TASK_WKSTATUS = wkstatus,
  274. TASK_POSIDCUR = convNo,
  275. TASK_EDITUSERNO = "WCS",
  276. TASK_EDITDATETIME = DateTime.Now
  277. })
  278. .Where(it => it.TASK_NO == task.TASK_NO)
  279. .ExecuteCommand();
  280. }
  281. else
  282. {
  283. //修改任务的状态
  284. db.Updateable<WCS_TASK>(it => new WCS_TASK()
  285. {
  286. TASK_WKSTATUS = wkstatus,
  287. TASK_POSIDCUR = convNo,
  288. TASK_OutMatureRoomDate = dt,
  289. TASK_EDITUSERNO = "WCS",
  290. TASK_EDITDATETIME = DateTime.Now
  291. })
  292. .Where(it => it.TASK_NO == task.TASK_NO)
  293. .ExecuteCommand();
  294. }
  295. //添加修改明细
  296. string msg = string.Format("任务[{0}]熟化房熟化完成", task.TASK_NO);
  297. CommonData.AddWCS_TASK_DTL(db, task.TASK_NO, task.TASK_NO, task.TASK_POSIDCUR, task.TASK_POSIDTO, msg);
  298. });
  299. if (!string.IsNullOrWhiteSpace(result))
  300. {
  301. throw new Exception(result);
  302. }
  303. }
  304. catch (Exception ex)
  305. {
  306. LogMessageHelper.RecordLogMessage(ex);
  307. }
  308. }
  309. private void RequestOutByMatureConv(string convNo,string matureRoomNo)
  310. {
  311. try
  312. {
  313. var plc = Current.PlcSet.FirstOrDefault(v => v.PLC_NAME == PlcName);
  314. var conveyor = plc.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == convNo);
  315. var cs = conveyor.EquSignal_Conv;
  316. if (!cs.DB521_Request) return;
  317. if (cs.DB523_Fault) return;
  318. if (cs.DB521_Tasknum > 10000) return;
  319. //if (cs.DB521_BCR_Noread) throw new Exception(string.Format("输送线[{0}]报读码错误,但是存在请求。", convNo));
  320. //if (string.IsNullOrWhiteSpace(cs.BarCodeStr)) throw new Exception(string.Format("输送线[{0}]存在请求信号,但没读取到条码信息。", convNo));
  321. string barcode = cs.BarCodeStr;
  322. WCS_TASK task = null;
  323. if (cs.BarCodeStr.ToUpper().Contains("ERROR") ||
  324. cs.BarCodeStr.ToUpper().Contains("N") ||
  325. cs.BarCodeStr.Contains("?") ||
  326. string.IsNullOrWhiteSpace(cs.BarCodeStr))
  327. {
  328. task = Current.TaskSet.SingleOrDefault(v => v.TASK_COMTYPE == 1 && v.TASK_POSIDFROM == matureRoomNo && (v.TASK_POSIDCUR == matureRoomNo || v.TASK_POSIDCUR == convNo));
  329. if (task == null)
  330. {
  331. task = Current.TaskSet.SingleOrDefault(v => v.TASK_WKSTATUS == (int)WkStatus.熟化房熟化完成 && (v.TASK_POSIDCUR == convNo || v.TASK_POSIDCUR == matureRoomNo));
  332. }
  333. }
  334. else
  335. {
  336. task = Current.TaskSet.FirstOrDefault(v => v.TASK_BOXBARCODE == barcode && v.TASK_COMTYPE == 1);
  337. if (task == null)
  338. {
  339. var matureRoom = SugarBase.DB.Queryable<MatureRoomCache>().First(v => v.BARCODE == barcode);
  340. if (matureRoom.MatureNum > 1 && matureRoom.CurrentMatureNum < matureRoom.MatureNum)
  341. {
  342. //是多次熟化任务(只支持48小时多次熟化)
  343. task = Current.TaskSet.FirstOrDefault(v => v.TASK_BOXBARCODE == barcode && v.MatureNum.GetValueOrDefault() == 4 && v.TASK_COMTYPE == 2);
  344. }
  345. }
  346. }
  347. if (task == null || task.TASK_POSIDNEXT == convNo) return;
  348. //下发任务
  349. var converywrite = new WCSWriteToConveyorSignal();
  350. converywrite.Plc = plc.Plc;
  351. converywrite.DBName = plc.WriteDBName;
  352. converywrite.ConveyorNo = convNo;
  353. converywrite.WriteStartAddress = cs.EquDbInfo_ReadWrite.DBReadIndox;
  354. converywrite.Tasknum = task.TASK_NO;
  355. converywrite.Goodssize = 0;//
  356. converywrite.Goodsstart = Convert.ToInt32(convNo);
  357. converywrite.Goodsend = converywrite.Goodsstart;
  358. WriteInfoToConvMRoom(cs, converywrite);
  359. }
  360. catch (Exception ex)
  361. {
  362. LogMessageHelper.RecordLogMessage(ex);
  363. }
  364. }
  365. private void ConveyorWriteTaskExecute()
  366. {
  367. }
  368. private void SrmOutConvExeTask()
  369. {
  370. SrmOutConvExeTask(Conv_1143, true);
  371. SrmOutConvExeTask(Conv_1141, true);
  372. SrmOutConvExeTask(Conv_1161, true);
  373. SrmOutConvExeTask(Conv_1160, false);
  374. SrmOutConvExeTask(Conv_1152, true);
  375. SrmOutConvExeTask(Conv_1151, true);
  376. }
  377. /// <summary>
  378. /// 堆垛机出口输送线任务执行(任务目标地址的下个地址只支持单一地址)
  379. /// </summary>
  380. private void SrmOutConvExeTask(string convNo, bool endPosIsCurConv = false)
  381. {
  382. try
  383. {
  384. var plc = Current.PlcSet.FirstOrDefault(v => v.PLC_NAME == PlcName);
  385. var conveyor = plc.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == convNo);
  386. var cs = conveyor.EquSignal_Conv;
  387. if (!cs.DB521_Request) return;
  388. if (cs.DB523_Fault) return;
  389. var taskSet = Current.TaskSet.Where(v => v.TASK_POSIDNEXT == convNo).ToList();
  390. var task = taskSet.SingleOrDefault(v => v.TASK_WKSTATUS == (int)WkStatus.堆垛机完成);
  391. if (task == null)
  392. {
  393. throw new Exception(string.Format("堆垛机出口输送线[{0}]存在请求信号,但没查询到任务信息。", convNo));
  394. }
  395. var converywrite = new WCSWriteToConveyorSignal();
  396. converywrite.Plc = plc.Plc;
  397. converywrite.DBName = plc.WriteDBName;
  398. converywrite.ConveyorNo = convNo;
  399. converywrite.WriteStartAddress = cs.EquDbInfo_ReadWrite.DBReadIndox;
  400. converywrite.Tasknum = task.TASK_NO;
  401. converywrite.Goodscode = 0;
  402. converywrite.Goodstype = 0;
  403. converywrite.Goodssize = 0;
  404. converywrite.Goodsstart = Convert.ToInt32(convNo);
  405. if (endPosIsCurConv)
  406. {
  407. converywrite.Goodsend = converywrite.Goodsstart;
  408. }
  409. else
  410. {
  411. var routeSet = EquRouteHelper.QueryRoute(convNo, task.TASK_POSIDTO);
  412. var routes = routeSet.Where(v => v.ROUTE_STARTPOS == convNo).ToList();
  413. if (routes.Count == 1)
  414. {
  415. converywrite.Goodsend = Convert.ToInt32(routes[0].ROUTE_SONPOS);
  416. }
  417. else
  418. {
  419. throw new Exception(string.Format("输送线[{0}]任务[{1}]请求该函数不支持多个分支输送地址,请编写扩展函数。", convNo, task.TASK_NO));
  420. }
  421. }
  422. WriteInfoToConv(cs, converywrite);
  423. }
  424. catch (Exception ex)
  425. {
  426. LogMessageHelper.RecordLogMessage(ex);
  427. }
  428. }
  429. private static int _reqestInByMatureRoom = 0;
  430. /// <summary>
  431. /// 熟化房申请出库熟化
  432. /// </summary>
  433. private void ReqestInByMatureRoom()
  434. {
  435. if (Interlocked.Exchange(ref _reqestInByMatureRoom, 1) == 0)
  436. {
  437. try
  438. {
  439. Thread.Sleep(60000);
  440. //if ((DateTime.Now.Hour == 8 && DateTime.Now.Minute >= 30) || (DateTime.Now.Hour > 8 && DateTime.Now.Hour < 14))
  441. //{
  442. if (Current.SysSets.FirstOrDefault(v => v.SET_ID == Conv_1508).SET_VALUE == "0")
  443. {
  444. ReqestInByMatureRoomItem(Conv_1508, Conv_1136);
  445. }
  446. if (Current.SysSets.FirstOrDefault(v => v.SET_ID == Conv_1509).SET_VALUE == "0")
  447. {
  448. ReqestInByMatureRoomItem(Conv_1509, Conv_1138);
  449. }
  450. //}
  451. }
  452. catch (Exception ex)
  453. {
  454. LogMessageHelper.RecordLogMessage(ex);
  455. }
  456. finally
  457. {
  458. Interlocked.Exchange(ref _reqestInByMatureRoom, 0);
  459. }
  460. }
  461. }
  462. private void ReqestInByMatureRoomItem(string convNo, string matureInConvNo)
  463. {
  464. //检测是否存在去熟化房的未执行任务
  465. if (Current.TaskSet.Any(v => v.TASK_POSIDTO == convNo && v.TASK_WKSTATUS <= 1)) return;
  466. var matureinConvNo = ConveyorHelper.GetConveyorSignal(PlcName, matureInConvNo);
  467. //if (matureinConvNo.DB521_Tasknum > 0 || matureinConvNo.CvDB51_PH_Status) return;
  468. var conv_1141 = ConveyorHelper.GetConveyorSignal(PlcName, "1141");
  469. var conv_1143 = ConveyorHelper.GetConveyorSignal(PlcName, "1143");
  470. if ((conv_1141.DB521_Tasknum > 0 || conv_1141.CvDB51_PH_Status) && (conv_1143.DB521_Tasknum > 0 || conv_1143.CvDB51_PH_Status)) return;
  471. var plc = Current.PlcSet.FirstOrDefault(v => v.PLC_NAME == PlcName);
  472. var conveyor = plc.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == convNo);
  473. var cs = conveyor.EquSignal_Conv;
  474. if (cs.DB521_Goodstype != 1) return;//检测是否在线
  475. if (cs.DB521_Goodssize < 2) return;//检测烘烤时间是否正确
  476. //if (cs.DB521_Goodsstart != 1) return;//检测是否自动状态
  477. //if (cs.DB521_Goodsend == 1) return;//切线中,不能出库到熟化
  478. if (cs.DB521_Res04 == 0) return;//熟化房温度不能为零
  479. //int mature_Count = Current.TaskSet.Count(v => v.TASK_WKSTATUS == (int)WkStatus.熟化房熟化中 && v.TASK_POSIDNEXT == convNo);
  480. var mature_InTaskCount = Current.TaskSet.Count(v => v.TASK_MatureDate == cs.DB521_Goodssize && v.TASK_MatureTemperat <= cs.DB521_Res04 && v.TASK_MatureType == 1);
  481. //var mature_InTaskCount = Current.TaskSet.Count(v => v.TASK_MatureDate == cs.DB521_Goodssize && v.TASK_MatureType == 1);
  482. var mature_OutTaskCount = Current.TaskSet.Count(v => v.TASK_POSIDTO == matureInConvNo);
  483. if ((mature_InTaskCount + mature_OutTaskCount) < 60)
  484. {
  485. var param = new GetOutTaskParam();
  486. param.OutId = convNo;
  487. param.OutEndPostion = convNo;
  488. param.OutType = 1;
  489. param.WareHouseId = Current.Pvchouseputong;
  490. param.TASK_MatureDate = cs.DB521_Goodssize;
  491. param.TASK_MatureTemperat = cs.DB521_Res04;
  492. //调用WMS接口生成出库任务
  493. ThreadHelper.TaskThread(BaseWorkflow.GetOutTask, param, 2000);
  494. }
  495. }
  496. private void RequestInByMatureConv(string convNo,string matureRoomNo)
  497. {
  498. try
  499. {
  500. var plc = Current.PlcSet.FirstOrDefault(v => v.PLC_NAME == PlcName);
  501. var conveyor = plc.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == convNo);
  502. var cs = conveyor.EquSignal_Conv;
  503. if (!cs.DB521_Request) return;
  504. if (cs.DB523_Fault) return;
  505. if (cs.CvDB51_PH_Status) return;
  506. if (cs.DB521_Tasknum == 0) return;
  507. var task = Current.TaskSet.SingleOrDefault(v => v.TASK_NO == cs.DB521_Tasknum);
  508. var converywrite = new WCSWriteToConveyorSignal();
  509. converywrite.Plc = plc.Plc;
  510. converywrite.DBName = plc.WriteDBName;
  511. converywrite.ConveyorNo = convNo;
  512. converywrite.WriteStartAddress = cs.EquDbInfo_ReadWrite.DBReadIndox;
  513. converywrite.Remark_TaskNo = cs.DB521_Tasknum.ToString();
  514. converywrite.Remark = matureRoomNo;
  515. WriteInfoToConv_Room(cs, converywrite);
  516. }
  517. catch (Exception ex)
  518. {
  519. LogMessageHelper.RecordLogMessage(ex);
  520. }
  521. }
  522. /// <summary>
  523. /// 写入任务信息到输送机
  524. /// </summary>
  525. /// <param name="converySignal"></param>
  526. /// <param name="converywrite"></param>
  527. /// <param name="isNotTask"></param>
  528. public void WriteInfoToConv_Room(ConvSignal converySignal, WCSWriteToConveyorSignal converywrite)
  529. {
  530. if (converySignal.DB520_Tasknum == converywrite.Tasknum &&
  531. converySignal.DB520_Goodscode == converywrite.Goodscode &&
  532. converySignal.DB520_Goodstype == converywrite.Goodstype &&
  533. converySignal.DB520_Goodssize == converywrite.Goodssize &&
  534. converySignal.DB520_Goodsstart == converywrite.Goodsstart &&
  535. converySignal.DB520_Goodsend == converywrite.Goodsend &&
  536. converySignal.DB520_Notask == converywrite.Notask &&
  537. converySignal.DB520_TaskDelete == converywrite.TaskDelete &&
  538. converySignal.DB520_RollerTurn == converywrite.UpMatRequest &&
  539. converySignal.DB520_Res01 == converywrite.Res01 &&
  540. converySignal.DB520_Res02 == converywrite.Res02 &&
  541. converySignal.DB520_Res03 == converywrite.Res03 &&
  542. converySignal.DB520_Res04 == converywrite.Res04)
  543. {
  544. string result = TryCachHelper.TryTranExecute((db) =>
  545. {
  546. var task = db.Queryable<WCS_TASK>().First(v => v.TASK_NO == Convert.ToInt32(converywrite.Remark_TaskNo));
  547. if (task == null) throw new Exception(string.Format("任务[{0}]未查询到信息.输送线[{1}]执行失败。", converywrite.Remark_TaskNo, converywrite.ConveyorNo));
  548. int wkstatus = (int)WkStatus.熟化房熟化中;
  549. var matureRoomItem = db.Queryable<MatureRoomCache>().First(v => v.BARCODE == task.TASK_BOXBARCODE);
  550. if (matureRoomItem == null)
  551. {
  552. DateTime dt = db.GetDate();
  553. int updatecount = db.Updateable<WCS_TASK>(it => new WCS_TASK()
  554. {
  555. TASK_WKSTATUS = wkstatus,
  556. TASK_POSIDCUR = converywrite.Remark,
  557. TASK_POSIDNEXT = converywrite.Remark,
  558. TASK_EDITUSERNO = "WCS",
  559. TASK_EDITDATETIME = DateTime.Now,
  560. TASK_InMatureRoomDate = dt
  561. })
  562. .Where(it => it.TASK_NO == task.TASK_NO).ExecuteCommand();
  563. if (updatecount <= 0)
  564. {
  565. throw new Exception(string.Format("任务[{0}]进入熟化房确认修改任务信息失败。", task.TASK_NO));
  566. }
  567. var matureRoom = new MatureRoomCache();
  568. matureRoom.BARCODE = task.TASK_BOXBARCODE;
  569. matureRoom.MatureRoomNo = converywrite.Remark;
  570. matureRoom.MatureRoomName = matureRoom.MatureRoomNo == "1509" ? "B" : "A";
  571. matureRoom.InMatureRoomDate = db.GetDate();
  572. matureRoom.CurrentMatureNum = 1;
  573. matureRoom.MatureNum = task.MatureNum.GetValueOrDefault();
  574. if (db.Insertable(matureRoom).ExecuteCommand() <= 0)
  575. {
  576. throw new Exception(string.Format("任务[{0}]进入熟化房添加熟化房条码[{1}]进入队列失败。", task.TASK_NO, task.TASK_BOXBARCODE));
  577. }
  578. }
  579. else if (matureRoomItem.CurrentMatureNum >= matureRoomItem.MatureNum)
  580. {
  581. throw new Exception(string.Format("任务[{0}]条码[{1}]进入熟化房次数不正确,请检查问题。", task.TASK_NO, task.TASK_BOXBARCODE));
  582. }
  583. else
  584. {
  585. int updatecount = db.Updateable<WCS_TASK>(it => new WCS_TASK()
  586. {
  587. TASK_WKSTATUS = wkstatus,
  588. TASK_POSIDCUR = converywrite.Remark,
  589. TASK_POSIDNEXT = converywrite.Remark,
  590. TASK_EDITUSERNO = "WCS",
  591. TASK_EDITDATETIME = DateTime.Now
  592. })
  593. .Where(it => it.TASK_NO == task.TASK_NO).ExecuteCommand();
  594. if (updatecount <= 0)
  595. {
  596. throw new Exception(string.Format("任务[{0}]进入熟化房确认修改任务信息失败。", task.TASK_NO));
  597. }
  598. int matureNum = matureRoomItem.CurrentMatureNum + 1;
  599. DateTime lastdt = db.GetDate();
  600. int updateMature = db.Updateable<MatureRoomCache>(it => new MatureRoomCache()
  601. {
  602. CurrentMatureNum = matureNum,
  603. InMatureRoomDate = lastdt,
  604. Remark = ""
  605. })
  606. .Where(it => it.BARCODE == task.TASK_BOXBARCODE).ExecuteCommand();
  607. if (updateMature <= 0)
  608. {
  609. throw new Exception(string.Format("任务[{0}]进入熟化房确认修改熟化次数信息失败。", task.TASK_NO));
  610. }
  611. }
  612. string msg = string.Format("任务[{0}]已从输送线[{1}]进入熟化房[{2}]中", converywrite.Remark_TaskNo, converywrite.ConveyorNo, converywrite.Remark);
  613. CommonData.AddWCS_TASK_DTL(db, task.TASK_NO, task.TASK_NO, task.TASK_POSIDCUR, converywrite.Remark, msg);
  614. ConfirmTask(converySignal, converywrite);
  615. });
  616. if (!string.IsNullOrWhiteSpace(result))
  617. {
  618. throw new Exception(string.Format("任务[{0}]输送机[{1}]执行失败,原因:[{1}]", converywrite.Remark_TaskNo, converywrite.ConveyorNo, result));
  619. }
  620. }
  621. else
  622. {
  623. WriteTaskToBuffer(converywrite);
  624. }
  625. }
  626. /// <summary>
  627. /// 写入任务信息到输送机
  628. /// </summary>
  629. /// <param name="converySignal"></param>
  630. /// <param name="converywrite"></param>
  631. /// <param name="isNotTask"></param>
  632. public void WriteInfoToConvMRoom(ConvSignal converySignal, WCSWriteToConveyorSignal converywrite)
  633. {
  634. if (converySignal.DB520_Tasknum == converywrite.Tasknum &&
  635. converySignal.DB520_Goodscode == converywrite.Goodscode &&
  636. converySignal.DB520_Goodstype == converywrite.Goodstype &&
  637. converySignal.DB520_Goodssize == converywrite.Goodssize &&
  638. converySignal.DB520_Goodsstart == converywrite.Goodsstart &&
  639. converySignal.DB520_Goodsend == converywrite.Goodsend &&
  640. converySignal.DB520_Notask == converywrite.Notask &&
  641. converySignal.DB520_TaskDelete == converywrite.TaskDelete &&
  642. converySignal.DB520_RollerTurn == converywrite.UpMatRequest &&
  643. converySignal.DB520_Res01 == converywrite.Res01 &&
  644. converySignal.DB520_Res02 == converywrite.Res02 &&
  645. converySignal.DB520_Res03 == converywrite.Res03 &&
  646. converySignal.DB520_Res04 == converywrite.Res04)
  647. {
  648. string result = TryCachHelper.TryTranExecute((db) =>
  649. {
  650. var task = db.Queryable<WCS_TASK>().First(v => v.TASK_NO == converywrite.Tasknum);
  651. int updatecount = db.Updateable<WCS_TASK>(it => new WCS_TASK()
  652. {
  653. TASK_WKSTATUS = (int)WkStatus.输送机执行,
  654. TASK_POSIDNEXT = converywrite.Goodsend.ToString(),
  655. //TASK_ITEM5 = converywrite.Goodsstart.ToString(),
  656. TASK_EDITUSERNO = "WCS",
  657. TASK_EDITDATETIME = DateTime.Now
  658. })
  659. .Where(it => it.TASK_NO == task.TASK_NO).ExecuteCommand();
  660. if (updatecount <= 0)
  661. {
  662. throw new Exception(string.Format("任务[{0}]出熟化房确认修改任务信息失败。", task.TASK_NO));
  663. }
  664. var matureroom = db.Queryable<MatureRoomCache>().Single(v => v.BARCODE == task.TASK_BOXBARCODE);
  665. if (matureroom == null)
  666. {
  667. throw new Exception(string.Format("任务[{0}]条码[{1}]出熟化房确认修改任务信息失败,队列中未找到该条码", task.TASK_NO));
  668. }
  669. else if (matureroom.CurrentMatureNum >= matureroom.MatureNum)
  670. {
  671. var matureRoom_dis = new MatureRoomCache_Dis();
  672. matureRoom_dis.BARCODE = task.TASK_BOXBARCODE;
  673. matureRoom_dis.MatureRoomNo = matureroom.MatureRoomNo;
  674. matureRoom_dis.MatureRoomName = matureroom.MatureRoomName;
  675. matureRoom_dis.InMatureRoomDate = matureroom.InMatureRoomDate;
  676. matureRoom_dis.OutMatureRoomDate = db.GetDate();
  677. matureRoom_dis.CurrentMatureNum = matureroom.CurrentMatureNum;
  678. matureRoom_dis.MatureNum = matureroom.MatureNum;
  679. if (db.Deleteable(matureroom).ExecuteCommand() <= 0)
  680. {
  681. throw new Exception(string.Format("任务[{0}]出熟化房删除熟化房条码[{1}]失败。", task.TASK_NO, task.TASK_BOXBARCODE));
  682. }
  683. if (db.Insertable(matureRoom_dis).ExecuteCommand() <= 0)
  684. {
  685. throw new Exception(string.Format("任务[{0}]出熟化房添加熟化房条码[{1}]到历史队列失败。", task.TASK_NO, task.TASK_BOXBARCODE));
  686. }
  687. }
  688. else
  689. {
  690. int updateMatureRoom = db.Updateable<MatureRoomCache>(it => new MatureRoomCache()
  691. {
  692. Remark = "1"
  693. })
  694. .Where(it => it.BARCODE == task.TASK_BOXBARCODE).ExecuteCommand();
  695. if (updateMatureRoom <= 0)
  696. {
  697. throw new Exception(string.Format("任务[{0}]出熟化房确认修改熟化房信息失败。", task.TASK_NO));
  698. }
  699. }
  700. string msg = string.Format("任务已下发给输送机[{0}]执行,起点地址[{1}]目标地址[{2}]", converywrite.ConveyorNo, converywrite.Goodsstart, converywrite.Goodsend);
  701. CommonData.AddWCS_TASK_DTL(db, task.TASK_NO, task.TASK_NO, task.TASK_POSIDCUR, converywrite.Goodsend.ToString(), msg);
  702. ConfirmTask(converySignal, converywrite);
  703. });
  704. if (!string.IsNullOrWhiteSpace(result))
  705. {
  706. throw new Exception(string.Format("任务[{0}]输送机[{1}]执行失败,原因:[{1}]", converywrite.Tasknum, converywrite.ConveyorNo, result));
  707. }
  708. }
  709. else
  710. {
  711. WriteTaskToBuffer(converywrite);
  712. }
  713. }
  714. #endregion;
  715. }
  716. }