| | |
| | | { |
| | | WMSHelper.addAlarmRecord("流程异常", "高", $"设备号:{bufferLocConfig.deviceNo},查询设备状态失败,请联系工作人员查看设备是否正常"); |
| | | throw new BusinessException($"设备号:{bufferLocConfig.deviceNo},查询设备状态失败,请联系工作人员查看设备是否正常"); |
| | | }*/ |
| | | }*/ |
| | | } |
| | | else |
| | | { |
| | |
| | | return responseResult; |
| | | } |
| | | |
| | | middleLoc = WMSHelper.GetMinTaskTransfeLoc(startLoc.S_AREA_CODE, 2 , 2); |
| | | middleLoc = WMSHelper.GetMinTaskTransfeLoc(startLoc.S_AREA_CODE, 2 ); |
| | | if (middleLoc == null) { |
| | | WMSHelper.addAlarmRecord("流程异常", "高", $"MES叫料任务{mesTask.ID},立库接驳位可能处于锁定或禁用状态,请查看"); |
| | | responseResult.code = 1; |
| | |
| | | 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.非直连 |
| | | agvEndLoc = WMSHelper.GetMinTaskTransfeLoc(wmsEndLoc.S_AREA_CODE, 1); |
| | | if (agvEndLoc != null) |
| | | { |
| | | LogHelper.Info($"创建立库站台到立库的预创建任务,agv终点货位:{agvEndLoc.S_CODE},立库终点货位:{wmsEndLoc.S_CODE}", "AGV"); |
| | |
| | | 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.非直连 |
| | | agvEndLoc = WMSHelper.GetMinTaskTransfeLoc(wmsEndLoc.S_AREA_CODE, 1); |
| | | if (agvEndLoc != null) |
| | | { |
| | | LogHelper.Info($"创建立库站台到立库的预创建任务,agv终点货位:{agvEndLoc.S_CODE},立库终点货位:{wmsEndLoc.S_CODE}", "AGV"); |
| | |
| | | S_OP_CODE = mst.S_CODE, |
| | | S_CODE = WCSHelper.GenerateTaskNo(), |
| | | S_CNTR_CODE = cst.S_CNTR_CODE, |
| | | S_TYPE = cst.S_TYPE + "【异常】", |
| | | S_TYPE = "异常工装入库", |
| | | S_START_LOC = agvEndLoc.S_CODE, |
| | | S_START_AREA = agvEndLoc.S_AREA_CODE, |
| | | S_END_LOC = wmsEndLoc.S_CODE, |
| | |
| | | if (locCntrRels.Count > 0) |
| | | { |
| | | cntrCode = locCntrRels[0].S_CNTR_CODE; |
| | | middleLoc = WMSHelper.GetTransfeRelevanceLoc(startLoc.S_AREA_CODE, 2, 2); |
| | | middleLoc = WMSHelper.GetMinTaskTransfeLoc(startLoc.S_AREA_CODE, 2); |
| | | if (middleLoc != null) |
| | | { |
| | | // 1.创建成新机叫料作业 |
| | |
| | | Location endLoc = WMSHelper.getCallMaterialLocCode(mesTask.EQP); |
| | | if (endLoc != null) |
| | | { |
| | | middleLoc = WMSHelper.GetTransfeRelevanceLoc(startLoc.S_AREA_CODE, 2, 2); |
| | | middleLoc = WMSHelper.GetMinTaskTransfeLoc(startLoc.S_AREA_CODE, 2); |
| | | if (middleLoc != null) |
| | | { |
| | | // 1.创建成新机叫料作业 |
| | |
| | | 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.非直连 |
| | | agvEndLoc = WMSHelper.GetMinTaskTransfeLoc(wmsEndLoc.S_AREA_CODE, 1); |
| | | if (agvEndLoc != null) |
| | | { |
| | | // 预先生成入库站台-立库终点的搬运任务 |
| | |
| | | { |
| | | var transfeRelevance = WMSHelper.GetTransfeRelevance(model.locCode); // 接驳位属性 |
| | | LogHelper.Info($"原站台属性:{JsonConvert.SerializeObject(transfeRelevance)}", "WMS"); |
| | | if (transfeRelevance != null && transfeRelevance.N_PROPERTY == 2) |
| | | if (transfeRelevance != null) |
| | | { |
| | | if (model.signalType == "1") |
| | | { |
| | |
| | | |
| | | /// <summary> |
| | | /// 查询接驳位关联属性 |
| | | /// 注: |
| | | /// 1.查询异常区货位 |
| | | /// </summary> |
| | | /// <param name="areaCode">库区</param> |
| | | /// <param name="type">动作类型(0.人工接驳位 1.入库接驳位 2.出库接驳位)</param> |
| | | /// <param name="property">货位属性(1.直连 2.非直连)</param> |
| | | /// <returns></returns> |
| | | public static Location GetTransfeRelevanceLoc(string areaCode ,int type ,int property ) |
| | | { |
| | | Location loc = null; |
| | | var db = new SqlHelper<object>().GetInstance(); |
| | | loc = db.Queryable<Location>() |
| | | .LeftJoin<TransfeRelevance>((a,b)=> a.S_CODE == b.S_LOC_CODE) |
| | | .Where((a, b) => b.S_RELE_AREA.Trim() == areaCode && b.N_PROPERTY == property && b.N_TYPE == type && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y") |
| | | .First(); |
| | | return loc; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 查询接驳位关联属性 |
| | | /// </summary> |
| | | /// <param name="locCode"></param> |
| | | /// <param name="isManual">货位属性 (0.非人工 1.人工)</param> |
| | |
| | | /// 注:查询任务最少的接驳位 |
| | | /// </summary> |
| | | /// <param name="areaCode">库区</param> |
| | | /// <param name="property">货位属性 ( 1.直连 2.非直连)</param> |
| | | /// <param name="type">动作类型 (1.入库接驳位 2.出库接驳位)</param> |
| | | /// <returns></returns> |
| | | public static Location GetMinTaskTransfeLoc(string areaCode ,int type, int property) |
| | | public static Location GetMinTaskTransfeLoc(string areaCode ,int type) |
| | | { |
| | | var db = new SqlHelper<object>().GetInstance(); |
| | | var loc = db.Queryable<Location>() |
| | | .LeftJoin<TransfeRelevance>((a,b) => a.S_CODE == b.S_LOC_CODE) |
| | | .LeftJoin<WCSTask>((a,b,c) => a.S_CODE == c.S_END_LOC && c.N_B_STATE < 3) |
| | | .Where((a, b, c) => b.S_RELE_AREA.Trim() == areaCode && b.N_TYPE == type && b.N_PROPERTY == property && a.N_LOCK_STATE < 3 && a.C_ENABLE == "Y") |
| | | .Where((a, b, c) => b.S_RELE_AREA.Trim() == areaCode && b.N_TYPE == type && a.N_LOCK_STATE < 3 && a.C_ENABLE == "Y") |
| | | .GroupBy((a, b, c) => a.S_CODE) |
| | | .Select((a, b, c) => new { |
| | | count = SqlFunc.AggregateCount(c.S_END_LOC), |
| | |
| | | { |
| | | LogHelper.Info("接驳位:" + JsonConvert.SerializeObject(item), "Mobox"); |
| | | var conLoc = LocationHelper.GetLoc(item); |
| | | endLoc = WMSHelper.GetEndLocation(areaCode, model.trayItemInfoList[0].itemCode, conLoc.N_ROADWAY, conLoc.N_ROW); |
| | | endLoc = WMSHelper.GetEndLocation(areaCode, model.trayItemInfoList[0].itemCode, conLoc.N_ROADWAY, conLoc.N_ROW,4); |
| | | if (endLoc != null) |
| | | { |
| | | firstTaskEnd = conLoc; |
| | |
| | | else |
| | | { |
| | | responseResult.success = false; |
| | | responseResult.message = "未获取到终点库位"; |
| | | responseResult.message = "未获取到终点库位,剩余货位不足"; |
| | | } |
| | | return responseResult; |
| | | } |
| | |
| | | if (locCntrRel != null) |
| | | { |
| | | LogHelper.Info("1111111", "输送线"); |
| | | if (lineSignalInfo.faultMessage == 1) |
| | | { |
| | | // 回报车间控制器 |
| | | LogHelper.Info("输送线,线体【" + line.code + "】调整为手动状态", "输送线"); |
| | | continue; |
| | | } |
| | | |
| | | WMSTask wmsTask = WMSHelper.GetWmsTaskByCntr(locCntrRel.S_CNTR_CODE); |
| | | if (wmsTask == null) |
| | | { |
| | | LogHelper.Info("没有正在执行的任务,货位:" + locCntrRel.S_LOC_CODE + " 容器:" + locCntrRel.S_CNTR_CODE, "输送线"); |
| | | continue; |
| | | } |
| | | |
| | | if (lineSignalInfo.faultMessage != 0) |
| | | { |
| | | // 回报车间控制器 |
| | | WMSStatusInfo statusInfo = new WMSStatusInfo() |
| | | { |
| | | wmsId = wmsTask.S_CODE, |
| | | errMsg = $"{line.code}输送线故障,故障编码:{lineSignalInfo.faultMessage}" |
| | | }; |
| | | ShopFloorControl.wmsUpdateStatus(statusInfo); |
| | | |
| | | if (lineSignalInfo.faultMessage == 1) |
| | | { |
| | | LogHelper.Info("输送线,线体【" + line.code + "】调整为手动状态", "输送线"); |
| | | continue; |
| | | } |
| | | } |
| | | |
| | | var date = DateTime.Now.ToString("yyMMdd"); |
| | |
| | | } |
| | | LogHelper.Info("堆垛机入库任务终点", "输送线"); |
| | | Location endLoc = WMSHelper.GetEndLocation(wmsTask.S_END_AREA, itemCode, originLocation.N_ROADWAY, originLocation.N_ROW); |
| | | LogHelper.Info($"堆垛机入库任务终点:{endLoc.S_CODE}", "输送线"); |
| | | wmsTask.S_END_LOC = endLoc.S_CODE; |
| | | WMSHelper.UpdateTask(wmsTask); |
| | | string eqNo = ApiHelper.getEqNo(endLoc.S_AREA_CODE, endLoc.N_ROADWAY); |
| | | if (endLoc != null) |
| | | { |
| | | LogHelper.Info($"堆垛机入库任务终点:{endLoc.S_CODE}", "输送线"); |
| | | wmsTask.S_END_LOC = endLoc.S_CODE; |
| | | WMSHelper.UpdateTask(wmsTask); |
| | | string eqNo = ApiHelper.getEqNo(endLoc.S_AREA_CODE, endLoc.N_ROADWAY); |
| | | |
| | | List<string> areaCdoes = Settings.getStoreAreaCodes(2, 1); |
| | | WCSTask twoWcsTask = new WCSTask |
| | | List<string> areaCdoes = Settings.getStoreAreaCodes(2, 1); |
| | | 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 + "-2", |
| | | S_START_LOC = originLocation.S_CODE, |
| | | S_START_AREA = originLocation.S_AREA_CODE, |
| | | S_END_LOC = wmsTask.S_END_LOC, |
| | | S_END_AREA = wmsTask.S_END_AREA, |
| | | S_EQ_NO = eqNo, |
| | | S_SCHEDULE_TYPE = "RB", |
| | | T_START_TIME = DateTime.Now, |
| | | }; |
| | | if (WCSHelper.CreateTask(twoWcsTask)) |
| | | { |
| | | // 接驳位加出库锁,终点货位加入库锁 |
| | | LocationHelper.LockLoc(twoWcsTask.S_START_LOC, 2); |
| | | LocationHelper.LockLoc(twoWcsTask.S_END_LOC, 1); |
| | | LogHelper.Info("堆垛机入库任务已下发,任务信息:" + JsonConvert.SerializeObject(twoWcsTask), "输送线"); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | 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 + "-2", |
| | | S_START_LOC = originLocation.S_CODE, |
| | | S_START_AREA = originLocation.S_AREA_CODE, |
| | | S_END_LOC = wmsTask.S_END_LOC, |
| | | S_END_AREA = wmsTask.S_END_AREA, |
| | | S_EQ_NO = eqNo, |
| | | S_SCHEDULE_TYPE = "RB", |
| | | T_START_TIME = DateTime.Now, |
| | | }; |
| | | if (WCSHelper.CreateTask(twoWcsTask)) |
| | | { |
| | | // 接驳位加出库锁,终点货位加入库锁 |
| | | LocationHelper.LockLoc(twoWcsTask.S_START_LOC, 2); |
| | | LocationHelper.LockLoc(twoWcsTask.S_END_LOC, 1); |
| | | LogHelper.Info("堆垛机入库任务已下发,任务信息:" + JsonConvert.SerializeObject(twoWcsTask), "输送线"); |
| | | LogHelper.Info($"堆垛机入库任务终点:null", "输送线"); |
| | | } |
| | | } |
| | | else { |
| | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// WMS物流调度状态反馈 |
| | | /// </summary> |
| | | /// <param name="model"></param> |
| | | /// <returns></returns> |
| | | public static bool wmsUpdateStatus(WMSStatusInfo model) |
| | | { |
| | | var msg = ""; |
| | | var result = false; |
| | | LogHelper.Info("WMS物流调度状态反馈, 入参:" + JsonConvert.SerializeObject(model), "车间控制器"); |
| | | var request = JsonConvert.SerializeObject(model); |
| | | var response = apiHelper.Post(baseUrl + "/api/hecWms/logistics/wmsUpdateStatus", request); |
| | | msg = $"[车间控制器-updateStatus] request={request} response={response}"; |
| | | Console.WriteLine(msg); |
| | | LogHelper.Info("WMS物流调度状态反馈, 出参:" + JsonConvert.SerializeObject(response), "车间控制器"); |
| | | if (response != null && response != "") |
| | | { |
| | | try |
| | | { |
| | | var dataResult = JsonConvert.DeserializeObject<ResponseData>(response); |
| | | if (dataResult.success) |
| | | { |
| | | result = dataResult.code.Equals("200"); |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | Console.WriteLine(ex.Message); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | msg = "[车间控制器-updateStatus]WMS物流调度状态反馈失败"; |
| | | Console.WriteLine(msg); |
| | | } |
| | | LogHelper.Info(msg, "车间控制器"); |
| | | return result; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 物流调度接口 |
| | | /// </summary> |
| | | /// <param name="model"></param> |
| | |
| | | public string reason { get; set; } // 失败原因 |
| | | } |
| | | |
| | | public class WMSStatusInfo |
| | | { |
| | | public string wmsId { get; set; } // wms任务ID |
| | | public string errMsg { get; set; } // 错误信息 |
| | | } |
| | | |
| | | public class UnBindInfo { |
| | | public string processTaskId { get; set; } // 工序任务ID |
| | | public string trayCode{ get; set; } // 托盘编码 |
| | |
| | | /// <param name="itemCode"></param> |
| | | /// <param name="roadway">接驳位所在巷道</param> |
| | | /// <param name="row">接驳位所在排</param> |
| | | /// <param name="thresholdValue">库容阈值</param> |
| | | /// <returns></returns> |
| | | public static Location GetEndLocation(string areaCode, string itemCode ,int roadway ,int row) |
| | | public static Location GetEndLocation(string areaCode, string itemCode ,int roadway ,int row ,int thresholdValue = 1) |
| | | { |
| | | Location loc = null; |
| | | try |
| | |
| | | .LeftJoin<WCSTask>((a,b) => a.S_CODE == b.S_OP_CODE) |
| | | .LeftJoin<Location>((a, b ,c) => b.S_END_LOC == c.S_CODE) |
| | | .Where((a, b, c) => b.S_END_AREA == storeAreaInfo.accessArea && c.N_ROADWAY == roadway && a.N_B_STATE < 2 && b.S_TYPE.Contains("入库")).Count(); |
| | | if (locList.Count - 2 > taskNum) |
| | | if (locList.Count - thresholdValue > taskNum) |
| | | { |
| | | // 【1.2】查询深度 N_DEEP = 2 ,位置 N_POS = 1 且 物料相同 的货位 |
| | | var sameItemLocList = db.Queryable<Location>() |
| | |
| | | } |
| | | } |
| | | catch (Exception ex) { |
| | | LogHelper.Error("GetEndLocation:" + ex.Message, ex); |
| | | LogHelper.Info("获取入库终点报错,错误信息:" + ex.Message,"WMS"); |
| | | } |
| | | return loc; |
| | | } |
| | |
| | | using System.Linq; |
| | | using System.Threading; |
| | | using static HH.WCS.Mobox3.SXJK.api.ApiModel; |
| | | using static HH.WCS.Mobox3.SXJK.api.MoboxController; |
| | | using static HH.WCS.Mobox3.SXJK.api.OtherModel; |
| | | using static HH.WCS.Mobox3.SXJK.api.WmsController; |
| | | using static HH.WCS.Mobox3.SXJK.api.WmsController.PutawayOrderIn; |
| | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 入库单重置 |
| | | /// </summary> |
| | | /// <param name="model"></param> |
| | | /// <returns></returns> |
| | | public static SimpleResult inventoryReceiptReset(InventoryReceiptResetModel model) |
| | | { |
| | | SimpleResult simpleResult = new SimpleResult(); |
| | | var inStockList = WMSHelper.GetInStockList(model.asnNo); |
| | | if (inStockList != null) |
| | | { |
| | | var inStockListChildren = WMSHelper.getInstockListChild(model.asnNo); |
| | | if(inStockListChildren.Count > 0) |
| | | { |
| | | foreach (var child in inStockListChildren) |
| | | { |
| | | var locCntrRel = LocationHelper.GetLocCntrRelByCntr(child.S_TRACE_ID); |
| | | if (locCntrRel != null) |
| | | { |
| | | LocationHelper.UnBindingLoc(locCntrRel.S_LOC_CODE, new List<string>() { locCntrRel.S_CNTR_CODE }); |
| | | } |
| | | |
| | | ContainerHelper.deleteCntrItem(child.S_TRACE_ID); |
| | | } |
| | | } |
| | | } |
| | | return simpleResult; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 更新抽检信息 |
| | | /// </summary> |
| | | /// <param name="model"></param> |
| | |
| | | public class MoboxController : System.Web.Http.ApiController { |
| | | |
| | | /// <summary> |
| | | /// 入库单重置 |
| | | /// </summary> |
| | | /// <returns></returns> |
| | | public SimpleResult inventoryReceiptReset(InventoryReceiptResetModel model) |
| | | { |
| | | LogHelper.Info("[入库单重置]inventoryReceiptReset 入参:" + JsonConvert.SerializeObject(model), "Mobox"); |
| | | SimpleResult simpleResult = new SimpleResult(); |
| | | ApiHelper.inventoryReceiptReset(model); |
| | | LogHelper.Info("[入库单重置]inventoryReceiptReset 出参:" + JsonConvert.SerializeObject(simpleResult), "Mobox"); |
| | | return simpleResult; |
| | | } |
| | | |
| | | public class InventoryReceiptResetModel |
| | | { |
| | | public string asnNo { get; set; } // 入库单号 |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 远程启动输送线 |
| | | /// </summary> |
| | | /// <returns></returns> |
| | |
| | | if (!result) |
| | | { |
| | | es_bc_info.TYPE = "E"; |
| | | es_bc_info.MSG = "移库单同步错误"; |
| | | es_bc_info.MSG = "转移单同步错误"; |
| | | } |
| | | }); |
| | | } |
| | |
| | | |
| | | try |
| | | { |
| | | model.IT_DATA.ForEach(a => |
| | | model.IT_DATA.ForEach( a => |
| | | { |
| | | var result = ApiHelper.shiftingStockOrderSync(a); |
| | | if (!result) { |
| | |
| | | var cntrItemRels = ContainerHelper.GetCntrItemRel(cntrCode); |
| | | if (cntrItemRels != null && cntrItemRels.Count > 0) |
| | | { |
| | | LogHelper.Info($"OperateGZTaskStatus: 2 ,cntrCode:{cntrCode},S_ASN_NO ={cntrItemRels[0].S_ASN_NO},", "WMS"); |
| | | var inStockListChilds = WMSHelper.getInstockListChild(cntrCode, cntrItemRels[0].S_ASN_NO); |
| | | var cntrItemRel = cntrItemRels[0]; |
| | | LogHelper.Info($"OperateGZTaskStatus: 2 ,cntrCode:{cntrCode},S_ASN_NO ={cntrItemRel.S_ASN_NO},", "WMS"); |
| | | var inStockListChilds = WMSHelper.getInstockListChild(cntrCode, cntrItemRel.S_ASN_NO); |
| | | LogHelper.Info($"OperateGZTaskStatus: 2 ,inStockListChilds.count:{inStockListChilds.Count}", "WMS"); |
| | | if (inStockListChilds != null && inStockListChilds.Count > 0) |
| | | { |
| | | LogHelper.Info("OperateGZTaskStatus: 3", "WMS"); |
| | | receiveGoodsFeedback(inStockListChilds, cntrItemRels[0].F_NET_WEIGHT.ToString(), cntrCode, TN_Task.S_END_LOC); |
| | | receiveGoodsFeedback(inStockListChilds, cntrItemRel.F_NET_WEIGHT.ToString(), cntrCode, TN_Task.S_END_LOC); |
| | | |
| | | // 入库完成,回报WMS后,更新SPA批次号 |
| | | var inStockListChildren = Monitor.getInStockTrayInfo(cntrCode); |
| | | if (inStockListChildren != null && inStockListChildren.Count > 0) |
| | | { |
| | | cntrItemRel.LOTATT04 = inStockListChildren[0].LOTATT04; |
| | | ContainerHelper.UpdateCntrItemRel(cntrItemRel); |
| | | } |
| | | } |
| | | } |
| | | } |
| | |
| | | LogHelper.Info($"缓存信号处理,缓存IP:{item.Key}", "TSSG"); |
| | | var instockInfo = item.Value; |
| | | var end = WMSHelper.GetInstockEnd(instockInfo.item, instockInfo.endArea); |
| | | LogHelper.Info("(缓存信号)终点货位:" + JsonConvert.SerializeObject(end), "TSSG"); |
| | | LogHelper.Info($"(缓存信号,目标库区:{instockInfo.endArea},物料编码:{instockInfo.item})终点货位:" + JsonConvert.SerializeObject(end), "TSSG"); |
| | | if (end != null) |
| | | { |
| | | ApiHelper.Instock(instockInfo); |
| | |
| | | <Compile Include="models\Area.cs" /> |
| | | <Compile Include="models\EmptyTrayBuffer.cs" /> |
| | | <Compile Include="models\ItemBarcodeInfo.cs" /> |
| | | <Compile Include="models\iWMS_semi_bld_BCsample.cs" /> |
| | | <Compile Include="models\iWMS_semi_bld_BCstatus.cs" /> |
| | | <Compile Include="models\MatlInformation.cs" /> |
| | | <Compile Include="models\OI_WMS_OP_DEF.cs" /> |
| | | <Compile Include="models\OI_WMS_SCHEDULE_TYPE.cs" /> |
| | |
| | | <Compile Include="models\TN_OOS_Order.cs" /> |
| | | <Compile Include="models\TN_YiKuDetail.cs" /> |
| | | <Compile Include="models\TN_YiKuOrder.cs" /> |
| | | <Compile Include="models\Trfloc.cs" /> |
| | | <Compile Include="models\WHInventory.cs" /> |
| | | <Compile Include="models\TN_WMS_Const.cs" /> |
| | | <Compile Include="models\WorkOrder.cs" /> |
| | |
| | | |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// 1.创建入库任务 |
| | | /// </summary> |
| | |
| | | result.ResultCode = 1; |
| | | result.ResultMsg = "物料信息不能为空"; |
| | | return result; |
| | | } |
| | | else |
| | | { |
| | | foreach (var item in itemInfos) |
| | | { |
| | | // 将MES的物料状态转化成WMS可识别的物料状态 |
| | | if (item.jdge == "" || item.jdge == null) |
| | | { |
| | | item.jdge = "OK"; |
| | | } |
| | | else if(item.jdge != "OK") |
| | | { |
| | | item.jdge = "HOLD"; |
| | | } |
| | | |
| | | // 计算生效时间、失效时间 |
| | | var overage = WMSHelper.getOverage(item.bc_entried); |
| | | LogHelper.Info($"计算生效时间、失效时间,返回值:{JsonConvert.SerializeObject(overage)}", "WMS"); |
| | | if (overage != null) |
| | | { |
| | | DateTime txndate = DateTime.Parse(item.txndate); |
| | | DateTime minTime = txndate.AddHours(overage.MINHOUR); |
| | | DateTime maxTime = txndate.AddDays(overage.OVERAGE); |
| | | item.effective_time = minTime.ToString("yyyy-MM-dd HH:mm:ss"); |
| | | item.expiration_time = maxTime.ToString("yyyy-MM-dd HH:mm:ss"); |
| | | } |
| | | else |
| | | { |
| | | result.ResultCode = 1; |
| | | result.ResultMsg = $"未查询到物料存放时间配置信息,条形码:{item.bc_entried}"; |
| | | return result; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | |
| | | |
| | | if (endLoc != null) |
| | | { |
| | | string taskType = "成型机叫料出库任务"; |
| | | if (model.taskType == 2) |
| | | { |
| | | taskType = "抽检叫料出库任务"; |
| | | } |
| | | |
| | | |
| | | var wmsTask = new WMSTask() |
| | | { |
| | | S_CNTR_CODE = descCntrCode, |
| | |
| | | S_START_AREA = startLoc.S_AREA_CODE, |
| | | S_END_LOC = endLoc.S_CODE, |
| | | S_END_AREA = endLoc.S_AREA_CODE, |
| | | S_TYPE = "成型机叫料出库任务", |
| | | S_TYPE = taskType, |
| | | S_OP_DEF_CODE = model.taskNo, |
| | | S_OP_DEF_NAME = "成型机叫料出库任务", |
| | | S_OP_DEF_NAME = "叫料出库任务", |
| | | N_PRIORITY = model.priority, |
| | | T_START_TIME = DateTime.Now, |
| | | }; |
| | |
| | | ReturnResult result = new ReturnResult(); |
| | | try |
| | | { |
| | | if(model.itemInfo != null && model.itemInfo.Count > 0) |
| | | { |
| | | foreach (var item in model.itemInfo) |
| | | { |
| | | // 将MES的物料状态转化成WMS可识别的物料状态 |
| | | if (item.jdge == "" || item.jdge == null) |
| | | { |
| | | item.jdge = "OK"; |
| | | } |
| | | else if (item.jdge != "OK") |
| | | { |
| | | item.jdge = "HOLD"; |
| | | } |
| | | |
| | | var overage = WMSHelper.getOverage(item.bc_entried); |
| | | if (overage != null && overage.OVERAGE != 0) |
| | | { |
| | | DateTime txndate = DateTime.Parse(item.txndate); |
| | | DateTime minTime = txndate.AddHours(overage.MINHOUR); |
| | | DateTime maxTime = txndate.AddDays(overage.OVERAGE); |
| | | item.effective_time = minTime.ToString("yyyy-MM-dd HH:mm:ss"); |
| | | item.expiration_time = maxTime.ToString("yyyy-MM-dd HH:mm:ss"); |
| | | } |
| | | else |
| | | { |
| | | result.ResultCode = 1; |
| | | result.ResultMsg = $"未查询到物料存放时间配置信息,条形码:{item.bc_entried}"; |
| | | return result; |
| | | } |
| | | } |
| | | } |
| | | |
| | | var container = ContainerHelper.GetCntr(model.trayCode); |
| | | if (container != null) |
| | | if (container != null) |
| | | { |
| | | Location startLoc = LocationHelper.GetLoc(model.startLoc); |
| | | Location endLoc = WMSHelper.GetInstockEndLoc(container.N_TYPE, model.startLoc, 2); |
| | |
| | | else |
| | | { |
| | | result.ResultCode = 1; |
| | | result.ResultMsg = "没有空余的货位"; |
| | | result.ResultMsg = "立库没有空余的货位"; |
| | | } |
| | | } |
| | | else |
| | | { |
| | | result.ResultCode = 1; |
| | | result.ResultMsg = "WMS系统中没有该容器"; |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | |
| | | { |
| | | S_ITEM = matl.item, |
| | | S_BC_ENTRIED = matl.bc_entried, |
| | | S_TOOLING_CODE = matl.toolineCode, |
| | | S_MCN = matl.mcn, |
| | | S_OPR = matl.opr, |
| | | TXNDATE = DateTime.Parse(matl.txndate, enGB) , |
| | | S_SHIFT = matl.shift, |
| | | N_QTY = matl.qty, |
| | | N_STOCK = matl.stock, |
| | | S_LOKASI = matl.lokasi, |
| | | S_SARANA = matl.sarana, |
| | | BOM1 = matl.bom1, |
| | | BOM2 = matl.bom2, |
| | | BOM3 = matl.bom3, |
| | | S_FOVRAGE = matl.fovrage, |
| | | S_JDGE = matl.jdge, |
| | | N_OVERAGE = matl.overagv, |
| | | N_MINHOUR = matl.minhour, |
| | | N_PRODUCT_TYPE_CODE = matl.productTypeCode, |
| | | LAST_MODIFY_TIME = matl.last_modify_time |
| | | }; |
| | | itemBarcodeInfos.Add(itemBarcodeInfo); |
| | |
| | | if (!bo) |
| | | { |
| | | responseResult.ResultCode = 1; |
| | | responseResult.ResultMsg = "同步物料条码信息失败"; |
| | | responseResult.ResultMsg = "同步GT条码物料信息失败"; |
| | | } |
| | | return responseResult; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 同步物料状态信息 |
| | | /// 同步条码状态信息 |
| | | /// </summary> |
| | | /// <param name="updateMatlStatuses"></param> |
| | | /// <returns></returns> |
| | | public static ReturnResult synUpdateMatlStatus(List<UpdateMatlStatus> updateMatlStatuses) |
| | | public static ReturnResult synBarcodeStatus(List<UpdateMatlStatus> updateMatlStatuses) |
| | | { |
| | | ReturnResult responseResult = new ReturnResult(); |
| | | var bo = WMSHelper.batchUpdateItemStatus(updateMatlStatuses); |
| | | if (!bo) |
| | | List<iWMS_semi_bld_BCstatus> list = new List<iWMS_semi_bld_BCstatus> (); |
| | | if (updateMatlStatuses.Count > 0) |
| | | { |
| | | responseResult.ResultCode = 1; |
| | | responseResult.ResultMsg = "同步物料状态信息失败"; |
| | | } |
| | | return responseResult; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 同步更新物料存放时间配置信息 |
| | | /// </summary> |
| | | /// <param name="overages"></param> |
| | | /// <returns></returns> |
| | | public static ReturnResult synUpdateMatlTimeConfig(List<MatlOverage> overages) |
| | | { |
| | | ReturnResult responseResult = new ReturnResult(); |
| | | if (overages != null && overages.Count > 0) |
| | | { |
| | | List<Overage> overageList = new List<Overage>(); |
| | | foreach (var item in overages) |
| | | foreach (var item in updateMatlStatuses) |
| | | { |
| | | Overage overage = new Overage |
| | | iWMS_semi_bld_BCstatus bCstatus = new iWMS_semi_bld_BCstatus() |
| | | { |
| | | MCNGRP = item.mcngrp, |
| | | ITEMPATT = item.itempatt, |
| | | OVERAGE = item.overage, |
| | | MINHOUR = float.Parse(item.minhour.ToString()), |
| | | FLAG_STS = item.flag_sts, |
| | | RECID = item.recid, |
| | | S_BC_ENTRIED = item.bc_entried, |
| | | S_MCNGRP = item.mcngrp, |
| | | S_JDGE = item.jdge, |
| | | LAST_MODIFY_TIME = item.last_modify_time |
| | | }; |
| | | overageList.Add(overage); |
| | | list.Add(bCstatus); |
| | | } |
| | | var bo = WMSHelper.batchUpdateMatlTimeConfig(overageList); |
| | | |
| | | var bo = WMSHelper.synBarcodeStatus(list); |
| | | if (!bo) |
| | | { |
| | | responseResult.ResultCode = 1; |
| | | responseResult.ResultMsg = "同步物料状态信息失败"; |
| | | responseResult.ResultMsg = "同步条码状态信息失败"; |
| | | } |
| | | } |
| | | return responseResult; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 记录数据同步时间 |
| | | /// 同步条码状态信息 |
| | | /// </summary> |
| | | /// <param name="model"></param> |
| | | /// <param name="updateMatlStatuses"></param> |
| | | /// <returns></returns> |
| | | public static ReturnResult recordDataSynTime(RecordDataSynTimeModel model) |
| | | public static ReturnResult synSamplingStatus(List<UpdateMatlStatus> updateMatlStatuses) |
| | | { |
| | | ReturnResult responseResult = new ReturnResult(); |
| | | SynDataTimeRecord record = new SynDataTimeRecord() |
| | | List<iWMS_semi_bld_BCsample> list = new List<iWMS_semi_bld_BCsample>(); |
| | | if (updateMatlStatuses.Count > 0) |
| | | { |
| | | S_SYN_TIME = model.sysTime, |
| | | N_SYN_NUM = model.synNum, |
| | | RECORD_TABLE = model.recordTable |
| | | }; |
| | | var bo = WMSHelper.addSynDataTimeReord(record); |
| | | if (!bo) |
| | | { |
| | | responseResult.ResultCode = 1; |
| | | responseResult.ResultMsg = "记录数据同步时间失败"; |
| | | foreach (var item in updateMatlStatuses) |
| | | { |
| | | iWMS_semi_bld_BCsample bCstatus = new iWMS_semi_bld_BCsample() |
| | | { |
| | | S_BC_ENTRIED = item.bc_entried, |
| | | S_MCNGRP = item.mcngrp, |
| | | S_JDGE = item.jdge, |
| | | LAST_MODIFY_TIME = item.last_modify_time |
| | | }; |
| | | list.Add(bCstatus); |
| | | } |
| | | |
| | | var bo = WMSHelper.synSamplingStatus(list); |
| | | if (!bo) |
| | | { |
| | | responseResult.ResultCode = 1; |
| | | responseResult.ResultMsg = "同步条码状态信息失败"; |
| | | } |
| | | } |
| | | return responseResult; |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// 查询上一次的数据同步时间 |
| | | /// </summary> |
| | | /// <param name="recordTable"></param> |
| | | /// <param name="tableType"></param> |
| | | /// <returns></returns> |
| | | public static ReturnResult findLastDataSynTime(string recordTable) |
| | | public static ReturnResult findDataLastSynTime(int tableType) |
| | | { |
| | | ReturnResult responseResult = new ReturnResult(); |
| | | var synDataTime = WMSHelper.getLastDataSynTime(recordTable); |
| | | if (synDataTime != null) |
| | | { |
| | | Dictionary<string, string> map = new Dictionary<string, string>(); |
| | | map.Add("S_SYN_TIME", synDataTime.S_SYN_TIME); |
| | | map.Add("RECORD_TABLE", synDataTime.RECORD_TABLE); |
| | | responseResult.data = map; |
| | | } |
| | | var synDataTime = WMSHelper.getDataLastSynTime(tableType); |
| | | responseResult.data = synDataTime; |
| | | return responseResult; |
| | | } |
| | | |
| | |
| | | public class CreateOutOrderModel |
| | | { |
| | | public string taskNo { get; set; } // 任务号 |
| | | public string trayCode { get; set; } // 任务号 |
| | | public string trayCode { get; set; } // 托盘号 |
| | | public string itemCode { get; set; } // 物料编码 |
| | | public string endLoc { get; set; } // 终点货位 |
| | | public int priority { get; set; } = 0; // 优先级 默认0 |
| | | public int taskType { get; set; } = 1; // 1.成型机叫料任务 2.抽检出库任务 |
| | | } |
| | | |
| | | public class EmptyTrayOutOrderModel |
| | |
| | | { |
| | | public string item { get; set; } // 物品代码 |
| | | public string bc_entried { get; set; } // 条形码编号 |
| | | public string toolineCode { get; set; } // 工装条码 |
| | | public string mcn { get; set; } // 机器代码编号 |
| | | public string opr { get; set; } // 操作员 |
| | | public string txndate { get; set; } // 生产时间 |
| | | public string shift { get; set; } // 工作班次 |
| | | public int qty { get; set; } // 产品数量 |
| | | public string sarana { get; set; } // 产品材料的托盘/盒/推车/货车ID |
| | | public string fovrage { get; set; } // 是否过期的状态 Y=过期,N=未过期 |
| | | public string jdge { get; set; } // 质量状态 OK=产品合格,NG=产品不合格,HLM=产品待定 |
| | | public string effective_time { get; set; } // 生效时间 (yyyy-MM-dd HH:mm:ss) |
| | | public string expiration_time { get; set; } // 失效时间 (yyyy-MM-dd HH:mm:ss) |
| | | public string jdge { get; set; } // 质量状态 OK=产品合格,HOLD = 产品待定 |
| | | public int overage { get; set; } // 生效时间 (yyyy-MM-dd HH:mm:ss) |
| | | public int minhour { get; set; } // 失效时间 (yyyy-MM-dd HH:mm:ss) |
| | | public int productTypeCode { get; set; } // 失效时间 (yyyy-MM-dd HH:mm:ss) |
| | | } |
| | | |
| | | |
| | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 3.成型机叫料出库任务 |
| | | /// 3.叫料出库任务 |
| | | /// 业务场景: |
| | | /// 1.成型机呼叫流程(带束/零度 、胎侧 、BEC、内衬、帘布、胎圈/三角胶) |
| | | /// 2.抽检出库 |
| | | /// </summary> |
| | | /// <param name="model"></param> |
| | | /// <returns></returns> |
| | | [HttpPost] |
| | | public ReturnResult createOutOrder(CreateOutOrderModel model) |
| | | { |
| | | LogHelper.Info("【3.成型机叫料出库任务】request:" + JsonConvert.SerializeObject(model), "WMS"); |
| | | LogHelper.Info("【3.叫料出库任务】request:" + JsonConvert.SerializeObject(model), "WMS"); |
| | | var result = ApiHelper.createOutOrder(model); |
| | | LogHelper.Info("【3.成型机叫料出库任务】response:" + JsonConvert.SerializeObject(result), "WMS"); |
| | | LogHelper.Info("【3.叫料出库任务】response:" + JsonConvert.SerializeObject(result), "WMS"); |
| | | return result; |
| | | } |
| | | |
| | |
| | | LogHelper.Info("【6.下发母拖出入库任务】response:" + JsonConvert.SerializeObject(result), "WMS"); |
| | | return result; |
| | | } |
| | | |
| | | |
| | | // ------------------- WCS ---------------- |
| | | |
| | | /// <summary> |
| | |
| | | LogHelper.Info("【7.WCS任务状态反馈】response:" + JsonConvert.SerializeObject(result), "WMS"); |
| | | return result; |
| | | } |
| | | |
| | | /*/// <summary> |
| | | /// 8.WCS入库读码反馈 |
| | | /// 业务场景:WCS在执行任务时,回报任务状态 |
| | | /// </summary> |
| | | /// <param name="model"></param> |
| | | /// <returns></returns> |
| | | [HttpPost] |
| | | *//*[Route("notifyTaskStatus")]*//* |
| | | public ReturnResult readCodeFeedback(ReadCodeFeedbackModel model) |
| | | { |
| | | LogHelper.Info("【8.WCS入库读码反馈】Request:" + JsonConvert.SerializeObject(model), "WMS"); |
| | | var result = ApiHelper.readCodeFeedback(model); |
| | | LogHelper.Info("【8.WCS入库读码反馈】response:" + JsonConvert.SerializeObject(result), "WMS"); |
| | | return result; |
| | | }*/ |
| | | |
| | | /// <summary> |
| | | /// 8.WCS反馈货位状态 |
| | |
| | | return result; |
| | | } |
| | | |
| | | public class LocStateFeedBackModel |
| | | { |
| | | public string reqId { get; set; } |
| | | public string reqTime { get; set; } |
| | | public string loc_code { get; set; } // 站台编码 |
| | | public string type { get; set; } // 请求类型 1 允许取货 2 允许放货 |
| | | public string req_no { get; set; } // 任务号 |
| | | } |
| | | |
| | | // ----------------------------------- GT -------------------------------------------------------------- |
| | | |
| | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 10.同步更新物料状态 |
| | | /// 业务场景:GT的状态进行更新,wms也需要同步更新 |
| | | /// 10.同步条码状态信息 |
| | | /// </summary> |
| | | /// <param name="model"></param> |
| | | /// <returns></returns> |
| | | [HttpPost] |
| | | /*[Route("notifyTaskStatus")]*/ |
| | | public ReturnResult synUpdateMatlStatus(SynUpdateMatlStatusModel model) |
| | | public ReturnResult synBarcodeStatus(SynUpdateMatlStatusModel model) |
| | | { |
| | | LogHelper.Info("【10.同步更新物料状态】Request:" + JsonConvert.SerializeObject(model), "GT"); |
| | | var result = ApiHelper.synUpdateMatlStatus(model.updateMatlStatuses); |
| | | LogHelper.Info("【10.同步更新物料状态】response:" + JsonConvert.SerializeObject(result), "GT"); |
| | | LogHelper.Info("【10.同步条码状态表信息】Request:" + JsonConvert.SerializeObject(model), "GT"); |
| | | var result = ApiHelper.synBarcodeStatus(model.updateMatlStatuses); |
| | | LogHelper.Info("【10.同步条码状态表信息】response:" + JsonConvert.SerializeObject(result), "GT"); |
| | | return result; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 11.记录数据同步时间 |
| | | /// 11.同步抽检状态表信息 |
| | | /// </summary> |
| | | /// <param name="model"></param> |
| | | /// <returns></returns> |
| | | [HttpPost] |
| | | /*[Route("notifyTaskStatus")]*/ |
| | | public ReturnResult synSamplingStatus(SynUpdateMatlStatusModel model) |
| | | { |
| | | LogHelper.Info("【11.同步抽检状态表信息】Request:" + JsonConvert.SerializeObject(model), "GT"); |
| | | var result = ApiHelper.synSamplingStatus(model.updateMatlStatuses); |
| | | LogHelper.Info("【11.同步抽检状态表信息】response:" + JsonConvert.SerializeObject(result), "GT"); |
| | | return result; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 11.查询中间表最后的同步时间 |
| | | /// 业务场景:记录物料条码信息同步、物料状态信息同步时间 |
| | | /// </summary> |
| | | /// <param name="model"></param> |
| | | /// <returns></returns> |
| | | [HttpPost] |
| | | /*[Route("notifyTaskStatus")]*/ |
| | | public ReturnResult recordDataSynTime(RecordDataSynTimeModel model) |
| | | public ReturnResult findDataLastSynTime(SynTableModel model) |
| | | { |
| | | LogHelper.Info("【11.记录数据同步时间】Request:" + JsonConvert.SerializeObject(model), "GT"); |
| | | var result = ApiHelper.recordDataSynTime(model); |
| | | LogHelper.Info("【11.记录数据同步时间】response:" + JsonConvert.SerializeObject(result), "GT"); |
| | | return result; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 12.查询上一次的数据同步时间 |
| | | /// 业务场景:记录物料条码信息同步、物料状态信息同步时间 |
| | | /// </summary> |
| | | /// <param name="model"></param> |
| | | /// <returns></returns> |
| | | [HttpPost] |
| | | /*[Route("notifyTaskStatus")]*/ |
| | | public ReturnResult findLastDataSynTime(RecordDataSynTimeModel model) |
| | | { |
| | | LogHelper.Info("【12.查询上一次的数据同步时间】Request:" + JsonConvert.SerializeObject(model), "GT"); |
| | | var result = ApiHelper.findLastDataSynTime(model.recordTable); |
| | | LogHelper.Info("【12.查询上一次的数据同步时间】response:" + JsonConvert.SerializeObject(result), "GT"); |
| | | return result; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 13.同步更新物料存放时间配置表 |
| | | /// </summary> |
| | | /// <param name="model"></param> |
| | | /// <returns></returns> |
| | | [HttpPost] |
| | | /*[Route("notifyTaskStatus")]*/ |
| | | public ReturnResult synUpdateMatlTimeConfig(MatlTimeConfigModel model) |
| | | { |
| | | LogHelper.Info("【13.同步更新物料存放时间配置表】Request:" + JsonConvert.SerializeObject(model), "GT"); |
| | | var result = ApiHelper.synUpdateMatlTimeConfig(model.overages); |
| | | LogHelper.Info("【13.同步更新物料存放时间配置表】response:" + JsonConvert.SerializeObject(result), "GT"); |
| | | LogHelper.Info("【11.查询上一次的数据同步时间】Request:" + JsonConvert.SerializeObject(model), "GT"); |
| | | var result = ApiHelper.findDataLastSynTime(model.tableType); |
| | | LogHelper.Info("【11.查询上一次的数据同步时间】response:" + JsonConvert.SerializeObject(result), "GT"); |
| | | return result; |
| | | } |
| | | |
| | |
| | | public string last_modify_time { get; set; } |
| | | } |
| | | |
| | | public class RecordDataSynTimeModel |
| | | public class LocStateFeedBackModel |
| | | { |
| | | public string sysTime { get; set; } // 同步时间 |
| | | public int synNum { get; set; } // 同步数量 |
| | | public string recordTable { get; set; } // 1.物料条码记录表 2.胚胎条码状态表 3.物料存放时间配置表 |
| | | public string reqId { get; set; } |
| | | public string reqTime { get; set; } |
| | | public string loc_code { get; set; } // 站台编码 |
| | | public string type { get; set; } // 请求类型 1 允许取货 2 允许放货 |
| | | public string req_no { get; set; } // 任务号 |
| | | } |
| | | |
| | | public class SynTableModel |
| | | { |
| | | public int tableType { get; set; } // 1.半制品条码信息表 2.条码状态表 3.抽检状态表 |
| | | } |
| | | |
| | | public class SynUpdateMatlStatusModel |
| | |
| | | public class UpdateMatlStatus |
| | | { |
| | | public string bc_entried { get; set; } |
| | | public string mcngrp { get; set; } |
| | | public string jdge { get; set; } |
| | | public string last_modify_time { get; set; } |
| | | } |
| | | |
| | | public class SynMatlInformationModel |
| | |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | /// <summary> |
| | | /// 条码状态更新 |
| | | /// </summary> |
| | | public static void BarcodeStatusUpdate() |
| | | { |
| | | |
| | | } |
| | | |
| | | } |
| | | } |
| | |
| | | { |
| | | LogHelper.Info($"任务号:{TN_Task.S_CODE},AGV任务完成,任务信息回报GT", "AGV"); |
| | | string shift = ApiHelper.getShift(DateTime.Now.TimeOfDay); |
| | | string ydate_shiftName = ""; |
| | | string ydate= ""; |
| | | if (shift == "III") |
| | | { |
| | | ydate_shiftName = DateTime.Now.AddDays(-1).ToString("yy/MM/dd") + "-" + shift; |
| | | ydate = DateTime.Now.AddDays(-1).ToString("dd/MM/yy"); |
| | | } |
| | | else |
| | | { |
| | | ydate_shiftName = DateTime.Now.ToString("yy/MM/dd") + "-" + shift; |
| | | ydate = DateTime.Now.ToString("dd/MM/yy"); |
| | | } |
| | | WmsToGtLokasiModel wmsToGtLokasiModel = new WmsToGtLokasiModel() |
| | | Trfloc trfloc = new Trfloc() |
| | | { |
| | | ydate_shiftName = ydate_shiftName, |
| | | recid = 1, |
| | | ydate = ydate, |
| | | shift = shift, |
| | | bc_entried = cntrItemRels[0].S_CG_ID, |
| | | loc_from = TN_Task.S_START_LOC, |
| | | loc_to = TN_Task.S_END_LOC, |
| | | qty = 1, |
| | | qty = cntrItemRels[0].F_QTY, |
| | | lot = 1, |
| | | scantime = TN_Task.T_CREATE.ToString("yyyy-MM-dd HH:mm:ss"), |
| | | pic = model.ForkliftNo |
| | | pic = model.ForkliftNo, |
| | | last_modify_time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") |
| | | }; |
| | | GtDispatch.agvTaskFeedback(wmsToGtLokasiModel); |
| | | |
| | | } |
| | | break; |
| | | case 7: |
| | |
| | | { |
| | | // 满料托盘入库 |
| | | itemCode = cntrItemRels[0].S_ITEM_CODE; |
| | | int itemType = cntrItemRels[0].N_PRODUCT_TYPE_CODE; |
| | | var endLoc = WMSHelper.GetInstockEndLoc(container.N_TYPE, null, 1, itemCode); |
| | | if (endLoc != null) |
| | | { |
| | |
| | | |
| | | public class WmsToGtLokasiModel |
| | | { |
| | | public string ydate_shiftName { get; set; } // 时间_班次 |
| | | public int recid { get; set; } |
| | | public string ydate { get; set; } // 班次日期 |
| | | public string shift { get; set; } // 班次 |
| | | public string bc_entried { get; set; } // 条码 |
| | | public string loc_from { get; set; } // 起点货位 |
| | | public string loc_to { get; set; } // 终点货位 |
| | | public int qty { get; set; } // 数量 |
| | | public int lot { get; set; } // 托数 |
| | | public float qty { get; set; } // 数量 |
| | | public int lot { get; set; } = 1; // 托数 |
| | | public string scantime { get; set; } // 扫码创建任务时间 |
| | | public string pic { get; set; } // 小车号 |
| | | public string last_modify_time { get; set; } // 扫码创建任务时间 |
| | | } |
| | | } |
| | | } |
| | |
| | | [SugarTable("TN_CG_Detail")] |
| | | public class CntrItemRel : BaseModel |
| | | { |
| | | public string S_CG_ID { get; set; } // 条形码编码 |
| | | 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; } = "OK"; // OK=产品合格,NG=产品不合格,HLM=产品待定 |
| | | /// <summary> |
| | | /// 1:合格 2:不合格 |
| | | /// </summary> |
| | | public int N_ITEM_STATE { get; set; } |
| | | public string S_BATCH_NO { get; set; } = ""; |
| | | |
| | | public float F_QTY { get; set; } // 产品数量 |
| | | |
| | | [SugarColumn(IsPrimaryKey = true)] |
| | | public string S_CNTR_CODE { get; set; } |
| | | public string S_CNTR_CODE { get; set; } // 容器编码 |
| | | public string S_CG_ID { get; set; } // 条形码编码 |
| | | public string S_ITEM_CODE { get; set; } // 物品代码 |
| | | public string S_ITEM_STATE { get; set; } = "OK"; // OK=产品合格,HODE=产品待定 |
| | | public float F_QTY { get; set; } // 产品数量 |
| | | |
| | | // ------------------ 印尼半制品 ------------------- |
| | | public string S_MCN { get; set; } // 机器代码编号 |
| | | public string S_OPR { get; set; } // 操作员 |
| | | public string S_TXNDATE { get; set; } // 生产时间 |
| | | public string S_SHIFT { get; set; } // 工作班次 |
| | | public string S_FOVRAGE { get; set; } = "N"; // 是否过期的状态 Y=过期,N=未过期 |
| | | public string S_EFFECTIVE_TIME { get; set; } // 生效时间 |
| | | public string S_EXPIRATION_TIME { get; set; } // 失效时间 |
| | | public string S_SARANA { get; set; } // 托盘ID |
| | | public int N_PRODUCT_TYPE_CODE { get; set; } // 物料类别编码 |
| | | } |
| | | } |
| | |
| | | |
| | | namespace HH.WCS.Mobox3.YNJT_BZP.models |
| | | { |
| | | [SugarTable("TN_Item_Barcode_H")] |
| | | /// <summary> |
| | | /// 半制品条码信息表 |
| | | /// </summary> |
| | | [SugarTable("TN_iWMS_semi_BCScan")] |
| | | internal class ItemBarcodeInfo : BaseModel |
| | | { |
| | | public string S_ITEM { get; set; } // 产品材料的物品代码(从条形码数字左侧起截取前10位) |
| | | public string S_BC_ENTRIED { get; set; } // 产品材料的条形码编号 |
| | | public string S_TOOLING_CODE { get; set; } // 工装条码 |
| | | public string S_MCN { get; set; } // 机器代码编号 |
| | | public string S_OPR { get; set; } // 操作员ID |
| | | public DateTime TXNDATE { get; set; } // 产品材料的生产时间 |
| | | public string S_SHIFT { get; set; } // 工作班次代码(班次 I (07:00~14:59) - 班次 II (15:00~22:59) - 班次 III (23:00~06:59)) |
| | | public int N_QTY { get; set; } // 首次扫描的条码的产品数量 |
| | | public int N_STOCK { get; set; } // 在加工过程中的实时库存数量 |
| | | public string S_LOKASI { get; set; } // 产品材料的位置/位置ID |
| | | public string S_SARANA { get; set; } // 产品材料的托盘/盒/推车/货车ID |
| | | public string BOM1 { get; set; } |
| | | public string BOM2 { get; set; } |
| | | public string BOM3 { get; set; } |
| | | public string S_FOVRAGE { get; set; } // 是否过期 是否过期(null 或 空 默认 否) Y/N |
| | | public string S_JDGE { get; set; } // 质检状态 |
| | | public int N_OVERAGE { get; set; } // 有效期 |
| | | public int N_MINHOUR { get; set; } // 最低放置期 |
| | | public int N_PRODUCT_TYPE_CODE { get; set; } // 物料类别编码 |
| | | public string LAST_MODIFY_TIME { get; set; } // 最后修改时间 |
| | | } |
| | | } |
| | |
| | | { |
| | | public string item { get; set; } // 产品材料的物品代码(从条形码数字左侧起截取前10位) |
| | | public string bc_entried { get; set; } // 产品材料的条形码编号 |
| | | public string toolineCode { get; set; } // 工装条码 |
| | | public string mcn { get; set; } // 机器代码编号 |
| | | public string opr { get; set; } // 操作员ID |
| | | public string txndate { get; set; } // 产品材料的生产时间 |
| | | public string shift { get; set; } // 工作班次代码(班次 I (07:00~14:59) - 班次 II (15:00~22:59) - 班次 III (23:00~06:59)) |
| | | public int qty { get; set; } // 首次扫描的条码的产品数量 |
| | | public int stock { get; set; } // 在加工过程中的实时库存数量 |
| | | public string lokasi { get; set; } // 产品材料的位置/位置ID |
| | | public string sarana { get; set; } // 产品材料的托盘/盒/推车/货车ID |
| | | public string bom1 { get; set; } |
| | | public string bom2 { get; set; } |
| | | public string bom3 { get; set; } |
| | | public string fovrage { get; set; } // 是否过期 是否过期(null 或 空 默认 否) Y/N |
| | | public string jdge { get; set; } // 质检状态 |
| | | public string jdge { get; set; } // 质检状态 OK / HOLD |
| | | public int overagv { get; set; } // 有效期 |
| | | public int minhour { get; set; } // 最低放置时间(h) |
| | | public int productTypeCode { get; set; } // 物料类别编码 |
| | | public string last_modify_time { get; set; } // 最后修改时间 |
| | | } |
| | | } |
| | |
| | | var list = db.Queryable<CntrItemRel>().Where(a => a.S_CNTR_CODE == cntr).ToList(); |
| | | return list; |
| | | } |
| | | internal static bool BindNewCntrItem(string loc,string cntrCode, string itemCode) { |
| | | var res = false; |
| | | var itemName = ItemHelper.GetItemInfo(itemCode).S_ITEM_NAME; |
| | | var db = new SqlHelper<object>().GetInstance(); |
| | | try { |
| | | db.BeginTran(); |
| | | var cntr = new Container { S_CODE = cntrCode, N_DETAIL_COUNT = 1 }; |
| | | db.Insertable(cntr).ExecuteCommand(); |
| | | //获取物料信息,填充到容器货品明细,方便人工查看 |
| | | var cir = new CntrItemRel { S_CNTR_CODE = cntr.S_CODE.Trim(), F_QTY = 1, S_ITEM_CODE = itemCode, S_ITEM_NAME = itemName }; |
| | | db.Insertable<CntrItemRel>(cir).ExecuteCommand(); |
| | | var lcr = new LocCntrRel { S_CNTR_CODE = cntrCode, S_LOC_CODE = loc }; |
| | | db.Insertable<LocCntrRel>(lcr).ExecuteCommand(); |
| | | db.CommitTran(); |
| | | res = true; |
| | | } |
| | | catch (Exception ex) { |
| | | db.RollbackTran(); |
| | | Console.WriteLine(ex.Message); |
| | | } |
| | | |
| | | return res; |
| | | } |
| | | |
| | | |
| | | internal static bool addCntrItem(string cntrCode, CntrItemRel cntrItemRel) |
| | | { |
| | |
| | | { |
| | | foreach (var itemInfo in itemInfos) |
| | | { |
| | | DateTime txndate = DateTime.Parse(itemInfo.txndate); |
| | | DateTime minTime = txndate.AddHours(itemInfo.minhour); |
| | | DateTime maxTime = txndate.AddDays(itemInfo.overage); |
| | | var effective_time = minTime.ToString("yyyy-MM-dd HH:mm:ss"); |
| | | var expiration_time = maxTime.ToString("yyyy-MM-dd HH:mm:ss"); |
| | | |
| | | CntrItemRel cntrItemRel = new CntrItemRel() |
| | | { |
| | | S_CNTR_CODE = cntrCode, |
| | |
| | | S_MCN = itemInfo.mcn, |
| | | S_ITEM_STATE = itemInfo.jdge, |
| | | F_QTY = itemInfo.qty, |
| | | S_OPR = itemInfo.opr, |
| | | S_TXNDATE = itemInfo.txndate, |
| | | S_SHIFT = itemInfo.shift, |
| | | S_FOVRAGE = itemInfo.fovrage, |
| | | S_EFFECTIVE_TIME = itemInfo.effective_time, |
| | | S_EXPIRATION_TIME = itemInfo.expiration_time, |
| | | S_SARANA = itemInfo.sarana, |
| | | S_EFFECTIVE_TIME = effective_time, |
| | | S_EXPIRATION_TIME = expiration_time, |
| | | N_PRODUCT_TYPE_CODE = itemInfo.productTypeCode |
| | | }; |
| | | ContainerHelper.addCntrItem(cntrCode, cntrItemRel); |
| | | } |
| | |
| | | /// <param name="locCode"></param> |
| | | /// <param name="trayType"></param> |
| | | /// <param name="inWay">入库方式 1.自动入库 2.人工入库</param> |
| | | /// <param name="itemCode">物料编码</param> |
| | | /// <returns></returns> |
| | | public static Location GetInstockEndLoc(int trayType , string locCode = null , int inWay = 1 ,string itemCode = null) |
| | | { |
| | |
| | | try |
| | | { |
| | | db.BeginTran(); |
| | | itemBarcodeInfos.ForEach(item => { |
| | | var itemBarcodeInfo = db.Queryable<ItemBarcodeInfo>().Where(a => a.S_BC_ENTRIED == item.S_BC_ENTRIED).First(); |
| | | if (itemBarcodeInfo == null) |
| | | { |
| | | var bo = db.Insertable<ItemBarcodeInfo>(item).ExecuteCommand() > 0; |
| | | if (!bo) |
| | | if (itemBarcodeInfos.Count > 0) |
| | | { |
| | | itemBarcodeInfos.ForEach(item => { |
| | | var itemBarcodeInfo = db.Queryable<ItemBarcodeInfo>().Where(a => a.S_BC_ENTRIED == item.S_BC_ENTRIED).First(); |
| | | if (itemBarcodeInfo == null) |
| | | { |
| | | result = false; |
| | | LogHelper.Info($"添加物料条码信息失败,物料条码信息:{JsonConvert.SerializeObject(item)}", "GT"); |
| | | var bo = db.Insertable<ItemBarcodeInfo>(item).ExecuteCommand() == 0; |
| | | if (bo) |
| | | { |
| | | result = false; |
| | | LogHelper.Info($"添加物料条码信息失败,物料条码信息:{JsonConvert.SerializeObject(item)}", "GT"); |
| | | } |
| | | } |
| | | } |
| | | }); |
| | | if (result) |
| | | { |
| | | db.CommitTran(); |
| | | }); |
| | | } |
| | | else |
| | | { |
| | | db.RollbackTran(); |
| | | } |
| | | db.CommitTran(); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | |
| | | db.RollbackTran(); |
| | | } |
| | | return result; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 同步条码状态表 |
| | | /// </summary> |
| | | /// <returns></returns> |
| | | public static bool synBarcodeStatus(List<iWMS_semi_bld_BCstatus> model) |
| | | { |
| | | bool result = true; |
| | | var db = new SqlHelper<object>().GetInstance(); |
| | | try |
| | | { |
| | | db.BeginTran(); |
| | | if (model.Count > 0) |
| | | { |
| | | model.ForEach(update => { |
| | | db.Insertable(update).ExecuteCommand(); |
| | | }); |
| | | } |
| | | db.CommitTran(); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | LogHelper.Info($"同步条码状态表错误,错误信息:{ex.Message}", "GT"); |
| | | db.RollbackTran(); |
| | | result = false; |
| | | } |
| | | return result; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 同步抽检状态表 |
| | | /// </summary> |
| | | /// <returns></returns> |
| | | public static bool synSamplingStatus(List<iWMS_semi_bld_BCsample> model) |
| | | { |
| | | bool result = true; |
| | | var db = new SqlHelper<object>().GetInstance(); |
| | | try |
| | | { |
| | | db.BeginTran(); |
| | | if (model.Count > 0) |
| | | { |
| | | model.ForEach(update => { |
| | | db.Insertable(update).ExecuteCommand(); |
| | | }); |
| | | } |
| | | db.CommitTran(); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | LogHelper.Info($"同步抽检状态表错误,错误信息:{ex.Message}", "GT"); |
| | | db.RollbackTran(); |
| | | result = false; |
| | | } |
| | | return result; |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | try |
| | | { |
| | | db.BeginTran(); |
| | | updateMatlStatuses.ForEach(update => { |
| | | var itemBarcodeInfo = db.Queryable<ItemBarcodeInfo>().Where(a => a.S_BC_ENTRIED == update.bc_entried).First(); |
| | | if (itemBarcodeInfo != null) |
| | | { |
| | | itemBarcodeInfo.S_JDGE = update.jdge; |
| | | db.Updateable(itemBarcodeInfo).ExecuteCommand(); |
| | | var cntrItemRel = db.Queryable<CntrItemRel>().Where(a => a.S_CG_ID == update.bc_entried).First(); |
| | | if (cntrItemRel != null) |
| | | if (updateMatlStatuses.Count > 0) |
| | | { |
| | | updateMatlStatuses.ForEach(update => { |
| | | var itemBarcodeInfo = db.Queryable<ItemBarcodeInfo>().Where(a => a.S_BC_ENTRIED == update.bc_entried).First(); |
| | | if (itemBarcodeInfo != null) |
| | | { |
| | | // 将MES的物料状态转化成WMS可识别的物料状态 |
| | | if (update.jdge == "" || update.jdge == null) |
| | | itemBarcodeInfo.S_JDGE = update.jdge; |
| | | db.Updateable(itemBarcodeInfo).ExecuteCommand(); |
| | | var cntrItemRel = db.Queryable<CntrItemRel>().Where(a => a.S_CG_ID == update.bc_entried).First(); |
| | | if (cntrItemRel != null) |
| | | { |
| | | update.jdge = "OK"; |
| | | db.Updateable<CntrItemRel>().SetColumns(a => new CntrItemRel() { S_ITEM_STATE = update.jdge }).Where(a => a.S_CG_ID == update.bc_entried).ExecuteCommand(); |
| | | } |
| | | else if (update.jdge != "OK") |
| | | { |
| | | update.jdge = "HOLD"; |
| | | } |
| | | db.Updateable<CntrItemRel>().SetColumns(a => new CntrItemRel() { S_ITEM_STATE = update.jdge }).Where(a => a.S_CG_ID == update.bc_entried).ExecuteCommand(); |
| | | } |
| | | } |
| | | }); |
| | | }); |
| | | } |
| | | db.CommitTran(); |
| | | } |
| | | catch (Exception ex) |
| | |
| | | result = false; |
| | | } |
| | | return result; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 批量更新物料状态 |
| | | /// </summary> |
| | | /// <returns></returns> |
| | | public static bool batchUpdateMatlTimeConfig(List<Overage> overages) |
| | | { |
| | | bool result = true; |
| | | var db = new SqlHelper<object>().GetInstance(); |
| | | try |
| | | { |
| | | db.BeginTran(); |
| | | foreach (Overage overage in overages) |
| | | { |
| | | var overage1 = db.Queryable<Overage>().Where(a => a.RECID == overage.RECID).First(); |
| | | if (overage1 != null) |
| | | { |
| | | overage1.MCNGRP = overage.MCNGRP; |
| | | overage1.ITEMPATT = overage.ITEMPATT; |
| | | overage1.OVERAGE = overage.OVERAGE; |
| | | overage1.MINHOUR = overage.MINHOUR; |
| | | overage1.FLAG_STS = overage.FLAG_STS; |
| | | db.Updateable(overage1).ExecuteCommand(); |
| | | } |
| | | else |
| | | { |
| | | db.Insertable(overage).ExecuteCommand(); |
| | | } |
| | | } |
| | | db.CommitTran(); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | LogHelper.Info($"批量更新物料存放时间配置信息错误,错误信息:{ex.Message}", "GT"); |
| | | db.RollbackTran(); |
| | | result = false; |
| | | } |
| | | return result; |
| | | } |
| | | /// <summary> |
| | | /// 查询物料存放时间配置信息 |
| | | /// </summary> |
| | | /// <param name="bc_entried"></param> |
| | | /// <returns></returns> |
| | | public static Overage getOverage(string bc_entried) |
| | | { |
| | | |
| | | var db = new SqlHelper<object>().GetInstance(); |
| | | |
| | | // 直接执行 SQL(参数化查询) |
| | | var sql = "SELECT get_ovg_bar(@barcode, @mcngrp) AS overage_value"; |
| | | var sql1 = "SELECT get_minhour_bar(@barcode, @mcngrp) AS overage_value"; |
| | | |
| | | // 使用匿名对象传递参数 |
| | | var ovg_bar = db.Ado.SqlQuery<int>(sql, new { barcode = bc_entried, mcngrp = "1"}).First(); |
| | | var minhour_bar = db.Ado.SqlQuery<float>(sql1, new { barcode = bc_entried, mcngrp = "1"}).First(); |
| | | Overage overage = new Overage() |
| | | { |
| | | MINHOUR = minhour_bar, |
| | | OVERAGE = ovg_bar |
| | | }; |
| | | return overage; |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | /// <summary> |
| | | /// 查询上一次的同步时间 |
| | | /// </summary> |
| | | /// <param name="recordTable"></param> |
| | | /// <param name="tableType"></param> |
| | | /// <returns></returns> |
| | | public static SynDataTimeRecord getLastDataSynTime(string recordTable) |
| | | public static string getDataLastSynTime(int tableType) |
| | | { |
| | | var db = new SqlHelper<object>().GetInstance(); |
| | | return db.Queryable<SynDataTimeRecord>().Where(a => a.RECORD_TABLE == recordTable).OrderByDescending(a => a.T_CREATE).First(); |
| | | string lastTime = null; |
| | | if (tableType == 1) |
| | | { |
| | | lastTime = db.Queryable<ItemBarcodeInfo>().OrderByDescending(a => a.LAST_MODIFY_TIME).Select(a => a.LAST_MODIFY_TIME).First(); |
| | | } |
| | | else if (tableType == 2) |
| | | { |
| | | |
| | | } |
| | | else if (tableType == 3) |
| | | { |
| | | |
| | | } |
| | | return lastTime; |
| | | } |
| | | } |
| | | } |