using AutoMapper; using Microsoft.Extensions.Logging; using NPOI.SS.Formula; using Org.BouncyCastle.Asn1.Ocsp; using SqlSugar; using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Text; using wms.dataservice.IDataSetvice; using wms.dto; using wms.dto.request; using wms.dto.request.cp; using wms.dto.request.cp.dto; using wms.dto.request.hj.dto; using wms.dto.request.share; using wms.dto.response; using wms.dto.response.cp; using wms.service.IService; using wms.sqlsugar; using wms.sqlsugar.model; using wms.sqlsugar.model.cp; using wms.sqlsugar.model.pt; using wms.util.Check; using wms.util.Ext; namespace wms.service.Service { public class CPService: ICPService { private readonly IMapper _mapper; private readonly ILogger _logger; private readonly ICPDataService _cptDataService; public CPService(IMapper mapper, ILogger logger, ICPDataService cptDataService) { _mapper = mapper; _logger = logger; _cptDataService = cptDataService; } Repository _docrepository => new Repository(); Repository _basecontinfo => new Repository(); Repository _sysconfigrepository => new Repository(); Repository _materrepository => new Repository(); Repository _basewarehouserepository => new Repository(); Repository _baseWarecellrepository => new Repository(); Repository _billinitrepository => new Repository(); Repository _billpushrepository => new Repository(); Repository _billnowrepository => new Repository(); Repository _sysJobrepository => new Repository(); Repository _sysJobApirepository => new Repository(); Repository _billInvFlow => new Repository(); Repository _baseare => new Repository(); RepositoryTask _wcstaskinfo => new RepositoryTask(); RepositoryTask _wcstaskold => new RepositoryTask(); RepositoryTask _wcstaskdtl => new RepositoryTask(); ITenant _db => SqlSugarHelper.Db;//处理事务 /// /// 添加单据 /// /// public bool Add(cpBillDocsinfo 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 cpSysConfig GetSysConfigByCode(string code) { //Repository _billdtrepository = new Repository(); return _sysconfigrepository.GetSingle(p => p.Code == code); } /// /// 获取物料信息 /// /// /// public cpBaseMatinfo GetBaseMaterByExpression(Expression> WhereExpression) { return _materrepository.GetSingle(WhereExpression); } /// /// 获取配置信息 /// /// /// public cpSysConfig GetSysConfigByExpression(Expression> WhereExpression) { return _sysconfigrepository.GetSingle(WhereExpression); } /// /// 获取单据信息 /// /// /// public cpBillDocsinfo GetBillDocumentByExpression(Expression> WhereExpression) { return _docrepository.GetSingle(WhereExpression); } /// /// 获取反馈信息 /// /// /// public List GetBillFeedbackList(Expression> WhereExpression) { return _billpushrepository.GetList(WhereExpression); } ///// ///// 获取单据信息 ///// ///// ///// //public cpBillDocument 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 bool SyncMaterInfo(List ResData) { foreach (var item in ResData) { if (_materrepository.IsAny(p => p.Code == item.MatCode)) { _materrepository.UpdateModelColumns(p => new cpBaseMatinfo() { IsHold = item.IsHold, HoldDuration = item.HoldDuration }, p => p.Code == item.MatCode); } else { var model = _mapper.Map(item); _materrepository.Insert(model); } } return true; } public SRes SpoolMaterialInfoTrans(dto.request.cp.SpoolMaterialInfoTransRequest reqDto) { var result = new SRes(); return result; } public SRes SalesDocTrans(SalesDocTransRequest reqDto) { var result = new SRes(); return result; } public SRes SalesBackDocTrans(SalesDocTransRequest reqDto) { var result = new SRes(); return result; } public SRes ComPushApiResInfo(ComPushApiResInfoRequest reqDto) { var result = new SRes(); return result; } public SRes ErrorMaterialStockOut(dto.request.cp.ErrorMaterialStockOutRequest reqDto) { var result = new SRes(); return result; } public SRes StockChange(CpStockChangeRequest reqDto) { var result = new SRes(); return result; } public StockStateChangeResponse StockStateChange(StockStateChangeRequest reqDto) { var result = new StockStateChangeResponse(); return result; } private long GetId() { return IdFactory.NewId(); } public SRes PdaGroupStock(SouthPdaRequest request) { var result = new SRes(); if (string.IsNullOrEmpty(request.ContGrpBarCode)) { result.ResCode = ResponseStatusCodeEnum.ErrParamNotNull.GetHashCode(); result.ResMsg = ResponseStatusCodeEnum.ErrParamNotNull.GetDescription(); return result; } //var mater = RedisHelper.Get(request.ContGrpBarCode.Substring(0, 3)); var mater = _materrepository.GetSingle(p => request.ContGrpBarCode.Substring(0, 3) == p.Code); if (mater == null) { result.ResCode = ResponseStatusCodeEnum.BaseMaterCodeNotExist.GetHashCode(); result.ResMsg = request.ContGrpBarCode.Substring(0, 3) + "托盘类型不存在"; return result; } var taskold = _wcstaskold.AsQueryable().Where(p => p.BarCode == request.ContGrpBarCode && p.Status < TaskStatus.Finish).SplitTable(p => p.Take(2)).ToList() ; if (taskold.Any()) { result.ResCode = ResponseStatusCodeEnum.WcsTaskExist.GetHashCode(); result.ResMsg = request.ContGrpBarCode + ResponseStatusCodeEnum.WcsTaskExist.GetDescription() + "不允许绑定"; return result; } var BarCode = _billnowrepository.GetSingle(p => p.ContGrpBarCode == request.ContGrpBarCode); if (BarCode != null && BarCode?.InvStateCode == InvState.InvEcecState_In.ToString()) { result.ResCode = ResponseStatusCodeEnum.BarcodeContainerRepeat.GetHashCode(); result.ResMsg = request.ContGrpBarCode + ResponseStatusCodeEnum.BarcodeContainerRepeat.GetDescription(); return result; } if (BarCode != null && BarCode?.InvStateCode == InvState.InvEcecState_BuildUp.ToString()) { result.ResCode = ResponseStatusCodeEnum.GroupStockDetailMaterialBarCodeExist.GetHashCode(); result.ResMsg = request.ContGrpBarCode + ResponseStatusCodeEnum.GroupStockDetailMaterialBarCodeExist.GetDescription(); return result; } if (BarCode != null) { result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); result.ResMsg = request.ContGrpBarCode + "存在库存信息,请先处理遗留的库存信息"; return result; } if (string.IsNullOrEmpty(request.BoxCode)) { //空托盘 var nov = new cpBillInvnow() { WarehouseId = 111111111, ContGrpBarCode = request.ContGrpBarCode, ContGrpId = GetId(), BoxBarCode = request.ContGrpBarCode, InvStateCode = InvState.InvEcecState_BuildUp.ToString(), ExecStateCode = InvLockState.InvState_Normal.ToString(), MatId = mater.Id, MatCode = mater.Code, RFIDBarCode = request.ContGrpBarCode, HWTypeCode = mater.SpoolType, HWBarCode = request.ContGrpBarCode, InvInOut = 1, MatName = mater.Name, Size = 1, ContGrpType = 2, TolWQty = 1 //存放托盘数量 }; try { _db.BeginTran(); _billnowrepository.Insert(nov); _billInvFlow.Insert(_mapper.Map(nov)); _db.CommitTran(); } catch (Exception ex) { _db.RollbackTran(); result.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode(); result.ResMsg = request.ContGrpBarCode + ResponseStatusCodeEnum.DataSaveErr.GetDescription(); return result; } } else { //成品物料 var code = _billinitrepository.AsQueryable().Where(p => p.BoxBarCode == request.BoxCode).ToList(); if (!code.Any()) { result.ResCode = ResponseStatusCodeEnum.BaseBarcodeNotExist.GetHashCode(); result.ResMsg = request.BoxCode + ResponseStatusCodeEnum.BaseBarcodeNotExist.GetDescription(); return result; } var nov = new cpBillInvnow() { WarehouseId = 111111111, ContGrpBarCode = request.ContGrpBarCode, ContGrpId = GetId(), BoxBarCode = request.BoxCode, InvStateCode = InvState.InvEcecState_BuildUp.ToString(), ExecStateCode = InvLockState.InvState_Normal.ToString(), MatId = mater.Id, MatCode = mater.Code, RFIDBarCode = request.ContGrpBarCode, HWTypeCode = mater.SpoolType, HWBarCode = request.ContGrpBarCode, InvInOut = 1, MatName = mater.Name, Size = 1, ContGrpType = 1, TolWQty = 1 }; try { _db.BeginTran(); _billnowrepository.Insert(nov); _billInvFlow.Insert(_mapper.Map(nov)); _db.CommitTran(); } catch (Exception ex) { _db.RollbackTran(); result.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode(); result.ResMsg = request.ContGrpBarCode + ResponseStatusCodeEnum.DataSaveErr.GetDescription(); return result; } } return result; } /// /// 空轮 || 间隔板出库 /// /// /// public SRes PdaTrayTaskOut(TrayGroupOutRequest request) { var result = new SRes(); if (!Const.SouthOutEquip.Contains(request.Equip)) { result.ResCode = ResponseStatusCodeEnum.EquipInfoNotExist.GetHashCode(); result.ResMsg = request.Equip + ResponseStatusCodeEnum.EquipInfoNotExist.GetDescription(); return result; } var MatCode = _materrepository.GetSingle(p => p.Code == request.Code); if (MatCode == null) { result.ResCode = ResponseStatusCodeEnum.BaseMaterCodeNotExist.GetHashCode(); result.ResMsg = request.Code + ResponseStatusCodeEnum.BaseMaterCodeNotExist.GetDescription(); return result; } var ware = _basewarehouserepository.GetSingle(p => p.Id == MatCode.WarehouseId); if (ware == null) { result.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode(); result.ResMsg = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription(); return result; } int type = 0; if (MatCode.Code == "TPA") { type = 2; } else { type = 3; //间隔板类型 } return ApplyTaskOutTem(new StockOutRequest() { MatCode = request.Code, WareCode = ware.Code, TrayType = type, Equip = request.Equip }); } /// /// 空轮、间隔板出库共用方法 /// /// /// private SRes ApplyTaskOutTem(StockOutRequest request) { var res = new SRes(); var locationlist = from loc in _baseWarecellrepository.GetList(p => p.IsStop == 0 && p.StateNum == LocationState.LocationState_Full.GetHashCode()) join stock in _billnowrepository.GetList(p => p.InvStateCode == InvState.InvEcecState_In.ToString() && p.ExecStateCode == InvLockState.InvState_Normal.ToString()) on loc.ContGrpBarCode equals stock.ContGrpBarCode orderby stock.ProductTime select new { stock.MatCode, stock.InvBarCode, stock.RodBarCode, stock.Grade, stock.InvStateCode, stock.ProductTime, loc.Col, loc.Layer, loc.Shelf, loc.Depth, loc.Code, loc.Tunnel, loc.WarehouseCode, loc.ContGrpBarCode, loc.Id, loc.StateNum, stock.ContGrpType, }; if (!string.IsNullOrEmpty(request.MatCode)) { locationlist = locationlist.Where(p => p.MatCode == request.MatCode); } if (!string.IsNullOrEmpty(request.WareCode)) { locationlist = locationlist.Where(p => p.WarehouseCode == request.WareCode); } if (request.TrayType > 0) { locationlist = locationlist.Where(p => p.ContGrpType == request.TrayType).OrderByDescending(p => p.Tunnel); } if (!locationlist.Any() || locationlist == null) { res.ResCode = ResponseStatusCodeEnum.NotEnoughStock.GetHashCode(); res.ResMsg = request.MatCode + "|" + ResponseStatusCodeEnum.NotEnoughStock.GetDescription(); return res; } var location = locationlist.First(); if (location.Depth == 2 && location.InvStateCode == InvState.InvEcecState_In.ToString()) { //获取一深位货位 var loc = locationlist.Where(p => p.Col == location.Col && location.Layer == location.Layer && p.Shelf == location.Shelf && p.Depth == 1 && p.InvStateCode == InvState.InvEcecState_In.ToString()); if (loc != null && loc.Any()) { location = loc.First(); } } var sotck = _billnowrepository.GetFirst(p => p.ContGrpBarCode == location.ContGrpBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString()); try { var wcs = new cpWCS_TaskInfo() { Type = TaskType.OutDepot, Status = TaskStatus.NewBuild, Priority = 0, Device = "SRM" + location.Tunnel, SrmStation = request.Equip, AddrFrom = location.Code, AddrTo = request.Equip, BarCode = location.ContGrpBarCode, Length = sotck.LengthQty, AddTime = DateTime.Now, StartTime = DateTime.Now, DocID = 0, PalletType = 1, ProdLine = 0, AddWho = "wms", WarehouseCode = location.WarehouseCode, Enabled = true, Tunnel = location.Tunnel.ToString(), BusType = request.MatCode == "TPA" ? CpTaskBusType.TaskBusType_CP_TrayStockOut.GetDescription() : CpTaskBusType.TaskBusType_CP_SpacingBoardStockOut.GetDescription(), MatCode = request.MatCode, MaterialCode = request.MatCode, InvBarCode = location.InvBarCode, Grade = sotck.Grade }; var invflow = _mapper.Map(sotck); invflow.InvStateCode = InvState.InvEcecState_OutGoing.ToString(); invflow.AddTime = DateTime.Now; invflow.Id = IdFactory.NewId(); _db.BeginTran(); var task = _wcstaskinfo.InsertReturnEntity(wcs); _wcstaskold.InsertableSplitTable(_mapper.Map(task)); var taskdlt = new cpWCS_TaskDtl() { ID = Guid.NewGuid(), CurPoint = location.Code, AddTime = DateTime.Now, AddWho = "wms", Enabled = true, ParentTaskCode = task.ID, Desc = request.Equip + "空轮间隔板出库", }; _wcstaskdtl.InsertableSplitTable(taskdlt); //货位表 _baseWarecellrepository.UpdateModelColumns(p => new cpBaseWarecell() { StateNum = LocationState.LocationState_StockOut.GetHashCode(), EditTime = DateTime.Now }, p => p.Id == location.Id); //库存表 _billnowrepository.UpdateModelColumns(p => new cpBillInvnow() { InvStateCode = InvState.InvEcecState_OutGoing.ToString(), EditTime = DateTime.Now }, p => p.Id == sotck.Id); _billInvFlow.Insert(invflow); _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 InsertWCSInTask(TrayGroupOutRequest request) { var result = new SRes(); if (string.IsNullOrEmpty(request.Code) || string.IsNullOrEmpty(request.Equip)) { result.ResCode = ResponseStatusCodeEnum.ErrParamNotNull.GetHashCode(); result.ResMsg = ResponseStatusCodeEnum.ErrParamNotNull.GetDescription(); return result; } if (!Const.CpTaskInEquip.Contains(request.Equip)) { result.ResCode = ResponseStatusCodeEnum.EquipInfoNotExist.GetHashCode(); result.ResMsg = request.Equip + ResponseStatusCodeEnum.EquipInfoNotExist.GetDescription(); return result; } var taskold = _wcstaskold.AsQueryable().Where(p => p.BarCode == request.Code && p.Status < TaskStatus.Finish).SplitTable(p => p.Take(2)).First(); if (taskold != null && taskold.Type == TaskType.OutDepot) { result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); result.ResMsg = request.Code + "存在上一个未结束的出库任务,不允许创建入库任务"; return result; } if (taskold != null) { result.ResCode = ResponseStatusCodeEnum.WcsTaskExist.GetHashCode(); result.ResMsg = request.Code + ResponseStatusCodeEnum.WcsTaskExist.GetDescription(); return result; } var stock = _billnowrepository.AsQueryable().Where(p => p.ContGrpBarCode == request.Code).First(); if (stock == null) { result.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode(); result.ResMsg = request.Code + ResponseStatusCodeEnum.StockNotExist.GetDescription(); return result; } if (stock.InvStateCode != InvState.InvEcecState_BuildUp.ToString()) { result.ResCode = ResponseStatusCodeEnum.StockStateFail.GetHashCode(); result.ResMsg = request.Code + ResponseStatusCodeEnum.StockStateFail.GetDescription(); } var ware = _basewarehouserepository.GetSingle(p => p.Id == stock.WarehouseId); if (ware == null) { result.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode(); result.ResMsg = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription(); return result; } var BusType = ""; switch (request.Equip) { case "1011": if (stock.ContGrpType == 1) { BusType = CpTaskBusType.TaskBusType_CP_ProductStockIn.ToString(); } else if (stock.ContGrpType == 2) { BusType = CpTaskBusType.TaskBusType_CP_TrayStockIn.ToString(); } else if (stock.ContGrpType == 3) { BusType = CpTaskBusType.TaskBusType_CP_SpacingBoardStockIn.ToString(); } break; default: break; } if (BusType == CpTaskBusType.TaskBusType_CP_TrayStockIn.ToString()) { var task = new cpWCS_TaskInfo() { Status = TaskStatus.NewBuild, Type = TaskType.EnterDepot, Priority = 0, Device = request.Equip, SrmStation = request.Equip, AddrFrom = request.Equip, BarCode = request.Code, StartTime = DateTime.Now, AddTime = DateTime.Now, EditTime = DateTime.Now, AddWho = "wms", EditWho = "wms", WarehouseCode = ware.Code, AddrTo = "", Tunnel = "", MaterialCode = stock.MatCode, MatCode = stock.MatCode, BusType = CpTaskBusType.TaskBusType_CP_TrayStockIn.GetDescription() }; try { _db.BeginTran(); var task1 = _wcstaskinfo.InsertReturnEntity(task); _wcstaskold.InsertableSplitTable(_mapper.Map(task1)); var wcsdetail = new cpWCS_TaskDtl() { ID = Guid.NewGuid(), CurPoint = request.Equip, AddTime = DateTime.Now, AddWho = "wms", Enabled = true, ParentTaskCode = task1.ID, Desc = task1.BusType }; _wcstaskdtl.InsertableSplitTable(wcsdetail); _db.CommitTran(); } catch (Exception ex) { _db.RollbackTran(); result.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode(); result.ResMsg = request.Code + ResponseStatusCodeEnum.DataSaveErr.GetDescription(); return result; } } else if (BusType == CpTaskBusType.TaskBusType_CP_ProductStockIn.ToString()) { var task = new cpWCS_TaskInfo() { Status = TaskStatus.NewBuild, Type = TaskType.EnterDepot, Priority = 0, Device = request.Equip, SrmStation = request.Equip, AddrFrom = request.Equip, BarCode = request.Code, StartTime = DateTime.Now, AddTime = DateTime.Now, EditTime = DateTime.Now, AddWho = "wms", EditWho = "wms", WarehouseCode = ware.Code, AddrTo = "", Tunnel = "", MaterialCode = stock.MatCode, MatCode = stock.MatCode, BusType = CpTaskBusType.TaskBusType_CP_ProductStockIn.GetDescription() }; try { _db.BeginTran(); var task1 = _wcstaskinfo.InsertReturnEntity(task); _wcstaskold.InsertableSplitTable(_mapper.Map(task1)); var wcsdetail = new cpWCS_TaskDtl() { ID = Guid.NewGuid(), CurPoint = request.Equip, AddTime = DateTime.Now, AddWho = "wms", Enabled = true, ParentTaskCode = task1.ID, Desc = task1.BusType }; _wcstaskdtl.InsertableSplitTable(wcsdetail); _db.CommitTran(); } catch (Exception ex) { _db.RollbackTran(); result.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode(); result.ResMsg = request.Code + ResponseStatusCodeEnum.DataSaveErr.GetDescription(); return result; } } return result; } /// /// 分配巷道 /// /// /// public SRes GetCpTunnelPriorityList(GetTunnelPriorityListRequest reqEntity) { var result = new SRes(); var wcstask = _wcstaskold.AsQueryable().Where(p => p.ID == reqEntity.TaskNum && p.Status < TaskStatus.Finish).SplitTable(p => p.Take(2)).First(); if (wcstask == null) { result.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode(); result.ResMsg = reqEntity.TaskNum + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription(); return result; } //获取任务数占用最少的 var wcstasks = _wcstaskinfo.GetList(p => p.WarehouseCode == wcstask.WarehouseCode && p.Type == TaskType.EnterDepot && p.Status < TaskStatus.Finish && p.Tunnel != "0" && p.Tunnel != "" && p.Tunnel != null).ToList(); var tunnelcountlist = new List(); var runningtasks = wcstasks; 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 = _baseWarecellrepository.GetList(p => p.WarehouseId == warehouse.Id && p.StateNum == LocationState.LocationState_Full.GetHashCode()); //获取所有可用货位的数量 var shelflocationcount = _baseWarecellrepository.GetList(p => p.WarehouseCode == wcstask.WarehouseCode && 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.StateNum == LocationState.LocationState_Empty.GetHashCode() && p.IsStop == 0); var resultTunenls = new List(); foreach (var sorttunnel in arrresultTunnels) { var tunneltaskcount = wcstasks.Where(p => p.Tunnel == sorttunnel).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 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); } return result; } public SRes CpCompleteTask(CompleteTaskRequest reqDto) { var result = new SRes() { ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode(), ResMsg = ResponseStatusCodeEnum.Sucess.GetDescription(), ResData = reqDto.TaskNum }; var task = _wcstaskold.AsQueryable().Where(p => p.ID == reqDto.TaskNum && p.Status < TaskStatus.Finish).SplitTable(tabs => tabs.Take(2)).First(); if (task == null) { result.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode(); result.ResMsg = reqDto.TaskNum + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription(); return result; } var warehouse = _basewarehouserepository.GetSingle(p => p.Code == task.WarehouseCode); if (warehouse == null) { result.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode(); result.ResMsg = task.WarehouseCode + ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription(); return result; } if (task.Type == TaskType.EnterDepot) { //库存,货位 try { var stock = _billnowrepository.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]); //更新库存 _billnowrepository.UpdateModelColumns(p => new cpBillInvnow() { 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 cpBaseWarecell() { StateNum = LocationState.LocationState_Full.GetHashCode(), ContGrpBarCode = stock.ContGrpBarCode, ContGrpId = stock.ContGrpId, EditTime = DateTime.Now }, p => p.Code.Contains(task.AddrTo)); var stocklist = _billnowrepository.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(); //string pushtype = ""; //if (task.BusType == PtTaskBusType.TaskBusType_PT_PurchaseStockIn.GetDescription()) //{ // pushtype = PtFackbeekType.InterfaceType_PT_PurchaseStockIn.ToString(); //} //else if (task.BusType == PtTaskBusType.TaskBusType_PT_ProductionBackStockIn.GetDescription()) //{ // pushtype = PtFackbeekType.ReturnMat.ToString(); //} ////回调数据 //foreach (var item in stocklist) //{ // list.Add(new cpBillPushinfo // { // DocsNo = stock.InDocsNo, // TypeCode = pushtype, // RFIDBarCode = stock.ContGrpBarCode, // HWBarCode = stock.RodBarCode, // CLBarCode = item.CLBarCode, // WarehouseId = warehouse.Id, // WarehouseCode = warehouse.Code, // WareCellId = 0, // WareCellCode = task.AddrTo, // MatId = item.MatId, // MatCode = item.MatCode, // MatName = item.MatName, // ReqNo = Guid.NewGuid().ToString() // }); //} //_billpushrepository.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 = _billnowrepository.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 = "任务完成"; } //var list = new List(); //string pushtype = ""; //if (task.BusType == PtTaskBusType.TaskBusType_PT_ProductionStockOut.GetDescription()) //{ // pushtype = PtFackbeekType.PickMat.ToString(); // //回调数据 // foreach (var item in stocklist) // { // list.Add(new cpBillPushinfo // { // DocsNo = item.InDocsNo, // TypeCode = pushtype, // RFIDBarCode = item.ContGrpBarCode, // HWBarCode = item.HWBarCode, // CLBarCode = item.CLBarCode, // WarehouseId = warehouse.Id, // WarehouseCode = warehouse.Code, // WareCellId = 0, // WareCellCode = task.AddrTo, // MatId = item.MatId, // MatCode = item.MatCode, // MatName = item.MatName, // ReqNo = Guid.NewGuid().ToString() // }); // } //} try { _db.BeginTran(); _billnowrepository.Delete(p => stocklist.Select(p => p.Id).ToList().Contains(p.Id)); _billinitrepository.Delete(p => p.ContGrpBarCode == task.BarCode); _baseWarecellrepository.UpdateModelColumns(p => new cpBaseWarecell() { 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)); //_billpushrepository.InsertRange(list); _billInvFlow.InsertRange(flowlist); _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.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 cpBaseWarecell() { StateNum = LocationState.LocationState_Empty.GetHashCode(), ContGrpBarCode = "", ContGrpId = 0, EditTime = DateTime.Now }, p => p.Code.Contains(fromcellno)); _baseWarecellrepository.UpdateModelColumns(p => new cpBaseWarecell() { 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]); _billnowrepository.UpdateModelColumns(p => new cpBillInvnow() { PutRow = row, PutCol = col, PutLayer = layer }, p => p.ContGrpId == grcontid && p.InvStateCode == InvState.InvEcecState_In.ToString()); var stock = _billnowrepository.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 CpApplyStockInLoc(CpApplyStockInLocRequest request) { var res = ApplyStockInLocTemp(request); if (string.IsNullOrEmpty(res.ResData.CellNo)) { return res; } try { _db.BeginTran(); _baseWarecellrepository.UpdateModelColumns(p => new cpBaseWarecell() { StateNum = LocationState.LocationState_StockIn.GetHashCode(), ContGrpBarCode = "", ContGrpId = 0, EditTime = DateTime.Now }, p => p.Code == res.ResData.CellNo); _db.CommitTran(); } catch (Exception ex) { _db.RollbackTran(); _logger.LogInformation(ex.ToString()); } return res; } private SRes ApplyStockInLocTemp(CpApplyStockInLocRequest request) { var res = new SRes() { ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode(), ResMsg = ResponseStatusCodeEnum.Sucess.GetDescription(), ResData = new CpApplyStockInLocResponse() }; var wcstask = _wcstaskold.AsQueryable().Where(p => p.ID == request.TaskNum).SplitTable(tabs => tabs.Take(2)).First(); ; if (wcstask == null) { res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode(); res.ResMsg = request.TaskNum + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription(); return res; } if (wcstask.Type == TaskType.OutDepot) { res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode(); res.ResMsg = "该任务是出库任务,不能分配货位;wms任务号" + wcstask.ID; return res; } if (!string.IsNullOrEmpty(wcstask.AddrTo) && wcstask.AddrTo != "srm") { res.ResData.TunnelNum = wcstask.Tunnel; res.ResData.CellNo = wcstask.AddrTo; res.ResData.Row = wcstask.AddrTo.Split('-')[0] != null ? int.Parse(wcstask.AddrTo.Split('-')[0]) : 0; res.ResData.Colomn = wcstask.AddrTo.Split('-')[1] != null ? int.Parse(wcstask.AddrTo.Split('-')[1]) : 0; res.ResData.Layer = wcstask.AddrTo.Split('-')[2] != null ? int.Parse(wcstask.AddrTo.Split('-')[2]) : 0; return res; } if (request.TunnelNum <= 0) { res.ResCode = ResponseStatusCodeEnum.NotTunnelNum.GetHashCode(); res.ResMsg = request.TaskNum + ResponseStatusCodeEnum.NotTunnelNum.GetDescription(); return res; } var warehouse = _basewarehouserepository.GetFirst(p => p.Code == wcstask.WarehouseCode); if (warehouse == null) { res.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode(); res.ResMsg = wcstask.WarehouseCode + ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription(); return res; } //验证库存 var stock = _billnowrepository.GetFirst(p => p.HWBarCode == wcstask.BarCode && p.InvStateCode == InvState.InvEcecState_BuildUp.ToString()); if (stock == null) { res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode(); res.ResMsg = wcstask.BarCode + ResponseStatusCodeEnum.StockNotExist.GetDescription(); return res; } return ApplyLoc(new CpApplyLocRequest() { MaterialId = stock.MatId, MaterialCode = stock.MatCode, Size = stock.Size, TunnelNum = request.TunnelNum, WarehuoseId = warehouse.Id, IsMove = wcstask.Type == TaskType.TransferDepot }); } private SRes ApplyLoc(CpApplyLocRequest request) { var res = new SRes() { ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode(), ResMsg = ResponseStatusCodeEnum.Sucess.GetDescription(), ResData = new CpApplyStockInLocResponse() }; //预留货位数量 var emptyLoc = _baseWarecellrepository.GetList(p => p.IsStop == 0 && p.StateNum == LocationState.LocationState_Empty.GetHashCode() && p.TypeNum == LocationType.LocationType_StorageLocation.GetHashCode() && p.Tunnel == request.TunnelNum && p.WarehouseId == request.WarehuoseId && p.Size == request.Size ); //判断是否移库 if (!request.IsMove && (emptyLoc == null || emptyLoc.Count < 2)) { res.ResCode = ResponseStatusCodeEnum.NotEnoughLocation.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.NotEnoughLocation.GetDescription(); return res; } 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 == request.TunnelNum && loc1.WarehouseId == request.WarehuoseId && loc1.Size == request.Size && loc1.Depth == 1) .Where((loc1, loc2, inv) => loc2.IsStop == 0 && loc2.Depth == 2 && loc2.StateNum == LocationState.LocationState_Full.GetHashCode()) .Where((loc1, loc2, inv) => inv.InvStateCode == InvState.InvEcecState_In.ToString()) .Where((loc1, loc2, inv) => loc1.Tunnel == request.TunnelNum && loc2.Tunnel == request.TunnelNum) . Select((loc1, loc2, inv) => new { loc1.Code, loc1.Id, loc1.Row, loc1.Col, loc1.Layer, loc1.Tunnel, loc2.ContGrpBarCode, loc2.Shelf, inv.MatCode, inv.MatId, }); if (loc1ist != null && loc1ist.ToList().Where(p => p.MatId == request.MaterialId).Any()) { var resloc = loc1ist.ToList().OrderBy(p => p.Layer).ThenBy(p => p.Col).ThenBy(p => p.Row).First(); res.ResData.TunnelNum = resloc.Tunnel.ToString(); res.ResData.CellNo = resloc.Code; res.ResData.Row = resloc.Row; res.ResData.Colomn = resloc.Col; res.ResData.Layer = resloc.Layer; return res; } //再找二深位空的 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 } select loc2; if (templist == null || !templist.Any()) { res.ResCode = ResponseStatusCodeEnum.NotEnoughLocation.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.NotEnoughLocation.GetDescription(); return res; } var resloc = templist.Where(p => p.Depth == 2).OrderBy(p => p.Layer).ThenBy(p => p.Col).ThenBy(p => p.Row).First(); res.ResData.TunnelNum = resloc.Tunnel.ToString(); res.ResData.CellNo = resloc.Code; res.ResData.Row = resloc.Row; res.ResData.Colomn = resloc.Col; res.ResData.Layer = resloc.Layer; return res; } if (loc1ist == null || !loc1ist.Any()) { res.ResCode = ResponseStatusCodeEnum.NotEnoughLocation.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.NotEnoughLocation.GetDescription(); return res; } var loc = loc1ist.First(); res.ResData.TunnelNum = loc.Tunnel.ToString(); res.ResData.CellNo = loc.Code; res.ResData.Row = loc.Row; res.ResData.Colomn = loc.Col; res.ResData.Layer = loc.Layer; return res; } public SRes CpSrmPickOutCompleted(CpSrmPickOutCompletedRequest request) { var result = new SRes() { ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode(), ResMsg = ResponseStatusCodeEnum.Sucess.GetDescription(), ResData = request.TaskNum }; var wcstask = _wcstaskold.AsQueryable().Where(p => p.ID == request.TaskNum && p.Status < TaskStatus.Finish && p.Type == TaskType.OutDepot).SplitTable(tabs => tabs.Take(2)).First(); if (wcstask == null) { result.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode(); result.ResMsg = request.TaskNum + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription(); return result; } if (wcstask.Type != TaskType.OutDepot) { result.ResCode = ResponseStatusCodeEnum.OnlyStockOutAvil.GetHashCode(); result.ResMsg = request.TaskNum + ResponseStatusCodeEnum.OnlyStockOutAvil.GetDescription(); return result; } if (wcstask.Status >= TaskStatus.Finish) { result.ResCode = ResponseStatusCodeEnum.WcsTaskStateIsComplete.GetHashCode(); result.ResMsg = request.TaskNum + ResponseStatusCodeEnum.WcsTaskStateIsComplete.GetDescription(); return result; } try { _db.BeginTran(); //更新库存 _billnowrepository.UpdateModelColumns(p => new cpBillInvnow() { PutRow = 0, PutCol = 0, PutLayer = 0 }, p => p.InvStateCode == InvState.InvEcecState_OutGoing.ToString() && p.ContGrpBarCode == wcstask.BarCode); var stocklist = _billnowrepository.GetList(p => p.ContGrpBarCode == wcstask.BarCode && p.InvStateCode == InvState.InvEcecState_OutGoing.ToString()); if (stocklist == null || !stocklist.Any()) { result.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode(); result.ResMsg = request.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 cpBaseWarecell() { StateNum = LocationState.LocationState_Empty.GetHashCode(), ContGrpBarCode = "", ContGrpId = 0, EditTime = DateTime.Now }, p => p.ContGrpBarCode == wcstask.BarCode && p.Code.Contains(wcstask.AddrFrom)); _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 WcsMoveTask(WcsMoveTaskRequest request) { var res = new SRes() { ResData = new WcsMoveTaskResponse() { ResType = WcsContractWcsMoveTaskEnum.失败.GetHashCode(), CellNo = "" } }; var wcstask = _wcstaskold.AsQueryable().Where(p => p.ID == request.TaskNum && p.Status < TaskStatus.Finish).SplitTable(tabs => tabs.Take(2)).First(); if (wcstask == null) { res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode(); res.ResMsg = request.TaskNum + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription(); return res; } var dept2Loc = _baseWarecellrepository.GetFirst(p => p.Code == wcstask.AddrFrom && p.Depth == 2); if (dept2Loc == null) { res.ResCode = ResponseStatusCodeEnum.WareLocationCodeNotExist.GetHashCode(); res.ResMsg = "该任务所在货位不是二深货位"; return res; } 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) { res.ResCode = ResponseStatusCodeEnum.WareLocationCodeNotExist.GetHashCode(); res.ResMsg = dept2Loc.Code + "对应一深位货位被禁用或者不存在"; return res; } if (wcstask.Type != TaskType.OutDepot) { res.ResCode = WcsContractWcsMoveTaskEnum.失败.GetHashCode(); res.ResMsg = "只有出库任务才能调用此接口"; return res; } res.ResData.CellNo = dept1Loc.Code; try { if (dept1Loc.StateNum == LocationState.LocationState_Empty.GetHashCode()) { res.ResData.ResType = WcsContractWcsMoveTaskEnum.允许2升位执行.GetHashCode(); res.ResData.CellNo = ""; return res; } else if (dept1Loc.StateNum == LocationState.LocationState_Full.GetHashCode()) { res.ResData.ResType = WcsContractWcsMoveTaskEnum.执行移库任务.GetHashCode(); res.ResData.CellNo = dept1Loc.Code; var stock = _billnowrepository.GetFirst(p => p.ContGrpBarCode == dept1Loc.ContGrpBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString()); if (stock == null) { res.ResCode = WcsContractWcsMoveTaskEnum.失败.GetHashCode(); res.ResMsg = "一深位库存信息异常,没有查到库存信息"; return res; } var wareshouse = _basewarehouserepository.GetFirst(p => p.Code == wcstask.WarehouseCode); //库位 var cell = ApplyLoc(new CpApplyLocRequest() { IsMove = true, MaterialId = stock.MatId, MaterialCode = stock.MatCode, Size = stock.Size, TunnelNum = dept1Loc.Tunnel, WarehuoseId = wareshouse.Id }); if (string.IsNullOrEmpty(cell.ResData.CellNo)) { res.ResCode = WcsContractWcsMoveTaskEnum.失败.GetHashCode(); res.ResMsg = cell.ResMsg; return res; } var wcs = new cpWCS_TaskInfo() { Type = TaskType.TransferDepot, Status = TaskStatus.NewBuild, Priority = 0, Device = "SRM" + dept1Loc.Tunnel, SrmStation = "", AddrFrom = dept1Loc.Code, AddrTo = cell.ResData.CellNo, LastInteractionPoint = "", BarCode = stock.ContGrpBarCode, Length = stock.LengthQty, AddTime = DateTime.Now, StartTime = DateTime.Now, DocID = 0, PalletType = 1, ProdLine = 0, AddWho = "wms", WarehouseCode = wareshouse.Code, Enabled = true, WorkBench = "", Tunnel = dept1Loc.Tunnel.ToString(), BusType = CpTaskBusType.TaskBusType_CP_Move.GetDescription() }; _db.BeginTran(); var task = _wcstaskinfo.InsertReturnEntity(wcs); _wcstaskold.InsertableSplitTable(_mapper.Map(task)); var taskdlt = new cpWCS_TaskDtl() { ID = Guid.NewGuid(), CurPoint = task.AddrFrom, AddTime = DateTime.Now, AddWho = "wms", Enabled = true, ParentTaskCode = task.ID, Desc = task.AddrFrom + "移库至" + task.AddrTo, }; _wcstaskdtl.InsertableSplitTable(taskdlt); _baseWarecellrepository.UpdateModelColumns(p => new cpBaseWarecell() { StateNum = LocationState.LocationState_StockMove.GetHashCode(), EditTime = DateTime.Now }, p => p.Code == task.AddrFrom); _baseWarecellrepository.UpdateModelColumns(p => new cpBaseWarecell() { StateNum = LocationState.LocationState_StockMove.GetHashCode(), EditTime = DateTime.Now }, p => p.Code == task.AddrTo); _db.CommitTran(); return res; } else if (dept1Loc.StateNum == LocationState.LocationState_StockOut.GetHashCode()) { res.ResData.ResType = WcsContractWcsMoveTaskEnum.一深位有出库任务.GetHashCode(); res.ResData.CellNo = dept1Loc.Code; return res; } //判断移库任务是否已经存在 else if (dept1Loc.StateNum == LocationState.LocationState_StockMove.GetHashCode()) { res.ResData.ResType = WcsContractWcsMoveTaskEnum.执行移库任务.GetHashCode(); res.ResData.CellNo = dept1Loc.Code; return res; } else { res.ResCode = WcsContractWcsMoveTaskEnum.失败.GetHashCode(); res.ResMsg = "一深位有入库任务,优先执行入库任务"; return res; } } catch (Exception ex) { _db.RollbackTran(); res.ResCode = WcsContractWcsMoveTaskEnum.失败.GetHashCode(); res.ResMsg = WcsContractWcsMoveTaskEnum.失败.GetDescription(); _logger.LogInformation(ex.ToString()); return res; } return res; } public SRes CpWareCellInit(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 < row; i++) { string shlf = tun.ToString(); if (row == 2) { if (i == 0) { shlf = shlf + "L"; } else { shlf = shlf + "R"; } } else if (row == 4) //双升位 { if (i == 0 || i == 1) { shlf = shlf + "L"; } else { shlf = shlf + "R"; } } 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"; } var code = new cpBaseWarecell() { Code = (rowcount + i).ToString() + "-" + (k + 1).ToString() + "-" + (j + 1).ToString() + "-" + shlf + "-" + dept, Tunnel = tun, IsStop = 0, Name = (rowcount + i).ToString() + "行" + (k + 1).ToString() + "列" + (j + 1).ToString() + "层" + shlf + "货架" + 1 + "深度", WarehouseId = ware.Id, WarehouseCode = ware.Code, WareAreaId = arec.Id, StateNum = 1, TypeNum = 1, Size = 1, Row = (rowcount + i), Col = (k + 1), Layer = (j + 1), Depth = int.Parse(dept), SCRel = "SRM0" + tun, ContGrpId = 0, ContGrpBarCode = "", AddWho = "wms", EditWho = "wms", Shelf = shlf, Sort = j * col + (k + 1) }; _baseWarecellrepository.Insert(code); } } } return res; } public SRes InsertSys() { var res = new SRes(); var sys = new cpSysConfig() { Code = "BoxBuildStockTrans", Name = "箱号同步接口", SContent = "", SType = "", Default1 = "mes", AddWho = "wms", EditWho = "wms", }; _sysconfigrepository.Insert(sys); return res; } public SRes ManualTask(CpManualTaskRequest request) { var res = new SRes(); if (!request.Location.Any()) { res.ResCode = ResponseStatusCodeEnum.ErrParamNotNull.GetHashCode(); res.ResMsg = "货位" + ResponseStatusCodeEnum.ErrParamNotNull.GetDescription(); return res; } 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; } if (location.StateNum != LocationState.LocationState_Full.GetHashCode()) { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = item + ResponseStatusCodeEnum.Fail.GetDescription() + "货位状态不满足出库条件"; return res; } if (location.IsStop == Const.One) { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.Fail.GetDescription() + item + "被禁用"; return res; } var stock = _billnowrepository.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; } if (stock.ExecStateCode != InvLockState.InvState_Normal.ToString()) { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = stock.ContGrpBarCode + "状态已被锁定,不允许出库"; return res; } if (stock.InvStateCode != InvState.InvEcecState_In.ToString()) { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = item + "组盘状态不是已入库"; return res; } var task = new cpWCS_TaskInfo() { Status = TaskStatus.NewBuild, Type = TaskType.OutDepot, Priority = 0, Device = "SRM" + location.Tunnel, SrmStation = request.EndPoint, AddrFrom = item, BarCode = stock.ContGrpBarCode, StartTime = DateTime.Now, AddTime = DateTime.Now, EditTime = DateTime.Now, AddWho = "wms", WarehouseCode = location.WarehouseCode, Enabled = true, WorkBench = request.EndPoint, AddrTo = request.EndPoint, Tunnel = location.Tunnel.ToString(), PalletType = 1, Length = stock.LengthQty, MaterialCode = stock.MatCode, MatCode = stock.MatCode, OutType = OutTypeEnum.全自动手动出库任务, BusType = request.BusType }; _db.BeginTran(); var wcs = _wcstaskinfo.InsertReturnEntity(task); _wcstaskold.InsertableSplitTable(_mapper.Map(wcs)); var taskdtl = new cpWCS_TaskDtl() { ID = Guid.NewGuid(), CurPoint = item, AddTime = DateTime.Now, AddWho = "wms", Enabled = true, ParentTaskCode = wcs.ID, Desc = wcs.BusType, }; _wcstaskdtl.InsertableSplitTable(taskdtl); _baseWarecellrepository.UpdateSetColumnsTrue(p => new cpBaseWarecell() { StateNum = LocationState.LocationState_StockOut.GetHashCode(), EditTime = DateTime.Now }, p => p.Code == item); _billnowrepository.UpdateSetColumnsTrue(p => new cpBillInvnow() { 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); _db.CommitTran(); } } catch (Exception ex) { _db.RollbackTran(); _logger.LogInformation("出库异常:" + ex.Message); res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.DataSaveErr.GetDescription(); return res; } return res; } } }