From d42ad8b01195def2a9309930e14f90ff13ad47b1 Mon Sep 17 00:00:00 2001 From: 杨前锦 <1010338399@qq.com> Date: 星期四, 19 六月 2025 17:24:28 +0800 Subject: [PATCH] 印尼佳通出入库策略优化 --- HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/api/ApiHelper.cs | 2320 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 2,320 insertions(+), 0 deletions(-) diff --git a/HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/api/ApiHelper.cs b/HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/api/ApiHelper.cs new file mode 100644 index 0000000..9fe06a7 --- /dev/null +++ b/HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/api/ApiHelper.cs @@ -0,0 +1,2320 @@ +锘縰sing HH.WCS.Mobox3.FJJF.models; +using HH.WCS.Mobox3.FJJT.device; +using HH.WCS.Mobox3.FJJT.dispatch; +using HH.WCS.Mobox3.FJJT.models; +using HH.WCS.Mobox3.FJJT.process; +using HH.WCS.Mobox3.FJJT.util; +using HH.WCS.Mobox3.FJJT.wms; +using Newtonsoft.Json; +using NLog; +using NLog.Fluent; +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Reflection; +using System.Reflection.Emit; +using System.Threading; +using static HH.WCS.Mobox3.FJJT.api.ApiModel; +using static HH.WCS.Mobox3.FJJT.api.OtherModel; +using static HH.WCS.Mobox3.FJJT.api.WmsController; +using static HH.WCS.Mobox3.FJJT.util.ExcetionHelper; +using static HH.WCS.Mobox3.FJJT.util.Settings; +using static System.Net.Mime.MediaTypeNames; + +namespace HH.WCS.Mobox3.FJJT.api { + /// <summary> + /// api鎺ュ彛杈呭姪绫�+ /// </summary> + public class ApiHelper { + static ApiHelper() { + + } + + /// <summary> + /// 绌哄伐瑁呭嚭搴�+ /// </summary> + /// <param name="model"></param> + /// <returns></returns> + public static ResponseResult emptyPalletOutStock(OutStockModel model) { + ResponseResult result = new ResponseResult(); + + Location endLoc = LocationHelper.GetLoc(model.endLocCode); + if (endLoc == null) + { + WMSHelper.addAlarmRecord("娴佺▼寮傚父", "浣�, $"绌哄伐瑁呭嚭搴擄紝WMS绯荤粺鏈煡璇㈠埌缁堢偣璐т綅锛歿model.endLocCode}"); + throw new BusinessException($"绌哄伐瑁呭嚭搴擄紝WMS绯荤粺鏈煡璇㈠埌缁堢偣璐т綅锛歿model.endLocCode},璇锋鏌ョ粓鐐硅揣浣嶇紪鐮佹槸鍚︽纭�); + } + else if (endLoc.N_LOCK_STATE != 0) + { + WMSHelper.addAlarmRecord("娴佺▼寮傚父", "浣�, $"绌哄伐瑁呭嚭搴擄紝缁堢偣璐т綅锛歿model.endLocCode}澶勪簬閿佸畾鐘舵�"); + throw new BusinessException($"绌哄伐瑁呭嚭搴擄紝缁堢偣璐т綅锛歿model.endLocCode}澶勪簬閿佸畾鐘舵�"); + } + + var areaCodes = Settings.getRelAreaCodes(endLoc.S_AREA_CODE); + if (areaCodes.Count == 0) + { + WMSHelper.addAlarmRecord("娴佺▼寮傚父", "浣�, $"绌哄伐瑁呭嚭搴擄紝鏈厤缃簱鍖�{endLoc.S_AREA_CODE}鐨勫叧鑱斿叧绯�); + throw new BusinessException($"绌哄伐瑁呭嚭搴擄紝鏈厤缃簱鍖�{endLoc.S_AREA_CODE}鐨勫叧鑱斿叧绯�); + } + + Location startLoc = WMSHelper.getOutStockStartLoc(areaCodes[0], null); + if (startLoc == null) + { + WMSHelper.addAlarmRecord("娴佺▼寮傚父", "浣�, $"绌哄伐瑁呭嚭搴擄紝搴撳尯:{areaCodes[0]}鏈煡璇㈠埌绌哄伐瑁�); + throw new BusinessException($"绌哄伐瑁呭嚭搴擄紝鏈煡璇㈠埌绌哄伐瑁咃紝绔嬪簱鍙兘缂哄皯绌哄伐瑁�); + } + + var locCntrRels = LocationHelper.GetLocCntr(startLoc.S_CODE); + if (locCntrRels.Count > 0) + { + string cntrCode = locCntrRels[0].S_CNTR_CODE; + var wmsTask = new WMSTask() + { + S_CNTR_CODE = cntrCode, + S_CODE = WMSHelper.GenerateTaskNo(), + S_START_LOC = startLoc.S_CODE, + S_START_AREA = startLoc.S_AREA_CODE, + S_END_LOC = endLoc.S_CODE, + S_END_AREA = endLoc.S_AREA_CODE, + S_TYPE = "绌哄伐瑁呭嚭搴撲换鍔�, + S_OP_DEF_NAME = "绌哄伐瑁呭嚭搴�, + N_PRIORITY = 10, + T_START_TIME = DateTime.Now, + }; + + if (WMSHelper.CreateWmsTask(wmsTask)) + { + // 鍒涘缓涓�鍏ュ簱浠诲姟 + WCSTask wcsTask = new WCSTask() + { + S_OP_NAME = wmsTask.S_OP_DEF_NAME, + S_OP_CODE = wmsTask.S_CODE, + S_CODE = WCSHelper.GenerateTaskNo(), + S_CNTR_CODE = wmsTask.S_CNTR_CODE, + S_TYPE = wmsTask.S_TYPE, + S_START_LOC = startLoc.S_CODE, + S_START_AREA = startLoc.S_AREA_CODE, + S_END_LOC = endLoc.S_CODE, + S_END_AREA = endLoc.S_AREA_CODE, + S_SCHEDULE_TYPE = "WCS", + N_PRIORITY = wmsTask.N_PRIORITY, + T_START_TIME = DateTime.Now, + }; + + if (WCSHelper.CreateTask(wcsTask)) + { + // 璧风偣銆佺粓鐐瑰姞閿�+ LocationHelper.LockLoc(wcsTask.S_START_LOC, 2); + LocationHelper.LockLoc(wcsTask.S_END_LOC, 1); + + // 鏇存柊浣滀笟浠诲姟鐘舵� + wmsTask.N_B_STATE = 1; + WMSHelper.UpdateTaskState(wmsTask); + } + } + } + else + { + WMSHelper.addAlarmRecord("娴佺▼寮傚父", "涓�, $"鏌ヨ鐨勭┖宸ヨ鏈夎锛岄敊璇師鍥狅細鏈煡璇㈠埌璐т綅瀹瑰櫒鐨勭粦瀹氬叧绯�); + throw new BusinessException($"鏌ヨ绌哄伐瑁呴敊璇紝鏈煡璇㈠埌璐т綅瀹瑰櫒鐨勭粦瀹氬叧绯伙紝璇疯仈绯诲紑鍙戜汉鍛樻帓鏌�); + } + return result; + } + + /// <summary> + /// WCS璇荤爜璇锋眰娴佺▼ + /// 涓氬姟鍦烘櫙锛氳鐮佸叆搴撱�璇荤爜鍑哄簱 + /// 1.鍒ゆ柇RFID鏄惁瀛樺湪WMS绯荤粺涓紝鍚︼紝鍒欓粯璁や负RFID鏃犳硶璇嗗埆 + /// 2.鍒ゆ柇RFID鏄惁涓庝换鍔FID鏄惁涓�嚧 + /// 3.璁板綍RFID寮傚父淇℃伅 + /// </summary> + /// <param name="request"></param> + /// <returns></returns> + public static ResponseResult readCodeProcess(ReadCodeRequest request) { + ResponseResult responseResult = new ResponseResult(); + + Location loc = LocationHelper.GetLoc(request.loc); + if (loc != null) + { + var cst = WCSHelper.GetTask(request.taskNo); + if (cst != null) + { + var container = ContainerHelper.GetCntr(request.cntrNo); + if (container != null) + { + if (cst.S_CNTR_CODE != request.cntrNo) + { + ContainerHelper.UpdateCntrState(cst.S_CNTR_CODE, 1); + WMSHelper.addRfidAnomalyRecord(cst.S_CNTR_CODE, 2, request.loc, cst.S_CODE); + } + } + else + { + ContainerHelper.UpdateCntrState(cst.S_CNTR_CODE, 1); + WMSHelper.addRfidAnomalyRecord(cst.S_CNTR_CODE, 1, request.loc, cst.S_CODE); + } + + /*WCSHelper.ActivatePreCreateTask(cst.S_OP_CODE);*/ + + // 鏂规2 4.濡傛灉璇诲彇涓嶆垚鍔燂紝鏌ョ湅寮傚父鍖烘槸鍚︽湁绌鸿揣浣� + /* var agvEndLoc = WMSHelper.GetTransfeRelevanceLoc(loc.S_AREA_CODE, "4"); + if (agvEndLoc != null) + { + // 4.1 鏈�鍒欏垱寤烘惉杩愬紓甯稿尯浠诲姟 + WCSTask wcsTask = new WCSTask() + { + S_OP_NAME = cst.S_OP_NAME, + S_OP_CODE = cst.S_OP_CODE, + S_CODE = WCSHelper.GenerateTaskNo(), + S_CNTR_CODE = cst.S_CNTR_CODE, + S_TYPE = "寮傚父宸ヨ绉诲簱寮傚父鍖�, + S_START_LOC = loc.S_CODE, + S_START_AREA = loc.S_AREA_CODE, + S_END_LOC = agvEndLoc.S_CODE, + S_END_AREA = agvEndLoc.S_AREA_CODE, + S_SCHEDULE_TYPE = "AGV", + N_PRIORITY = 99, + T_START_TIME = DateTime.Now, + }; + if (WCSHelper.CreateTask(wcsTask)) + { + // 璧风偣銆佹帴椹崇偣銆佺粓鐐瑰姞閿�+ LocationHelper.LockLoc(wcsTask.S_START_LOC, 1); + LocationHelper.LockLoc(wcsTask.S_END_LOC, 1); + + WCSHelper.CancelPreCreateTask(cst.S_OP_CODE); + } + } + else + { + // 4.2 鏃�鍒欒褰曞紓甯告縺娲婚鍒涘缓浠诲姟 + WCSHelper.ActivatePreCreateTask(cst.S_OP_CODE); + }*/ + } + else + { + WMSHelper.addAlarmRecord("娴佺▼寮傚父", "浣�, $"娌℃湁鏌ヨ鍒拌鐮佺殑浠诲姟锛屼换鍔″彿:{request.taskNo}"); + } + } + else + { + WMSHelper.addAlarmRecord("娴佺▼寮傚父", "涓�, $"璇荤爜浣�{request.loc},娌℃湁鍦╓MS绯荤粺涓綍鍏�); + throw new BusinessException($"璇荤爜浣�{request.loc},娌℃湁鍦╓MS绯荤粺涓綍鍏�); + } + return responseResult; + } + + + /// <summary> + /// 婊℃枡涓嬬嚎娴佺▼ + /// 1.鍒ゆ柇RFID鏄惁璇诲彇鎴愬姛锛岃鍙栦笉鎴愬姛锛岃褰曞紓甯革紙璇诲彇澶辫触鍚庯紝涓存椂鐢熸垚涓�釜鎵樼洏鐮侊級 + /// 2.鏍规嵁RFID鏌ヨ涓棿琛紝涓嶅瓨鍦紝璁板綍寮傚父 + /// 3.鍒ゆ柇婊℃枡鎺ラ┏浣嶅搴旂殑绌哄伐瑁呯紦瀛樹綅鐘舵�锛堟煡璇㈢嚎浣撳厜鐢碉級 + /// + /// 鐩磋繛 + /// 4.闇�琛ワ紝鍒欑敓鎴愮┖宸ヨ鍑哄簱浠诲姟锛堣儙闈€�鑳庝晶鐩磋繛鎻愰珮浼樺厛绾э級 + /// 5.涓嬪彂婊℃枡鎼繍浠诲姟锛堝笜甯冪洿杩炴彁楂樹紭鍏堢骇锛�+ /// + /// 闈炵洿杩�+ /// 4.闇�琛ョ┖宸ヨ锛屽垯绌哄伐瑁呭嚭搴撲换鍔★紙瀹屾垚鍚庯紝鐢熸垚婊℃枡鎼繍浠诲姟锛屽苟鎻愰珮浼樺厛绾�9锛�+ /// 5.涓嶉渶瑕佽ˉ绌哄伐瑁咃紝鍒欑敓鎴愭弧鏂欐惉杩愪换鍔�+ /// + /// 6.璇讳换鍔′腑闂磋〃 + /// </summary> + /// <param name="model"></param> + /// <returns></returns> + public static ResponseResult offLineProcess(OffLineRequest model) { + ResponseResult responseResult = new ResponseResult(); + + var areaCodes = Settings.areaPropertyList.Select(a => a.areaCode).ToList(); + var isExistCntr = LocationHelper.checkAreaExistCntr(areaCodes,model.cntrNo); + if (!isExistCntr) + { + // 鏌ヨ璧风偣璐т綅鏄惁瀛樺湪宸插瓨鍦ㄤ换鍔★紝闃叉浠诲姟閲嶅鍙戣捣 + var existWmsTask = WMSHelper.GetWmsTaskByStart(model.loc); + if (existWmsTask == null) + { + // 鏌ヨ瀵瑰簲鏈哄彴鐨勭墿鏂欎笅绾块厤缃俊鎭�+ var logicConfig = WMSHelper.getLogicConfigByJtCode(model.jtNo); + if (logicConfig != null) + { + Container container = ContainerHelper.GetCntr(model.cntrNo); + if (container == null || !model.isNormal) + { + ContainerHelper.AddCntr(model.cntrNo); + ContainerHelper.UpdateCntrState(model.cntrNo, 1); + WMSHelper.addRfidAnomalyRecord(model.cntrNo, 1, model.loc, null); + } + + // 鏍规嵁鐗╂枡涓嬬嚎閰嶇疆淇℃伅锛屽垽鏂换鍔$被鍨嬫槸鐩磋繛涓嬬嚎杩樻槸闈炵洿杩炰笅绾�+ if (logicConfig.S_TASK_TYPE == "1" || logicConfig.S_TASK_TYPE == "2") + { + triggerItemOffLineFlow(model.loc, model.cntrNo, logicConfig); + } + else + { + // 婊℃枡涓嬬嚎锛堥潪鐩磋繛锛�+ triggerItemOffLineFlow4(model.loc, model.cntrNo, logicConfig); + } + } + else + { + WMSHelper.addAlarmRecord("娴佺▼寮傚父", "楂�, $"鏈哄彴鍙穥model.jtNo},娌℃湁鍙敤鐨勯�杈戠嚎璺�璇疯仈绯荤鐞嗕汉鍛�); + throw new BusinessException($"鏈哄彴鍙穥model.jtNo},娌℃湁鍙敤鐨勯�杈戠嚎璺紝璇疯仈绯荤鐞嗕汉鍛�); + } + } + else + { + WMSHelper.addAlarmRecord("娴佺▼寮傚父", "浣�, $"涓嬬嚎璐т綅锛歿model.loc}宸叉湁浠诲姟锛岃鍕块噸澶嶄笅鍙戜换鍔�); + throw new BusinessException($"涓嬬嚎璐т綅锛歿model.loc}宸叉湁浠诲姟锛岃鍕块噸澶嶄笅鍙戜换鍔�); + } + } + else + { + WMSHelper.addAlarmRecord("娴佺▼寮傚父", "楂�, $"宸ヨ锛歿model.cntrNo}宸插叆搴擄紝璇峰嬁閲嶅鍏ュ簱"); + throw new BusinessException($"宸ヨ锛歿model.cntrNo}宸插叆搴擄紝璇峰嬁閲嶅鍏ュ簱"); + } + return responseResult; + } + + + /// <summary> + /// 婊℃枡涓嬬嚎锛堥潪鐩磋繛锛�+ /// 1.鍒涘缓婊℃枡涓嬬嚎浣滀笟 + /// 2.鍒ゆ柇鏄惁闇�琛ョ┖宸ヨ锛岄渶瑕佸垯鍒涘缓绌哄伐瑁呰ˉ缂撳瓨浣嶄换鍔�+ /// 3.鍒ゆ柇瀹瑰櫒鏄惁鏄紓甯稿伐瑁咃紝鏄紝濡傚紓甯稿尯鏈夌┖璐т綅鍒欏垱寤哄紓甯稿伐瑁呭叆绾胯竟寮傚父鍖轰换鍔★紱鍚︼紝鍒欏垱寤烘弧鏂欏伐瑁呭叆搴撲换鍔★紙濡傞渶瑕佽ˉ绌哄伐瑁咃紝鍒欏皢浠诲姟鐘舵�鏀逛负棰勫垱寤猴紝绛夊緟琛ョ┖宸ヨ浠诲姟瀹屾垚鍚庤Е鍙戯級 + /// 4.浣滀笟鍒涘缓瀹屾垚鍚庯紝璇诲彇涓棿琛紝鏇存柊涓棿琛ㄧ姸鎬�+ /// </summary> + /// <param name="offLineLoc"></param> + /// <param name="logicConfig"></param> + /// <param name="cntrNo"></param> + /// <returns></returns> + public static bool triggerItemOffLineFlow4(string offLineLoc,string cntrNo, LogicConfig logicConfig ,LjMesTask mesTask = null) + { + bool result = true; + try + { + if (mesTask == null) + { + mesTask = WMSHelper.getLjMesTaskByCntr(cntrNo); + } + + if (mesTask != null) + { + // 2.鍒ゆ柇鏄惁闇�琛ョ┖宸ヨ锛岄渶瑕侊紝鍒欏垱寤虹┖宸ヨ鍑哄簱浠诲姟 + bool photoStatus = false; + var hcLoc = LocationHelper.GetLoc(logicConfig.S_LKBKHCLOC); + if (hcLoc != null) + { + if (hcLoc.N_CURRENT_NUM != 0 && hcLoc.N_LOCK_STATE == 0) + { + hcLoc = LocationHelper.GetEmptyLoc(hcLoc.S_AREA_CODE); + } + + if (hcLoc != null) + { + var bufferLocConfig = Settings.GetBufferLocConfig(hcLoc.S_CODE); // 缂撳瓨浣嶅叧鑱斿睘鎬�+ if (bufferLocConfig != null || hcLoc.N_CURRENT_NUM == 0) + { + photoStatus = true; + // 鏂规1锛屽鏋滈潪鐩磋繛鐨勭紦瀛樹綅鏈夊厜鐢典俊鍙凤紝鍒欐煡璇㈣澶囩姸鎬佸垽鏂槸鍚﹂渶瑕佽ˉ绌哄伐瑁�+ /* var deviceStatusDatas = WCSDispatch.getDeviceStatus(new List<string>() { bufferLocConfig.deviceNo }); + if (deviceStatusDatas != null && deviceStatusDatas.Count > 0) + { + var deviceStatus = deviceStatusDatas[0]; + if (deviceStatus.workStatus == 1 && deviceStatus.manualStatus == 0) + { + photoStatus = deviceStatus.photoStatus == 1; + } + else + { + WMSHelper.addAlarmRecord("娴佺▼寮傚父", "楂�, $"璁惧鍙�{bufferLocConfig.deviceNo},璁惧褰撳墠澶勪簬涓嶅彲鐢ㄧ姸鎬侊紝璇疯仈绯荤鐞嗕汉鍛樿皟鏁磋澶囩姸鎬�); + throw new BusinessException($"璁惧鍙�{bufferLocConfig.deviceNo},璁惧褰撳墠澶勪簬涓嶅彲鐢ㄧ姸鎬侊紝璇疯仈绯荤鐞嗕汉鍛樿皟鏁磋澶囩姸鎬�); + } + } + else + { + WMSHelper.addAlarmRecord("娴佺▼寮傚父", "楂�, $"璁惧鍙�{bufferLocConfig.deviceNo},鏌ヨ璁惧鐘舵�澶辫触锛岃鑱旂郴宸ヤ綔浜哄憳鏌ョ湅璁惧鏄惁姝e父"); + throw new BusinessException($"璁惧鍙�{bufferLocConfig.deviceNo},鏌ヨ璁惧鐘舵�澶辫触锛岃鑱旂郴宸ヤ綔浜哄憳鏌ョ湅璁惧鏄惁姝e父"); + }*/ + } + else + { + WMSHelper.addAlarmRecord("娴佺▼寮傚父", "楂�, $"缂撳瓨浣�{logicConfig.S_LKBKHCLOC},娌℃湁閰嶇疆灞炴�淇℃伅锛岃鑱旂郴绠$悊浜哄憳閰嶇疆"); + throw new BusinessException($"缂撳瓨浣�{logicConfig.S_LKBKHCLOC},娌℃湁閰嶇疆灞炴�淇℃伅锛岃鑱旂郴绠$悊浜哄憳閰嶇疆"); + } + } + } + else + { + WMSHelper.addAlarmRecord("娴佺▼寮傚父", "楂�, $"缂撳瓨浣�{logicConfig.S_LKBKHCLOC},娌℃湁WMS绯荤粺涓綍鍏�); + throw new BusinessException($"缂撳瓨浣�{logicConfig.S_LKBKHCLOC},娌℃湁WMS绯荤粺涓綍鍏�); + } + + // 绌哄伐瑁呭嚭搴撳垽鏂潯浠�+ Location kgzStartLoc = null; + Location kgzEndLoc = null; + string kgzCntrCode = null; + if (photoStatus) + { + kgzStartLoc = LocationHelper.GetLoc(logicConfig.S_LKKTJBLOC); + kgzEndLoc = LocationHelper.GetLoc(logicConfig.S_LKBKHCLOC); + if (kgzStartLoc == null) + { + WMSHelper.addAlarmRecord("娴佺▼寮傚父", "楂�, $"绌哄伐瑁呭嚭搴撶珯鍙�{logicConfig.S_LKKTJBLOC},娌℃湁鍦╓MS绯荤粺涓綍鍏�); + photoStatus = false; + } + if (kgzEndLoc == null) + { + WMSHelper.addAlarmRecord("娴佺▼寮傚父", "涓�, $"绌哄伐瑁呯紦瀛樹綅:{logicConfig.S_LKBKHCLOC},娌℃湁鍦╓MS绯荤粺涓綍鍏�); + photoStatus = false; + } + + var locCntrRels = LocationHelper.GetLocCntr(kgzStartLoc.S_CODE); + if (locCntrRels.Count > 0) + { + kgzCntrCode = locCntrRels[0].S_CNTR_CODE; + } + else + { + kgzCntrCode = "铏氭嫙瀹瑰櫒"; + WMSHelper.addAlarmRecord("娴佺▼寮傚父", "浣�, $"绌哄伐瑁呭嚭搴撶珯鍙�{logicConfig.S_LKKTJBLOC},娌℃湁绌哄伐瑁�); + } + } + + string cntrCode = mesTask.PALLET_ID; + Location startLoc = LocationHelper.GetLoc(offLineLoc); + if (startLoc != null) + { + // 1.鍒涘缓婊℃枡涓嬬嚎浣滀笟 + var wmsTask = new WMSTask() + { + S_CNTR_CODE = cntrCode, + S_CODE = WMSHelper.GenerateTaskNo(), + S_START_LOC = startLoc.S_CODE, + S_START_AREA = startLoc.S_AREA_CODE, + S_END_LOC = "铏氭嫙璐т綅", + S_END_AREA = "铏氭嫙搴撳尯", + S_TYPE = "婊℃枡/寮傚父宸ヨ鍏ュ簱浠诲姟(闈炵洿杩�", + S_OP_DEF_NAME = "婊℃枡/寮傚父宸ヨ鍏ュ簱浠诲姟(闈炵洿杩�", + S_OP_DEF_CODE = mesTask.ID.ToString(), + T_START_TIME = DateTime.Now, + }; + if (WMSHelper.CreateWmsTask(wmsTask)) + { + int priority = 10; + // 2.鍒ゆ柇鏄惁闇�琛ョ┖宸ヨ锛岄渶瑕佸垯鍒涘缓绌哄伐瑁呰ˉ缂撳瓨浣嶄换鍔�+ if (photoStatus) + { + WCSTask kgzWcsTask = new WCSTask() + { + S_OP_NAME = wmsTask.S_OP_DEF_NAME, + S_OP_CODE = wmsTask.S_CODE, + S_CODE = WCSHelper.GenerateTaskNo(), + S_CNTR_CODE = kgzCntrCode, + S_TYPE = "绌哄伐瑁呭嚭搴撲换鍔�, + S_START_LOC = kgzStartLoc.S_CODE, + S_START_AREA = kgzStartLoc.S_AREA_CODE, + S_END_LOC = kgzEndLoc.S_CODE, + S_END_AREA = kgzEndLoc.S_AREA_CODE, + S_SCHEDULE_TYPE = "AGV", + N_PRIORITY = priority, + T_START_TIME = DateTime.Now, + }; + + if (WCSHelper.CreateTask(kgzWcsTask)) + { + // 璧风偣銆佺粓鐐瑰姞閿�+ LocationHelper.LockLoc(kgzWcsTask.S_START_LOC, 2); + LocationHelper.LockLoc(kgzWcsTask.S_END_LOC, 1); + } + } + + // 3.鍒涘缓婊℃枡宸ヨ鍏ュ簱浠诲姟锛堝闇�琛ョ┖宸ヨ锛屽垯灏嗕换鍔$姸鎬佹敼涓洪鍒涘缓锛岀瓑寰呰ˉ绌哄伐瑁呬换鍔″畬鎴愬悗瑙﹀彂锛�+ WCSTask wcsTask = new WCSTask() + { + S_OP_NAME = wmsTask.S_OP_DEF_NAME, + S_OP_CODE = wmsTask.S_CODE, + S_TYPE = "婊℃枡宸ヨ鍏ュ簱浠诲姟(闈炵洿杩�", + S_CODE = WCSHelper.GenerateTaskNo(), + S_CNTR_CODE = wmsTask.S_CNTR_CODE, + S_START_LOC = startLoc.S_CODE, + S_START_AREA = startLoc.S_AREA_CODE, + S_END_LOC = wmsTask.S_END_LOC, + S_END_AREA = wmsTask.S_END_AREA, + S_SCHEDULE_TYPE = "AGV", + N_PRIORITY = 99, + T_START_TIME = DateTime.Now, + }; + + if (photoStatus) + { + wcsTask.N_B_STATE = -1; + wcsTask.S_B_STATE = "棰勫垱寤�; + } + + if (WCSHelper.CreateTask(wcsTask)) + { + // 璧风偣銆佺粓鐐瑰姞閿�+ LocationHelper.LockLoc(wcsTask.S_START_LOC, 2); + LocationHelper.LockLoc(wcsTask.S_END_LOC, 1); + + // 鏇存柊浣滀笟浠诲姟鐘舵� + wmsTask.N_B_STATE = 1; + WMSHelper.UpdateTaskState(wmsTask); + + // 4.浣滀笟鍒涘缓瀹屾垚鍚庯紝璇诲彇涓棿琛紝鏇存柊涓棿琛ㄧ姸鎬�+ WMSHelper.readLjMesOffItemTask(wmsTask.S_CODE, mesTask.ID); + } + } + } + else + { + WMSHelper.addAlarmRecord("娴佺▼寮傚父", "涓�, $"涓嬬嚎浣�{offLineLoc},娌℃湁鍦╓MS绯荤粺涓綍鍏�); + throw new BusinessException($"涓嬬嚎浣�{offLineLoc},娌℃湁鍦╓MS绯荤粺涓綍鍏�); + } + } + else + { + WMSHelper.addAlarmRecord("娴佺▼寮傚父", "涓�, $"闈炵洿杩炰笅绾胯揣浣嶏細{offLineLoc}瑙﹀彂涓嬬嚎璇锋眰锛屾湭鏌ヨ鍒癕ES浠诲姟"); + throw new BusinessException($"闈炵洿杩炰笅绾胯揣浣嶏細{offLineLoc}瑙﹀彂涓嬬嚎璇锋眰锛屾湭鏌ヨ鍒癕ES浠诲姟"); + } + } + catch (BusinessException be) + { + throw be; + } + catch (Exception ex) + { + WMSHelper.addAlarmRecord("绯荤粺閿欒", "楂�, ex.Message); + LogHelper.Error("WMS鍐呴儴閿欒锛氳Е鍙戞弧鏂欎笅绾匡紙闈炵洿杩烇級浣滀笟閿欒 ; ERROR_MGS锛� + ex.Message, ex, "WMS"); + result = false; + } + return result; + } + + /// <summary> + /// 婊℃枡涓嬬嚎锛堢洿杩烇級 + /// 1.鍒涘缓婊℃枡涓嬬嚎浣滀笟 + /// 2.鍒ゆ柇鏄惁闇�琛ョ┖宸ヨ锛岄渶瑕侊紝鍒欏垱寤虹┖宸ヨ鍑哄簱浠诲姟 + /// 3.鍒涘缓婊℃枡鍏ュ簱浠诲姟 + /// 4.鍒ゆ柇鐩磋繛妯″紡锛屽鏄儙渚х洿杩炴ā寮忥紝鍒欐彁楂樼┖宸ヨ鍑哄簱浠诲姟浼樺厛绾э紱濡傛槸甯樺竷鐩磋繛妯″紡鍒欙紝鎻愰珮婊℃枡鍏ュ簱浼樺厛绾�+ /// 5.浣滀笟鍒涘缓瀹屾垚鍚庯紝璇诲彇涓棿琛紝鏇存柊涓棿琛ㄧ姸鎬�+ /// </summary> + /// <param name="offLineLoc">涓嬬嚎璐т綅</param> + /// <param name="cntrNo">涓嬬嚎瀹瑰櫒缂栫爜</param> + /// <param name="logicConfig">閫昏緫閰嶇疆</param> + /// <returns></returns> + public static bool triggerItemOffLineFlow(string offLineLoc, string cntrNo, LogicConfig logicConfig ) { + bool result = true; + try + { + // 2.鍒ゆ柇鏄惁闇�琛ョ┖宸ヨ锛岄渶瑕侊紝鍒欏垱寤虹┖宸ヨ鍑哄簱浠诲姟 + bool photoStatus = false; + var hcLoc = LocationHelper.GetLoc(logicConfig.S_LKBKHCLOC); + if (hcLoc != null) + { + var bufferLocConfig = Settings.GetBufferLocConfig(hcLoc.S_CODE); + if (bufferLocConfig != null) + { + // 娴嬭瘯浠g爜 + photoStatus = true; + + /* // 涓氬姟浠g爜锛屽嬁鍒�+ var deviceStatusDatas = WCSDispatch.getDeviceStatus(new List<string>() { bufferLocConfig.deviceNo }); + if (deviceStatusDatas != null && deviceStatusDatas.Count > 0) + { + var deviceStatus = deviceStatusDatas[0]; + if (deviceStatus.workStatus == 1 && deviceStatus.manualStatus == 0) + { + photoStatus = deviceStatus.photoStatus == 1; + } + else + { + WMSHelper.addAlarmRecord("娴佺▼寮傚父", "楂�, $"璁惧鍙�{bufferLocConfig.deviceNo},璁惧褰撳墠澶勪簬涓嶅彲鐢ㄧ姸鎬侊紝璇疯仈绯荤鐞嗕汉鍛樿皟鏁磋澶囩姸鎬�); + throw new BusinessException($"璁惧鍙�{bufferLocConfig.deviceNo},璁惧褰撳墠澶勪簬涓嶅彲鐢ㄧ姸鎬侊紝璇疯仈绯荤鐞嗕汉鍛樿皟鏁磋澶囩姸鎬�); + } + } + else + { + WMSHelper.addAlarmRecord("娴佺▼寮傚父", "楂�, $"璁惧鍙�{bufferLocConfig.deviceNo},鏌ヨ璁惧鐘舵�澶辫触锛岃鑱旂郴宸ヤ綔浜哄憳鏌ョ湅璁惧鏄惁姝e父"); + throw new BusinessException($"璁惧鍙�{bufferLocConfig.deviceNo},鏌ヨ璁惧鐘舵�澶辫触锛岃鑱旂郴宸ヤ綔浜哄憳鏌ョ湅璁惧鏄惁姝e父"); + }*/ + } + else + { + WMSHelper.addAlarmRecord("娴佺▼寮傚父", "楂�, $"缂撳瓨浣�{logicConfig.S_LKBKHCLOC},娌℃湁閰嶇疆灞炴�淇℃伅锛岃鑱旂郴绠$悊浜哄憳閰嶇疆"); + throw new BusinessException($"缂撳瓨浣�{logicConfig.S_LKBKHCLOC},娌℃湁閰嶇疆灞炴�淇℃伅锛岃鑱旂郴绠$悊浜哄憳閰嶇疆"); + } + } + else + { + WMSHelper.addAlarmRecord("娴佺▼寮傚父", "楂�, $"缂撳瓨浣�{logicConfig.S_LKBKHCLOC},娌℃湁鍦╓MS绯荤粺涓綍鍏�); + throw new BusinessException($"缂撳瓨浣�{logicConfig.S_LKBKHCLOC},娌℃湁鍦╓MS绯荤粺涓綍鍏�); + } + + Location startLoc = LocationHelper.GetLoc(offLineLoc); + if (startLoc == null) + { + WMSHelper.addAlarmRecord("娴佺▼寮傚父", "涓�, $"涓嬬嚎浣�{offLineLoc},娌℃湁鍦╓MS绯荤粺涓綍鍏�); + throw new BusinessException($"涓嬬嚎浣�{offLineLoc},娌℃湁鍦╓MS绯荤粺涓綍鍏�); + } + + Location endLoc = WMSHelper.getInStockEndLoc(logicConfig.S_AREA_CODE, 1); + if (endLoc == null) + { + WMSHelper.addAlarmRecord("娴佺▼寮傚父", "楂�, $"搴撳唴娌℃湁绌轰綑璐т綅"); + throw new BusinessException($"搴撳唴娌℃湁绌轰綑璐т綅"); + } + + LjMesTask mesTask = WMSHelper.getLjMesTaskByCntr(cntrNo); + // 1.鍒涘缓婊℃枡涓嬬嚎浣滀笟 + var wmsTask = new WMSTask() + { + S_CNTR_CODE = cntrNo, + S_CODE = WMSHelper.GenerateTaskNo(), + S_START_LOC = startLoc.S_CODE, + S_START_AREA = startLoc.S_AREA_CODE, + S_END_LOC = endLoc.S_CODE, + S_END_AREA = endLoc.S_AREA_CODE, + S_TYPE = "婊℃枡/寮傚父宸ヨ鍏ュ簱浠诲姟(鐩磋繛)", + S_OP_DEF_NAME = "婊℃枡/寮傚父宸ヨ鍏ュ簱浠诲姟(鐩磋繛)", + S_OP_DEF_CODE = mesTask != null ? mesTask.ID.ToString() : null, + T_START_TIME = DateTime.Now, + }; + if (WMSHelper.CreateWmsTask(wmsTask)) + { + int priority = 10; + Dictionary<int, WCSTask> taskDic = new Dictionary<int, WCSTask>(); + + // 鏄惁鍒涘缓绌哄伐瑁呭嚭鍙d换鍔�+ if (photoStatus || true ) + { + Location kgzStartLoc = WMSHelper.getOutStockStartLoc(logicConfig.S_AREA_CODE, null); + Location kgzEndLoc = LocationHelper.GetLoc(logicConfig.S_LKBKHCLOC); + if (kgzStartLoc == null) + { + WMSHelper.DeleteWmsTask(wmsTask.S_CODE); + WMSHelper.addAlarmRecord("娴佺▼寮傚父", "楂�, $"搴撳尯:{logicConfig.S_AREA_CODE},娌℃湁鍙敤鐨勭┖宸ヨ"); + throw new BusinessException($"搴撳尯:{logicConfig.S_AREA_CODE},娌℃湁鍙敤鐨勭┖宸ヨ"); + } + if (kgzEndLoc == null) + { + WMSHelper.DeleteWmsTask(wmsTask.S_CODE); + WMSHelper.addAlarmRecord("娴佺▼寮傚父", "涓�, $"绌哄伐瑁呯紦瀛樹綅:{logicConfig.S_LKBKHCLOC},娌℃湁鍦╓MS绯荤粺涓綍鍏�); + throw new BusinessException($"绌哄伐瑁呯紦瀛樹綅:{logicConfig.S_LKBKHCLOC},娌℃湁鍦╓MS绯荤粺涓綍鍏�); + } + + var locCntrRels = LocationHelper.GetLocCntr(kgzStartLoc.S_CODE); + if (locCntrRels.Count > 0) + { + string kgzCntrCode = locCntrRels[0].S_CNTR_CODE; + // 濡傛槸鑳庝晶鐩磋繛妯″紡锛屽垯鎻愰珮绌哄伐瑁呭嚭搴撲换鍔′紭鍏堢骇 + if (logicConfig.S_TASK_TYPE == "1") + { + priority = 99; + } + WCSTask kgzWcsTask = new WCSTask() + { + S_OP_NAME = wmsTask.S_OP_DEF_NAME, + S_OP_CODE = wmsTask.S_CODE, + S_CODE = WCSHelper.GenerateTaskNo(), + S_CNTR_CODE = kgzCntrCode, + S_TYPE = "绌哄伐瑁呭嚭搴撲换鍔�, + S_START_LOC = kgzStartLoc.S_CODE, + S_START_AREA = kgzStartLoc.S_AREA_CODE, + S_END_LOC = kgzEndLoc.S_CODE, + S_END_AREA = kgzEndLoc.S_AREA_CODE, + S_SCHEDULE_TYPE = "WCS", + N_PRIORITY = priority, + T_START_TIME = DateTime.Now, + }; + taskDic.Add(priority, kgzWcsTask); + } + else + { + WMSHelper.DeleteWmsTask(wmsTask.S_CODE); + WMSHelper.addAlarmRecord("娴佺▼寮傚父", "楂�, $"鏌ヨ绌哄伐瑁呰揣浣嶉敊璇紝璐т綅锛歿kgzStartLoc.S_CODE}娌℃湁绌哄伐瑁�); + throw new BusinessException($"鏌ヨ绌哄伐瑁呰揣浣嶉敊璇紝璐т綅锛歿kgzStartLoc.S_CODE}娌℃湁绌哄伐瑁�); + } + } + + // 濡傛槸甯樺竷鐩磋繛妯″紡鍒欙紝鎻愰珮婊℃枡鍏ュ簱浼樺厛绾�+ if (logicConfig.S_TASK_TYPE == "2") + { + priority = 99; + } + else + { + priority = 10; + } + + WCSTask wcsTask = new WCSTask() + { + S_OP_NAME = wmsTask.S_OP_DEF_NAME, + S_OP_CODE = wmsTask.S_CODE, + S_CODE = WCSHelper.GenerateTaskNo(), + S_CNTR_CODE = wmsTask.S_CNTR_CODE, + S_TYPE = wmsTask.S_TYPE, + S_START_LOC = startLoc.S_CODE, + S_START_AREA = startLoc.S_AREA_CODE, + S_END_LOC = endLoc.S_CODE, + S_END_AREA = endLoc.S_AREA_CODE, + S_SCHEDULE_TYPE = "WCS", + N_PRIORITY = priority, + T_START_TIME = DateTime.Now, + }; + taskDic.Add(priority, wcsTask); + + var tasks = taskDic.OrderByDescending(a => a.Key).Select(a => a.Value).ToList(); + foreach (var task in tasks) + { + if (WCSHelper.CreateTask(task)) + { + // 璧风偣銆佺粓鐐瑰姞閿�+ LocationHelper.LockLoc(task.S_START_LOC, 2); + LocationHelper.LockLoc(task.S_END_LOC, 1); + } + } + + // 鏇存柊浣滀笟浠诲姟鐘舵� + wmsTask.N_B_STATE = 1; + WMSHelper.UpdateTaskState(wmsTask); + + // 5.浣滀笟鍒涘缓瀹屾垚鍚庯紝璇诲彇涓棿琛紝鏇存柊涓棿琛ㄧ姸鎬�+ if (mesTask != null) + { + WMSHelper.readLjMesOffItemTask(wmsTask.S_CODE, mesTask.ID); + } + else + { + ContainerHelper.UpdateCntrState(cntrNo, 1); + WMSHelper.addRfidAnomalyRecord(cntrNo, 3, offLineLoc, null); + } + } + } + catch (BusinessException be) + { + throw be; + } + catch (Exception ex) + { + // 鎶ヨ锛歐MS鍐呴儴閿欒锛氳Е鍙戞弧鏂欏伐瑁呬笅绾夸綔涓氶敊璇�+ WMSHelper.addAlarmRecord("绯荤粺閿欒", "楂�, ex.Message); + LogHelper.Info($"WMS鍐呴儴閿欒锛氳Е鍙戞弧鏂欏伐瑁呬笅绾夸綔涓氶敊璇�; 閿欒鍘熷洜锛歿ex.Message}", "WMS"); + result = false; + } + return result; + } + + /// <summary> + /// 鍙枡璇锋眰 + /// 1.鏌ヨ涓棿琛紝鍒ゆ柇鏄惁鏄幆甯︾墿鏂�+ /// 2.鏌ヨ搴撳尯鐗╂枡淇℃伅锛屽苟杩囨护鏁呴殰鐨勫爢鍨涙満绔嬪簱 + /// 3.鏃犲簱瀛樺啓鍏ヤ腑闂磋〃寮傚父鍜屽紓甯稿師鍥�+ /// 4.璁$畻鍑哄簱璐т綅锛岀敓鎴愬嚭搴撲换鍔�+ /// </summary> + /// <param name="model"></param> + /// <returns></returns> + public static ResponseResult callMaterialProcess(CallMaterialRequest model) + { + ResponseResult responseResult = new ResponseResult(); + var mesTask = WMSHelper.getLjMesTaskByLoc(model.loc); + if (mesTask != null) + { + Location endLoc = LocationHelper.GetLoc(model.loc); + Location startLoc = null; + Location middleLoc = null; + string scheduleType = ""; + if (mesTask.PALLET_TYPE == "鐜甫") + { + scheduleType = "HDK"; + // 鏌ヨ鐜甫搴撹鐗╂枡搴撳瓨鎯呭喌锛屽苟姣旇緝涓庝腑杞簱鐨勫簱瀛樿繘琛屾瘮杈冿紝鍏堝叆鍏堝嚭 + } + else + { + scheduleType = "WCS"; + // 鏌ヨ搴撳尯鐗╂枡淇℃伅锛屾牴鎹厛鍏ュ厛鍑哄師鍒欒绠楋紝鐗╂枡璧风偣 + startLoc = WMSHelper.getOutStockStartLoc(null, mesTask.MATERIAL_CODE); + } + + if (startLoc == null) + { + // 鏃犲簱瀛樺啓鍏ヤ腑闂磋〃寮傚父鍜屽紓甯稿師鍥�+ mesTask.RETURN_CODE = "6"; + mesTask.RECEIVE_MSG = "娌℃湁搴撳瓨鎴栬澶囨晠闅滄棤娉曞嚭搴�; + WMSHelper.updateLjMesTask(mesTask); + + WMSHelper.addAlarmRecord("娴佺▼寮傚父", "浣�, $"MES鍙枡浠诲姟{mesTask.ID},娌℃湁搴撳瓨鎴栬澶囨晠闅滄棤娉曞嚭搴�); + responseResult.code = 1; + responseResult.msg = "娌℃湁搴撳瓨鎴栬澶囨晠闅滄棤娉曞嚭搴�; + return responseResult; + } + + middleLoc = WMSHelper.GetMinTaskTransfeLoc(startLoc.S_AREA_CODE, 2 , 2); + if (middleLoc == null) { + WMSHelper.addAlarmRecord("娴佺▼寮傚父", "楂�, $"MES鍙枡浠诲姟{mesTask.ID},绔嬪簱鎺ラ┏浣嶅彲鑳藉浜庨攣瀹氭垨绂佺敤鐘舵�锛岃鏌ョ湅"); + responseResult.code = 1; + responseResult.msg = "绔嬪簱鎺ラ┏浣嶅彲鑳藉浜庨攣瀹氭垨绂佺敤鐘舵�"; + return responseResult; + } + + String cntrCode = ""; + var locCntrs = LocationHelper.GetLocCntr(startLoc.S_CODE); + if (locCntrs != null && locCntrs.Count > 0) + { + cntrCode = locCntrs[0].S_CNTR_CODE; + } + + var wmsTask = new WMSTask() + { + S_CNTR_CODE = "", + S_CODE = WMSHelper.GenerateTaskNo(), + S_START_LOC = startLoc.S_CODE, + S_START_AREA = startLoc.S_AREA_CODE, + S_END_LOC = endLoc.S_CODE, + S_END_AREA = endLoc.S_AREA_CODE, + S_TYPE = "婊℃枡鍑哄簱浠诲姟", + N_PRIORITY = 10, + T_START_TIME = DateTime.Now, + }; + + if (WMSHelper.CreateWmsTask(wmsTask)) + { + // 鍒涘缓涓�鍏ュ簱浠诲姟 + WCSTask wcsTask = new WCSTask() + { + S_OP_NAME = wmsTask.S_OP_DEF_NAME, + S_OP_CODE = wmsTask.S_CODE, + S_CODE = WCSHelper.GenerateTaskNo(), + S_CNTR_CODE = wmsTask.S_CNTR_CODE, + S_TYPE = wmsTask.S_TYPE, + S_START_LOC = startLoc.S_CODE, + S_START_AREA = startLoc.S_AREA_CODE, + S_END_LOC = middleLoc.S_CODE, + S_END_AREA = middleLoc.S_AREA_CODE, + S_SCHEDULE_TYPE = scheduleType, + N_PRIORITY = wmsTask.N_PRIORITY, + T_START_TIME = DateTime.Now, + }; + + if (WCSHelper.CreateTask(wcsTask)) + { + // 璧风偣銆佺粓鐐瑰姞閿�+ LocationHelper.LockLoc(wcsTask.S_START_LOC, 2); + LocationHelper.LockLoc(wcsTask.S_END_LOC, 1); + LocationHelper.LockLoc(wmsTask.S_END_LOC, 1); + + // 鏇存柊浣滀笟浠诲姟鐘舵� + wmsTask.N_B_STATE = 1; + WMSHelper.UpdateTaskState(wmsTask); + WMSHelper.updateMesTaskStatus("", "2"); + + // 浠诲姟鍒涘缓鎴愬姛璇诲彇MES浠诲姟 + WMSHelper.readLjMesCallItemTask("", mesTask.ID); + } + } + } + else + { + WMSHelper.addAlarmRecord("娴佺▼寮傚父", "楂�, $"MES鍙枡浠诲姟{mesTask.ID},MES涓棿琛ㄦ病鏈夎绾胯竟璐т綅鐨勫彨鏂欎换鍔★紝璇锋煡鐪�); + responseResult.code = 1; + responseResult.msg = "MES涓棿琛ㄦ病鏈夎绾胯竟璐т綅鐨勫彨鏂欎换鍔�; + } + return responseResult; + } + + + /// <summary> + /// WCS浠诲姟鐘舵�鍥炴姤 + /// 浠诲姟鐘舵� 1锛氬紑濮�鎵ц涓紱瀹屾垚锛�锛氬噯澶囧彇璐э紱4锛氬彇璐у畬鎴愶紱5锛氬噯澶囧嵏璐э紱6锛氬嵏璐у畬鎴愶紱7锛氬紓甯稿彇娑堬紱8锛氬己鍒跺畬鎴�+ /// 1.鏍规嵁浠诲姟鐘舵�鍥炴姤鏇存柊璐т綅鐘舵�銆佷换鍔$姸鎬�+ /// 2.鏇存柊浠诲姟涓棿琛ㄧ姸鎬�+ /// 4.鏇存柊鍑哄簱浠诲姟涓棿琛ㄧ姸鎬�+ /// </summary> + /// <param name="model"></param> + /// <returns></returns> + public static ResponseResult taskStatusFeedback(TaskStatusFeedbackModel model) + { + ResponseResult responseResult = new ResponseResult(); + WCSTask cst = WCSHelper.GetTask(model.taskNo); + if (cst != null) + { + WMSTask mst = WMSHelper.GetWmsTask(cst.S_OP_CODE); + if (mst != null) + { + switch (model.status) + { + case 1: + WCSHelper.Begin(cst); + WMSHelper.updateMesTaskStatus(mst.S_CODE, "2"); + if (cst.S_TYPE.Contains("鍑哄簱")) + { + WMSHelper.addLotOutTask(mst.S_START_LOC); + } + break; + case 2: + WCSHelper.End(cst); + break; + case 3: + WCSHelper.UpdateStatus(cst, "鍑嗗鍙栬揣"); + break; + case 4: + WCSHelper.UpdateStatus(cst, "鍙栬揣瀹屾垚"); + TaskProcess.OperateStatus(cst, 4); + break; + case 5: + WCSHelper.UpdateStatus(cst, "鍑嗗鍗歌揣"); + break; + case 6: + WCSHelper.UpdateStatus(cst, "鍗歌揣瀹屾垚"); + TaskProcess.OperateStatus(cst, 6); + break; + case 7: + WCSHelper.UpdateStatus(cst, "寮傚父鍙栨秷"); + TaskProcess.OperateStatus(cst, 7); + mst.N_B_STATE = 3; + WMSHelper.UpdateTaskState(mst); + WMSHelper.updateMesTaskStatus(mst.S_CODE, "5", "WCS寮傚父鍙栨秷浠诲姟"); + WMSHelper.addAlarmRecord("娴佺▼寮傚父", "楂�, $"WCS寮傚父鍙栨秷浠诲姟锛屼换鍔″彿锛歿cst.S_CODE}"); + break; + case 8: + WCSHelper.UpdateStatus(cst, "寮哄埗瀹屾垚"); + break; + } + // 娣诲姞WCS鍔ㄤ綔璁板綍 + WCSHelper.AddActionRecord(model.taskNo, model.status, model.deviceNo, model.loc); + + if (model.status == 2 || model.status == 8) + { + + if (cst.S_TYPE.Contains("鍏ュ簱")) + { + var cntrItemRels = ContainerHelper.GetCntrItemRel(cst.S_CNTR_CODE); + if (cntrItemRels != null && cntrItemRels.Count > 0) + { + foreach (var cntrItem in cntrItemRels) + { + cntrItem.T_INBOUND_TIME = DateTime.Now; + ContainerHelper.updateCntrItemRel(cntrItem); + } + } + } + + if (cst.S_TYPE.Contains("銆愬紓甯搞�")) + { + WCSHelper.ActivatePreCreateTask(mst.S_CODE, 1); + } + else + { + WCSHelper.ActivatePreCreateTask(mst.S_CODE); + } + + if (WMSHelper.isFinishTask(mst.S_CODE)) + { + // 鏇存柊浣滀笟浠诲姟鐘舵� + mst.N_B_STATE = 2; + mst.T_END_TIME = DateTime.Now; + WMSHelper.UpdateTaskState(mst); + + // 鏇存柊浠诲姟涓棿琛ㄧ姸鎬�+ WMSHelper.updateMesTaskStatus(mst.S_CODE, "3"); + + if (cst.S_TYPE.Contains("鍑哄簱")) + { + // 鏇存柊鍑哄簱浠诲姟涓棿琛ㄧ姸鎬�+ WMSHelper.updateLotOutTask(cst.S_CNTR_CODE, "2"); + } + } + } + } + } + return responseResult; + } + + /// <summary> + /// WCS鐢宠缁堢偣 + /// </summary> + /// <param name="model"></param> + /// <returns></returns> + public static ResponseResult applyDest(ApplyDestinationModel model) { + ResponseResult result = new ResponseResult(); + + ApplyDest applyDest = new ApplyDest(); + WCSTask cst = WCSHelper.GetTask(model.taskNo); + if (cst != null && cst.N_B_STATE < 3) + { + WMSTask mst = WMSHelper.GetWmsTask(cst.S_OP_CODE); + if (mst != null && mst.N_B_STATE < 2) { + + int emptyFlag = 0; // 瀹瑰櫒绌烘弧鏍囪瘑 + var cntrItemRels = ContainerHelper.GetCntrItemRel(cst.S_CNTR_CODE); + if (cntrItemRels.Count > 0) { + emptyFlag = 1; + } + + // 1锛氬爢鍨涙満鏀捐揣寮傚父鐢宠鏂扮粓鐐�+ if (model.applyType == 1) { + // 鎶ヨ锛氭祦绋嬪紓甯�+ WMSHelper.addAlarmRecord("娴佺▼寮傚父", "涓�, $"鍫嗗灈鏈烘斁璐у紓甯革紝浠诲姟鍙凤細{cst.S_CODE}锛屽紓甯歌揣浣嶏細{cst.S_END_LOC}"); + + // 1.灏嗗紓甯歌揣浣嶄笂閿侊紝骞舵姤璀�+ LocationHelper.LockLoc(cst.S_END_LOC, 3); + + // 2.鏌ヨ鏂扮殑鍏ュ簱缁堢偣 + Location endLoc = WMSHelper.getInStockEndLoc(cst.S_END_AREA, emptyFlag ); + cst.S_END_LOC = endLoc.S_CODE; + WCSHelper.UpdateEndLoc(cst); + + LocationHelper.LockLoc(endLoc.S_CODE, 1); + applyDest.destLoc = endLoc.S_CODE; + } + } + } + result.data = applyDest; + return result; + } + + /// <summary> + /// AGV鐢宠缁堢偣 + /// 椤哄簭 RFID楠岃瘉 -> RFID涓庝换鍔″彿楠岃瘉 -> 鐗╂枡鍚堟牸鐘舵�楠岃瘉 -> 铏氭嫙缁堢偣 + /// 鐢宠绫诲瀷锛�1.铏氭嫙缁堢偣 2.RFID涓庝换鍔′笉鍖归厤 3.鐗╂枡鐘舵�涓嶅悎鏍�+ /// 鍏ュ簱绛栫暐锛氬厛璁$畻搴撳尯鐨勫绉巼锛屽啀璁$畻搴撳尯瀵瑰簲鐨勫叆搴撶珯鍙扮殑浠诲姟鏁帮紝閮藉彇鏈�皬鐨�+ /// + /// 1.纭畾浠诲姟鏄惁鍦ㄦ墽琛屼腑 + /// 2.鍒ゆ柇鐢宠绫诲瀷 + /// 1).铏氭嫙缁堢偣锛岃绠楀叆搴撶珯鍙帮紝鍚屾椂棰勫厛鐢熸垚鍏ュ簱绔欏彴-绔嬪簱缁堢偣鐨勬惉杩愪换鍔�+ /// 2).RFID楠岃瘉澶辫触,璁板綍寮傚父锛屽苟璁$畻寮傚父鍖虹殑绌鸿揣浣�+ /// 3).RFID涓庝换鍔′笉鍖归厤锛岃褰曞紓甯稿苟鎶ヨ锛屽苟璁$畻寮傚父鍖虹殑绌鸿揣浣�+ /// 4).鐗╂枡鐘舵�涓嶅悎鏍�璁板綍寮傚父锛岃绠楀叆搴撶珯鍙帮紝鍚屾椂棰勫厛鐢熸垚鍏ュ簱绔欏彴-绔嬪簱缁堢偣鐨勬惉杩愪换鍔�锛涙渶鍚庨噸鏂扮敓鎴愭柊鐨勫嚭搴撲换鍔�+ /// + /// 3. 2)\3) 寮傚父鍖烘病鏈夌┖璐т綅锛岃绠楀叆搴撶珯鍙帮紝鍚屾椂棰勫厛鐢熸垚鍏ュ簱绔欏彴-绔嬪簱缁堢偣鐨勬惉杩愪换鍔�+ /// + /// 4.浣欐枡/绌哄伐瑁呭洖搴撲换鍔�+ /// 1).鏍规嵁RFID鏌ヨ涓棿琛紝鍒ゆ柇鐗╂枡绫诲瀷,濡備负绌哄伐瑁咃紝姝e父鍏ュ簱锛堣绠楀叆搴撶珯鍙帮紝鐢熸垚棰勫垱寤烘惉杩愪换鍔★級 + /// 2).濡傛槸浣欐枡锛屾煡璇㈡槸鍚︽湁浣欐枡鏈夊叧鐨勫彨鏂欎换鍔★紝涓旀湭鎵ц锛屽垯鍙栨秷鍙枡浠诲姟锛屼慨鏀圭粓鐐逛负璇ュ彨鏂欑粓鐐�+ /// 3).濡傛病鏈夌浉鍏冲彨鏂欎换鍔★紝鍒欐甯稿叆搴�+ /// + /// 5.绌哄伐瑁呭嚭搴撳拰鎴愬瀷鏈哄彨鏂欎换鍔★紝褰撶敵璇风被鍨嬩负2,3,4鏄紝闇�閲嶆柊鐢熸垚浠诲姟 + /// </summary> + /// <param name="taskNo"></param> + /// <param name="loc"></param> + /// <param name="trayCode"></param> + /// <param name="applyType">1.姝e父 2.寮傚父</param> + /// <returns></returns> + public static string AGVApplyDest(string taskNo ,string loc ,string trayCode,string applyType) + { + LogHelper.Info($"AGV鐢宠缁堢偣锛屼换鍔″彿锛歿taskNo},褰撳墠浣嶇疆锛歿loc},鐢宠绫诲瀷锛歿applyType}", "HosttoagvTask"); + string applyDest = null; + try + { + WCSTask cst = WCSHelper.GetTask(taskNo); + if (cst != null && cst.N_B_STATE < 3) + { + WMSTask mst = WMSHelper.GetWmsTask(cst.S_OP_CODE); + if (mst != null && mst.N_B_STATE < 2) + { + // 闃叉閲嶅鐢宠 + if ((applyType != "1" && !cst.S_TYPE.Contains("銆愬紓甯搞�")) || (applyType == "1" && cst.S_END_LOC.Contains("铏氭嫙璐т綅"))) + { + // 鏂滆绔嬪簱 + if (mst.S_OP_DEF_NAME.Contains("鏂滆")) + { + applyDest = applyAgvDestXC(applyType, mst, cst); + } + else + { + applyDest = applyAgvDest(applyType, loc, mst, cst); + } + } + } + } + } + catch (Exception ex) + { + WMSHelper.addAlarmRecord("绯荤粺閿欒","楂�, $"AGV鐢宠缁堢偣锛學MS鍐呴儴閿欒锛岄敊璇師鍥狅細{ex.Message}", "AGV"); + } + return null; + } + + /// <summary> + /// 鏂滆绔嬪簱浠诲姟锛孉GV鐢宠缁堢偣 + /// 1).鏍规嵁RFID鏌ヨ涓棿琛紝鍒ゆ柇鐗╂枡绫诲瀷,濡備负绌哄伐瑁咃紝姝e父鍏ュ簱锛堣绠楀叆搴撶珯鍙帮紝鐢熸垚棰勫垱寤烘惉杩愪换鍔★級 + /// 2).濡傛槸浣欐枡锛屾煡璇㈡槸鍚︽湁浣欐枡鏈夊叧鐨勫彨鏂欎换鍔★紝涓旀湭鎵ц锛屽垯鍙栨秷鍙枡浠诲姟锛屼慨鏀圭粓鐐逛负璇ュ彨鏂欑粓鐐�+ /// </summary> + /// <param name="applyType"></param> + /// <param name="mst"></param> + /// <param name="cst"></param> + /// <returns></returns> + public static string applyAgvDestXC(string applyType, WMSTask mst, WCSTask cst) + { + string destLoc = null; + Location agvEndLoc = null; + Location wmsEndLoc = null; + if (applyType == "1") + { + if (mst.S_TYPE == "浣欐枡/绌哄伐瑁呭叆搴�) + { + var bo = int.TryParse(mst.S_OP_DEF_CODE, out int mesId); + if (bo) + { + var mesTask = WMSHelper.GetLjMesTaskById(mesId); + if (mesTask.QTY != 0) + { + var awaitTask = WMSHelper.GetAwaitWmsTaskByMaterialCode(mesTask.MATERIAL_CODE); + if (awaitTask != null) + { + // 鍙栨秷浠诲姟 + ApiHelper.cancelTask(awaitTask.S_CODE); + // 淇敼缁堢偣 + agvEndLoc = LocationHelper.GetLoc(awaitTask.S_END_LOC); + wmsEndLoc = agvEndLoc; + mst.S_TYPE = "鍙枡鍑哄簱浠诲姟"; + } + } + } + } + } + + if (agvEndLoc == null) + { + string msg = ""; + if (applyType == "2" || applyType == "3" || applyType == "4") + { + cst.S_TYPE = cst.S_TYPE + "銆愬紓甯搞�"; + msg = "宸ヨ寮傚父"; + } + + // TODO 鍙嶉鏂滆绔嬪簱寮傚父锛岃姹傛枩瑁佸叆搴撶粓鐐�+ agvEndLoc = null; + + } + + if (agvEndLoc != null) + { + destLoc = agvEndLoc.S_CODE; + + cst.S_END_LOC = agvEndLoc.S_CODE; + cst.S_END_AREA = agvEndLoc.S_AREA_CODE; + WCSHelper.UpdateEndLoc(cst); + } + + if (wmsEndLoc != null) + { + mst.S_END_LOC = wmsEndLoc.S_CODE; + mst.S_END_AREA = wmsEndLoc.S_AREA_CODE; + WMSHelper.UpdateTaskEnd(mst); + } + return destLoc; + } + + /// <summary> + /// AGV鐢宠缁堢偣 + /// 鍦烘櫙锛�.浣欐枡/绌哄伐瑁呭叆搴撲换鍔★紙鎴愬瀷鏈猴級 2.婊℃枡/绌哄伐瑁呭叆搴擄紙鏈哄彴锛�3.婊℃枡/绌哄伐瑁呭嚭搴撳紓甯�4.婊℃枡/绌哄伐瑁呭叆搴撳紓甯�+ /// </summary> + /// <param name="applyType">1.姝e父 2.RFID涓庝换鍔FID涓嶅尮閰�3.鐗╂枡鐘舵�涓嶅悎鏍�/param> + /// <param name="loc"></param> + /// <param name="mst"></param> + /// <param name="cst"></param> + /// <returns></returns> + public static string applyAgvDest(string applyType,string loc, WMSTask mst, WCSTask cst) + { + LogHelper.Info($"寮�鐢宠AGV缁堢偣", "AGV"); + string destLoc = null; + Location agvEndLoc = null; + Location wmsEndLoc = null; + Location currentLoc = LocationHelper.GetLoc(loc); + + // RFID 妫�祴姝e父 + if (applyType == "1") + { + // 鍦烘櫙锛�.浣欐枡/绌哄伐瑁呭叆搴撲换鍔�+ // 1).鏍规嵁RFID鏌ヨ涓棿琛紝鍒ゆ柇鐗╂枡绫诲瀷,濡備负绌哄伐瑁咃紝姝e父鍏ュ簱锛堣绠楀叆搴撶珯鍙帮紝鐢熸垚棰勫垱寤烘惉杩愪换鍔★級 + // 2).濡傛槸浣欐枡锛屾煡璇㈡槸鍚︽湁浣欐枡鏈夊叧鐨勫彨鏂欎换鍔★紝涓旀湭鎵ц锛屽垯鍙栨秷鍙枡浠诲姟锛屼慨鏀圭粓鐐逛负璇ュ彨鏂欑粓鐐�+ if (cst.S_TYPE.Contains("浣欐枡/绌哄伐瑁呭叆搴�)) + { + LogHelper.Info($"浣欐枡/绌哄伐瑁呭叆搴撲换鍔★紝鍒ゆ柇鏄惁鍥炲簱鎴栧彂寰�彨鏂欑偣", "AGV"); + var mesTask = WMSHelper.GetLjMesTaskById(int.Parse(mst.S_OP_DEF_CODE)); + if (mesTask.QTY != 0) + { + var awaitTask = WMSHelper.GetAwaitWmsTaskByMaterialCode(mesTask.MATERIAL_CODE); + if (awaitTask != null) + { + LogHelper.Info($"浣欐枡/绌哄伐瑁呭叆搴撲换鍔★紝瀛樺湪绛夊緟鐨勫彨鏂欎换鍔★紝鍙戝線鍙枡鐐�, "AGV"); + // 鍙栨秷浠诲姟 + ApiHelper.cancelTask(awaitTask.S_CODE); + // 淇敼缁堢偣 + agvEndLoc = LocationHelper.GetLoc(awaitTask.S_END_LOC); + + cst.S_TYPE = "鍙枡鍑哄簱浠诲姟"; + mst.S_TYPE = mst.S_TYPE + "銆愬彨鏂欍�"; + } + } + } + + // 鍦烘櫙锛�.婊℃枡/绌哄伐瑁呭叆搴�2.浣欐枡/绌哄伐瑁呭叆搴�+ if (agvEndLoc == null && cst.S_TYPE.Contains("鍏ュ簱")) + { + LogHelper.Info($"濡傛病鏈夋弧瓒虫潯浠剁殑agv缁堢偣璐т綅锛屽垯鍙戝線绔嬪簱", "AGV"); + Container container = ContainerHelper.GetCntr(cst.S_CNTR_CODE); + if (container != null) + { + wmsEndLoc = WMSHelper.getInStockEndLoc(null, container.N_DETAIL_COUNT == 0 ? 0 : 1, container.N_TYPE); + if (wmsEndLoc != null) + { + agvEndLoc = WMSHelper.GetMinTaskTransfeLoc(wmsEndLoc.S_AREA_CODE, 1, 2); // 1.绔嬪簱鎺ラ┏浣�1.鍏ュ簱 2.闈炵洿杩�+ if (agvEndLoc != null) + { + LogHelper.Info($"鍒涘缓绔嬪簱绔欏彴鍒扮珛搴撶殑棰勫垱寤轰换鍔★紝agv缁堢偣璐т綅:{agvEndLoc.S_CODE},绔嬪簱缁堢偣璐т綅:{wmsEndLoc.S_CODE}", "AGV"); + // 棰勫厛鐢熸垚鍏ュ簱绔欏彴-绔嬪簱缁堢偣鐨勬惉杩愪换鍔�+ WCSTask wcsTask = new WCSTask() + { + S_OP_NAME = mst.S_OP_DEF_NAME, + S_OP_CODE = mst.S_CODE, + S_CODE = WCSHelper.GenerateTaskNo(), + S_CNTR_CODE = cst.S_CNTR_CODE, + S_TYPE = mst.S_TYPE, + S_START_LOC = agvEndLoc.S_CODE, + S_START_AREA = agvEndLoc.S_AREA_CODE, + S_END_LOC = wmsEndLoc.S_CODE, + S_END_AREA = wmsEndLoc.S_AREA_CODE, + S_SCHEDULE_TYPE = "WCS", + N_PRIORITY = 10, + N_B_STATE = -1, + T_START_TIME = DateTime.Now, + }; + if (WCSHelper.CreateTask(wcsTask)) + { + // 璧风偣銆佺粓鐐瑰姞閿�+ LocationHelper.LockLoc(wcsTask.S_START_LOC, 1); + LocationHelper.LockLoc(wcsTask.S_END_LOC, 1); + } + } + else + { + WMSHelper.addAlarmRecord("娴佺▼寮傚父", "楂�, $"AGV鐢宠缁堢偣澶辫触锛岀珛搴�{wmsEndLoc.S_AREA_CODE}鏈厤缃珛搴撴帴椹充綅"); + return null; + } + } + else + { + WMSHelper.addAlarmRecord("娴佺▼寮傚父", "楂�, $"AGV鐢宠缁堢偣澶辫触锛屾湭鏌ヨ鍒扮┖浣欑珛搴撹揣浣�); + return null; + } + } + else + { + WMSHelper.addAlarmRecord("娴佺▼寮傚父", "楂�, $"AGV鐢宠缁堢偣澶辫触锛屾湭鏌ヨ鍒板鍣ㄧ紪鐮�{cst.S_CNTR_CODE}鐨勫鍣�); + return null; + } + } + } + + // 鍦烘櫙锛�.婊℃枡/绌哄伐瑁呭嚭搴撳紓甯�2.婊℃枡/绌哄伐瑁呭叆搴撳紓甯革紙绌哄伐瑁呭嚭搴撳紓甯�銆佹弧鏂欏叆搴撳紓甯革級 + if (applyType == "2" ) + { + WCSHelper.CancelPreCreateTask(mst.S_CODE); + mst.S_TYPE = mst.S_TYPE + "銆愬紓甯搞�"; + + // 1.寮傚父宸ヨ浼樺厛鍙戝線寮傚父鍖�+ LogHelper.Info($"寮傚父宸ヨ浼樺厛鍙戝線寮傚父鍖�, "AGV"); + agvEndLoc = WMSHelper.getAbnormalAreaLoc(currentLoc.S_AREA_CODE); + if (agvEndLoc != null) + { + wmsEndLoc = agvEndLoc; + } + else + { + LogHelper.Info($"寮傚父鍖烘病鏈夌┖璐т綅锛屽彂寰�珛搴�, "AGV"); + } + + // 2.寮傚父鍖烘病鏈夌┖璐т綅锛屽垯鍙戝線绔嬪簱 + if (agvEndLoc == null) + { + LogHelper.Info($"濡傛病鏈夋弧瓒虫潯浠剁殑agv缁堢偣璐т綅锛屽垯鍙戝線绔嬪簱", "AGV"); + Container container = ContainerHelper.GetCntr(cst.S_CNTR_CODE); + if (container != null) + { + wmsEndLoc = WMSHelper.getInStockEndLoc(null, container.N_DETAIL_COUNT == 0 ? 0 : 1, container.N_TYPE); + if (wmsEndLoc != null) + { + agvEndLoc = WMSHelper.GetMinTaskTransfeLoc(wmsEndLoc.S_AREA_CODE, 1, 2); // 1.绔嬪簱鎺ラ┏浣�1.鍏ュ簱 2.闈炵洿杩�+ if (agvEndLoc != null) + { + LogHelper.Info($"鍒涘缓绔嬪簱绔欏彴鍒扮珛搴撶殑棰勫垱寤轰换鍔★紝agv缁堢偣璐т綅:{agvEndLoc.S_CODE},绔嬪簱缁堢偣璐т綅:{wmsEndLoc.S_CODE}", "AGV"); + // 棰勫厛鐢熸垚鍏ュ簱绔欏彴-绔嬪簱缁堢偣鐨勬惉杩愪换鍔�+ WCSTask wcsTask = new WCSTask() + { + S_OP_NAME = mst.S_OP_DEF_NAME, + S_OP_CODE = mst.S_CODE, + S_CODE = WCSHelper.GenerateTaskNo(), + S_CNTR_CODE = cst.S_CNTR_CODE, + S_TYPE = cst.S_TYPE + "銆愬紓甯搞�", + S_START_LOC = agvEndLoc.S_CODE, + S_START_AREA = agvEndLoc.S_AREA_CODE, + S_END_LOC = wmsEndLoc.S_CODE, + S_END_AREA = wmsEndLoc.S_AREA_CODE, + S_SCHEDULE_TYPE = "WCS", + N_PRIORITY = 10, + N_B_STATE = -1, + S_B_STATE = "棰勫垱寤�, + T_START_TIME = DateTime.Now, + }; + if (WCSHelper.CreateTask(wcsTask)) + { + // 璧风偣銆佺粓鐐瑰姞閿�+ LocationHelper.LockLoc(wcsTask.S_START_LOC, 1); + LocationHelper.LockLoc(wcsTask.S_END_LOC, 1); + cst.S_TYPE = cst.S_TYPE + "銆愬紓甯搞�"; + } + } + else + { + WMSHelper.addAlarmRecord("娴佺▼寮傚父", "楂�, $"AGV鐢宠缁堢偣澶辫触锛屾湭鏌ヨ鍒扮珛搴撴帴椹充綅"); + return null; + } + } + else + { + WMSHelper.addAlarmRecord("娴佺▼寮傚父", "楂�, $"AGV鐢宠缁堢偣澶辫触锛屾湭鏌ヨ鍒扮┖浣欑珛搴撹揣浣�); + return null; + } + } + else + { + WMSHelper.addAlarmRecord("娴佺▼寮傚父", "楂�, $"AGV鐢宠缁堢偣澶辫触锛屾湭鏌ヨ鍒板鍣ㄧ紪鐮�{cst.S_CNTR_CODE}鐨勫鍣�); + return null; + } + } + } + + if (agvEndLoc != null && wmsEndLoc != null) + { + destLoc = agvEndLoc.S_CODE; + cst.S_END_LOC = agvEndLoc.S_CODE; + cst.S_END_AREA = agvEndLoc.S_AREA_CODE; + WCSHelper.UpdateEndLoc(cst); + + mst.S_END_LOC = wmsEndLoc.S_CODE; + mst.S_END_AREA = wmsEndLoc.S_AREA_CODE; + WMSHelper.UpdateTaskEnd(mst); + } + + // 閲嶆柊鍙戣捣鏂颁换鍔�+ if (applyType != "1") + { + var mesTask = WMSHelper.GetLjMesTaskByAgvorderId(mst.S_CODE); + if (mesTask != null) + { + if (mst.S_TYPE.Contains("鍙枡鍑哄簱浠诲姟")) + { + LogHelper.Info($"鍙枡鍑哄簱浠诲姟寮傚父锛屽啀娆″彂璧峰彨鏂欏嚭搴撲换鍔�, "AGV"); + callMaterial(mesTask.MATERIAL_CODE, mesTask.POSITION_ID, mesTask.ID); + } + + // 婊℃枡涓嬬嚎锛堥潪鐩磋繛锛�+ if (mst.S_TYPE.Contains("婊℃枡/寮傚父宸ヨ鍏ュ簱浠诲姟") && cst.S_TYPE.Contains("绌哄伐瑁呭嚭搴撲换鍔�)) + { + LogHelper.Info($"婊℃枡/寮傚父宸ヨ鍏ュ簱浠诲姟寮傚父锛屽啀娆″彂璧锋弧鏂�寮傚父宸ヨ鍏ュ簱浠诲姟", "AGV"); + var logicConfig = WMSHelper.getLogicConfigByJtCode(mesTask.EQP); + if (logicConfig != null) + { + triggerItemOffLineFlow4(mesTask.POSITION_ID, mst.S_CNTR_CODE, logicConfig ,mesTask); + } + else + { + WMSHelper.addAlarmRecord("娴佺▼寮傚父", "楂�, $"MES浠诲姟{mesTask.ID},鏈哄彴鍙凤細{mesTask.EQP},鏈煡璇㈠埌閫昏緫绾胯矾", "AGV"); + } + } + } + } + return destLoc; + } + + /// <summary> + /// 鎴愭柊鏈哄彨鏂�+ /// </summary> + /// <param name="materialCode"></param> + /// <param name="jtNo"></param> + /// <param name="mesTaskId"></param> + public static void callMaterial(string materialCode, string jtNo, int mesTaskId) + { + string cntrCode = ""; + var mesTask = WMSHelper.GetLjMesTaskById(mesTaskId); + + if (mesTask != null) + { + Location endLoc = WMSHelper.getCallMaterialLocCode(jtNo); + if (endLoc != null) + { + Location middleLoc = null; + Location startLoc = WMSHelper.getOutStockStartLoc(null, materialCode); + if (startLoc != null) + { + var locCntrRels = LocationHelper.GetLocCntr(startLoc.S_CODE); + if (locCntrRels.Count > 0) + { + cntrCode = locCntrRels[0].S_CNTR_CODE; + middleLoc = WMSHelper.GetTransfeRelevanceLoc(startLoc.S_AREA_CODE, 1, 2); + if (middleLoc != null) + { + // 1.鍒涘缓鎴愭柊鏈哄彨鏂欎綔涓�+ var wmsTask = new WMSTask() + { + S_CNTR_CODE = cntrCode, + S_CODE = WMSHelper.GenerateTaskNo(), + S_START_LOC = startLoc.S_CODE, + S_START_AREA = startLoc.S_AREA_CODE, + S_END_LOC = endLoc.S_CODE, + S_END_AREA = endLoc.S_AREA_CODE, + S_TYPE = "鍙枡鍑哄簱浠诲姟", + S_OP_DEF_CODE = mesTaskId.ToString(), + S_OP_DEF_NAME = "鎴愬瀷鏈哄彨鏂欏嚭搴撲换鍔�, + T_START_TIME = DateTime.Now, + }; + if (WMSHelper.CreateWmsTask(wmsTask)) + { + WCSTask wcsTask = new WCSTask() + { + S_OP_NAME = wmsTask.S_OP_DEF_NAME, + S_OP_CODE = wmsTask.S_CODE, + S_CODE = WCSHelper.GenerateTaskNo(), + S_CNTR_CODE = wmsTask.S_CNTR_CODE, + S_TYPE = wmsTask.S_TYPE, + S_START_LOC = startLoc.S_CODE, + S_START_AREA = startLoc.S_AREA_CODE, + S_END_LOC = middleLoc.S_CODE, + S_END_AREA = middleLoc.S_AREA_CODE, + S_SCHEDULE_TYPE = "WCS", + N_PRIORITY = 10, + T_START_TIME = DateTime.Now, + }; + + if (WCSHelper.CreateTask(wcsTask)) + { + // 璧风偣銆佺粓鐐瑰姞閿�+ LocationHelper.LockLoc(wcsTask.S_START_LOC, 2); + LocationHelper.LockLoc(wcsTask.S_END_LOC, 1); + + // 鏇存柊浣滀笟浠诲姟鐘舵� + wmsTask.N_B_STATE = 1; + WMSHelper.UpdateTaskState(wmsTask); + } + + // 棰勫垱寤轰簩娈典换鍔�+ WCSTask twoWcsTask = new WCSTask() + { + S_OP_NAME = wmsTask.S_OP_DEF_NAME, + S_OP_CODE = wmsTask.S_CODE, + S_CODE = WCSHelper.GenerateTaskNo(), + S_CNTR_CODE = wmsTask.S_CNTR_CODE, + S_TYPE = wmsTask.S_TYPE, + S_START_LOC = middleLoc.S_CODE, + S_START_AREA = middleLoc.S_AREA_CODE, + S_END_LOC = endLoc.S_CODE, + S_END_AREA = endLoc.S_AREA_CODE, + S_SCHEDULE_TYPE = "AGV", + N_PRIORITY = 10, + T_START_TIME = DateTime.Now, + N_B_STATE = -1 + }; + WCSHelper.CreateTask(twoWcsTask); + WMSHelper.readLjMesCallItemTask(wmsTask.S_CODE, mesTaskId); + } + } + else + { + WMSHelper.addAlarmRecord("娴佺▼寮傚父", "楂�, $"鎴愬瀷鏈哄彨鏂欏け璐ワ紝搴撳尯{startLoc.S_AREA_CODE}鏈煡璇㈠埌鍙敤鐨勬帴椹充綅"); + } + } + else + { + WMSHelper.addAlarmRecord("娴佺▼寮傚父", "楂�, $"鎴愬瀷鏈哄彨鏂欏け璐ワ紝寮�璐т綅:{startLoc.S_CODE}寮傚父锛岀己灏戝鍣ㄤ俊鎭�); + } + } + else + { + mesTask.AWAIT_MSG = "搴撳瓨涓嶈冻"; + WMSHelper.updateLjMesTask(mesTask); + WMSHelper.addAlarmRecord("娴佺▼寮傚父", "楂�, $"鎴愬瀷鏈哄彨鏂欏け璐ワ紝鐗╂枡:{materialCode}搴撳瓨涓嶈冻"); + } + } + } + + } + + /// <summary> + /// 鎴愭柊鏈哄彨鏂�鐜甫搴� + /// 1.鏌ヨ鐜甫搴撶墿鏂欏簱瀛�+ /// 2.鏌ヨ涓浆搴撳簱瀛橈紝鏍规嵁鍏ュ簱鏃堕棿 杩涜鍏堝叆鍏堝嚭 + /// 3.濡傛灉涓虹幆甯﹀簱鐗╂枡锛屽垯灏唌es浠诲姟鍐欏叆鐜甫搴撲换鍔′腑闂磋〃 + /// </summary> + /// <param name="materialCode"></param> + /// <param name="endLocCode"></param> + /// <param name="mesTaskId"></param> + public static void callMaterialXC(string materialCode, string endLocCode, int mesTaskId) + { + // 1.鏌ヨ鐜甫搴撶墿鏂欏簱瀛�+ DateTime inStockTimeXc = DateTime.MinValue; + List<CntrItemRel> cntrItemRelsXc = new List<CntrItemRel>(); + if (cntrItemRelsXc.Count > 0) + { + inStockTimeXc = cntrItemRelsXc[0].T_INBOUND_TIME; + } + + // 2.鏌ヨ涓浆搴撳簱瀛�+ DateTime inStockTime = DateTime.MinValue; + var cntrItemRels = WMSHelper.getZZKInventoryInfo(materialCode); + if (cntrItemRels.Count > 0) + { + inStockTime = cntrItemRels[0].T_INBOUND_TIME; + } + + // 3.鏍规嵁鍏堣繘鍏堝嚭璁$畻鍑哄簱鐨勭墿鏂欐槸鐜甫搴�杩樻槸涓浆搴�+ var mesTask = WMSHelper.GetLjMesTaskById(mesTaskId); + if (inStockTime >= inStockTimeXc) + { + //鏂滆鐗╂枡鍑哄簱 + if (cntrItemRelsXc.Count > 0) + { + // 4.灏哅ES浠诲姟鍐欏叆鐜甫搴撲换鍔′腑闂磋〃 + WMSHelper.addLjXcTask(mesTask); + } + } + else + { + //涓浆搴撶墿鏂欏嚭搴�+ if (cntrItemRels.Count > 0) + { + var cntrItemRel = cntrItemRels[0]; + var locCntrRel = LocationHelper.GetLocCntrByCntr(cntrItemRel.S_CNTR_CODE); + if (locCntrRel != null) + { + var endLoc = LocationHelper.GetLoc(locCntrRel.S_LOC_CODE); + if (endLoc != null) + { + Location middleLoc = null; + Location startLoc = WMSHelper.getOutStockStartLoc(null, materialCode); + if (startLoc != null) + { + var locCntrRels = LocationHelper.GetLocCntr(startLoc.S_CODE); + if (locCntrRels.Count > 0) + { + var cntrCode = cntrItemRel.S_CNTR_CODE; + middleLoc = WMSHelper.GetTransfeRelevanceLoc(startLoc.S_AREA_CODE, 1, 2); + if (middleLoc != null) + { + // 1.鍒涘缓鎴愭柊鏈哄彨鏂欎綔涓�+ var wmsTask = new WMSTask() + { + S_CNTR_CODE = cntrCode, + S_CODE = WMSHelper.GenerateTaskNo(), + S_START_LOC = startLoc.S_CODE, + S_START_AREA = startLoc.S_AREA_CODE, + S_END_LOC = endLoc.S_CODE, + S_END_AREA = endLoc.S_AREA_CODE, + S_TYPE = "鍙枡鍑哄簱浠诲姟", + S_OP_DEF_CODE = mesTaskId.ToString(), + S_OP_DEF_NAME = "鎴愬瀷鏈哄彨鏂欏嚭搴撲换鍔�, + T_START_TIME = DateTime.Now, + }; + if (WMSHelper.CreateWmsTask(wmsTask)) + { + WCSTask wcsTask = new WCSTask() + { + S_OP_NAME = wmsTask.S_OP_DEF_NAME, + S_OP_CODE = wmsTask.S_CODE, + S_CODE = WCSHelper.GenerateTaskNo(), + S_CNTR_CODE = wmsTask.S_CNTR_CODE, + S_TYPE = wmsTask.S_TYPE, + S_START_LOC = startLoc.S_CODE, + S_START_AREA = startLoc.S_AREA_CODE, + S_END_LOC = middleLoc.S_CODE, + S_END_AREA = middleLoc.S_AREA_CODE, + S_SCHEDULE_TYPE = "WCS", + N_PRIORITY = 10, + T_START_TIME = DateTime.Now, + }; + + if (WCSHelper.CreateTask(wcsTask)) + { + // 璧风偣銆佺粓鐐瑰姞閿�+ LocationHelper.LockLoc(wcsTask.S_START_LOC, 2); + LocationHelper.LockLoc(wcsTask.S_END_LOC, 1); + + // 鏇存柊浣滀笟浠诲姟鐘舵� + wmsTask.N_B_STATE = 1; + WMSHelper.UpdateTaskState(wmsTask); + } + + // 棰勫垱寤轰簩娈典换鍔�+ WCSTask twoWcsTask = new WCSTask() + { + S_OP_NAME = wmsTask.S_OP_DEF_NAME, + S_OP_CODE = wmsTask.S_CODE, + S_CODE = WCSHelper.GenerateTaskNo(), + S_CNTR_CODE = wmsTask.S_CNTR_CODE, + S_TYPE = wmsTask.S_TYPE, + S_START_LOC = middleLoc.S_CODE, + S_START_AREA = middleLoc.S_AREA_CODE, + S_END_LOC = endLoc.S_CODE, + S_END_AREA = endLoc.S_AREA_CODE, + S_SCHEDULE_TYPE = "AGV", + N_PRIORITY = 10, + T_START_TIME = DateTime.Now, + N_B_STATE = -1 + }; + WCSHelper.CreateTask(twoWcsTask); + WMSHelper.readLjMesCallItemTask(wmsTask.S_CODE, mesTaskId); + } + } + else + { + WMSHelper.addAlarmRecord("娴佺▼寮傚父", "楂�, $"鎴愬瀷鏈哄彨鏂欏け璐ワ紝搴撳尯{startLoc.S_AREA_CODE}鏈煡璇㈠埌鍙敤鐨勬帴椹充綅"); + } + } + else + { + WMSHelper.addAlarmRecord("娴佺▼寮傚父", "楂�, $"鎴愬瀷鏈哄彨鏂欏け璐ワ紝寮�璐т綅:{startLoc.S_CODE}寮傚父锛岀己灏戝鍣ㄤ俊鎭�); + } + } + else + { + mesTask.AWAIT_MSG = "搴撳瓨涓嶈冻"; + WMSHelper.updateLjMesTask(mesTask); + WMSHelper.addAlarmRecord("娴佺▼寮傚父", "楂�, $"鎴愬瀷鏈哄彨鏂欏け璐ワ紝鐗╂枡:{materialCode}搴撳瓨涓嶈冻"); + } + } + } + } + } + } + + /// <summary> + /// 浣欐枡/绌烘墭鍥炲簱 + /// + /// 1.鏌ヨ鎴愬瀷鏈哄彨鏂欑粓鐐瑰搴旂殑 浣欐枡/绌烘墭杩斿洖浣�+ /// 2.鏌ヨmes浠诲姟涓棿琛ㄦ槸鍚﹀瓨鍦ㄨ繑鏂欎换鍔�+ /// 3.鍒涘缓浣欐枡鍥炲簱浣滀笟锛屽垱寤篴gv鎼繍浠诲姟锛岃櫄鎷熺粓鐐�+ /// </summary> + /// <param name="locCode">鎴愬瀷鏈哄彨鏂欑粓鐐�/param> + /// <param name="jtNo">鎴愬瀷鏈哄彨鏂欑粓鐐�/param> + public static void returnMaterialOrEmptyTray(string locCode ,string jtNo) + { + if (locCode != null) + { + var mesTask = WMSHelper.getLjMesTaskByJtNo(jtNo); + if (mesTask != null) + { + createReturnTask(locCode, mesTask); + } + } + } + + /// <summary> + /// 鍒涘缓浣欐枡/绌哄伐瑁呰繑鍥炰换鍔�+ /// </summary> + /// <param name="locCode"></param> + /// <param name="mesTask"></param> + public static void createReturnTask(string locCode ,LjMesTask mesTask) { + Location startLoc = LocationHelper.GetLoc(locCode); + Location endLoc = new Location() { S_CODE = "铏氭嫙璐т綅", S_AREA_CODE = "铏氭嫙搴撳尯" }; + + string suffix = ""; + if (mesTask.PALLET_TYPE == "5" || mesTask.PALLET_TYPE == "6") { + suffix = "(鏂滆)"; + } + + var wmsTask = new WMSTask() + { + S_CNTR_CODE = mesTask.PALLET_ID, + S_CODE = WMSHelper.GenerateTaskNo(), + S_START_LOC = startLoc.S_CODE, + S_START_AREA = startLoc.S_AREA_CODE, + S_END_LOC = endLoc.S_CODE, + S_END_AREA = endLoc.S_AREA_CODE, + S_TYPE = "浣欐枡/绌哄伐瑁呭叆搴撲换鍔� + suffix, + S_OP_DEF_CODE = mesTask.ID.ToString(), + S_OP_DEF_NAME = "浣欐枡/绌哄伐瑁呭叆搴� + suffix, + T_START_TIME = DateTime.Now + }; + if (WMSHelper.CreateWmsTask(wmsTask)) + { + // 鍒涘缓涓�鍏ュ簱浠诲姟 + WCSTask wcsTask = new WCSTask() + { + S_OP_NAME = wmsTask.S_OP_DEF_NAME, + S_OP_CODE = wmsTask.S_CODE, + S_CODE = WCSHelper.GenerateTaskNo(), + S_CNTR_CODE = wmsTask.S_CNTR_CODE, + S_TYPE = wmsTask.S_TYPE, + S_START_LOC = startLoc.S_CODE, + S_START_AREA = startLoc.S_AREA_CODE, + S_END_LOC = endLoc.S_CODE, + S_END_AREA = endLoc.S_AREA_CODE, + S_SCHEDULE_TYPE = "AGV", + N_PRIORITY = 99, + T_START_TIME = DateTime.Now, + }; + if (WCSHelper.CreateTask(wcsTask)) + { + // 璧风偣銆佹帴椹崇偣銆佺粓鐐瑰姞閿�+ LocationHelper.LockLoc(wcsTask.S_START_LOC, 2); + LocationHelper.LockLoc(wcsTask.S_END_LOC, 1); + + // 鏇存柊浣滀笟浠诲姟鐘舵� + wmsTask.N_B_STATE = 1; + WMSHelper.UpdateTaskState(wmsTask); + + WMSHelper.readLjMesOffItemTask(wmsTask.S_CODE, mesTask.ID); + } + } + } + + /// <summary> + /// 涓嶅悎鏍煎搧鍥炲簱 + /// 1.鍒涘缓鍥炲簱浠诲姟 + /// 2.閲嶆柊鍙戣捣鏂扮殑鍙枡浠诲姟 + /// </summary> + /// <param name="mst"></param> + /// <param name="cst"></param> + /// <returns></returns> + public static bool rejectReturnStock(WMSTask mst, WCSTask cst) + { + bool result = true; + + Location startLoc = LocationHelper.GetLoc(cst.S_END_LOC); + Location agvEndLoc = null; + Location wmsEndLoc = null; + // 鏂滆绔嬪簱 + if (mst.S_OP_DEF_NAME.Contains("鏂滆")) + { + // TODO 鍙嶉鏂滆绔嬪簱寮傚父锛岃姹傛枩瑁佸叆搴撶粓鐐�+ agvEndLoc = null; + wmsEndLoc = agvEndLoc; + + if (agvEndLoc != null) + { + // 棰勫厛鐢熸垚鍏ュ簱绔欏彴-绔嬪簱缁堢偣鐨勬惉杩愪换鍔�+ WCSTask wcsTask = new WCSTask() + { + S_OP_NAME = mst.S_OP_DEF_NAME, + S_OP_CODE = mst.S_CODE, + S_CODE = WCSHelper.GenerateTaskNo(), + S_CNTR_CODE = cst.S_CNTR_CODE, + S_TYPE = "涓嶅悎鏍煎搧鍥炲簱", + S_START_LOC = startLoc.S_CODE, + S_START_AREA = startLoc.S_AREA_CODE, + S_END_LOC = agvEndLoc.S_CODE, + S_END_AREA = agvEndLoc.S_AREA_CODE, + S_SCHEDULE_TYPE = "AGV", + N_PRIORITY = 10, + T_START_TIME = DateTime.Now, + }; + + if (WCSHelper.CreateTask(wcsTask)) + { + // 璧风偣銆佹帴椹崇偣銆佺粓鐐瑰姞閿�+ LocationHelper.LockLoc(wcsTask.S_START_LOC, 1); + LocationHelper.LockLoc(wcsTask.S_END_LOC, 1); + } + } + } + else + { + Container container = ContainerHelper.GetCntr(cst.S_CNTR_CODE); + wmsEndLoc = WMSHelper.getInStockEndLoc(null, container.N_DETAIL_COUNT == 0 ? 0 : 1, container.N_TYPE); + if (wmsEndLoc != null) + { + agvEndLoc = WMSHelper.GetMinTaskTransfeLoc(wmsEndLoc.S_AREA_CODE, 1, 2); // 1.绔嬪簱鎺ラ┏浣�1.鍏ュ簱 2.闈炵洿杩�+ if (agvEndLoc != null) + { + // 棰勫厛鐢熸垚鍏ュ簱绔欏彴-绔嬪簱缁堢偣鐨勬惉杩愪换鍔�+ WCSTask oneWcsTask = new WCSTask() + { + S_OP_NAME = mst.S_OP_DEF_NAME, + S_OP_CODE = mst.S_CODE, + S_CODE = WCSHelper.GenerateTaskNo(), + S_CNTR_CODE = cst.S_CNTR_CODE, + S_TYPE = "涓嶅悎鏍煎搧鍥炲簱", + S_START_LOC = startLoc.S_CODE, + S_START_AREA = startLoc.S_AREA_CODE, + S_END_LOC = agvEndLoc.S_CODE, + S_END_AREA = agvEndLoc.S_AREA_CODE, + S_SCHEDULE_TYPE = "AGV", + N_PRIORITY = 10, + T_START_TIME = DateTime.Now, + }; + + if (WCSHelper.CreateTask(oneWcsTask)) + { + // 璧风偣銆佹帴椹崇偣銆佺粓鐐瑰姞閿�+ LocationHelper.LockLoc(oneWcsTask.S_START_LOC, 1); + LocationHelper.LockLoc(oneWcsTask.S_END_LOC, 1); + } + + // 棰勫厛鐢熸垚鍏ュ簱绔欏彴-绔嬪簱缁堢偣鐨勬惉杩愪换鍔�+ WCSTask twoWcsTask = new WCSTask() + { + S_OP_NAME = mst.S_OP_DEF_NAME, + S_OP_CODE = mst.S_CODE, + S_CODE = WCSHelper.GenerateTaskNo(), + S_CNTR_CODE = cst.S_CNTR_CODE, + S_TYPE = "涓嶅悎鏍煎搧鍥炲簱", + S_START_LOC = agvEndLoc.S_CODE, + S_START_AREA = agvEndLoc.S_AREA_CODE, + S_END_LOC = wmsEndLoc.S_CODE, + S_END_AREA = wmsEndLoc.S_AREA_CODE, + S_SCHEDULE_TYPE = "WCS", + N_PRIORITY = 10, + N_B_STATE = -1, + T_START_TIME = DateTime.Now, + }; + + if (WCSHelper.CreateTask(twoWcsTask)) + { + // 璧风偣銆佹帴椹崇偣銆佺粓鐐瑰姞閿�+ LocationHelper.LockLoc(twoWcsTask.S_START_LOC, 1); + LocationHelper.LockLoc(twoWcsTask.S_END_LOC, 1); + } + } + } + + var bo = int.TryParse(mst.S_OP_DEF_CODE, out int mesId); + if (bo) + { + var mesTask = WMSHelper.GetLjMesTaskById(mesId); + callMaterial(mesTask.MATERIAL_CODE, mesTask.POSITION_ID, mesTask.ID); + } + } + return result; + } + + + /// <summary> + /// 鏌ヨ瀹瑰櫒鐗╂枡淇℃伅锛堜腑闂磋〃锛�+ /// </summary> + /// <param name="model"></param> + /// <returns></returns> + public static ResponseResult findTrayItemInfo(FindTrayItemInfoModel model) { + ResponseResult responseResult = new ResponseResult(); + var cntrItemRels = ContainerHelper.GetCntrItemRel(model.cntrNo); + if (cntrItemRels != null && cntrItemRels.Count > 0) { + TrayItemInfo trayItemInfo = new TrayItemInfo() + { + S_SERIAL_NO = cntrItemRels[0].S_SERIAL_NO, + S_ITEM_CODE = cntrItemRels[0].S_ITEM_CODE, + S_ITEM_NAME = cntrItemRels[0].S_ITEM_NAME, + S_ITEM_SPEC = cntrItemRels[0].S_ITEM_SPEC, + S_ITEM_STATE = cntrItemRels[0].S_ITEM_STATE, + N_ITEM_STATE = cntrItemRels[0].N_ITEM_STATE, + S_BATCH_NO = cntrItemRels[0].S_BATCH_NO, + F_QTY = cntrItemRels[0].F_QTY, + S_UOM = cntrItemRels[0].S_UOM, + S_CNTR_CODE = cntrItemRels[0].S_CNTR_CODE, + D_PRD_DATE = cntrItemRels[0].D_PRD_DATE, + D_EXP_DATE = cntrItemRels[0].D_EXP_DATE, + D_EXP_DATE1 = cntrItemRels[0].D_EXP_DATE1, + }; + responseResult.data = trayItemInfo; + } + return responseResult; + } + + + + /// <summary> + /// 璁惧鎶ヨ鍙嶉 + /// </summary> + /// <param name="model"></param> + /// <returns></returns> + public static ResponseResult notifyAlarm(DeviceAlertorFeedbackModel model) { + ResponseResult responseResult = new ResponseResult(); + WMSHelper.addAlarmRecord("璁惧鏁呴殰", "楂�, $"璁惧鍙穥model.deviceNo}锛岄敊璇俊鎭細"+model.errMsg); + return responseResult; + } + + /// <summary> + /// 浜哄伐鎵嬪姩鍏ュ簱 + /// 2.鏍规嵁瀹瑰櫒鍙锋煡璇㈠叆搴撲换鍔�+ /// 3.濡傛灉娌℃湁鍏ュ簱浠诲姟锛岃褰曞紓甯�+ /// 4.杩涜鍏ュ簱 + /// </summary> + /// <param name="model"></param> + /// <returns></returns> + public static ResponseResult manualStorage(ManualStorageModel model) + { + ResponseResult responseResult = new ResponseResult(); + + // 鏌ヨ涓棿琛�+ var ljMesTask = WMSHelper.getLjMesTaskByCntr( model.cntrNo); + if (ljMesTask == null) + { + responseResult.code = 1; + responseResult.msg = "鏈煡璇㈠埌MES涓嬪彂鐨勫叆搴撲换鍔�; + return responseResult; + } + + string taskType = ""; + if (ljMesTask.QTY == 0) + { + taskType = "绌哄伐瑁呬汉宸ュ叆搴�; + } + else { + taskType = "婊℃枡宸ヨ浜哄伐鍏ュ簱"; + } + + var startLoc = LocationHelper.GetLoc(model.from); + var transfeRele = WMSHelper.GetTransfeRelevance(model.from); // 鎺ラ┏浣嶅睘鎬�+ if (transfeRele != null) + { + var endLoc = WMSHelper.getInStockEndLoc(transfeRele.S_RELE_AREA, ljMesTask.QTY); + if (startLoc == null) + { + responseResult.code = 1; + responseResult.msg = "鎺ラ┏浣嶄笉瀛樺湪锛岃妫�煡璧风偣璐т綅缂栫爜鏄惁鏈夎"; + return responseResult; + } + + if (endLoc == null) + { + responseResult.code = 1; + responseResult.msg = "绔嬪簱绌轰綑搴撲綅涓嶈冻"; + return responseResult; + } + + var wmsTask = new WMSTask() + { + S_CNTR_CODE = model.cntrNo, + S_CODE = WMSHelper.GenerateTaskNo(), + S_START_LOC = startLoc.S_CODE, + S_START_AREA = startLoc.S_AREA_CODE, + S_END_LOC = endLoc.S_CODE, + S_END_AREA = endLoc.S_AREA_CODE, + S_TYPE = taskType, + S_OP_DEF_CODE = ljMesTask.ID.ToString(), + S_OP_DEF_NAME = "浜哄伐鍏ュ簱浠诲姟", + N_PRIORITY = 1, + T_START_TIME = DateTime.Now + }; + if (WMSHelper.CreateWmsTask(wmsTask)) + { + // 鍒涘缓涓�鍏ュ簱浠诲姟 + WCSTask wcsTask = new WCSTask() + { + S_OP_NAME = wmsTask.S_OP_DEF_NAME, + S_OP_CODE = wmsTask.S_CODE, + S_CODE = WCSHelper.GenerateTaskNo(), + S_CNTR_CODE = wmsTask.S_CNTR_CODE, + S_TYPE = wmsTask.S_TYPE + "-WCS", + S_START_LOC = startLoc.S_CODE, + S_START_AREA = startLoc.S_AREA_CODE, + S_END_LOC = endLoc.S_CODE, + S_END_AREA = endLoc.S_AREA_CODE, + S_SCHEDULE_TYPE = "WCS", + N_PRIORITY = wmsTask.N_PRIORITY, + T_START_TIME = DateTime.Now, + }; + if (WCSHelper.CreateTask(wcsTask)) + { + // 璧风偣銆佹帴椹崇偣銆佺粓鐐瑰姞閿�+ LocationHelper.LockLoc(wcsTask.S_START_LOC, 2); + LocationHelper.LockLoc(wcsTask.S_END_LOC, 1); + + // 鏇存柊浣滀笟浠诲姟鐘舵� + wmsTask.N_B_STATE = 1; + WMSHelper.UpdateTaskState(wmsTask); + + WMSHelper.readLjMesOffItemTask(wmsTask.S_CODE ,ljMesTask.ID); + } + } + } + else + { + WMSHelper.addAlarmRecord("娴佺▼寮傚父", "涓�, $"鎺ラ┏浣�{model.from},缂哄皯灞炴�閰嶇疆椤癸紝璇疯仈绯荤鐞嗚繘琛岄厤缃�); + responseResult.code = 1; + responseResult.msg = $"鎺ラ┏浣嶇己灏戝睘鎬ч厤缃」锛岃鑱旂郴绠$悊杩涜閰嶇疆"; + } + + return responseResult; + } + + /// <summary> + /// 浜哄伐鍑哄簱 + /// </summary> + /// <param name="model"></param> + /// <returns></returns> + public static ResponseResult manualDelivery(ManualDeliveryModel model) { + ResponseResult responseResult = new ResponseResult(); + + // 鏌ヨ涓棿琛�+ var ljMesTask = WMSHelper.getLjMesTaskByLoc(model.to); + if (ljMesTask == null) + { + responseResult.code = 1; + responseResult.msg = "鏈煡璇㈠埌MES浠诲姟琛ㄦ暟鎹�; + return responseResult; + } + string taskType = ""; + if (ljMesTask.QTY == 0) + { + taskType = "绌哄伐瑁呬汉宸ュ嚭搴�; + } + else + { + taskType = "婊℃枡宸ヨ浜哄伐鍑哄簱"; + } + + var endLoc = LocationHelper.GetLoc(model.to); + var transfeRele = WMSHelper.GetTransfeRelevance(model.to); // 鎺ラ┏浣嶅睘鎬�+ if (transfeRele != null) + { + var startLoc = WMSHelper.getOutStockStartLoc(transfeRele.S_RELE_AREA, model.materialCode,model.trayStatus, model.cntrNo); + if (endLoc == null) + { + responseResult.code = 1; + responseResult.msg = "鎺ラ┏浣嶄笉瀛樺湪锛岃妫�煡璧风偣璐т綅缂栫爜鏄惁鏈夎"; + return responseResult; + } + + if (startLoc == null) + { + responseResult.code = 1; + responseResult.msg = "绔嬪簱搴撳瓨涓嶈冻"; + return responseResult; + } + + var wmsTask = new WMSTask() + { + S_CNTR_CODE = model.cntrNo, + S_CODE = WMSHelper.GenerateTaskNo(), + S_START_LOC = startLoc.S_CODE, + S_START_AREA = startLoc.S_AREA_CODE, + S_END_LOC = endLoc.S_CODE, + S_END_AREA = endLoc.S_AREA_CODE, + S_TYPE = taskType, + S_OP_DEF_NAME = "浜哄伐鍑哄簱浠诲姟", + N_PRIORITY = 1, + T_START_TIME = DateTime.Now + }; + if (WMSHelper.CreateWmsTask(wmsTask)) + { + // 鍒涘缓涓�鍏ュ簱浠诲姟 + WCSTask wcsTask = new WCSTask() + { + S_OP_NAME = wmsTask.S_OP_DEF_NAME, + S_OP_CODE = wmsTask.S_CODE, + S_CODE = WCSHelper.GenerateTaskNo(), + S_CNTR_CODE = wmsTask.S_CNTR_CODE, + S_TYPE = wmsTask.S_TYPE + "-WCS", + S_START_LOC = startLoc.S_CODE, + S_START_AREA = startLoc.S_AREA_CODE, + S_END_LOC = endLoc.S_CODE, + S_END_AREA = endLoc.S_AREA_CODE, + S_SCHEDULE_TYPE = "WCS", + N_PRIORITY = wmsTask.N_PRIORITY, + T_START_TIME = DateTime.Now, + }; + if (WCSHelper.CreateTask(wcsTask)) + { + // 璧风偣銆佹帴椹崇偣銆佺粓鐐瑰姞閿�+ LocationHelper.LockLoc(wcsTask.S_START_LOC, 2); + LocationHelper.LockLoc(wcsTask.S_END_LOC, 1); + + // 鏇存柊浣滀笟浠诲姟鐘舵� + wmsTask.N_B_STATE = 1; + WMSHelper.UpdateTaskState(wmsTask); + + WMSHelper.readLjMesOffItemTask(wmsTask.S_CODE, ljMesTask.ID); + } + } + } + else { + WMSHelper.addAlarmRecord("娴佺▼寮傚父", "涓�, $"鎺ラ┏浣�{model.to},缂哄皯灞炴�閰嶇疆椤癸紝璇疯仈绯荤鐞嗚繘琛岄厤缃�); + responseResult.code = 1; + responseResult.msg = $"鎺ラ┏浣嶇己灏戝睘鎬ч厤缃」锛岃鑱旂郴绠$悊杩涜閰嶇疆"; + } + + return responseResult; + } + + /// <summary> + /// 鍙栨秷浠诲姟 + /// </summary> + /// <param name="taskNo"></param> + public static ResponseResult cancelTask(string taskNo) { + ResponseResult responseResult = new ResponseResult(); + WMSTask wmsTask = WMSHelper.GetWmsTask(taskNo); + if (wmsTask != null && wmsTask.N_B_STATE == 0) + { + + var wcsTaskList = WCSHelper.GetTaskListBySrcNo(wmsTask.S_CODE); + foreach (var wcsTask in wcsTaskList) + { + if (wcsTask != null && wcsTask.N_B_STATE < 3) + { + WCSHelper.Fail(wcsTask); + LocationHelper.UnLockLoc(wcsTask.S_START_LOC); + LocationHelper.UnLockLoc(wcsTask.S_END_LOC); + } + } + + wmsTask.N_B_STATE = 3; + wmsTask.S_B_STATE = "鍙栨秷"; + wmsTask.T_END_TIME = DateTime.Now; + WMSHelper.UpdateTaskState(wmsTask); + } + return responseResult; + } + + /// <summary> + /// 鍒囨崲绔欏彴灞炴� + /// </summary> + /// <param name="model"></param> + /// <returns></returns> + public static ResponseResult switchStationAttribute(SwitchStationAttributeModel model) + { + ResponseResult responseResult = new ResponseResult(); + var task = WCSHelper.GetTaskByStartOrEnd(model.locCode); + if (task == null) + { + var transfeRelevance = WMSHelper.GetTransfeRelevance(model.locCode); // 鎺ラ┏浣嶅睘鎬�+ LogHelper.Info($"鍘熺珯鍙板睘鎬э細{JsonConvert.SerializeObject(transfeRelevance)}", "WMS"); + if (transfeRelevance != null && transfeRelevance.N_PROPERTY == 2) + { + if (model.signalType == "1") + { + WMSHelper.updateTransfeLocProperty(model.locCode, 0); + } + if (model.signalType == "2") + { + WMSHelper.updateTransfeLocProperty(model.locCode, 1); + } + } + } + else + { + responseResult.code = 1; + responseResult.msg = "鎺ラ┏浣嶅瓨鍦ㄦ湭瀹屾垚鐨勪换鍔★紝鏃犳硶鍒囨崲绔欏彴灞炴�"; + } + return responseResult; + } + + /// <summary> + /// 璐т綅鐘舵�鍙嶉 + /// </summary> + /// <param name="model"></param> + /// <returns></returns> + public static bool locStateFeedBack(LocStateFeedBackModel model) + { + bool result = false; + if (model.type == "1") + { + var task = WCSHelper.GetTask(model.req_no); + if (task != null) + { + TaskAction taskAction = null; + if (model.type == "1") + { + taskAction = WCSHelper.getActionRecord(task.S_CODE, 1101); + } + if (model.type == "2") + { + taskAction = WCSHelper.getActionRecord(task.S_CODE, 1102); + } + if (taskAction != null) + { + taskAction.N_S_STATUS = 1; + result = WCSHelper.updateActionRecord(taskAction); + } + } + } + return result; + } + + //---------------------------------------------------------------------------------------------------------------------------- + public class LocModel + { + public string locCode { get; set; } // 杩旀枡璐т綅缂栧彿 + public string jtNo { get; set; } // 鏈哄彴鍙�+ } + + public class ApplyDest { + public string destLoc { get; set; } // 缁堢偣璐т綅缂栫爜 + } + public class TrayItemInfo + { + public string S_SERIAL_NO { get; set; } // 鍘熸潗鏂欐壒娆″彿 + public string S_ITEM_CODE { get; set; } // 鐗╂枡缂栫爜 + public string S_ITEM_NAME { get; set; } // 鐗╂枡缂栫爜 + public string S_ITEM_SPEC { get; set; } // 瑙勬牸 + public string S_ITEM_STATE { get; set; } = "0"; // 妫�獙鐘舵� 0锛氭湭妫�獙 1锛氬悎鏍硷紝2锛氫笉鍚堟牸 + /// <summary> + /// 1锛氬悎鏍�2锛氫笉鍚堟牸 + /// </summary> + public int N_ITEM_STATE { get; set; } // 鐗╂枡鐘舵� + public string S_BATCH_NO { get; set; } // 鎵规鏉$爜 + public float F_QTY { get; set; } // 鏁伴噺 + public string S_UOM { get; set; } = ""; // 鍗曚綅 + public string S_CNTR_CODE { get; set; } // 瀹瑰櫒 + public string D_PRD_DATE { get; set; } // 鐢熶骇鏃ユ湡 + public string D_EXP_DATE { get; set; } // 鏈�皬鍋滄斁鏃ユ湡 + public string D_EXP_DATE1 { get; set; } // 鏈�ぇ鍋滄斁鏃ユ湡 + } + + /// <summary> + /// 浜哄伐鍑哄簱妯″瀷 + /// </summary> + public class ManualDeliveryModel { + public string to { get; set; } // 鎺ラ┏璐т綅缂栫爜 + public string cntrNo { get; set; } // 瀹瑰櫒鍙�+ public int trayStatus { get; set; } // 鎵樼洏鐘舵� 0.姝e父 1.寮傚父 + public string materialCode { get; set; } // 鐗╂枡缂栧彿 鐗╂枡缂栫爜涓虹┖锛岃〃绀虹┖宸ヨ + } + + /// <summary> + /// 浜哄伐鍏ュ簱妯″瀷 + /// </summary> + public class ManualStorageModel { + public string from { get; set; } // 璧风偣 + public string cntrNo { get; set; } // 瀹瑰櫒鍙�+ } + + /// <summary> + /// 璁惧鎶ヨ鍙嶉妯″瀷 + /// </summary> + public class DeviceAlertorFeedbackModel { + public string reqId { get; set; } + public string reqTime { get; set; } + public string deviceNo { get; set; } // 璁惧鍙�+ public string errCode { get; set; } // 閿欒鐮�+ public string errMsg { get; set; } // 閿欒淇℃伅 + } + + + /// <summary> + /// 鑾峰彇鎵樼洏鐗╂枡淇℃伅妯″瀷 + /// </summary> + public class FindTrayItemInfoModel { + public string reqId { get; set; } + public string reqTime { get; set; } + public string cntrNo { get; set; } // 鎵樼洏鍙�+ } + + /// <summary> + /// 鐢宠缁堢偣妯″瀷 + /// </summary> + public class ApplyDestinationModel { + public string reqId { get; set; } + public string reqTime { get; set; } + public string taskNo { get; set; } // 浠诲姟鍙�+ public string loc { get; set; } // 褰撳墠璐т綅 + public int applyType { get; set; } // 鐢宠绫诲瀷 1锛氬爢鍨涙満鏀捐揣寮傚父鐢宠鏂扮粓鐐癸紱2锛氳緭閫佺嚎鍒拌揪鎺ラ┏浣嶇敵璇风粓鐐癸紱3锛�+ + } + + public class AGVApplyDestModel{ + public string taskNo { get; set; } // 浠诲姟鍙�+ public string loc { get; set; } // 褰撳墠璐т綅 + public string trayCode { get; set; } // 鎵樼洏鐮侊紙RFID锛�+ public string applyType { get; set; } // 1.铏氭嫙缁堢偣 2.RFID楠岃瘉澶辫触 3.RFID涓庝换鍔′笉鍖归厤 4.鐗╂枡鐘舵�涓嶅悎鏍�+ } + + + /// <summary> + /// 浠诲姟鐘舵�鍙嶉妯″瀷 + /// </summary> + public class TaskStatusFeedbackModel { + public string reqId { get; set; } + public string reqTime { get; set; } + public string taskNo { get; set; } // 浠诲姟鍙�+ public string subTaskNo { get; set; } // 瀛愪换鍔″彿 + public int status { get; set; } // 浠诲姟鐘舵� 1锛氬紑濮�鎵ц涓紱2:瀹屾垚锛�锛氬噯澶囧彇璐э紱4锛氬彇璐у畬鎴愶紱5锛氬噯澶囧嵏璐э紱6锛氬嵏璐у畬鎴愶紱7锛氬紓甯稿彇娑堬紱8锛氬己鍒跺畬鎴�+ public string deviceNo { get; set; } // 璁惧鍙�+ public string errCode { get; set; } // 寮傚父浠g爜 0.鏃犲紓甯�1.璁惧鏁呴殰鐮併�2.rfid鏍¢獙澶辫触銆�.鍙栬揣鏃犺揣銆�.鏀捐揣鏈夎揣 + public string loc { get; set; } // 褰撳墠璐т綅 + } + + /// <summary> + /// 璁惧淇″彿鍙嶉妯″瀷 + /// </summary> + public class DeviceSignalFeedbackModel + { + public string reqId { get; set; } + public string reqTime { get; set; } + public string taskNo { get; set; } // 鎵樼洏鍙�+ public string loc { get; set; } // 璐т綅 涓婃枡鐐广�涓嬫枡鐐广�璇荤爜浣嶃�绉伴噸浣嶏紙蹇呭~锛�+ public string cntrNo { get; set; } // 鎵樼洏鍙�+ public int signalType { get; set; } //璇锋眰绫诲瀷 1:涓嬬嚎璇锋眰 2锛氬彨鏂欒姹�3锛氳鐮佽姹傦紙蹇呭~锛�+ public string deviceNo { get; set; } //璁惧鍙�+ public object extData { get; set; } + } + + /// <summary> + /// 鍙枡璇锋眰 + /// </summary> + public class CallMaterialRequest + { + public string loc { get; set; } // 璐т綅 涓婃枡鐐广�涓嬫枡鐐广�璇荤爜浣嶃�绉伴噸浣嶏紙蹇呭~锛�+ } + + + /// <summary> + /// 涓嬬嚎璇锋眰 + /// </summary> + public class OffLineRequest + { + public string loc { get; set; } // 璐т綅 涓婃枡鐐广�涓嬫枡鐐广�璇荤爜浣嶃�绉伴噸浣嶏紙蹇呭~锛�+ public string cntrNo { get; set; } // 鎵樼洏鍙�+ public string jtNo { get; set; } // 鏈哄彴鍙�+ public bool isNormal { get; set; } //鏄惁寮傚父 + } + + /// <summary> + /// 璇荤爜璇锋眰 + /// </summary> + public class ReadCodeRequest + { + public string loc { get; set; } // 璐т綅 涓婃枡鐐广�涓嬫枡鐐广�璇荤爜浣嶃�绉伴噸浣嶏紙蹇呭~锛�+ public string cntrNo { get; set; } // 鎵樼洏鍙�+ public string taskNo { get; set; } // 浠诲姟鍙�+ } + + public class AddTaskModel { + public string From { get; set; } + public string To { get; set; } + public string No { get; set; } + } + public class TN_LocationModel { + public string TN_Location { get; set; } + } + public class CodeInfo { + /// <summary> + /// 鐢熶骇璁㈠崟鍐呯爜 + /// </summary> + public string FInterID { get; set; } + /// <summary> + /// 鐢熶骇璁㈠崟缂栧彿 + /// </summary> + public string FSourceNo { get; set; } + /// <summary> + /// 鎵瑰彿 + /// </summary> + public string FGMPBatchNo { get; set; } + public string FState { get; set; } + /// <summary> + /// 鐗╂枡缂栫爜锛堝唴鐮佸氨鏄紪鐮侊級 + /// </summary> + public string Fitemid_XK { get; set; } + /// <summary> + /// 鍒嗗綍id + /// </summary> + public string Fentryid { get; set; } + } + public class NoteInfo : CodeInfo { + public string WmsBillNo { get; set; } + } + } +} -- Gitblit v1.9.1