using AutoMapper; using Castle.Core.Internal; using Microsoft.Extensions.Logging; using Newtonsoft.Json; using NPOI.POIFS.Storage; using NPOI.SS.Formula; using NPOI.SS.Formula.Functions; using Org.BouncyCastle.Asn1.Ocsp; using SqlSugar; using System; using System.Collections.Generic; using System.ComponentModel; using System.DirectoryServices.Protocols; using System.Linq; using System.Linq.Expressions; using System.Reflection; using WCS.Entity; using WCS.Entity.fj; using wms.dataservice.IDataSetvice; using wms.dto; using wms.dto.request; using wms.dto.request.cp.dto; using wms.dto.request.hj; using wms.dto.request.hj.dto; using wms.dto.request.share; using wms.dto.response; using wms.dto.response.hj; using wms.service.IService; using wms.sqlsugar; using wms.sqlsugar.model; using wms.sqlsugar.model.cp; using wms.sqlsugar.model.hj; using wms.util.Check; using wms.util.Ext; using static wms.dto.request.hj.dto.ReportResponse; using WCS_TaskDtl = WCS.Entity.WCS_TaskDtl; using WCS_TaskInfo = WCS.Entity.WCS_TaskInfo; using WCS_TaskOld = WCS.Entity.WCS_TaskOld; namespace wms.service.Service { public class HJService: IHJService { private readonly IMapper _mapper; private readonly ILogger _logger; private readonly IHJDataService _iHJDataService; public HJService(IMapper mapper,IHJDataService iHJDataService, ILogger logger) { _mapper = mapper; _logger = logger; _iHJDataService = iHJDataService; } Repository _docrepository => new Repository(); Repository _sysconfigrepository => new Repository(); Repository _materrepository => new Repository(); Repository _billTaskrepository => new Repository(); Repository _baseWareLocationrepository => new Repository(); Repository _billFbackPushrepository => new Repository(); Repository _billGroupStockrepository => new Repository(); Repository _sysJobrepository => new Repository(); Repository _sysJobApirepository => new Repository(); Repository _hjBillTaskDetail => new Repository(); ITenant _db => SqlSugarHelper.Db;//处理事务 Repository _baseContinfo => new Repository(); RepositoryTask _taskrepository => new RepositoryTask(); Repository _billInvnowrepository => new Repository(); Repository _billInvinitrepository => new Repository(); Repository _billdocrepository => new Repository(); RepositoryTask _wcstaskoldrepository => new RepositoryTask(); Repository _billInvflow => new Repository(); Repository _billPushinforepository => new Repository(); Repository _basewarecellrepository => new Repository(); Repository _basewarehouserepository => new Repository(); Repository _basematerrepository => new Repository(); RepositoryTask _taskdetailrepository => new RepositoryTask(); RepositoryTask _agvTaskInforepository => new RepositoryTask(); private RepositoryTask _flowhtyrepository => new RepositoryTask(); private RepositoryTask _pushhtyrepository => new RepositoryTask(); public SRes WareCellInit(int row, int col, int deot, int rowcount, int tun) { var res = new SRes(); var ware = _basewarehouserepository.GetFirst(p => p.IsStop == 0); //var arec = _baseare.GetFirst(p => p.IsStop == 0); for (int i = 0; i < rowcount; i++) { string shlf = tun.ToString(); if (rowcount == 2) { if (i == 0) { shlf = shlf + "L"; } else { shlf = shlf + "R"; } } else if (rowcount == 4) //双升位 { if (i == 0 || i == 1) { shlf = shlf + "R"; } else { shlf = shlf + "L"; } } for (int j = 0; j < deot; j++) { for (int k = 0; k < col; k++) { var dept = ""; if (i == 0 || i == 3) { dept = "2"; } else { dept = "1"; } //string strrow = (row + i) < 10 ? "0"+(row + i): (row + i); string strcol = ""; string strlayer = ""; var code = new BaseWarecell() { Code = (row + i).ToString().PadLeft(2,'0') + "-" + (k).ToString().PadLeft(2, '0') + "-" + (j + 1).ToString().PadLeft(2, '0') + "-" + shlf + "-" + dept.PadLeft(2, '0'), Tunnel = tun, IsStop = 0, Name = (row + i).ToString() + "行" + (k).ToString() + "列" + (j + 1).ToString() + "层" + shlf + "货架" + dept + "深度", WarehouseId = ware.Id, WarehouseCode = ware.Code, WareAreaId = 1669154208777113600, StateNum = 1, TypeNum = 1, Size = 1, Row = (row + i), Col = (k), Layer = (j + 1), Depth = int.Parse(dept), SCRel = "SRM0" + tun, ContGrpId = 0, ContGrpBarCode = "", AddWho = "wms", EditWho = "wms", Shelf = shlf, Memo = "" //Sort = j * col + (k + 1) }; _basewarecellrepository.Insert(code); } } } return res; } /// /// 添加单据 /// /// public bool Add(hjBillDocument data1) { try { _db.BeginTran(); _docrepository.Insert(data1); _db.CommitTran(); } catch (Exception) { _db.RollbackTran(); throw; } return true; } /// /// 获取配置内容信息 /// /// 配置表code值 /// public string GetSysConfigContentByCode(string code) { //先读缓存 var cacheContent = RedisHelper.Get("sys_config" + code); if (!string.IsNullOrEmpty(cacheContent)) { return cacheContent; } var sysconf = _sysconfigrepository.GetSingle(p => p.Code == code); if (sysconf == null) { throw new Exception("数据表没有配置"+ code); } var content = sysconf.SContent; string sysname = sysconf.Default1;//所属系统mes/erp RedisHelper.Set("sys_config" + code,content+"|"+ sysname); return content; } /// /// 获取配置信息 /// /// /// public hjSysConfig GetSysConfigByCode(string code) { //Repository _billdtrepository = new Repository(); return _sysconfigrepository.GetSingle(p => p.Code == code); } /// /// 获取物料信息 /// /// /// public hjBaseMater GetBaseMaterByExpression(Expression> WhereExpression) { return _materrepository.GetSingle(WhereExpression); } /// /// 获取配置信息 /// /// /// public hjSysConfig GetSysConfigByExpression(Expression> WhereExpression) { return _sysconfigrepository.GetSingle(WhereExpression); } /// /// 获取单据信息 /// /// /// public hjBillDocument GetBillDocumentByExpression(Expression> WhereExpression) { return _docrepository.GetSingle(WhereExpression); } /// /// 获取反馈信息 /// /// /// public List GetBillFeedbackList(Expression> WhereExpression) { return _billFbackPushrepository.GetList(WhereExpression); } /// /// 获取反馈信息 /// /// /// public List GetBillFeedbackList1(Expression> WhereExpression) { return _billPushinforepository.GetList(WhereExpression); } /// /// 更新hjBillFeedbackPush表字段 /// /// /// public bool UpdateBillFeedbackPushModelColumns(UpdateModelColumns updateModel) { return _billFbackPushrepository.Update(updateModel.Columns, updateModel.WhereExpression); } ///// ///// 获取单据信息 ///// ///// ///// //public hjBillDocument GetBillDocumentList(Expression> WhereExpression) //{ // return _billdtrepository.Context.Queryable((doc, conf) => new object[] { // JoinType.Left, doc.BState == conf.Code // }).Where((doc, conf) => doc.Status == 0) // .Select((bc, bm) => bc).First(); //} /// /// 更新SysConfig表字段 /// /// /// public bool UpdateSysConfigModelColumns(UpdateModelColumns updateModel) { return _sysconfigrepository.Update(updateModel.Columns, updateModel.WhereExpression); } public SRes SyncMaterInfo(HJSyncMaterInfoListRequest ResData) { var res = new SRes(); foreach (var item in ResData.ListInfo) { item.UpdatedTime = DateTime.Now.ToString(); if (_basematerrepository.IsAny(p => p.Code == item.MatCode)) { _basematerrepository.UpdateModelColumns(p => new BaseMatinfo() { IsHold = item.IsHold, HoldDuration = item.HoldDuration, Name = item.MatName,EditTime = DateTime.Now,Description = item.Describe }, p => p.Code == item.MatCode); } else { var model = _mapper.Map(item); model.AddTime = DateTime.Now; _basematerrepository.Insert(model); } } return res; } /// /// 镀铜补空/取满指令接收接口(包含550工字轮) /// /// /// public SRes CopperLineReceiveInstr(CopperLineRequest reqDto) { var res = new SRes(); var req = _mapper.Map(reqDto); req.Floor = 1; if (reqDto.BusType == 1) { //reqDto.RFID = ""; //reqDto.MatCode = ""; //reqDto.MatBarCode = ""; //reqDto.WareCode = "hjhouse"; //reqDto.ProductDate = ""; //reqDto.IsFast = ""; //reqDto.SpoolType = "800"; //reqDto.ProductCode = ""; //reqDto.OrderCode = ""; //reqDto.WorkOrder = ""; //reqDto.Grade = ""; //reqDto.Length = 0; //reqDto.UpdatedTime = ""; //reqDto.IsRework = ""; return CopperLineToEmptyCon(reqDto); } else if (reqDto.BusType == 2) { if (reqDto.RFID.Length != 12) { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = "MES上传的RFID长度不等于12位"; return res; } //reqDto.MatCode = "53192H09"; //reqDto.MatBarCode = Guid.NewGuid().ToString(); //reqDto.WareCode = "hjhouse"; //reqDto.ProductDate = DateTime.Now.ToString(); //reqDto.IsFast = "0"; //reqDto.SpoolType = "800"; //reqDto.ProductCode = "A"; //reqDto.OrderCode = "123123"; //reqDto.WorkOrder = "123123"; //reqDto.Grade = "A"; //reqDto.Length = 111; //reqDto.UpdatedTime = DateTime.Now.ToString(); //reqDto.IsRework = "0"; //req.MatCode = "53192H09"; //req.MatBarCode = Guid.NewGuid().ToString(); //req.WareCode = "hjhouse"; //req.ProductDate = DateTime.Now.ToString(); //req.IsFast = "0"; //req.SpoolType = "800"; //req.ProductCode = "A"; //req.OrderCode = "123123"; //req.WorkOrder = "123123"; //req.Grade = "A"; //req.Length = 111; //req.UpdatedTime = DateTime.Now.ToString(); //req.IsRework = "0"; res = HjMaterialStockIn(req); } else if (reqDto.BusType == 3) { //reqDto.MatCode = "53192H09"; //reqDto.MatBarCode = Guid.NewGuid().ToString(); //reqDto.WareCode = "hjhouse"; //reqDto.ProductDate = DateTime.Now.ToString(); //reqDto.IsFast = "0"; //reqDto.SpoolType = "800"; //reqDto.ProductCode = "A"; //reqDto.OrderCode = "123123"; //reqDto.WorkOrder = "123123"; //reqDto.Grade = "A"; //reqDto.Length = 111; //reqDto.UpdatedTime = DateTime.Now.ToString(); //reqDto.IsRework = "0"; res = HjMaterialStockIn(req); if (res.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode()) { return res; } res = CopperLineToEmptyCon(reqDto); } else if (reqDto.BusType == 5)//空轮初始化 { req.Grade = ""; req.IsFast = ""; req.WareCode = "hjhouse"; req.SpoolType = "800"; req.MatCode = "01HJW800Empty"; req.MatBarCode = req.RFID; req.UpdatedTime = DateTime.Now.ToString(); req.ProductDate = DateTime.Now.ToString(); res = HjMaterialStockIn(req); } return res; } /// /// 镀铜补空/取满指令接收接口(包含550工字轮 手持机使用) /// /// /// public SRes PdaCopperLineReceiveInstr(CopperLineRequest reqDto) { var res = new SRes(); var req = _mapper.Map(reqDto); req.Floor = 1; if (reqDto.BusType == 1) { reqDto.RFID = ""; reqDto.MatCode = ""; reqDto.MatBarCode = ""; reqDto.WareCode = "hjhouse"; reqDto.ProductDate = ""; reqDto.IsFast = ""; reqDto.SpoolType = "800"; reqDto.ProductCode = ""; reqDto.OrderCode = ""; reqDto.WorkOrder = ""; reqDto.Grade = ""; reqDto.Length = 0; reqDto.UpdatedTime = ""; reqDto.IsRework = ""; return CopperLineToEmptyCon(reqDto); } else if (reqDto.BusType == 2) { req.MatCode = "53192H09"; req.MatBarCode = Guid.NewGuid().ToString(); req.WareCode = "hjhouse"; req.ProductDate = DateTime.Now.ToString(); req.IsFast = "0"; req.SpoolType = "800"; req.ProductCode = "A"; req.OrderCode = "123123"; req.WorkOrder = "123123"; req.Grade = "A"; req.Length = 111; req.UpdatedTime = DateTime.Now.ToString(); req.IsRework = "0"; res = HjMaterialStockIn(req); } else if (reqDto.BusType == 3) { reqDto.MatCode = "53192H09"; reqDto.MatBarCode = Guid.NewGuid().ToString(); reqDto.WareCode = "hjhouse"; reqDto.ProductDate = DateTime.Now.ToString(); reqDto.IsFast = "0"; reqDto.SpoolType = "800"; reqDto.ProductCode = "A"; reqDto.OrderCode = "123123"; reqDto.WorkOrder = "123123"; reqDto.Grade = "A"; reqDto.Length = 111; reqDto.UpdatedTime = DateTime.Now.ToString(); reqDto.IsRework = "0"; req.MatCode = "53192H09"; req.MatBarCode = Guid.NewGuid().ToString(); req.WareCode = "hjhouse"; req.ProductDate = DateTime.Now.ToString(); req.IsFast = "0"; req.SpoolType = "800"; req.ProductCode = "A"; req.OrderCode = "123123"; req.WorkOrder = "123123"; req.Grade = "A"; req.Length = 111; req.UpdatedTime = DateTime.Now.ToString(); req.IsRework = "0"; res = HjMaterialStockIn(req); res = CopperLineToEmptyCon(reqDto); } else if (reqDto.BusType == 5)//空轮初始化 { req.Grade = ""; req.IsFast = ""; req.WareCode = "hjhouse"; req.SpoolType = "800"; req.MatCode = "01HJW800Empty"; req.MatBarCode = req.RFID; req.UpdatedTime = DateTime.Now.ToString(); req.ProductDate = DateTime.Now.ToString(); res = HjMaterialStockIn(req); } return res; } /// /// 合金一楼满轮出库申请(mes调用) /// /// /// public SRes CopperLineToStockOut(CopperLineToStockOutRequest request) { var res = new SRes(); if (_wcstaskoldrepository.AsQueryable().SplitTable(tabs => tabs.Take(2)).Where(p => p.AddrTo == request.MachineCode && p.Status < TaskStatus.Finish).Any()) { _logger.LogInformation(request.MachineCode + "已经存在未完成任务"); return res; } var warehosue = _basewarehouserepository.GetSingle(p => p.Code == "hjhouse"); if (warehosue == null) { res.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription(); return res; } var docCode = GenerateBillCode("HJ04").ResData; var doc = _billdocrepository.GetFirst(p => p.DocsNo == docCode); if (doc == null) { doc = new BillDocsinfo(); doc.WarehouseId = warehosue.Id; //保存单据信息 doc.ReqNo = ""; doc.DocsNo = docCode; doc.TypeNum = DocType.DocType_HJ_StockOut.GetHashCode(); doc.StateNum = DocState.DocState_Create.GetHashCode(); doc.JsonContent = JsonConvert.SerializeObject(request); doc.DownQty = 1; doc.IsStop = 0; doc.AddTime = DateTime.Now; doc.AddWho = "wms"; var docinsert = _billdocrepository.Insert(doc); if (!docinsert) { res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.ErrParam.GetDescription(); return res; } } var locationlist = from loc in _basewarecellrepository.GetList(p => p.IsStop == 0 && p.StateNum == LocationState.LocationState_Full.GetHashCode()) join stock in _billInvnowrepository.GetList(p => p.ContGrpType == ContGrpType.Material.GetHashCode() && p.InvStateCode == InvState.InvEcecState_In.ToString()) on loc.ContGrpBarCode equals stock.ContGrpBarCode orderby stock.ProductTime select new { stock.MatCode, stock.InvBarCode, stock.RFIDBarCode, stock.IsFast, stock.Grade, stock.IsSurplus, stock.IsRework, stock.InvStateCode, stock.ProductTime, stock.ExecStateCode, stock.IsBack, loc.Col, loc.Layer, loc.Shelf, loc.Depth, loc.Code, loc.Tunnel, loc.WarehouseCode, loc.ContGrpBarCode, loc.Id, loc.StateNum, }; if (!string.IsNullOrEmpty(request.MatCode)) { locationlist = locationlist.Where(p => p.MatCode == request.MatCode); } if (!string.IsNullOrEmpty(request.RFID)) { locationlist = locationlist.Where(p => p.RFIDBarCode == request.RFID); } if (request.MoveType == "2") { locationlist = locationlist.Where(p => p.ExecStateCode == "InvState_Lock"); } else if(request.MoveType == "1") { locationlist = locationlist.Where(p => p.ExecStateCode == "InvState_Normal"); } if (locationlist == null || !locationlist.Any()) { res.ResCode = ResponseStatusCodeEnum.NotEnoughStock.GetHashCode(); res.ResMsg = request.MatCode + "|" + request.RFID + ResponseStatusCodeEnum.NotEnoughStock.GetDescription(); return res; } locationlist = locationlist.OrderBy(p => p.ProductTime); //出库任务 var temploc = locationlist.First(); if (temploc.Depth == 2 && temploc.InvStateCode == InvState.InvEcecState_In.ToString()) { //获取一深位货位 var loc = locationlist.Where(p => p.Col == temploc.Col && temploc.Layer == temploc.Layer && p.Shelf == temploc.Shelf && p.Depth == 1 && p.InvStateCode == InvState.InvEcecState_In.ToString()); if (loc != null && loc.Any()) { temploc = loc.First(); } } var outstation = ""; if (temploc.Tunnel == 1) { outstation = "1012"; } else if (temploc.Tunnel == 2) { outstation = "1014"; } else if (temploc.Tunnel == 3) { outstation = "1016"; } else if (temploc.Tunnel == 4) { outstation = "1118"; } var sotck = _billInvnowrepository.GetFirst(p => p.ContGrpBarCode == temploc.ContGrpBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString()); try { _db.BeginTran(); //货位表 _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = LocationState.LocationState_StockOut.GetHashCode() }, p => p.Id == temploc.Id); //库存表 _billInvnowrepository.UpdateModelColumns(p => new BillInvnow() { InvStateCode = InvState.InvEcecState_OutGoing.ToString(), EditTime = DateTime.Now }, p => p.Id == sotck.Id); var invflow = _mapper.Map(sotck); invflow.InvStateCode = InvState.InvEcecState_OutGoing.ToString(); invflow.AddTime = DateTime.Now; invflow.Id = IdFactory.NewId(); _billInvflow.Insert(invflow); //添加出库任务 CreateStockOutWcsTask(new CreateStockOutWcsTaskRequest() { ContGrpBarCode = temploc.ContGrpBarCode, CellNo = temploc.Code, EquCode = outstation, EndPos = request.MachineCode, Floor = 1, Qty = sotck.LengthQty, Tunnel = temploc.Tunnel.ToString(), WarehouseCode = temploc.WarehouseCode, WorkBench = "", MatCode = request.MatCode, InvBarCode = temploc.InvBarCode, IsFast = temploc.IsFast, Grade = temploc.Grade, IsSurplus = temploc.IsSurplus, IsRework = temploc.IsRework, BusType = TaskBusType.TaskBusType_HJ_OneFloorStockOut, Priority = 0 }); _db.CommitTran(); } catch (Exception ex) { _db.RollbackTran(); _logger.LogInformation(ex.ToString()); res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.DataSaveErr.GetDescription(); return res; } return res; } /// /// 镀铜线补空轮 /// /// public SRes CopperLineToEmptyCon(CopperLineRequest reqDto) { var res = new SRes(); string startpoint = wms.util.AppSettings.GetConfig("CopperLineToEmptyAreaCode"); string bustype = TaskBusType.TaskBusType_HJ_OneFloorEmptySpoolToLine.GetDescription(); //收到后直接下发wcs任务 var wcstask = new WCS_TaskInfo() { Type = TaskType.Delivery, Status = TaskStatus.NewBuild, Priority = 0, Device = "", SrmStation = "", AddrFrom = startpoint, AddrTo = reqDto.WbCode, LastInteractionPoint = "", BarCode = "", Floor = 1, Length = 0, AddTime = DateTime.Now, StartTime = DateTime.Now, DocID = 0, PalletType = 1, ProdLine = 0, AddWho = "wms", WarehouseCode = "hjhouse", Enabled = true, WorkBench = reqDto.WbCode, BusType = bustype }; var wcstaskhis = _mapper.Map(wcstask); try { _db.BeginTran(); var task = _taskrepository.InsertReturnEntity(wcstask); wcstaskhis.ID = task.ID; _wcstaskoldrepository.InsertableSplitTable(wcstaskhis); var taskdetail = new WCS_TaskDtl() { ID = Guid.NewGuid(), CurPoint = startpoint, AddTime = DateTime.Now, AddWho = "wms", Enabled = true, ParentTaskCode = task.ID, Desc = startpoint + "合金镀铜线补空轮", }; _taskdetailrepository.InsertableSplitTable(taskdetail); _db.CommitTran(); } catch (Exception ex) { _db.RollbackTran(); res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.DataSaveErr.GetDescription(); _logger.LogInformation("保存任务异常:" + ex.ToString()); return res; } return res; } /// /// 合金库物料入库 /// /// /// public SRes HjMaterialStockIn(HjMaterialStockInRequest reqDto) { var res = new CopperLineResponse(); TaskBusType BusType = TaskBusType.TaskBusType_HJ_Def; if (reqDto.Floor == 1) { //参数验证 if (reqDto.BusType <= 0 || reqDto.BusType > 5) { res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode(); res.ResMsg = "指令类型" + reqDto.BusType + ResponseStatusCodeEnum.ErrParam.GetDescription(); return res; } if (reqDto.BusType > 1 && (string.IsNullOrEmpty(reqDto.RFID) || string.IsNullOrEmpty(reqDto.MatBarCode))) { res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode(); res.ResMsg = "RFID和材料号不可为空"; return res; } BusType = reqDto.BusType == 5 ? TaskBusType.TaskBusType_HJ_OneFloorEmptySpoolStockIn : TaskBusType.TaskBusType_HJ_OneFloorLineStockIn; } else { if (reqDto.BusType <= 0 || reqDto.BusType > 3) { res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode(); res.ResMsg = "指令类型" + reqDto.BusType + ResponseStatusCodeEnum.ErrParam.GetDescription(); return res; } if (reqDto.BusType < 3 && (string.IsNullOrEmpty(reqDto.RFID) || string.IsNullOrEmpty(reqDto.MatBarCode))) { res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode(); res.ResMsg = "RFID和材料号不可为空"; return res; } } //判断货位是否足够 if (reqDto.Floor == 2 && (reqDto.BusType == 1 || reqDto.BusType == 2))//退料/余料称重判断3巷道 { if (_basewarecellrepository.GetList(p => p.IsStop == 0 && p.Tunnel == 3 && p.StateNum == LocationState.LocationState_Empty.GetHashCode()).Count() < 2) { res.ResCode = ResponseStatusCodeEnum.NotEnoughLocation.GetHashCode(); res.ResMsg = "3巷道" + ResponseStatusCodeEnum.NotEnoughLocation.GetDescription(); return res; } } else { if (_basewarecellrepository.GetList(p => p.IsStop == 0 && p.StateNum == LocationState.LocationState_Empty.GetHashCode()).Count() < 2) { res.ResCode = ResponseStatusCodeEnum.NotEnoughLocation.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.NotEnoughLocation.GetDescription(); return res; } } var warehosue = _basewarehouserepository.GetSingle(p => p.Code == reqDto.WareCode); if (warehosue == null) { res.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription(); return res; } //载具验证 基础信息和库存、任务信息 var container = _baseContinfo.GetSingle(p => p.ContBarCode == reqDto.RFID); if (container == null) { var insertcon = new BaseContinfo() { ContBarCode = reqDto.RFID, Name = reqDto.RFID, TypeCode = ContainerType.ContainerType_RFID.ToString(), PrintQty = 1, IsStop = 0, WarehouseId = warehosue.Id, WeightQty = 158, AddWho = "wms", AddTime = DateTime.Now }; //新加载具信息 if (!_baseContinfo.Insert(insertcon)) { res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode(); res.ResMsg = "RFID载具初始化失败"; return res; } } var task = _wcstaskoldrepository.AsQueryable().Where(p => p.BarCode == reqDto.RFID && p.Status < TaskStatus.Finish).SplitTable(p => p.Take(2)).First(); if (task != null && task.ID > 0) { //var agvtask = _agvTaskInforepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.ID == task.AgvTaskID).SplitTable(p => p.Take(2)).First(); if (task.Type == TaskType.OutDepot) { res.ResCode = 0; res.ResMsg = reqDto.RFID + "该号出库任务还未完成,请先完成出库任务"; return res; } else if (task.Type == TaskType.EnterDepot) { //string agvstr = agvtask != null ? agvtask.AgvID : ""; res.ResCode = 0; res.ResMsg = reqDto.RFID + "任务已创建,请勿重复申请;"; return res; } else if (task.Type == TaskType.EnterDepot && task.Status > TaskStatus.WaitingToExecute && task.Status < TaskStatus.Finish) { //string agvstr = agvtask != null ? agvtask.AgvID : ""; res.ResCode = 0; res.ResMsg = reqDto.RFID + "已有进行中任务,请检查是否重复RFID;" ; return res; } else if (task.Type == TaskType.EmptyInit) { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = reqDto.RFID + "存在空轮初始化任务,请先处理上一个任务"; return res; } } var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == reqDto.RFID); if (stock != null && stock.InvStateCode == InvState.InvEcecState_In.ToString()) { if (reqDto.Floor == 2 && reqDto.BusType == 3 && stock.ContGrpType == 2)//空轮重复情况不做卡控 { reqDto.RFID = reqDto.RFID + "-" + new Random().Next(1, 1000); stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == reqDto.RFID); } else { res.ResCode = 0; res.ResMsg = reqDto.RFID + "该RFID号已在库中,请检查RFID号是否重复"; return res; } } if (stock != null && stock.InvStateCode == InvState.InvEcecState_OutGoing.ToString()) { res.ResCode = 0; res.ResMsg = reqDto.RFID + "该RFID号存在出库中任务,请检查上一个任务是否已经完成"; return res; } if (stock != null) { if (reqDto.Floor == 2 && reqDto.BusType == 3 && stock.ContGrpType == 2)//空轮重复情况不做卡控 { reqDto.RFID = reqDto.RFID + "-" + new Random().Next(1, 1000); stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == reqDto.RFID); } else { res.ResCode = 0; res.ResMsg = reqDto.RFID + ResponseStatusCodeEnum.GroupStockDetailMaterialBarCodeExist.GetDescription(); return res; } } //var stock1 = _billInvnowrepository.GetSingle(p => p.InvBarCode == reqDto.MatBarCode); //if (stock1 != null && stock1.ExecStateCode == InvState.InvEcecState_In.ToString()) //{ // res.ResCode = 0; // res.ResMsg = reqDto.MatBarCode + "该材料号已在库中,请检查材料号是否重复"; // return res; //} //if (stock1 != null && stock1.ExecStateCode == InvState.InvEcecState_OutGoing.ToString()) //{ // res.ResCode = 0; // res.ResMsg = reqDto.MatBarCode + "该材料号存在出库中任务,请检查上一个任务是否已经完成"; // return res; //} //条码验证 var barstock = _billInvnowrepository.GetSingle(p => p.InvBarCode == reqDto.MatBarCode); if (barstock != null && barstock.InvStateCode == InvState.InvEcecState_In.ToString()) { res.ResCode = 0; res.ResMsg = reqDto.MatBarCode + "该材料号已在库中,请检查是否重复"; return res; } if (barstock != null && barstock.ContGrpBarCode != reqDto.RFID) { res.ResCode = 0; res.ResMsg = reqDto.MatBarCode + "该材料号已经绑定,请检查是否重复绑定,工字轮:" + barstock.ContGrpBarCode + "及" + reqDto.RFID; return res; } if (!string.IsNullOrEmpty(reqDto.MatBarCode)) { var barinit = _billInvinitrepository.GetSingle(p => p.InvBarCode == reqDto.MatBarCode); if (barinit != null && barinit.ContGrpBarCode != reqDto.RFID) { res.ResCode = 0; res.ResMsg = reqDto.MatBarCode + "该材料号条码表绑定" + barinit.ContGrpBarCode + ",请检查是否重复"; return res; } } BaseMatinfo mater = new BaseMatinfo(); if (reqDto.Floor == 2 && reqDto.BusType == 3) { //空轮不做验证 reqDto.MatBarCode = reqDto.RFID; string matercode = reqDto.RFID.Substring(3, 3) == "800" ? "01HJW800Empty" : "01HJW500Empty"; mater = _basematerrepository.GetSingle(p => p.Code == matercode); } else { //物料编码验证 mater = _basematerrepository.GetSingle(p => p.Code == reqDto.MatCode); if (mater == null) { res.ResCode = ResponseStatusCodeEnum.MaterInfoNotExist.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.MaterInfoNotExist.GetDescription(); return res; } } //var docCode = GenerateBillCode("HJ01").ResData; string docCode = ""; if (reqDto.Floor == 1) { docCode = "HJ01" + reqDto.MatBarCode; } else if (reqDto.Floor == 2) { docCode = "HJ03" + reqDto.MatBarCode; } var doc = _billdocrepository.GetSingle(p => p.DocsNo == docCode); if (doc == null) { doc = new BillDocsinfo(); doc.WarehouseId = warehosue.Id; //保存单据信息 doc.ReqNo = reqDto.MatBarCode; doc.DocsNo = docCode;//生成单据号 if (reqDto.Floor == 1) { doc.TypeNum = DocType.DocType_HJ_CopperProductStockIn.GetHashCode(); if (reqDto.BusType == 5) { doc.TypeNum = DocType.DocType_HJ_EmptyContStockIn.GetHashCode(); } } else if (reqDto.Floor == 2) { int doctype = 0; if (reqDto.BusType == 1) { doctype = DocType.DocType_HJ_WetLineBack.GetHashCode(); } else if (reqDto.BusType == 2) { doctype = DocType.DocType_HJ_WetLineLeft.GetHashCode(); } } doc.StateNum = DocState.DocState_Create.GetHashCode(); doc.JsonContent = JsonConvert.SerializeObject(reqDto); doc.DownQty = 1; doc.IsStop = 0; var docinsert = _billdocrepository.Insert(doc); if (!docinsert) { res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.ErrParam.GetDescription(); return res; } } else { _billdocrepository.UpdateModelColumns(p => new BillDocsinfo() { DownQty = p.DownQty + 1, JsonContent = JsonConvert.SerializeObject(reqDto), EditTime = DateTime.Now }, p => p.DocsNo == docCode); } if (reqDto.Floor == 1) { BusType = TaskBusType.TaskBusType_HJ_OneFloorLineStockIn; BusType = reqDto.BusType == 5 ? TaskBusType.TaskBusType_HJ_OneFloorEmptySpoolStockIn : TaskBusType.TaskBusType_HJ_OneFloorLineStockIn; } else if (reqDto.Floor == 2) { if (reqDto.BusType == 1) { BusType = TaskBusType.TaskBusType_HJ_WetBack; } else if (reqDto.BusType == 2) { BusType = TaskBusType.TaskBusType_HJ_WetLeft; } else if (reqDto.BusType == 3) { BusType = TaskBusType.TaskBusType_HJ_WetEmpty; reqDto.WbCode = ""; reqDto.MatCode = "WS800"; } } if (string.IsNullOrEmpty(reqDto.SpoolType)) { reqDto.SpoolType = "WS" + reqDto.RFID.Substring(3, 3); } //保存条码信息(让mes/海康直接推送过来) var barinfo = _billInvinitrepository.GetSingle(p => p.InvBarCode == reqDto.MatBarCode); if (barinfo == null) { barinfo = new BillInvinit() { InvBarCode = reqDto.MatBarCode, WarehouseId = warehosue.Id, ContGrpId = IdFactory.NewId(), ContGrpBarCode = reqDto.RFID, ExecStateCode = InvLockState.InvState_Normal.ToString(), ExecDocsNo = docCode, ExecDocsRowNo = reqDto.MatBarCode, ExecDocsTypeCode = DocType.DocType_HJ_CopperProductStockIn.GetHashCode().ToString(), InvInOut = InvInOutType.In.GetHashCode(), ExecWho = "MES", EditTime = DateTime.Now, InvStateCode = InvState.InvEcecState_BuildUp.ToString(), InDocsNo = docCode, InDocsRowNo = reqDto.MatBarCode, SuppCode = "", MatId = mater.Id, MatCode = mater.Code, MatName = mater.Name, LengthQty = reqDto.Length, ProductTime = DateTime.Parse(reqDto.ProductDate), RFIDBarCode = reqDto.RFID, ProductLineNo = reqDto.ProductCode, Grade = reqDto.Grade, HWBarCode = reqDto.RFID, HWTypeCode = reqDto.SpoolType,//工字轮类型 IsFast = reqDto.IsFast == "1", IsRework = reqDto.IsRework == "1", CLBarCode = reqDto.MatBarCode, Size = 1, AddTime = DateTime.Now, BackReason = reqDto.Reason, HoldDuration = reqDto.HoldDuration ?? 0, }; if (BusType == TaskBusType.TaskBusType_HJ_WetBack) { barinfo.IsBack = true; } else if (BusType == TaskBusType.TaskBusType_HJ_WetLeft) { barinfo.IsSurplus = true; } if (reqDto.IsLock == "1") { barinfo.ExecStateCode = InvLockState.InvState_Lock.ToString(); } barinfo = _billInvinitrepository.InsertReturnEntity(barinfo); } //生成库存信息-分解方法 var createStockRes = CreateStock(new List() { barinfo }, reqDto.RFID, ContainerType.ContainerType_RFID,reqDto.BusType == 5 ||(reqDto.Floor == 2 && reqDto.BusType == 3) ? true : false); if (createStockRes.ResCode != 200) { res.ResCode = createStockRes.ResCode; res.ResMsg = createStockRes.ResMsg; return res; } var createStockInWcsTaskReqest = new CreateStockInWcsTaskRequest() { BusType = BusType.GetDescription(), ContGrpBarCode = reqDto.RFID, ContGrpId = createStockRes.ResData.ContGrpId, DocCode = doc.DocsNo, DocId = doc.Id, Qty = reqDto.Length, EquCode = reqDto.WbCode, WarehouseCode = reqDto.WareCode, ProLine = reqDto.ProductCode, Floor = reqDto.Floor, MatCode = reqDto.MatCode, MaterialCode = reqDto.MatCode, IsDirMove = reqDto.IsMove, InvBarCode = reqDto.MatBarCode, Grade = reqDto.Grade, IsFast = reqDto.IsFast == "1", IsRework = reqDto.IsRework == "1", ReqCode = reqDto.ReqCode }; if (BusType == TaskBusType.TaskBusType_HJ_WetEmpty) { createStockInWcsTaskReqest.MaterialCode = reqDto.SpoolType == "WS800" ? "01HJW800Empty" : "01HJW500Empty"; createStockInWcsTaskReqest.EquCode = "24"; } else if (BusType == TaskBusType.TaskBusType_HJ_WetBack || BusType == TaskBusType.TaskBusType_HJ_WetLeft) { createStockInWcsTaskReqest.MaterialCode = reqDto.MatCode; createStockInWcsTaskReqest.EquCode = "24"; } //else if(BusType == TaskBusType.TaskBusType_HJ_WetBack) //{ // createStockInWcsTaskReqest.EquCode = "5"; //} //下发wcs任务-分解方法 var taskres = CreateStockInWcsTask(createStockInWcsTaskReqest); if (taskres.ResCode != 200) { res.ResCode = taskres.ResCode; res.ResMsg = taskres.ResMsg; return res; } //生成流水数据-分解方法 CreateInvFlow(new List() { createStockRes.ResData }); //二楼入库暂时分巷道 //if (reqDto.Floor == 2) //{ // if (taskres.ResData != null && taskres.ResData.ID > 0) // { // var restunnel = GetTunnelPriorityList(new GetTunnelPriorityListRequest() { TaskNum = taskres.ResData.ID }); // if (restunnel != null && !string.IsNullOrEmpty(restunnel.ResData)) // { // string tun = restunnel.ResData.Split(',')[0]; // string srm = "SRM" + tun; // var station = ""; // if (tun == "1") // { // station = "1021"; // } // else if (tun == "2") // { // station = "1023"; // } // else if (tun == "3") // { // station = "1025"; // } // //退料/余料只能入3巷道,要称重 // if (BusType == TaskBusType.TaskBusType_HJ_WetLeft || BusType == TaskBusType.TaskBusType_HJ_WetBack) // { // if (restunnel.ResData.Contains("3")) // { // tun = "3"; // station = "1025"; // srm = "SRM" + tun; // } // } // var wcs = _taskrepository.UpdateSetColumnsTrue(p => new WCS_TaskInfo() { Tunnel = tun, SrmStation = station, Device = srm }, // p => p.ID == taskres.ResData.ID // ); // if (!wcs) // { // } // } // else // { // _logger.LogInformation(taskres.ResData.ID + "分配巷道失败"); // } // } //} return res; } public SRes DeleteDoc(Expression> whereExpression) { var res = new SRes(); res.ResData = _docrepository.Delete(whereExpression); return res; } public SRes GenerateBillCode(string code) { //var rulemodel = _hjBaseSerialnoRule.GetSingle(p => p.Code == code && p.DayTime == DateTime.Now.Date); //if (rulemodel == null) //{ // rulemodel = _hjBaseSerialnoRule.InsertReturnEntity(new hjBaseSerialnoRule() { // Code = code, // DayTime = DateTime.Now.Date, // LastValue = 1, // Name = code, // AddTime = DateTime.Now, // EditTime = DateTime.Now // }); //} //return new SRes() { ResData = code + DateTime.Now.Date.ToString() + rulemodel.LastValue.ToString().PadLeft(6, '0') }; //return new SRes() { ResData = code + DateTime.Now.ToString("yyyyMMddHHmmssffff") }; return new SRes() { ResData = code + DateTime.Now.ToString("yyyyMMdd") }; } public SRes CreateInvFlow(List barlist) { var res = new SRes(); var listflow = _mapper.Map>(barlist); foreach (var item in listflow) { item.AddTime = DateTime.Now; item.Id = IdFactory.NewId(); } _billInvflow.InsertRange(listflow); return res; } public SRes LoadBarInfo() { var res = new SRes(); //验证物料基础信息是否存在,不存在则保存 return res; } public SRes WcsUploadInfo(WcsUploadInfoRequest reqDto) { var res = new SRes(); var task = _taskrepository.GetSingle(p => p.ID == reqDto.TaskCode); if (task == null) { res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription(); return res; } if (task.WarehouseCode == "hjhouse") { //string bar = !string.IsNullOrEmpty(reqDto.RFID) ? reqDto.RFID.Substring(0, 12) : ""; string bar = reqDto.RFID; if (!string.IsNullOrEmpty(bar)) { if (task.BarCode != bar) { res.ResCode = 0; res.ResMsg = reqDto.RFID + "与任务表RFID(" + task.BarCode + ")不一致"; return res; } } else { bar = task.BarCode; } if (!string.IsNullOrEmpty(bar)) { var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == bar); if (stock == null || stock.InvStateCode != InvState.InvEcecState_BuildUp.ToString()) { res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode(); res.ResMsg = reqDto.RFID + "该RFID号不是组盘状态,请检查RFID号是否重复"; return res; } decimal netwqty = 0; decimal tarewqty = 0; if (stock.ContGrpType == ContGrpType.EmptyCon.GetHashCode() && reqDto.Weight > 0) { _baseContinfo.UpdateModelColumns(p => new BaseContinfo() { WeightQty = reqDto.Weight, Memo = reqDto.RFID, EditTime = DateTime.Now }, p => p.ContBarCode == bar); tarewqty = reqDto.Weight; } else if (stock.ContGrpType == ContGrpType.Material.GetHashCode() && reqDto.Weight > 0) { var cont = _baseContinfo.GetFirst(p => p.ContBarCode == bar); if (cont != null) { netwqty = reqDto.Weight - cont.WeightQty; tarewqty = cont.WeightQty; } } _billInvnowrepository.UpdateModelColumns(p => new BillInvnow() { TolWQty = reqDto.Weight, NetWQty = netwqty, TareWQty = tarewqty, Memo = reqDto.RFID, EditTime = DateTime.Now }, p => p.RFIDBarCode == bar && p.InvStateCode == InvState.InvEcecState_BuildUp.ToString()); } } return res; } public SRes CreateStockInWcsTask(CreateStockInWcsTaskRequest reqDto) { var res = new SRes(); var wcstask = new WCS_TaskInfo() { Type = TaskType.EnterDepot, Status = TaskStatus.NewBuild, Priority = 0, Device = "", SrmStation = "", AddrFrom = reqDto.EquCode, AddrTo = "srm", LastInteractionPoint = "", BarCode = reqDto.ContGrpBarCode, Floor = reqDto.Floor, Length = reqDto.Qty, AddTime = DateTime.Now, StartTime = DateTime.Now, DocID = 0, PalletType = 1, ProdLine = reqDto.IsDirMove, AddWho = !string.IsNullOrEmpty(reqDto.ReqCode) ? reqDto.ReqCode : "wms", WarehouseCode = reqDto.WarehouseCode, Enabled = true, WorkBench = reqDto.EquCode, MaterialCode = reqDto.MaterialCode, MatCode = reqDto.MatCode, BusType = reqDto.BusType, Grade = reqDto.Grade, InvBarCode = reqDto.InvBarCode, IsFast = reqDto.IsFast, IsRework = reqDto.IsRework }; var wcstaskhis = _mapper.Map(wcstask); try { _db.BeginTran(); var task = _taskrepository.InsertReturnEntity(wcstask); wcstaskhis.ID = task.ID; _wcstaskoldrepository.InsertableSplitTable(wcstaskhis); var taskdetail = new WCS_TaskDtl() { ID = Guid.NewGuid(), CurPoint = reqDto.EquCode, AddTime = DateTime.Now, AddWho = "wms", Enabled = true, ParentTaskCode = task.ID, Desc = reqDto.EquCode+"合金镀铜下线", }; _taskdetailrepository.InsertableSplitTable(taskdetail); _db.CommitTran(); res.ResData = task; } catch (Exception ex) { _db.RollbackTran(); res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.DataSaveErr.GetDescription(); _logger.LogInformation("保存任务异常:" + ex.ToString()); return res; } return res; } public SRes CreateStockOutWcsTask(CreateStockOutWcsTaskRequest reqDto) { var res = new SRes(); string bus = reqDto.BusType.GetDescription(); var wcstask = new WCS_TaskInfo() { Type = TaskType.OutDepot, Status = TaskStatus.NewBuild, Priority = reqDto.Priority, Device = "SRM"+reqDto.Tunnel, SrmStation = reqDto.EquCode, AddrFrom = reqDto.CellNo, AddrTo = !string.IsNullOrEmpty(reqDto.EndPos) ? reqDto.EndPos : reqDto.EquCode, LastInteractionPoint = "", BarCode = reqDto.ContGrpBarCode, Floor = reqDto.Floor, Length = reqDto.Qty, AddTime = DateTime.Now, StartTime = DateTime.Now, DocID = 0, PalletType = 1, ProdLine = 0, AddWho = !string.IsNullOrEmpty(reqDto.ReqCode) ? reqDto.ReqCode : "wms", WarehouseCode = reqDto.WarehouseCode, Enabled = true, WorkBench = reqDto.WorkBench, Tunnel = reqDto.Tunnel, BusType = bus, MatCode = reqDto.MatCode, MaterialCode = reqDto.MatCode, InvBarCode = reqDto.InvBarCode, IsFast = reqDto.IsFast, Grade = reqDto.Grade, IsSurplus = reqDto.IsSurplus, IsRework = reqDto.IsRework }; var wcstaskhis = _mapper.Map(wcstask); try { //_db.BeginTran(); var task = _taskrepository.InsertReturnEntity(wcstask); wcstaskhis.ID = task.ID; _wcstaskoldrepository.InsertableSplitTable(wcstaskhis); var taskdetail = new WCS_TaskDtl() { ID = Guid.NewGuid(), CurPoint = reqDto.CellNo, AddTime = DateTime.Now, AddWho = "wms", Enabled = true, ParentTaskCode = task.ID, Desc = reqDto.EquCode + "合金空轮备料", }; _taskdetailrepository.InsertableSplitTable(taskdetail); //_db.CommitTran(); res.ResData = task; } catch (Exception ex) { //_db.RollbackTran(); res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.DataSaveErr.GetDescription(); _logger.LogInformation("保存任务异常:" + ex.ToString()); return res; } return res; } public SRes CreateStock(List barList,string containerBarcode, ContainerType containerType,bool isEmptyCont = false) { var res = new SRes(); if (string.IsNullOrEmpty(containerBarcode)) { res.ResCode = ResponseStatusCodeEnum.ContainerCodeNotEmpty.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.ContainerCodeNotEmpty.GetDescription(); return res; } //var task = _taskrepository.GetSingle(p => p.BarCode == containerBarcode); //if (task != null && task.ID > 0) //{ // if (task.Type == TaskType.OutDepot) // { // res.ResCode = 0; // res.ResMsg = containerBarcode + "该号出库任务还未完成,请先完成出库任务"; // return res; // } // else if (task.Type == TaskType.EnterDepot) // { // res.ResCode = 0; // res.ResMsg = containerBarcode + "已有进行中入库任务,请检查是否重复RFID"; // return res; // } //} //var container = _baseContinfo.GetSingle(p => p.ContBarCode == containerBarcode); //if (container == null) //{ // var insertcon = new BaseContinfo() // { // ContBarCode = containerBarcode, // Name = containerBarcode, // TypeCode = ContainerType.ContainerType_RFID.ToString(), // PrintQty = 1, // WarehouseId = barList.First().WarehouseId, // IsStop = 0, // WeightQty = 158, // AddWho = "wms", // AddTime = DateTime.Now // }; // //新加载具信息 // if (!_baseContinfo.Insert(insertcon)) // { // res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode(); // res.ResMsg = "RFID载具初始化失败"; // return res; // } //} if (barList.Count <= 0 || barList.Where(p=>string.IsNullOrEmpty(p.InvBarCode)).Any()) { res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode(); res.ResMsg = "材料号信息不全"; return res; } if (barList.Count == 1) { var barinfo = _billInvinitrepository.GetFirst(p => p.InvBarCode == barList.First().InvBarCode); if (barinfo == null) { res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode(); res.ResMsg = "没有条码信息"; return res; } } else { var barinfolist = _billInvinitrepository.GetList(p => barList.Select(q=>q.InvBarCode).Contains(p.InvBarCode)); if (barinfolist.Count != barList.Count) { res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode(); res.ResMsg = "条码信息不全"; return res; } } //重复托盘验证 //var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == containerBarcode); //if (stock != null && stock.InvStateCode == InvState.InvEcecState_In.ToString()) //{ // res.ResCode = ResponseStatusCodeEnum.BarcodeContainerRepeat.GetHashCode(); // res.ResMsg = containerBarcode + ResponseStatusCodeEnum.BarcodeContainerRepeat.GetDescription(); // return res; //} //验证同托盘只能同种物料 //if (_billInvnowrepository.IsAny(p => barList.Select(q => q.InvBarCode).Contains(p.InvBarCode))) //{ // res.ResCode = ResponseStatusCodeEnum.GroupStockDetailMaterialBarCodeExist.GetHashCode(); // res.ResMsg = string.Join('|', barList.Select(q => q.InvBarCode)) + ResponseStatusCodeEnum.GroupStockDetailMaterialBarCodeExist.GetDescription(); // return res; //} var stocklist = _mapper.Map>(barList); if (barList.Count == 1) { //var doc = _billdocrepository.GetSingle(p => p.DocsNo == barList.First().InDocsNo); var stockin = stocklist.First(); if (isEmptyCont) { stockin.ContGrpType = ContGrpType.EmptyCon.GetHashCode(); if (stockin.TolWQty == 0) { stockin.TolWQty = 158; stockin.TareWQty = 158; } } else { stockin.ContGrpType = ContGrpType.Material.GetHashCode(); } stockin.AddTime = DateTime.Now; stockin.Id = IdFactory.NewId(); var siginsertres = _billInvnowrepository.InsertReturnEntity(stockin); res.ResData = siginsertres; } else { var inerres = _billInvnowrepository.InsertRange(stocklist); res.ResDataList = stocklist; } return res; } public SRes GetTunnelEmptyConCount(GetTunnelEmptyConCountRequest reqDto) { var res = new SRes() { ResDataList = new List() }; var alltunnels = _basewarecellrepository.GetList().Select(p => p.Tunnel).Distinct(); //考虑巷道剩余空轮数量 var locationlist = from loc in _basewarecellrepository.GetList(p => p.IsStop == 0 && p.StateNum == LocationState.LocationState_Full.GetHashCode()) join stock in _billInvnowrepository.GetList(p => p.ContGrpType == ContGrpType.EmptyCon.GetHashCode() && p.InvStateCode == InvState.InvEcecState_In.ToString()) on loc.ContGrpBarCode equals stock.ContGrpBarCode orderby stock.OneInTime select loc; var tunnelcountlist = new List(); if (locationlist.Any()) { tunnelcountlist = (from loc in locationlist.GroupBy(p => p.Tunnel) select new GetTunnelEmptyConResponse { Tunnel = loc.Key, Count = loc.Count() }).ToList(); } foreach (var item in alltunnels) { if (!tunnelcountlist.Where(p => p.Tunnel == item).Any()) { tunnelcountlist.Add(new GetTunnelEmptyConResponse() { Tunnel = item, Count = 0 }); } } var tasktunnelcountlist = tunnelcountlist.OrderBy(p => p.Count).ToList(); res.ResDataList = tasktunnelcountlist; return res; } /// /// 补空轮申请处理 /// /// /// public ApplyStockOutTaskResponse ApplyEmptySpoolService(ApplyEmptySpoolRequest request) { var res = new ApplyStockOutTaskResponse(); var task = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.AddrTo == request.OutEndPostion && p.Status <= TaskStatus.WaitingToExecute); if (task != null && task.Any()) { res.ResCode = ResponseStatusCodeEnum.WcsTaskExist.GetHashCode(); res.ResMsg = request.OutEndPostion + "已经存在待执行任务"; return res; } //考虑巷道剩余空轮数量 var locationlist = from loc in _basewarecellrepository.GetList(p => p.IsStop == 0 && p.StateNum == LocationState.LocationState_Full.GetHashCode() && p.Tunnel == request.Tunnel) join stock in _billInvnowrepository.GetList(p => p.ContGrpType == ContGrpType.EmptyCon.GetHashCode() && p.InvStateCode == InvState.InvEcecState_In.ToString()) on loc.ContGrpBarCode equals stock.ContGrpBarCode orderby stock.OneInTime select loc; if (locationlist == null || !locationlist.Any()) { res.ResCode = ResponseStatusCodeEnum.NotEnoughStock.GetHashCode(); res.ResMsg = request.Tunnel + "巷道空轮" + ResponseStatusCodeEnum.NotEnoughStock.GetDescription(); return res; } res.Tunnel = request.Tunnel.ToString(); res.EmptyContCount = locationlist.Count(); //出库任务 var temploc = locationlist.First(); if (temploc.Depth == 2) { //获取一深位货位 var loc = locationlist.Where(p => p.Col == temploc.Col && temploc.Layer == temploc.Layer && p.Shelf == temploc.Shelf && p.Depth == 1); if (loc != null && loc.Any()) { temploc = loc.First(); } } var sotck = _billInvnowrepository.GetFirst(p => p.ContGrpBarCode == temploc.ContGrpBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString()); try { _db.BeginTran(); //货位表 _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = LocationState.LocationState_StockOut.GetHashCode() }, p => p.Id == temploc.Id); var invflow = _mapper.Map(sotck); invflow.InvStateCode = InvState.InvEcecState_OutGoing.ToString(); invflow.AddTime = DateTime.Now; invflow.Id = IdFactory.NewId(); _billInvflow.Insert(invflow); //库存表 _billInvnowrepository.UpdateModelColumns(p => new BillInvnow() { InvStateCode = InvState.InvEcecState_OutGoing.ToString(), EditTime = DateTime.Now }, p => p.Id == sotck.Id); //添加出库任务 CreateStockOutWcsTask(new CreateStockOutWcsTaskRequest() { ContGrpBarCode = temploc.ContGrpBarCode, CellNo = temploc.Code, EquCode = request.OutEndPostion, Floor = 1, Qty = sotck.LengthQty, Tunnel = temploc.Tunnel.ToString(), WarehouseCode = temploc.WarehouseCode, MatCode = "01HJW800Empty", BusType = TaskBusType.TaskBusType_HJ_OneFloorEmptySpoolOut }); _db.CommitTran(); } catch (Exception ex) { _db.RollbackTran(); _logger.LogInformation(ex.ToString()); res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.DataSaveErr.GetDescription(); return res; } return res; } /// /// 获取移库任务 /// /// /// public SRes AddWcsMoveTask(AddWcsMoveTaskRequest reqEntity) { var result = new SRes() { ResData = new AddWcsMoveTaskResponse() { ResType = WcsContractWcsMoveTaskEnum.失败.GetHashCode(), CellNo = "" } }; var wcstask = _wcstaskoldrepository.AsQueryable().SplitTable(tabs => tabs.Take(3)).Where(p => p.ID == reqEntity.TaskNum).First(); ; if (wcstask == null) { result.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode(); result.ResMsg = reqEntity.TaskNum + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription(); return result; } var dept2Loc = _basewarecellrepository.GetFirst(p => p.Code == wcstask.AddrFrom && p.Depth == 2); if (dept2Loc == null) { result.ResCode = ResponseStatusCodeEnum.WareLocationCodeNotExist.GetHashCode(); result.ResMsg = "该任务所在货位不是二深货位"; return result; } var dept1Loc = _basewarecellrepository.GetFirst(p => p.Col == dept2Loc.Col && p.Layer == dept2Loc.Layer && p.Shelf == dept2Loc.Shelf && p.Depth == 1 && p.IsStop == 0); if (dept1Loc == null) { result.ResCode = ResponseStatusCodeEnum.WareLocationCodeNotExist.GetHashCode(); result.ResMsg = dept2Loc.Code + "对应一深位货位被禁用或者不存在"; return result; } if (wcstask.Type != TaskType.OutDepot) { result.ResCode = WcsContractWcsMoveTaskEnum.失败.GetHashCode(); result.ResMsg = "只有出库任务才能调用此接口"; return result; } result.ResData.CellNo = dept1Loc.Code; try { if (dept1Loc.StateNum == LocationState.LocationState_Empty.GetHashCode()) { result.ResData.ResType = WcsContractWcsMoveTaskEnum.允许2升位执行.GetHashCode(); result.ResData.CellNo = ""; return result; } else if (dept1Loc.StateNum == LocationState.LocationState_Full.GetHashCode()) { result.ResData.ResType = WcsContractWcsMoveTaskEnum.执行移库任务.GetHashCode(); result.ResData.CellNo = dept1Loc.Code; var stock = _billInvnowrepository.GetFirst(p => p.ContGrpBarCode == dept1Loc.ContGrpBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString()); if (stock == null) { result.ResCode = WcsContractWcsMoveTaskEnum.失败.GetHashCode(); result.ResMsg = "一深位库存信息异常,没有查到库存信息"; return result; } var wareshouse = _basewarehouserepository.GetFirst(p => p.Code == wcstask.WarehouseCode); //库位 var loc = ApplyLoc(new ApplyLocRequest() { IsMove = true, MaterialId = stock.MatId, MaterialCode = stock.MatCode, Size = stock.Size, TunnelNum = dept1Loc.Tunnel, WarehuoseId = wareshouse.Id }); if (string.IsNullOrEmpty(loc.ResData.CellNo)) { result.ResCode = WcsContractWcsMoveTaskEnum.失败.GetHashCode(); result.ResMsg = loc.ResMsg; return result; } //任务 CreateMoveWcsTask(new CreateMoveWcsTaskRequest() { ContGrpBarCode = dept1Loc.ContGrpBarCode, EndCellNo = loc.ResData.CellNo, FromCellNo = dept1Loc.Code, Qty = stock.LengthQty, Tunnel = dept1Loc.Tunnel.ToString(), WarehouseCode = wareshouse.Code, BusType = TaskBusType.TaskBusType_HJ_Move.GetDescription() }); return result; } else if (dept1Loc.StateNum == LocationState.LocationState_StockOut.GetHashCode()) { result.ResData.ResType = WcsContractWcsMoveTaskEnum.一深位有出库任务.GetHashCode(); result.ResData.CellNo = dept1Loc.Code; return result; } //判断移库任务是否已经存在 else if (dept1Loc.StateNum == LocationState.LocationState_StockMove.GetHashCode()) { result.ResData.ResType = WcsContractWcsMoveTaskEnum.执行移库任务.GetHashCode(); result.ResData.CellNo = dept1Loc.Code; return result; } else { result.ResCode = WcsContractWcsMoveTaskEnum.失败.GetHashCode(); result.ResMsg = "一深位有入库任务,优先执行入库任务"; return result; } } catch (Exception ex) { result.ResCode = WcsContractWcsMoveTaskEnum.失败.GetHashCode(); result.ResMsg = WcsContractWcsMoveTaskEnum.失败.GetDescription(); _logger.LogInformation(ex.ToString()); return result; } return result; } public SRes CreateMoveWcsTask(CreateMoveWcsTaskRequest reqDto) { var res = new SRes(); var wcstask = new WCS_TaskInfo() { Type = TaskType.TransferDepot, Status = TaskStatus.NewBuild, Priority = 0, Device = "SRM" + reqDto.Tunnel, SrmStation = "", AddrFrom = reqDto.FromCellNo, AddrTo = reqDto.EndCellNo, LastInteractionPoint = "", BarCode = reqDto.ContGrpBarCode, Floor = 0, Length = reqDto.Qty, AddTime = DateTime.Now, StartTime = DateTime.Now, DocID = 0, PalletType = 1, ProdLine = 0, AddWho = "wms", WarehouseCode = reqDto.WarehouseCode, Enabled = true, WorkBench = "", Tunnel = reqDto.Tunnel, BusType = reqDto.BusType }; var wcstaskhis = _mapper.Map(wcstask); try { _db.BeginTran(); var task = _taskrepository.InsertReturnEntity(wcstask); wcstaskhis.ID = task.ID; _wcstaskoldrepository.InsertableSplitTable(wcstaskhis); var taskdetail = new WCS_TaskDtl() { ID = Guid.NewGuid(), CurPoint = reqDto.FromCellNo, AddTime = DateTime.Now, AddWho = "wms", Enabled = true, ParentTaskCode = task.ID, Desc = reqDto.FromCellNo + "移库至"+ reqDto.EndCellNo, }; _taskdetailrepository.InsertableSplitTable(taskdetail); _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = LocationState.LocationState_StockMove.GetHashCode(), EditTime = DateTime.Now }, p => p.Code == reqDto.FromCellNo); _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = LocationState.LocationState_StockMove.GetHashCode(), EditTime = DateTime.Now }, p => p.Code == reqDto.EndCellNo); _db.CommitTran(); res.ResData = task; } catch (Exception ex) { _db.RollbackTran(); res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.DataSaveErr.GetDescription(); _logger.LogInformation("保存任务异常:" + ex.ToString()); return res; } return res; } /// /// 镀铜满轮入库/550工字轮入库反馈接口 /// /// /// public CopperLineStockInFeedBackResponse CopperLineStockInFeedBack(CopperLineStockInFeedBackRequest ListInfo) { var res = new CopperLineStockInFeedBackResponse(); //读取反馈表推送 return res; } /// /// 复核异常上报处理 /// /// /// public RfidCheckDiffResponse RfidCheckDiffService(RfidCheckDiffRequest request) { var res = new RfidCheckDiffResponse(); //异常 return res; } /// /// 湿拉产线领料申请处理 /// /// /// public SRes WetLinePickMaterApplyService(WetLinePickMaterApplyRequest reqDto) { var res = new SRes(); //if (_wcstaskoldrepository.AsQueryable().SplitTable(tabs => tabs.Take(2)).Where(p => p.WorkBench == reqDto.WbCode && p.Status < TaskStatus.Finish).Any()) //{ // _logger.LogInformation(reqDto.WbCode + "已经存在未完成任务"); // return res; //} if (_wcstaskoldrepository.AsQueryable().SplitTable(tabs => tabs.Take(2)).Where(p => p.AddWho == reqDto.ReqCode && p.Status < TaskStatus.Finish).Any()) { _logger.LogInformation(reqDto.ReqCode + "已经存在未完成任务"); return res; } var warehosue = _basewarehouserepository.GetSingle(p => p.Code == reqDto.WareCode); if (warehosue == null) { res.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription(); return res; } var docCode = GenerateBillCode("HJ02").ResData; var doc = _billdocrepository.GetFirst(p => p.DocsNo == docCode); if (doc == null) { doc = new BillDocsinfo(); doc.WarehouseId = warehosue.Id; //保存单据信息 doc.ReqNo = ""; doc.DocsNo = docCode; doc.TypeNum = DocType.DocType_HJ_WetLinePickMaterApply.GetHashCode(); doc.StateNum = DocState.DocState_Create.GetHashCode(); doc.JsonContent = JsonConvert.SerializeObject(reqDto); doc.DownQty = 1; doc.IsStop = 0; doc.AddTime = DateTime.Now; doc.AddWho = "wms"; var docinsert = _billdocrepository.Insert(doc); if (!docinsert) { res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.ErrParam.GetDescription(); return res; } } return ApplyStockOut(reqDto); } /// /// 湿拉生产退料/余料/空轮申请处理 /// /// /// public SRes WetLineBackInApplyService(WetLineBackInApplyRequest reqDto) { var req = _mapper.Map(reqDto); req.Floor = 2; if (_wcstaskoldrepository.AsQueryable().SplitTable(tabs => tabs.Take(2)).Where(p => p.AddWho == reqDto.ReqCode && p.Status < TaskStatus.Finish).Any()) { _logger.LogInformation(reqDto.ReqCode + "已经存在未完成任务"); return new SRes(); } var res = HjMaterialStockIn(req); return res; } /// /// 库存改判接口 /// /// /// public StockChangeResponse StockChange(StockChangeRequest reqDto) { var res = new StockChangeResponse(); var warehouse = _basewarehouserepository.GetSingle(p => p.Code == reqDto.WareCode); if (warehouse == null) { res.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription(); return res; } if (!reqDto.ListInfo.Any()) { res.ResCode = ResponseStatusCodeEnum.DocDetailNotExist.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.DocDetailNotExist.GetDescription(); return res; } //单据表 var docCode = reqDto.BillCode; var doc = _billdocrepository.GetSingle(p => p.DocsNo == docCode); var conjson = JsonConvert.SerializeObject(reqDto); if (conjson.Length > 4000) { conjson = "内容过长,已截取,具体内容请查看文本日志"; _logger.LogInformation(reqDto.BillCode + "单据:json传参" + conjson); } if (doc == null) { doc = new BillDocsinfo(); doc.WarehouseId = warehouse.Id; //保存单据信息 doc.ReqNo = reqDto.BillCode; doc.DocsNo = docCode;//生成单据号 doc.TypeNum = DocType.DocType_HJ_WetLineStockChange.GetHashCode(); doc.StateNum = DocState.DocState_Create.GetHashCode(); doc.JsonContent = conjson; doc.DownQty = 1; doc.IsStop = 0; doc.AddTime = DateTime.Now; doc.AddWho = "wms"; var docinsert = _billdocrepository.Insert(doc); if (!docinsert) { res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.ErrParam.GetDescription(); return res; } } else { _billdocrepository.UpdateModelColumns(p => new BillDocsinfo() { DownQty = p.DownQty + 1, JsonContent = JsonConvert.SerializeObject(reqDto), EditTime = DateTime.Now }, p => p.DocsNo == docCode); } List feedbarlist = new List(); List stocklist = new List(); List flowlist = new List(); foreach (var item in reqDto.ListInfo) { var feedback = new BillPushinfo() { DocsNo = docCode, TypeCode = FackbeekType.InterfaceType_HJ_StockChanage.ToString(), RFIDBarCode = item.RFID, HWBarCode = item.RFID, CLBarCode = item.MatBarCode, WarehouseId = warehouse.Id, WarehouseCode = warehouse.Code, WareCellId = 0, ReqNo = Guid.NewGuid().ToString(), AddTime = DateTime.Now, EditTime = DateTime.Now, }; var stock = _billInvnowrepository.GetSingle(p => p.InvBarCode == item.MatBarCode); if (stock != null) { feedback.ResStateCode = "S"; feedback.ResDesc = "成功"; switch (item.State) { case "Lock": stock.ExecStateCode = InvLockState.InvState_Lock.ToString(); break; case "Normal": stock.ExecStateCode = InvLockState.InvState_Normal.ToString(); break; case "Fast": stock.IsFast = true; break; case "UnFast": stock.IsFast = false; break; default: break; } if (!string.IsNullOrEmpty(item.Grade)) { stock.Grade = item.Grade; } if (!string.IsNullOrEmpty(item.Reason)) { stock.Memo = item.Reason; } if (!string.IsNullOrEmpty(item.MatCode)) { var mat = _basematerrepository.GetSingle(p => p.Code == item.MatCode); stock.MatCode = item.MatCode; stock.MatId = mat != null ? mat.Id : long.Parse("0"); stock.MatName = mat != null ? mat.Name : ""; } if (!string.IsNullOrEmpty(item.HoldDuration)) { stock.HoldDuration = decimal.Parse(item.HoldDuration); } stock.EditTime = DateTime.Now; var flow = _mapper.Map(stock); flow.Memo = flow.Memo + "|执行改判" + item.State; flow.AddTime = DateTime.Now; flow.Id = IdFactory.NewId(); if (stock.InvStateCode == InvState.InvEcecState_OutGoing.ToString()) { feedback.ResStateCode = "E"; feedback.ResDesc = "出库中不允许改判"; res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode(); res.ResMsg = stock.InvBarCode + "出库中不允许改判"; return res; } //else if (stock.InvStateCode == InvState.InvEcecState_BuildUp.ToString()) //{ // feedback.ResStateCode = "E"; // feedback.ResDesc = "入库中不允许改判"; //} else { stocklist.Add(stock); } flow.Memo = flow.Memo + "|" + feedback.ResDesc; flowlist.Add(flow); } else { feedback.ResStateCode = "E"; feedback.ResDesc = "库存不存在"; } feedback.MatId = stock != null ? stock.MatId : 0; feedback.MatCode = stock != null ? stock.MatCode:""; feedback.MatName = ""; ; feedback.TolWQty = stock != null ? stock.TolWQty:0; feedback.NetWQty = stock != null ? stock.NetWQty:0; feedback.TareWQty = stock != null ? stock.TareWQty:0; feedback.WareCellCode = ""; feedbarlist.Add(feedback); } try { _db.BeginTran(); _billPushinforepository.InsertRange(feedbarlist); _billInvflow.InsertRange(flowlist); _billInvnowrepository.UpdateRange(stocklist); _db.CommitTran(); } catch (Exception ex) { _db.RollbackTran(); _logger.LogInformation("改判异常" + ex.ToString()); } //如果有出库途中的则需要在完成是下发回库任务(rcs/iwms) return res; } /// /// 分配货位 /// /// /// public SRes ApplyStockInLoc(ApplyStockInLocRequest reqEntity) { var res = ApplyStockInLocTemp(reqEntity); if (string.IsNullOrEmpty(res.ResData.CellNo)) { return res; } try { var task = _taskrepository.GetFirst(p => p.ID == reqEntity.TaskNum); var stock = _billInvnowrepository.GetFirst(p => p.ContGrpBarCode == task.BarCode && p.InvStateCode == InvState.InvEcecState_BuildUp.ToString()); _db.BeginTran(); //更新货位 _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = LocationState.LocationState_StockIn.GetHashCode(),ContGrpBarCode = "",ContGrpId = 0, EditTime = DateTime.Now }, p => p.Code == res.ResData.CellNo); //更新任务 //_wcstaskoldrepository.UpdateModelColumns(p => new WCS_TaskOld() { AddrTo = res.ResData.CellNo, EditTime = DateTime.Now }, // p => p.ID == reqEntity.TaskNum); //_taskrepository.UpdateModelColumns(p => new WCS_TaskInfo() { AddrTo = res.ResData.CellNo, EditTime = DateTime.Now }, // p => p.ID == reqEntity.TaskNum); _db.CommitTran(); } catch (Exception ex) { _db.RollbackTran(); _logger.LogInformation(ex.ToString()); } return res; } /// /// 分配货位 /// /// /// public SRes ApplyStockInLocTemp(ApplyStockInLocRequest reqEntity) { var result = new SRes() { ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode(), ResMsg = ResponseStatusCodeEnum.Sucess.GetDescription(), ResData = new ApplyStockInLocResponse() }; var wcstask =_wcstaskoldrepository.AsQueryable().SplitTable(tabs => tabs.Take(3)).Where(p => p.ID == reqEntity.TaskNum).First();; if (wcstask == null) { result.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode(); result.ResMsg = ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription(); return result; } if (wcstask.Type == TaskType.OutDepot) { result.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode(); result.ResMsg = "该任务是出库任务,不能分配货位;wms任务号" + wcstask.ID; return result; } if (!string.IsNullOrEmpty(wcstask.AddrTo) && wcstask.AddrTo != "srm") { result.ResData.TunnelNum = wcstask.Tunnel; result.ResData.CellNo = wcstask.AddrTo; result.ResData.Row = wcstask.AddrTo.Split('-')[0] != null ? int.Parse(wcstask.AddrTo.Split('-')[0]) : 0; result.ResData.Colomn = wcstask.AddrTo.Split('-')[1] != null ? int.Parse(wcstask.AddrTo.Split('-')[1]) : 0; result.ResData.Layer = wcstask.AddrTo.Split('-')[2] != null ? int.Parse(wcstask.AddrTo.Split('-')[2]) : 0; return result; } if (reqEntity.TunnelNum <= 0) { //var tunnel = GetTunnelList(new GetTunnelListRequest() { TaskNum = reqEntity.TaskNum }); //if (tunnel.ResCode == ResponseStatusCodeEnum.Sucess.GetHashCode() && tunnel.ResDataList.Any()) //{ // reqEntity.TunnelNum = int.Parse(tunnel.ResDataList.First()); //} result.ResCode = ResponseStatusCodeEnum.NotTunnelNum.GetHashCode(); result.ResMsg = ResponseStatusCodeEnum.NotTunnelNum.GetDescription(); return result; } var warehouse = _basewarehouserepository.GetFirst(p => p.Code == wcstask.WarehouseCode); if (warehouse == null) { result.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode(); result.ResMsg = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription(); return result; } //验证库存 var stock = _billInvnowrepository.GetFirst(p => p.HWBarCode == wcstask.BarCode && p.InvStateCode == InvState.InvEcecState_BuildUp.ToString()); if (stock == null) { result.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode(); result.ResMsg = ResponseStatusCodeEnum.StockNotExist.GetDescription(); return result; } if (reqEntity.TunnelNum <= 0) { result.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode(); result.ResMsg = "没有传巷道值"; return result; } return ApplyLoc(new ApplyLocRequest() { MaterialId = stock.MatId, MaterialCode = stock.MatCode, Size = stock.Size, TunnelNum = reqEntity.TunnelNum, WarehuoseId = warehouse.Id, IsMove = wcstask.Type == TaskType.TransferDepot }); } public SRes ApplyLoc(ApplyLocRequest reqEntity) { //int forbidrow = 12; var result = new SRes() { ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode(), ResMsg = ResponseStatusCodeEnum.Sucess.GetDescription(), ResData = new ApplyStockInLocResponse() }; //预留货位数量 var emptyLoc = _basewarecellrepository.GetList(p => p.IsStop == 0 && p.StateNum == LocationState.LocationState_Empty.GetHashCode() && p.TypeNum == LocationType.LocationType_StorageLocation.GetHashCode() && p.Tunnel == reqEntity.TunnelNum && p.WarehouseId == reqEntity.WarehuoseId && p.Size == reqEntity.Size //&& p.Row < forbidrow ); //判断是否移库 if (!reqEntity.IsMove && (emptyLoc == null || emptyLoc.Count < 10)) { result.ResCode = ResponseStatusCodeEnum.NotEnoughLocation.GetHashCode(); result.ResMsg = reqEntity.TunnelNum + "巷道" + ResponseStatusCodeEnum.NotEnoughLocation.GetDescription(); return result; } var loc1ist = _basewarecellrepository.Context.Queryable((loc1, loc2, inv) => new object[] { JoinType.Inner,loc1.Shelf == loc2.Shelf && loc1.Col == loc2.Col && loc1.Layer == loc2.Layer, JoinType.Inner,loc2.ContGrpBarCode == inv.ContGrpBarCode, }) .Where((loc1, loc2, inv) => loc1.IsStop == 0 && loc1.StateNum == LocationState.LocationState_Empty.GetHashCode() && loc1.TypeNum == LocationType.LocationType_StorageLocation.GetHashCode() && loc1.Tunnel == reqEntity.TunnelNum && loc1.WarehouseId == reqEntity.WarehuoseId && loc1.Size == reqEntity.Size && loc1.Depth == 1) .Where((loc1, loc2, inv) => loc2.IsStop == 0 && loc2.Depth == 2 && loc2.StateNum == LocationState.LocationState_Full.GetHashCode())// && loc1.Row< forbidrow && loc2.Row < forbidrow .Where((loc1, loc2, inv) => inv.InvStateCode == InvState.InvEcecState_In.ToString() && inv.BomMatId == 0)//BomMatId用于判断一深位出过的,此二深位先不入库 .Where((loc1, loc2, inv) => loc1.Tunnel == reqEntity.TunnelNum && loc2.Tunnel == reqEntity.TunnelNum) .Select((loc1, loc2, inv) => new hjstocktemp { Code=loc1.Code, Id= loc1.Id, Row= loc1.Row, Col= loc1.Col, Layer= loc1.Layer, Tunnel= loc1.Tunnel, ContGrpBarCode= loc2.ContGrpBarCode, Shelf= loc2.Shelf, MatCode=inv.MatCode, MatId=inv.MatId, }); if (loc1ist != null && loc1ist.ToList().Where(p => p.MatId == reqEntity.MaterialId).Any()) { //空轮优先放前面的列 var resloc = reqEntity.MaterialId == 1672229688912777216 ? loc1ist.ToList().Where(p => p.MatId == reqEntity.MaterialId).OrderBy(p => p.Col).ThenBy(p => p.Layer).ThenBy(p => p.Row).First() : (loc1ist.ToList().Where(p=>p.Col > 1).Where(p => p.MatId == reqEntity.MaterialId).Any() ? loc1ist.ToList().Where(p => p.Col > 1).Where(p => p.MatId == reqEntity.MaterialId).OrderBy(p => p.Layer).ThenBy(p => p.Col).ThenBy(p => p.Row).First() : loc1ist.ToList().Where(p => p.MatId == reqEntity.MaterialId).OrderBy(p => p.Layer).ThenBy(p => p.Col).ThenBy(p => p.Row).First()); result.ResData.TunnelNum = resloc.Tunnel.ToString(); result.ResData.CellNo = resloc.Code; result.ResData.Row = resloc.Row; result.ResData.Colomn = resloc.Col; result.ResData.Layer = resloc.Layer; return result; } //再找二深位空的 if (emptyLoc.Where(p => p.Depth == 2).Any()) { //一深位必须空 var templist = from loc1 in _basewarecellrepository.GetList(p => p.Depth == 1 && p.StateNum == LocationState.LocationState_Empty.GetHashCode()) join loc2 in emptyLoc.Where(p => p.Depth == 2) on new { loc1.Col, loc1.Layer, loc1.Shelf } equals new { loc2.Col, loc2.Layer, loc2.Shelf } //where loc1.Row < forbidrow && loc2.Row < forbidrow select loc2; if (templist == null || !templist.Any()) { //if (reqEntity.TunnelNum == 3) //{ // //特殊处理找11行的空位置 // var temp3 = _basewarecellrepository.GetList(p => p.Depth == 1 && p.StateNum == LocationState.LocationState_Empty.GetHashCode() && p.Row == 11 && p.Shelf == "3L" && p.IsStop == 0); // if (temp3.Any()) // { // var resloc1 = reqEntity.MaterialId == 1672229688912777216 ? temp3.OrderBy(p => p.Col).ThenBy(p => p.Layer).ThenBy(p => p.Row).First() : // (temp3.Where(p => p.Col > 1).Any() ? temp3.Where(p => p.Col > 1).OrderBy(p => p.Layer).ThenBy(p => p.Col).ThenBy(p => p.Row).First() : temp3.OrderBy(p => p.Layer).ThenBy(p => p.Col).ThenBy(p => p.Row).First()); // result.ResData.TunnelNum = resloc1.Tunnel.ToString(); // result.ResData.CellNo = resloc1.Code; // result.ResData.Row = resloc1.Row; // result.ResData.Colomn = resloc1.Col; // result.ResData.Layer = resloc1.Layer; // return result; // } // else // { // result.ResCode = ResponseStatusCodeEnum.NotEnoughLocation.GetHashCode(); // result.ResMsg = ResponseStatusCodeEnum.NotEnoughLocation.GetDescription(); // return result; // } //} //else //{ //result.ResCode = ResponseStatusCodeEnum.NotEnoughLocation.GetHashCode(); //result.ResMsg = ResponseStatusCodeEnum.NotEnoughLocation.GetDescription(); //return result; //} } else { //空轮优先放前列 var resloc = reqEntity.MaterialId == 1672229688912777216 ? templist.Where(p => p.Depth == 2).OrderBy(p => p.Col).ThenBy(p => p.Layer).ThenBy(p => p.Row).First() : (templist.Where(p => p.Depth == 2 && p.Col > 1).Any() ? templist.Where(p => p.Depth == 2 && p.Col > 1).OrderBy(p => p.Layer).ThenBy(p => p.Col).ThenBy(p => p.Row).First() : templist.Where(p => p.Depth == 2).OrderBy(p => p.Layer).ThenBy(p => p.Col).ThenBy(p => p.Row).First()); result.ResData.TunnelNum = resloc.Tunnel.ToString(); result.ResData.CellNo = resloc.Code; result.ResData.Row = resloc.Row; result.ResData.Colomn = resloc.Col; result.ResData.Layer = resloc.Layer; return result; } } //if (reqEntity.TunnelNum == 3) //{ // //特殊处理找11行的空位置 // var temp3 = _basewarecellrepository.GetList(p => p.Depth == 1 && p.StateNum == LocationState.LocationState_Empty.GetHashCode() && p.Row == 11 && p.Shelf == "3L" && p.IsStop == 0); // if (temp3.Any()) // { // var resloc1 = reqEntity.MaterialId == 1672229688912777216 ? temp3.OrderBy(p => p.Col).ThenBy(p => p.Layer).ThenBy(p => p.Row).First() : // (temp3.Where(p => p.Col > 1).Any() ? temp3.Where(p => p.Col > 1).OrderBy(p => p.Layer).ThenBy(p => p.Col).ThenBy(p => p.Row).First() : temp3.OrderBy(p => p.Layer).ThenBy(p => p.Col).ThenBy(p => p.Row).First()); // result.ResData.TunnelNum = resloc1.Tunnel.ToString(); // result.ResData.CellNo = resloc1.Code; // result.ResData.Row = resloc1.Row; // result.ResData.Colomn = resloc1.Col; // result.ResData.Layer = resloc1.Layer; // return result; // } //} if (loc1ist == null || !loc1ist.Any()) { if (!reqEntity.IsMove) { // loc1ist = _basewarecellrepository.Context.Queryable((loc1, loc2, inv) => new object[] { // JoinType.Inner,loc1.Shelf == loc2.Shelf && loc1.Col == loc2.Col && loc1.Layer == loc2.Layer, // JoinType.Inner,loc2.ContGrpBarCode == inv.ContGrpBarCode, // }) //.Where((loc1, loc2, inv) => loc1.IsStop == 0 && loc1.StateNum == LocationState.LocationState_Empty.GetHashCode() // && loc1.TypeNum == LocationType.LocationType_StorageLocation.GetHashCode() // && loc1.Tunnel == reqEntity.TunnelNum // && loc1.WarehouseId == reqEntity.WarehuoseId // && loc1.Size == reqEntity.Size && loc1.Depth == 1) //.Where((loc1, loc2, inv) => loc2.IsStop == 0 && loc2.Depth == 2 && loc2.StateNum == LocationState.LocationState_Full.GetHashCode() && loc1.Row < forbidrow && loc2.Row < forbidrow) //.Where((loc1, loc2, inv) => inv.InvStateCode == InvState.InvEcecState_In.ToString() )//BomMatId条件去掉 //.Where((loc1, loc2, inv) => loc1.Tunnel == reqEntity.TunnelNum && loc2.Tunnel == reqEntity.TunnelNum) // .Select((loc1, loc2, inv) => new hjstocktemp // { // Code = loc1.Code, // Id = loc1.Id, // Row = loc1.Row, // Col = loc1.Col, // Layer = loc1.Layer, // Tunnel = loc1.Tunnel, // ContGrpBarCode = loc2.ContGrpBarCode, // Shelf = loc2.Shelf, // MatCode = inv.MatCode, // MatId = inv.MatId, // }); //if (loc1ist == null || !loc1ist.Any()) //{ // result.ResCode = ResponseStatusCodeEnum.NotEnoughLocation.GetHashCode(); // result.ResMsg = ResponseStatusCodeEnum.NotEnoughLocation.GetDescription(); // return result; //} } else //移库的可以选择二深有出库任务,一深为空的的货位 { loc1ist = _basewarecellrepository.Context.Queryable((loc1, loc2, inv) => new object[] { JoinType.Inner,loc1.Shelf == loc2.Shelf && loc1.Col == loc2.Col && loc1.Layer == loc2.Layer, JoinType.Inner,loc2.ContGrpBarCode == inv.ContGrpBarCode, }) .Where((loc1, loc2, inv) => loc1.IsStop == 0 && loc1.StateNum == LocationState.LocationState_Empty.GetHashCode() //&& loc1.Row < forbidrow && loc2.Row < forbidrow && loc1.TypeNum == LocationType.LocationType_StorageLocation.GetHashCode() && loc1.Tunnel == reqEntity.TunnelNum && loc1.WarehouseId == reqEntity.WarehuoseId && loc1.Size == reqEntity.Size && loc1.Depth == 1) .Where((loc1, loc2, inv) => loc2.IsStop == 0 && loc2.Depth == 2 && (loc2.StateNum == LocationState.LocationState_Full.GetHashCode()|| loc2.StateNum == LocationState.LocationState_StockOut.GetHashCode())) .Where((loc1, loc2, inv) => inv.InvStateCode == InvState.InvEcecState_In.ToString()) .Where((loc1, loc2, inv) => loc1.Tunnel == reqEntity.TunnelNum && loc2.Tunnel == reqEntity.TunnelNum) .Select((loc1, loc2, inv) => new hjstocktemp { Code = loc1.Code, Id = loc1.Id, Row = loc1.Row, Col = loc1.Col, Layer = loc1.Layer, Tunnel = loc1.Tunnel, ContGrpBarCode = loc2.ContGrpBarCode, Shelf = loc2.Shelf, MatCode = inv.MatCode, MatId = inv.MatId, }); if (loc1ist == null || !loc1ist.Any()) { result.ResCode = ResponseStatusCodeEnum.NotEnoughLocation.GetHashCode(); result.ResMsg = ResponseStatusCodeEnum.NotEnoughLocation.GetDescription(); return result; } } } //var b = loc1ist.Select(p => p.Id).ToList(); //var a = _basewarecellrepository.AsQueryable().Where(p => b.Contains(p.Id)).ToList(); if (!reqEntity.IsMove) { //获取一深空的货位 var loc1ist1 = from loct1 in _basewarecellrepository.GetList(loc1 => loc1.IsStop == 0 && loc1.StateNum == LocationState.LocationState_Empty.GetHashCode() && loc1.TypeNum == LocationType.LocationType_StorageLocation.GetHashCode() && loc1.Tunnel == reqEntity.TunnelNum && loc1.WarehouseId == reqEntity.WarehuoseId && loc1.Size == reqEntity.Size && loc1.Depth == 1).ToList() join loct2 in _basewarecellrepository.GetList(loc2 => loc2.IsStop == 0 && loc2.StateNum == LocationState.LocationState_Full.GetHashCode() && loc2.TypeNum == LocationType.LocationType_StorageLocation.GetHashCode() && loc2.Tunnel == reqEntity.TunnelNum && loc2.WarehouseId == reqEntity.WarehuoseId && loc2.Size == reqEntity.Size && loc2.Depth == 2).ToList() on new { loct1.Shelf, loct1.Col, loct1.Layer } equals new { loct2.Shelf, loct2.Col, loct2.Layer }// into temp //where loct1.Row < forbidrow && loct2.Row < forbidrow select loct1; var loc = loc1ist1.ToList().First(); result.ResData.TunnelNum = loc.Tunnel.ToString(); result.ResData.CellNo = loc.Code; result.ResData.Row = loc.Row; result.ResData.Colomn = loc.Col; result.ResData.Layer = loc.Layer; } else { //获取一深空的货位 var loc1ist1 = from loct1 in _basewarecellrepository.GetList(loc1 => loc1.IsStop == 0 && loc1.StateNum == LocationState.LocationState_Empty.GetHashCode() && loc1.TypeNum == LocationType.LocationType_StorageLocation.GetHashCode() && loc1.Tunnel == reqEntity.TunnelNum && loc1.WarehouseId == reqEntity.WarehuoseId && loc1.Size == reqEntity.Size && loc1.Depth == 1).ToList() join loct2 in _basewarecellrepository.GetList(loc2 => loc2.IsStop == 0 && ( loc2.StateNum == LocationState.LocationState_Full.GetHashCode() || loc2.StateNum == LocationState.LocationState_StockOut.GetHashCode()) && loc2.TypeNum == LocationType.LocationType_StorageLocation.GetHashCode() && loc2.Tunnel == reqEntity.TunnelNum && loc2.WarehouseId == reqEntity.WarehuoseId && loc2.Size == reqEntity.Size && loc2.Depth == 2).ToList() on new { loct1.Shelf, loct1.Col, loct1.Layer } equals new { loct2.Shelf, loct2.Col, loct2.Layer }// into temp //where loct1.Row < forbidrow && loct2.Row < forbidrow orderby loct2.StateNum select loct1; var loc = loc1ist1.ToList().OrderBy(p=>p.Layer).ThenBy(p=>p.Col).ThenBy(p=>p.Row).First(); result.ResData.TunnelNum = loc.Tunnel.ToString(); result.ResData.CellNo = loc.Code; result.ResData.Row = loc.Row; result.ResData.Colomn = loc.Col; result.ResData.Layer = loc.Layer; } return result; } /// /// 完成任务 /// /// /// public SRes CompleteTask(CompleteTaskRequest reqDto) { var result = new SRes() { ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode(), ResMsg = ResponseStatusCodeEnum.Sucess.GetDescription(), ResData = reqDto.TaskNum }; //var task = _wcstaskoldrepository.AsQueryable().SplitTable(tabs => tabs.Take(3)).Where(p => p.ID == reqDto.TaskNum).First(); var task = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.ID == reqDto.TaskNum).First(); if (task == null) { result.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode(); result.ResMsg = reqDto.TaskNum + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription(); return result; } if (task.Type == TaskType.EnterDepot) { //库存,货位 try { var warehouse = _basewarehouserepository.GetSingle(p => p.Code == task.WarehouseCode); var stock = _billInvnowrepository.GetFirst(p => p.ContGrpBarCode == task.BarCode && p.InvStateCode == InvState.InvEcecState_BuildUp.ToString()); if (stock == null) { result.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode(); result.ResMsg = task.BarCode + "没有已组盘的信息"; return result; } if (task.TaskGroupKey != "1" && (task.AddrTo != "1012" && task.AddrTo != "1014" && task.AddrTo != "1016" && task.AddrTo != "1118") && task.ProdLine != 1)//==1是二楼空轮子直接搬运到一楼的任务/一楼满轮直接搬运至二楼任务 { if (string.IsNullOrEmpty(task.AddrTo) || task.AddrTo == "srm") { task.AddrTo = _taskrepository.GetSingle(p => p.ID == reqDto.TaskNum).AddrTo; } if (task.AddrTo != "1012" && task.AddrTo != "1014" && task.AddrTo != "1016" && task.AddrTo != "1118") { var cell = _basewarecellrepository.GetSingle(p => p.Code.Contains(task.AddrTo)); if (cell.StateNum != LocationState.LocationState_StockIn.GetHashCode()) { result.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode(); result.ResMsg = cell.Code + "货位状态不是入库中,不能完成任务"; return result; } } } _db.BeginTran(); if (task.TaskGroupKey == "1" || task.AddrTo == "1012" || task.AddrTo == "1014" || task.AddrTo == "1016" && task.AddrTo != "1118")//==1是二楼空轮子直接搬运到一楼的任务 { var flow = _mapper.Map(stock); flow.Id = IdFactory.NewId(); flow.InvStateCode = InvState.InvEcecState_Out.ToString(); flow.AddTime = DateTime.Now; flow.Memo = "二楼直接搬运空轮至一楼任务完成"; flow.Floor = task.Floor; _billInvflow.Insert(flow); _billInvnowrepository.Delete(p => stock.Id == p.Id); _billInvinitrepository.Delete(p => p.ContGrpBarCode == task.BarCode); _db.CommitTran(); } else if (task.ProdLine == 1) { var flow = _mapper.Map(stock); flow.Id = IdFactory.NewId(); flow.InvStateCode = InvState.InvEcecState_Out.ToString(); flow.AddTime = DateTime.Now; flow.Memo = "一楼直接搬运满轮至二楼任务完成"; flow.Floor = task.Floor; _billInvflow.Insert(flow); string pushtype = FackbeekType.InterfaceType_HJ_1F_StockIn.ToString(); //回调数据 var push = new BillPushinfo { DocsNo = stock.ExecDocsNo, TypeCode = pushtype, RFIDBarCode = stock.ContGrpBarCode, HWBarCode = stock.ContGrpBarCode, CLBarCode = stock.CLBarCode, WarehouseId = warehouse.Id, WarehouseCode = warehouse.Code, WareCellId = 0, WareCellCode = task.AddrTo, MatId = stock.MatId, MatCode = stock.MatCode, MatName = stock.MatName, TolWQty = stock.TolWQty, NetWQty = stock.NetWQty, TareWQty = stock.TareWQty, ReqNo = Guid.NewGuid().ToString(), BoilerNo = "1" }; _billPushinforepository.Insert(push); _billInvnowrepository.Delete(p => stock.Id == p.Id); _billInvinitrepository.Delete(p => p.ContGrpBarCode == task.BarCode); _db.CommitTran(); } else { int row = int.Parse(task.AddrTo.Split('-')[0]); int col = int.Parse(task.AddrTo.Split('-')[1]); int layer = int.Parse(task.AddrTo.Split('-')[2]); //更新库存 _billInvnowrepository.UpdateModelColumns(p => new BillInvnow() { InvStateCode = InvState.InvEcecState_In.ToString(), PutRow = row, PutCol = col, PutLayer = layer, OneInTime = DateTime.Now, EditTime = DateTime.Now }, p => p.ContGrpBarCode == task.BarCode && p.InvStateCode == InvState.InvEcecState_BuildUp.ToString()); //更新货位 _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = LocationState.LocationState_Full.GetHashCode(), ContGrpBarCode = stock.ContGrpBarCode, ContGrpId = stock.ContGrpId, EditTime = DateTime.Now }, p => p.Code.Contains(task.AddrTo) && p.StateNum == LocationState.LocationState_StockIn.GetHashCode()); var stocklist = _billInvnowrepository.GetList(p => p.ContGrpBarCode == task.BarCode && p.InvStateCode == InvState.InvEcecState_In.ToString()); var flow = _mapper.Map>(stocklist); foreach (var item in flow) { item.Id = IdFactory.NewId(); item.AddTime = DateTime.Now; item.Memo = "入库任务完成"; item.Floor = task.Floor; } _billInvflow.InsertRange(flow); //单据 var list = new List(); string pushtype = FackbeekType.InterfaceType_HJ_1F_StockIn.ToString(); if (stock.IsBack) { pushtype = FackbeekType.InterfaceType_HJ_2F_BackStockIn.ToString(); } else if (stock.IsSurplus) { pushtype = FackbeekType.InterfaceType_HJ_2F_LeftStockIn.ToString(); } //else if() //回调数据 foreach (var item in stocklist) { list.Add(new BillPushinfo { DocsNo = stock.ExecDocsNo, TypeCode = pushtype, RFIDBarCode = stock.ContGrpBarCode, HWBarCode = stock.ContGrpBarCode, CLBarCode = item.CLBarCode, WarehouseId = warehouse.Id, WarehouseCode = warehouse.Code, WareCellId = 0, WareCellCode = task.AddrTo, MatId = item.MatId, MatCode = item.MatCode, MatName = item.MatName, TolWQty = item.TolWQty, NetWQty = item.NetWQty, TareWQty = item.TareWQty, ReqNo = Guid.NewGuid().ToString() }); } if (stock.ContGrpType == ContGrpType.Material.GetHashCode()) { _billPushinforepository.InsertRange(list); } _db.CommitTran(); } } catch (Exception ex) { _db.RollbackTran(); result.ResCode = ResponseStatusCodeEnum.InnerServerErr.GetHashCode(); result.ResMsg = task.ID + "完成任务异常"; _logger.LogInformation("完成任务异常" + ex.ToString()); } } else if (task.Type == TaskType.OutDepot) { //库存删除 var stocklist = _billInvnowrepository.GetList(p => p.ContGrpBarCode == task.BarCode && p.InvStateCode == InvState.InvEcecState_OutGoing.ToString()); if (stocklist == null || !stocklist.Any()) { result.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode(); result.ResMsg = reqDto.TaskNum + ResponseStatusCodeEnum.StockNotExist.GetDescription(); return result; } var flowlist = _mapper.Map>(stocklist); foreach (var item in flowlist) { item.Id = IdFactory.NewId(); item.InvStateCode = InvState.InvEcecState_Out.ToString(); item.AddTime = DateTime.Now; item.Memo = "出库任务完成"; item.Floor = task.Floor; } try { _db.BeginTran(); _billInvnowrepository.Delete(p => stocklist.Select(p => p.Id).ToList().Contains(p.Id)); _billInvinitrepository.Delete(p => p.ContGrpBarCode == task.BarCode); _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = LocationState.LocationState_Empty.GetHashCode(), ContGrpBarCode = "", ContGrpId = 0, EditTime = DateTime.Now }, p => p.StateNum == LocationState.LocationState_StockOut.GetHashCode() && p.ContGrpId == flowlist.First().ContGrpId && p.Code.Contains(task.AddrFrom)); _billInvflow.InsertRange(flowlist); var list = new List(); //回调数据 foreach (var item in stocklist) { list.Add(new BillPushinfo { DocsNo = "", TypeCode = FackbeekType.InterfaceType_HJ_StockOut.ToString(), RFIDBarCode = item.ContGrpBarCode, HWBarCode = item.ContGrpBarCode, CLBarCode = item.CLBarCode, WarehouseId = 0, WarehouseCode = "", WareCellId = 0, WareCellCode = task.AddrFrom, MatId = item.MatId, MatCode = item.MatCode, MatName = item.MatName, TolWQty = item.TolWQty, NetWQty = item.NetWQty, TareWQty = item.TareWQty, ReqNo = Guid.NewGuid().ToString(), Memo = task.Floor.ToString() }); } if (stocklist.First().ContGrpType == ContGrpType.Material.GetHashCode()) { _billPushinforepository.InsertRange(list); } _db.CommitTran(); } catch (Exception ex) { _db.RollbackTran(); _logger.LogInformation(ex.ToString()); result.ResCode = ResponseStatusCodeEnum.InnerServerErr.GetHashCode(); result.ResMsg = task.ID + "完成任务异常"; } } else if (task.Type == TaskType.EmptyInit) { try { var warehouse = _basewarehouserepository.GetSingle(p => p.Code == task.WarehouseCode); var stock = _billInvnowrepository.GetFirst(p => p.ContGrpBarCode == task.BarCode && p.InvStateCode == InvState.InvEcecState_BuildUp.ToString()); if (stock == null) { result.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode(); result.ResMsg = task.BarCode + "没有已组盘的信息"; return result; } _db.BeginTran(); int row = int.Parse(task.AddrTo.Split('-')[0]); int col = int.Parse(task.AddrTo.Split('-')[1]); int layer = int.Parse(task.AddrTo.Split('-')[2]); //更新库存 _billInvnowrepository.UpdateModelColumns(p => new BillInvnow() { InvStateCode = InvState.InvEcecState_In.ToString(), PutRow = row, PutCol = col, PutLayer = layer, OneInTime = DateTime.Now, EditTime = DateTime.Now }, p => p.ContGrpBarCode == task.BarCode && p.InvStateCode == InvState.InvEcecState_BuildUp.ToString()); //更新货位 _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = LocationState.LocationState_Full.GetHashCode(), ContGrpBarCode = stock.ContGrpBarCode, ContGrpId = stock.ContGrpId, EditTime = DateTime.Now }, p => p.Code.Contains(task.AddrTo)); //更新任务 //_wcstaskoldrepository.UpdateModelColumns(p => new WCS_TaskOld() { Status = TaskStatus.Finish, EditTime = DateTime.Now }, // p => p.ID == reqDto.TaskNum); //_taskrepository.Delete(p => p.ID == reqDto.TaskNum); var stocklist = _billInvnowrepository.GetList(p => p.ContGrpBarCode == task.BarCode && p.InvStateCode == InvState.InvEcecState_In.ToString()); foreach (var item in stocklist) { item.Id = IdFactory.NewId(); item.AddTime = DateTime.Now; } _billInvflow.InsertRange(_mapper.Map>(stocklist)); //单据 var list = new List(); //回调数据 foreach (var item in stocklist) { list.Add(new BillPushinfo { DocsNo = stock.ExecDocsNo, TypeCode = FackbeekType.InterfaceType_HJ_1F_StockIn.ToString(), RFIDBarCode = stock.ContGrpBarCode, HWBarCode = stock.ContGrpBarCode, CLBarCode = item.CLBarCode, WarehouseId = warehouse.Id, WarehouseCode = warehouse.Code, WareCellId = 0, WareCellCode = task.AddrTo, MatId = item.MatId, MatCode = item.MatCode, MatName = item.MatName, TolWQty = item.TolWQty, NetWQty = item.NetWQty, TareWQty = item.TareWQty, ReqNo = Guid.NewGuid().ToString() }); } if (stock.ContGrpType == ContGrpType.Material.GetHashCode()) { _billPushinforepository.InsertRange(list); } _db.CommitTran(); } catch (Exception ex) { _db.RollbackTran(); result.ResCode = ResponseStatusCodeEnum.InnerServerErr.GetHashCode(); result.ResMsg = task.ID + "完成任务异常"; _logger.LogInformation("完成任务异常" + ex.ToString()); } } else if (task.Type == TaskType.TransferDepot) { var fromcell = _basewarecellrepository.GetFirst(p => p.Code == task.AddrFrom); var grcontid = fromcell.ContGrpId; var grcontcode = fromcell.ContGrpBarCode; var fromcellno = fromcell.Code; var tocellno = task.AddrTo; try { _db.BeginTran(); _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = LocationState.LocationState_Empty.GetHashCode(), ContGrpBarCode = "", ContGrpId = 0, EditTime = DateTime.Now }, p => p.Code.Contains(fromcellno)); _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = LocationState.LocationState_Full.GetHashCode(), ContGrpBarCode = grcontcode, ContGrpId = grcontid, EditTime = DateTime.Now }, p => p.Code.Contains(tocellno)); int row = int.Parse(tocellno.Split('-')[0]); int col = int.Parse(tocellno.Split('-')[1]); int layer = int.Parse(tocellno.Split('-')[2]); _billInvnowrepository.UpdateModelColumns(p => new BillInvnow() { PutRow = row, PutCol = col, PutLayer = layer }, p => p.ContGrpId == grcontid && p.InvStateCode == InvState.InvEcecState_In.ToString()); var stock = _billInvnowrepository.GetFirst(p => p.ContGrpId == grcontid && p.ContGrpBarCode == grcontcode && p.InvStateCode == InvState.InvEcecState_In.ToString()); //流水表 var flow = _mapper.Map(stock); flow.Id = IdFactory.NewId(); flow.AddTime = DateTime.Now; flow.Memo = grcontcode + "移库(" + fromcellno + "至" + tocellno + ")"; _billInvflow.Insert(flow); //推送表 _db.CommitTran(); } catch (Exception ex) { _db.RollbackTran(); result.ResCode = ResponseStatusCodeEnum.InnerServerErr.GetHashCode(); result.ResMsg = task.ID + "完成任务异常"; _logger.LogInformation("完成任务异常" + ex.ToString()); } } return result; } public SRes SrmPickOutCompleted(SrmPickOutCompletedRequest reqDto) { var result = new SRes() { ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode(), ResMsg = ResponseStatusCodeEnum.Sucess.GetDescription(), ResData = reqDto.TaskNum }; //var wcstask = _wcstaskoldrepository.AsQueryable().With(SqlWith.NoLock).SplitTable(tabs => tabs.Take(3)).Where(p => p.ID == reqDto.TaskNum).First(); ; var wcstask = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.ID == reqDto.TaskNum && p.Status < TaskStatus.Finish).First(); if (wcstask == null || wcstask.ID <= 0) { result.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode(); result.ResMsg = reqDto.TaskNum + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription(); return result; } if (wcstask.Type != TaskType.OutDepot) { result.ResCode = ResponseStatusCodeEnum.OnlyStockOutAvil.GetHashCode(); result.ResMsg = reqDto.TaskNum + ResponseStatusCodeEnum.OnlyStockOutAvil.GetDescription(); return result; } if (wcstask.Status >= TaskStatus.Finish) { result.ResCode = ResponseStatusCodeEnum.StateNotUpdate.GetHashCode(); result.ResMsg = reqDto.TaskNum + ResponseStatusCodeEnum.StateNotUpdate.GetDescription(); return result; } try { _db.BeginTran(); //更新库存 _billInvnowrepository.UpdateModelColumns(p => new BillInvnow() { PutRow = 0, PutCol = 0, PutLayer = 0 }, p => p.InvStateCode == InvState.InvEcecState_OutGoing.ToString() && p.ContGrpBarCode == wcstask.BarCode); var stocklist = _billInvnowrepository.GetList(p => p.ContGrpBarCode == wcstask.BarCode && p.InvStateCode == InvState.InvEcecState_OutGoing.ToString()); if (stocklist == null || !stocklist.Any()) { result.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode(); result.ResMsg = reqDto.TaskNum + ResponseStatusCodeEnum.StockNotExist.GetDescription(); return result; } var flowlist = _mapper.Map>(stocklist); foreach (var item in flowlist) { item.Id = IdFactory.NewId(); item.AddTime = DateTime.Now; item.Memo = "堆垛机出库放货完成"; } //货位 _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = LocationState.LocationState_Empty.GetHashCode(), ContGrpBarCode = "", ContGrpId = 0, EditTime = DateTime.Now }, p => p.ContGrpBarCode == wcstask.BarCode && p.Code.Contains(wcstask.AddrFrom)); //满料,出的如果是一深位,二深位暂时先不分,优先出掉 if (stocklist.First().ContGrpType == 1 && wcstask.AddrFrom.Split('-')[4] == "01") { var col = int.Parse(wcstask.AddrFrom.Split('-')[1]) ; var layer = int.Parse(wcstask.AddrFrom.Split('-')[2]); var shelf = wcstask.AddrFrom.Split('-')[3]; var loc2 = _basewarecellrepository.GetFirst(p => p.Col == col && p.Layer == layer && p.Shelf == shelf && p.Depth == 2); _billInvnowrepository.UpdateModelColumns(p => new BillInvnow() { BomMatId = 1, EditTime = DateTime.Now }, p => p.ContGrpBarCode == loc2.ContGrpBarCode && p.ContGrpId == loc2.ContGrpId); } _billInvflow.InsertRange(flowlist); _db.CommitTran(); } catch (Exception ex) { _db.RollbackTran(); _logger.LogInformation(ex.ToString()); result.ResCode = ResponseStatusCodeEnum.InnerServerErr.GetHashCode(); result.ResMsg = wcstask.ID + "堆垛机出库放货完成异常"; } return result; } public SRes GetTunnelList(GetTunnelListRequest request) { var result = new SRes() { ResDataList = new List() }; return result; } /// /// 库存改判反馈接口 /// /// /// public StockChangeFeedBackResponse StockChangeFeedBack(StockChangeFeedBackRequest reqDto) { var res = new StockChangeFeedBackResponse(); return res; } /// /// 特殊出库领料申请接口 /// /// /// public SpecialPickMaterApplyResponse SpecialPickMaterApply(SpecialPickMaterApplyRequest reqDto) { var res = new SpecialPickMaterApplyResponse(); var warehosue = _basewarehouserepository.GetSingle(p => p.Code == reqDto.WareCode); if (warehosue == null) { res.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription(); return res; } //物料编码验证 var mater = _materrepository.GetSingle(p => p.Code == reqDto.MatCode); if (mater == null) { res.ResCode = ResponseStatusCodeEnum.MaterInfoNotExist.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.MaterInfoNotExist.GetDescription(); return res; } var docCode = GenerateBillCode("HJ04").ResData; var doc = _docrepository.GetFirst(p => p.DocNo == docCode); if (doc == null) { doc = new hjBillDocument(); doc.WarehouseId = warehosue.Id; //保存单据信息 doc.ReqNo = reqDto.MatBarCode; doc.DocNo = docCode;//生成单据号 doc.TypeCode = DocType.DocType_HJ_SpecialStockOut.ToString(); doc.StateCode = DocState.DocState_Create.ToString(); doc.ContentJson = JsonConvert.SerializeObject(reqDto); doc.DownQty = 1; var docinsert = _docrepository.Insert(doc); if (!docinsert) { res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.ErrParam.GetDescription(); return res; } } //出库逻辑 //下发wcs任务 return res; } /// /// 特殊出库领料反馈接口 /// /// /// public SpecialPickMaterFeedBackResponse SpecialPickMaterFeedBack(SpecialPickMaterFeedBackRequest reqDto) { var res = new SpecialPickMaterFeedBackResponse(); return res; } /// /// 移库货位上报MES接口 /// /// /// public MoveStockFeedBackResponse MoveStockFeedBack(MoveStockFeedBackRequest reqDto) { var res = new MoveStockFeedBackResponse(); return res; } /// /// 实时库存查询接口 /// /// /// public GetCurStockListResponse GetCurStockList(GetCurStockListRequest reqDto) { var res = new GetCurStockListResponse() { ResData = new List() { } }; int totalCount = 0; var list = _billInvnowrepository.Context.Queryable() .Where(p => p.InvStateCode == InvState.InvEcecState_In.ToString()) .WhereIF(!string.IsNullOrEmpty(reqDto.MatCode), p => p.MatCode.Contains(reqDto.MatCode)) .WhereIF(!string.IsNullOrEmpty(reqDto.MatName), p => p.MatName.Contains(reqDto.MatName)) .ToPageList(reqDto.PageIndex, reqDto.PageSize, ref totalCount) .Select(p => new ResDataItem { MatCode = p.MatCode, MatName = p.MatName, MatBarCode = p.CLBarCode, Describe = "", LocCell = p.PutCol.ToString(), LocLayer = p.PutLayer.ToString(), LocRow = p.PutRow.ToString(), LocCode = p.PutRow.ToString() + p.PutCol.ToString()+ p.PutLayer.ToString(), RFID = p.RFIDBarCode, UpdatedTime = p.EditTime, TolWQty = p.TolWQty, NetWQty = p.NetWQty, TareWQty = p.TareWQty } ); res.TotalCount = totalCount; res.ResData = list.ToList(); return res; } /// /// 条码信息查询接口 /// /// /// public GetBarCodeInfoResponse GetBarCodeInfo(GetBarCodeInfoRequest reqDto) { var res = new GetBarCodeInfoResponse(); return res; } #region 定时任务 /// /// 添加job /// /// /// public string AddJob(AddJobRequest request) { var res = new SRes(); if (_sysJobrepository.Count(p => p.Code == request.Code) >= 1) { res.ResCode = 1002; res.ResMsg = "当前任务编码已存在"; return res.ToCamelCaseString(); } var re = _sysJobrepository.Insert(_mapper.Map(request)); if (re) { foreach (var item in request.JobList) { item.Id = IdFactory.NewId(); var api = _mapper.Map(item); var job = _sysJobrepository.GetSingle(p => p.Code == request.Code); api.JobId = job.Id; _sysJobApirepository.Insert(api); } } return res.ToCamelCaseString(); } /// /// 修改job /// /// /// public string UpdateJobEntity(AddJobRequest request) { var res = new SRes(); if (_sysJobrepository.UpdateEntity(_mapper.Map(request))) { foreach (var item in request.JobList) { _sysJobApirepository.UpdateEntity(_mapper.Map(item)); } } return res.ToCamelCaseString(); } public AddJobRequest GetSysJobById(long id) { var job = _sysJobrepository.GetById(id); var jobapi = _sysJobApirepository.GetList(p => p.JobId == job.Id); var api = _mapper.Map>(jobapi); AddJobRequest list = new AddJobRequest(); if (job != null && jobapi.Count >= 0) { list.Id = job.Id; list.Code = job.Code; list.JobGroupName = job.JobGroupName; list.TriggerGroupName = job.TriggerGroupName; list.CronExpression = job.CronExpression; list.JobType = job.JobType; list.JobDescription = job.JobDescription; list.TriggerDescription = job.TriggerDescription; list.Name = job.Name; list.TriggerName = job.TriggerName; list.JobList = api; } return list; } /// /// 获取job调用接口明细 /// /// /// public List GetSysApiDetail(long id) { var list = _sysJobApirepository.GetList(p => p.JobId == id); return list; } #endregion /// /// 更新任务进程 /// /// /// public SRes WcsTaskCallBack(WcsTaskCallBackRequest reqEntity) { var result = new SRes(); if (string.IsNullOrEmpty(reqEntity.TaskNum)) { result.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode(); result.ResMsg = "任务号不能为空"; return result; } result.ResData = int.Parse(reqEntity.TaskNum); try { var wcstask = _taskrepository.GetFirst(p=>p.ID == int.Parse(reqEntity.TaskNum)); if (wcstask == null) { result.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode(); result.ResMsg = ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription(); return result; } var updatesign = true; if (reqEntity.TaskStatus <= 98 && reqEntity.TaskStatus >= 2) { int taststate = wcstask.Status.GetHashCode(); string curpoint = wcstask.LastInteractionPoint; string nextpoint = wcstask.AddrNext; bool isUpdate = false; if (wcstask.Status <= TaskStatus.WaitingToExecute) { taststate = TaskStatus.ConveyorExecution.GetHashCode(); isUpdate = true; } if (!string.IsNullOrEmpty(reqEntity.CurPosition) && wcstask.LastInteractionPoint != reqEntity.CurPosition) { curpoint = reqEntity.CurPosition; isUpdate = true; } if (!string.IsNullOrEmpty(reqEntity.NextPosition) && wcstask.LastInteractionPoint != reqEntity.NextPosition) { nextpoint = reqEntity.NextPosition; isUpdate = true; } if (isUpdate) { updatesign = _taskrepository.UpdateModelColumns(p => new WCS_TaskInfo() { Status = TaskStatus.ConveyorExecution, LastInteractionPoint = curpoint, AddrNext = nextpoint }, p => p.ID == wcstask.ID); updatesign = _wcstaskoldrepository.UpdateModelColumns(p => new WCS_TaskOld() { Status = TaskStatus.ConveyorExecution, LastInteractionPoint = curpoint, AddrNext = nextpoint }, p => p.ID == wcstask.ID); _hjBillTaskDetail.InsertAsync(new hjBillTaskDetail() { CurPoint = reqEntity.CurPosition, NextPoint = reqEntity.NextPosition,TaskCode = wcstask.ID,ExecTime = DateTime.Now,Desc = "" }); } } if (!updatesign) { result.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode(); ; result.ResMsg = "更新任务进程"+ResponseStatusCodeEnum.DataSaveErr.GetDescription(); } } catch (Exception ex) { result.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode(); ; result.ResMsg = "更新任务进程" + ResponseStatusCodeEnum.DataSaveErr.GetDescription(); _logger.LogInformation(ex.ToString() + "更新任务进程失败请求参数:" + JsonConvert.SerializeObject(reqEntity)); } return result; } /// /// 获取巷道 /// /// /// public SRes GetTunnelPriorityList(GetTunnelPriorityListRequest reqEntity) { var result = new SRes(); var wcstask = _wcstaskoldrepository.AsQueryable().Where(p => p.ID == reqEntity.TaskNum).SplitTable(p => p.Take(2)).First(); if (wcstask == null) { result.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode(); result.ResMsg = reqEntity.TaskNum + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription(); return result; } var curinv = _billInvnowrepository.GetFirst(p => p.ContGrpBarCode == wcstask.BarCode && p.InvStateCode == InvState.InvEcecState_BuildUp.ToString()); if (curinv == null) { result.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode(); result.ResMsg = wcstask.BarCode + ResponseStatusCodeEnum.StockNotExist.GetDescription(); return result; } //获取任务数占用最少的 var wcstasks = _wcstaskoldrepository.AsQueryable().Where(p=>p.WarehouseCode == wcstask.WarehouseCode && p.Type == TaskType.EnterDepot && p.Status < TaskStatus.Finish).SplitTable(p => p.Take(2)).ToList(); var tunnelcountlist = new List(); var runningtasks = wcstasks.Where(p => p.Tunnel != "0" && p.Tunnel != "" && p.Tunnel != null); if (runningtasks.Any()) { tunnelcountlist = (from task in runningtasks.GroupBy(p => p.Tunnel) select new TunnelCountTemp { Tunnel = task.Key, Count = task.Count() }).ToList(); } //获取库位所有巷道列表 var alltunnels = _basewarecellrepository.GetList().Select(p=>p.Tunnel).Distinct(); foreach (var item in alltunnels) { if (!tunnelcountlist.Where(p => p.Tunnel == item.ToString()).Any()) { tunnelcountlist.Add(new TunnelCountTemp() { Tunnel = item.ToString(), Count = 0 }); } } var tasktunnelcountlist = tunnelcountlist.OrderBy(p => p.Count).ToList(); var warehouse = _basewarehouserepository.GetSingle(p => p.Code == wcstask.WarehouseCode); //获取已占用库位最少的货架 var threshold = 5; //int.Parse(ConfigUtil.GetConfiguration["Threshold"]);//阈值 var locationsreturn = from loc in _basewarecellrepository.GetList(p => p.WarehouseId == warehouse.Id && p.Size >= wcstask.Height && p.StateNum == LocationState.LocationState_Full.GetHashCode() && p.IsStop == 0) join inv in _billInvnowrepository.GetList(p => p.InvStateCode == InvState.InvEcecState_In.ToString()) on loc.ContGrpId equals inv.ContGrpId where inv.MatId == curinv.MatId select loc; var shelflocationcount = _basewarecellrepository.GetList(p => p.WarehouseCode == wcstask.WarehouseCode && p.Size >= wcstask.Height && p.TypeNum == LocationType.LocationType_StorageLocation.GetHashCode() && p.IsStop == 0).GroupBy(p => new { p.Tunnel, p.Shelf }).Select(p => new { Tunnel = p.Key.Tunnel, Shelf = p.Key.Shelf, LocationCount = p.Select(q => q.Id).Count() }); if (locationsreturn == null || !locationsreturn.Any()) { result.ResData = string.Join(",", tasktunnelcountlist.OrderBy(p => p.Count).Select(p => p.Tunnel)); } else { var grouplocationtunnels = (from location in locationsreturn.GroupBy(p => p.Tunnel) select new TunnelCountTemp { Tunnel = location.Key.ToString(), Count = location.Count(), Proportion = location.Count() / (shelflocationcount.Where(p => p.Tunnel == location.Key).Any() ? decimal.Parse( shelflocationcount.Where(p => p.Tunnel == location.Key).Sum(p => p.LocationCount).ToString()) : 1) }).ToList().OrderBy(p => p.Count).ToList(); foreach (var item in alltunnels) { if (!grouplocationtunnels.Where(p => p.Tunnel == item.ToString()).Any()) { grouplocationtunnels.Add(new TunnelCountTemp() { Tunnel = item.ToString(), Count = 0, Proportion = 0 }); } } grouplocationtunnels = grouplocationtunnels.OrderBy(p => p.Proportion).ToList(); var sorttunnels = grouplocationtunnels.OrderBy(p => p.Proportion).Select(p => p.Tunnel).ToList(); for (var i = 0; i < grouplocationtunnels.Count - 1; i++) { if (tasktunnelcountlist.Where(p => p.Tunnel == grouplocationtunnels[i].Tunnel).First().Count - threshold > tasktunnelcountlist.Where(p => p.Tunnel == grouplocationtunnels[i + 1].Tunnel).First().Count) { sorttunnels[i] = grouplocationtunnels[i + 1].Tunnel; sorttunnels[i + 1] = grouplocationtunnels[i].Tunnel; i++; } else { sorttunnels[i] = grouplocationtunnels[i].Tunnel; } } result.ResData = string.Join(",", sorttunnels); } //删除没有空闲货位的货架 var arrresultTunnels = result.ResData.Split(','); var emptylocationsreturn = _basewarecellrepository.GetList(p => p.WarehouseCode == wcstask.WarehouseCode && p.Size >= wcstask.Height && p.StateNum == LocationState.LocationState_Empty.GetHashCode() && p.IsStop == 0); var resultTunenls = new List(); foreach (var sorttunnel in arrresultTunnels) { //获取巷道的入库任务数 //var tunneltaskcount = _taskrepository.GetList(p => p.WarehouseCode == wcstask.WarehouseCode && p.Type == TaskType.EnterDepot && p.Status < TaskStatus.Finish && p.Height >= wcstask.Height && p.Tunnel == wcstask.Tunnel).Count(); //int left = 0; //if (emptylocationsreturn.Where(p => p.Tunnel == int.Parse(sorttunnel)).Count() - tunneltaskcount > left) //{ // resultTunenls.Add(sorttunnel); //} //result.ResData = string.Join(",", resultTunenls); } //删除堆垛机异常的巷道 //var errorSrmList = _baseEquipmentDataService.GetList(new GetBaseEquipmentListRequest() { WarehouseId = warehouse.Id, EquipmentType = BaseDictionaryConst.EquipType_PlierCode, EquipmentState = BaseDictionaryConst.PlierRuningState_ErrorCode }); //if (errorSrmList.Any()) //{ // var resultTunenls1 = new List(); // var errtunnelList = errorSrmList.Select(p => p.Tunnel).ToList(); // foreach (var item in resultTunenls) // { // if (!errtunnelList.Where(p => p == item).Any()) // { // resultTunenls1.Add(item); // } // } // result.TunnelNum = string.Join(",", resultTunenls1); //} //else //{ // result.TunnelNum = string.Join(",", resultTunenls); //} //根据配置过滤禁用的巷道 var disabletunnels = _sysconfigrepository.GetList(p => p.SType == "InStop" && !string.IsNullOrEmpty(p.SContent)); if (disabletunnels != null && disabletunnels.Any()) { var resultTunenlsNew = new List(); var resultTunenlsTemp = result.ResData.Split(','); foreach (var tun in resultTunenlsTemp) { if (!disabletunnels.Select(p => p.Default1).Contains(tun)) { resultTunenlsNew.Add(tun); } } result.ResData = string.Join(",", resultTunenlsNew); } if (!string.IsNullOrEmpty(reqEntity.Memo1)) { if (result.ResData.Contains(reqEntity.Memo1)) { result.ResData = reqEntity.Memo1; } } //判断是否二楼退料/余料 if (wcstask.BusType == TaskBusType.TaskBusType_HJ_WetBack.GetDescription() || wcstask.BusType == TaskBusType.TaskBusType_HJ_WetLeft.GetDescription()) { if (result.ResData.Contains("3") || result.ResData.Contains("4")) { if (result.ResData.Contains("3") && !result.ResData.Contains("4")) { result.ResData = "3"; } else if (result.ResData.Contains("4") && !result.ResData.Contains("3")) { result.ResData = "4"; } else if (result.ResData.Contains("3,4")) { result.ResData = "3,4"; } else { result.ResData = "4,3"; } } else { result.ResData = ""; } } //二楼空轮回库优先分4巷道 else if (wcstask.BusType == TaskBusType.TaskBusType_HJ_WetEmpty.GetDescription()) { if (result.ResData.Contains("4") && !result.ResData.StartsWith("4")) { int count = result.ResData.EndsWith("4") == true ? 1 : 2; var index = result.ResData.IndexOf("4"); string remove = result.ResData.Remove(index,count); result.ResData = "4," + remove; } } //更新wcs任务巷道 //if (!string.IsNullOrEmpty(result.ResData) && result.ResData != "0" && result.ResData.Split(',').Any()) //{ // if (result.ResData.Split(',').Any()) // { // var tun = result.ResData.Split(',')[0]; // _taskrepository.UpdateModelColumns(p => new WCS_TaskInfo() { Tunnel = tun }, p => p.ID == wcstask.ID && p.Status < TaskStatus.Finish); // } // else // { // var tun = result.ResData; // _taskrepository.UpdateModelColumns(p => new WCS_TaskInfo() { Tunnel = tun }, p => p.ID == wcstask.ID && p.Status < TaskStatus.Finish); // } //} return result; } /// /// 申请出库货位 /// /// /// public SRes ApplyStockOut(WetLinePickMaterApplyRequest request) { var res = new SRes(); int timerange = 999999999; //考虑巷道剩余空轮数量 var locationlist = from loc in _basewarecellrepository.GetList(p => p.IsStop == 0 && p.StateNum == LocationState.LocationState_Full.GetHashCode()) join stock in _billInvnowrepository.GetList(p => p.ContGrpType == ContGrpType.Material.GetHashCode() && p.InvStateCode == InvState.InvEcecState_In.ToString()) on loc.ContGrpBarCode equals stock.ContGrpBarCode where stock.ProductTime.AddHours(double.Parse(stock.HoldDuration.ToString())) <= DateTime.Now orderby stock.ProductTime select new { stock.MatCode, stock.InvBarCode, stock.RFIDBarCode, stock.IsFast, stock.Grade, stock.IsSurplus, stock.IsRework, stock.InvStateCode, stock.ProductTime, stock.ExecStateCode, loc.Col, loc.Layer, loc.Shelf, loc.Depth, loc.Code, loc.Tunnel, loc.WarehouseCode, loc.ContGrpBarCode, loc.Id, loc.StateNum, stock.BomMatId }; if (!string.IsNullOrEmpty(request.MatCode)) { locationlist = locationlist.Where(p => p.MatCode == request.MatCode); } if (!string.IsNullOrEmpty(request.MatBarCode)) { locationlist = locationlist.Where(p => p.InvBarCode == request.MatBarCode); } if (!string.IsNullOrEmpty(request.RFID)) { locationlist = locationlist.Where(p => p.RFIDBarCode == request.RFID); } else if (request.WhiteHWList != null && request.WhiteHWList.Any()) { var locationlisttemp = locationlist.Where(p => request.WhiteHWList.Contains(p.ContGrpBarCode)); if (locationlisttemp != null && locationlisttemp.Any()) { locationlist = locationlisttemp; } else { locationlist = locationlist.Where(p => p.ExecStateCode == InvLockState.InvState_Normal.ToString()); } } else { locationlist = locationlist.Where(p => p.ExecStateCode == InvLockState.InvState_Normal.ToString()); } if (!string.IsNullOrEmpty(request.IsFast)) { locationlist = locationlist.Where(p => p.IsFast == bool.Parse(request.IsFast)); } if (!string.IsNullOrEmpty(request.Grade)) { locationlist = locationlist.Where(p => p.Grade == request.Grade); } if (!string.IsNullOrEmpty(request.IsSurplus)) { locationlist = locationlist.Where(p => p.IsSurplus == bool.Parse(request.IsSurplus)); } if (!string.IsNullOrEmpty(request.IsRework)) { locationlist = locationlist.Where(p => p.IsRework == bool.Parse(request.IsRework)); } //if (!string.IsNullOrEmpty(request.WareCode)) //{ // locationlist = locationlist.Where(p => p.WarehouseId == bool.Parse(request.WareCode)); //} //黑名单限制出库 if (request.BlackHWList != null && request.BlackHWList.Any()) { locationlist = locationlist.Where(p => !request.BlackHWList.Contains(p.ContGrpBarCode)); } if (locationlist == null || !locationlist.Any()) { res.ResCode = ResponseStatusCodeEnum.NotEnoughStock.GetHashCode(); res.ResMsg = request.MatCode + "|" + request.MatBarCode + ResponseStatusCodeEnum.NotEnoughStock.GetDescription(); return res; } //获取当前出库任务 var task = _wcstaskoldrepository.AsQueryable().Where(p => p.Type == TaskType.OutDepot && p.Status < TaskStatus.Finish && p.BusType == TaskBusType.TaskBusType_HJ_TwoFloorStockOut.GetDescription()).SplitTable(p => p.Take(2)).ToList(); var taskcount = (from taskunm in task.GroupBy(p => p.Tunnel) select new TunnelCountTemp { Tunnel = taskunm.Key, Count = taskunm.Count() }).ToList(); //获取所有未被禁用的巷道 var tunnel = _sysconfigrepository.AsQueryable().Where(p => p.SType == "OutStop" && string.IsNullOrEmpty(p.SContent)).ToList(); if (!tunnel.Any()) { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = request.MatCode + "没有可用巷道"; return res; } var tun = new List { "1", "2", "3", "4"}; //取到所有巷道及任务数 foreach (var item in tun) { if (!taskcount.Where(p => p.Tunnel == item).Any()) { taskcount.Add(new TunnelCountTemp() { Tunnel = item, Count = 0 }); } } var tunnellist = taskcount.OrderBy(p => p.Count); //取最少任务的巷道 var tunlist = tunnel.Select(p => p.Default1).ToList(); var locations = locationlist.Where(p => tunlist.Contains(p.Tunnel.ToString())); var minProductTime = locationlist.OrderBy(p => p.ProductTime).First().ProductTime; foreach (var item in tunnellist) { if (!tunnel.Where(p => p.Default1 == item.Tunnel).Any()) { continue; } //locations = locationlist.Where(p => p.Tunnel == int.Parse(item.Tunnel) && Math.Abs((p.ProductTime - minProductTime).TotalHours) < timerange); locations = locationlist.Where(p => p.Tunnel == int.Parse(item.Tunnel)); if (!locations.Any()) { continue; } else { break; } } if (locations == null || !locations.Any()) { res.ResCode = ResponseStatusCodeEnum.NotEnoughStock.GetHashCode(); res.ResMsg = request.MatCode + "|" + request.MatBarCode + ResponseStatusCodeEnum.NotEnoughStock.GetDescription(); return res; } //白名单优先出库 if (request.WhiteHWList != null && request.WhiteHWList.Any()) { var templocations = locations.Where(p => request.WhiteHWList.Contains(p.ContGrpBarCode)); if (templocations != null && templocations.Any()) { locations = templocations; } } //优先取二深位没有货的,然后再取一深位的,然后最后一深和二深都有的 var locs = from loc2 in locations.Where(p => p.Depth == 2).ToList() join loc1 in _basewarecellrepository.AsQueryable().Where(p => p.Depth == 1 && p.IsStop == 0 && (p.StateNum == 1 || p.StateNum == 4)).ToList() on new { loc2.Col, loc2.Layer, loc2.Shelf } equals new { loc1.Col, loc1.Layer, loc1.Shelf } select loc2; var locdept1 = locations.Where(p => p.Depth == 1); if (locs.Any() || locdept1.Any()) { locations = locs.Union(locdept1); } //if (locs.Any()) //{ // locations = locs; //} //else //{ // if (locations.Where(p => p.Depth == 1).Any()) // { // locations = locations.Where(p => p.Depth == 1); // } //} locations = locations.OrderByDescending(p => p.IsFast).ThenByDescending(p=>p.BomMatId).ThenBy(p => p.ProductTime); //出库任务 var temploc = locations.First(); if (temploc.Depth == 2 && temploc.InvStateCode == InvState.InvEcecState_In.ToString()) { //获取一深位货位,白名单优先出库 var loc = request.WhiteHWList != null && request.WhiteHWList.Any() && locations.ToList().Where(p => p.Col == temploc.Col && temploc.Layer == temploc.Layer && p.Shelf == temploc.Shelf && p.Depth == 1 && p.InvStateCode == InvState.InvEcecState_In.ToString() && (p.ProductTime - temploc.ProductTime).TotalHours < timerange && request.WhiteHWList.Contains(p.ContGrpBarCode)).Any() ? locations.ToList().Where(p => p.Col == temploc.Col && temploc.Layer == temploc.Layer && p.Shelf == temploc.Shelf && p.Depth == 1 && p.InvStateCode == InvState.InvEcecState_In.ToString() && (p.ProductTime - temploc.ProductTime).TotalHours < timerange && request.WhiteHWList.Contains(p.ContGrpBarCode)) : locations.ToList().Where(p => p.Col == temploc.Col && temploc.Layer == temploc.Layer && p.Shelf == temploc.Shelf && p.Depth == 1 && p.InvStateCode == InvState.InvEcecState_In.ToString() && (p.ProductTime - temploc.ProductTime).TotalHours < timerange); //var loc = locations.ToList().Where(p => p.Col == temploc.Col && temploc.Layer == temploc.Layer && p.Shelf == temploc.Shelf && p.Depth == 1 && p.InvStateCode == InvState.InvEcecState_In.ToString() && (p.ProductTime - temploc.ProductTime).TotalHours < timerange); if (loc != null && loc.Any()) { temploc = loc.First(); } } var outstation = ""; if (temploc.Tunnel == 1) { outstation = "1022"; } else if (temploc.Tunnel == 2) { outstation = "1024"; } else if (temploc.Tunnel == 3) { outstation = "1026"; } else if (temploc.Tunnel == 4) { outstation = "1128"; } //二楼出库站台 var sotck = _billInvnowrepository.GetFirst(p => p.ContGrpBarCode == temploc.ContGrpBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString()); try { _db.BeginTran(); //货位表 _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = LocationState.LocationState_StockOut.GetHashCode() }, p => p.Id == temploc.Id); //库存表 _billInvnowrepository.UpdateModelColumns(p => new BillInvnow() { InvStateCode = InvState.InvEcecState_OutGoing.ToString(), EditTime = DateTime.Now }, p => p.Id == sotck.Id); var invflow = _mapper.Map(sotck); invflow.InvStateCode = InvState.InvEcecState_OutGoing.ToString(); invflow.AddTime = DateTime.Now; invflow.Id = IdFactory.NewId(); _billInvflow.Insert(invflow); //添加出库任务 CreateStockOutWcsTask(new CreateStockOutWcsTaskRequest() { ContGrpBarCode = temploc.ContGrpBarCode, CellNo = temploc.Code, EquCode = outstation, Floor = 2, Qty = sotck.LengthQty, Tunnel = temploc.Tunnel.ToString(), WarehouseCode = temploc.WarehouseCode, WorkBench = request.WbCode, MatCode = request.MatCode, InvBarCode = request.MatBarCode, IsFast = sotck.IsFast, Grade = sotck.Grade, IsSurplus = sotck.IsSurplus, IsRework = sotck.IsRework, BusType = TaskBusType.TaskBusType_HJ_TwoFloorStockOut, Priority = request.Priority, ReqCode = request.ReqCode }); _db.CommitTran(); } catch (Exception ex) { _db.RollbackTran(); _logger.LogInformation(ex.ToString()); res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.DataSaveErr.GetDescription(); return res; } return res; } /// /// 申请出库货位验证 /// /// /// public SRes ApplyStockOutCheck(WetLinePickMaterApplyRequest request) { var res = new SRes(); int timerange = 999999999; //考虑巷道剩余空轮数量 var locationlist = from loc in _basewarecellrepository.GetList(p => p.IsStop == 0 && p.StateNum == LocationState.LocationState_Full.GetHashCode()) join stock in _billInvnowrepository.GetList(p => p.ContGrpType == ContGrpType.Material.GetHashCode() && p.InvStateCode == InvState.InvEcecState_In.ToString()) on loc.ContGrpBarCode equals stock.ContGrpBarCode where stock.ProductTime.AddHours(double.Parse(stock.HoldDuration.ToString())) <= DateTime.Now orderby stock.ProductTime select new { stock.MatCode, stock.InvBarCode, stock.RFIDBarCode, stock.IsFast, stock.Grade, stock.IsSurplus, stock.IsRework, stock.InvStateCode, stock.ProductTime, stock.ExecStateCode, loc.Col, loc.Layer, loc.Shelf, loc.Depth, loc.Code, loc.Tunnel, loc.WarehouseCode, loc.ContGrpBarCode, loc.Id, loc.StateNum, stock.BomMatId }; if (!string.IsNullOrEmpty(request.MatCode)) { locationlist = locationlist.Where(p => p.MatCode == request.MatCode); } if (!string.IsNullOrEmpty(request.MatBarCode)) { locationlist = locationlist.Where(p => p.InvBarCode == request.MatBarCode); } if (!string.IsNullOrEmpty(request.RFID)) { locationlist = locationlist.Where(p => p.RFIDBarCode == request.RFID); } else if (request.WhiteHWList != null && request.WhiteHWList.Any()) { var locationlisttemp = locationlist.Where(p => request.WhiteHWList.Contains(p.ContGrpBarCode)); if (locationlisttemp != null && locationlisttemp.Any()) { locationlist = locationlisttemp; } else { locationlist = locationlist.Where(p => p.ExecStateCode == InvLockState.InvState_Normal.ToString()); } } else { locationlist = locationlist.Where(p => p.ExecStateCode == InvLockState.InvState_Normal.ToString()); } if (!string.IsNullOrEmpty(request.IsFast)) { locationlist = locationlist.Where(p => p.IsFast == bool.Parse(request.IsFast)); } if (!string.IsNullOrEmpty(request.Grade)) { locationlist = locationlist.Where(p => p.Grade == request.Grade); } if (!string.IsNullOrEmpty(request.IsSurplus)) { locationlist = locationlist.Where(p => p.IsSurplus == bool.Parse(request.IsSurplus)); } if (!string.IsNullOrEmpty(request.IsRework)) { locationlist = locationlist.Where(p => p.IsRework == bool.Parse(request.IsRework)); } //if (!string.IsNullOrEmpty(request.WareCode)) //{ // locationlist = locationlist.Where(p => p.WarehouseId == bool.Parse(request.WareCode)); //} //黑名单限制出库 if (request.BlackHWList != null && request.BlackHWList.Any()) { locationlist = locationlist.Where(p => !request.BlackHWList.Contains(p.ContGrpBarCode)); } if (locationlist == null || !locationlist.Any()) { res.ResCode = ResponseStatusCodeEnum.NotEnoughStock.GetHashCode(); res.ResMsg = request.MatCode + "|" + request.MatBarCode + ResponseStatusCodeEnum.NotEnoughStock.GetDescription(); return res; } //获取当前出库任务 var task = _wcstaskoldrepository.AsQueryable().Where(p => p.Type == TaskType.OutDepot && p.Status < TaskStatus.Finish && p.BusType == TaskBusType.TaskBusType_HJ_TwoFloorStockOut.GetDescription()).SplitTable(p => p.Take(2)).ToList(); var taskcount = (from taskunm in task.GroupBy(p => p.Tunnel) select new TunnelCountTemp { Tunnel = taskunm.Key, Count = taskunm.Count() }).ToList(); //获取所有未被禁用的巷道 var tunnel = _sysconfigrepository.AsQueryable().Where(p => p.SType == "OutStop" && string.IsNullOrEmpty(p.SContent)).ToList(); if (!tunnel.Any()) { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = request.MatCode + "没有可用巷道"; return res; } var tun = new List { "1", "2", "3" ,"4" }; //取到所有巷道及任务数 foreach (var item in tun) { if (!taskcount.Where(p => p.Tunnel == item).Any()) { taskcount.Add(new TunnelCountTemp() { Tunnel = item, Count = 0 }); } } var tunnellist = taskcount.OrderBy(p => p.Count); //取最少任务的巷道 var tunlist = tunnel.Select(p => p.Default1).ToList(); var locations = locationlist.Where(p => tunlist.Contains(p.Tunnel.ToString())); var minProductTime = locationlist.OrderBy(p => p.ProductTime).First().ProductTime; foreach (var item in tunnellist) { if (!tunnel.Where(p => p.Default1 == item.Tunnel).Any()) { continue; } //locations = locationlist.Where(p => p.Tunnel == int.Parse(item.Tunnel) && Math.Abs((p.ProductTime - minProductTime).TotalHours) < timerange); locations = locationlist.Where(p => p.Tunnel == int.Parse(item.Tunnel)); if (!locations.Any()) { continue; } else { break; } } if (locations == null || !locations.Any()) { res.ResCode = ResponseStatusCodeEnum.NotEnoughStock.GetHashCode(); res.ResMsg = request.MatCode + "|" + request.MatBarCode + ResponseStatusCodeEnum.NotEnoughStock.GetDescription(); return res; } return res; } private long GetId() { return IdFactory.NewId(); } #region 任务管理 public List Exportrow(string code) { var res = new List(); //获取需导出的实体 var type = Assembly.Load("wms.dto").GetTypes().Where(p => p.FullName.Contains("wms.dto") && p.Name == code); //获取属性 PropertyInfo[] propertyInfos = type.FirstOrDefault().GetProperties(BindingFlags.Instance | BindingFlags.Public); if (propertyInfos.Any()) { var list = new ExportModel(); foreach (var item in propertyInfos) { if (item.Name == "Id" || item.Name.EndsWith("Who") || item.Name == "Status" || item.Name.EndsWith("Time")) { continue; } list.Title = item.GetCustomAttribute().Description; list.Code = item.Name; res.Add(_mapper.Map(list)); } } return res; } public SRes CancelTask(CompleteTaskRequest request) { var res = new SRes() { ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode(), ResMsg = ResponseStatusCodeEnum.Sucess.GetDescription() }; var task = _wcstaskoldrepository.AsQueryable().Where(p => p.ID == request.TaskNum).SplitTable(p => p.Take(2)).First(); if (task == null) { res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode(); res.ResMsg = request.TaskNum + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription(); return res; } try { if (task.Type == TaskType.EnterDepot) { //验证组盘状态 var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == task.BarCode); if (stock == null) { res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.StockNotExist.GetDescription(); return res; } var flow = _mapper.Map(stock); flow.Id = GetId(); flow.InvStateCode = InvState.InvEcecState_Out.ToString(); flow.Memo = "WCS取消任务"; flow.EditTime = DateTime.Now; _db.BeginTran(); _billInvnowrepository.DeleteById(stock.Id); _billInvinitrepository.Delete(p => p.ContGrpBarCode == task.BarCode); _billInvflow.Insert(flow); _db.CommitTran(); } else if (task.Type == TaskType.OutDepot) { //验证组盘状态 var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == task.BarCode); if (stock == null) { res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.StockNotExist.GetDescription(); return res; } var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == task.BarCode); if (cell == null) { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = task.BarCode + ResponseStatusCodeEnum.Fail.GetDescription() + "堆垛机已放货完成,不允许取消"; return res; } var flow = _mapper.Map(stock); flow.Id = GetId(); flow.InvStateCode = InvState.InvEcecState_In.ToString(); flow.Memo = "WCS取消任务"; flow.EditTime = DateTime.Now; _db.BeginTran(); _basewarecellrepository.UpdateSetColumnsTrue(p => new BaseWarecell() { StateNum = 2, EditTime = DateTime.Now }, p => p.ContGrpBarCode == task.BarCode); _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow() { InvStateCode = InvState.InvEcecState_In.ToString(), EditTime = DateTime.Now }, p => p.ContGrpBarCode == task.BarCode); _billInvflow.Insert(flow); _db.CommitTran(); } else if (task.Type == TaskType.EmptyInit) { //验证组盘状态 var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == task.BarCode); if (stock == null) { res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.StockNotExist.GetDescription(); return res; } var flow = _mapper.Map(stock); flow.Id = GetId(); flow.InvStateCode = InvState.InvEcecState_Out.ToString(); flow.Memo = "WCS取消任务"; flow.EditTime = DateTime.Now; _db.BeginTran(); _billInvnowrepository.DeleteById(stock.Id); _billInvflow.Insert(flow); _db.CommitTran(); } else if (task.Type == TaskType.Delivery) { return res; } else { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.Fail.GetDescription() + "该任务类型不允许取消"; return res; } } catch (Exception ex) { _db.RollbackTran(); res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = task.ID + ResponseStatusCodeEnum.Fail.GetDescription(); _logger.LogInformation("任务取消失败,任务号:" + task.ID + ex.Message); return res; } return res; } #endregion #region 单据管理 public SRes GetPageDocumentsList(DocumentsRequest request) { var res = new SRes() { ResDataList = new List() }; if (request.TypeCode == null) { res.ResCode = ResponseStatusCodeEnum.ErrParamNotNull.GetHashCode(); res.ResMsg = "单据类型" + ResponseStatusCodeEnum.ErrParamNotNull.GetDescription(); return res; } var list = _iHJDataService.GetPageDocumentsList(request); res.ResDataList = list.Item1; res.ToCount = list.Item2; res.PageIndex = request.PageIndex; res.PageSize = request.PageSize; res.PageNumber = Math.Ceiling((decimal)res.ToCount / res.PageSize); return res; } public string FinishDocument(DetailRequest request) { var res = new SRes(); if (request.Id < 0) { res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.ErrParam.GetDescription(); return res.ToCamelCaseString(); } var doc = _docrepository.GetSingle(p => p.Id == request.Id); if (doc == null) { res.ResCode = ResponseStatusCodeEnum.DocNoCodeNotExist.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.DocNoCodeNotExist.GetDescription(); return res.ToCamelCaseString(); } if (doc.StateCode == DocState.DocState_Complete.ToString() || doc.StateCode == DocState.DocState_Stop.ToString()) { res.ResCode = ResponseStatusCodeEnum.DocumentStateNotFinish.GetHashCode(); res.ResMsg = doc.DocNo + ResponseStatusCodeEnum.DocumentStateNotFinish.GetDescription(); return res.ToCamelCaseString(); } //验证单据是否存在新增或进行中的任务 var task = _billTaskrepository.GetList(p => p.DocCode == doc.DocNo && p.TaskState < TaskStatus.Finish.GetHashCode()); if (task.Any()) { res.ResCode = ResponseStatusCodeEnum.IsTaskNotFinish.GetHashCode(); res.ResMsg = doc.DocNo + ResponseStatusCodeEnum.IsTaskNotFinish.GetDescription(); return res.ToCamelCaseString(); } _docrepository.UpdateSetColumnsTrue(p => new hjBillDocument() { StateCode = DocState.DocState_Complete.ToString(), EditTime = DateTime.Now }, p => p.DocNo == doc.DocNo); return res.ToCamelCaseString(); } #endregion #region 库存管理 public SRes GetPageStockdetailList(StockRequest request) { var res = new SRes() { ResDataList = new List() }; var stockList = new List(); var tuns = _sysconfigrepository.GetList(p => p.Default2 == Const.HjWareHouse); var list = _billGroupStockrepository.GetPageStockdetailList(request); foreach (var item in list.Item1) { item.InStatus = tuns.Where(p => p.SType == "InStop" && p.SContent.Contains(item.Tunnel)).Any() ? "禁用" : "启用"; item.OutStatus = tuns.Where(p => p.SType == "OutStop" && p.SContent.Contains(item.Tunnel)).Any() ? "禁用" : "启用"; stockList.Add(_mapper.Map(item)); } res.ResDataList = stockList; res.ToCount = list.Item2; res.PageIndex = request.PageIndex; res.PageSize = request.PageSize; res.PageNumber = Math.Ceiling((decimal)res.ToCount / res.PageSize); return res; } public string ManualTask(ManualTaskRequest request) { var res = new SRes(); if (!request.Location.Any()) { res.ResCode = ResponseStatusCodeEnum.ErrParamNotNull.GetHashCode(); res.ResMsg = "货位" + ResponseStatusCodeEnum.ErrParamNotNull.GetDescription(); return res.ToCamelCaseString(); } try { foreach (var item in request.Location) { var location = _basewarecellrepository.GetSingle(p => p.Code == item); if (location == null) { res.ResCode = ResponseStatusCodeEnum.WareLocationCodeNotExist.GetHashCode(); res.ResMsg = item + ResponseStatusCodeEnum.WareLocationCodeNotExist.GetDescription(); return res.ToCamelCaseString(); } if (location.StateNum != LocationState.LocationState_Full.GetHashCode()) { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = item + ResponseStatusCodeEnum.Fail.GetDescription() + "货位状态不满足出库条件"; return res.ToCamelCaseString(); } if (location.IsStop == Const.One) { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.Fail.GetDescription() + item + "被禁用"; return res.ToCamelCaseString(); } var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == location.ContGrpBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString()); if (stock == null) { res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.StockNotExist.GetDescription(); return res.ToCamelCaseString(); } if (stock.InvStateCode != InvState.InvEcecState_In.ToString()) { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = item + "组盘状态不是已入库"; return res.ToCamelCaseString(); } string equip = ""; if (location.Tunnel == 3) { equip = "1026"; } else if (location.Tunnel == 2) { equip = "1024"; } else if (location.Tunnel == 1) { equip = "1022"; } else if (location.Tunnel == 4) { equip = "1128"; } else { res.ResCode = ResponseStatusCodeEnum.EquipInfoNotExist.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.EquipInfoNotExist.GetDescription(); return res.ToCamelCaseString(); } WCS_TaskInfo billTask = new WCS_TaskInfo(); billTask.Status = TaskStatus.NewBuild; billTask.Type = TaskType.OutDepot; billTask.Priority = 0; billTask.Device = "SRM" + location.Tunnel; billTask.SrmStation = equip; billTask.AddrFrom = item; billTask.BarCode = stock.ContGrpBarCode; billTask.StartTime = DateTime.Now; billTask.AddTime = DateTime.Now; billTask.EditTime = DateTime.Now; billTask.AddWho = "wms"; billTask.WarehouseCode = location.WarehouseCode; billTask.Enabled = true; billTask.WorkBench = equip; billTask.AddrTo = equip; billTask.Floor = 2; billTask.Tunnel = location.Tunnel.ToString(); billTask.PalletType = 1; billTask.Length = stock.LengthQty; billTask.MaterialCode = stock.MatCode; billTask.OutType = OutTypeEnum.半自动手动出库任务; billTask.BusType = TaskBusType.TaskBusType_HJ_ManualOut.GetDescription(); _db.BeginTran(); var wcs = _taskrepository.InsertReturnEntity(billTask); var wcshistory = _mapper.Map(wcs); _wcstaskoldrepository.InsertableSplitTable(wcshistory); var taskdetail = new WCS_TaskDtl() { ID = Guid.NewGuid(), CurPoint = item, AddTime = DateTime.Now, AddWho = "wms", Enabled = true, ParentTaskCode = wcs.ID, Desc = wcs.OutType.ToString(), }; _taskdetailrepository.InsertableSplitTable(taskdetail); _db.CommitTran(); _basewarecellrepository.UpdateSetColumnsTrue(p => new BaseWarecell() { StateNum = LocationState.LocationState_StockOut.GetHashCode(), EditTime = DateTime.Now }, p => p.Code == item); _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow() { InvStateCode = InvState.InvEcecState_OutGoing.ToString(), EditTime = DateTime.Now }, p => p.ContGrpBarCode == stock.ContGrpBarCode); var flow = _mapper.Map(stock); flow.Id = IdFactory.NewId(); flow.InvStateCode = InvState.InvEcecState_OutGoing.ToString(); flow.EditTime = DateTime.Now; _billInvflow.Insert(flow); } } catch (Exception ex) { _db.RollbackTran(); _logger.LogInformation("手动出库异常:" + ex.Message); res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.DataSaveErr.GetDescription(); return res.ToCamelCaseString(); } return res.ToCamelCaseString(); } #endregion public SRes Unbounding(UnboundRequest request) { var res = new SRes() { ResCode = 500 }; var task = _billTaskrepository.GetList(p => p.StartPoint == request.Equip && p.TaskState <= TaskStatus.WaitingToExecute.GetHashCode()); if (task.Any()) { res.ResCode = ResponseStatusCodeEnum.IsTaskNotUnbounding.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.IsTaskNotUnbounding.GetDescription(); return res; } var equip = _baseWareLocationrepository.GetSingle(p => p.Code == request.Equip); if (equip == null) { res.ResCode = ResponseStatusCodeEnum.EquipInfoNotExist.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.EquipInfoNotExist.GetDescription(); return res; } var stock = _iHJDataService.GetStockByEquip(request.Equip); if (stock.Any()) { _baseWareLocationrepository.UpdateSetColumnsTrue(p => new hjBaseWareLocation() { ContGrpID = Const.Zero, ContGrpBarCode = "", EditTime = DateTime.Now }, p => request.Equip == p.Code); _billGroupStockrepository.UpdateSetColumnsTrue(p => new hjBillContainer() { ExecState = InvState.InvEcecState_Out.GetHashCode(), EditTime = DateTime.Now }, p => stock.Contains(p.HWBarCode)); res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode(); } else { res.ResMsg = ResponseStatusCodeEnum.StockNotExist.GetDescription(); } return res; } public SRes GetDocumentDetailListByDocsNo(DocumentsRequest request) { var res = new SRes() { ResDataList = new List() }; var list = _iHJDataService.GetDocumentDetailListByDocsNo(request); res.ResDataList = list.Item1; res.ToCount = list.Item2; res.PageIndex = request.PageIndex; res.PageSize = request.PageSize; res.PageNumber = Math.Ceiling((decimal)res.ToCount / res.PageSize); return res; } public SRes MaterInfoByRfid(PdaRfidRequest request) { var res = new SRes() { ResDataList = new List() }; //if (!request.RFIDBarCode.Any()) //{ // res.ResCode = ResponseStatusCodeEnum.ErrParamNotNull.GetHashCode(); // res.ResMsg = "RFID" + ResponseStatusCodeEnum.ErrParamNotNull.GetDescription(); // return res; //} //MaterInfo mater = new MaterInfo(); //List materlist = new List(); //foreach (var item in request.RFIDBarCode) //{ // var code = _billBarcoderepository.GetSingle(p => p.RFIDBarCode == item); // if (code != null) // { // var mat = _materrepository.GetSingle(p => p.Id == code.MatId); // if (mat == null) // { // res.ResCode = ResponseStatusCodeEnum.BaseMaterCodeNotExist.GetHashCode(); // res.ResMsg = ResponseStatusCodeEnum.BaseMaterCodeNotExist.GetDescription(); // return res; // } // mater.HWSpec = code.HWSpec; // mater.MatCode = mat?.Code; // mater.MatName = mat?.Name; // mater.IsHold = mat.IsHold; // mater.HoldDuration = mat.HoldDuration; // mater.Plating = mat?.Plating; // mater.PlatingConQty = mat.PlatingConQty; // mater.Linear = mat.Linear; // mater.Weight = mat.Weight; // mater.Grade = code.Grade; // mater.Flag = code.InvState; // materlist.Add(_mapper.Map(mater)); // } //} //res.ResDataList = materlist; return res; } public string PdaGroupStock(PdaRfidRequest request) { var res = new SRes(); //var equip = _sysconfigrepository.GetSingle(p => p.Code == request.Equip); //if (equip == null) //{ // res.ResCode = ResponseStatusCodeEnum.EquipInfoNotExist.GetHashCode(); // res.ResMsg = ResponseStatusCodeEnum.EquipInfoNotExist.GetDescription(); // return res.ToCamelCaseString(); //} if (!request.RFIDBarCode.Any()) { res.ResCode = ResponseStatusCodeEnum.ErrParamNotNull.GetHashCode(); res.ResMsg = "RFID" + ResponseStatusCodeEnum.ErrParamNotNull.GetDescription(); return res.ToCamelCaseString(); } foreach (var item in request.RFIDBarCode) { //1.没有 插入数据rfid [Base_ContInfo]表 var code = _baseContinfo.GetSingle(p => p.ContBarCode == item); if (code == null) { var initbarcode = InsertContInfo(item); if (initbarcode == false) { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = "同步" + ResponseStatusCodeEnum.Fail.GetDescription(); return res.ToCamelCaseString(); } } var bar = _baseContinfo.GetSingle(p => p.ContBarCode == item); var ware = _basewarehouserepository.GetSingle(p => p.Id == bar.WarehouseId); if (ware == null) { res.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription(); return res.ToCamelCaseString(); } var mat = string.Empty; var pro = item.Split('W'); if (pro[1].StartsWith("8")) { mat = "01HJW800Empty"; } else { mat = "01HJW500Empty"; } var mater = _basematerrepository.GetSingle(p => p.Code == mat); if (mater == null) { res.ResCode = ResponseStatusCodeEnum.BaseMaterCodeNotExist.GetHashCode(); res.ResMsg = item + ResponseStatusCodeEnum.BaseMaterCodeNotExist.GetDescription(); return res.ToCamelCaseString(); } //[Bill_InvNow] 组盘、库存表 var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == bar.ContBarCode); if (stock != null) { res.ResCode = ResponseStatusCodeEnum.GroupStockDetailMaterialBarCodeExist.GetHashCode(); res.ResMsg = item + ResponseStatusCodeEnum.GroupStockDetailMaterialBarCodeExist.GetDescription(); return res.ToCamelCaseString(); } var task = _taskrepository.GetSingle(p => p.BarCode == bar.ContBarCode); if (task != null) { res.ResCode = ResponseStatusCodeEnum.WcsTaskExist.GetHashCode(); res.ResMsg = item + ResponseStatusCodeEnum.WcsTaskExist.GetDescription(); return res.ToCamelCaseString(); } try { BillInvnow container = new BillInvnow(); container.ContGrpId = GetId(); container.ContGrpBarCode = item; container.BoxBarCode = item; container.InvStateCode = InvState.InvEcecState_BuildUp.ToString(); container.InvBarCode = item; container.ExecStateCode = InvLockState.InvState_Normal.ToString(); container.InDocsNo = ""; container.InDocsRowNo = ""; container.WarehouseId = bar.WarehouseId; container.MatId = mater.Id; container.MatCode = mater.Code; container.TolWQty = bar.WidthQty; container.NetWQty = bar.LengthQty; container.TareWQty = bar.WeightQty; container.LengthQty = bar.LengthQty; container.RFIDBarCode = item; container.HWTypeCode = mater.SpoolType; container.SolderQty = bar.HighQty; container.ExecDocsNo = ""; container.ExecDocsRowNo = ""; container.ExecDocsTypeCode = ""; container.HWBarCode = item; container.InvInOut = 1; container.ExecWho = "人工组盘"; container.MatName = mater.Name; container.ContGrpType = 2; container.Size = 1; container.TareWQty = 158; _db.BeginTran(); if (_billInvnowrepository.Insert(container)) { // [Bill_InvFlow] 流水表,也插入 _billInvflow.Insert(_mapper.Map(container)); } _db.CommitTran(); } catch (Exception ex) { _db.RollbackTran(); _logger.LogInformation("组盘异常:" + item + ex.Message); res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode(); res.ResMsg = item + ResponseStatusCodeEnum.DataSaveErr.GetDescription(); return res.ToCamelCaseString(); } } return res.ToCamelCaseString(); } /// /// 下发入库任务 /// /// /// public string PdaInsertTask(PdaRfidRequest request) { var res = new SRes(); //var equip = _sysconfigrepository.GetSingle(p => p.Code == request.Equip); //if (equip == null) //{ // res.ResCode = ResponseStatusCodeEnum.EquipInfoNotExist.GetHashCode(); // res.ResMsg = ResponseStatusCodeEnum.EquipInfoNotExist.GetDescription(); // return res.ToCamelCaseString(); //} //if (request.Equip != "1025") //{ // res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); // res.ResMsg = "设备号必须是1025" + ResponseStatusCodeEnum.Fail.GetDescription(); // return res.ToCamelCaseString(); //} if (!request.RFIDBarCode.Any()) { res.ResCode = ResponseStatusCodeEnum.ErrParamNotNull.GetHashCode(); res.ResMsg = "RFID" + ResponseStatusCodeEnum.ErrParamNotNull.GetDescription(); return res.ToCamelCaseString(); } //List tasklist = new List(); //foreach (var item in request.RFIDBarCode) //{ // //验证 // var stock = _billInvnowrepository.GetSingle(p => p.RFIDBarCode == item && p.InvStateCode == InvState.InvEcecState_BuildUp.ToString()); // if (stock == null) // { // res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode(); // res.ResMsg = item + ResponseStatusCodeEnum.StockNotExist.GetDescription(); // return res.ToCamelCaseString(); // } // var task = _taskrepository.GetSingle(p => p.BarCode == stock.ContGrpBarCode); // if (task != null) // { // res.ResCode = ResponseStatusCodeEnum.WcsTaskExist.GetHashCode(); // res.ResMsg = item + ResponseStatusCodeEnum.WcsTaskExist.GetDescription(); // return res.ToCamelCaseString(); // } //} try { if (request.BusType == 1) { foreach (var item in request.RFIDBarCode) { var stock = _billInvnowrepository.GetSingle(p => p.RFIDBarCode == item && p.InvStateCode == InvState.InvEcecState_BuildUp.ToString()); if (stock == null) { res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode(); res.ResMsg = item + ResponseStatusCodeEnum.StockNotExist.GetDescription(); return res.ToCamelCaseString(); } var task = _taskrepository.GetSingle(p => p.BarCode == stock.ContGrpBarCode); if (task != null) { res.ResCode = ResponseStatusCodeEnum.WcsTaskExist.GetHashCode(); res.ResMsg = item + ResponseStatusCodeEnum.WcsTaskExist.GetDescription(); return res.ToCamelCaseString(); } //分解任务 var it = InsertTaskIn(new TaskRsponse() { BusType = TaskBusType.TaskBusType_HJ_QualityStockIn.GetDescription(), ContGrpBarCode = stock.ContGrpBarCode, ContGrpId = stock.ContGrpId, StartPoint = request.Equip, Size = 1, Remark = stock.MatCode }); if (!it) { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.Fail.GetDescription(); return res.ToCamelCaseString(); } } //var tasks = _billTaskrepository.GetList(p => p.StartPoint == request.Equip && p.BusType == TaskBusType.TaskBusType_HJ_QualityStockIn.GetHashCode().ToString() // && p.TaskState == TaskStatus.WaitingToExecute.GetHashCode()); //tasklist = _mapper.Map>(tasks); } else if (request.BusType == 2) { foreach (var item in request.RFIDBarCode) { var stock = _billInvnowrepository.GetSingle(p => p.RFIDBarCode == item && p.InvStateCode == InvState.InvEcecState_BuildUp.ToString()); if (stock == null) { res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode(); res.ResMsg = item + ResponseStatusCodeEnum.StockNotExist.GetDescription(); return res.ToCamelCaseString(); } var task = _taskrepository.GetSingle(p => p.BarCode == stock.ContGrpBarCode); if (task != null) { res.ResCode = ResponseStatusCodeEnum.WcsTaskExist.GetHashCode(); res.ResMsg = item + ResponseStatusCodeEnum.WcsTaskExist.GetDescription(); return res.ToCamelCaseString(); } //分解任务 var it = InsertTaskIn(new TaskRsponse() { BusType = TaskBusType.TaskBusType_HJ_EmptySpoolStockIn.GetDescription(), ContGrpBarCode = stock.ContGrpBarCode, ContGrpId = stock.ContGrpId, StartPoint = request.Equip, Size = 1, Remark = stock.MatCode }); if (!it) { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.Fail.GetDescription(); return res.ToCamelCaseString(); } } //var tasks = _billTaskrepository.GetList(p => p.StartPoint == request.Equip && p.BusType == TaskBusType.TaskBusType_HJ_EmptySpoolStockIn.GetHashCode().ToString() // && p.TaskState == TaskStatus.WaitingToExecute.GetHashCode()); //tasklist = _mapper.Map>(tasks); } else if (request.BusType == 3) { foreach (var item in request.RFIDBarCode) { var stock = _billInvnowrepository.GetSingle(p => p.RFIDBarCode == item && p.InvStateCode == InvState.InvEcecState_BuildUp.ToString()); if (stock == null) { res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode(); res.ResMsg = item + ResponseStatusCodeEnum.StockNotExist.GetDescription(); return res.ToCamelCaseString(); } var task = _taskrepository.GetSingle(p => p.BarCode == stock.ContGrpBarCode); if (task != null) { res.ResCode = ResponseStatusCodeEnum.WcsTaskExist.GetHashCode(); res.ResMsg = item + ResponseStatusCodeEnum.WcsTaskExist.GetDescription(); return res.ToCamelCaseString(); } //分解任务 var it = InsertTaskIn(new TaskRsponse() { BusType = TaskBusType.TaskBusType_HJ_OtherStockIn.GetDescription(), ContGrpBarCode = stock.ContGrpBarCode, ContGrpId = stock.ContGrpId, StartPoint = request.Equip, Size = 1, Remark = stock.MatCode }); if (!it) { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.Fail.GetDescription(); return res.ToCamelCaseString(); } } //var tasks = _billTaskrepository.GetList(p => p.StartPoint == request.Equip && p.BusType == TaskBusType.TaskBusType_HJ_OtherStockIn.GetHashCode().ToString() // && p.TaskState == TaskStatus.WaitingToExecute.GetHashCode()); //tasklist = _mapper.Map>(tasks); } else if (request.BusType == 4) { foreach (var item in request.RFIDBarCode) { var stock = _billInvnowrepository.GetSingle(p => p.RFIDBarCode == item && p.InvStateCode == InvState.InvEcecState_BuildUp.ToString()); if (stock == null) { res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode(); res.ResMsg = item + ResponseStatusCodeEnum.StockNotExist.GetDescription(); return res.ToCamelCaseString(); } var task = _taskrepository.GetSingle(p => p.BarCode == stock.ContGrpBarCode); if (task != null) { res.ResCode = ResponseStatusCodeEnum.WcsTaskExist.GetHashCode(); res.ResMsg = item + ResponseStatusCodeEnum.WcsTaskExist.GetDescription(); return res.ToCamelCaseString(); } //分解任务 var it = InsertTaskIn(new TaskRsponse() { BusType = TaskBusType.TaskBusType_HJ_PurchaseSpoolStockIn.GetDescription(), ContGrpBarCode = stock.ContGrpBarCode, ContGrpId = stock.ContGrpId, StartPoint = request.Equip, Size = 1, Remark = stock.MatCode }); if (!it) { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.Fail.GetDescription(); return res.ToCamelCaseString(); } } //var tasks = _billTaskrepository.GetList(p => p.StartPoint == request.Equip && p.BusType == TaskBusType.TaskBusType_HJ_PurchaseSpoolStockIn.GetHashCode().ToString() // && p.TaskState == TaskStatus.WaitingToExecute.GetHashCode()); //tasklist = _mapper.Map>(tasks); } else { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = "RFID:" + string.Join(',', request.RFIDBarCode) + "业务类型错误"; return res.ToCamelCaseString(); } } catch (Exception ex) { _logger.LogInformation("任务下发失败:" + ex.Message); res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.Fail.GetDescription(); return res.ToCamelCaseString(); } return res.ToCamelCaseString(); } public bool InsertTaskIn(TaskRsponse task) { var bar = _baseContinfo.GetSingle(p => p.ContBarCode == task.ContGrpBarCode); if (bar == null) { return false; } var ware = _basewarehouserepository.GetSingle(p => p.Id == bar.WarehouseId); if (ware == null) { return false; } try { string tun = ""; string srm = ""; if (task.StartPoint == "1025") { tun = "TY3"; srm = "SRM3"; } if (task.StartPoint == "1023") { tun = "TY2"; srm = "SRM2"; } if (task.StartPoint == "1021") { tun = "TY1"; srm = "SRM1"; } if (task.StartPoint == "1127") { tun = "TY4"; srm = "SRM4"; } WCS_TaskInfo billTask = new WCS_TaskInfo(); billTask.Status = TaskStatus.NewBuild; billTask.Type = TaskType.EmptyInit; billTask.Priority = 0; billTask.Device = srm; billTask.SrmStation = task.StartPoint; billTask.AddrFrom = task.StartPoint; billTask.BarCode = task.ContGrpBarCode; billTask.StartTime = DateTime.Now; billTask.AddWho = "wms"; billTask.WarehouseCode = ware.Code; billTask.Enabled = true; billTask.WorkBench = task.StartPoint; billTask.AddrTo = ""; billTask.Floor = 2; billTask.Tunnel = tun; billTask.PalletType = 1; billTask.AddTime = DateTime.Now; billTask.EditTime = DateTime.Now; billTask.MaterialCode = task.Remark; billTask.MatCode = task.Remark; billTask.BusType = task.BusType; _db.BeginTran(); var wcs = _taskrepository.InsertReturnEntity(billTask); var wcshistory = _mapper.Map(wcs); _wcstaskoldrepository.InsertableSplitTable(wcshistory); var taskdetail = new WCS_TaskDtl() { ID = Guid.NewGuid(), CurPoint = task.StartPoint, AddTime = DateTime.Now, AddWho = "wms", Enabled = true, ParentTaskCode = wcs.ID, Desc = task.StartPoint + "空轮入库", }; _taskdetailrepository.InsertableSplitTable(taskdetail); _db.CommitTran(); } catch (Exception ex) { _db.RollbackTran(); return false; } return true; } public List GetPushDatelistAuto(PushDate request) { var list = _billPushinforepository.GetList(p => p.PostResult != 1 && p.PostQty <= 5 && p.TypeCode == request.Type).OrderBy(p => p.AddTime).Take(1).ToList(); if (!list.Any()) { } //List pushlist = new List(); //PushRequest push = new PushRequest(); //ListInfo info = new ListInfo(); //foreach (var item in list) //{ // var ware = _basewarehouserepository.GetSingle(p => p.Code == item.WarehouseCode); // info.RFID = item.RFIDBarCode; // info.MatBarCode = item.CLBarCode; // info.MatCode = item.MatCode; // info.TolWeight = item.TolWQty; // info.NetWeight = item.NetWQty; // info.TareWeight = item.TareWQty; // info.LocCode = item.WareCellCode; // info.WareCode = item.WarehouseCode; // info.WareName = ware.Name; // push.list.Add(_mapper.Map(info)); //} //pushlist = _mapper.Map>(push.list); return list; } /// /// 手动推送查询 /// /// /// public List GetPushDatelistMannel(PushDate request) { return _billPushinforepository.GetList(p => p.PostResult != 1 && request.CLBarCode.Contains(p.CLBarCode)).ToList(); } public bool UpdatePushModelColumns(UpdateModelColumns updateModel) { return _billPushinforepository.Update(updateModel.Columns, updateModel.WhereExpression); } /// /// 添加空轮 /// /// /// private bool InsertContInfo(string code) { try { BaseContinfo barcode = new BaseContinfo(); barcode.ContBarCode = code; barcode.TypeCode = ContainerType.ContainerType_RFID.ToString(); barcode.PrintQty = 1; barcode.WarehouseId = 1668442390064664576; barcode.Name = "空容器"; barcode.WeightQty = 158; _baseContinfo.Insert(barcode); } catch (Exception ex) { return false; } return true; } /// /// agv搬运任务(空轮入库) /// /// /// public string AgvCarryTaskInfo(AgvTaskInfoRequest request) { var res = new SRes(); //if (!Const.Equip.Contains(request.StartEquip)) //{ // res.ResCode = ResponseStatusCodeEnum.EquipInfoNotExist.GetHashCode(); // res.ResMsg = ResponseStatusCodeEnum.EquipInfoNotExist.GetDescription(); // return res.ToCamelCaseString(); //} try { WCS_TaskInfo billTask = new WCS_TaskInfo(); billTask.Status = TaskStatus.NewBuild; billTask.Type = TaskType.Delivery; billTask.Priority = 0; billTask.Device = "srm"; billTask.SrmStation = ""; billTask.AddrFrom = request.StartEquip; billTask.BarCode = DateTime.Now.ToString("yyyyMMddHHmmssffff"); billTask.StartTime = DateTime.Now; billTask.AddWho = "wms"; billTask.WarehouseCode = "hjhouse"; billTask.Enabled = true; billTask.WorkBench = request.StartEquip; billTask.AddrTo = request.EndEquip; billTask.Floor = 1; billTask.PalletType = 1; _db.BeginTran(); var wcs = _taskrepository.InsertReturnEntity(billTask); var wcshistory = _mapper.Map(wcs); _wcstaskoldrepository.InsertableSplitTable(wcshistory); var taskdetail = new WCS_TaskDtl() { ID = Guid.NewGuid(), CurPoint = request.StartEquip, AddTime = DateTime.Now, AddWho = "wms", Enabled = true, ParentTaskCode = wcs.ID, Desc = request.StartEquip + "AGV空轮搬运任务", }; _taskdetailrepository.InsertableSplitTable(taskdetail); _db.CommitTran(); } catch (Exception ex) { _db.RollbackTran(); _logger.LogInformation("AGV搬运任务下发失败:" + ex.Message); res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.Fail.GetDescription(); return res.ToCamelCaseString(); } return res.ToCamelCaseString(); } /// /// 取消/完成任务验证(只验证不做业务处理) /// /// /// public SRes CancelTaskVerify(CancelTaskRequest request) { var res = new SRes(); if (!request.TaskNo.Any()) { res.ResCode = ResponseStatusCodeEnum.ErrParamNotNull.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.ErrParamNotNull.GetDescription(); return res; } foreach (var item in request.TaskNo) { var task = _wcstaskoldrepository.AsQueryable().Where(p => p.ID == item).SplitTable(p => p.Take(2)).First(); if (task == null) { res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode(); res.ResMsg = item + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription(); return res; } if (task.Type == TaskType.EnterDepot) { //验证组盘状态 var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == task.BarCode); if (stock == null) { res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode(); res.ResMsg = task.BarCode + ResponseStatusCodeEnum.StockNotExist.GetDescription(); return res; } if (request.State == HandleTaskTypeEnum.完成任务) { if (stock.InvStateCode != InvState.InvEcecState_BuildUp.ToString()) { res.ResCode = ResponseStatusCodeEnum.RFIDStockStateFail.GetHashCode(); res.ResMsg = stock.ContGrpBarCode + "不是已组盘状态,不允许完成"; return res; } if (stock.InvStateCode == InvState.InvEcecState_In.ToString()) { res.ResCode = ResponseStatusCodeEnum.StockStateFail.GetHashCode(); res.ResMsg = stock.ContGrpBarCode + ResponseStatusCodeEnum.StockStateFail.GetDescription(); return res; } } else if (request.State == HandleTaskTypeEnum.取消任务) { if (stock.InvStateCode == InvState.InvEcecState_In.ToString()) { res.ResCode = ResponseStatusCodeEnum.StockStateFail.GetHashCode(); res.ResMsg = stock.ContGrpBarCode + ResponseStatusCodeEnum.StockStateFail.GetDescription(); return res; } } } else if (task.Type == TaskType.OutDepot) { //验证组盘状态 var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == task.BarCode); if (stock == null) { res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode(); res.ResMsg = task.BarCode + ResponseStatusCodeEnum.StockNotExist.GetDescription(); return res; } if (request.State == HandleTaskTypeEnum.完成任务) { if (stock.InvStateCode != InvState.InvEcecState_OutGoing.ToString()) { res.ResCode = ResponseStatusCodeEnum.StockStateFail.GetHashCode(); res.ResMsg = stock.ContGrpBarCode + "当前的组盘状态不是出库中,不允许完成"; return res; } } else if (request.State == HandleTaskTypeEnum.取消任务) { var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == stock.ContGrpBarCode); if (cell == null) { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = stock + ResponseStatusCodeEnum.Fail.GetDescription() + "堆垛机已放货完成,不支持取消"; return res; } if (stock.InvStateCode == InvState.InvEcecState_Out.ToString()) { res.ResCode = ResponseStatusCodeEnum.StockStateFail.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.StockStateFail.GetDescription(); return res; } } } else if (task.Type == TaskType.EmptyInit) { //验证组盘状态 var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == task.BarCode); if (stock == null) { res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode(); res.ResMsg = task.BarCode + ResponseStatusCodeEnum.StockNotExist.GetDescription(); return res; } if (request.State == HandleTaskTypeEnum.完成任务) { if (stock.InvStateCode != InvState.InvEcecState_BuildUp.ToString()) { res.ResCode = ResponseStatusCodeEnum.RFIDStockStateFail.GetHashCode(); res.ResMsg = stock.ContGrpBarCode + "不是已组盘状态,不允许完成"; return res; } if (stock.InvStateCode == InvState.InvEcecState_In.ToString()) { res.ResCode = ResponseStatusCodeEnum.StockStateFail.GetHashCode(); res.ResMsg = stock.ContGrpBarCode + ResponseStatusCodeEnum.StockStateFail.GetDescription(); return res; } } else if (request.State == HandleTaskTypeEnum.取消任务) { if (stock.InvStateCode == InvState.InvEcecState_In.ToString()) { res.ResCode = ResponseStatusCodeEnum.StockStateFail.GetHashCode(); res.ResMsg = stock.ContGrpBarCode + ResponseStatusCodeEnum.StockStateFail.GetDescription(); return res; } } } else if (task.Type == TaskType.TransferDepot) { //验证组盘状态 var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == task.BarCode); if (stock == null) { res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode(); res.ResMsg = task.BarCode + ResponseStatusCodeEnum.StockNotExist.GetDescription(); return res; } if (request.State == HandleTaskTypeEnum.完成任务) { if (stock.InvStateCode != InvState.InvEcecState_In.ToString()) { res.ResCode = ResponseStatusCodeEnum.RFIDStockStateFail.GetHashCode(); res.ResMsg = stock.ContGrpBarCode + "移库任务组盘信息不是已入库,不允许完成"; return res; } } //else if (request.State == HandleTaskTypeEnum.取消任务) //{ // if (stock.InvStateCode != InvState.InvEcecState_In.ToString()) // { // res.ResCode = ResponseStatusCodeEnum.StockStateFail.GetHashCode(); // res.ResMsg = stock.ContGrpBarCode + "移库任务组盘信息不是已入库,不允许取消"; // return res; // } //} } else if (task.Type == TaskType.Delivery) { return res; } } return res; } public SRes CarryTaskInfo(CancelTaskRequest request) { var res = new SRes(); if (!request.TaskNo.Any()) { res.ResCode = ResponseStatusCodeEnum.ErrParamNotNull.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.ErrParamNotNull.GetDescription(); return res; } foreach (var item in request.TaskNo) { var task = _wcstaskoldrepository.AsQueryable().Where(p => p.ID == item).SplitTable(p => p.Take(2)).First(); if (task == null) { res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode(); res.ResMsg = item + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription(); return res; } if (request.State == HandleTaskTypeEnum.完成任务) { var con = CompleteTask(new CompleteTaskRequest() { TaskNum = task.ID, OperationType = 2, WCSUpdateName = "手动完成任务", Memo1 = "", Memo2 = "" }); if (con.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode()) { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = task.ID + "任务完成" + ResponseStatusCodeEnum.Fail.GetDescription(); return res; } } if (request.State == HandleTaskTypeEnum.取消任务) { var con = CancelTask(new CompleteTaskRequest() { TaskNum = task.ID, OperationType = 2, WCSUpdateName = "手动取消任务", Memo1 = "", Memo2 = "" }); if (con.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode()) { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = task.ID + "任务取消" + ResponseStatusCodeEnum.Fail.GetDescription(); return res; } } } return res; } /// /// 获取一小时里的出库锁货位 /// /// public List GetOutStateList() { var list = _basewarecellrepository.GetList(p => p.StateNum == LocationState.LocationState_StockOut.GetHashCode() && int.Parse((DateTime.Now - p.EditTime).TotalHours.ToString("f2")) >= 1); return list; } public List GetTaskHistoryByCode(List codes) { return _wcstaskoldrepository.AsQueryable().Where(p => codes.Contains(p.BarCode)).SplitTable(p => p.Take(2)).ToList(); } public SRes ForceCancelTask(WebErrorRequest request) { var res = new SRes(); if (string.IsNullOrEmpty(request.TaskNo)) { res.ResCode= ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.Fail.GetDescription(); return res; } var task = _taskrepository.GetSingle(p => p.ID == int.Parse(request.TaskNo)); if (task == null) { res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription(); _wcstaskoldrepository.AsUpdateable(new WCS_TaskOld() { Status = TaskStatus.Cancel, EditTime = DateTime.Now, AddWho = "wms", EditWho = "WCS" }).Where(p => p.ID == int.Parse(request.TaskNo)).SplitTable(p => p.Take(2)).ExecuteCommand(); return res; } //var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == task.BarCode); //if (stock == null) //{ // res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode(); // res.ResMsg = ResponseStatusCodeEnum.StockNotExist.GetDescription(); // return res; //} if (_taskrepository.Delete(p => p.ID == int.Parse(request.TaskNo))) { _wcstaskoldrepository.AsUpdateable(new WCS_TaskOld() { Status = TaskStatus.Cancel, EditTime = DateTime.Now, AddWho = "wms", EditWho = "WCS" }).Where(p => p.ID == task.ID).SplitTable(p => p.Take(2)).ExecuteCommand(); //_billInvnowrepository.Delete(p => p.ContGrpBarCode == task.BarCode); //var flow = _billInvflow.AsQueryable().Where(p => p.ContGrpBarCode == task.BarCode).OrderByDescending(p => p.AddTime).First(); //_billInvflow.UpdateSetColumnsTrue(p => new BillInvflow() //{ // InvStateCode = InvState.InvEcecState_Out.ToString(), // EditTime = DateTime.Now, // Memo = "强制取消任务" //}, p => p.Id == flow.Id); } return res; } public SRes DeleteStockInfo(DetailCodeRequest request) { var res = new SRes(); var stock = _billInvnowrepository.AsQueryable().Where(p => p.ContGrpBarCode == request.Code).OrderBy(p => p.AddTime).ToList(); if (stock.Count() > 1) { var stock1 = stock.First(); _billInvnowrepository.Delete(p => p.Id == stock1.Id); //_billInvflow.UpdateSetColumnsTrue(p => new BillInvflow() //{ // EditTime = DateTime.Now, // Memo = "异常处理库存" //}, p => p.ContGrpBarCode == stock1.ContGrpBarCode); } else { if (stock.First().InvStateCode == InvState.InvEcecState_In.ToString()) { res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode(); res.ResMsg = "已入库的不允许删除"; return res; } _billInvnowrepository.Delete(p => p.ContGrpBarCode == stock.Select(p => p.ContGrpBarCode).First()); _billInvinitrepository.Delete(p => p.ContGrpBarCode == stock.Select(p => p.ContGrpBarCode).First()); var flow = _billInvflow.AsQueryable().Where(p => p.ContGrpBarCode == stock.Select(p => p.ContGrpBarCode).First()).OrderByDescending(p => p.AddTime).First(); _billInvflow.UpdateSetColumnsTrue(p => new BillInvflow() { InvStateCode = InvState.InvEcecState_Out.ToString(), EditTime = DateTime.Now, Memo = "异常处理库存" }, p => p.Id == flow.Id); } return res; } public SRes UpdateStockState(DetailCodeRequestdto request) { var res = new SRes(); var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == request.Code); if (stock == null) { res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.StockNotExist.GetDescription(); return res; } var status = ""; if (request.State == InvState.InvEcecState_BuildUp.GetHashCode()) { status = InvState.InvEcecState_BuildUp.ToString(); } else if (request.State == InvState.InvEcecState_In.GetHashCode()) { status = InvState.InvEcecState_In.ToString(); } else if (request.State == InvState.InvEcecState_Out.GetHashCode()) { status = InvState.InvEcecState_Out.ToString(); } else if (request.State == InvState.InvEcecState_OutGoing.GetHashCode()) { status = InvState.InvEcecState_OutGoing.ToString(); } else { res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode(); res.ResMsg = "状态" + ResponseStatusCodeEnum.ErrParam.GetDescription(); return res; } try { var p = _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow() { InvStateCode = status, EditTime = DateTime.Now }, p => p.ContGrpBarCode == stock.ContGrpBarCode); if (!p) { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.Fail.GetDescription(); return res; } var flow = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == request.Code); flow.Id = GetId(); flow.AddTime = DateTime.Now; flow.EditTime = DateTime.Now; _billInvflow.Insert(_mapper.Map(flow)); } catch (Exception ex) { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.Fail.GetDescription() + ex.Message; return res; } return res; } public SRes UpdateCellState(DetailCodeRequestdto request) { var res = new SRes(); var cell = _basewarecellrepository.GetSingle(p => p.Code == request.Code); if (cell == null) { res.ResCode = ResponseStatusCodeEnum.WareLocationCodeNotExist.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.WareLocationCodeNotExist.GetDescription(); return res; } _basewarecellrepository.UpdateSetColumnsTrue(p => new BaseWarecell() { StateNum = request.State, EditTime = DateTime.Now }, p => p.Code == request.Code); return res; } public SRes DataSwapCell(DataSwapCellRequest request) { var res = new SRes(); var fromCell = _basewarecellrepository.GetSingle(p => p.Code == request.StatEquip); if (fromCell == null) { res.ResCode = ResponseStatusCodeEnum.WareLocationCodeNotExist.GetHashCode(); res.ResMsg = request.StatEquip + ResponseStatusCodeEnum.WareLocationCodeNotExist.GetDescription(); return res; } if (fromCell.StateNum != LocationState.LocationState_Full.GetHashCode()) { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = request.StatEquip + "货位不是有货状态,不允许互换"; return res; } var fromstock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == fromCell.ContGrpBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString()); if (fromstock == null) { res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode(); res.ResMsg = request.StatEquip + ResponseStatusCodeEnum.StockNotExist.GetDescription(); return res; } var toCell = _basewarecellrepository.GetSingle(p => p.Code == request.EndEquip); if (toCell == null) { res.ResCode = ResponseStatusCodeEnum.WareLocationCodeNotExist.GetHashCode(); res.ResMsg = request.EndEquip + ResponseStatusCodeEnum.WareLocationCodeNotExist.GetDescription(); return res; } if (toCell.StateNum != LocationState.LocationState_Full.GetHashCode()) { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = request.EndEquip + "货位不是有货状态,不允许互换"; return res; } var tostock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == toCell.ContGrpBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString()); if (tostock == null) { res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode(); res.ResMsg = request.EndEquip + ResponseStatusCodeEnum.StockNotExist.GetDescription(); return res; } try { _db.BeginTran(); _basewarecellrepository.UpdateSetColumnsTrue(p => new BaseWarecell() { ContGrpBarCode = fromCell.ContGrpBarCode, ContGrpId = fromCell.ContGrpId, Memo = "和库位"+ fromCell.Code+"数据互手动互换" }, p => p.Code == toCell.Code); _basewarecellrepository.UpdateSetColumnsTrue(p => new BaseWarecell() { ContGrpBarCode = toCell.ContGrpBarCode, ContGrpId = toCell.ContGrpId, Memo = "和库位" + toCell.Code + "数据互手动互换" }, p => p.Code == fromCell.Code); _billInvnowrepository.UpdateModelColumns(p => new BillInvnow() { PutRow = toCell.Row, PutCol = toCell.Col, PutLayer = toCell.Layer }, p => p.ContGrpBarCode == fromCell.ContGrpBarCode); _billInvnowrepository.UpdateModelColumns(p => new BillInvnow() { PutRow = fromCell.Row, PutCol = fromCell.Col, PutLayer = fromCell.Layer }, p => p.ContGrpBarCode == toCell.ContGrpBarCode); _db.CommitTran(); } catch (Exception ex) { _db.RollbackTran(); res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.Fail.GetDescription() + ex.Message; return res; } return res; } /// /// 补数据 /// /// /// public SRes DataBasePatch(DetailCodeRequest request) { var res = new SRes(); var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == request.Code); if (stock != null) { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = request.Code + "存在组盘信息,不允许补数据"; return res; } var flow = _billInvflow.AsQueryable().Where(p => p.ContGrpBarCode == request.Code && p.ContGrpType == request.ContGrpType).OrderByDescending(p => p.EditTime).First(); if (flow == null) { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = request.Code + "不存在流水信息,不允许补数据"; return res; } var cell = _basewarecellrepository.GetSingle(p => p.Code == request.Cell); if (cell == null) { res.ResCode = ResponseStatusCodeEnum.WareLocationCodeNotExist.GetHashCode(); res.ResMsg = request.Cell + ResponseStatusCodeEnum.WareLocationCodeNotExist.GetDescription(); return res; } if (cell.StateNum != LocationState.LocationState_Empty.GetHashCode()) { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = request.Cell + "货位状态不是空货位,不允许补数据"; return res; } try { if (flow.ContGrpType == ContGrpType.Material.GetHashCode()) { flow.InvStateCode = InvState.InvEcecState_In.ToString(); flow.Id = GetId(); flow.AddTime = DateTime.Now; flow.EditTime = DateTime.Now; flow.PutRow = cell.Row; flow.PutCol = cell.Col; flow.PutLayer = cell.Layer; flow.AddWho = "wms"; flow.EditWho = "wms"; flow.Memo = "手动补数据"; flow.AddTime = DateTime.Now; flow.OneInTime = DateTime.Now; string pushtype = FackbeekType.InterfaceType_HJ_1F_StockIn.ToString(); if (flow.IsBack) { pushtype = FackbeekType.InterfaceType_HJ_2F_BackStockIn.ToString(); } else if (flow.IsSurplus) { pushtype = FackbeekType.InterfaceType_HJ_2F_LeftStockIn.ToString(); } var location = cell.Code.Split('-'); var push = new BillPushinfo() { DocsNo = flow.ExecDocsNo, TypeCode = pushtype, RFIDBarCode = flow.ContGrpBarCode, HWBarCode = flow.ContGrpBarCode, CLBarCode = flow.CLBarCode, WarehouseId = flow.WarehouseId, WarehouseCode = "hjhouse", WareCellId = 0, WareCellCode = location[0] + "-" + location[1] + "-" + location[2], MatId = flow.MatId, MatCode = flow.MatCode, MatName = flow.MatName, TolWQty = flow.TolWQty, NetWQty = flow.NetWQty, TareWQty = flow.TareWQty, ReqNo = Guid.NewGuid().ToString() }; _db.BeginTran(); _billInvnowrepository.Insert(_mapper.Map(flow)); _billInvflow.Insert(flow); _basewarecellrepository.UpdateSetColumnsTrue(p => new BaseWarecell() { ContGrpBarCode = flow.ContGrpBarCode, ContGrpId = flow.ContGrpId, StateNum = LocationState.LocationState_Full.GetHashCode(), IsStop = 0, EditTime = DateTime.Now }, p => p.Code == cell.Code); _billPushinforepository.Insert(push); _db.CommitTran(); } else { flow.InvStateCode = InvState.InvEcecState_In.ToString(); flow.Id = GetId(); flow.AddTime = DateTime.Now; flow.EditTime = DateTime.Now; flow.PutRow = cell.Row; flow.PutCol = cell.Col; flow.PutLayer = cell.Layer; flow.AddWho = "wms"; flow.EditWho = "wms"; flow.Memo = "手动补数据"; flow.OneInTime = DateTime.Now; var location = cell.Code.Split('-'); _db.BeginTran(); _billInvnowrepository.Insert(_mapper.Map(flow)); _billInvflow.Insert(flow); _basewarecellrepository.UpdateSetColumnsTrue(p => new BaseWarecell() { ContGrpBarCode = flow.ContGrpBarCode, ContGrpId = flow.ContGrpId, StateNum = LocationState.LocationState_Full.GetHashCode(), IsStop = 0, EditTime = DateTime.Now }, p => p.Code == cell.Code); _db.CommitTran(); } } catch (Exception ex) { _db.RollbackTran(); res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.Fail.GetDescription(); return res; } return res; } public SRes TransStock(DataSwapCellRequest request) { var res = new SRes(); var fromCell = _basewarecellrepository.GetSingle(p => p.Code == request.StatEquip); if (fromCell == null) { res.ResCode = ResponseStatusCodeEnum.WareLocationCodeNotExist.GetHashCode(); res.ResMsg = request.StatEquip + ResponseStatusCodeEnum.WareLocationCodeNotExist.GetDescription(); return res; } if (fromCell.StateNum != LocationState.LocationState_Full.GetHashCode()) { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = request.StatEquip + "货位不是有货状态,不允许转移数据"; return res; } var fromstock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == fromCell.ContGrpBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString()); if (fromstock == null) { res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode(); res.ResMsg = request.StatEquip + ResponseStatusCodeEnum.StockNotExist.GetDescription(); return res; } var toCell = _basewarecellrepository.GetSingle(p => p.Code == request.EndEquip); if (toCell == null) { res.ResCode = ResponseStatusCodeEnum.WareLocationCodeNotExist.GetHashCode(); res.ResMsg = request.EndEquip + ResponseStatusCodeEnum.WareLocationCodeNotExist.GetDescription(); return res; } if (toCell.StateNum != LocationState.LocationState_Empty.GetHashCode()) { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = request.EndEquip + "货位不是空货位,不允许转移数据"; return res; } try { _db.BeginTran(); _basewarecellrepository.UpdateSetColumnsTrue(p => new BaseWarecell() { ContGrpBarCode = fromCell.ContGrpBarCode, ContGrpId = fromCell.ContGrpId, StateNum = LocationState.LocationState_Full.GetHashCode() }, p => p.Code == toCell.Code); _basewarecellrepository.UpdateSetColumnsTrue(p => new BaseWarecell() { ContGrpBarCode = "", ContGrpId = 0, StateNum = LocationState.LocationState_Empty.GetHashCode() }, p => p.Code == fromCell.Code); _billInvnowrepository.UpdateModelColumns(p => new BillInvnow() { PutRow = toCell.Row, PutCol = toCell.Col, PutLayer = toCell.Layer, Memo = "手动从"+ fromCell.Code + "转移数据" }, p => p.ContGrpBarCode == fromCell.ContGrpBarCode); _db.CommitTran(); } catch (Exception ex) { _db.RollbackTran(); res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.Fail.GetDescription() + ex.Message; _logger.LogInformation(ex.ToString()); return res; } return res; } public SRes MonitorLeftStock(WebErrorRequest request) { var res = new SRes() { ResDataList = new List() }; var histasklist = _wcstaskoldrepository.AsQueryable().SplitTable(tabs => tabs.Take(2)).Where(p => p.Status == TaskStatus.Finish && p.EndTime > DateTime.Now.AddHours(-1)).ToList(); if (histasklist != null && histasklist.Any()) { foreach (var histask in histasklist) { var stock = _billInvnowrepository.GetFirst(p => p.ContGrpBarCode == histask.BarCode); if (stock != null) { if (histask.Type == TaskType.EnterDepot && stock.InvStateCode == InvState.InvEcecState_BuildUp.ToString() && histask.AddTime.Date == stock.AddTime.Date) { CompleteTask(new CompleteTaskRequest() { TaskNum = histask.ID, OperationType = 2, WCSUpdateName = "监控处理残留", Memo1 = "监控处理残留", Memo2 = "监控处理残留" }); } else if (histask.Type == TaskType.OutDepot && stock.InvStateCode == InvState.InvEcecState_OutGoing.ToString() && histask.AddTime.Date == stock.EditTime.Date) { CompleteTask(new CompleteTaskRequest() { TaskNum = histask.ID, OperationType = 2, WCSUpdateName = "监控处理残留", Memo1 = "监控处理残留", Memo2 = "监控处理残留" }); } else if (histask.Type == TaskType.TransferDepot) { if (_basewarecellrepository.GetSingle(p => p.Code == histask.AddrFrom).StateNum == LocationState.LocationState_StockMove.GetHashCode()) { CompleteTask(new CompleteTaskRequest() { TaskNum = histask.ID, OperationType = 2, WCSUpdateName = "监控处理残留", Memo1 = "监控处理残留", Memo2 = "监控处理残留" }); } } } } } return res; } /// /// agv状态同步接口 /// /// 请求信息 /// public AgvCallbackResponse AgvCallback(AgvCallbackRequest reqDto) { var res = new AgvCallbackResponse() { code = AgvResponseCode.Error, message = "失败" }; try { if (reqDto.method == "error" || reqDto.method == "start") { res.code = AgvResponseCode.Success; res.message = "成功"; return res; } _db.BeginTran(); //跟据AGVid找到对应的AGV任务 var agvTask = _agvTaskInforepository.AsQueryable().With(SqlWith.RowLock).SplitTable(tabs => tabs.Take(2)) .First(v => v.AgvID == reqDto.taskCode && v.Status < WCS.Entity.AGVTaskStatus.MissionCompleted); if (agvTask == null) { _db.RollbackTran(); if (reqDto.method == "end_1" || reqDto.method == "hjend_2" || reqDto.method == "endhjBM" || reqDto.method == "end" || reqDto.method == "tcEnd" || reqDto.method == "exc_end" || reqDto.method == "cancel") { res.code = AgvResponseCode.Success; res.message = "成功"; } else { res.code = AgvResponseCode.Fail; res.message = "未找到对应的AGV任务"; } return res; } switch (reqDto.method) { case "applyContinue": //表示手动调用请求巷道 agvTask.AgvStatus = WCS.Entity.AGVTaskStatus.RequestOrPermission1; break; case "applyContinueManaual": //表示请求巷道 agvTask.AgvStatus = WCS.Entity.AGVTaskStatus.RequestOrPermission1; agvTask.Status = WCS.Entity.AGVTaskStatus.Confirm; break; case "applySecurity": //表示请求放货或取货 agvTask.AgvStatus = WCS.Entity.AGVTaskStatus.RequestOrPermission2; break; case "end_1": //一楼出满任务完成 agvTask.AgvStatus = WCS.Entity.AGVTaskStatus.MissionCompleted; break; case "hjend_2": //补空任务完成 agvTask.AgvStatus = WCS.Entity.AGVTaskStatus.MissionCompleted; break; case "endhjBM": //取满任务完成 agvTask.AgvStatus = WCS.Entity.AGVTaskStatus.MissionCompleted; break; case "end": //二楼出满任务完成 agvTask.AgvStatus = WCS.Entity.AGVTaskStatus.MissionCompleted; break; case "tcEnd": //机台补空任务完成 agvTask.AgvStatus = WCS.Entity.AGVTaskStatus.MissionCompleted; break; case "exc_end": //异常信息上抛-值不匹配 agvTask.AgvStatus = WCS.Entity.AGVTaskStatus.MissionCompleted; break; case "outbin": //小车退出取货位 agvTask.AgvStatus = WCS.Entity.AGVTaskStatus.Complete3; break; case "cancel": //取消任务 //agvTask.AgvStatus = AGVTaskStatus.Cancel; break; default: break; } //更新agv任务状态 if (!_agvTaskInforepository.UpdateSplitTableModelColumns(x => new WCS.Entity.WCS_AgvTaskInfo() { AgvStatus = agvTask.AgvStatus }, x => x.ID == agvTask.ID && x.AgvID == agvTask.AgvID)) { _db.RollbackTran(); res.code = AgvResponseCode.Fail; res.message = $"agv任务{agvTask.AgvID}更新状态至{agvTask.AgvStatus}失败"; return res; } _db.CommitTran(); res.code = AgvResponseCode.Success; res.message = "成功"; } catch (Exception ex) { _db.RollbackTran(); res.code = AgvResponseCode.Error; res.message = ex.Message; } return res; } public SRes FlowDataMoveJob(PushDate request) { var res = new SRes(); //流水表 try { var flow = _billInvflow.AsQueryable().With(SqlWith.NoLock).Where(p => p.AddTime < DateTime.Now.AddMonths(-6)).OrderBy(p => p.Id).Take(100).ToList(); if (flow.Any()) { var ids = flow.Select(p => p.Id).Distinct().ToList(); var flowhty = _mapper.Map>(flow); if (_flowhtyrepository.AsQueryable().With(SqlWith.NoLock).SplitTable(p => p.Take(2)).Where(p => ids.Contains(p.Id)).Any()) { _flowhtyrepository.Context.Deleteable(p => ids.Contains(p.Id)).SplitTable(x => x.Take(2)).ExecuteCommand(); } _flowhtyrepository.InsertableSplitTable(flowhty); _billInvflow.Delete(p => ids.Contains(p.Id)); } } catch (Exception ex) { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = ex.Message; return res; } //推送表 try { var push = _billPushinforepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.AddTime < DateTime.Now.AddMonths(-6)).OrderBy(p => p.Id).Take(100).ToList(); if (push.Any()) { var ids = push.Select(p => p.Id).Distinct().ToList(); var pushthty = _mapper.Map>(push); if (_pushhtyrepository.AsQueryable().With(SqlWith.NoLock).SplitTable(p => p.Take(2)).Where(p => ids.Contains(p.Id)).Any()) { _pushhtyrepository.Context.Deleteable(p => ids.Contains(p.Id)).SplitTable(x => x.Take(2)).ExecuteCommand(); } _pushhtyrepository.InsertableSplitTable(pushthty); _billPushinforepository.Delete(p => ids.Contains(p.Id)); } } catch (Exception ex) { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = ex.Message; return res; } return res; } } }