using HH.WCS.Mobox3.WeiLi.device; using HH.WCS.Mobox3.WeiLi.dispatch; using HH.WCS.Mobox3.WeiLi.models; using HH.WCS.Mobox3.WeiLi.process; using HH.WCS.Mobox3.WeiLi.util; using HH.WCS.Mobox3.WeiLi.wms; using Newtonsoft.Json; using SqlSugar; using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Threading; using static HH.WCS.Mobox3.WeiLi.api.ApiModel; using static HH.WCS.Mobox3.WeiLi.api.OtherModel; using static HH.WCS.Mobox3.WeiLi.wms.WMSHelper; namespace HH.WCS.Mobox3.WeiLi.api { /// /// api接口辅助类 /// public class ApiHelper { static ApiHelper() { } internal static SimpleResult Putaway_Order_In(Putaway_Order_In model) { var result = new SimpleResult(); //创建入库单主子表 var po = WMSHelper.GetPutawayOrder(model.Data.arrival_no); if (po == null) { po = new PutawayOrder { S_NO = model.Data.arrival_no, S_BS_TYPE = model.Data.op_type }; po.Details = new List(); if (model.Data.items.Count > 0) { model.Data.items.ForEach(a => { po.Details.Add(new PutawayDetail { S_PUTAWAY_NO = model.Data.arrival_no, N_ROW_NO = po.Details.Count + 1, S_ITEM_CODE = a.item_code, F_QTY = a.qty, S_BATCH_NO = a.batch_no, }); }); WMSHelper.CreatePutawayOrder(po); } } return result; } internal static WeiLiResult ItemInfoSync(List model) { WeiLiResult result = new WeiLiResult(); var db = new SqlHelper().GetInstance(); if (model.Count > 0) { model.ForEach(a => { var info = db.Queryable().Where(it => it.S_ITEM_CODE == a.itemCode).First(); if (info != null) { info.S_ITEM_NAME = a.itemName; info.S_IS_MANAGE = a.isManage; info.S_IS_MANAGEDATE = a.isManageDate; db.Updateable(info).UpdateColumns(it => new { it.S_ITEM_NAME, it.S_IS_MANAGE, it.S_IS_MANAGEDATE }).ExecuteCommand(); } else { db.Insertable(new TN_Material { S_ITEM_CODE = a.itemCode, S_ITEM_NAME = a.itemName, S_IS_MANAGE = a.isManage, S_IS_MANAGEDATE = a.isManageDate }).ExecuteCommand(); } //db.Updateable().SetColumns(it => new TN_Material() { S_ITEM_NAME = a.itemName }).Where(it => it.S_ITEM_CODE == a.itemCode).ExecuteCommand(); //db.Updateable().SetColumns(it => new WHInventory() { S_ITEM_NAME = a.itemName }).Where(it => it.S_ITEM_CODE == a.itemCode).ExecuteCommand(); }); } return result; } internal static WeiLiResult FiveCodeSync(List model) { WeiLiResult result = new WeiLiResult(); var db = new SqlHelper().GetInstance(); if (model.Count > 0) { model.ForEach(a => { var info = db.Queryable().Where(it => it.S_FIVE_CODE == a.fiveCode).First(); if (info != null) { info.S_IS_MANAGE = a.isManage; info.S_IS_MANAGEDATE = a.isManageDate; db.Updateable(info).UpdateColumns(it => new { it.S_IS_MANAGE, it.S_IS_MANAGEDATE }).ExecuteCommand(); } else { db.Insertable(new FiveCode { S_FIVE_CODE = a.fiveCode, S_IS_MANAGE = a.isManage, S_IS_MANAGEDATE = a.isManageDate }).ExecuteCommand(); } }); } return result; } internal static WeiLiResult AddTask(AddTaskModel model) { var result = new WeiLiResult(); var db = new SqlHelper().GetInstance(); var cntrweight = model.cntrWeight == 1 ? 2 : model.cntrWeight == 2 ? 3 : model.cntrWeight == 3 ? 11 : model.cntrWeight == 4 ? 30 : model.cntrWeight == 5 ? 150 : 0; if (!string.IsNullOrEmpty(model.startBit) && !string.IsNullOrEmpty(model.endBit)) { if (!string.IsNullOrEmpty(model.TaskNo)) { var taskinfo = db.Queryable().Where(a => a.S_CODE == model.TaskNo).First(); if (taskinfo == null) { var startinfo = db.Queryable().Where(a => a.S_CODE == model.startBit).First(); var endinfo = db.Queryable().Where(a => a.S_CODE == model.endBit).First(); if (startinfo != null && endinfo != null) { if (startinfo.N_LOCK_STATE != 0 || endinfo.N_LOCK_STATE != 0) { result.code = 500; result.msg = "起点或终点货位锁定状态异常 不予创建任务"; return result; } var startloccntr = db.Queryable().Where(a => a.S_LOC_CODE == startinfo.S_CODE).First(); LogHelper.Info("查询起点是否绑定托盘"); if (startloccntr == null) { LogHelper.Info("起点未绑定托盘 准备绑定托盘"); //绑定起点托盘 LocationHelper.BindingLoc(model.startBit, new List() { model.cntrNo }); } else if (startloccntr.S_CNTR_CODE != model.cntrNo) { result.code = 500; result.msg = $"起点已绑定托盘{startloccntr.S_CNTR_CODE} 与任务托盘{model.cntrNo} 不符"; return result; } LogHelper.Info("转运任务 创建作业"); //创建作业 var optask = new WMSTask { S_CODE = model.TaskNo, S_START_LOC = startinfo.S_CODE, S_END_LOC = endinfo.S_CODE, S_END_AREA = endinfo.S_AREA_CODE, S_START_AREA = startinfo.S_AREA_CODE, S_START_WH = startinfo.S_WH_CODE, S_END_WH = endinfo.S_WH_CODE, S_TYPE = "转运", N_TYPE = 3, N_B_STATE = 0, S_CNTR_CODE = model.cntrNo, S_OP_DEF_NAME = "转运", S_BS_NO = model.workNo, N_PRIORITY = model.priority, N_TRAY_WEIGHT = cntrweight }; var note = Settings.Tasktypes.Where(a => a.StartArea == optask.S_START_AREA && a.EndArea == optask.S_END_AREA).FirstOrDefault(); if (note != null) { optask.S_NOTE = note.TaskType; } db.Insertable(optask).ExecuteCommand(); LocationHelper.LockLoc(startinfo.S_CODE, 2); LocationHelper.LockLoc(endinfo.S_CODE, 1); } else { result.code = 500; result.msg = "起点或终点信息有误 查询不到站点信息"; } } else { result.code = 500; result.msg = "任务号重复 请勿重复下发任务"; } } else { result.code = 500; result.msg = "任务号不能为空"; } } else { result.code = 500; result.msg = "起点或终点不能为空"; } return result; } internal static SimpleResult ErrorOperation(MoboxOperationBase model) { var result = new SimpleResult(); var db = new SqlHelper().GetInstance(); var wmsTask = db.Queryable().Where(a => a.S_CODE == model.OperationNo).First(); if (wmsTask != null) { LogHelper.Info($"清除错误作业 解绑托盘 托盘{wmsTask.S_CNTR_CODE}"); db.Deleteable().Where(a => a.S_CNTR_CODE == wmsTask.S_CNTR_CODE).ExecuteCommand(); db.Deleteable().Where(a => a.S_CNTR_CODE == wmsTask.S_CNTR_CODE).ExecuteCommand(); var locInfo = db.Queryable().Where(a => a.S_CODE == wmsTask.S_START_LOC).First(); if (locInfo != null) { LogHelper.Info($"清除错误作业 重置货位状态 货位{locInfo.S_CODE}"); locInfo.N_CURRENT_NUM = 0; locInfo.N_LOCK_STATE = 0; locInfo.S_LOCK_STATE = "无"; db.Updateable(locInfo).UpdateColumns(it => new { it.N_CURRENT_NUM, it.S_LOCK_STATE, it.N_LOCK_STATE }).ExecuteCommand(); } } return result; } internal static TaskStateresutl GetTaskState(GetTaskStateModel model) { var db = new SqlHelper().GetInstance(); TaskStateresutl result = new TaskStateresutl { success = false, code = 0 }; if (!string.IsNullOrEmpty(model.taskNo)) { var info = db.Queryable().Where(a => a.S_OP_CODE == model.taskNo).First(); if (info != null) { var TaskStates = db.Queryable().Where(a => a.S_TASK_CODE == info.S_CODE).ToList(); TaskStates = TaskStates.OrderBy(a => a.T_CREATE).ToList(); for (int i = 0; i < TaskStates.Count; i++) { TaskState task = new TaskState { state = TaskStates[i].N_ACTION_CODE.ToString(), errMsg = "", taskNo = model.taskNo, transferTime = TaskStates[i].T_CREATE.ToString() }; if (!string.IsNullOrEmpty(TaskStates[i].S_EQ_CODE)) { task.agvNo = int.Parse(TaskStates[i].S_EQ_CODE); } result.data.Add(task); } result.success = true; } else { result.code = 1; result.msg = "该任务号没有状态记录!"; } } else { result.code = 1; result.msg = "请求任务号不能为空!"; } return result; } internal static SimpleResult WeiLiDisbutionIn(WeiLiDisbutionInMolde model) { int Ntype = 0; string Stype = ""; string S_OP_DEF_NAME = ""; var result = new SimpleResult { resultCode = 0 }; Location end = null; var db = new SqlHelper().GetInstance(); if (model.isTask == "Y") { if (string.IsNullOrEmpty(model.endArea) && string.IsNullOrEmpty(model.endLoc)) { Ntype = 1; Stype = "入库"; S_OP_DEF_NAME = "分拣回"; } else { Ntype = 2; Stype = "出库"; S_OP_DEF_NAME = "分拣出"; } var TrayPrefix = model.cntrNo.Substring(0, 2); var endinfo = Settings.LKCodes.Where(a => a.TrayPrefix == TrayPrefix).FirstOrDefault(); if (endinfo != null) { if (string.IsNullOrEmpty(model.endArea)) { model.endArea = endinfo.LiKuCode; } } else { result.resultCode = -1; result.resultMsg = "终点库区为空 默认回库 找不到托盘前缀对应的回库库区"; return result; } if (!string.IsNullOrEmpty(model.endLoc)) { end = db.Queryable().Where(a => a.S_CODE == model.endLoc).First(); if (end != null) { if (end.N_LOCK_STATE != 0 || end.N_CURRENT_NUM != 0) { result.resultCode = 1; result.resultMsg = "终点货位状态不满足生成任务"; return result; } } else { result.resultCode = 1; result.resultMsg = "终点货位信息不存在"; return result; } } var cntrinfo = db.Queryable().Where(a => a.S_CNTR_CODE == model.cntrNo).First(); if (cntrinfo != null) { var start = db.Queryable().Where(a => a.S_CODE == cntrinfo.S_LOC_CODE).First(); if (start != null) { if (start.N_LOCK_STATE == 0) { var conntinfo = Settings.ConnetAreas.Where(a => a.FullList.Contains(start.S_CODE) || a.EmptyList.Contains(start.S_CODE)).FirstOrDefault(); if (conntinfo != null) { var id = DateTime.Now.Ticks.ToString(); var reqinfo = db.Queryable().Where(a => a.S_CNTR_CODE == model.cntrNo && a.S_NO == model.workNo).First(); if (reqinfo != null) { id = reqinfo.S_REPEAT; } else { reqinfo = new TN_PRICE { S_NO = model.workNo, S_CNTR_CODE = model.cntrNo, S_REPEAT = id }; db.Insertable(reqinfo).ExecuteCommand(); } if (!string.IsNullOrEmpty(model.endLoc)) { //创建作业 var optask = new WMSTask { S_CODE = WMSHelper.GenerateTaskNo(), S_START_WH = start.S_WH_CODE, S_START_LOC = start.S_CODE, S_START_AREA = start.S_AREA_CODE, S_END_LOC = end.S_CODE, S_END_AREA = end.S_AREA_CODE, S_END_WH = end.S_WH_CODE, S_STATION_LOC = conntinfo.Station, N_TYPE = Ntype, S_TYPE = Stype, N_B_STATE = 0, S_CNTR_CODE = model.cntrNo, S_OP_DEF_NAME = S_OP_DEF_NAME, S_BS_NO = model.workNo }; var note = Settings.Tasktypes.Where(a => a.StartArea == optask.S_START_AREA && a.EndArea == optask.S_END_AREA).FirstOrDefault(); if (note != null) { optask.S_NOTE = note.TaskType; } var res = db.Insertable(optask).ExecuteCommand() > 0; LocationHelper.LockLoc(start.S_CODE, 2); LocationHelper.LockLoc(end.S_CODE, 1); } else { //创建作业 var optask = new WMSTask { S_CODE = WMSHelper.GenerateTaskNo(), S_START_WH = start.S_WH_CODE, S_START_LOC = start.S_CODE, S_START_AREA = start.S_AREA_CODE, S_END_LOC = "", S_END_AREA = model.endArea, S_END_WH = start.S_WH_CODE, S_STATION_LOC = conntinfo.Station, N_TYPE = Ntype, S_TYPE = Stype, N_B_STATE = 0, S_CNTR_CODE = model.cntrNo, S_OP_DEF_NAME = S_OP_DEF_NAME, S_BS_NO = model.workNo }; var note = Settings.Tasktypes.Where(a => a.StartArea == optask.S_START_AREA && a.EndArea == optask.S_END_AREA).FirstOrDefault(); if (note != null) { optask.S_NOTE = note.TaskType; } var res = db.Insertable(optask).ExecuteCommand() > 0; LocationHelper.LockLoc(start.S_CODE, 2); } } else { result.resultCode = -2; result.resultMsg = $"货位{start.S_CODE} 在接驳库区配置中找不到对应的拣货位信息"; } } else { result.resultCode = -3; result.resultMsg = $"货位{start.S_CODE} 当前状态为{start.S_LOCK_STATE} 不予生成任务"; } } else { result.resultCode = -1; result.resultMsg = $"查询不到托盘{model.cntrNo} 绑定货位{cntrinfo.S_LOC_CODE}的货位信息"; } } else { result.resultCode = -1; result.resultMsg = $"查询不到托盘{model.cntrNo} 的绑定货位"; } } else { //人工库出库 解绑起点货位 var url = Settings.ZTSeverUrl2 + "/business/BU_HX02"; var id = DateTime.Now.Ticks.ToString(); var reqinfo = db.Queryable().Where(a => a.S_CNTR_CODE == model.cntrNo && a.S_NO == model.workNo).First(); if (reqinfo != null) { id = reqinfo.S_REPEAT; } else { reqinfo = new TN_PRICE { S_NO = model.workNo, S_CNTR_CODE = model.cntrNo, S_REPEAT = id }; db.Insertable(reqinfo).ExecuteCommand(); } var req = new { shippingNoteNo = model.workNo, cntrNo = "", destLocation = "", repeat = id, data = new List() }; model.data.ForEach(it => { req.data.Add(new { itemCode = it.itemCode, factoryCode = string.IsNullOrEmpty(it.factoryCode) ? "" : it.factoryCode, stockCode = string.IsNullOrEmpty(it.stockLocation) ? "" : it.stockLocation, qty = Convert.ToInt32(it.qty), vendorCode = string.IsNullOrEmpty(it.vendorCode) ? "" : it.vendorCode, batchNo = string.IsNullOrEmpty(it.batchNo) ? "" : it.batchNo, serialNo = string.IsNullOrEmpty(it.serialNo) ? "" : it.serialNo }); }); LogHelper.Info($"出库完成任务回报 地址{url} 接口参数{JsonConvert.SerializeObject(req)}"); var feedback = new HttpHelper().WebPost(url, JsonConvert.SerializeObject(req)); if (!string.IsNullOrEmpty(feedback)) { var weilires = JsonConvert.DeserializeObject(feedback); if (weilires.code == 200) { LogHelper.Info($"接口反馈成功"); } else { LogHelper.Info($"出库完成任务回报 反馈失败 失败原因={weilires.msg}"); result.resultCode = -2; result.resultMsg = $"回报中台出库单完成错误 错误信息{weilires.msg}"; return result; } } else { LogHelper.Info($"出库完成任务回报 反馈超时"); result.resultCode = -2; result.resultMsg = $"出库完成任务回报 反馈超时"; return result; } //解绑起点 var cntrinfo = db.Queryable().Where(a => a.S_CNTR_CODE == model.cntrNo).First(); if (cntrinfo != null) { var start = db.Queryable().Where(a => a.S_CODE == cntrinfo.S_LOC_CODE).First(); if (start != null) { var deletechange = true; //降量 url = Settings.MoboxSeverUrl + "inventory/AddChange"; //仓库量表升量 var req1 = new AddChangeModel { op_type = 4 }; //库区量表升量 var req2 = new AddChangeModel { op_type = 7 }; model.data.ForEach(a => { LogHelper.Info($"填充数据"); LogHelper.Info($"减仓库量表数据 仓库{start.S_WH_CODE} 物料编码{a.itemCode} 物料名称{a.itemName} 数量{a.qty}"); req1.item_info.Add(new AddChangeModel.itemModel { wh_code = start.S_WH_CODE, item_code = a.itemCode, item_name = a.itemName, qty = a.qty }); LogHelper.Info($"减库区量表数据 库区{start.S_AREA_CODE} 物料编码{a.itemCode} 物料名称{a.itemName} 数量{a.qty}"); req2.item_info.Add(new AddChangeModel.itemModel { area_code = start.S_AREA_CODE, wh_code = start.S_WH_CODE, item_code = a.itemCode, item_name = a.itemName, qty = a.qty }); }); var reqData = JsonConvert.SerializeObject(req); var AppKey = Settings.AppKey; var AppSecret = Settings.AppSecret; var ReqTime = DateTimeOffset.UtcNow.ToUnixTimeSeconds().ToString(); //var ReqTime = GetTimeStamp(DateTime.Now.AddHours(-8), 1, 2); LogHelper.Info($"加密前 AppKey={AppKey} AppSecret={AppSecret} ReqTime={ReqTime}"); var ReqVerify = GetMd5FromString(AppKey + AppSecret + ReqTime); LogHelper.Info($"加密后 AppKey={AppKey} AppSecret={AppSecret} ReqTime={ReqTime} ReqVerify={ReqVerify} url={url} req={reqData}"); var res = new HttpHelper().WebPost(url, reqData, "application/json", AppKey, ReqTime, ReqVerify); if (!string.IsNullOrEmpty(res)) { LogHelper.Info($"mobox 仓库降量接口返回 {res}"); var moboxres = JsonConvert.DeserializeObject(res); if (moboxres.err_code != 0) { deletechange = false; result.resultCode = -1; result.resultMsg = $"mobox仓库降量失败 失败原因{moboxres.err_msg}"; } } else { LogHelper.Info($"mobox 仓库降量接口返回为空"); deletechange = false; result.resultCode = -1; result.resultMsg = "mobox 仓库降量接口返回为空"; } var reqData2 = JsonConvert.SerializeObject(req2); var ReqTime2 = DateTimeOffset.UtcNow.ToUnixTimeSeconds().ToString(); //var ReqTime2 = GetTimeStamp(DateTime.Now.AddHours(-8), 1, 2); LogHelper.Info($"加密前 AppKey={AppKey} AppSecret={AppSecret} ReqTime={ReqTime2}"); var ReqVerify2 = GetMd5FromString(AppKey + AppSecret + ReqTime2); LogHelper.Info($"加密后 AppKey={AppKey} AppSecret={AppSecret} ReqTime={ReqTime2} ReqVerify={ReqVerify2} url={url} req={reqData2}"); var res2 = new HttpHelper().WebPost(url, reqData2, "application/json", AppKey, ReqTime2, ReqVerify2); if (!string.IsNullOrEmpty(res2)) { LogHelper.Info($"mobox 库区降量接口返回 {res2}"); var moboxres = JsonConvert.DeserializeObject(res); if (moboxres.err_code != 0) { deletechange = false; result.resultCode = -1; result.resultMsg = $"mobox库区降量失败 失败原因{moboxres.err_msg}"; } } else { LogHelper.Info($"mobox 库区降量接口返回为空"); deletechange = false; result.resultCode = -1; result.resultMsg = "mobox库区降量接口返回为空"; } if (deletechange) { foreach (var item in model.data) { var info = new TN_OnOff_Shelves { S_NO = model.workNo, N_ACTION = 2, S_ACTION = "下架", S_ITEM_CODE = item.itemCode, S_ITEM_NAME = item.itemName, S_LOC_CODE = start.S_CODE, S_AREA_CODE = start.S_AREA_CODE, S_CNTR_CODE = model.cntrNo, S_BATCH_NO = item.batchNo, S_SERIAL_NO = item.serialNo, D_PRD_DATE = "", F_QTY = item.qty }; db.Insertable(info).ExecuteCommand(); } //修改起点容量 start.N_CURRENT_NUM = 0; db.Updateable(start).UpdateColumns(it => new { it.N_CURRENT_NUM }).ExecuteCommand(); db.Deleteable(cntrinfo).ExecuteCommand(); } } else { result.resultCode = -1; result.resultMsg = $"查询不到托盘{model.cntrNo} 绑定货位{cntrinfo.S_LOC_CODE}的货位信息"; } } else { result.resultCode = -1; result.resultMsg = $"查询不到托盘{model.cntrNo} 的绑定货位"; } } return result; } internal static WeiLiResult CancelOutWork(CancelOutWorkModel model) { var result = new WeiLiResult(); var db = new SqlHelper().GetInstance(); var OutWork = db.Queryable().Where(a => a.S_BS_NO == model.OutWorkOrder).First(); if (OutWork != null) { if (OutWork.N_B_STATE == 0) { //OutWork.N_B_STATE = 99; //db.Updateable(OutWork).UpdateColumns(it => new { it.N_B_STATE }).ExecuteCommand(); db.Deleteable(OutWork).ExecuteCommand(); db.Deleteable().Where(it => it.S_DO_NO == OutWork.S_NO).ExecuteCommand(); } else { result.code = 500; result.msg = $"出库单{model.OutWorkOrder} 已执行不允许取消"; } } else { result.code = 500; result.msg = $"单号{model.OutWorkOrder} 找不到对应的出库单"; } return result; } internal static SimpleResult WeiLiInstockVerify(WeiLiInstockVerify model) { var result = new SimpleResult(); var db = new SqlHelper().GetInstance(); try { if (!string.IsNullOrEmpty(model.cntrNo) && !string.IsNullOrEmpty(model.isVerify)) { if (model.isVerify == "Y") { var task = db.Queryable().Where(it => it.S_CNTR_CODE == model.cntrNo && it.N_B_STATE == 5).First(); if (task != null) { task.N_B_STATE = 0; WMSHelper.UpdateTaskState(task); result.resultMsg = "入库确认 托盘入立体库"; } else { result.resultCode = 2; result.resultMsg = $"确认失败 找不到该托盘对应的作业"; } } else { result.resultMsg = "入库确认 托盘不入立体库"; } } else { result.resultCode = -1; result.resultMsg = "必填数据不能为空"; } } catch (Exception ex) { LogHelper.Error($"PDA码盘入库确认异常 异常信息={ex.Message}", ex); result.resultCode = 1; result.resultMsg = $"接口异常 异常信息={ex.Message}"; } return result; } internal static List AreaQuery() { var result = new List(); var db = new SqlHelper().GetInstance(); var list = db.Queryable().ToList(); if (list.Count > 0) { list.ForEach(a => { result.Add(new AreaQueryResult { areaCode = a.S_CODE, areaName = a.S_NAME, workRegion = a.S_NOTE, workShop = a.S_WORK_SHOP }); }); } return result; } internal static PlcSendTaskres PlcCallbackState(PlcState model) { var db = new SqlHelper().GetInstance(); var result = new PlcSendTaskres { requestPk = model.requestPk, code = "0" }; string message = ""; if (model.noticeType == "0" || model.noticeType == "ERROR") { //称重 if (model.noticeType == "0") { //外形检测成功 修改任务参数 var wcsTask = db.Queryable().Where(it => it.S_CNTR_CODE == model.contNo && it.N_B_STATE == 2 && it.S_SCHEDULE_TYPE == "NDC").First(); if (wcsTask != null) { wcsTask.N_ERR = 200; db.Updateable(wcsTask).UpdateColumns(it => new { it.N_ERR }).ExecuteCommand(); } } else { //外形检测失败 修改任务参数 var wcsTask = db.Queryable().Where(it => it.S_CNTR_CODE == model.contNo && it.N_B_STATE == 2 && it.S_SCHEDULE_TYPE == "NDC").First(); if (wcsTask != null) { Location endLoc = null; var Setting = Settings.ConnetAreas.Where(a => a.InLocList.Contains(wcsTask.S_END_LOC)).FirstOrDefault(); if (Setting != null) { if (Settings.DBAreas.Contains(wcsTask.S_START_AREA)) { endLoc = db.Queryable().Where(a => a.S_CODE == wcsTask.S_START_LOC).First(); } else { var endArea = Setting.ErrorArea; endLoc = db.Queryable().Where(a => a.S_AREA_CODE == endArea && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0).First(); } if (endLoc != null) { var wmsTask = db.Queryable().Where(a => a.S_CODE == wcsTask.S_OP_CODE).First(); if (wmsTask != null) { var PlcTask = db.Queryable().Where(it => it.S_CNTR_CODE == model.contNo && (it.N_B_STATE == 2 || it.N_B_STATE == 1) && it.S_SCHEDULE_TYPE == "WCS").First(); if (PlcTask != null) { TaskProcess.Cancel(PlcTask); //取消plc任务 TaskProcess.OperateStatus(PlcTask, 7); WCSHelper.Fail(PlcTask); } LocationHelper.UnLockLoc(wmsTask.S_END_LOC); LocationHelper.LockLoc(endLoc.S_CODE, 1); LocationHelper.LockLoc(wcsTask.S_END_LOC, 2); wcsTask.S_ERR_LOC = endLoc.S_CODE; wcsTask.N_ERR = 500; db.Updateable(wcsTask).UpdateColumns(it => new { it.N_ERR, it.S_ERR_LOC }).ExecuteCommand(); } } else { LogHelper.Info($"外形检测失败 未找到退货终点"); } } } } } else { var task = WCSHelper.GetTask(model.requestPk); if (task != null) { //if (!WCSHelper.CheckActionRecordExist(task.S_CODE, int.Parse(model.noticeType))) //{ switch (model.noticeType) { case "1": //执行状态 WCSHelper.Begin(task); if (task.S_TYPE == "分拣出") { WCSHelper.UpdateStorStatus(task.S_CNTR_CODE, 3); } break; case "5": //取货无货(释放货位) TaskProcess.OperateStatus(task, 4); break; case "2": if (!WCSHelper.CheckActionRecordExist(task.S_CODE, 5)) { TaskProcess.OperateStatus(task, 4); } //完成状态 (出库任务生成第二段agv任务) 解绑起点终点 //if (task.S_B_STATE != "取消" && task.S_B_STATE != "完成" && task.S_B_STATE != "关闭" && task.S_B_STATE != "强制完成") //{ TaskProcess.OperateStatus(task, 6); if (task.S_OP_NAME =="入库") { WMSHelper.AddChange(task); } if (task.S_OP_NAME == "出库") { WMSHelper.DeleteChange(task); } if (task.S_TYPE == "分拣回") { WMSHelper.PreparationState(task); } //TaskProcess.PlcSencondTask(task); WCSHelper.End(task); WMSHelper.End(task); //} break; case "8": //取货无货(释放货位) quhuowuhuo(db, task); break; case "9": //放货有货 (重分货位) fanghuoyouhuo(db, result, task); break; } WCSHelper.AddActionRecord(task.S_CODE, int.Parse(model.noticeType), "", ""); //} } else { result.code = "1"; result.msg = "该任务编号不存在"; } } return result; } private static void fanghuoyouhuo(SqlSugarClient db, PlcSendTaskres result, WCSTask task) { string msg = ""; var wmstask = db.Queryable().Where(a => a.S_CODE == task.S_OP_CODE).First(); var locinfo = db.Queryable().Where(a => a.S_CODE == task.S_END_LOC).First(); locinfo.N_CURRENT_NUM = 1; locinfo.S_LOCK_STATE = "锁定"; locinfo.N_LOCK_STATE = 4; db.Updateable(locinfo).UpdateColumns(it => new { it.N_CURRENT_NUM, it.S_LOCK_STATE, it.N_LOCK_STATE }).ExecuteCommand(); //分配改道货位 LogHelper.Info($"查找改道货位 优先查找{locinfo.N_ROADWAY}巷道货位"); Location endbit = WMSHelper.GetLiKuLocationIn(locinfo.S_AREA_CODE, locinfo.N_ROADWAY, locinfo.S_TYPE); if (endbit != null) { LogHelper.Info($"查找到改道货位为{endbit.S_CODE}"); //修改任务数据 终点 备注:改位 LocationHelper.LockLoc(endbit.S_CODE, 1); wmstask.S_END_LOC = endbit.S_CODE; db.Updateable(wmstask).UpdateColumns(it => new { it.S_END_LOC }).ExecuteCommand(); task.S_END_LOC = endbit.S_CODE; task.S_NOTE = "改位"; db.Updateable(task).UpdateColumns(it => new { it.S_END_LOC, it.S_NOTE }).ExecuteCommand(); var agvBit = db.Queryable().Where(it => it.BitCode == endbit.S_CODE).First(); if (agvBit != null) { result.new_locate_no = agvBit.PlcLocation; } } //else //{ // LogHelper.Info($"{locinfo.N_ROADWAY} 巷道找不到可入货位 随机分配货位"); // endbit = WMSHelper.GetLiKuLocationIn(locinfo.S_AREA_CODE, 0, locinfo.S_TYPE); // if (endbit != null) // { // LogHelper.Info($"查找到改道货位为{endbit.S_CODE}"); // //修改任务数据 终点 备注:改位 // LocationHelper.LockLoc(endbit.S_CODE, 1); // wmstask.S_END_LOC = endbit.S_CODE; // db.Updateable(wmstask).UpdateColumns(it => new { it.S_END_LOC }).ExecuteCommand(); // task.S_END_LOC = endbit.S_CODE; // task.S_NOTE = "改位"; // db.Updateable(task).UpdateColumns(it => new { it.S_END_LOC, it.S_NOTE }).ExecuteCommand(); // // var agvBit = db.Queryable().Where(it => it.BitCode == endbit.S_CODE).First(); // if (agvBit != null) // { // result.new_locate_no = agvBit.PlcLocation; // } // } //} } internal static SimpleResult OutboundOrderExecute(OutboundOrderCheck model) { var result = new SimpleResult(); var db = new SqlHelper().GetInstance(); var nolist = model.out_no.Split(',').ToList(); nolist.ForEach(a => { var OutboundOrder = db.Queryable().Where(it => it.S_NO == a && it.N_B_STATE == 0).Includes(it => it.Details).First(); if (OutboundOrder != null) { var res = false; for (int i = 0; i < OutboundOrder.Details.Count; i++) { var detail = OutboundOrder.Details[i]; var whi = db.Queryable().Where(w => w.S_ITEM_CODE == detail.S_ITEM_CODE).First(); if (whi != null && whi.F_QTY - whi.F_ALLOC_QTY > 0) { res = true; Expression> expression = x => x.S_ITEM_CODE == detail.S_ITEM_CODE; expression.AndAlso(x => x.Cntr.C_ENABLE == "Y"); expression.AndAlso(x => (x.F_QTY - x.F_ALLOC_QTY) > (detail.F_QTY - detail.F_ACC_D_QTY)); expression.AndAlso(x => (x.F_QTY - x.F_ALLOC_QTY) / 2 < (detail.F_QTY - detail.F_ACC_D_QTY)); if (!string.IsNullOrEmpty(detail.S_BATCH_NO)) expression.AndAlso(x => x.S_BATCH_NO == detail.S_BATCH_NO); if (!string.IsNullOrEmpty(detail.S_OWNER)) expression.AndAlso(x => x.S_OWNER == detail.S_OWNER); if (!string.IsNullOrEmpty(detail.S_ERP_WH_CODE)) expression.AndAlso(x => x.S_ERP_WH_CODE == detail.S_ERP_WH_CODE); var bol = false; var fjlist = db.Queryable().Includes(c => c.Cntr) .Where(expression) .OrderBy(c => c.T_CREATE) .ToList(); for (int j = 0; j < fjlist.Count; j++) { //检测这个托盘物料是否单一 var cir = fjlist[j]; //var isfj = db.Queryable().Where(c => c.S_CNTR_CODE == cir.S_CNTR_CODE && c.C_REVERSE == "Y" && c.N_B_STATE < 2).First(); //if (isfj == null) //{ // var itemlist = db.Queryable().Where(c => c.S_CNTR_CODE == cir.S_CNTR_CODE && c.F_QTY > 0).ToList(); // if (itemlist.Count == 1) // { // var dc_no = WMSHelper.GenerateDistrbutionCntrNo(); // bol = true; // var dc = new TN_Distribution_CNTR // { // S_DC_NO = dc_no, // S_BS_NO = detail.S_DO_NO, // S_BS_TYPE = OutboundOrder.S_BS_TYPE, // S_CNTR_CODE = cir.S_CNTR_CODE, // S_EXIT_AREA_CODE = OutboundOrder.S_AREA_CODE, // S_OP_TYPE = OutboundOrder.S_BS_TYPE, // C_REVERSE = "Y" // }; // db.Insertable(dc).ExecuteCommand(); // // var dc_detail = new TN_Distribution_CNTR_Detail // { // S_ITEM_CODE = detail.S_ITEM_CODE, // S_ITEM_NAME = detail.S_ITEM_NAME, // S_BATCH_NO = detail.S_BATCH_NO, // S_ERP_WH_CODE = detail.S_ERP_WH_CODE, // S_SUPPLIER_NO = detail.S_SUPPLIER_NO, // S_OWNER = detail.S_OWNER, // N_BS_ROW_NO = detail.N_ROW_NO, // S_BS_TYPE = OutboundOrder.S_BS_TYPE, // S_DC_NO = dc_no, // S_BS_NO = OutboundOrder.S_NO, // F_QTY = (itemlist[0].F_QTY - itemlist[0].F_ALLOC_QTY) - (detail.F_QTY - detail.F_ACC_D_QTY), // }; // db.Insertable(dc_detail).ExecuteCommand(); // //更新容器货品表分配量 // cir.F_ALLOC_QTY += (float)dc_detail.F_QTY; // cir.T_MODIFY = DateTime.Now; // db.Updateable(cir).UpdateColumns(it => new { it.F_ALLOC_QTY, it.T_MODIFY }).ExecuteCommand(); // //更新分拣单子表的量 // detail.F_ACC_D_QTY += detail.F_QTY - detail.F_ACC_D_QTY; // detail.T_MODIFY = DateTime.Now; // db.Updateable(detail).UpdateColumns(it => new { it.F_ACC_D_QTY, it.T_MODIFY }).ExecuteCommand(); // whi.F_ALLOC_QTY += (float)(detail.F_QTY - detail.F_ACC_D_QTY); // whi.T_MODIFY = DateTime.Now; // db.Updateable(whi).UpdateColumns(it => new { it.F_ALLOC_QTY, it.T_MODIFY }).ExecuteCommand(); // break; // } //} } Expression> expression1 = x => x.S_ITEM_CODE == detail.S_ITEM_CODE; expression1.AndAlso(x => x.Cntr.C_ENABLE == "Y"); expression1.AndAlso(x => (x.F_QTY - x.F_ALLOC_QTY) > 0); if (!string.IsNullOrEmpty(detail.S_BATCH_NO)) expression1.AndAlso(x => x.S_BATCH_NO == detail.S_BATCH_NO); if (!string.IsNullOrEmpty(detail.S_OWNER)) expression1.AndAlso(x => x.S_OWNER == detail.S_OWNER); if (!string.IsNullOrEmpty(detail.S_ERP_WH_CODE)) expression1.AndAlso(x => x.S_ERP_WH_CODE == detail.S_ERP_WH_CODE); if (!bol) { //按分拣单子表去配货,查找可用托盘(先查所有符合的,后面再优化) var cirList = db.Queryable().Includes(c => c.Cntr) .Where(expression1) .OrderBy(c => c.T_CREATE) .ToList(); for (int j = 0; j < cirList.Count; j++) { var cir = cirList[j]; //var isfj = db.Queryable().Where(c => c.S_CNTR_CODE == cir.S_CNTR_CODE && c.C_REVERSE == "Y" && c.N_B_STATE < 2).First(); //if (isfj == null) //{ // var dc_no = WMSHelper.GenerateDistrbutionCntrNo(); // bol = true; // var dc = new TN_Distribution_CNTR // { // S_DC_NO = dc_no, // S_BS_NO = detail.S_DO_NO, // S_BS_TYPE = OutboundOrder.S_BS_TYPE, // S_CNTR_CODE = cir.S_CNTR_CODE, // S_EXIT_AREA_CODE = OutboundOrder.S_AREA_CODE, // S_OP_TYPE = OutboundOrder.S_BS_TYPE // }; // db.Insertable(dc).ExecuteCommand(); // var dc_detail = new TN_Distribution_CNTR_Detail // { // S_ITEM_CODE = detail.S_ITEM_CODE, // S_ITEM_NAME = detail.S_ITEM_NAME, // S_BATCH_NO = detail.S_BATCH_NO, // S_ERP_WH_CODE = detail.S_ERP_WH_CODE, // S_SUPPLIER_NO = detail.S_SUPPLIER_NO, // S_OWNER = detail.S_OWNER, // N_BS_ROW_NO = detail.N_ROW_NO, // S_BS_TYPE = OutboundOrder.S_BS_TYPE, // S_DC_NO = dc_no, // S_BS_NO = OutboundOrder.S_NO, // }; // bool needBreak = false; // if (cir.F_QTY - cir.F_ALLOC_QTY >= (detail.F_QTY - detail.F_ACC_D_QTY)) // { // dc_detail.F_QTY = detail.F_QTY - detail.F_ACC_D_QTY; // needBreak = true; // } // else // { // //生成分拣明细,继续创建 // dc_detail.F_QTY = cir.F_QTY - cir.F_ALLOC_QTY; // } // db.Insertable(dc_detail).ExecuteCommand(); // //更新容器货品表分配量 // cir.F_ALLOC_QTY += (float)dc_detail.F_QTY; // cir.T_MODIFY = DateTime.Now; // db.Updateable(cir).UpdateColumns(it => new { it.F_ALLOC_QTY, it.T_MODIFY }).ExecuteCommand(); // //更新分拣单子表的量 // detail.F_ACC_D_QTY += dc_detail.F_QTY; // detail.T_MODIFY = DateTime.Now; // db.Updateable(detail).UpdateColumns(it => new { it.F_ACC_D_QTY, it.T_MODIFY }).ExecuteCommand(); // whi.F_ALLOC_QTY += (float)dc_detail.F_QTY; // whi.T_MODIFY = DateTime.Now; // db.Updateable(whi).UpdateColumns(it => new { it.F_ALLOC_QTY, it.T_MODIFY }).ExecuteCommand(); // if (needBreak) // { // break; // } //} } } } else { //修改出库单明细状态为缺件 } } } //修改出库单状态为执行 }); return result; } private static void quhuowuhuo(SqlSugarClient db, WCSTask task) { TaskProcess.OperateStatus(task, 7); task.S_NOTE = "异常"; db.Updateable(task).UpdateColumns(it => new { it.S_NOTE }).ExecuteCommand(); } internal static WeiLiResult InStockApply(InStockApplyModel model) { var result = new WeiLiResult(); var db = new SqlHelper().GetInstance(); try { if (model.data.Count > 0) { //通过料框初始化数据 料框号进行匹配终点库区 //创建作业 var endarea = ""; var tp = model.cntrNo.Substring(0, 2); if (!string.IsNullOrEmpty(model.startLoction)) { var cntrInfo = db.Queryable().Where(it => it.S_CNTR_CODE == model.cntrNo && it.S_LOC_CODE != model.startLoction).First(); if (cntrInfo != null) { result.code = 500; result.msg = $"托盘{model.cntrNo} 绑定货位{cntrInfo.S_LOC_CODE} 无法从货位{model.startLoction}生成任务"; return result; } var locinfo = db.Queryable().Where(it => it.S_CODE == model.startLoction).First(); if (locinfo != null) { var djinfo = Settings.DJCodes.Where(it => it.DJAreaCode == locinfo.S_AREA_CODE).FirstOrDefault(); if (djinfo != null) { if (Settings.DJCodes.Where(it => it.DJAreaCode == locinfo.S_AREA_CODE && it.TrayPrefix == tp).FirstOrDefault() == null) { result.code = 500; result.msg = $"起点与托盘类型不符"; return result; } } else { //起点不为检验区 } } else { result.code = 500; result.msg = $"起点{model.startLoction} 无对应货位信息"; return result; } } foreach (var item in model.data) { var OldCntr = db.Queryable().Where(a => a.S_ITEM_CODE == item.itemCode && a.F_QTY > 0).First(); if (OldCntr != null) { var oldArea = Settings.LKCodes.Where(a => a.TrayPrefix == OldCntr.S_CNTR_CODE.Substring(0, 2)).FirstOrDefault(); var Area = Settings.LKCodes.Where(a => a.TrayPrefix == model.cntrNo.Substring(0, 2)).FirstOrDefault(); if (oldArea != null && Area != null && oldArea.LiKuCode != Area.LiKuCode) { var oldTp = OldCntr.S_CNTR_CODE.Substring(0, 2); //var oldTPinfo = Settings.LKCodes.Where(a => a.TrayPrefix == oldTp).FirstOrDefault(); LogHelper.Info($"物料{item.itemCode}已绑定在托盘{OldCntr.S_CNTR_CODE} 与托盘{model.cntrNo}隶属不同库区 请更换托盘"); result.code = 500; result.msg = $"物料{item.itemCode}已绑定在托盘{OldCntr.S_CNTR_CODE} 与托盘{model.cntrNo}隶属不同库区 请更换托盘"; return result; } } } var endinfo = Settings.LKCodes.Where(a => a.TrayPrefix == tp).FirstOrDefault(); if (endinfo != null) { endarea = endinfo.LiKuCode; } else { result.code = 500; result.msg = "无法查询到容器所属终点库区 检查配置"; return result; } foreach (var a in model.data) { var itemName = db.Queryable().Where(it => it.S_ITEM_CODE == a.itemCode).First(); if (itemName == null) { result.code = 500; result.msg = $"物料表中查询不到物料{a.itemCode} 对应的物料名称"; return result; } } model.data.ForEach(a => { LogHelper.Info($"qty={a.qty}"); var itemName = db.Queryable().Where(it => it.S_ITEM_CODE == a.itemCode).First(); CntrItemRel item = new CntrItemRel { S_CNTR_CODE = model.cntrNo, S_ITEM_NAME = itemName.S_ITEM_NAME, S_ITEM_CODE = a.itemCode, S_BATCH_NO = a.batchNo, S_OWNER = a.factoryCode, S_ERP_WH_CODE = a.stockLoc, F_QTY = a.qty, S_SUPPLIER_NO = a.vendorCode, S_SERIAL_NO = a.serialNo, D_PRD_DATE = a.productDate, N_ITEM_STATE = model.qualityState, S_EXT_ATTR2 = a.blockState, S_ITEM_STATE = model.qualityState == 0 ? "未质检" : model.qualityState == 1 ? "质检合格" : model.qualityState == 2 ? "质检不合格" : "", T_MODIFY = DateTime.Now, S_EXT_ATTR3 = model.temporarily }; LogHelper.Info($"F_QTY={item.F_QTY}"); db.Insertable(item).ExecuteCommand(); }); var startinfo = db.Queryable().Where(a => a.S_CODE == model.startLoction).First(); //终点库区判断 是否为待检区 如果不是根据物料区分去哪个立库 //var EndArea = model.needConfirm == "Y" ? Settings.DJCode : Settings.LKCodes[0].LiKuCode; //创建作业 var optask = new WMSTask { S_START_AREA = startinfo.S_AREA_CODE, S_START_WH = startinfo.S_WH_CODE, S_END_WH = startinfo.S_WH_CODE, S_CODE = model.orderNo, S_START_LOC = model.startLoction, S_END_LOC = "", S_END_AREA = endarea, S_STATION_LOC = model.station.ToString(), S_TYPE = "入库", N_TYPE = 1, N_B_STATE = 0, S_CNTR_CODE = model.cntrNo, S_OP_DEF_NAME = "入库", S_STORE = model.needConfirm }; var note = Settings.Tasktypes.Where(a => a.StartArea == optask.S_START_AREA && a.EndArea == optask.S_END_AREA).FirstOrDefault(); if (note != null) { optask.S_NOTE = note.TaskType; } var res = db.Insertable(optask).ExecuteCommand() > 0; if (res) { //LocationHelper.BindingLoc(model.startLoction, new List() { model.cntrNo }); var cntrInfo = db.Queryable().Where(a => a.S_LOC_CODE == model.startLoction && a.S_CNTR_CODE == model.cntrNo).First(); if (cntrInfo == null) { db.Insertable(new LocCntrRel { S_LOC_CODE = model.startLoction, S_CNTR_CODE = model.cntrNo }).ExecuteCommand(); } LocationHelper.LockLoc(model.startLoction, 2); var cn = db.Queryable().Where(it => it.S_CODE == model.cntrNo).First(); if (cn == null) { var cntr = new Container { S_CODE = model.cntrNo, N_DETAIL_COUNT = model.data.Count }; db.Insertable(cntr).ExecuteCommand(); } else { cn.N_DETAIL_COUNT += model.data.Count; db.Updateable(cn).UpdateColumns(it => new { it.N_DETAIL_COUNT }).ExecuteCommand(); } } } else { result.code = 500; result.msg = "集合数据不能为空"; } } catch (Exception ex) { LogHelper.Error($"入库请求异常 异常信息{ex.Message}", ex); result.code = 500; result.msg = $"入库请求异常 异常信息{ex.Message}"; } return result; } internal static StockQueryRes StockQuery(StockQueryModel model) { StockQueryRes result = new StockQueryRes(); LogHelper.Info($"库区查询 物料编码={model.itemCode} 库区={JsonConvert.SerializeObject(model.areaCode)} 料框号={model.cntrNo} 批次号={model.batchNo} 供应商编码={model.vendorCode}"); var db = new SqlHelper().GetInstance(); var exp = Expressionable.Create(); exp.AndIF(!string.IsNullOrEmpty(model.itemCode), a => a.S_ITEM_CODE == model.itemCode); exp.AndIF(!string.IsNullOrEmpty(model.cntrNo), a => a.S_CNTR_CODE == model.cntrNo); exp.AndIF(!string.IsNullOrEmpty(model.batchNo), a => a.S_BATCH_NO == model.batchNo); exp.AndIF(!string.IsNullOrEmpty(model.vendorCode), a => a.S_SUPPLIER_NO == model.vendorCode); exp.AndIF(!string.IsNullOrEmpty(model.stockLoc), a => a.S_ERP_WH_CODE == model.stockLoc); exp.AndIF(!string.IsNullOrEmpty(model.blockState), a => a.S_EXT_ATTR2 == model.blockState); exp.AndIF(model.qualityState != 0, a => a.N_ITEM_STATE == model.qualityState); try { var itemlist = db.Queryable().Where(exp.ToExpression()).PartitionBy(a => a.S_CNTR_CODE).Take(1).ToList(); if (itemlist.Count > 0) { for (int i = 0; i < itemlist.Count; i++) { var cntr = itemlist[i].S_CNTR_CODE; var info = db.Queryable().Where(a => a.S_CNTR_CODE == cntr).First(); if (info != null) { var locinfo = db.Queryable().Where(a => a.S_CODE == info.S_LOC_CODE).First(); if (locinfo != null) { if (model.areaCode.Count > 0 && model.areaCode.Contains(locinfo.S_AREA_CODE)) { var newexp = Expressionable.Create(); newexp.AndIF(!string.IsNullOrEmpty(model.itemCode), a => a.S_ITEM_CODE == model.itemCode); newexp.AndIF(!string.IsNullOrEmpty(model.cntrNo), a => a.S_CNTR_CODE == model.cntrNo); newexp.AndIF(!string.IsNullOrEmpty(model.batchNo), a => a.S_BATCH_NO == model.batchNo); newexp.AndIF(!string.IsNullOrEmpty(model.vendorCode), a => a.S_SUPPLIER_NO == model.vendorCode); newexp.AndIF(!string.IsNullOrEmpty(model.stockLoc), a => a.S_ERP_WH_CODE == model.stockLoc); newexp.AndIF(!string.IsNullOrEmpty(model.blockState), a => a.S_EXT_ATTR2 == model.blockState); newexp.AndIF(model.qualityState != 0, a => a.N_ITEM_STATE == model.qualityState); newexp.And(a => a.S_CNTR_CODE == cntr); //添加 var data = new StockQueryResult { areaCode = locinfo.S_AREA_CODE, location = locinfo.S_CODE, cntrCode = cntr }; var item = db.Queryable().Where(newexp.ToExpression()).ToList(); if (item.Count > 0) { item.ForEach(a => { data.data.Add(new StockQueryResult.StockQueryData { batchNo = a.S_BATCH_NO, itemCode = a.S_ITEM_CODE, serialNo = a.S_SERIAL_NO, stockLocation = a.S_ERP_WH_CODE, factoryCode = a.S_OWNER, qty = a.F_QTY, productDate = a.D_PRD_DATE, vendorCode = a.S_SUPPLIER_NO, qualityState = a.N_ITEM_STATE, blockState = a.S_EXT_ATTR2 }); }); } result.data.Add(data); } else if (model.areaCode.Count == 0) { var newexp = Expressionable.Create(); newexp.AndIF(!string.IsNullOrEmpty(model.itemCode), a => a.S_ITEM_CODE == model.itemCode); newexp.AndIF(!string.IsNullOrEmpty(model.cntrNo), a => a.S_CNTR_CODE == model.cntrNo); newexp.AndIF(!string.IsNullOrEmpty(model.batchNo), a => a.S_BATCH_NO == model.batchNo); newexp.AndIF(!string.IsNullOrEmpty(model.vendorCode), a => a.S_SUPPLIER_NO == model.vendorCode); newexp.AndIF(!string.IsNullOrEmpty(model.stockLoc), a => a.S_ERP_WH_CODE == model.stockLoc); newexp.AndIF(!string.IsNullOrEmpty(model.blockState), a => a.S_EXT_ATTR2 == model.blockState); newexp.AndIF(model.qualityState != 0, a => a.N_ITEM_STATE == model.qualityState); newexp.And(a => a.S_CNTR_CODE == cntr); //添加 var data = new StockQueryResult { areaCode = locinfo.S_AREA_CODE, location = locinfo.S_CODE, cntrCode = cntr }; var item = db.Queryable().Where(newexp.ToExpression()).ToList(); if (item.Count > 0) { item.ForEach(a => { data.data.Add(new StockQueryResult.StockQueryData { batchNo = a.S_BATCH_NO, itemCode = a.S_ITEM_CODE, serialNo = a.S_SERIAL_NO, stockLocation = a.S_ERP_WH_CODE, factoryCode = a.S_OWNER, qty = a.F_QTY, productDate = a.D_PRD_DATE, vendorCode = a.S_SUPPLIER_NO, qualityState = a.N_ITEM_STATE, blockState = a.S_EXT_ATTR2 }); }); } //else LogHelper.Info($"查询不到托盘{cntr}的库存信息 查询条件{JsonConvert.SerializeObject(newexp.ToExpression())}"); result.data.Add(data); } } } } } //else //{ // result.code = 1; //} } catch (Exception ex) { LogHelper.Error($"库存查询接口异常 异常信息={ex.Message}", ex); result.code = 2; } return result; } internal static ReserveStockQueryRes ReserveStockQuery(ReserveStockQueryModel model) { ReserveStockQueryRes result = new ReserveStockQueryRes(); var db = new SqlHelper().GetInstance(); var cntrlist = db.Queryable().Where(a => a.S_BS_NO == model.outStockOrderNo && a.S_EXT_ATTR1 == "Y").PartitionBy(a => a.S_CNTR_CODE).Take(1).ToList(); //var cntrlist = db.Queryable().Where(a => a.S_BS_NO == outStockOrderNo).ToList(); if (cntrlist.Count > 0) { LogHelper.Info($"查询到出库单号{model.outStockOrderNo} 对应的托盘数据{cntrlist.Count}条"); cntrlist.ForEach(it => { var cntrCode = it.S_CNTR_CODE; var locinfo = db.Queryable().Where(a => a.S_CNTR_CODE == cntrCode).First(); if (locinfo != null) { ReserveStockQueryResult info = new ReserveStockQueryResult { outStockOrderNo = model.outStockOrderNo, cntrCode = cntrCode, location = locinfo.S_LOC_CODE, state = 1 }; var itemlist = db.Queryable().Where(a => a.S_CNTR_CODE == cntrCode).ToList(); if (itemlist.Count > 0) { itemlist.ForEach(item => { info.data.Add(new ReserveStockQueryResult.ReserveStockQueryData { serialNo = string.IsNullOrEmpty(item.S_SERIAL_NO) ? "" : item.S_SERIAL_NO, stockLocation = string.IsNullOrEmpty(item.S_ERP_WH_CODE) ? "" : item.S_ERP_WH_CODE, batchNo = string.IsNullOrEmpty(item.S_BATCH_NO) ? "" : item.S_BATCH_NO, factoryCode = string.IsNullOrEmpty(item.S_OWNER) ? "" : item.S_OWNER, itemCode = item.S_ITEM_CODE, vendorCode = string.IsNullOrEmpty(item.S_SUPPLIER_NO) ? "" : item.S_SUPPLIER_NO, qty = item.F_QTY, rowNo = item.N_BS_ROW_NO }); }); } result.data.Add(info); } else { LogHelper.Info($"未查询到托盘{it.S_CNTR_CODE} 对应的绑定货位"); result.code = 500; } }); } else { LogHelper.Info($"未查询到出库单号{model.outStockOrderNo} 对应的托盘数据"); result.code = 500; } return result; } internal static WeiLiResult EmptyOutStockApply(EmptyOutStockApplyModel model) { var db = new SqlHelper().GetInstance(); WeiLiResult result = new WeiLiResult(); string endarea = ""; string startloc = ""; string startarea = ""; string cntrNo = ""; string startWh = ""; try { var cntrSpecification = model.cntrSpecification == 1 ? "高货位" : model.cntrSpecification == 2 ? "低货位" : ""; var cntrType = model.cntrType == 1 ? "2T" : model.cntrType == 2 ? "3T" : model.cntrType == 3 ? "11T" : ""; var startareainfo = Settings.LKCodes.Where(a => a.AreaType == cntrType).FirstOrDefault(); if (startareainfo != null) { startarea = startareainfo.LiKuCode; if (!string.IsNullOrEmpty(model.cntrNo)) { var locinfo = db.Queryable().Where(a => a.S_CNTR_CODE == model.cntrNo).First(); if (locinfo != null) { var startLoc = db.Queryable().Where(a => a.S_CODE == locinfo.S_LOC_CODE).First(); if (startLoc != null) { var DuiDuoPeiz = db.Queryable().Where(it => it.S_AREA_CODE == startLoc.S_AREA_CODE && it.N_LANE == startLoc.N_ROADWAY && it.N_STATE == 1).First(); if (DuiDuoPeiz != null) { //获取起点信息 var lociteminfo = db.Queryable().Where(it => it.S_CNTR_CODE == locinfo.S_CNTR_CODE).First(); if (lociteminfo == null) { startloc = locinfo.S_LOC_CODE; cntrNo = locinfo.S_CNTR_CODE; } else { result.code = 500; result.msg = "该托盘不是空框"; return result; } } else { result.code = 500; result.msg = $"货位{locinfo.S_LOC_CODE} 当前巷道堆垛机异常"; return result; } } else { result.code = 500; result.msg = $"系统不存在绑定托盘货位{locinfo.S_LOC_CODE}"; return result; } } else { result.code = 500; result.msg = "系统中找不到该托盘绑定记录"; return result; } } else { //算取起点货位 var startloclist = db.Queryable() .Where(a => a.S_AREA_CODE == startarea && a.N_CURRENT_NUM > 0 && a.N_LOCK_STATE == 0) .ToList(); if (startloclist.Count > 0) { foreach (var item in startloclist) { var locinfo = db.Queryable().Where(it => it.S_LOC_CODE == item.S_CODE).First(); if (locinfo != null) { var lociteminfo = db.Queryable().Where(it => it.S_CNTR_CODE == locinfo.S_CNTR_CODE).First(); if (lociteminfo == null) { var DuiDuoPeiz = db.Queryable().Where(it => it.S_AREA_CODE == item.S_AREA_CODE && it.N_LANE == item.N_ROADWAY && it.N_STATE == 1).First(); if (DuiDuoPeiz != null) { if (!string.IsNullOrEmpty(cntrSpecification)) { if (cntrSpecification == item.S_TYPE) { startloc = locinfo.S_LOC_CODE; startWh = item.S_WH_CODE; cntrNo = locinfo.S_CNTR_CODE; break; } } else { startloc = locinfo.S_LOC_CODE; startWh = item.S_WH_CODE; cntrNo = locinfo.S_CNTR_CODE; break; } } else { LogHelper.Info($"空框出库 库区{item.S_AREA_CODE} 巷道{item.N_ROADWAY} 堆垛机状态异常"); } } } } } } if (string.IsNullOrEmpty(startloc)) { result.code = 500; result.msg = $"库区中找不到可用空托"; return result; } else { var locinfo = db.Queryable().Where(a => a.S_CODE == startloc).First(); if (locinfo.S_AREA_CODE != startarea) { result.code = 500; result.msg = "托盘起点与库区不符"; return result; } } if (!string.IsNullOrEmpty(model.destLocation)) { //判断终点库区是否为空 var end = db.Queryable().Where(a => a.S_CODE == model.destLocation).First(); if (end != null && end.N_LOCK_STATE != 0) { result.code = 500; result.msg = "指定终点货位锁状态异常"; return result; } else if (end == null) { result.code = 500; result.msg = $"终点{model.destLocation} 找不到对应的货位信息"; return result; } if (string.IsNullOrEmpty(model.destArea)) { endarea = end.S_AREA_CODE; } else endarea = model.destArea; } if (string.IsNullOrEmpty(endarea)) endarea = model.destArea; //创建作业 var optask = new WMSTask { S_CODE = model.orderNo, S_START_WH = startWh, S_START_AREA = startarea, S_START_LOC = startloc, S_END_LOC = model.destLocation, S_END_AREA = endarea, S_END_WH = startWh, S_STATION_LOC = model.station.ToString(), S_TYPE = "出库", N_TYPE = 2, N_B_STATE = 0, S_CNTR_CODE = cntrNo, S_OP_DEF_NAME = "空框出库" }; var note = Settings.Tasktypes.Where(a => a.StartArea == optask.S_START_AREA && a.EndArea == optask.S_END_AREA).FirstOrDefault(); if (note != null) { optask.S_NOTE = note.TaskType; } var res = db.Insertable(optask).ExecuteCommand() > 0; LocationHelper.LockLoc(startloc, 2); if (!string.IsNullOrEmpty(model.destLocation)) LocationHelper.LockLoc(model.destLocation, 1); } else { result.code = 500; result.msg = $"找不到库区类型{model.cntrType} 对应的起点库区"; } } catch (Exception ex) { LogHelper.Error($"空框出库接口异常 异常信息={ex.Message}", ex); result.code = 500; result.msg = $"空框出库接口异常 异常信息={ex.Message}"; } return result; } internal static WeiLiResult CancelOrder(CancelOrderModel1 model) { WeiLiResult result = new WeiLiResult(); var db = new SqlHelper().GetInstance(); //var tasks = db.Queryable().Where(a => a.S_OP_CODE == model.orderNo).ToList(); //if (tasks.Count >= 1) //{ // //流程任务数量执行超过一条 任务不允许取消 // result.code = 500; // result.msg = "流程任务执行中途不允许取消"; // return result; //} //var task = db.Queryable().Where(a => a.S_OP_CODE == model.orderNo).OrderByDescending(a => a.T_CREATE).First(); //if (task != null) //{ // if (WCSHelper.CheckActionRecordExist(task.S_CODE, 4)) // { // result.code = 500; // result.msg = "任务已取货完成 不允许取消"; // return result; // } // if (task.N_B_STATE == 0) // { // //等待直接修改状态为取消 // WCSHelper.UpdateStatus(model.orderNo, 5); // //result.msg = "任务等待,直接取消"; // } // else if (task.N_B_STATE != 3 && task.N_B_STATE != 4) // { // if (task.S_TYPE == "杭奥") // { // //通知立库取消任务 // } // else // { // //已推送但是没有完成或者取消,通知hosttoagv // NDCHelper.Cancel(task.S_CODE.Trim()); // //result.msg = "任务取消已经发送给小车"; // } // } // else // { // result.code = 500; // result.msg = "任务已结束"; // } //} //else //{ // result.code = 500; // result.msg = "任务不存在"; //} var task = db.Queryable().Where(a => a.S_OP_CODE == model.orderNo).OrderByDescending(a => a.T_CREATE).First(); if (task != null) { var wmsTask = WMSHelper.GetWmsTask(task.S_OP_CODE); if (wmsTask != null) { if (task.N_B_STATE == 0) { //等待直接修改状态为取消 WCSHelper.UpdateStatus(task.S_CODE, 4); wmsTask.N_B_STATE = 6; WMSHelper.UpdateTaskState(wmsTask); LocationHelper.UnLockLoc(task.S_START_LOC); LocationHelper.UnLockLoc(task.S_END_LOC); LocationHelper.UnLockLoc(wmsTask.S_END_LOC); result.msg = "任务等待,直接取消"; } else if (task.N_B_STATE != 3 && task.N_B_STATE != 4) { if (task.S_SCHEDULE_TYPE == "NDC") { //已推送但是没有完成或者取消,通知hosttoagv NDCApi.CancelOrder(task.S_CODE.Trim()); } else { TaskProcess.Cancel(task); TaskProcess.OperateStatus(task, 7); WCSHelper.Fail(task); WMSHelper.Fail(task); } result.msg = "任务取消已经发送给小车"; } else { result.msg = "任务已结束"; } } else { result.code = 500; result.msg = "任务所处的作业不存在"; } } else { result.code = 500; result.msg = "任务不存在"; } return result; } internal static WeiLiResult OutStcokApply(OutStcokApplyModel model) { WeiLiResult result = new WeiLiResult(); string endarea = ""; var db = new SqlHelper().GetInstance(); var cntrinfo = db.Queryable().Where(a => a.S_CNTR_CODE == model.cntrCode).First(); if (cntrinfo != null) { var startinfo = db.Queryable().Where(a => a.S_CODE == cntrinfo.S_LOC_CODE).First(); if (startinfo != null && startinfo.N_LOCK_STATE == 0) { var IsLiKu = Settings.LKCodes.Where(a => a.LiKuCode == startinfo.S_AREA_CODE).FirstOrDefault() != null; if (IsLiKu) { var DuiDuoPeiz = db.Queryable().Where(a => a.S_AREA_CODE == startinfo.S_AREA_CODE && a.N_LANE == startinfo.N_ROADWAY && a.N_STATE == 1).First(); if (DuiDuoPeiz != null) { if (!string.IsNullOrEmpty(model.destLocation)) { //判断终点库区是否为空 var end = db.Queryable().Where(a => a.S_CODE == model.destLocation).First(); if (end != null && end.N_LOCK_STATE != 0) { result.code = 500; result.msg = "指定终点货位锁状态异常"; return result; } else if (end == null) { result.code = 500; result.msg = $"终点{model.destLocation} 找不到对应的货位信息"; return result; } if (string.IsNullOrEmpty(model.destLocation)) { endarea = end.S_AREA_CODE; } else endarea = model.destArea; } if (string.IsNullOrEmpty(endarea)) endarea = model.destArea; //创建作业 var optask = new WMSTask { S_CODE = model.orderNo, S_START_LOC = startinfo.S_CODE, S_START_AREA = startinfo.S_AREA_CODE, S_START_WH = startinfo.S_WH_CODE, S_END_LOC = model.destLocation, S_END_AREA = endarea, S_END_WH = startinfo.S_WH_CODE, S_STATION_LOC = model.station.ToString(), N_TYPE = 2, S_TYPE = "出库", N_B_STATE = 0, S_CNTR_CODE = model.cntrCode, S_OP_DEF_NAME = "出库", S_BS_NO = model.orderNo }; var note = Settings.Tasktypes.Where(a => a.StartArea == optask.S_START_AREA && a.EndArea == optask.S_END_AREA).FirstOrDefault(); if (note != null) { optask.S_NOTE = note.TaskType; } var res = db.Insertable(optask).ExecuteCommand() > 0; LocationHelper.LockLoc(startinfo.S_CODE, 2); } else { result.code = 500; result.msg = $"库区{startinfo.S_AREA_CODE} 巷道{startinfo.N_ROADWAY} 所属堆垛机异常 无法出库"; } } else { LogHelper.Info($"出库 托盘{model.cntrCode} 绑定货位{cntrinfo.S_LOC_CODE} 不在立库区中 无法出库"); result.code = 500; result.msg = $"出库 托盘{model.cntrCode} 绑定货位{cntrinfo.S_LOC_CODE} 不在立库区中 无法出库"; } } else { result.code = 500; result.msg = "起点货位状态异常"; LogHelper.Info($"起点货位锁定状态异常"); } } else { result.code = 500; result.msg = $"托盘{model.cntrCode} 找不到绑定关系"; } return result; } internal static WeiLiResult ChangeOrderPrioryty(ChangeOrderPriorytyModel model) { WeiLiResult result = new WeiLiResult(); var db = new SqlHelper().GetInstance(); var task = db.Queryable().Where(a => a.S_OP_CODE == model.orderNo).OrderByDescending(a => a.T_CREATE).First(); if (task != null) { if (task.N_B_STATE == 0) { //等待直接修改状态为取消 WCSHelper.UpdatePrioryty(task, model.priority); result.msg = "修改优先级成功"; } else if (task.N_B_STATE != 3 && task.N_B_STATE != 4) { if (task.S_TYPE == "杭奥") { //通知立库修改任务优先级 result.msg = "修改优先级成功"; } else { //通知杭叉修改优先级 NDCHelper.Cancel(task.S_CODE.Trim()); result.msg = "修改优先级成功"; } } else { result.code = 500; result.msg = "任务已结束"; } } else { result.code = 500; result.msg = "任务不存在"; } return result; } internal static WeiLiResult itemQualityStateUpdate(itemQualityStateUpdateModel model) { WeiLiResult result = new WeiLiResult(); var db = new SqlHelper().GetInstance(); var itemstate = model.qualityState == 0 ? "未质检" : model.qualityState == 1 ? "质检合格" : model.qualityState == 2 ? "质检不合格" : ""; try { var exp = Expressionable.Create(); exp.And(a => a.S_ITEM_CODE == model.itemCode); exp.AndIF(!string.IsNullOrEmpty(model.cntrNo), a => a.S_CNTR_CODE == model.cntrNo); exp.AndIF(!string.IsNullOrEmpty(model.batchNo), a => a.S_BATCH_NO == model.batchNo); exp.AndIF(!string.IsNullOrEmpty(model.vendorCode), a => a.S_SUPPLIER_NO == model.vendorCode); //exp.AndIF(!string.IsNullOrEmpty(model.stockLocation), a => a.S_ERP_WH_CODE == model.stockLocation); exp.AndIF(!string.IsNullOrEmpty(model.factoryCode), a => a.S_OWNER == model.factoryCode); exp.AndIF(!string.IsNullOrEmpty(model.serialNo), a => a.S_SERIAL_NO == model.serialNo); var itemlist = db.Queryable().Where(exp.ToExpression()).ToList(); if (itemlist.Count > 0) { if (!string.IsNullOrEmpty(itemstate)) { itemlist.ForEach(a => { a.N_ITEM_STATE = model.qualityState; a.S_ITEM_STATE = itemstate; db.Updateable(a).UpdateColumns(it => new { it.S_ITEM_STATE, it.N_ITEM_STATE }).ExecuteCommand(); }); } string baockstate = model.blockState == 1 ? "Y" : model.blockState == 0 ? "N" : ""; if (!string.IsNullOrEmpty(baockstate)) { itemlist.ForEach(a => { a.S_EXT_ATTR2 = baockstate; db.Updateable(a).UpdateColumns(it => new { it.S_EXT_ATTR2 }).ExecuteCommand(); }); } if (!string.IsNullOrEmpty(model.stockLocation)) { itemlist.ForEach(a => { a.S_ERP_WH_CODE = model.stockLocation; db.Updateable(a).UpdateColumns(it => new { it.S_ERP_WH_CODE }).ExecuteCommand(); }); } } else { result.code = 500; result.msg = "当前容器货品明细中 未找到符合条件的明细 无法更新"; } } catch (Exception ex) { LogHelper.Error($"质量更新接口异常 异常信息={ex.Message}", ex); result.code = 500; result.msg = $"接口异常 异常信息{ex.Message}"; } return result; } internal static WeiLiResult EmptyInstockApply(EmptyInstockApplyModel model) { var db = new SqlHelper().GetInstance(); string endarea = ""; WeiLiResult result = new WeiLiResult(); try { if (!string.IsNullOrEmpty(model.orderNo) && !string.IsNullOrEmpty(model.startLocation) && !string.IsNullOrEmpty(model.cntrCode)) { var cntrinfo = db.Queryable().Where(a => a.S_CNTR_CODE == model.cntrCode).First(); var locinfo = db.Queryable().Where(a => a.S_LOC_CODE == model.startLocation).First(); if (locinfo != null && locinfo.S_CNTR_CODE != model.cntrCode) { result.code = 500; result.msg = $"起点{model.startLocation} 已绑定托盘{locinfo.S_CNTR_CODE} 无法绑定托盘{model.cntrCode}"; return result; } if (cntrinfo != null && cntrinfo.S_LOC_CODE != model.startLocation) { result.code = 500; result.msg = $"托盘{model.cntrCode} 已绑定货位{cntrinfo.S_LOC_CODE} 无法绑定起点{model.startLocation}"; return result; } var tp = model.cntrCode.Substring(0, 2); var endinfo = Settings.LKCodes.Where(a => a.TrayPrefix == tp).FirstOrDefault(); if (endinfo != null) { endarea = endinfo.LiKuCode; } else { result.code = 500; result.msg = "无法查询到容器所属终点库区 检查配置"; return result; } if (!string.IsNullOrEmpty(model.destLocation)) { //判断终点库区是否为空 var end = db.Queryable().Where(a => a.S_CODE == model.destLocation).First(); if (end != null && end.N_LOCK_STATE != 0) { result.code = 500; result.msg = "指定终点货位锁状态异常"; return result; } else if (end != null && end.S_AREA_CODE == endarea) { result.code = 500; result.msg = "终点与托盘冲突"; return result; } else if (end == null) { result.code = 500; result.msg = $"终点{model.destLocation} 找不到对应的货位信息"; return result; } } if (!string.IsNullOrEmpty(model.destArea) && model.destArea != endarea) { result.code = 500; result.msg = "终点库区与托盘冲突"; return result; } var startinfo = db.Queryable().Where(a => a.S_CODE == model.startLocation).First(); if (startinfo != null && startinfo.N_LOCK_STATE != 0) { result.code = 500; result.msg = $"起点{model.startLocation} 货位状态不为空闲 不允许创建任务"; return result; } //创建作业 var optask = new WMSTask { S_CODE = model.orderNo, S_START_AREA = startinfo.S_AREA_CODE, S_START_WH = startinfo.S_WH_CODE, S_START_LOC = model.startLocation, S_END_LOC = model.destLocation, S_END_AREA = endarea, S_END_WH = startinfo.S_WH_CODE, S_STATION_LOC = model.station.ToString(), N_TYPE = 1, S_TYPE = "入库", N_B_STATE = 0, S_CNTR_CODE = model.cntrCode, S_OP_DEF_NAME = "空框入库" }; var note = Settings.Tasktypes.Where(a => a.StartArea == optask.S_START_AREA && a.EndArea == optask.S_END_AREA).FirstOrDefault(); if (note != null) { optask.S_NOTE = note.TaskType; } var res = db.Insertable(optask).ExecuteCommand() > 0; if (res) { var cn = db.Queryable().Where(it => it.S_CODE == model.cntrCode).First(); if (cn == null) { var cntr = new Container { S_CODE = model.cntrCode, N_DETAIL_COUNT = 0 }; db.Insertable(cntr).ExecuteCommand(); } else { cn.N_DETAIL_COUNT = 0; db.Updateable(cn).UpdateColumns(it => new { it.N_DETAIL_COUNT }).ExecuteCommand(); } var cntrInfo = db.Queryable().Where(a => a.S_LOC_CODE == model.startLocation && a.S_CNTR_CODE == model.cntrCode).First(); if (cntrInfo == null) { db.Insertable(new LocCntrRel { S_LOC_CODE = model.startLocation, S_CNTR_CODE = model.cntrCode }).ExecuteCommand(); } } //LocationHelper.BindingLoc(model.startLocation, new List() { model.cntrCode }); LocationHelper.LockLoc(model.startLocation, 2); } else { result.code = 500; result.msg = $"数据校验不能为空字符串"; } } catch (Exception ex) { LogHelper.Error($"空框入库接口异常 异常信息={ex.Message}", ex); result.code = 500; result.msg = $"空框入库接口异常 异常信息={ex.Message}"; } return result; } internal static WeiLiResult ReceivingNote(ReceivingNoteModel model) { var result = new WeiLiResult(); var db = new SqlHelper().GetInstance(); try { //创建发货单,人工点确认后生成分拣单,没有缺货的自动更新为失败,有货的更新为执行中 //创建入库单主子表 var po = WMSHelper.GetASNOrder(model.receivingNoteNo); if (po == null) { po = new TN_ASN_Order { S_NO = model.receivingNoteNo, S_SUPPLIER_NO = model.vendorCode, S_SUPPLIER_NAME = model.vendorName, S_ASN_ID = model.receivingNoteID }; po.Details = new List(); if (model.data.Count > 0) { foreach (var a in model.data) { var item = db.Queryable().Where(it => it.S_ITEM_CODE == a.itemCode).First(); if (item == null) { result.code = 500; result.msg = $"行ID{a.rowID} 物料{a.itemCode}物料主数据不存在该物料"; return result; } po.Details.Add(new TN_ASN_Detail { S_ASN_NO = model.receivingNoteNo, S_ITEM_CODE = a.itemCode, F_QTY = a.qty, F_ACC_R_QTY = a.qty, S_BS_ROW_NO = a.rowID, S_FAC_CODE = a.factoryCode, S_ITEM_LOC = a.stockLocation, S_BATCH_NO = a.batchNo, N_IS_FLAG = a.qualityInspectionFlag }); }; WMSHelper.CreateASNOrder(po); } } else if (po != null && po.N_B_STATE == 0) { var Details = new List(); if (model.data.Count > 0) { foreach (var a in model.data) { var item = db.Queryable().Where(it => it.S_ITEM_CODE == a.itemCode).First(); if (item == null) { result.code = 500; result.msg = $"行ID{a.rowID} 物料{a.itemCode}物料主数据不存在该物料"; return result; } Details.Add(new TN_ASN_Detail { S_ASN_NO = model.receivingNoteNo, S_ITEM_CODE = a.itemCode, F_QTY = a.qty, F_ACC_R_QTY = a.qty, S_BS_ROW_NO = a.rowID, S_FAC_CODE = a.factoryCode, S_ITEM_LOC = a.stockLocation, S_BATCH_NO = a.batchNo, N_IS_FLAG = a.qualityInspectionFlag }); }; } po.S_SUPPLIER_NO = model.vendorCode; po.S_SUPPLIER_NAME = model.vendorName; po.S_ASN_ID = model.receivingNoteID; db.Updateable(po).UpdateColumns(it => new { it.S_SUPPLIER_NO, it.S_SUPPLIER_NAME, it.S_ASN_ID }).ExecuteCommand(); if (Details.Count > 0) { db.Deleteable().Where(it => it.S_ASN_NO == model.receivingNoteNo).ExecuteCommand(); db.Insertable(Details).ExecuteCommand(); } } else { result.code = 500; result.msg = "内向交货单状态异常 无法修改数据"; } } catch (Exception ex) { LogHelper.Error($"内向交货单接收异常 异常信息={ex.Message}", ex); result.code = 500; result.msg = "接口异常"; } return result; } internal static WeiLiResult ManualStockIn(ManualStockInModel model) { WeiLiResult result = new WeiLiResult(); var db = new SqlHelper().GetInstance(); var po = WMSHelper.GetASNOrder(model.taskNo); if (po == null) { po = new TN_ASN_Order { S_NO = model.taskNo, S_BS_TYPE = "人工库入库" }; po.Details = new List(); if (model.data.Count > 0) { foreach (var a in model.data) { var item = db.Queryable().Where(it => it.S_ITEM_CODE == a.itemCode).First(); if (item == null) { result.code = 500; result.msg = $"物料{a.itemCode}物料主数据不存在该物料"; return result; } po.Details.Add(new TN_ASN_Detail { S_ASN_NO = model.taskNo, S_ITEM_CODE = a.itemCode, S_ITEM_NAME = item.S_ITEM_NAME, F_QTY = a.qty, S_BATCH_NO = a.batchNo, S_FAC_CODE = a.factoryCode, S_SUPPLIER_NO = a.vendorCode, S_ITEM_LOC = a.stockCode, N_ITEM_STATE = a.qualityState, S_SERIAL_NO = a.serialNo }); } //WMSHelper.CreateShippingOrder(po); WMSHelper.CreateASNOrder(po); } } else { result.code = 500; result.msg = "已有相同发货单号的发货单存在"; return result; } return result; } internal static WeiLiResult ReceivingNoteBatchUpdate(ReceivingNoteBatchUpdateModel model) { WeiLiResult result = new WeiLiResult(); var db = new SqlHelper().GetInstance(); try { if (!string.IsNullOrEmpty(model.receivingNoteNo)) { if (model.data.Count > 0) { model.data.ForEach(a => { db.Updateable() .SetColumns(it => new TN_ASN_Detail() { S_BATCH_NO = a.sapBatchNo }) .Where(it => it.S_ASN_NO == model.receivingNoteNo && it.S_BS_ROW_NO == a.receivingNoteRowNo) .ExecuteCommand(); }); } } else { result.code = 500; result.msg = "交货单单号不能为空"; } } catch (Exception ex) { LogHelper.Error($"更新交货单批次信息异常 异常信息={ex.Message}", ex); } return result; } internal static WeiLiResult ShippingNote(ShippingNoteModel model) { var result = new WeiLiResult(); var db = new SqlHelper().GetInstance(); //创建发货单,人工点确认后生成分拣单,没有缺货的自动更新为失败,有货的更新为执行中 //创建入库单主子表 //var po = WMSHelper.GetShippingOrder(model.shippingNoteNo); try { db.BeginTran(); var po = WMSHelper.GetOutboundOrder(model.shippingNoteNo); if (po == null) { Dictionary> OutGroupList = new Dictionary>(); foreach (var a in model.data) { var item = db.Queryable().Where(it => it.S_ITEM_CODE == a.itemCode).First(); if (item == null) { result.code = 500; result.msg = $"物料{a.itemCode}物料主数据不存在该物料"; return result; } else { if (model.bussType == 6) { //人工库出库 默认库区 if (OutGroupList.Keys.Contains("RGK")) { OutGroupList["RGK"].Add(a); } else { OutGroupList.Add("RGK", new List { a }); } } else { if (!string.IsNullOrEmpty(item.S_AREA_CODE)) { if (OutGroupList.Keys.Contains(item.S_AREA_CODE)) { OutGroupList[item.S_AREA_CODE].Add(a); } else { OutGroupList.Add(item.S_AREA_CODE, new List { a }); } } else { result.code = 500; result.msg = $"物料{a.itemCode} 在物料主数据中未找到所属库区"; return result; } } } } foreach (var item in OutGroupList) { po = new TN_Outbound_Order { S_NO = WMSHelper.GenerateShippNo(), S_OUT_TYPE = Gettype(model.bussType), S_END_AREA = model.destArea, S_BS_NO = model.shippingNoteNo, S_OUT_TO = model.station.ToString(), S_END_LOC = model.destLocation, S_STOCK_UP = model.Ispreparation, S_AREA_CODE = item.Key }; po.Details = new List(); item.Value.ForEach(a => { var itemInfo = db.Queryable().Where(it => it.S_ITEM_CODE == a.itemCode).First(); po.Details.Add(new TN_Outbound_Detail { S_DO_NO = po.S_NO, S_AREA_CODE = model.destArea, N_ROW_NO = a.rowNo, S_ITEM_CODE = a.itemCode, S_ITEM_NAME = itemInfo.S_ITEM_NAME, F_QTY = a.qty, S_BATCH_NO = a.batchNo, S_OWNER = a.factoryCode, S_SUPPLIER_NO = a.vendorCode, S_ERP_WH_CODE = a.stockLocation, //N_ITEM_STATE = a.qualityState, S_SERIAL_NO = a.serialNo }); }); WMSHelper.CreateOutboundOrder(po); } //po = new TN_Outbound_Order { S_NO = model.shippingNoteNo, S_OUT_TYPE = Gettype(model.bussType), S_AREA_CODE = model.destArea, S_BS_NO = model.shippingNoteNo, S_OUT_TO = model.station.ToString(), S_END_LOC = model.destLocation }; //po.Details = new List(); //if (model.data.Count > 0) //{ // foreach (var a in model.data) // { // var item = db.Queryable().Where(it => it.S_ITEM_CODE == a.itemCode).First(); // if (item == null) // { // result.code = 500; // result.msg = $"物料{a.itemCode}物料主数据不存在该物料"; // return result; // } // po.Details.Add(new TN_Outbound_Detail // { // S_DO_NO = model.shippingNoteNo, // S_AREA_CODE = model.destArea, // N_ROW_NO = a.rowNo, // S_ITEM_CODE = a.itemCode, // S_ITEM_NAME = item.S_ITEM_NAME, // F_QTY = a.qty, // S_BATCH_NO = a.batchNo, // S_OWNER = a.factoryCode, // S_SUPPLIER_NO = a.vendorCode, // S_ERP_WH_CODE = a.stockLocation, // //N_ITEM_STATE = a.qualityState, // S_SERIAL_NO = a.serialNo // }); // } // //WMSHelper.CreateShippingOrder(po); // WMSHelper.CreateOutboundOrder(po); //} } else { result.code = 500; result.msg = "已有相同发货单号的发货单存在"; return result; } db.Ado.CommitTran(); } catch (Exception ex) { LogHelper.Error($"发货单接口异常 异常信息={ex.Message}", ex); result.code = 500; result.msg = $"发货单接口异常 异常信息={ex.Message}"; db.Ado.RollbackTran(); } return result; } private static string Gettype(int bussType) { var result = ""; switch (bussType) { case 1: result = "质检出库"; break; case 2: result = "普通出库"; break; case 3: result = "备料出库"; break; case 4: result = "不合格品出库"; break; case 5: result = "冻结出库"; break; case 6: result = "人工库出库"; break; } return result; } internal static SimpleResult PalletSorting(PalletSorting model) { var result = new SimpleResult(); //校验入库单数量,不可以超,成功后插入托盘物料表,更新入库单累计数量 //也可以直接lua查询入库单数量,做校验 var info = WMSHelper.GetPutawayOrderDetail(model.arrival_no, model.item_code); if (info != null) { if (info.F_QTY - info.F_ACC_B_QTY >= model.qty) { // 插入到托盘明细表 var cntr = ContainerHelper.GetCntr(model.cntr_code, true); if (cntr != null) { ContainerHelper.BindCntrItem(cntr, model.item_code, info.S_BATCH_NO, model.qty, model.arrival_no); //更新入库单累计绑定数量 info.F_ACC_B_QTY += model.qty; WMSHelper.UpdatePutawayOrderDetailQty(info); } else { result.resultCode = 2; result.resultMsg = "获取托盘信息失败"; } } else { result.resultCode = 1; result.resultMsg = "累计码盘数量超出入库单数量"; } } else { result.resultCode = 3; result.resultMsg = $"未找到入库单{model.arrival_no}"; } return result; } internal static SimpleResult WeiLiOutstock(WeiLiOutstockInfo model) { var result = new SimpleResult(); string workNo = ""; string endarea = ""; var db = new SqlHelper().GetInstance(); try { if (!string.IsNullOrEmpty(model.cntrNo)) { var iteminfo = db.Queryable().Where(a => a.S_CNTR_CODE == model.cntrNo).First(); if (iteminfo != null) workNo = iteminfo.S_BS_NO; var cntrinfo = db.Queryable().Where(a => a.S_CNTR_CODE == model.cntrNo).First(); if (cntrinfo != null) { var startinfo = db.Queryable().Where(a => a.S_CODE == cntrinfo.S_LOC_CODE).First(); if (startinfo != null) { var IsLiKu = Settings.LKCodes.Where(a => a.LiKuCode == startinfo.S_AREA_CODE).FirstOrDefault() != null; if (IsLiKu) { var DuiDuoPeiz = db.Queryable().Where(a => a.S_AREA_CODE == startinfo.S_AREA_CODE && a.N_LANE == startinfo.N_ROADWAY && a.N_STATE == 1).First(); if (DuiDuoPeiz != null) { if (!string.IsNullOrEmpty(model.endBit)) { //判断终点库区是否为空 var end = db.Queryable().Where(a => a.S_CODE == model.endBit).First(); if (end != null && end.N_LOCK_STATE != 0) { result.resultCode = 3; result.resultMsg = "指定终点货位锁状态异常"; return result; } else if (end == null) { result.resultCode = -1; result.resultMsg = $"终点{model.endBit} 找不到对应的货位信息"; return result; } if (string.IsNullOrEmpty(model.endBit)) { endarea = end.S_AREA_CODE; } else endarea = model.endArea; } if (string.IsNullOrEmpty(endarea)) endarea = model.endArea; //创建作业 var optask = new WMSTask { S_CODE = WMSHelper.GenerateTaskNo(), S_START_WH = startinfo.S_WH_CODE, S_START_LOC = startinfo.S_CODE, S_START_AREA = startinfo.S_AREA_CODE, S_END_LOC = model.endBit, S_END_AREA = endarea, S_END_WH = startinfo.S_WH_CODE, S_STATION_LOC = model.station.ToString(), N_TYPE = 2, S_TYPE = "出库", N_B_STATE = 0, S_CNTR_CODE = model.cntrNo, S_OP_DEF_NAME = "指引出库", S_BS_NO = workNo }; var note = Settings.Tasktypes.Where(a => a.StartArea == optask.S_START_AREA && a.EndArea == optask.S_END_AREA).FirstOrDefault(); if (note != null) { optask.S_NOTE = note.TaskType; } var res = db.Insertable(optask).ExecuteCommand() > 0; LocationHelper.LockLoc(startinfo.S_CODE, 2); } else { LogHelper.Info($"指引出库 托盘{model.cntrNo} 绑定货位{cntrinfo.S_LOC_CODE} 巷道{startinfo.N_ROADWAY} 堆垛机状态异常"); result.resultCode = -3; result.resultMsg = $"指引出库 托盘{model.cntrNo} 绑定货位{cntrinfo.S_LOC_CODE} 巷道{startinfo.N_ROADWAY} 堆垛机状态异常"; } } else { LogHelper.Info($"指引出库 托盘{model.cntrNo} 绑定货位{cntrinfo.S_LOC_CODE} 不在立库区中 无法出库"); result.resultCode = -3; result.resultMsg = $"指引出库 托盘{model.cntrNo} 绑定货位{cntrinfo.S_LOC_CODE} 不在立库区中 无法出库"; } } else { LogHelper.Info($"指引出库 查询不到托盘{model.cntrNo}绑定货位{cntrinfo.S_LOC_CODE}的货位信息"); result.resultCode = -2; result.resultMsg = $"指引出库 查询不到托盘{model.cntrNo}绑定货位{cntrinfo.S_LOC_CODE}的货位信息"; } } else { LogHelper.Info($"指引出库 找不到托盘{model.cntrNo}的绑定信息"); result.resultCode = -1; result.resultMsg = $"指引出库 找不到托盘{model.cntrNo}的绑定信息"; } } else { LogHelper.Info($"指引出库 输入托盘号不能为空"); result.resultCode = 2; result.resultMsg = $"指引出库 输入托盘号不能为空"; } } catch (Exception ex) { LogHelper.Error($"指引出库接口异常 异常信息{ex.Message}", ex); result.resultCode = 1; result.resultMsg = $"指引出库接口异常 异常信息{ex.Message}"; } return result; } internal static SimpleResult WeiLiInstock(WeiLiInstockInfo model) { var result = new SimpleResult(); var db = new SqlHelper().GetInstance(); var req = new ReceivingNoteSerialNo(); try { if (model.isTask == "Y") { if (!string.IsNullOrEmpty(model.cntrNo) && !string.IsNullOrEmpty(model.startLoction)) { var start = db.Queryable().Where(it => it.S_CODE == model.startLoction).First(); if (start != null && start.N_LOCK_STATE == 0) { var cntrinfo = db.Queryable().Where(it => it.S_CNTR_CODE == model.cntrNo && it.S_LOC_CODE != model.startLoction).First(); if (cntrinfo != null) { result.resultCode = 1; result.resultMsg = $"托盘{model.cntrNo} 已绑定货位{cntrinfo.S_LOC_CODE} 无法从{model.startLoction}生成任务"; return result; } if (model.data.Count > 0) { db.BeginTran(); var inworklist = new List(); //通过料框初始化数据 料框号进行匹配终点库区 //创建作业 var bol = false; foreach (var item in model.data) { if (!string.IsNullOrEmpty(item.itemCode) && item.itemCode.Length >= 5) { var fivecode = item.itemCode.Substring(0, 5); var fiveinfo = db.Queryable().Where(a => a.S_FIVE_CODE == fivecode).First(); if (fiveinfo != null) { if (fiveinfo.S_IS_MANAGE == "Y" && string.IsNullOrEmpty(item.serialNo)) { bol = true; result.resultCode = 1; result.resultMsg = result.resultMsg + $"物料{item.itemCode} 已开启五位码管理 唯一码不能为空"; } if (fiveinfo.S_IS_MANAGEDATE == "Y" && string.IsNullOrEmpty(item.productDate)) { bol = true; result.resultCode = 1; result.resultMsg = result.resultMsg + $"物料{item.itemCode} 已开启生产日期管理 生产日期不能为空"; } } var iteminfo = db.Queryable().Where(a => a.S_ITEM_CODE == item.itemCode).First(); if (iteminfo != null) { if (iteminfo.S_IS_MANAGE == "Y" && string.IsNullOrEmpty(item.serialNo)) { bol = true; result.resultCode = 1; result.resultMsg = result.resultMsg + $"物料{item.itemCode} 已开启唯一码管理 唯一码不能为空"; } if (iteminfo.S_IS_MANAGEDATE == "Y" && string.IsNullOrEmpty(item.productDate)) { bol = true; result.resultCode = 1; result.resultMsg = result.resultMsg + $"物料{item.itemCode} 已开启生产日期管理 生产日期不能为空"; } } } else { result.resultCode = -1; result.resultMsg = "物料编码不能为空 并且长度必须大于5位"; return result; } } if (bol) return result; //判断托盘物料 同一种物料只能入一种库区 foreach (var item in model.data) { var OldCntr = db.Queryable().Where(a => a.S_ITEM_CODE == item.itemCode && a.F_QTY > 0).First(); if (OldCntr != null) { var oldArea = Settings.LKCodes.Where(a => a.TrayPrefix == OldCntr.S_CNTR_CODE.Substring(0, 2)).FirstOrDefault(); var Area = Settings.LKCodes.Where(a => a.TrayPrefix == model.cntrNo.Substring(0, 2)).FirstOrDefault(); if (oldArea != null && Area != null && oldArea.LiKuCode != Area.LiKuCode) { LogHelper.Info($"托盘前缀{oldArea.TrayPrefix} 隶属库区{oldArea.LiKuCode} 托盘前缀{Area.TrayPrefix} 隶属库区{Area.LiKuCode}"); var oldTp = OldCntr.S_CNTR_CODE.Substring(0, 2); var oldTPinfo = Settings.LKCodes.Where(a => a.TrayPrefix == oldTp).FirstOrDefault(); LogHelper.Info($"物料{item.itemCode}已绑定在托盘{OldCntr.S_CNTR_CODE} 存放在{oldTPinfo.AreaType}库区 与托盘{model.cntrNo}隶属不同库区 请更换托盘"); result.resultCode = -1; result.resultMsg = $"物料{item.itemCode}已绑定在托盘{OldCntr.S_CNTR_CODE} 存放在{oldTPinfo.AreaType}库区 与托盘{model.cntrNo}隶属不同库区 请更换托盘"; return result; } } } List newList = model.data.Select(item => new WeiLiInstockInfo.WeiLiInstockcomple { serialNo = item.serialNo, stockLocation = item.stockLocation, batchNo = item.batchNo, factoryCode = item.factoryCode, inWorkNo = item.inWorkNo, itemCode = item.itemCode, productDate = item.productDate, qty = item.qty, qualityInspectionFlag = item.qualityInspectionFlag, rowID = item.rowID, vendorCode = item.vendorCode }).ToList(); var itemlist = new List(); foreach (var item in newList) { var rowID = item.rowID; var qty = item.qty; var iteminfo = itemlist.Where(a => a.rowID == rowID).FirstOrDefault(); if (iteminfo == null) { //添加数据 itemlist.Add(item); } else { //修改数量 iteminfo.qty = iteminfo.qty + qty; } LogHelper.Info($"拆分数据{JsonConvert.SerializeObject(itemlist)} 原数据{JsonConvert.SerializeObject(model.data)}"); } foreach (var item in itemlist) { var exp = Expressionable.Create(); exp.And(it => it.S_IO_NO == item.inWorkNo); exp.And(it => it.N_BS_ROW_NO == item.rowID); exp.And(it => it.S_ITEM_CODE == item.itemCode); exp.AndIF(!string.IsNullOrEmpty(item.batchNo), it => it.S_BATCH_NO == item.batchNo); exp.AndIF(!string.IsNullOrEmpty(item.stockLocation), it => it.S_ERP_WH_CODE == item.stockLocation); exp.AndIF(!string.IsNullOrEmpty(item.factoryCode), it => it.S_OWNER == item.factoryCode); exp.AndIF(!string.IsNullOrEmpty(item.vendorCode), it => it.S_SUPPLIER_NO == item.vendorCode); LogHelper.Info($"S_IO_NO={item.inWorkNo} and N_BS_ROW_NO={item.rowID} and S_ITEM_CODE={item.itemCode} and S_BATCH_NO={item.batchNo} and S_ERP_WH_CODE={item.stockLocation} and S_OWNER={item.factoryCode} and S_SUPPLIER_NO={item.vendorCode} qty={item.qty}"); var InWorkOrder = db.Queryable().Where(exp.ToExpression()).First(); if (InWorkOrder != null) { if (InWorkOrder.F_QTY - InWorkOrder.F_ACC_B_QTY < item.qty) { result.resultCode = 4; result.resultMsg = $"入库单明细 余量为{InWorkOrder.F_QTY - InWorkOrder.F_ACC_B_QTY} 码盘数量为{item.qty} 不得超出入库单余量"; return result; } } else { LogHelper.Info($"未找到{JsonConvert.SerializeObject(item)} 对应的入库单明细"); result.resultCode = 3; result.resultMsg = $"未找到{JsonConvert.SerializeObject(item)} 对应的入库单明细"; return result; } } var endarea = ""; var tp = model.cntrNo.Substring(0, 2); if (!string.IsNullOrEmpty(model.needInspect)) { if (model.needInspect == "Y") { var endinfo = Settings.DJCodes.Where(a => a.TrayPrefix == tp).FirstOrDefault(); if (endinfo != null) { endarea = endinfo.DJAreaCode; } else { result.resultCode = 2; result.resultMsg = "无法查询到容器所属终点库区 检查配置"; return result; } } else { var endinfo = Settings.LKCodes.Where(a => a.TrayPrefix == tp).FirstOrDefault(); if (endinfo != null) { endarea = endinfo.LiKuCode; } else { result.resultCode = 2; result.resultMsg = "无法查询到容器所属终点库区 检查配置"; return result; } } } else { result.resultCode = 2; result.resultMsg = "无法确定托盘去向 是否去检验区"; return result; } var loccntr = db.Queryable().Where(it => it.S_LOC_CODE == model.startLoction).First(); if (loccntr == null) { foreach (var item in model.data) { if (!string.IsNullOrEmpty(item.serialNo)) { db.Insertable(new TN_WeiLi_SerialNo { InWork = item.inWorkNo, SerialNo = item.serialNo, RowId = item.rowID }).ExecuteCommand(); } //升量 var exp = Expressionable.Create(); exp.And(it => it.S_IO_NO == item.inWorkNo); exp.And(it => it.N_BS_ROW_NO == item.rowID); exp.And(it => it.S_ITEM_CODE == item.itemCode); exp.AndIF(!string.IsNullOrEmpty(item.batchNo), it => it.S_BATCH_NO == item.batchNo); exp.AndIF(!string.IsNullOrEmpty(item.stockLocation), it => it.S_ERP_WH_CODE == item.stockLocation); exp.AndIF(!string.IsNullOrEmpty(item.factoryCode), it => it.S_OWNER == item.factoryCode); exp.AndIF(!string.IsNullOrEmpty(item.vendorCode), it => it.S_SUPPLIER_NO == item.vendorCode); var InWorkOrder = db.Queryable().Where(exp.ToExpression()).First(); InWorkOrder.F_ACC_B_QTY += item.qty; db.Updateable(InWorkOrder).UpdateColumns(it => new { it.F_ACC_B_QTY }).ExecuteCommand(); var inwork = db.Queryable().Where(it => it.S_IO_NO == item.inWorkNo && it.F_QTY > it.F_ACC_B_QTY).First(); if (inwork == null) { if (!inworklist.Contains(item.inWorkNo)) { inworklist.Add(item.inWorkNo); } } } //if (Settings.ZTenable == 1) //{ // LogHelper.Info("2222222222222"); // if (inworklist.Count > 0) // { // LogHelper.Info("2222222222222"); // // foreach (var item in inworklist) // { // LogHelper.Info("2222222222222"); // // var seriallist = db.Queryable().Where(it => it.InWork == item).ToList(); // if (seriallist.Count > 0) // { // LogHelper.Info("44444444444444"); // seriallist.ForEach(a => // { // var serinfo = req.data.Where(it => it.rowID == a.RowId).FirstOrDefault(); // if (serinfo == null) // { // LogHelper.Info("55555555555555"); // var se = new ReceivingNoteSerialNo.serial(); // se.rowID = a.RowId; // se.serialNo.Add(a.SerialNo); // req.data.Add(se); // } // else // { // req.data[req.data.FindIndex(x => x.Equals(serinfo))].serialNo.Add(a.SerialNo); // } // }); // } // if (req.data.Count > 0) // { // LogHelper.Info("3333333333333333"); // //回传唯一码列表 // var url = Settings.ZTSeverUrl + "ReceivingNoteSerialNo"; // LogHelper.Info($"唯一码回传接口 地址{url} 接口参数{JsonConvert.SerializeObject(req)}"); // var feedback = new HttpHelper().WebPost(url, JsonConvert.SerializeObject(req)); // LogHelper.Info($"唯一码回传接口 地址{url} 接口参数{JsonConvert.SerializeObject(req)} 返回参数{feedback}"); // if (!string.IsNullOrEmpty(feedback)) // { // var weilires = JsonConvert.DeserializeObject(feedback); // if (weilires.code == 200) // { // LogHelper.Info($"接口反馈成功"); // db.Deleteable().Where(it => it.InWork == item).ExecuteCommand(); // } // else // { // db.Ado.RollbackTran(); // result.resultCode = 5; // result.resultMsg = $"唯一码回传接口反馈失败 失败原因{weilires.msg}"; // return result; // } // } // else // { // db.Ado.RollbackTran(); // result.resultCode = 5; // result.resultMsg = "唯一码回传接口超时"; // return result; // } // } // } // } //} model.data.ForEach(a => { LogHelper.Info($"添加容器货品明细 行ID{a.rowID}"); var itemName = db.Queryable().Where(it => it.S_ITEM_CODE == a.itemCode).First(); CntrItemRel item = new CntrItemRel { S_CNTR_CODE = model.cntrNo, S_WU = a.rowID, S_ITEM_NAME = itemName.S_ITEM_NAME, S_ITEM_CODE = a.itemCode, S_BATCH_NO = a.batchNo, S_OWNER = a.factoryCode, S_ERP_WH_CODE = a.stockLocation, F_QTY = a.qty, S_SUPPLIER_NO = a.vendorCode, S_SERIAL_NO = a.serialNo, D_PRD_DATE = a.productDate, N_ITEM_STATE = a.qualityInspectionFlag, S_ITEM_STATE = a.qualityInspectionFlag == 0 ? "未质检" : a.qualityInspectionFlag == 1 ? "质检合格" : a.qualityInspectionFlag == 2 ? "质检不合格" : "", T_MODIFY = DateTime.Now }; db.Insertable(item).ExecuteCommand(); LogHelper.Info($"添加容器货品明细 数据={JsonConvert.SerializeObject(item)}"); }); } else if (loccntr.S_CNTR_CODE != model.cntrNo) { result.resultCode = 3; result.resultMsg = $"货位{model.startLoction} 已绑定{loccntr.S_CNTR_CODE} 不能绑定{model.cntrNo}"; return result; } //终点库区判断 是否为待检区 如果不是根据物料区分去哪个立库 //var EndArea = model.needConfirm == "Y" ? Settings.DJCode : Settings.LKCodes[0].LiKuCode; //创建作业 var optask = new WMSTask { S_CODE = WMSHelper.GenerateTaskNo(), S_START_WH = start.S_WH_CODE, S_START_AREA = start.S_AREA_CODE, S_START_LOC = model.startLoction, S_END_LOC = "", S_END_AREA = endarea, S_END_WH = start.S_WH_CODE, S_STATION_LOC = model.station.ToString(), S_TYPE = "入库", N_TYPE = 1, N_B_STATE = 0, S_CNTR_CODE = model.cntrNo, S_OP_DEF_NAME = "码盘入库" }; var note = Settings.Tasktypes.Where(a => a.StartArea == optask.S_START_AREA && a.EndArea == optask.S_END_AREA).FirstOrDefault(); if (note != null) { optask.S_NOTE = note.TaskType; } var res = db.Insertable(optask).ExecuteCommand() > 0; if (res) { //LocationHelper.BindingLoc(model.startLoction, new List() { model.cntrNo }); var cntrInfo = db.Queryable().Where(a => a.S_LOC_CODE == model.startLoction && a.S_CNTR_CODE == model.cntrNo).First(); if (cntrInfo == null) { db.Insertable(new LocCntrRel { S_LOC_CODE = model.startLoction, S_CNTR_CODE = model.cntrNo }).ExecuteCommand(); } LocationHelper.LockLoc(model.startLoction, 2); var cn = db.Queryable().Where(it => it.S_CODE == model.cntrNo).First(); if (cn == null) { var cntr = new Container { S_CODE = model.cntrNo, N_DETAIL_COUNT = model.data.Count }; db.Insertable(cntr).ExecuteCommand(); } else { cn.N_DETAIL_COUNT += model.data.Count; db.Updateable(cn).UpdateColumns(it => new { it.N_DETAIL_COUNT }).ExecuteCommand(); } } } else { result.resultCode = -1; result.resultMsg = "集合数据不能为空"; } } else { result.resultCode = -2; result.resultMsg = "起点货位信息有误 或起点货位状态不为空闲"; } } else { result.resultCode = -1; result.resultMsg = "入库料框号和起点货位不能为空"; } } else { var addchangeres = true; //人工库入库 if (!string.IsNullOrEmpty(model.endLocation) && !string.IsNullOrEmpty(model.cntrNo)) { var locinfo = db.Queryable().Where(a => a.S_CODE == model.endLocation).First(); if (locinfo != null) { if (model.needInspect == "Y") { //检验区人工入库 绑定托盘 无需绑定物料 var cntrInfo = db.Queryable().Where(a => a.S_LOC_CODE == model.endLocation && a.S_CNTR_CODE == model.cntrNo).First(); if (cntrInfo == null) { db.Insertable(new LocCntrRel { S_LOC_CODE = model.endLocation, S_CNTR_CODE = model.cntrNo }).ExecuteCommand(); } //LocCntrRel loc = new LocCntrRel { S_LOC_CODE = model.endLocation, S_CNTR_CODE = model.cntrNo }; //var locbol=db.Insertable(loc).ExecuteCommand()>0; LogHelper.Info($"绑定货位容器 货位{model.endLocation} 容器{model.cntrNo}"); List newList = model.data.Select(item => new WeiLiInstockInfo.WeiLiInstockcomple { serialNo = item.serialNo, stockLocation = item.stockLocation, batchNo = item.batchNo, factoryCode = item.factoryCode, inWorkNo = item.inWorkNo, itemCode = item.itemCode, productDate = item.productDate, qty = item.qty, qualityInspectionFlag = item.qualityInspectionFlag, rowID = item.rowID, vendorCode = item.vendorCode }).ToList(); var itemlist = new List(); foreach (var item in newList) { var rowID = item.rowID; var qty = item.qty; var iteminfo = itemlist.Where(a => a.rowID == rowID).FirstOrDefault(); if (iteminfo == null) { //添加数据 itemlist.Add(item); } else { //修改数量 iteminfo.qty = iteminfo.qty + qty; } LogHelper.Info($"拆分数据{JsonConvert.SerializeObject(itemlist)} 原数据{JsonConvert.SerializeObject(model.data)}"); } foreach (var item in itemlist) { var exp = Expressionable.Create(); exp.And(it => it.S_IO_NO == item.inWorkNo); exp.And(it => it.N_BS_ROW_NO == item.rowID); exp.And(it => it.S_ITEM_CODE == item.itemCode); exp.AndIF(!string.IsNullOrEmpty(item.batchNo), it => it.S_BATCH_NO == item.batchNo); exp.AndIF(!string.IsNullOrEmpty(item.stockLocation), it => it.S_ERP_WH_CODE == item.stockLocation); exp.AndIF(!string.IsNullOrEmpty(item.factoryCode), it => it.S_OWNER == item.factoryCode); exp.AndIF(!string.IsNullOrEmpty(item.vendorCode), it => it.S_SUPPLIER_NO == item.vendorCode); LogHelper.Info($"S_IO_NO={item.inWorkNo} and N_BS_ROW_NO={item.rowID} and S_ITEM_CODE={item.itemCode} and S_BATCH_NO={item.batchNo} and S_ERP_WH_CODE={item.stockLocation} and S_OWNER={item.factoryCode} and S_SUPPLIER_NO={item.vendorCode} qty={item.qty}"); var InWorkOrder = db.Queryable().Where(exp.ToExpression()).First(); if (InWorkOrder != null) { if (InWorkOrder.F_QTY - InWorkOrder.F_ACC_B_QTY < item.qty) { result.resultCode = 4; result.resultMsg = $"入库单明细 余量为{InWorkOrder.F_QTY - InWorkOrder.F_ACC_B_QTY} 码盘数量为{item.qty} 不得超出入库单余量"; return result; } } else { LogHelper.Info($"未找到{JsonConvert.SerializeObject(item)} 对应的入库单明细"); result.resultCode = 3; result.resultMsg = $"未找到{JsonConvert.SerializeObject(item)} 对应的入库单明细"; return result; } } foreach (var item in model.data) { //升量 var exp = Expressionable.Create(); exp.And(it => it.S_IO_NO == item.inWorkNo); exp.And(it => it.N_BS_ROW_NO == item.rowID); exp.And(it => it.S_ITEM_CODE == item.itemCode); exp.AndIF(!string.IsNullOrEmpty(item.batchNo), it => it.S_BATCH_NO == item.batchNo); exp.AndIF(!string.IsNullOrEmpty(item.stockLocation), it => it.S_ERP_WH_CODE == item.stockLocation); exp.AndIF(!string.IsNullOrEmpty(item.factoryCode), it => it.S_OWNER == item.factoryCode); exp.AndIF(!string.IsNullOrEmpty(item.vendorCode), it => it.S_SUPPLIER_NO == item.vendorCode); var InWorkOrder = db.Queryable().Where(exp.ToExpression()).First(); if (InWorkOrder != null) { InWorkOrder.F_ACC_B_QTY += item.qty; db.Updateable(InWorkOrder).UpdateColumns(it => new { it.F_ACC_B_QTY }).ExecuteCommand(); } else { LogHelper.Info($"找不到对应的入库单明细 行ID{item.rowID}"); } } model.data.ForEach(a => { LogHelper.Info($"添加容器货品明细 行ID{a.rowID}"); var itemName = db.Queryable().Where(it => it.S_ITEM_CODE == a.itemCode).First(); CntrItemRel item = new CntrItemRel { S_CNTR_CODE = model.cntrNo, S_WU = a.rowID, S_ITEM_NAME = itemName.S_ITEM_NAME, S_ITEM_CODE = a.itemCode, S_BATCH_NO = a.batchNo, S_OWNER = a.factoryCode, S_ERP_WH_CODE = a.stockLocation, F_QTY = a.qty, S_SUPPLIER_NO = a.vendorCode, S_SERIAL_NO = a.serialNo, D_PRD_DATE = a.productDate, N_ITEM_STATE = a.qualityInspectionFlag, S_ITEM_STATE = a.qualityInspectionFlag == 0 ? "未质检" : a.qualityInspectionFlag == 1 ? "质检合格" : a.qualityInspectionFlag == 2 ? "质检不合格" : "", T_MODIFY = DateTime.Now }; db.Insertable(item).ExecuteCommand(); }); WMSHelper.receiveUnloadConfirm(model.cntrNo, model.endLocation); TaskProcess.InspectionAreaStockUpdate(model.cntrNo, model.endLocation); locinfo.N_CURRENT_NUM = 1; db.Updateable(locinfo).UpdateColumns(it => new { it.N_CURRENT_NUM }).ExecuteCommand(); var cn = db.Queryable().Where(it => it.S_CODE == model.cntrNo).First(); if (cn == null) { var newcntr = new Container { S_CODE = model.cntrNo, N_DETAIL_COUNT = model.data.Count }; db.Insertable(newcntr).ExecuteCommand(); } else { cn.N_DETAIL_COUNT += model.data.Count; db.Updateable(cn).UpdateColumns(it => new { it.N_DETAIL_COUNT }).ExecuteCommand(); } db.Deleteable().Where(it => it.S_CNTR_CODE == model.cntrNo).ExecuteCommand(); } else { var url = Settings.MoboxSeverUrl + "inventory/AddChange"; //仓库量表升量 var req1 = new AddChangeModel { op_type = 5 }; //库区量表升量 var req2 = new AddChangeModel { op_type = 6 }; foreach (var a in model.data) { var iteminfo = db.Queryable().Where(it => it.S_ITEM_CODE == a.itemCode).First(); if (iteminfo != null) { LogHelper.Info($"填充数据"); LogHelper.Info($"添加仓库量表数据 仓库{locinfo.S_WH_CODE} 物料编码{a.itemCode} 物料名称{iteminfo.S_ITEM_NAME} 数量{a.qty}"); req1.item_info.Add(new AddChangeModel.itemModel { wh_code = locinfo.S_WH_CODE, item_code = a.itemCode, item_name = iteminfo.S_ITEM_NAME, qty = a.qty }); LogHelper.Info($"添加库区量表数据 库区{locinfo.S_AREA_CODE} 物料编码{a.itemCode} 物料名称{iteminfo.S_ITEM_NAME} 数量{a.qty}"); req2.item_info.Add(new AddChangeModel.itemModel { wh_code = locinfo.S_WH_CODE, area_code = locinfo.S_AREA_CODE, item_code = a.itemCode, item_name = iteminfo.S_ITEM_NAME, qty = a.qty }); } else { LogHelper.Info($"物料表中不包含物料编码{a.itemCode} 无法升量"); result.resultCode = 2; result.resultMsg = $"物料表中不包含物料编码{a.itemCode} 无法升量"; return result; } }; var reqData = JsonConvert.SerializeObject(req1); var AppKey = Settings.AppKey; var AppSecret = Settings.AppSecret; var ReqTime = DateTimeOffset.UtcNow.ToUnixTimeSeconds().ToString(); //var ReqTime = GetTimeStamp(DateTime.Now.AddHours(-8), 1, 2); LogHelper.Info($"加密前 AppKey={AppKey} AppSecret={AppSecret} ReqTime={ReqTime}"); var ReqVerify = GetMd5FromString(AppKey + AppSecret + ReqTime); LogHelper.Info($"加密后 AppKey={AppKey} AppSecret={AppSecret} ReqTime={ReqTime} ReqVerify={ReqVerify} url={url} req={reqData}"); var res = new HttpHelper().WebPost(url, reqData, "application/json", AppKey, ReqTime, ReqVerify); if (!string.IsNullOrEmpty(res)) { LogHelper.Info($"mobox 仓库升量接口返回 {res}"); var moboxres = JsonConvert.DeserializeObject(res); if (moboxres.err_code != 0) { addchangeres = false; } } else { LogHelper.Info($"mobox 仓库升量接口返回为空"); addchangeres = false; } var reqData2 = JsonConvert.SerializeObject(req2); var ReqTime2 = DateTimeOffset.UtcNow.ToUnixTimeSeconds().ToString(); //var ReqTime2 = GetTimeStamp(DateTime.Now.AddHours(-8), 1, 2); LogHelper.Info($"加密前 AppKey={AppKey} AppSecret={AppSecret} ReqTime={ReqTime2}"); var ReqVerify2 = GetMd5FromString(AppKey + AppSecret + ReqTime2); LogHelper.Info($"加密后 AppKey={AppKey} AppSecret={AppSecret} ReqTime={ReqTime2} ReqVerify={ReqVerify2} url={url} req={reqData2}"); var res2 = new HttpHelper().WebPost(url, reqData2, "application/json", AppKey, ReqTime2, ReqVerify2); if (!string.IsNullOrEmpty(res2)) { LogHelper.Info($"mobox 库区升量接口返回 {res2}"); var moboxres = JsonConvert.DeserializeObject(res); if (moboxres.err_code != 0) { addchangeres = false; } } else { LogHelper.Info($"mobox 库区升量接口返回为空"); addchangeres = false; } var workNo = ""; if (addchangeres) { //添加上下架记录 foreach (var item in model.data) { } var cntr = ""; var loc = db.Queryable().Where(a => a.S_LOC_CODE == model.endLocation).First(); if (loc != null) { cntr = loc.S_CNTR_CODE; } else { cntr = model.cntrNo; } //绑定托盘 if (cntr == model.cntrNo) { //添加物料明细 model.data.ForEach(a => { workNo = a.inWorkNo; var itemName = db.Queryable().Where(it => it.S_ITEM_CODE == a.itemCode).First(); CntrItemRel item = new CntrItemRel { S_CNTR_CODE = cntr, S_ITEM_NAME = itemName.S_ITEM_NAME, S_ITEM_CODE = a.itemCode, S_BATCH_NO = a.batchNo, S_OWNER = a.factoryCode, S_ERP_WH_CODE = a.stockLocation, F_QTY = a.qty, S_SUPPLIER_NO = a.vendorCode, S_SERIAL_NO = a.serialNo, D_PRD_DATE = a.productDate, N_ITEM_STATE = a.qualityInspectionFlag, S_ITEM_STATE = a.qualityInspectionFlag == 0 ? "未质检" : a.qualityInspectionFlag == 1 ? "质检合格" : a.qualityInspectionFlag == 2 ? "质检不合格" : "", T_MODIFY = DateTime.Now }; var info = new TN_OnOff_Shelves { S_NO = a.inWorkNo, N_ACTION = 1, S_ACTION = "上架", S_ITEM_CODE = a.itemCode, S_ITEM_NAME = itemName.S_ITEM_NAME, S_LOC_CODE = model.endLocation, S_AREA_CODE = locinfo.S_AREA_CODE, S_CNTR_CODE = model.cntrNo, S_BATCH_NO = a.batchNo, S_SERIAL_NO = a.serialNo, D_PRD_DATE = a.productDate, F_QTY = a.qty }; db.Insertable(info).ExecuteCommand(); db.Insertable(item).ExecuteCommand(); }); } else { //合并物料 model.data.ForEach(it => { var exp = Expressionable.Create(); exp.And(a => a.S_ITEM_CODE == it.itemCode); exp.And(a => a.S_CNTR_CODE == cntr); exp.And(a => a.N_ITEM_STATE == it.qualityInspectionFlag); exp.AndIF(!string.IsNullOrEmpty(it.batchNo), a => a.S_BATCH_NO == it.batchNo); exp.AndIF(!string.IsNullOrEmpty(it.vendorCode), a => a.S_SUPPLIER_NO == it.vendorCode); exp.AndIF(!string.IsNullOrEmpty(it.stockLocation), a => a.S_ERP_WH_CODE == it.stockLocation); exp.AndIF(!string.IsNullOrEmpty(it.factoryCode), a => a.S_OWNER == it.factoryCode); exp.AndIF(!string.IsNullOrEmpty(it.serialNo), a => a.S_SERIAL_NO == it.serialNo); var item = db.Queryable().Where(exp.ToExpression()).First(); if (item != null) { workNo = it.inWorkNo; //修改数量 item.F_QTY = item.F_QTY + it.qty; db.Updateable(item).UpdateColumns(k => new { k.F_QTY }).ExecuteCommand(); } else { workNo = it.inWorkNo; var itemName = db.Queryable().Where(k => k.S_ITEM_CODE == it.itemCode).First(); item = new CntrItemRel { S_CNTR_CODE = cntr, S_ITEM_NAME = itemName.S_ITEM_NAME, S_ITEM_CODE = it.itemCode, S_BATCH_NO = it.batchNo, S_OWNER = it.factoryCode, S_ERP_WH_CODE = it.stockLocation, F_QTY = it.qty, S_SUPPLIER_NO = it.vendorCode, S_SERIAL_NO = it.serialNo, D_PRD_DATE = it.productDate, N_ITEM_STATE = it.qualityInspectionFlag, S_ITEM_STATE = it.qualityInspectionFlag == 0 ? "未质检" : it.qualityInspectionFlag == 1 ? "质检合格" : it.qualityInspectionFlag == 2 ? "质检不合格" : "", T_MODIFY = DateTime.Now }; db.Insertable(item).ExecuteCommand(); } }); } if (loc == null) { LocCntrRel newloc = new LocCntrRel { S_LOC_CODE = model.endLocation, S_CNTR_CODE = model.cntrNo }; db.Insertable(newloc).ExecuteCommand(); } locinfo.N_CURRENT_NUM = 1; db.Updateable(locinfo).UpdateColumns(it => new { it.N_CURRENT_NUM }).ExecuteCommand(); var cn = db.Queryable().Where(it => it.S_CODE == cntr).First(); if (cn == null) { var newcntr = new Container { S_CODE = model.cntrNo, N_DETAIL_COUNT = model.data.Count }; db.Insertable(newcntr).ExecuteCommand(); } else { cn.N_DETAIL_COUNT += model.data.Count; db.Updateable(cn).UpdateColumns(it => new { it.N_DETAIL_COUNT }).ExecuteCommand(); } WCSTask task = new WCSTask { S_OP_CODE = workNo, S_CNTR_CODE = "", S_END_LOC = model.endLocation }; WMSHelper.OpState(task); } else { LogHelper.Info($"人工库升量失败"); result.resultCode = -1; result.resultMsg = "人工库入库升量失败"; } } } else { LogHelper.Info($"人工入库终点不存在"); result.resultCode = 1; result.resultMsg = "人工入库终点不存在"; } } else { LogHelper.Info($"人工库入库托盘和终点不能为空"); result.resultCode = 1; result.resultMsg = "人工库入库托盘和终点不能为空"; } } db.Ado.CommitTran(); } catch (Exception ex) { LogHelper.Error($"码盘入库接口异常 异常信息={ex.Message}", ex); result.resultCode = 3; result.resultMsg = $"码盘入库接口异常 异常信息={ex.Message}"; db.Ado.RollbackTran(); } return result; } public class ReceivingNoteSerialNo { public List data { get; set; } = new List(); public class serial { public string rowID { get; set; } public List serialNo { get; set; } = new List(); } } private static string WeiLiGetType(string tasktype) { var result = ""; switch (tasktype) { case "1": result = "码盘入库"; break; case "2": result = "备料入库"; break; case "3": result = "分拣回"; break; } return result; } internal static SimpleResult OutboundOrder(OutboundOrder model) { var result = new SimpleResult(); //创建发货单,人工点确认后生成分拣单,没有缺货的自动更新为失败,有货的更新为执行中 //创建入库单主子表 var po = WMSHelper.GetShippingOrder(model.Data.out_no); if (po == null) { po = new ShippingOrder { S_NO = model.Data.out_no, S_BS_TYPE = model.Data.op_type, LINE_AREA = model.Data.line_area }; po.Details = new List(); if (model.Data.items.Count > 0) { model.Data.items.ForEach(a => { po.Details.Add(new ShippingDetail { S_SHIPPING_NO = model.Data.out_no, N_ROW_NO = po.Details.Count + 1, S_ITEM_CODE = a.item_code, F_QTY = a.qty, S_BATCH_NO = a.batch_no, }); }); WMSHelper.CreateShippingOrder(po); } } return result; } internal static SimpleResult ShippingOrderExecute(ShippingOrderCheck model) { var result = new SimpleResult(); //检查库存,更新发货单,生成分拣单,自动合并波次 //这个后台做比较麻烦,mobox3库存在内存中,任务完成的时候无法增加,还是用c#直接管内存,计算比较方便 WMSHelper.CreateSortingOrder(model.out_nos.Split(',').ToList()); return result; } /// /// 后面要把方法放到wmsHelper中 /// /// /// internal static SimpleResult SortingResultCheck(List models) { //生成分拣结果,更新分拣明细状态 var result = new SimpleResult(); WMSHelper.SortingConfrim(models); return result; } /// /// 后面要把方法放到wmsHelper中 /// /// /// internal static SimpleResult Instock(InstockInfo model) { var result = new SimpleResult(); //pda入库,目前人工放货在巷道口,扫托盘,后台只能计算当前巷道的终点,单深位立库 //1,判断托盘信息,一种是码盘后的,默认enable是N,另一种是分拣回的 var cntr = ContainerHelper.GetCntr(model.cntr); if (cntr != null) { var sortingInfo = WMSHelper.GetSortingDetailByCntr(model.cntr); if (cntr.C_ENABLE == "Y" && sortingInfo != null && sortingInfo.Count > 0) { result.resultCode = 2; result.resultMsg = $"托盘{model.cntr}未分拣完成"; } } else { result.resultCode = 1; result.resultMsg = $"托盘{model.cntr}不存在"; } if (result.resultCode == 0) { //获取接驳位所在的巷道, 查找功能区,入库接驳位找逻辑库区(每个巷道一个逻辑库区) var fa = LocationHelper.GetFunctionAreaByCode(model.start, 2, 10); if (fa != null) { //创建入库作业,简单判断一下是否有可入货位,如果不判断,人工货放上去一直不能入,也不知道原因 var end = LocationHelper.GetZoneLoc(fa.S_MASTER_CODE); if (end != null) { //判断托盘是否已经生成任务,如果没有则生成 var wmsTask = WMSHelper.GetWmsTaskByCntr(model.cntr); if (wmsTask != null) { result.resultCode = 3; result.resultMsg = $"起点{model.start} 托盘{model.cntr}已经创建任务,请勿重复申请"; } else { wmsTask = new WMSTask { S_CNTR_CODE = model.cntr, S_CODE = WMSHelper.GenerateTaskNo(), S_START_LOC = model.start, S_END_LOC = end.S_LOC_CODE, N_TYPE = 1, S_TYPE = WMSTask.GetTypeStr(1), S_OP_DEF_CODE = "", S_OP_DEF_NAME = "pda入立库" }; if (WMSHelper.CreateWmsTask(wmsTask)) { LocationHelper.LockLoc(model.start, 1); result.resultMsg = $"创建作业成功,作业号{wmsTask.S_CODE}"; } } } else { result.resultCode = 3; result.resultMsg = $"起点{model.start}对应的逻辑库区{fa.S_MASTER_CODE}没有可用货位,请更换巷道"; } } else { result.resultCode = 3; result.resultMsg = $"起点{model.start}没有对应的逻辑库区,请在逻辑库区设置功能区-入库接驳位"; } } return result; } internal static SimpleResult SortingOrderExecute(SortingOrderCheck model) { var result = new SimpleResult(); //分拣单配货执行 WMSHelper.CreateSortingOrderDetail(model.s_no); return result; } internal static SimpleResult CheckSortingWholeCntr(CheckSortingWholeCntr model) { var result = new SimpleResult(); if (WMSHelper.CheckSortingWholeCntr(model.cntr, model.autoSort == 1)) { result.resultCode = 1; result.resultMsg = "整托分拣"; } return result; } internal static CodeInfo GetCodeInfo(string code, string org) { //return new CodeInfo { Fitemid_XK=code, FSourceNo="123456"}; CodeInfo result = null; try { var db = new SqlHelper().GetInstance(Settings.SqlServer1); var nameP = new SugarParameter("@FBarCode", code); var orgP = new SugarParameter("@Forg", org); //var ageP = new SugarParameter("@age", null, true);//设置为output //var dt = db.Ado.UseStoredProcedure().GetDataTable("sp_school", nameP, ageP);//返回dt result = db.Ado.UseStoredProcedure().SqlQuery("WMS_FBarCode", nameP, orgP).First();//返回List Console.WriteLine($"读存储过程成功,result={result}"); } catch (Exception ex) { Console.WriteLine(ex.Message); } return result; } internal static SimpleResult PalletSorting1(PalletSorting1 model) { var result = new SimpleResult(); //校验入库单数量,不可以超,成功后插入托盘物料表,更新入库单累计数量 //也可以直接lua查询入库单数量,做校验 //先用bar_code读存储过程获取信息 var codeInfo = GetCodeInfo(model.bar_code, model.org); var info = WMSHelper.GetPutawayOrderDetail(model.bar_code); if (info != null) { if (info.F_QTY - info.F_ACC_B_QTY >= model.qty) { // 插入到托盘明细表 var cntr = ContainerHelper.GetCntr(model.cntr_code, true); if (cntr != null) { ContainerHelper.BindCntrItem(cntr, model.bar_code, info.S_BATCH_NO, model.qty, info.S_BATCH_NO); //更新入库单累计绑定数量 info.F_ACC_B_QTY += model.qty; WMSHelper.UpdatePutawayOrderDetailQty(info); } else { result.resultCode = 2; result.resultMsg = "获取托盘信息失败"; } } else { result.resultCode = 1; result.resultMsg = "累计码盘数量超出入库单数量"; } } else { result.resultCode = 3; result.resultMsg = $"未获取到该物料{model.bar_code}的入库单明细信息"; } return result; } //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 { /// /// 生产订单内码 /// public string FInterID { get; set; } /// /// 生产订单编号 /// public string FSourceNo { get; set; } /// /// 批号 /// public string FGMPBatchNo { get; set; } public string FState { get; set; } /// /// 物料编码(内码就是编码) /// public string Fitemid_XK { get; set; } /// /// 分录id /// public string Fentryid { get; set; } } public class NoteInfo : CodeInfo { public string WmsBillNo { get; set; } } } }