using AutoMapper; using Microsoft.Extensions.Logging; using Newtonsoft.Json; using NPOI.SS.Formula.Functions; using SqlSugar; using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; 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; using wms.dto.request.pt.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.util; using wms.util.Check; using wms.util.Ext; using wms.util.Http; namespace wms.service.Service { public class CPService : ICPService { private readonly IMapper _mapper; private readonly ILogger _logger; private readonly ICPDataService _cptDataService; private static object lockerUpdateErrorBoxinfo = new object(); public CPService(IMapper mapper, ILogger logger, ICPDataService cptDataService) { _mapper = mapper; _logger = logger; _cptDataService = cptDataService; } private Repository _docrepository => new Repository(); private Repository _basecontinfo => new Repository(); private Repository _sysconfigrepository => new Repository(); private Repository _invviewrepository => new Repository(); private Repository _materrepository => new Repository(); private Repository _basewarehouserepository => new Repository(); private Repository _baseWarecellrepository => new Repository(); private Repository _billinitrepository => new Repository(); private Repository _billpushrepository => new Repository(); private Repository _billnowrepository => new Repository(); private Repository _boxitemsrepository => new Repository(); private Repository _boxitemsHistoryrepository => new Repository(); private Repository _sysJobrepository => new Repository(); private Repository _sysJobApirepository => new Repository(); private Repository _billInvFlow => new Repository(); private Repository _baseare => new Repository(); private RepositoryTask _wcstaskinfo => new RepositoryTask(); private RepositoryTask _wcstaskold => new RepositoryTask(); private RepositoryTask _wcstaskdtl => new RepositoryTask(); private RepositoryTask _billInventoryReport => new RepositoryTask(); private RepositoryTask _flowhtyrepository => new RepositoryTask(); private RepositoryTask _pushhtyrepository => new RepositoryTask(); private RepositoryTask _boxitemhtyrepository => new RepositoryTask(); private RepositoryTask _baseWeighingResult => new RepositoryTask(); private 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) { 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 List GetBoxItemsList(Expression> WhereExpression) { return _boxitemsrepository.GetList(WhereExpression); } public List GetBoxItemsHistoryList(Expression> WhereExpression) { return _boxitemsHistoryrepository.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 UpdateBoxItemsModelColumns(UpdateModelColumns updateModel) { return _boxitemsrepository.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(); if (!reqDto.BoxList.Any() || string.IsNullOrEmpty(reqDto.BillCode)) { result.ResCode = ResponseStatusCodeEnum.ErrParamNotNull.GetHashCode(); result.ResMsg = ResponseStatusCodeEnum.ErrParamNotNull.GetDescription(); return result; } var ware = _basewarehouserepository.GetSingle(p => p.Code == reqDto.WareCode); if (ware == null) { result.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode(); result.ResMsg = reqDto.WareCode + ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription(); return result; } var doc = _docrepository.GetSingle(p => p.DocsNo == reqDto.BillCode); if (doc == null) { var code = new cpBillDocsinfo() { WarehouseId = ware.Id, IsStop = 0, StateNum = DocState.DocState_Create.GetHashCode(), DocsNo = reqDto.BillCode, JsonContent = string.Join(",", reqDto.BoxList), TypeNum = CpDocType.DocType_CP_SalesDocTrans.GetHashCode(), ReqNo = reqDto.ReqId, AddWho = "wms", EditWho = "wms" }; _docrepository.Insert(code); } else { result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); result.ResMsg = reqDto.BillCode + "单号已存在,不能重复推送"; return result; } foreach (var item in reqDto.BoxList) { var stock = _billnowrepository.GetSingle(p => p.BoxBarCode == item); if (stock == null) { continue; } if (stock.InvStateCode != InvState.InvEcecState_In.ToString()) { continue; } if (stock.IsFail == true) { _logger.LogInformation($"异常轮{stock.BoxBarCode}不允许生产出库,请联系自动化人员"); continue; } //if (stock.ExecStateCode != InvLockState.InvState_Normal.ToString()) //{ // continue; //} _billnowrepository.UpdateSetColumnsTrue(p => new cpBillInvnow() { State = "1", SalesDoc = reqDto.BillCode, CustCode = reqDto.CustCode, CustName = reqDto.CustName, ExecStateCode = InvLockState.InvState_Normal.ToString() }, p => p.BoxBarCode == item && p.InvStateCode == InvState.InvEcecState_In.ToString()); } return result; } public SRes SalesBackDocTrans(SalesDocTransRequest reqDto) { var result = new SRes(); if (!reqDto.BoxList.Any() || string.IsNullOrEmpty(reqDto.BillCode)) { result.ResCode = ResponseStatusCodeEnum.ErrParamNotNull.GetHashCode(); result.ResMsg = ResponseStatusCodeEnum.ErrParamNotNull.GetDescription(); return result; } var ware = _basewarehouserepository.GetSingle(p => p.Code == reqDto.WareCode); if (ware == null) { result.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode(); result.ResMsg = reqDto.WareCode + ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription(); return result; } var doc = _docrepository.GetSingle(p => p.DocsNo == reqDto.BillCode); if (doc == null) { var code = new cpBillDocsinfo() { WarehouseId = ware.Id, IsStop = 0, StateNum = DocState.DocState_Create.GetHashCode(), DocsNo = reqDto.BillCode, JsonContent = JsonConvert.SerializeObject(reqDto.BoxList), TypeNum = CpDocType.DocType_CP_SalesBackDocTrans.GetHashCode(), ReqNo = Guid.NewGuid().ToString(), AddWho = "wms", EditWho = "wms" }; _docrepository.Insert(code); } else { result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); result.ResMsg = reqDto.BillCode + "单号已存在,不能重复推送"; return result; } try { foreach (var item in reqDto.BoxList) { var stock = _billnowrepository.GetSingle(p => p.BoxBarCode == item); if (stock == null) { var flow = _billInvFlow.GetList(p => p.BoxBarCode == item).OrderByDescending(p => p.AddTime).First(); if (flow != null && flow.ContGrpType == 1) { flow.Id = GetId(); flow.InvStateCode = InvState.InvEcecState_BuildUp.ToString(); flow.ExecStateCode = InvLockState.InvState_Lock.ToString(); flow.IsBack = true; flow.AddTime = DateTime.Now; flow.EditTime = DateTime.Now; var inv = _mapper.Map(flow); _billnowrepository.Insert(inv); _billInvFlow.Insert(_mapper.Map(inv)); } else { result.ResCode = ResponseStatusCodeEnum.StockInfoExist.GetHashCode(); result.ResMsg = item + "当前流水记录中没有符合条件的数据"; return result; } } else { result.ResCode = ResponseStatusCodeEnum.StockInfoExist.GetHashCode(); result.ResMsg = item + ResponseStatusCodeEnum.StockInfoExist.GetDescription(); return result; } } } catch (Exception ex) { result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); result.ResMsg = reqDto.BillCode + ResponseStatusCodeEnum.Fail.GetDescription(); return result; } return result; } public SRes ErrorMaterialStockOut(dto.request.cp.ErrorMaterialStockOutRequest reqDto) { var result = new SRes(); var ware = _basewarehouserepository.GetSingle(p => p.Code == reqDto.WareCode); if (ware == null) { result.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode(); result.ResMsg = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription(); return result; } var doc = _docrepository.GetSingle(p => p.DocsNo == reqDto.BillCode); if (doc == null) { var docsno = new cpBillDocsinfo() { WarehouseId = ware.Id, IsStop = 0, StateNum = DocState.DocState_Create.GetHashCode(), DocsNo = reqDto.BillCode, JsonContent = JsonConvert.SerializeObject(reqDto.BoxList), TypeNum = CpDocType.DocType_CP_ErrorMaterialDocTrans.GetHashCode(), ReqNo = Guid.NewGuid().ToString(), AddWho = "wms", EditWho = "wms" }; _docrepository.Insert(docsno); } else { result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); result.ResMsg = reqDto.BillCode + "单号已存在,不能重复推送"; return result; } foreach (var item in reqDto.BoxList) { var stock = _billnowrepository.GetSingle(p => p.BoxBarCode == item && p.InvStateCode == InvState.InvEcecState_In.ToString() && p.ExecStateCode == InvLockState.InvState_Normal.ToString()); if (stock == null) { continue; } _billnowrepository.UpdateSetColumnsTrue(p => new cpBillInvnow() { State = "1", SalesDoc = reqDto.BillCode }, p => p.BoxBarCode == item && p.InvStateCode == InvState.InvEcecState_In.ToString()); } return result; } public SRes StockChange(CpStockChangeRequest reqDto) { var result = new SRes(); if (!reqDto.ListInfo.Any()) { result.ResCode = ResponseStatusCodeEnum.DocDetailNotExist.GetHashCode(); result.ResMsg = ResponseStatusCodeEnum.DocDetailNotExist.GetDescription(); return result; } var ware = _basewarehouserepository.GetSingle(p => p.Code == reqDto.WareCode); if (ware == null) { result.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode(); result.ResMsg = reqDto.WareCode + ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription(); return result; } var doc = _docrepository.GetSingle(p => p.DocsNo == reqDto.BillCode); if (doc == null) { var docsno = new cpBillDocsinfo() { WarehouseId = ware.Id, IsStop = 0, StateNum = DocState.DocState_Create.GetHashCode(), DocsNo = reqDto.BillCode, JsonContent = JsonConvert.SerializeObject(reqDto.ListInfo), TypeNum = CpDocType.DocType_CP_StateTrans.GetHashCode(), ReqNo = reqDto.ReqId, AddWho = "wms", EditWho = "wms" }; _docrepository.Insert(docsno); } foreach (var item in reqDto.ListInfo) { var puch = new cpBillPushinfo() { DocsNo = reqDto.BillCode, TypeCode = CpFackbeekType.StateTrans.ToString(), RFIDBarCode = item.BoxNo, HWBarCode = item.SpoolCode, CLBarCode = item.MatBarCode, WarehouseId = ware.Id, WarehouseCode = ware.Code, ReqNo = reqDto.ReqId, RodBarCode = item.Grade }; var stock = _billnowrepository.GetSingle(p => p.BoxBarCode == item.BoxNo); if (stock == null) { puch.ResStateCode = "E"; puch.ResDesc = item.BoxNo + ResponseStatusCodeEnum.StockNotExist.GetDescription(); _billpushrepository.Insert(puch); continue; } else { if (stock.InvStateCode == InvState.InvEcecState_In.ToString() || stock.InvStateCode == InvState.InvEcecState_BuildUp.ToString()) { if (item.State == "Lock" || item.State == "Normal") { var it = _billnowrepository.UpdateSetColumnsTrue(p => new cpBillInvnow() { ExecStateCode = item.State == "Lock" ? InvLockState.InvState_Lock.ToString() : InvLockState.InvState_Normal.ToString(), EditTime = DateTime.Now, Grade = item.Grade, Memo = item.Reason }, p => p.BoxBarCode == item.BoxNo); var nov = _billnowrepository.GetSingle(p => p.BoxBarCode == item.BoxNo); var flow = _mapper.Map(nov); flow.Id = GetId(); flow.AddTime = DateTime.Now; flow.EditTime = DateTime.Now; puch.ResStateCode = "S"; puch.ResDesc = "成功"; _billpushrepository.Insert(puch); _billInvFlow.Insert(flow); continue; } else { _billnowrepository.UpdateSetColumnsTrue(p => new cpBillInvnow() { IsFast = item.State == "Fast" ? true : false, Grade = item.Grade, EditTime = DateTime.Now, Memo = item.Reason }, p => p.BoxBarCode == item.BoxNo); var nov = _billnowrepository.GetSingle(p => p.BoxBarCode == item.BoxNo); var flow = _mapper.Map(nov); flow.Id = GetId(); flow.AddTime = DateTime.Now; flow.EditTime = DateTime.Now; puch.ResStateCode = "S"; puch.ResDesc = "成功"; _billpushrepository.Insert(puch); _billInvFlow.Insert(flow); continue; } } //堆垛机还未上报放货完成 else if (stock.InvStateCode == InvState.InvEcecState_OutGoing.ToString() && stock.PutRow != 0 && stock.PutCol != 0 && stock.PutLayer != 0) { if (item.State == "Lock" || item.State == "Normal") { _billnowrepository.UpdateSetColumnsTrue(p => new cpBillInvnow() { ExecStateCode = item.State == "Lock" ? InvLockState.InvState_Lock.ToString() : InvLockState.InvState_Normal.ToString(), EditTime = DateTime.Now, Grade = item.Grade, Memo = item.Reason, InvStateCode = InvState.InvEcecState_In.ToString() }, p => p.BoxBarCode == item.BoxNo); var nov = _billnowrepository.GetSingle(p => p.BoxBarCode == item.BoxNo); var flow = _mapper.Map(nov); flow.Id = GetId(); flow.AddTime = DateTime.Now; flow.EditTime = DateTime.Now; puch.ResStateCode = "S"; puch.ResDesc = "成功"; _billpushrepository.Insert(puch); _billInvFlow.Insert(flow); //出库任务取消 continue; } else { _billnowrepository.UpdateSetColumnsTrue(p => new cpBillInvnow() { IsFast = item.State == "Fast" ? true : false, EditTime = DateTime.Now, Grade = item.Grade, Memo = item.Reason, InvStateCode = InvState.InvEcecState_In.ToString() }, p => p.BoxBarCode == item.BoxNo); var nov = _billnowrepository.GetSingle(p => p.BoxBarCode == item.BoxNo); var flow = _mapper.Map(nov); flow.Id = GetId(); flow.AddTime = DateTime.Now; flow.EditTime = DateTime.Now; puch.ResStateCode = "S"; puch.ResDesc = "成功"; _billpushrepository.Insert(puch); _billInvFlow.Insert(flow); //出库任务取消 continue; } } } } return result; } public SRes MesReleaseFlag(MesReleaseFlagDto reqDto) { var result = new SRes(); foreach (var item in reqDto.ListInfo) { var stock = _billnowrepository.GetSingle(p => p.BoxBarCode == item.BoxCode); if (stock == null) { _logger.LogInformation("MesReleaseFlag没有找到该箱号的库存,不能执行标记" + item.BoxCode); continue; } else { _billnowrepository.UpdateSetColumnsTrue(p => new cpBillInvnow() { MesFlag = item.Flag, EditTime = DateTime.Now }, p => p.BoxBarCode == item.BoxCode); var nov = _billnowrepository.GetSingle(p => p.BoxBarCode == item.BoxCode); var flow = _mapper.Map(nov); flow.Id = GetId(); flow.AddTime = DateTime.Now; flow.EditTime = DateTime.Now; flow.Memo = "执行MES放行标记:" + item.Flag; _billInvFlow.Insert(flow); } } return result; } public StockStateChangeResponse StockStateChange(StockStateChangeRequest reqDto) { var result = new StockStateChangeResponse() { ListInfo = new List() }; if (!reqDto.ListInfo.Any() || string.IsNullOrEmpty(reqDto.BillCode)) { result.ResCode = ResponseStatusCodeEnum.ErrParamNotNull.GetHashCode(); result.ResMsg = ResponseStatusCodeEnum.ErrParamNotNull.GetDescription(); return result; } var ware = _basewarehouserepository.GetSingle(p => p.Code == reqDto.WareCode); if (ware == null) { result.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode(); result.ResMsg = reqDto.WareCode + ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription(); return result; } //var docs = _docrepository.GetSingle(p => p.DocsNo == reqDto.BillCode); //if (docs == null) //{ // var doc = new cpBillDocsinfo() // { // WarehouseId = ware.Id, // IsStop = 0, // StateNum = DocState.DocState_Create.GetHashCode(), // DocsNo = reqDto.BillCode, // JsonContent = JsonConvert.SerializeObject(reqDto.ListInfo), // TypeNum = CpDocType.DocType_CP_StockStateChangeTrans.GetHashCode(), // ReqNo = reqDto.ReqId, // AddWho = "wms", // EditWho = "wms" // }; // _docrepository.Insert(doc); //} //else //{ // result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); // result.ResMsg = reqDto.BillCode + "单号已存在,不能重复推送"; // return result; //} foreach (var item in reqDto.ListInfo) { try { var boxcode = _billnowrepository.GetSingle(p => p.BoxBarCode == item.BoxNo && p.InvStateCode == InvState.InvEcecState_In.ToString()); if (boxcode == null) { var tt = new StockStateChangeResponseItem() { BoxNo = item.BoxNo, ResState = "E", ResDesc = "该箱号不存在库存信息" }; result.ListInfo.Add(_mapper.Map(tt)); continue; } else { var flow = _mapper.Map(boxcode); flow.Id = GetId(); flow.State = item.State; flow.AddTime = DateTime.Now; flow.EditTime = DateTime.Now; _db.BeginTran(); _billnowrepository.UpdateSetColumnsTrue(p => new cpBillInvnow() { ExecStateCode = item.State == "" ? InvLockState.InvState_Normal.ToString() : InvLockState.InvState_Lock.ToString(), EditTime = DateTime.Now }, p => p.Id == boxcode.Id); _billInvFlow.Insert(flow); _db.CommitTran(); var tt = new StockStateChangeResponseItem() { BoxNo = item.BoxNo, ResState = "S", ResDesc = "成功" }; result.ListInfo.Add(_mapper.Map(tt)); } } catch (Exception ex) { _db.RollbackTran(); var tt = new StockStateChangeResponseItem() { BoxNo = item.BoxNo, ResState = "E", ResDesc = "失败" + ex.Message }; result.ListInfo.Add(_mapper.Map(tt)); continue; } } return result; } public CPGetCurStockListResponse GetCurStockList(CpGetCurStockListRequest reqDto) { var result = new CPGetCurStockListResponse() { ResData = new List() }; int count = 0; var stock = _billnowrepository.Context.Queryable((inv, mater) => new object[] { JoinType.Left, inv.MatCode == mater.Code }) .Where((inv, mater) => inv.InvStateCode == InvState.InvEcecState_In.ToString()) .WhereIF(string.IsNullOrEmpty(reqDto.MatCode), (inv, mater) => inv.MatCode.Contains(reqDto.MatCode)) .WhereIF(string.IsNullOrEmpty(reqDto.MatName), (inv, mater) => inv.MatName.Contains(reqDto.MatName)) .WhereIF(reqDto.BoxNo.Any(), (inv, mater) => reqDto.BoxNo.Contains(inv.BoxBarCode)) .Select((inv, mater) => new CpResDataItem() { MatCode = mater.Code, MatName = mater.Name, CustCode = inv.CustCode, CustName = inv.CustName, BoxMaxSolder = inv.SolderQty, SpoolMaxSolder = inv.SolderQty, IsHold = mater.IsHold, HoldDuration = mater.HoldDuration, BoxNo = inv.BoxBarCode }) .ToPageList(reqDto.PageIndex, reqDto.PageSize, ref count); result.TotalCount = stock.Count(); result.ResData = stock; 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; } request.ContGrpBarCode = request.ContGrpBarCode.Trim(); //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; } if (!string.IsNullOrEmpty(request.BoxCode)) { if (_wcstaskold.AsQueryable().Where(p => p.TaskGroupKey == request.BoxCode && p.Status < TaskStatus.Finish).SplitTable(p => p.Take(2)).Any()) { result.ResCode = ResponseStatusCodeEnum.WcsTaskExist.GetHashCode(); result.ResMsg = request.BoxCode + 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.BoxBarCode != request.BoxCode) { result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); result.ResMsg = request.ContGrpBarCode + "已经绑定了" + BarCode.BoxBarCode + ",请确认是否正确"; 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 code = _basecontinfo.GetSingle(p => p.ContBarCode == request.ContGrpBarCode); if (code == null) { var init = new cpBaseContinfo() { ContBarCode = request.ContGrpBarCode, Name = mater.Name, IsStop = 0, WarehouseId = mater.WarehouseId, TypeCode = "1", PrintQty = 1, AddWho = "wms", EditWho = "wms" }; _basecontinfo.Insert(init); } try { if (!string.IsNullOrEmpty(request.Type) && request.Type == "1") { var mat = _materrepository.GetSingle(p => p.Code == "Jiangeban"); var nov = new cpBillInvnow() { WarehouseId = mater.WarehouseId, ContGrpBarCode = request.ContGrpBarCode, ContGrpId = GetId(), BoxBarCode = request.ContGrpBarCode, InvStateCode = InvState.InvEcecState_BuildUp.ToString(), ExecStateCode = InvLockState.InvState_Normal.ToString(), MatId = mat.Id, MatCode = mat.Code, RFIDBarCode = request.ContGrpBarCode, HWBarCode = request.ContGrpBarCode, HWTypeCode = mat.SpoolType, InvInOut = 1, MatName = mat.Name, Size = 1, ContGrpType = 3, TolWQty = 1 //存放托盘数量 }; _db.BeginTran(); _billnowrepository.Insert(nov); _billInvFlow.Insert(_mapper.Map(nov)); _db.CommitTran(); } else { var nov = new cpBillInvnow() { WarehouseId = mater.WarehouseId, ContGrpBarCode = request.ContGrpBarCode, ContGrpId = GetId(), BoxBarCode = request.ContGrpBarCode, InvStateCode = InvState.InvEcecState_BuildUp.ToString(), ExecStateCode = InvLockState.InvState_Normal.ToString(), MatId = mater.Id, MatCode = request.Type == "4" ? "FaMa" : mater.Code, RFIDBarCode = request.ContGrpBarCode, HWTypeCode = mater.SpoolType, HWBarCode = request.ContGrpBarCode, InvInOut = 1, MatName = mater.Name, Size = 1, ContGrpType = 2, TolWQty = request.Type == "4" ? request.Weight : 1 //存放托盘数量 }; if (request.IsForcedIntoLane5 || request.Type == "4") { nov.BatchNo = "10"; //空托盘组库尾入库库存中批号值等于十表示强制入五巷道 } _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() + ex.Message; return result; } } else { //成品物料 var code = _boxitemsrepository.AsQueryable().Where(p => p.HuNr == request.BoxCode).ToList(); if (!code.Any()) { result.ResCode = ResponseStatusCodeEnum.BaseBarcodeNotExist.GetHashCode(); result.ResMsg = request.BoxCode + ResponseStatusCodeEnum.BaseBarcodeNotExist.GetDescription(); return result; } var boxcode = _billnowrepository.GetSingle(p => p.BoxBarCode == request.BoxCode); if (boxcode != null && boxcode.ContGrpBarCode != request.ContGrpBarCode) { result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); result.ResMsg = request.BoxCode + "箱号已与" + boxcode.ContGrpBarCode + "托盘码绑定,不允许绑定多个托盘码"; return result; } if (boxcode != null && boxcode.InvStateCode == InvState.InvEcecState_In.ToString()) { result.ResCode = ResponseStatusCodeEnum.BarcodeContainerRepeat.GetHashCode(); result.ResMsg = request.BoxCode + ResponseStatusCodeEnum.BarcodeContainerRepeat.GetDescription(); return result; } if (boxcode != null) { result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); result.ResMsg = request.BoxCode + "存在库存信息,请先处理遗留的库存信息"; return result; } try { var nov = new cpBillInvnow() { WarehouseId = mater.WarehouseId, ContGrpBarCode = request.ContGrpBarCode, ContGrpId = GetId(), BoxBarCode = request.BoxCode, InvStateCode = InvState.InvEcecState_BuildUp.ToString(), ExecStateCode = InvLockState.InvState_Lock.ToString(), RFIDBarCode = request.BoxCode, HWBarCode = code.First().Sku, //存SKU InvInOut = 1, Size = 1, ContGrpType = 1, MatCode = code.First().MaterialCode, MatName = code.First().MaterialDesc, HuTotalWt = code.First().HuTotalWt, Grade = code.First().GradeCode, TolWQty = decimal.Parse(code.First().HuTotalWt), NetWQty = decimal.Parse(code.First().HuNetWt), TareWQty = decimal.Parse(code.First().HuTareWt) }; var timeStamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); code.ForEach(p => { p.CongBoxId = nov.ContGrpId; p.TimeStamp = timeStamp.ToString(); }); _db.BeginTran(); _boxitemsrepository.UpdateRange(code); _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() + ex.Message; 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; } if (_wcstaskinfo.IsAny(p => p.AddrTo == request.Equip && p.Status == TaskStatus.NewBuild)) { result.ResCode = ResponseStatusCodeEnum.EquipInfoNotExist.GetHashCode(); result.ResMsg = request.Equip + "存在未执行任务,请勿重复申请"; 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 == "TPC") { 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 (request.Equip == "8088" || request.Equip == "8094" || request.Equip == "8028" || request.Equip == "8313") { locationlist = locationlist.Where(p => p.Tunnel == 5); } 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()); if (_wcstaskold.AsQueryable().Where(p => p.BarCode == sotck.ContGrpBarCode && p.Status < TaskStatus.Finish).SplitTable(p => p.Take(2)).Any()) { res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode(); res.ResMsg = sotck.ContGrpBarCode + "已经存在未完成的任务,请确认"; return res; } 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 == "TPC" ? 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.EditTime = 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; } /// /// 创建WCS入库任务 /// /// /// 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; } request.Code = request.Code.Trim(); if (!Const.CpTaskInEquip.Contains(request.Equip)) { result.ResCode = ResponseStatusCodeEnum.EquipInfoNotExist.GetHashCode(); result.ResMsg = request.Equip + ResponseStatusCodeEnum.EquipInfoNotExist.GetDescription(); return result; } var ware = _basewarehouserepository.GetSingle(p => p.Code == request.WareHouse); if (ware == null) { result.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode(); result.ResMsg = ResponseStatusCodeEnum.WarehouseCodeNotExist.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 (_wcstaskinfo.IsAny(p => p.AddrFrom == request.Equip && p.Status == TaskStatus.NewBuild)) { 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; } if (request.Equip == "8262" || request.Equip == "8120") //叠盘机入库组盘 { var stocks = _billnowrepository.AsQueryable().Where(p => p.ContGrpBarCode == request.Code).First(); if (stocks == null) { var trayCode = _materrepository.GetSingle(p => p.Code == Const.TrayType); var inv = new cpBillInvnow() { WarehouseId = ware.Id, ContGrpBarCode = request.Code, ContGrpId = GetId(), BoxBarCode = request.Code, InvStateCode = InvState.InvEcecState_BuildUp.ToString(), ExecStateCode = InvLockState.InvState_Normal.ToString(), MatId = trayCode.Id, MatCode = trayCode.Code, RFIDBarCode = request.Code, HWTypeCode = trayCode.SpoolType, HWBarCode = request.Code, InvInOut = 1, MatName = trayCode.Name, Size = 1, ContGrpType = 2, TolWQty = 7 }; _billnowrepository.Insert(inv); _billInvFlow.Insert(_mapper.Map(inv)); } } //验证库存 var stock = _billnowrepository.GetSingle(p => p.ContGrpBarCode == request.Code); if (stock == null) { result.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode(); result.ResMsg = request.Code + ResponseStatusCodeEnum.StockNotExist.GetDescription(); return result; } if (stock != null && stock.InvStateCode == InvState.InvEcecState_In.ToString()) { result.ResCode = ResponseStatusCodeEnum.BarcodeContainerRepeat.GetHashCode(); result.ResMsg = request.Code + ResponseStatusCodeEnum.BarcodeContainerRepeat.GetDescription(); return result; } if (stock.InvStateCode != InvState.InvEcecState_BuildUp.ToString()) { result.ResCode = ResponseStatusCodeEnum.StockStateFail.GetHashCode(); result.ResMsg = request.Code + ResponseStatusCodeEnum.StockStateFail.GetDescription(); return result; } if (stock != null) { var boxcode = _billnowrepository.GetSingle(p => p.BoxBarCode == stock.BoxBarCode); if (boxcode == null) { result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); result.ResMsg = stock.BoxBarCode + "没有绑盘信息请确认是否正确"; return result; } if (boxcode.InvStateCode != InvState.InvEcecState_BuildUp.ToString()) { result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); result.ResMsg = stock.BoxBarCode + "绑盘信息不是已组盘,请确认是否正确"; return result; } if (_billnowrepository.IsAny(p => p.BoxBarCode == stock.BoxBarCode && p.ContGrpBarCode != request.Code)) { result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); result.ResMsg = stock.BoxBarCode + "绑盘信息和托盘绑定信息有误,请确认"; return result; } if (_wcstaskold.AsQueryable().Where(p => p.TaskGroupKey == stock.BoxBarCode && p.Status < TaskStatus.Finish && p.BarCode != request.Code).SplitTable(p => p.Take(2)).Any()) { result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); result.ResMsg = stock.BoxBarCode + "存在任务与当前托盘扫码托盘不一致"; return result; } } var BusType = ""; switch (request.Equip) { case "8277": if (stock.ContGrpType == 1) { if (stock.IsBack) { BusType = CpTaskBusType.TaskBusType_CP_ProductBackStockIn.ToString(); } else { BusType = CpTaskBusType.TaskBusType_CP_ProductStockIn.ToString(); } } else if (stock.ContGrpType == 2) { BusType = stock.MatCode == "FaMa" ? CpTaskBusType.TaskBusType_CP_WeightIn.ToString() : CpTaskBusType.TaskBusType_CP_TrayStockIn.ToString(); } else if (stock.ContGrpType == 3) { BusType = CpTaskBusType.TaskBusType_CP_SpacingBoardStockIn.ToString(); } break; case "8262": BusType = CpTaskBusType.TaskBusType_CP_TrayStockIn.ToString(); break; case "8120": BusType = CpTaskBusType.TaskBusType_CP_TrayStockIn.ToString(); break; case "8270": if (stock.ContGrpType == 1) { if (stock.IsBack) { BusType = CpTaskBusType.TaskBusType_CP_ProductBackStockIn.ToString(); } else { 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() || BusType == CpTaskBusType.TaskBusType_CP_SpacingBoardStockIn.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, AddWho = "wms", EditWho = "wms", WarehouseCode = ware.Code, AddrTo = "", Tunnel = "", MaterialCode = stock.MatCode, MatCode = stock.MatCode, BusType = stock.MatCode == "TPC" ? CpTaskBusType.TaskBusType_CP_TrayStockIn.GetDescription() : CpTaskBusType.TaskBusType_CP_SpacingBoardStockIn.GetDescription() }; if (stock.BatchNo == "10") //空托盘组库尾入库库存中批号值等于十表示强制入五巷道 { task.Floor = 10; //空托盘组库尾入库任务中楼层值等于十表示强制入五巷道 } 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() + ex.Message; return result; } } else if (BusType == CpTaskBusType.TaskBusType_CP_ProductStockIn.ToString() || BusType == CpTaskBusType.TaskBusType_CP_ProductBackStockIn.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 = BusType == CpTaskBusType.TaskBusType_CP_ProductStockIn.ToString() ? CpTaskBusType.TaskBusType_CP_ProductStockIn.GetDescription() : CpTaskBusType.TaskBusType_CP_ProductBackStockIn.GetDescription(), TaskGroupKey = stock.BoxBarCode }; 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() + ex.Message; return result; } } else if (BusType == CpTaskBusType.TaskBusType_CP_WeightIn.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, AddWho = "wms", EditWho = "wms", WarehouseCode = ware.Code, AddrTo = "", Tunnel = "", MaterialCode = stock.MatCode, MatCode = stock.MatCode, BusType = CpTaskBusType.TaskBusType_CP_WeightIn.GetDescription() }; if (stock.BatchNo == "10") //空托盘组库尾入库库存中批号值等于十表示强制入五巷道 { task.Floor = 10; //空托盘组库尾入库任务中楼层值等于十表示强制入五巷道 } 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() + ex.Message; 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; } if (wcstask.Type != TaskType.EnterDepot) { result.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode(); result.ResMsg = reqEntity.TaskNum + "不是入库任务"; 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 = 4; if (sorttunnel == "5" && wcstask.BusType != CpTaskBusType.TaskBusType_CP_TrayStockIn.GetDescription() && wcstask.BusType != CpTaskBusType.TaskBusType_CP_SpacingBoardStockIn.GetDescription()) { left = 10; } if (emptylocationsreturn.Where(p => p.Tunnel == int.Parse(sorttunnel)).Count() - tunneltaskcount > left) { resultTunenls.Add(sorttunnel); } } result.ResData = string.Join(",", resultTunenls); //空托盘、优先分配5巷道 if (wcstask.BusType == CpTaskBusType.TaskBusType_CP_TrayStockIn.GetDescription()) { var resultTunenlsNew = new List(); var resultTunenlsTemp = result.ResData.Split(','); foreach (var item in resultTunenlsTemp) { if (item != "5") { resultTunenlsNew.Add(item); } } var celllist = _baseWarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Empty.GetHashCode() && p.Tunnel == 5); if (celllist.Count > 4) { result.ResData = "5," + string.Join(",", resultTunenlsNew); } else { result.ResData = string.Join(",", resultTunenlsNew); } return result; } //间隔板只入5巷道 else if (wcstask.BusType == CpTaskBusType.TaskBusType_CP_SpacingBoardStockIn.GetDescription()) { if (result.ResData.Contains("5")) { result.ResData = "5"; } else { result.ResData = ""; } } else if (wcstask.BusType == CpTaskBusType.TaskBusType_CP_WeightIn.GetDescription()) //砝码只入五巷道 { if (result.ResData.Contains("5")) { result.ResData = "5"; } else { result.ResData = ""; } } //根据配置过滤禁用的巷道 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).SplitTable(p => p.Take(2)).First(); var task = _wcstaskinfo.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; } 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.Row == row && p.Col == col && p.Layer == layer); 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; item.EditTime = DateTime.Now; item.Memo = "入库完成"; } _billInvFlow.InsertRange(_mapper.Map>(stocklist)); if (task.BusType == CpTaskBusType.TaskBusType_CP_ProductStockIn.GetDescription() || task.BusType == CpTaskBusType.TaskBusType_CP_ProductBackStockIn.GetDescription()) { var list = new List(); //回调数据 foreach (var item in stocklist) { list.Add(new cpBillPushinfo { DocsNo = stock.InDocsNo, TypeCode = task.BusType == CpTaskBusType.TaskBusType_CP_ProductStockIn.GetDescription() ? CpFackbeekType.ProductStockIn.ToString() : CpFackbeekType.ProductBackStockIn.ToString(), RFIDBarCode = stock.ContGrpBarCode, HWBarCode = stock.BoxBarCode, 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(), HuTotalWt = stock.HuTotalWt }); } _billpushrepository.InsertRange(list); } //自动码垛的成箱数据要推送给mes //if (_sysconfigrepository.GetList(p => p.SType == "PalletizingType").Where(p => p.Code == task.AddrFrom).Any()) //{ // _boxitemsrepository.UpdateModelColumns(p => // new cpBoxItems() { UpLoadFlag = 0, EditTime = DateTime.Now }, p => p.HuNr == stock.BoxBarCode); //} _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.EditTime = DateTime.Now; if (task.BusType == CpTaskBusType.TaskBusType_CP_SalesDocStockOut.GetDescription()) { item.BomMatCode = "1"; } if (task.ManualRemarks != null && task.ManualRemarks.Contains("从MES手持机下发出库任务")) { item.BomMatCode = "2"; } item.Memo = "任务完成"; } var list = new List(); string pushtype = ""; if (task.BusType == CpTaskBusType.TaskBusType_CP_SalesDocStockOut.GetDescription() || task.BusType == TaskBusType.TaskBusType_HJ_ManualOut.GetDescription()) { if (task.BusType == CpTaskBusType.TaskBusType_CP_SalesDocStockOut.GetDescription()) { pushtype = CpFackbeekType.SalesDoc.ToString(); //回调数据 foreach (var item in stocklist) { list.Add(new cpBillPushinfo { DocsNo = item.SalesDoc, TypeCode = pushtype, RFIDBarCode = item.ContGrpBarCode, HWBarCode = item.BoxBarCode, 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() }); } } else { pushtype = CpFackbeekType.ManualOut.ToString(); //回调数据 foreach (var item in stocklist) { list.Add(new cpBillPushinfo { DocsNo = "", TypeCode = pushtype, RFIDBarCode = item.ContGrpBarCode, HWBarCode = item.BoxBarCode, 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 { if (task.BusType == TaskBusType.TaskBusType_HJ_ManualOut.GetDescription()) { var box = _boxitemsrepository.GetList(p => p.HuNr == stocklist.First().BoxBarCode); _db.BeginTran(); if (stocklist.First().IsBack == true) { _boxitemsrepository.Delete(p => p.HuNr == stocklist.First().BoxBarCode); } else { _boxitemsHistoryrepository.InsertRange(_mapper.Map>(box)); _boxitemsrepository.Delete(p => p.HuNr == stocklist.First().BoxBarCode); } _billnowrepository.Delete(p => stocklist.Select(p => p.Id).ToList().Contains(p.Id)); _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(); } else if (task.BusType == CpTaskBusType.TaskBusType_CP_SalesDocStockOut.GetDescription()) { var box = _boxitemsrepository.GetList(p => p.HuNr == stocklist.First().BoxBarCode); _db.BeginTran(); _billnowrepository.Delete(p => stocklist.Select(p => p.Id).ToList().Contains(p.Id)); //_billinitrepository.Delete(p => p.ContGrpBarCode == task.BarCode); if (stocklist.First().IsBack == true) { _boxitemsrepository.Delete(p => p.HuNr == stocklist.First().BoxBarCode); } else { _boxitemsHistoryrepository.InsertRange(_mapper.Map>(box)); _boxitemsrepository.Delete(p => p.HuNr == stocklist.First().BoxBarCode); } _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(); } else if (task.BusType == CpTaskBusType.TaskBusType_CP_SpacingBoardStockOut.GetDescription() || task.BusType == CpTaskBusType.TaskBusType_CP_TrayStockOut.GetDescription()) { _db.BeginTran(); _billnowrepository.Delete(p => stocklist.Select(p => p.Id).ToList().Contains(p.Id)); _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)); _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; int row = int.Parse(tocellno.Split('-')[0]); int col = int.Parse(tocellno.Split('-')[1]); int layer = int.Parse(tocellno.Split('-')[2]); 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)); _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.EditTime = DateTime.Now; flow.Memo = grcontcode + "移库(" + fromcellno + "至" + tocellno + ")"; _billInvFlow.Insert(flow); //推送表 var push = new cpBillPushinfo() { DocsNo = stock.InDocsNo, TypeCode = CpFackbeekType.MoveCell.ToString(), RFIDBarCode = stock.ContGrpBarCode, HWBarCode = stock.BoxBarCode, CLBarCode = stock.CLBarCode, WarehouseId = warehouse.Id, WarehouseCode = warehouse.Code, WareCellId = 0, WareCellCode = task.AddrTo, Memo = task.AddrFrom, MatId = stock.MatId, MatCode = stock.MatCode, MatName = stock.MatName, ReqNo = Guid.NewGuid().ToString() }; _billpushrepository.Insert(push); _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.Delivery) { try { var syscon = _sysconfigrepository.GetSingle(p => p.Code == task.AddrTo); if (syscon == null) { result.ResCode = ResponseStatusCodeEnum.EquipInfoNotExist.GetHashCode(); result.ResMsg = reqDto.TaskNum + ResponseStatusCodeEnum.EquipInfoNotExist.GetDescription(); return result; } //string defwhere = syscon.Cache1State; //if (string.IsNullOrEmpty(defwhere)) //{ // defwhere = "1234567890"; //} var notaskinv = _invviewrepository.Context.Ado.SqlQuery("select * from [WMS_ZT_01CP].[dbo].[SX_Inv_View] where BomMatCode ='" + task.ID + "'"); _db.BeginTran(); if (syscon.Cache1State == task.ID.ToString()) { //判断缓存工位2有没有信息 //缓存位的任务往前走到码垛工位,缓存位状态要清掉 if (!string.IsNullOrEmpty(syscon.Cache2Task)) { string def3 = syscon.Default3; if (string.IsNullOrEmpty(syscon.Default3)) { if (notaskinv.Any()) { def3 = task.ID.ToString(); } else { def3 = syscon.Cache2State; } } _sysconfigrepository.UpdateSetColumnsTrue(p => new cpSysConfig() { SContent = task.BarCode, EditTime = DateTime.Now, Default1 = "1", Default2 = task.Weight.ToString(),//铁托+底托+塑料托盘+隔板+包装袋 Default3 = def3, Default4 = task.Height.ToString(),//铁托 Cache1State = syscon.Cache2State, Memo = syscon.Cache2State, Cache2State = "", Cache2Task = "" }, p => p.Code == syscon.Code); } else { string def3 = syscon.Default3; if (string.IsNullOrEmpty(syscon.Default3)) { if (notaskinv.Any()) { def3 = task.ID.ToString(); } } _sysconfigrepository.UpdateSetColumnsTrue(p => new cpSysConfig() { SContent = task.BarCode, EditTime = DateTime.Now, Default1 = "1", Default2 = task.Weight.ToString(), Default3 = def3,//缓存托盘的任务号 Default4 = task.Height.ToString(),//铁托 Cache1State = "", Memo = "" }, p => p.Code == syscon.Code); } } else { if (syscon.Cache2Task == task.ID.ToString()) { _sysconfigrepository.UpdateSetColumnsTrue(p => new cpSysConfig() { Default1 = "1", SContent = task.BarCode, EditTime = DateTime.Now, Default2 = task.Weight.ToString(), Default3 = syscon.Cache2Task, Default4 = task.Height.ToString(),//铁托 Memo = "", Cache2Task = "", Cache2State = "" }, p => p.Code == syscon.Code); } else { _sysconfigrepository.UpdateSetColumnsTrue(p => new cpSysConfig() { Default1 = "1", SContent = task.BarCode, EditTime = DateTime.Now, Default2 = task.Weight.ToString(), Default4 = task.Height.ToString(),//铁托 Memo = "" }, p => p.Code == syscon.Code); } } //更新当前码垛位状态为执行中 _sysconfigrepository.Context.Ado.ExecuteCommand("update WMS_ZT_01SX.dbo.Palletizing set PalletizState= 0 where TaskNum=" + task.ID + ""); _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); _wcstaskold.AsUpdateable().SetColumns(p => new cpWCS_TaskOld() { AddrTo = res.ResData.CellNo, Tunnel = res.ResData.TunnelNum }).Where(p => p.ID == request.TaskNum).SplitTable(p => p.Take(2)).ExecuteCommand(); _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.ContGrpBarCode == wcstask.BarCode && p.InvStateCode == InvState.InvEcecState_BuildUp.ToString()); if (stock == null) { //砝码出库无库存信息创建组盘信息 if (wcstask.BusType == CpTaskBusType.TaskBusType_CP_WeightOut.GetDescription()) { var stocks = _billnowrepository.AsQueryable().Where(p => p.ContGrpBarCode == wcstask.BarCode).First(); if (stocks == null) { var trayCode = _materrepository.GetSingle(p => p.Code == Const.TrayType); var inv = new cpBillInvnow() { WarehouseId = trayCode.Id, ContGrpBarCode = wcstask.BarCode, ContGrpId = GetId(), BoxBarCode = wcstask.BarCode, InvStateCode = InvState.InvEcecState_BuildUp.ToString(), ExecStateCode = InvLockState.InvState_Normal.ToString(), MatId = trayCode.Id, MatCode = "FaMa", RFIDBarCode = wcstask.BarCode, HWTypeCode = trayCode.SpoolType, HWBarCode = wcstask.BarCode, InvInOut = 1, MatName = trayCode.Name, Size = 1, ContGrpType = 2, TolWQty = 7 }; _billnowrepository.Insert(inv); _billInvFlow.Insert(_mapper.Map(inv)); } } 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 ? true : false }); } 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 <= int.Parse(AppSettings.GetConfig("IsMoveCellCount")))) { res.ResCode = ResponseStatusCodeEnum.NotEnoughLocation.GetHashCode(); res.ResMsg = request.TunnelNum + "巷道的可用货位数" + emptyLoc.Count + ",禁止分配货位,预留移库使用"; 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 }); if (loc1ist != null && loc1ist.ToList().Where(p => p.MatCode == request.MaterialCode).Any()) { var resloc = loc1ist.ToList().Where(p => p.MatCode == request.MaterialCode).OrderBy(p => p.Layer).ThenByDescending(p => p.Col).ThenByDescending(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() && p.IsStop == 0) 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 = "可分配的二升位没有对应可使用的一升位"; return res; } var resloc = templist.Where(p => p.Depth == 2).OrderBy(p => p.Layer).ThenByDescending(p => p.Col).ThenByDescending(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 loc1ist1 = from loct1 in _baseWarecellrepository.GetList(loc1 => 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).ToList() join loct2 in _baseWarecellrepository.GetList(loc2 => loc2.IsStop == 0 && loc2.StateNum == LocationState.LocationState_Full.GetHashCode() && loc2.TypeNum == LocationType.LocationType_StorageLocation.GetHashCode() && loc2.Tunnel == request.TunnelNum && loc2.WarehouseId == request.WarehuoseId && loc2.Size == request.Size && loc2.Depth == 2).ToList() on new { loct1.Shelf, loct1.Col, loct1.Layer } equals new { loct2.Shelf, loct2.Col, loct2.Layer }// into temp select loct1; var loc = loc1ist1.ToList().OrderBy(p => p.Layer).ThenBy(p => p.Col).ThenBy(p => p.Row).First(); //var loc = loc1ist1.ToList().First(); //var loc = loc1ist.ToList().OrderBy(p => p.Layer).ThenByDescending(p => p.Col).ThenByDescending(p => p.Row).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(); var wcstask = _wcstaskinfo.AsQueryable().With(SqlWith.NoLock).Where(p => p.ID == request.TaskNum && p.Status < TaskStatus.Finish && p.Type == TaskType.OutDepot).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 (wcstask.BusType == CpTaskBusType.TaskBusType_CP_WeightOut.GetDescription()) { //更新库存 _billnowrepository.UpdateModelColumns(p => new cpBillInvnow() { InvStateCode = InvState.InvEcecState_BuildUp.ToString()}, p => p.InvStateCode == InvState.InvEcecState_OutGoing.ToString() && p.ContGrpBarCode == wcstask.BarCode); } 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.EditTime = 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(), TaskGroupKey = stock.BoxBarCode }; _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 UpdateTaskState(UpdateTaskStateRequest request) { var res = new SRes(); var task = _wcstaskinfo.GetSingle(p => p.ID == request.TaskNo); if (task == null) { res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode(); res.ResMsg = request.TaskNo + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription(); return res; } _wcstaskinfo.UpdateSetColumnsTrue(p => new cpWCS_TaskInfo() { Status = request.Status, EditTime = DateTime.Now, ManualRemarks = "手动修改任务状态" }, p => p.ID == request.TaskNo); _wcstaskold.AsUpdateable().SetColumns(p => new cpWCS_TaskOld() { Status = request.Status, EditTime = DateTime.Now, ManualRemarks = "手动修改任务状态" }).Where(p => p.ID == request.TaskNo).SplitTable(p => p.Take(2)).ExecuteCommand(); 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 + "货架" + dept + "深度", 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 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.Zero) { 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 = item + 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 = stock.BoxBarCode + "组盘状态不是已入库"; return res; } if (stock.IsFail == true) { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = $"异常轮{stock.BoxBarCode}不允许生产出库,请联系自动化人员"; return res; } var task = new cpWCS_TaskInfo() { Status = TaskStatus.NewBuild, Type = TaskType.OutDepot, Priority = 0, Device = "SRM" + location.Tunnel, SrmStation = "", AddrFrom = item, BarCode = stock.ContGrpBarCode, AddWho = "wms", WarehouseCode = location.WarehouseCode, Enabled = true, WorkBench = request.EndPoint.ToString(), AddrTo = request.EndPoint.ToString(), Tunnel = location.Tunnel.ToString(), PalletType = 1, Length = stock.LengthQty, MaterialCode = stock.MatCode, MatCode = stock.MatCode, OutType = OutTypeEnum.全自动手动出库任务, BusType = request.BusType, TaskGroupKey = stock.BoxBarCode, ManualRemarks = request.User + "下发手动出库任务" }; _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.AddTime = DateTime.Now; flow.EditTime = DateTime.Now; flow.Memo = request.User + "手动出库"; _billInvFlow.Insert(flow); _db.CommitTran(); } } catch (Exception ex) { _db.RollbackTran(); _logger.LogInformation("出库异常:" + ex.Message); res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.DataSaveErr.GetDescription() + ex.Message; return res; } return res; } public SRes ErrorManualTask(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.Zero) { 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 = item + ResponseStatusCodeEnum.StockNotExist.GetDescription(); return res; } if (stock.InvStateCode != InvState.InvEcecState_In.ToString()) { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = stock.BoxBarCode + "组盘状态不是已入库"; return res; } if (stock.IsFail != true) { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = $"{stock.BoxBarCode}不是异常箱,不允许出库,请联系自动化人员"; return res; } var task = new cpWCS_TaskInfo() { Status = TaskStatus.NewBuild, Type = TaskType.OutDepot, Priority = 0, Device = "SRM" + location.Tunnel, SrmStation = "", AddrFrom = item, BarCode = stock.ContGrpBarCode, AddWho = "wms", WarehouseCode = location.WarehouseCode, Enabled = true, WorkBench = request.EndPoint.ToString(), AddrTo = request.EndPoint.ToString(), Tunnel = location.Tunnel.ToString(), PalletType = 1, Length = stock.LengthQty, MaterialCode = stock.MatCode, MatCode = stock.MatCode, OutType = OutTypeEnum.全自动手动出库任务, BusType = request.BusType, TaskGroupKey = stock.BoxBarCode, ManualRemarks = request.User + "下发异常箱手动出库任务" }; _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.AddTime = DateTime.Now; flow.EditTime = DateTime.Now; flow.Memo = request.User + "异常箱手动出库"; _billInvFlow.Insert(flow); _db.CommitTran(); } } catch (Exception ex) { _db.RollbackTran(); _logger.LogInformation("出库异常:" + ex.Message); res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.DataSaveErr.GetDescription() + ex.Message; return res; } return res; } public SRes MesManualTask(CpMesManualTaskRequest request) { var res = new SRes(); if (request.BoxList == null || !request.BoxList.Any()) { res.ResCode = ResponseStatusCodeEnum.ErrParamNotNull.GetHashCode(); res.ResMsg = "箱号" + ResponseStatusCodeEnum.ErrParamNotNull.GetDescription(); return res; } try { foreach (var item in request.BoxList) { var stocklist = _billnowrepository.GetList(p => p.BoxBarCode == item && p.InvStateCode == InvState.InvEcecState_In.ToString()); if (stocklist == null || !stocklist.Any()) { res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode(); res.ResMsg = item + "没查到立库库存,请确认是否已经出库或有任务执行中"; return res; } if (stocklist.Count > 1) { res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode(); res.ResMsg = item + "有两条库存信息,请检查库存是否正常"; return res; } var stock = stocklist.First(); if (stock == null) { res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode(); res.ResMsg = item + ResponseStatusCodeEnum.StockNotExist.GetDescription(); return res; } var locationlist = _baseWarecellrepository.GetList(p => p.ContGrpBarCode == stock.ContGrpBarCode); if (locationlist.Count > 1) { res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode(); res.ResMsg = stock.ContGrpBarCode + "有两条货位库存信息,请到货位管理确认"; return res; } var location = locationlist.First(); 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.Zero) { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.Fail.GetDescription() + item + "货位被禁用"; 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 = stock.BoxBarCode + "组盘状态不是已入库"; return res; } if (stock.IsFail == true) { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = $"异常轮{stock.BoxBarCode}不允许生产出库,请联系自动化人员"; return res; } //获取绕向 var winding = _boxitemsrepository.Context.Queryable() .With(SqlWith.NoLock) .Where(x => x.HuNr == stock.BoxBarCode) .OrderByDescending(x => x.AddTime).First(); var task = new cpWCS_TaskInfo() { Status = TaskStatus.NewBuild, Type = TaskType.OutDepot, Priority = 0, Device = "SRM" + location.Tunnel, SrmStation = "", AddrFrom = location.Code, BarCode = stock.ContGrpBarCode, 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 = TaskBusType.TaskBusType_HJ_ManualOut.GetDescription(), TaskGroupKey = stock.BoxBarCode, ManualRemarks = request.User + "从MES手持机下发出库任务" }; if (winding != null) { task.InvBarCode = winding.Winding; } _db.BeginTran(); var wcs = _wcstaskinfo.InsertReturnEntity(task); _wcstaskold.InsertableSplitTable(_mapper.Map(wcs)); var taskdtl = new cpWCS_TaskDtl() { ID = Guid.NewGuid(), CurPoint = location.Code, 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 == location.Code); _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.AddTime = DateTime.Now; flow.EditTime = DateTime.Now; flow.Memo = request.User + "从MES手持机下发出库任务"; _billInvFlow.Insert(flow); _db.CommitTran(); } } catch (Exception ex) { _db.RollbackTran(); _logger.LogInformation("出库异常:" + ex.Message); res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.DataSaveErr.GetDescription() + ex.Message; return res; } return res; } public SRes InsertBoxItems(List request) { var res = new SRes(); _boxitemsrepository.InsertRange(request); return res; } /// /// 销售单出库任务 /// /// /// public SRes SalesDocOutTask(SalesDocOutTaskRequest request) { var res = new SRes(); if (string.IsNullOrEmpty(request.SalesDoc)) { res.ResCode = ResponseStatusCodeEnum.ErrParamNotNull.GetHashCode(); res.ResMsg = "销售单:" + request.SalesDoc + ResponseStatusCodeEnum.ErrParamNotNull.GetDescription(); return res; } if (string.IsNullOrEmpty(request.Equip.ToString())) { res.ResCode = ResponseStatusCodeEnum.ErrParamNotNull.GetHashCode(); res.ResMsg = "自动出货口:" + request.Equip + ResponseStatusCodeEnum.ErrParamNotNull.GetDescription(); return res; } var inv = _billnowrepository.GetList(p => p.InvStateCode == InvState.InvEcecState_In.ToString() && p.SalesDoc == request.SalesDoc && p.State == "1" && p.ExecStateCode == InvLockState.InvState_Normal.ToString()); if (!inv.Any()) { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = request.SalesDoc + "没有可用库存"; return res; } var celllist = _baseWarecellrepository.GetList(p => inv.Select(x => x.ContGrpBarCode).ToList().Contains(p.ContGrpBarCode) && inv.Select(x => x.ContGrpId).ToList().Contains((long)p.ContGrpId) && p.StateNum == LocationState.LocationState_Full.GetHashCode()).OrderBy(v => v.Depth); if (!celllist.Any()) { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = $"销售单:{request.SalesDoc}没有找到符合条件的货位状态"; return res; } var tunlist = _sysconfigrepository.GetList(p => p.SType == "OutStop" && p.Default2 == "TunnelType" && !string.IsNullOrEmpty(p.SContent)); try { foreach (var item in celllist) { //var location = _baseWarecellrepository.GetSingle(p => p.ContGrpBarCode == item.ContGrpBarCode && p.StateNum == LocationState.LocationState_Full.GetHashCode()); //if (location == null) //{ // res.ResCode = ResponseStatusCodeEnum.WareLocationCodeNotExist.GetHashCode(); // res.ResMsg = item.BoxBarCode + "货位不存在物料信息"; // _db.RollbackTran(); // return res; //} if (item.IsStop != Const.Zero) { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = $"{item.Code}货位已被禁用,对应的托盘号{item.ContGrpBarCode},请先解禁"; return res; } if (tunlist.Any()) { if (tunlist.Where(p => p.Default1 == item.Tunnel.ToString()).Any()) { continue; } } //从新查询数据库,为确保最新数据,不使用排他锁 var stocks = inv.Where(p => p.ContGrpBarCode == item.ContGrpBarCode && p.ContGrpId == item.ContGrpId).FirstOrDefault(); if (stocks == null) { continue; } var stock = _billnowrepository.GetSingle(p => p.ContGrpBarCode == item.ContGrpBarCode && stocks.BoxBarCode == p.BoxBarCode && p.ContGrpId == item.ContGrpId); if (stock.IsFail == true) { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = $"异常轮{stock.BoxBarCode}不允许生产出库,请联系自动化人员"; return res; } var flow = _mapper.Map(stock); flow.Id = GetId(); flow.InvStateCode = InvState.InvEcecState_OutGoing.ToString(); flow.AddTime = DateTime.Now; flow.EditTime = DateTime.Now; var location = _baseWarecellrepository.GetSingle(p => p.ContGrpBarCode == item.ContGrpBarCode && p.StateNum == LocationState.LocationState_Full.GetHashCode() && p.Code == item.Code && p.IsStop == Const.Zero); if (location == null) { res.ResCode = ResponseStatusCodeEnum.WareLocationCodeNotExist.GetHashCode(); res.ResMsg = $"货位{item.Code}不存在箱号信息" + stock.BoxBarCode; _db.RollbackTran(); return res; } //获取绕向 var winding = _boxitemsrepository.Context.Queryable() .With(SqlWith.NoLock) .Where(x => x.HuNr == stock.BoxBarCode) .OrderByDescending(x => x.AddTime).First(); var task = new cpWCS_TaskInfo() { Status = TaskStatus.NewBuild, Type = TaskType.OutDepot, Priority = 0, Device = "SRM" + item.Tunnel, SrmStation = "", AddrFrom = item.Code, BarCode = stock.ContGrpBarCode, AddWho = "wms", EditWho = "wms", WarehouseCode = "cphouse", AddrTo = request.Equip.ToString(), Tunnel = item.Tunnel.ToString(), MaterialCode = stock.MatCode, MatCode = stock.MatCode, BusType = CpTaskBusType.TaskBusType_CP_SalesDocStockOut.GetDescription(), OutType = OutTypeEnum.自动出库任务, TaskGroupKey = stock.BoxBarCode, }; if (winding != null) { task.InvBarCode = winding.Winding; } _db.BeginTran(); var wcs = _wcstaskinfo.InsertReturnEntity(task); _wcstaskold.InsertableSplitTable(_mapper.Map(wcs)); var taskdtl = new cpWCS_TaskDtl() { ID = Guid.NewGuid(), CurPoint = item.Code, AddTime = DateTime.Now, AddWho = "wms", Enabled = true, ParentTaskCode = wcs.ID, Desc = wcs.BusType }; _wcstaskdtl.InsertableSplitTable(taskdtl); //_billnowrepository.UpdateSetColumnsTrue(p => new cpBillInvnow() //{ // InvStateCode = InvState.InvEcecState_OutGoing.ToString(), // EditTime = DateTime.Now //}, p => p.ContGrpBarCode == stock.ContGrpBarCode && p.BoxBarCode == stock.BoxBarCode); _billnowrepository.AsUpdateable().SetColumns(p => new cpBillInvnow() { InvStateCode = InvState.InvEcecState_OutGoing.ToString(), EditTime = DateTime.Now }).Where(p => p.ContGrpBarCode == stock.ContGrpBarCode && p.BoxBarCode == stock.BoxBarCode).ExecuteCommand(); _baseWarecellrepository.UpdateSetColumnsTrue(p => new cpBaseWarecell() { StateNum = 4, EditTime = DateTime.Now }, p => p.Code == item.Code && p.ContGrpBarCode == item.ContGrpBarCode); _billInvFlow.Insert(flow); _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 SyncMaterInfoList(CpSyncMaterInfoListRequest request) { var res = new SRes(); var ware = _basewarehouserepository.GetList().First(); if (!string.IsNullOrEmpty(request.MatCode)) { if (_materrepository.IsAny(p => p.Code == request.MatCode)) { _materrepository.UpdateModelColumns(p => new cpBaseMatinfo() { IsHold = request.IsHold, HoldDuration = request.HoldDuration, Name = request.MatName, EditTime = DateTime.Now }, p => p.Code == request.MatCode); } else { var model = _mapper.Map(request); model.WarehouseId = ware.Id; _materrepository.Insert(model); } } return res; } /// /// 手动移库 /// /// /// public SRes MoveTaskInfo(MoveTaskRequest request) { var res = new SRes(); var curcell = _baseWarecellrepository.GetSingle(p => p.Code == request.Cell); if (curcell == null) { res.ResCode = ResponseStatusCodeEnum.WareLocationCodeNotExist.GetHashCode(); res.ResMsg = request.Cell + ResponseStatusCodeEnum.WareLocationCodeNotExist.GetDescription(); return res; } if (curcell.Depth == 2) { //获取一深位货位 var dept1cell = _baseWarecellrepository.GetSingle(p => p.Col == curcell.Col && p.Layer == curcell.Layer && p.Shelf == curcell.Shelf && p.Row != curcell.Row); if (dept1cell == null) { res.ResCode = ResponseStatusCodeEnum.WareLocationCodeNotExist.GetHashCode(); res.ResMsg = dept1cell.Code + ResponseStatusCodeEnum.WareLocationCodeNotExist.GetDescription(); return res; } if (dept1cell.IsStop == 1) { res.ResCode = ResponseStatusCodeEnum.WareLocationCodeNotExist.GetHashCode(); res.ResMsg = dept1cell.Code + "已被禁用,对应二深位不能移库"; return res; } if (dept1cell.StateNum != 1) { res.ResCode = ResponseStatusCodeEnum.WareLocationCodeNotExist.GetHashCode(); res.ResMsg = dept1cell.Code + "货位不是空状态,对应二深位不能移库"; return res; } } try { var stock = _billnowrepository.GetFirst(p => p.ContGrpBarCode == curcell.ContGrpBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString()); if (stock == null) { res.ResCode = WcsContractWcsMoveTaskEnum.失败.GetHashCode(); res.ResMsg = curcell.Code + "货位库存信息异常,没有查到库存信息"; return res; } var wareshouse = _basewarehouserepository.GetSingle(p => p.Code == curcell.WarehouseCode); //库位 //var cell = ApplyLoc(new CpApplyLocRequest() //{ // IsMove = true, // MaterialId = stock.MatId, // MaterialCode = stock.MatCode, // Size = stock.Size, // TunnelNum = request.Tunnel, // WarehuoseId = wareshouse.Id //}); var cell = _baseWarecellrepository.GetSingle(p => p.Code == request.ToCell); //if (string.IsNullOrEmpty(cell.CellNo)) //{ // res.ResCode = WcsContractWcsMoveTaskEnum.失败.GetHashCode(); // res.ResMsg = cell.ResMsg; // return res; //} if (cell == null) { res.ResCode = ResponseStatusCodeEnum.WareLocationCodeNotExist.GetHashCode(); res.ResMsg = request.ToCell + ResponseStatusCodeEnum.WareLocationCodeNotExist.GetDescription(); return res; } var wcs = new cpWCS_TaskInfo() { Type = TaskType.TransferDepot, Status = TaskStatus.NewBuild, Priority = 0, Device = "SRM" + request.Tunnel, SrmStation = "", AddrFrom = curcell.Code, AddrTo = request.ToCell, 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 = request.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; } catch (Exception ex) { _db.RollbackTran(); res.ResCode = WcsContractWcsMoveTaskEnum.失败.GetHashCode(); res.ResMsg = WcsContractWcsMoveTaskEnum.失败.GetDescription(); _logger.LogInformation(ex.ToString()); return res; } return res; } public SRes CpCancelTaskVerify(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 = _wcstaskold.AsQueryable().Where(p => p.ID == item && p.Status < TaskStatus.Finish).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 = _billnowrepository.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 = _billnowrepository.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.TransferDepot) { //验证组盘状态 var stock = _billnowrepository.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.取消任务) { res.ResCode = ResponseStatusCodeEnum.StockStateFail.GetHashCode(); res.ResMsg = stock.ContGrpBarCode + "移库任务不允许取消"; return res; } } } return res; } public SRes CpCarryTaskInfo(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) { if (request.State == HandleTaskTypeEnum.完成任务) { var con = CpCompleteTask(new CompleteTaskRequest() { TaskNum = item, OperationType = 2, WCSUpdateName = "手动完成任务", Memo1 = "", Memo2 = "" }); if (con.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode()) { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = item + "任务完成" + ResponseStatusCodeEnum.Fail.GetDescription(); return res; } } if (request.State == HandleTaskTypeEnum.取消任务) { var con = CpCancelTask(new CompleteTaskRequest() { TaskNum = item, OperationType = 2, WCSUpdateName = "手动取消任务", Memo1 = "", Memo2 = "" }); if (con.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode()) { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = item + "任务取消" + ResponseStatusCodeEnum.Fail.GetDescription(); return res; } } } return res; } private SRes CpCancelTask(CompleteTaskRequest request) { var res = new SRes() { ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode(), ResMsg = ResponseStatusCodeEnum.Sucess.GetDescription() }; var task = _wcstaskold.AsQueryable().Where(p => p.ID == request.TaskNum && p.Status < TaskStatus.Finish).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 = _billnowrepository.GetSingle(p => p.ContGrpBarCode == task.BarCode); if (stock == null) { res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode(); res.ResMsg = task.BarCode + ResponseStatusCodeEnum.StockNotExist.GetDescription(); return res; } var flow = _mapper.Map(stock); flow.Id = GetId(); flow.InvStateCode = InvState.InvEcecState_Out.ToString(); flow.Memo = "WCS取消入库任务"; flow.AddTime = DateTime.Now; flow.EditTime = DateTime.Now; _db.BeginTran(); _billnowrepository.DeleteById(stock.Id); _billInvFlow.Insert(flow); if (stock.ContGrpType == 1) { var boxlist = _boxitemsrepository.GetList(p => p.HuNr == stock.BoxBarCode); _boxitemsrepository.Delete(p => p.HuNr == stock.BoxBarCode); _boxitemsHistoryrepository.InsertRange(_mapper.Map>(boxlist)); } _db.CommitTran(); } else if (task.Type == TaskType.OutDepot) { //验证组盘状态 var stock = _billnowrepository.GetSingle(p => p.ContGrpBarCode == task.BarCode); if (stock == null) { res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode(); res.ResMsg = task.BarCode + 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.AddTime = DateTime.Now; flow.EditTime = DateTime.Now; _db.BeginTran(); _baseWarecellrepository.UpdateSetColumnsTrue(p => new cpBaseWarecell() { StateNum = 2, EditTime = DateTime.Now }, p => p.ContGrpBarCode == task.BarCode); _billnowrepository.UpdateSetColumnsTrue(p => new cpBillInvnow() { InvStateCode = InvState.InvEcecState_In.ToString(), EditTime = DateTime.Now }, p => p.ContGrpBarCode == task.BarCode); _billInvFlow.Insert(flow); _db.CommitTran(); } else { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = task.ID + ResponseStatusCodeEnum.Fail.GetDescription() + "该任务类型不允许取消"; return res; } } catch (Exception ex) { _db.RollbackTran(); res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = task.ID + ResponseStatusCodeEnum.Fail.GetDescription() + ex.Message; return res; } return res; } public bool UpdatePuchinfoModelColumns(UpdateModelColumns updateModel) { return _billpushrepository.Update(updateModel.Columns, updateModel.WhereExpression); } public SRes ForceCancelTask(ErrorTaskRequest request) { var res = new SRes(); if (string.IsNullOrEmpty(request.TaskNo)) { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.ErrParamNotNull.GetDescription(); return res; } if (request.WareHouse != Const.CpWareHouse) { res.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode(); res.ResMsg = request.WareHouse + ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription(); return res; } var task = _wcstaskold.AsQueryable().Where(p => p.ID == int.Parse(request.TaskNo) && p.Status < TaskStatus.Finish).SplitTable(p => p.Take(2)).First(); if (task == null) { if (_wcstaskinfo.IsAny(p => p.ID == int.Parse(request.TaskNo))) { _wcstaskinfo.Delete(p => p.ID == int.Parse(request.TaskNo)); } res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode(); res.ResMsg = request.TaskNo + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription(); return res; } if (_wcstaskinfo.IsAny(p => p.ID == int.Parse(request.TaskNo))) { _wcstaskinfo.Delete(p => p.ID == int.Parse(request.TaskNo)); } if (task.Status != TaskStatus.Cancel) { var oldtask = _mapper.Map(task); oldtask.Status = TaskStatus.Cancel; oldtask.EditTime = DateTime.Now; oldtask.ManualRemarks = "强制取消任务"; _wcstaskold.AsUpdateable(oldtask).Where(p => p.ID == task.ID).SplitTable(p => p.Take(2)).ExecuteCommand(); } return res; } public SRes DeleteStockInfo(DetailCodeStrRequest request) { var res = new SRes(); if (request.WareHouse != Const.CpWareHouse) { res.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode(); res.ResMsg = request.WareHouse + ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription(); return res; } var stock = _billnowrepository.GetSingle(p => p.ContGrpBarCode == request.Code); if (stock == null) { res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode(); res.ResMsg = request.Code + ResponseStatusCodeEnum.StockNotExist.GetDescription(); return res; } else { //if (stock.InvStateCode == InvState.InvEcecState_In.ToString()) //{ // _baseWarecellrepository.UpdateSetColumnsTrue(p => new cpBaseWarecell() // { // StateNum = 1, // ContGrpBarCode = "", // ContGrpId = 0 // }, p => p.Row == stock.PutRow && p.Col == stock.PutCol && p.Layer == stock.PutLayer); // if (stock.ContGrpType == 1) // { // var boxlist = _boxitemsrepository.GetList(p => p.HuNr == stock.BoxBarCode); // _boxitemsrepository.Delete(p => p.HuNr == stock.BoxBarCode); // _boxitemsHistoryrepository.InsertRange(_mapper.Map>(boxlist)); // var push = new cpBillPushinfo() // { // DocsNo = "Test" + DateTime.Now.ToString("HHmmss"), // TypeCode = CpFackbeekType.SalesDoc.ToString(), // RFIDBarCode = stock.ContGrpBarCode, // HWBarCode = stock.BoxBarCode, // CLBarCode = stock.CLBarCode, // WarehouseId = stock.WarehouseId, // WarehouseCode = request.WareHouse, // WareCellId = 0, // WareCellCode = stock.PutRow + "-" + stock.PutCol + "-" + stock.PutLayer, // MatId = stock.MatId, // MatCode = stock.MatCode, // MatName = stock.MatName, // ReqNo = Guid.NewGuid().ToString() // }; // _billpushrepository.Insert(push); // } //} if (stock.InvStateCode == InvState.InvEcecState_BuildUp.ToString()) { if (stock.ContGrpType == 1) { var flow = _billInvFlow.AsQueryable().Where(p => p.ContGrpBarCode == stock.ContGrpBarCode).OrderByDescending(p => p.AddTime).First(); flow.Id = GetId(); flow.InvStateCode = InvState.InvEcecState_Out.ToString(); flow.AddTime = DateTime.Now; flow.EditTime = DateTime.Now; flow.Memo = "异常处理库存"; _billInvFlow.Insert(flow); _billnowrepository.Delete(p => p.ContGrpBarCode == stock.ContGrpBarCode); var boxlist = _boxitemsrepository.GetList(p => p.HuNr == stock.BoxBarCode); _boxitemsrepository.Delete(p => p.HuNr == stock.BoxBarCode); _boxitemsHistoryrepository.InsertRange(_mapper.Map>(boxlist)); } else { var flow = _billInvFlow.AsQueryable().Where(p => p.ContGrpBarCode == stock.ContGrpBarCode).OrderByDescending(p => p.AddTime).First(); flow.Id = GetId(); flow.InvStateCode = InvState.InvEcecState_Out.ToString(); flow.AddTime = DateTime.Now; flow.EditTime = DateTime.Now; flow.Memo = "异常处理库存"; _billInvFlow.Insert(flow); _billnowrepository.Delete(p => p.ContGrpBarCode == stock.ContGrpBarCode); } } else if (stock.InvStateCode == InvState.InvEcecState_In.ToString()) { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = stock.BoxBarCode + "箱号已在库中,不允许删除"; return res; } else if (stock.InvStateCode == InvState.InvEcecState_OutGoing.ToString()) { if (stock.PutRow == 0 && stock.PutCol == 0 && stock.PutLayer == 0) { if (stock.ContGrpType == 1) { var boxlist = _boxitemsrepository.GetList(p => p.HuNr == stock.BoxBarCode); _boxitemsrepository.Delete(p => p.HuNr == stock.BoxBarCode); _boxitemsHistoryrepository.InsertRange(_mapper.Map>(boxlist)); var push = new cpBillPushinfo() { DocsNo = "Test" + DateTime.Now.ToString("HHmmss"), TypeCode = CpFackbeekType.SalesDoc.ToString(), RFIDBarCode = stock.ContGrpBarCode, HWBarCode = stock.BoxBarCode, CLBarCode = stock.CLBarCode, WarehouseId = stock.WarehouseId, WarehouseCode = request.WareHouse, WareCellId = 0, WareCellCode = stock.PutRow + "-" + stock.PutCol + "-" + stock.PutLayer, MatId = stock.MatId, MatCode = stock.MatCode, MatName = stock.MatName, ReqNo = Guid.NewGuid().ToString() }; _billpushrepository.Insert(push); } } } } return res; } public SRes UpdateStockState(DetailCodeStr1Requestdto request) { var res = new SRes(); if (request.WareHouse != Const.CpWareHouse) { res.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode(); res.ResMsg = request.WareHouse + ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription(); return res; } var stock = _billnowrepository.GetSingle(p => p.ContGrpBarCode == request.Code); if (stock == null) { res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode(); res.ResMsg = request.Code + ResponseStatusCodeEnum.StockNotExist.GetDescription(); return res; } var status = ""; switch (request.State) { case 1: status = InvState.InvEcecState_BuildUp.ToString(); break; case 3: status = InvState.InvEcecState_In.ToString(); break; case 4: status = InvState.InvEcecState_OutGoing.ToString(); break; case 5: status = InvState.InvEcecState_Out.ToString(); break; default: res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode(); res.ResMsg = "状态" + ResponseStatusCodeEnum.ErrParam.GetDescription(); return res; } try { var p = _billnowrepository.UpdateSetColumnsTrue(p => new cpBillInvnow() { InvStateCode = status, EditTime = DateTime.Now }, p => p.ContGrpBarCode == stock.ContGrpBarCode); if (!p) { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = stock.ContGrpBarCode + ResponseStatusCodeEnum.Fail.GetDescription(); return res; } var flow = _mapper.Map(stock); flow.Id = GetId(); flow.AddTime = DateTime.Now; flow.EditTime = DateTime.Now; flow.InvStateCode = status; _billInvFlow.Insert(flow); } catch (Exception ex) { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = request.Code + ResponseStatusCodeEnum.Fail.GetDescription() + ex.Message; return res; } return res; } public SRes UpdateCellState(DetailCodeStr1Requestdto request) { var res = new SRes(); if (request.WareHouse != Const.CpWareHouse) { res.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode(); res.ResMsg = request.WareHouse + ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription(); return res; } var cell = _baseWarecellrepository.GetSingle(p => p.Code == request.Code); if (cell == null) { res.ResCode = ResponseStatusCodeEnum.WareLocationCodeNotExist.GetHashCode(); res.ResMsg = request.Code + ResponseStatusCodeEnum.WareLocationCodeNotExist.GetDescription(); return res; } _baseWarecellrepository.UpdateSetColumnsTrue(p => new cpBaseWarecell() { StateNum = request.State, EditTime = DateTime.Now }, p => p.Code == request.Code); return res; } public SRes UpdateBoxFail(string boxcode) { var res = new SRes(); var p = _billnowrepository.UpdateSetColumnsTrue(p => new cpBillInvnow() { Memo = "临时箱推送失败,自动设置成异常箱", EditWho = "自动触发", IsFail = true, FailReason = "临时箱推送失败,自动设置成异常箱", EditTime = DateTime.Now }, p => p.BoxBarCode == boxcode); return res; } public SRes DataSwapCell(DataSwapCellStrRequest request) { var res = new SRes(); if (request.WareHouse != Const.CpWareHouse) { res.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode(); res.ResMsg = request.WareHouse + ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription(); return res; } 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 = _billnowrepository.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 = _billnowrepository.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 cpBaseWarecell() { ContGrpBarCode = fromCell.ContGrpBarCode, ContGrpId = fromCell.ContGrpId }, p => p.Code == toCell.Code); _baseWarecellrepository.UpdateSetColumnsTrue(p => new cpBaseWarecell() { ContGrpBarCode = toCell.ContGrpBarCode, ContGrpId = toCell.ContGrpId }, p => p.Code == fromCell.Code); _billnowrepository.UpdateModelColumns(p => new cpBillInvnow() { PutRow = toCell.Row, PutCol = toCell.Col, PutLayer = toCell.Layer }, p => p.ContGrpBarCode == fromCell.ContGrpBarCode); _billnowrepository.UpdateModelColumns(p => new cpBillInvnow() { 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(DataBasePatchRequest request) { var res = new SRes(); if (request.WareHouse != Const.CpWareHouse) { res.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode(); res.ResMsg = request.WareHouse + ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription(); return res; } var stock = _billnowrepository.GetSingle(p => p.ContGrpBarCode == request.Code); if (stock != 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 (request.ContGrpType == 1) { var boxCode = _billnowrepository.GetSingle(p => p.BoxBarCode == request.BoxCode); if (boxCode != null) { res.ResCode = ResponseStatusCodeEnum.BarcodeContainerRepeat.GetHashCode(); res.ResMsg = request.BoxCode + ResponseStatusCodeEnum.BarcodeContainerRepeat.GetDescription(); return res; } var flow = _billInvFlow.AsQueryable().Where(p => p.ContGrpBarCode == request.Code && p.BoxBarCode == request.BoxCode && p.ContGrpType == request.ContGrpType).OrderByDescending(p => p.EditTime).First(); if (flow == null) { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = request.Code + "不存在流水信息,不允许补数据"; return res; } } else if (request.ContGrpType == 2 || request.ContGrpType == 3) { 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; } 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 = "手动补数据"; _db.BeginTran(); _billnowrepository.Insert(_mapper.Map(flow)); _billInvFlow.Insert(flow); _baseWarecellrepository.UpdateSetColumnsTrue(p => new cpBaseWarecell() { 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 UpdatePurchState(UpdatePurchStateRequestdto request) { var res = new SRes(); if (!request.Id.Any()) { res.ResCode = ResponseStatusCodeEnum.ErrParamNotNull.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.ErrParamNotNull.GetDescription(); return res; } foreach (var item in request.Id) { var pursh = _billpushrepository.GetSingle(p => p.Id == item); if (pursh != null) { _billpushrepository.UpdateSetColumnsTrue(p => new cpBillPushinfo() { PostQty = 5, PostResult = 0, Memo = "手动推送" }, p => p.Id == pursh.Id); } } return res; } public SRes UpdateTaskAddrTo(UpdateTaskAddrToReq request) { var res = new SRes(); if (string.IsNullOrEmpty(request.TaskNo)) { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.ErrParamNotNull.GetDescription(); return res; } var task = _wcstaskinfo.AsQueryable().Where(p => p.ID == int.Parse(request.TaskNo) && p.Status < TaskStatus.Finish).First(); if (task == null) { res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode(); res.ResMsg = request.TaskNo + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription(); return res; } task.AddrTo = request.AddrTo; task.EditTime = DateTime.Now; task.ManualRemarks = "手动修改目标地址"; _wcstaskinfo.AsUpdateable(task).Where(p => p.ID == task.ID).ExecuteCommand(); return res; } public SRes DataMoveCell(DataSwapCellStrRequest request) { var res = new SRes(); if (request.WareHouse != Const.CpWareHouse) { res.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode(); res.ResMsg = request.WareHouse + ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription(); return res; } 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 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; } var stock = _billnowrepository.GetSingle(p => p.ContGrpBarCode == fromCell.ContGrpBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString()); if (stock == null) { res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode(); res.ResMsg = fromCell.ContGrpBarCode + ResponseStatusCodeEnum.StockNotExist.GetDescription(); return res; } try { _db.BeginTran(); _baseWarecellrepository.UpdateSetColumnsTrue(p => new cpBaseWarecell() { StateNum = LocationState.LocationState_Empty.GetHashCode(), ContGrpBarCode = "", ContGrpId = 0, EditTime = DateTime.Now }, p => p.Code == fromCell.Code); _baseWarecellrepository.UpdateSetColumnsTrue(p => new cpBaseWarecell() { StateNum = LocationState.LocationState_Full.GetHashCode(), ContGrpBarCode = fromCell.ContGrpBarCode, ContGrpId = fromCell.ContGrpId, EditTime = DateTime.Now }, p => p.Code == toCell.Code); _billnowrepository.UpdateSetColumnsTrue(p => new cpBillInvnow() { PutRow = toCell.Row, PutCol = toCell.Col, PutLayer = toCell.Layer }, p => p.ContGrpBarCode == fromCell.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 cpSysJob GetJobEntityByid(string id) { return _sysJobrepository.GetSingle(p => p.Id == long.Parse(id)); } public cpSysJob GetJobEntityByCode(string Code) { return _sysJobrepository.GetSingle(p => p.Code == Code); } public List GetJobapilist(long id) { return _sysJobApirepository.GetList(p => p.JobId == id); } public SRes ErpCancelStock(ErpCancelStockRequest request) { var res = new SRes(); var stocklist = _billnowrepository.GetList(p => p.SalesDoc == request.BillCode); if (!stocklist.Any()) { res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode(); res.ResMsg = request.BillCode + "当前单号绑定的箱号已全部出库,不能取消"; return res; } foreach (var item in request.BoxList) { var stock = _billnowrepository.GetSingle(p => p.BoxBarCode == item && p.SalesDoc == request.BillCode && p.PutRow != 0 && p.PutCol != 0 && p.PutLayer != 0); if (stock == null) { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = item + "当前箱号已出库,不能取消"; return res; } var task = _wcstaskold.AsQueryable().Where(p => p.BarCode == stock.ContGrpBarCode && p.Status < TaskStatus.Finish && p.Type == TaskType.OutDepot).SplitTable(p => p.Take(2)).First(); if (task == null) { _billnowrepository.UpdateSetColumnsTrue(p => new cpBillInvnow() { SalesDoc = "", State = "", }, p => p.BoxBarCode == item); var flow = _billnowrepository.GetSingle(p => p.BoxBarCode == item); flow.Id = GetId(); flow.AddTime = DateTime.Now; flow.EditTime = DateTime.Now; flow.Memo = "Erp取消出库成功,单据:" + request.BillCode + "|" + item; _billInvFlow.Insert(_mapper.Map(flow)); } else { var wcsurl = AppSettings.GetConfig("wcsApiUrl"); var wcsRequest = new WcsStateRequest() { TaskId = task.ID }; var body = HttpUtil.PostRequest(wcsurl + "/api/SelectTask", JsonConvert.SerializeObject(wcsRequest), 30000, "UTF-8", "application/json"); var wcsModel = JsonConvert.DeserializeObject(body); if (wcsModel.IsSuccess) { _billnowrepository.UpdateSetColumnsTrue(p => new cpBillInvnow() { SalesDoc = "", State = "", InvStateCode = InvState.InvEcecState_In.ToString(), ExecStateCode = InvLockState.InvState_Lock.ToString(), EditTime = DateTime.Now }, p => p.BoxBarCode == item); _baseWarecellrepository.UpdateSetColumnsTrue(p => new cpBaseWarecell() { StateNum = LocationState.LocationState_Full.GetHashCode(), EditTime = DateTime.Now }, p => p.Code == task.AddrFrom); var flow = _billnowrepository.GetSingle(p => p.BoxBarCode == item); flow.Id = GetId(); flow.AddTime = DateTime.Now; flow.EditTime = DateTime.Now; flow.Memo = "Erp取消出库成功,单据:" + request.BillCode + "|" + item; _billInvFlow.Insert(_mapper.Map(flow)); } else { continue; } } } return res; } public List GetBoxCodedetails(string Code) { return _boxitemsrepository.GetList(p => p.HuNr == Code); } public SRes PdaStockInBack(SouthPdaRequest request) { var res = new SRes(); try { var wcstask = _wcstaskold.AsQueryable().Where(p => p.BarCode == request.ContGrpBarCode && p.Status < TaskStatus.Finish).SplitTable(p => p.Take(2)).First(); if (wcstask != null) { res.ResCode = ResponseStatusCodeEnum.WcsTaskExist.GetHashCode(); res.ResMsg = request.ContGrpBarCode + ResponseStatusCodeEnum.WcsTaskExist.GetDescription(); return res; } var stock = _billnowrepository.GetSingle(p => p.ContGrpBarCode == request.ContGrpBarCode); if (stock == null) { var box = _billnowrepository.GetSingle(p => p.BoxBarCode == request.BoxCode); if (box != null) { res.ResCode = ResponseStatusCodeEnum.BarcodeContainerRepeat.GetHashCode(); res.ResMsg = request.BoxCode + ResponseStatusCodeEnum.BarcodeContainerRepeat.GetDescription(); return res; } //取历史表 var boxhistory = _boxitemsHistoryrepository.GetList(p => p.HuNr == request.BoxCode); if (boxhistory.Any()) { var boxCode = _mapper.Map>(boxhistory); var flow = _billInvFlow.GetList(p => p.BoxBarCode == request.BoxCode).OrderByDescending(p => p.AddTime).First(); if (flow != null && flow.ContGrpType == 1) { flow.Id = GetId(); flow.ContGrpId = GetId(); flow.InvStateCode = InvState.InvEcecState_BuildUp.ToString(); flow.ExecStateCode = InvLockState.InvState_Lock.ToString(); flow.IsBack = true; flow.AddTime = DateTime.Now; flow.EditTime = DateTime.Now; var inv = _mapper.Map(flow); _billnowrepository.Insert(inv); _billInvFlow.Insert(_mapper.Map(inv)); boxCode.ForEach(p => { p.CongBoxId = flow.ContGrpId; }); _boxitemsrepository.InsertRange(boxCode); } } } else { res.ResCode = ResponseStatusCodeEnum.StockInfoExist.GetHashCode(); res.ResMsg = request.ContGrpBarCode + ResponseStatusCodeEnum.StockInfoExist.GetDescription(); return res; } } catch (Exception ex) { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.Fail.GetDescription(); return res; } return res; } public SRes PreLockedStock(PreLockedStockRequest request) { var res = new SRes(); if (string.IsNullOrEmpty(request.BillCode)) { res.ResCode = ResponseStatusCodeEnum.ErrParamNotNull.GetHashCode(); res.ResMsg = "单号" + ResponseStatusCodeEnum.ErrParamNotNull.GetDescription(); return res; } var docs = _docrepository.GetSingle(p => p.DocsNo == request.BillCode); if (docs == null) { res.ResCode = ResponseStatusCodeEnum.DocNoCodeNotExist.GetHashCode(); res.ResMsg = request.BillCode + ResponseStatusCodeEnum.DocNoCodeNotExist.GetDescription(); return res; } List boxlist = new List(); foreach (var item in docs.JsonContent.Split(',')) { boxlist.Add(item.Trim()); } if (boxlist.Any()) { var invlist = _billnowrepository.GetList(p => boxlist.Contains(p.BoxBarCode) && p.InvStateCode == InvState.InvEcecState_In.ToString() && p.ExecStateCode == InvLockState.InvState_Normal.ToString()); if (invlist.Any()) { _billnowrepository.UpdateSetColumnsTrue(p => new cpBillInvnow() { SalesDoc = request.BillCode, State = "1" }, p => invlist.Select(it => it.BoxBarCode).Contains(p.BoxBarCode)); } } return res; } public SRes TrayPortageTask(TrayGroupOutRequest request) { var res = new SRes(); try { var ware = _basewarehouserepository.GetSingle(p => p.Code == request.WareHouse); if (ware == null) { res.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode(); res.ResMsg = request.Code + ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription(); return res; } var sconf = _sysconfigrepository.GetFirst(p => p.Code == "IsEnableManualTray"); if (sconf.SContent == "1")//启用人工口上子母托盘 { if (_sysconfigrepository.GetFirst(p => p.Code == "IsTieTuoWeight").SContent == "1") { res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode(); res.ResMsg = request.Code + "启用人工口上码垛托盘情况下,请先禁用铁托盘称重配置"; return res; } request.Start = sconf.Default1;//人工口设备号 if (_wcstaskinfo.AsQueryable().With(SqlWith.NoLock).Where(p => p.Type == TaskType.Delivery && p.AddrFrom == request.Start && p.AddrTo == request.Code && p.Status < TaskStatus.Finish).Any()) { //有未完成任务卡控 res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode(); res.ResMsg = request.Code + "有未完成的托盘任务,不允许重复创建"; return res; } } if (!string.IsNullOrEmpty(_sysconfigrepository.GetSingle(p => p.Code == request.Equip && p.SType == "PalletizingType").Cache2Task)) { res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode(); res.ResMsg = request.Code + "缓存工位2已经存在未完成的托盘搬运任务,不允许重复创建"; return res; } if (!string.IsNullOrEmpty(_sysconfigrepository.GetSingle(p => p.Code == request.Equip && p.SType == "PalletizingType").Default3)) { res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode(); res.ResMsg = request.Code + "缓存工位1的工字轮任务没有下发,不允许创建缓存工位2的搬运任务"; return res; } var taskcount = _wcstaskold.AsQueryable().Where(p => p.AddrTo == request.Equip && p.Status < TaskStatus.Finish).SplitTable(p => p.Take(2)).Count(); if (taskcount >= 2) { res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode(); res.ResMsg = request.Code + "存在2个未完成的托盘搬运任务,不允许重复创建"; return res; } var equlist = HttpUtil.PostRequest("http://10.30.43.1:8080/api/Wcs/GetDevicePalletizingEquip", JsonConvert.SerializeObject("")); var devices1 = JsonConvert.DeserializeObject>(equlist); if (!devices1.Where(p => p.deviceCode == request.Equip && p.TaskCode > 0).Any())//码垛托盘必须到位,才能继续下任务 { if (_wcstaskold.AsQueryable().Where(p => p.AddrTo == request.Equip && p.Status < TaskStatus.Finish).SplitTable(p => p.Take(2)).Count() > 0) { res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode(); res.ResMsg = request.Code + "码垛工位任务没有到位,不允许重复创建托盘任务"; return res; } } // 三个子托盘拆盘机设备编号,从左到右分别:8019、8011、8003 var task = new cpWCS_TaskInfo() { Status = TaskStatus.NewBuild, Type = TaskType.Delivery, Priority = 0, Device = "", SrmStation = "", AddrFrom = request.Start, BarCode = "", AddWho = "wms", WarehouseCode = ware.Code, Enabled = true, WorkBench = "", AddrTo = request.Equip, Tunnel = "", PalletType = 1, ProdLine = (short)int.Parse(request.Equip), MatCode = request.Code, MaterialCode = request.Code, OutType = OutTypeEnum.自动出库任务, BusType = CpTaskBusType.TaskBusType_CP_TrayPortage.GetDescription() }; _db.BeginTran(); var sysconf = _sysconfigrepository.GetSingle(p => p.Code == request.Equip && p.SType == "PalletizingType"); var wcs = _wcstaskinfo.InsertReturnEntity(task); _wcstaskold.InsertableSplitTable(_mapper.Map(wcs)); var taskdtl = new cpWCS_TaskDtl() { ID = Guid.NewGuid(), CurPoint = "", AddTime = DateTime.Now, AddWho = "wms", Enabled = true, ParentTaskCode = wcs.ID, Desc = wcs.BusType, }; _wcstaskdtl.InsertableSplitTable(taskdtl); if (string.IsNullOrEmpty(sysconf.Default1) && string.IsNullOrEmpty(sysconf.Cache1State) && string.IsNullOrEmpty(sysconf.Cache2State) && request.ActType == 1) { //码垛工位的任务 _sysconfigrepository.UpdateSetColumnsTrue(p => new cpSysConfig() { Default1 = "1", EditTime = DateTime.Now, Memo = wcs.ID.ToString() //进行中的托盘任务号 }, p => p.Code == request.Equip && p.SType == "PalletizingType"); } else { if (string.IsNullOrEmpty(sysconf.Memo)) { //码垛缓存位1的任务 _sysconfigrepository.UpdateSetColumnsTrue(p => new cpSysConfig() { Default3 = wcs.ID.ToString(), Cache1State = wcs.ID.ToString(), EditTime = DateTime.Now, Memo = wcs.ID.ToString() //进行中的托盘任务号 }, p => p.Code == request.Equip && p.SType == "PalletizingType"); } else { //码垛缓存位2的任务 _sysconfigrepository.UpdateSetColumnsTrue(p => new cpSysConfig() { Cache2State = wcs.ID.ToString(), Cache2Task = wcs.ID.ToString(), EditTime = DateTime.Now, }, p => p.Code == request.Equip && p.SType == "PalletizingType"); } } res.Memo1 = wcs.ID.ToString(); _db.CommitTran(); } catch (Exception ex) { _db.RollbackTran(); //TrayPortageTask(new TrayGroupOutRequest() { Code = request.Code, Equip = request.Equip, WareHouse = request.WareHouse }); res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode(); res.ResMsg = request.Code + ResponseStatusCodeEnum.DataSaveErr.GetDescription(); return res; } return res; } public SRes TrayPortageTaskCheck(TrayGroupOutRequest request) { var res = new SRes(); try { var ware = _basewarehouserepository.GetSingle(p => p.Code == request.WareHouse); if (ware == null) { res.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode(); res.ResMsg = request.Code + ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription(); return res; } if (!string.IsNullOrEmpty(_sysconfigrepository.GetSingle(p => p.Code == request.Equip && p.SType == "PalletizingType").Cache2Task)) { res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode(); res.ResMsg = request.Code + "缓存工位2已经存在未完成的托盘搬运任务,不允许重复创建"; return res; } if (!string.IsNullOrEmpty(_sysconfigrepository.GetSingle(p => p.Code == request.Equip && p.SType == "PalletizingType").Default3)) { res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode(); res.ResMsg = request.Code + "缓存工位1的工字轮任务没有下发,不允许创建缓存工位2的搬运任务"; return res; } var taskcount = _wcstaskold.AsQueryable().Where(p => p.AddrTo == request.Equip && p.Status < TaskStatus.Finish).SplitTable(p => p.Take(2)).Count(); if (taskcount >= 2) { res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode(); res.ResMsg = request.Code + "存在2个未完成的托盘搬运任务,不允许重复创建"; return res; } var equlist = HttpUtil.PostRequest("http://10.30.43.1:8080/api/Wcs/GetDevicePalletizingEquip", JsonConvert.SerializeObject("")); var devices1 = JsonConvert.DeserializeObject>(equlist); if (!devices1.Where(p => p.deviceCode == request.Equip && p.TaskCode > 0).Any())//码垛托盘必须到位,才能继续下任务 { if (_wcstaskold.AsQueryable().Where(p => p.AddrTo == request.Equip && p.Status < TaskStatus.Finish).SplitTable(p => p.Take(2)).Count() > 0) { res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode(); res.ResMsg = request.Code + "码垛工位任务没有到位,不允许重复创建托盘任务"; return res; } } } catch (Exception ex) { res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode(); res.ResMsg = request.Code + ResponseStatusCodeEnum.DataSaveErr.GetDescription(); return res; } return res; } public SRes PalletAutoInTask(PalletAutoTaskRequest request) { var res = new SRes(); try { //根据箱号和托盘号做兼容 string conbarcode = request.TrayCode; if (string.IsNullOrEmpty(conbarcode)) { conbarcode = _wcstaskold.AsQueryable().With(SqlWith.NoLock).Where(p => p.ID == request.TaskNum).SplitTable(p => p.Take(2)).First().BarCode; } var taskmideng = _wcstaskold.AsQueryable().With(SqlWith.NoLock).Where(p => p.TaskGroupKey == request.BoxCode && p.BarCode == conbarcode && p.Status < TaskStatus.Finish).SplitTable(p => p.Take(2)).First(); if (taskmideng != null) { //res.ResCode = ResponseStatusCodeEnum.WcsTaskExist.GetHashCode(); //res.ResMsg = request.TrayCode + ResponseStatusCodeEnum.WcsTaskExist.GetDescription(); //已经创建过任务了,则直接返回 return res; } if (!request.list.Any()) { res.ResCode = ResponseStatusCodeEnum.DocDetailNotExist.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.DocDetailNotExist.GetDescription(); return res; } if (string.IsNullOrEmpty(request.BoxCode)) { res.ResCode = ResponseStatusCodeEnum.ErrParamNotNull.GetHashCode(); res.ResMsg = "箱号" + ResponseStatusCodeEnum.ErrParamNotNull.GetDescription(); return res; } if (!request.TrayCode.StartsWith("TPC")) { res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.ErrParam.GetDescription() + request.TrayCode + "不是TPC类型托盘"; return res; } var euqip = _sysconfigrepository.GetSingle(p => p.Code == request.Equip && p.SType == "PalletizingType"); if (euqip == null) { res.ResCode = ResponseStatusCodeEnum.EquipInfoNotExist.GetHashCode(); res.ResMsg = request.Equip + "没有该码垛工位的设备信息"; return res; } if (euqip.SContent != request.TrayCode) { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = "码垛工位中记录的托盘条码与实际托盘条码不符"; return res; } var wcstask1 = _wcstaskold.AsQueryable().Where(p => p.ID == request.TaskNum).SplitTable(tabs => tabs.Take(2)).First(); ; if (wcstask1 == null) { res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode(); res.ResMsg = request.Equip + "码垛主表的托盘任务id不存在任务信息"; return res; } if (wcstask1.BarCode != euqip.SContent) { res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode(); res.ResMsg = request.Equip + "托盘号不匹配"; return res; } var task = _wcstaskold.AsQueryable().Where(p => p.BarCode == request.TrayCode && p.Status < TaskStatus.Finish).SplitTable(p => p.Take(2)).First(); if (task != null) { res.ResCode = ResponseStatusCodeEnum.WcsTaskExist.GetHashCode(); res.ResMsg = request.TrayCode + ResponseStatusCodeEnum.WcsTaskExist.GetDescription(); return res; } var stock = _billnowrepository.GetSingle(p => p.ContGrpBarCode == request.TrayCode); if (stock != null) { //判断如果是空托组盘信息残留,并且任务已经完成,则删除 if (stock.ContGrpType == 2 && stock.InvStateCode == InvState.InvEcecState_BuildUp.ToString()) { _billnowrepository.Delete(p => p.ContGrpBarCode == stock.ContGrpBarCode); _logger.LogInformation("自动清除多余的组盘数据" + stock.ContGrpBarCode); } else { res.ResCode = ResponseStatusCodeEnum.StockInfoExist.GetHashCode(); res.ResMsg = request.TrayCode + ResponseStatusCodeEnum.StockInfoExist.GetDescription(); return res; } } var stockboxcode = _billnowrepository.GetSingle(p => p.BoxBarCode == request.BoxCode); if (stockboxcode != null) { res.ResCode = ResponseStatusCodeEnum.StockInfoExist.GetHashCode(); res.ResMsg = request.BoxCode + "箱号已存在组盘信息,不允许重复组盘"; return res; } decimal tareWQty = 0; decimal tietuoWQty = 0; if (!string.IsNullOrEmpty(euqip.Default2)) { tareWQty = decimal.Parse(euqip.Default2); } if (!string.IsNullOrEmpty(euqip.Default4)) { tietuoWQty = decimal.Parse(euqip.Default4); } var ware = _basewarehouserepository.GetSingle(p => p.Code == "cphouse"); var invs = new cpBillInvnow() { WarehouseId = ware.Id, ContGrpBarCode = request.TrayCode, ContGrpId = GetId(), BoxBarCode = request.BoxCode, InvStateCode = InvState.InvEcecState_BuildUp.ToString(), ExecStateCode = InvLockState.InvState_Lock.ToString(), RFIDBarCode = request.BoxCode, HWBarCode = request.list.First().Sku, //存SKU HWTypeCode = request.HwType, SilkTypeCode = request.TrayType, //托盘类型 InvInOut = 1, Size = 1, ContGrpType = 1, MatCode = request.list.First().MaterialCode, MatName = request.list.First().MaterialDesc, Grade = request.list.First().GradeCode, SolderQty = tietuoWQty,//纯铁托重量 PackWeight = request.PackWeight,//包材重量 TareWQty = tareWQty, //皮重 CaQty = request.Wqty //底托 + 隔板 + 包装塑料袋 + 帘线塑料托盘的 重量 }; _db.BeginTran(); _billnowrepository.Insert(invs); _billInvFlow.Insert(_mapper.Map(invs)); var tt = _mapper.Map>(request.list); var TimeStamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds().ToString(); tt.ForEach(p => { p.CongBoxId = invs.ContGrpId; if (request.BoxCode.StartsWith("181")) { p.IsNeedUpLoadFlag = 1; } else if (request.BoxCode.StartsWith("HAZD")) { p.IsNeedUpLoadFlag = 2; } p.TimeStamp = TimeStamp; }); _boxitemsrepository.InsertRange(tt); var wcs = new cpWCS_TaskInfo() { Status = TaskStatus.NewBuild, Type = TaskType.EnterDepot, Priority = 0, Device = request.Equip, SrmStation = request.Equip, AddrFrom = request.Equip, BarCode = request.TrayCode, StartTime = DateTime.Now, AddTime = DateTime.Now, EditTime = DateTime.Now, AddWho = "wms", EditWho = "wms", WarehouseCode = ware.Code, AddrTo = "", Tunnel = "", MaterialCode = invs.MatCode, MatCode = invs.MatCode, BusType = CpTaskBusType.TaskBusType_CP_ProductStockIn.GetDescription(), TaskGroupKey = request.BoxCode }; var wcstask = _wcstaskinfo.InsertReturnEntity(wcs); _wcstaskold.InsertableSplitTable(_mapper.Map(wcstask)); var wcsdetail = new cpWCS_TaskDtl() { ID = Guid.NewGuid(), CurPoint = request.Equip, AddTime = DateTime.Now, AddWho = "wms", Enabled = true, ParentTaskCode = wcstask.ID, Desc = wcstask.BusType }; _wcstaskdtl.InsertableSplitTable(wcsdetail); _sysconfigrepository.UpdateSetColumnsTrue(p => new cpSysConfig() { SContent = "", Default1 = "", Default2 = "" }, p => p.Code == request.Equip); _db.CommitTran(); } catch (Exception ex) { _db.RollbackTran(); res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode(); res.ResMsg = request.TrayCode + ResponseStatusCodeEnum.DataSaveErr.GetDescription(); return res; } return res; } /// /// 更新重量 /// /// /// public SRes WcsUploadInfo(WcsUploadInfoRequest request) { var res = new SRes(); var task = _wcstaskold.AsQueryable().Where(p => p.ID == request.TaskCode && p.Status < TaskStatus.Finish).SplitTable(p => p.Take(2)).First(); if (task == null) { res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode(); res.ResMsg = request.TaskCode + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription(); return res; } if (task.Type == TaskType.EnterDepot) { //if (task.BarCode != request.RFID) //{ // res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); // res.ResMsg = "条码异常:上传条码" + request.RFID + "与当前任务条码不符" + request.TaskCode; // return res; //} if (request.Weight == 0) { res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode(); res.ResMsg = request.TaskCode + "任务上传称重信息是0"; return res; } var stock = _billnowrepository.GetSingle(p => p.ContGrpBarCode == task.BarCode && p.InvStateCode == InvState.InvEcecState_BuildUp.ToString()); if (stock != null) { decimal netWQty = 0; if (_sysconfigrepository.GetFirst(p => p.Code == "IsTieTuoWeight").SContent == "1") { netWQty = request.Weight - stock.SolderQty; } else { netWQty = request.Weight - stock.TareWQty + stock.CaQty; } var url = wms.util.AppSettings.GetConfig("EsbMesPushUrl"); var reqids = Guid.NewGuid().ToString(); var reqs = new EsbReq() { headers = new HeadersReq() { serviceCode = "163J162008", requestId = reqids, TrackId = reqids, sourceCode = "163J" } }; var upload = new UploadUpMesRequest() { HU_NR = stock.BoxBarCode, HU_TOTAL_WT = (netWQty).ToString(), REC_CREATOR = "bzmeasure", PURPOSEID = DateTime.Now.ToString("yyyyMMdd") }; _logger.LogInformation("自动称重上传MES:箱号" + stock.BoxBarCode + ",任务号:" + task.ID + ",重量:" + upload.HU_TOTAL_WT); var str = HttpUtil.PostRequest(url, JsonConvert.SerializeObject(upload), 30000, "UTF-8", "application/json", reqids, reqs.headers.sourceCode, reqs.headers.serviceCode); var response = JsonConvert.DeserializeObject(str); _logger.LogInformation("自动称重上传MES结果:箱号" + stock.BoxBarCode + "MES结果:" + response.success + response.message); if (response.success == false && stock.BoxBarCode.StartsWith("181")) { _billnowrepository.UpdateSetColumnsTrue(p => new cpBillInvnow() { TolWQty = request.Weight, NetWQty = netWQty, //NetWQty = request.Weight - stock.SolderQty, EditTime = DateTime.Now }, p => p.ContGrpBarCode == stock.ContGrpBarCode); if (stock.IsFail != true) { var pp = UpdateErrorBoxinfo(stock.BoxBarCode, response.message); if (pp.ResCode != 200) { _logger.LogInformation("称重流程更新异常箱号失败" + stock.BoxBarCode); UpdateErrorBoxinfo(stock.BoxBarCode, response.message); } } } else { _billnowrepository.UpdateSetColumnsTrue(p => new cpBillInvnow() { TolWQty = request.Weight, NetWQty = netWQty, //NetWQty = request.Weight - stock.SolderQty, EditTime = DateTime.Now }, p => p.ContGrpBarCode == stock.ContGrpBarCode); } var flow = _mapper.Map(stock); flow.Id = GetId(); flow.TolWQty = request.Weight; //flow.NetWQty = request.Weight - stock.SolderQty; flow.NetWQty = netWQty; flow.AddTime = DateTime.Now; flow.EditTime = DateTime.Now; flow.IsFail = response.success == true ? false : true; flow.FailReason = response.message; flow.Memo = "上传成品净重重量"; _billInvFlow.Insert(flow); } else { res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode(); res.ResMsg = request.TaskCode + ResponseStatusCodeEnum.StockNotExist.GetDescription(); return res; } } else if (task.Type == TaskType.Delivery) { //_sysconfigrepository.UpdateSetColumnsTrue(p => new cpSysConfig() //{ // Default2 = request.Weight.ToString() //}, p => p.Code == task.AddrTo); //在搬运任务完成时再更新配置表重量 _logger.LogInformation("扫码称重信息记录,任务:" + request.TaskCode + ",重量:" + request.Weight); } else if (task.Type == TaskType.OutDepot && task.BusType == CpTaskBusType.TaskBusType_CP_WeightOut.GetDescription()) { //获取库存信息 var stock = _billnowrepository.GetFirst(p => p.ContGrpBarCode == task.BarCode); if (stock == null) { res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode(); res.ResMsg = request.TaskCode + ResponseStatusCodeEnum.StockNotExist.GetDescription(); return res; } //获取称重配置信息 var config = _sysconfigrepository.GetFirst(p => p.Code == "AutomaticCalibration"); var u = Convert.ToDecimal(config.Default1); var l = Convert.ToDecimal(config.Default2); //最大值、最小值 var upperDeviationLimit = stock.TolWQty + u; var lowerDeviationLimit = stock.TolWQty - l; //记录称重信息 var weighingResult = new BaseWeighingResult() { Id = GetId(), AddWho = "wms", AddTime = DateTime.Now, EditWho = "wms", EditTime = DateTime.Now, Memo = "自动校称流程记录的称重结果", MeasuredWeight = request.Weight, StandardWeight = stock.TolWQty, UpperDeviationLimit = Convert.ToDecimal(config.Default1), LowerDeviationLimit = Convert.ToDecimal(config.Default2), IsOutOfTolerance = request.Weight < upperDeviationLimit || request.Weight > lowerDeviationLimit ? true : false }; _baseWeighingResult.InsertReturnEntity(weighingResult); //上安灯系统 } return res; } /// /// 贴标机信息传输 /// /// /// public SRes LabellingMachine(LabellingMachineRequest request) { var res = new SRes() { ResData = new LabellingMachineResponse() }; var task = _wcstaskold.AsQueryable().Where(p => p.ID == request.TaskNo && p.Status < TaskStatus.Finish).SplitTable(p => p.Take(2)).First(); if (task == null) { res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode(); res.ResMsg = request.TaskNo + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription(); return res; } var stock = _billnowrepository.GetSingle(p => p.ContGrpBarCode == task.BarCode); if (stock == null) { res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode(); res.ResMsg = request.TaskNo + ResponseStatusCodeEnum.StockNotExist.GetDescription(); return res; } if (string.IsNullOrEmpty(stock.BoxBarCode)) { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = request.TaskNo + "没有关联箱号"; return res; } var boxcode = _boxitemsrepository.GetList(p => p.HuNr == stock.BoxBarCode); string wind = ""; if (boxcode == null) { var boxcodehty = _boxitemhtyrepository.AsQueryable().With(SqlWith.NoLock).SplitTable(p => p.Take(2)).Where(p => p.HuNr == stock.BoxBarCode); if (boxcodehty.Any()) { wind = boxcodehty.First().Winding; } res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = request.TaskNo + "没有找到箱号"; return res; } else { wind = boxcode.First().Winding; } res.ResData.LabelName = "LABLC"; res.ResData.FN1 = "FD" + stock.BoxBarCode; res.ResData.FN2 = "FD" + stock.MatName; res.ResData.FN3 = "FD" + stock.NetWQty + "KG"; res.ResData.FN4 = "FD" + stock.SilkTypeCode; res.ResData.FN5 = "FD" + stock.MatCode; res.ResData.FN6 = "FD" + stock.HWTypeCode + " 绕向:" + wind; res.ResData.FN7 = "FDLA," + stock.BoxBarCode; res.ResData.FN8 = "FD" + stock.BoxBarCode; return res; } public SRes MonitorLeftStock(WebErrorRequest request) { var res = new SRes() { ResDataList = new List() }; var histasklist = _wcstaskold.AsQueryable().SplitTable(tabs => tabs.Take(2)).Where(p => p.Status == TaskStatus.Finish && p.EndTime > DateTime.Now.AddMinutes(-6)).ToList(); if (histasklist != null && histasklist.Any()) { foreach (var histask in histasklist) { var stock = _billnowrepository.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) { CpCompleteTask(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) { CpCompleteTask(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()) { CpCompleteTask(new CompleteTaskRequest() { TaskNum = histask.ID, OperationType = 2, WCSUpdateName = "监控处理残留", Memo1 = "监控处理残留", Memo2 = "监控处理残留" }); } } } } } return res; } public SRes VerifyBoxNum(VerifyBoxNumRequest request) { var res = new SRes(); if (!_wcstaskinfo.AsQueryable().With(SqlWith.NoLock).Where(p => p.BarCode == request.ConBarCode && p.TaskGroupKey == request.BoxNum).Any()) { res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode(); res.ResMsg = "箱号和托盘不匹配"; } return res; } public SRes DeleteoldBoxcodeinfo(string code) { var res = new SRes(); _boxitemsrepository.Delete(p => p.HuNr == code); return res; } public SRes UpdateErrorBoxinfo(string code, string remark) { lock (lockerUpdateErrorBoxinfo) { var res = new SRes(); try { var task = _wcstaskinfo.AsQueryable().With(SqlWith.NoLock).Where(p => p.TaskGroupKey == code && p.Type == TaskType.EnterDepot && (p.AddrFrom == "8090" || p.AddrFrom == "8092" || p.AddrFrom == "8096" || p.AddrFrom == "8098" || p.AddrFrom == "8307")).First(); if (task == null) { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription() + code; return res; } var stock = _billnowrepository.GetSingle(p => p.ContGrpBarCode == task.BarCode && p.BoxBarCode == code && p.InvStateCode == InvState.InvEcecState_BuildUp.ToString()); if (stock == null) { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.StockNotExist.GetDescription() + code; return res; } _db.BeginTran(); var date = DateTime.Now.ToString("yyyyMMdd"); _billnowrepository.AsUpdateable().SetColumns(p => new cpBillInvnow() { BoxBarCode = "Test" + date + code, Memo = "更新为异常箱号,原箱号" + code, EditWho = "自动触发", IsFail = true, FailReason = remark }).Where(p => p.BoxBarCode == code).ExecuteCommand(); _wcstaskinfo.AsUpdateable().SetColumns(p => new cpWCS_TaskInfo() { TaskGroupKey = "Test" + date + code, ManualRemarks = "更新为异常箱号,原箱号" + code, EditWho = "自动触发" }).Where(p => p.TaskGroupKey == code).ExecuteCommand(); _wcstaskold.AsUpdateable().SetColumns(p => new cpWCS_TaskOld() { TaskGroupKey = "Test" + date + code, ManualRemarks = "更新为异常箱号,原箱号" + code, EditWho = "自动触发" }).Where(p => p.TaskGroupKey == code).SplitTable(p => p.Take(2)).ExecuteCommand(); _boxitemsrepository.AsUpdateable().SetColumns(p => new cpBoxItems() { HuNr = "Test" + date + code, EditWho = "自动触发,更新为异常箱号,原箱号" + code }).Where(p => p.HuNr == code).ExecuteCommand(); _db.CommitTran(); } catch (Exception ex) { _db.RollbackTran(); res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = "更新失败" + ex.Message; } return res; } } public SRes GenInventoryReport() { var res = new SRes(); DateTime lastDay = Convert.ToDateTime(DateTime.Now.AddMonths(1).ToString("yyyy-MM-01")).AddDays(-1); DateTime lastMouthlastDay = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-01")).AddDays(-1); var dateMonth = DateTime.Now.ToString("yyyy-MM"); if (_billInventoryReport.GetFirst(p => p.DateMonth == dateMonth) != null) { return res; } List list = new List(); var startTime = lastMouthlastDay.AddHours(8).AddMinutes(30); var endTime = lastDay.AddHours(8).AddMinutes(30); cpBillInventoryReport modelmes = new cpBillInventoryReport() { DateMonth = dateMonth, StartTime = startTime, EndTime = endTime, NameType = "MES未放行" }; cpBillInventoryReport modelerp = new cpBillInventoryReport() { DateMonth = dateMonth, StartTime = startTime, EndTime = endTime, NameType = "ERP(已放行+可发货状态)" }; cpBillInventoryReport modeltemp = new cpBillInventoryReport() { DateMonth = dateMonth, StartTime = startTime, EndTime = endTime, NameType = "临时箱(A\\B)" }; //MES未放行总净重 var curStockMes = _billnowrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.InvStateCode == InvState.InvEcecState_In.ToString() && p.ContGrpType == 1 && p.MesFlag == 0).Sum(p => p.NetWQty); var curStockERP = _billnowrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.InvStateCode == InvState.InvEcecState_In.ToString() && p.ContGrpType == 1 && p.MesFlag == 1).Sum(p => p.NetWQty); var curStockTemp = _billnowrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.InvStateCode == InvState.InvEcecState_In.ToString() && p.ContGrpType == 1 && !p.BoxBarCode.StartsWith("181")).Sum(p => p.NetWQty); var lastdataMes = _billInventoryReport.GetSingle(p => p.DateMonth == DateTime.Now.AddMonths(-1).ToString("yyyy-MM") && p.NameType == "MES未放行"); var lastdataERP = _billInventoryReport.GetSingle(p => p.DateMonth == DateTime.Now.AddMonths(-1).ToString("yyyy-MM") && p.NameType == "ERP(已放行+可发货状态)"); var lastdataTem = _billInventoryReport.GetSingle(p => p.DateMonth == DateTime.Now.AddMonths(-1).ToString("yyyy-MM") && p.NameType == "临时箱(A\\B)"); modelmes.BeginQty = lastdataMes == null ? 0 : lastdataMes.EndQty; modelerp.BeginQty = lastdataERP == null ? 0 : lastdataERP.EndQty; modeltemp.BeginQty = lastdataTem == null ? 0 : lastdataTem.EndQty; modelmes.EndQty = curStockMes; modelerp.EndQty = curStockERP; modeltemp.EndQty = curStockTemp; //入库量 modelmes.StockInQty = _billInvFlow.AsQueryable().With(SqlWith.NoLock).Where(p => p.InvStateCode == InvState.InvEcecState_In.ToString() && p.ContGrpType == 1 && p.Memo == "入库完成" && p.AddTime > startTime && p.AddTime <= endTime).Sum(p => p.NetWQty); //临时箱入库量 modeltemp.StockInQty = _billInvFlow.AsQueryable().With(SqlWith.NoLock).Where(p => p.InvStateCode == InvState.InvEcecState_In.ToString() && !p.BoxBarCode.StartsWith("181") && p.ContGrpType == 1 && p.Memo == "入库完成" && p.AddTime > startTime && p.AddTime <= endTime).Sum(p => p.NetWQty); //mes退生产出库量 modelmes.ProductStockOutQty = (from task in _wcstaskold.AsQueryable().With(SqlWith.NoLock).Where(p => p.AddTime > startTime && p.AddTime <= endTime && p.ManualRemarks.Contains("从MES手持机下发出库任务")).SplitTable(p => p.Take(2)).ToList() join flow in _billInvFlow.AsQueryable().With(SqlWith.NoLock).Where(p => p.InvStateCode == InvState.InvEcecState_Out.ToString() && p.ContGrpType == 1 && p.Memo == "任务完成" && string.IsNullOrEmpty(p.SalesDoc) && p.AddTime > startTime && p.AddTime <= endTime).ToList() on task.TaskGroupKey equals flow.BoxBarCode where task.ManualRemarks.Contains("从MES手持机下发出库任务") && flow.InvStateCode == InvState.InvEcecState_Out.ToString() && flow.ContGrpType == 1 && flow.Memo == "任务完成" && string.IsNullOrEmpty(flow.SalesDoc) select flow.NetWQty).Sum(); //临时箱退生产出库量 modeltemp.ProductStockOutQty = (from task in _wcstaskold.AsQueryable().With(SqlWith.NoLock).Where(p => p.AddTime > startTime && p.AddTime <= endTime && p.ManualRemarks.Contains("从MES手持机下发出库任务")).SplitTable(p => p.Take(2)).ToList() join flow in _billInvFlow.AsQueryable().With(SqlWith.NoLock).Where(p => p.InvStateCode == InvState.InvEcecState_Out.ToString() && !p.BoxBarCode.StartsWith("181") && p.ContGrpType == 1 && p.Memo == "任务完成" && string.IsNullOrEmpty(p.SalesDoc) && p.AddTime > startTime && p.AddTime <= endTime).ToList() on task.TaskGroupKey equals flow.BoxBarCode where task.ManualRemarks.Contains("从MES手持机下发出库任务") && flow.InvStateCode == InvState.InvEcecState_Out.ToString() && flow.ContGrpType == 1 && flow.Memo == "任务完成" && string.IsNullOrEmpty(flow.SalesDoc) select flow.NetWQty).Sum(); //mes手动出库 modelmes.ManualStockOutQty = (from task in _wcstaskold.AsQueryable().With(SqlWith.NoLock).Where(p => p.AddTime > startTime && p.AddTime <= endTime && p.ManualRemarks.Contains("下发手动出库任务")).SplitTable(p => p.Take(2)).ToList() join flow in _billInvFlow.AsQueryable().With(SqlWith.NoLock).Where(p => p.InvStateCode == InvState.InvEcecState_Out.ToString() && p.MesFlag == 0 && p.ContGrpType == 1 && p.Memo == "任务完成" && string.IsNullOrEmpty(p.SalesDoc) && p.AddTime > startTime && p.AddTime <= endTime).ToList() on task.TaskGroupKey equals flow.BoxBarCode where task.ManualRemarks.Contains("下发手动出库任务") && flow.InvStateCode == InvState.InvEcecState_Out.ToString() && flow.ContGrpType == 1 && flow.Memo == "任务完成" && string.IsNullOrEmpty(flow.SalesDoc) select flow.NetWQty).Sum(); modelmes.SalesStockOutQty = 0; //ERP发货出库量() modelerp.SalesStockOutQty = _billInvFlow.AsQueryable().With(SqlWith.NoLock).Where(p => p.InvStateCode == InvState.InvEcecState_Out.ToString() && p.ContGrpType == 1 && p.Memo == "任务完成" && !string.IsNullOrEmpty(p.SalesDoc) && p.AddTime > startTime && p.AddTime <= endTime).Sum(p => p.NetWQty); //临时箱发货出库量() modeltemp.SalesStockOutQty = _billInvFlow.AsQueryable().With(SqlWith.NoLock).Where(p => p.InvStateCode == InvState.InvEcecState_Out.ToString() && !p.BoxBarCode.StartsWith("181") && p.ContGrpType == 1 && p.Memo == "任务完成" && !string.IsNullOrEmpty(p.SalesDoc) && p.AddTime > startTime && p.AddTime <= endTime).Sum(p => p.NetWQty); //ERP手动出库 modelerp.ManualStockOutQty = (from task in _wcstaskold.AsQueryable().With(SqlWith.NoLock).Where(p => p.AddTime > startTime && p.AddTime <= endTime && p.ManualRemarks.Contains("下发手动出库任务")).SplitTable(p => p.Take(2)).ToList() join flow in _billInvFlow.AsQueryable().With(SqlWith.NoLock).Where(p => p.InvStateCode == InvState.InvEcecState_Out.ToString() && p.MesFlag == 1 && p.ContGrpType == 1 && p.Memo == "任务完成" && string.IsNullOrEmpty(p.SalesDoc) && p.AddTime > startTime && p.AddTime <= endTime).ToList() on task.TaskGroupKey equals flow.BoxBarCode where task.ManualRemarks.Contains("下发手动出库任务") && flow.InvStateCode == InvState.InvEcecState_Out.ToString() && flow.ContGrpType == 1 && flow.Memo == "任务完成" && string.IsNullOrEmpty(flow.SalesDoc) select flow.NetWQty).Sum(); //临时箱手动出库 modeltemp.ManualStockOutQty = (from task in _wcstaskold.AsQueryable().With(SqlWith.NoLock).Where(p => p.AddTime > startTime && p.AddTime <= endTime && p.ManualRemarks.Contains("下发手动出库任务")).SplitTable(p => p.Take(2)).ToList() join flow in _billInvFlow.AsQueryable().With(SqlWith.NoLock).Where(p => p.InvStateCode == InvState.InvEcecState_Out.ToString() && !p.BoxBarCode.StartsWith("181") && p.ContGrpType == 1 && p.Memo == "任务完成" && string.IsNullOrEmpty(p.SalesDoc) && p.AddTime > startTime && p.AddTime <= endTime).ToList() on task.TaskGroupKey equals flow.BoxBarCode where task.ManualRemarks.Contains("下发手动出库任务") && flow.InvStateCode == InvState.InvEcecState_Out.ToString() && flow.ContGrpType == 1 && flow.Memo == "任务完成" && string.IsNullOrEmpty(flow.SalesDoc) select flow.NetWQty).Sum(); modelmes.Memo = "kg"; modelerp.Memo = "kg"; modeltemp.Memo = "kg"; list.Add(modelmes); list.Add(modelerp); list.Add(modeltemp); _billInventoryReport.InsertRange(list); return res; } public SRes PalletManualMoveTask(PalletManualMoveTaskRequest request) { var res = new SRes(); //验证是否已经修改过配置,并且没有自动拆盘的任务 var sconf = _sysconfigrepository.GetFirst(p => p.Code == "IsEnableManualTray"); if (sconf.SContent != "1" || _sysconfigrepository.GetFirst(p => p.Code == "IsTieTuoWeight").SContent == "1")//启用人工口上子母托盘 { res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode(); res.ResMsg = "启用人工口上码垛托盘或者铁托盘称重配置不正确"; return res; } var equlist = new List() { "8003", "8011", "8019" }; if (_wcstaskinfo.AsQueryable().With(SqlWith.NoLock).Where(p => p.Type == TaskType.Delivery && equlist.Contains(p.AddrFrom) && p.Status < TaskStatus.Finish).Any()) { //有未完成任务卡控 res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode(); res.ResMsg = "有未完成的自动拆盘托盘任务,不允许启用人工口"; return res; } if (request.MatType == 1) { try { _wcstaskinfo.AsUpdateable().SetColumns(p => new cpWCS_TaskInfo() { Status = TaskStatus.WaitingToExecute, ManualRemarks = "人工口上码垛托盘,PDA提交修改任务状态", EditWho = "WMS" }).Where(p => p.AddrTo == request.AddrTo && p.Type == TaskType.Delivery && p.Status == TaskStatus.NewBuild).ExecuteCommand(); _wcstaskold.AsUpdateable().SetColumns(p => new cpWCS_TaskOld() { Status = TaskStatus.WaitingToExecute, ManualRemarks = "人工口上码垛托盘,PDA提交修改任务状态", EditWho = "WMS" }).Where(p => p.AddrTo == request.AddrTo && p.Type == TaskType.Delivery && p.Status == TaskStatus.NewBuild).SplitTable(p => p.Take(2)).ExecuteCommand(); } catch (Exception ex) { _logger.LogInformation("人工码垛托盘异常" + ex.ToString()); res.ResCode = 500; res.ResMsg = "提交异常"; } } else if (request.MatType == 2)//创建隔板任务 { var wcs = new cpWCS_TaskInfo() { Type = TaskType.OutDepot, Status = TaskStatus.NewBuild, Priority = 0, Device = "", SrmStation = "", AddrFrom = "8050", AddrTo = request.AddrTo, BarCode = request.ConBarCode, Length = 1, AddTime = DateTime.Now, StartTime = DateTime.Now, DocID = 0, PalletType = 1, ProdLine = 0, AddWho = "wms", WarehouseCode = "cphouse", Enabled = true, Tunnel = "", BusType = CpTaskBusType.TaskBusType_CP_SpacingBoardStockOut.GetDescription(), MatCode = "", MaterialCode = "", InvBarCode = request.ConBarCode, Grade = "" }; try { _db.BeginTran(); var task = _wcstaskinfo.InsertReturnEntity(wcs); _wcstaskold.InsertableSplitTable(_mapper.Map(task)); var taskdlt = new cpWCS_TaskDtl() { ID = Guid.NewGuid(), CurPoint = "8050", AddTime = DateTime.Now, AddWho = "wms", Enabled = true, ParentTaskCode = task.ID, Desc = "空轮间隔板搬运", }; _wcstaskdtl.InsertableSplitTable(taskdlt); _db.CommitTran(); } catch (Exception ex) { _logger.LogInformation("提交异常" + ex.ToString()); _db.RollbackTran(); res.ResCode = 500; res.ResMsg = "提交异常"; } } return res; } public SRes FlowDataMoveJob(SalesDocAutoPushRequest 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 = _billpushrepository.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); _billpushrepository.Delete(p => ids.Contains(p.Id)); } } catch (Exception ex) { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = ex.Message; return res; } //箱号明细表 try { var push = _boxitemsrepository.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 (_boxitemhtyrepository.AsQueryable().With(SqlWith.NoLock).SplitTable(p => p.Take(2)).Where(p => ids.Contains(p.Id)).Any()) { _boxitemhtyrepository.Context.Deleteable(p => ids.Contains(p.Id)).SplitTable(x => x.Take(2)).ExecuteCommand(); } _boxitemhtyrepository.InsertableSplitTable(pushthty); _boxitemsrepository.Delete(p => ids.Contains(p.Id)); } } catch (Exception ex) { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = ex.Message; return res; } return res; } /// /// 触发自动校秤任务 /// /// public SRes TriggerAutoCalibration() { var hour = 10; const string deviceId = "8058"; //TODO:根据实际情况设置设备ID const string matCode = "FaMa"; var result = new SRes() { ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode(), ResMsg = ResponseStatusCodeEnum.Sucess.GetDescription() }; var sysconfig = _sysconfigrepository.GetFirst(p => p.Code == "AutomaticCalibration"); var config = _sysconfigrepository.GetFirst(p => p.Code == "AutomaticCalibration").SContent; var isContinue = false; if (sysconfig != null && !string.IsNullOrEmpty(sysconfig.Default3)) { if (sysconfig.Default3.Contains(",")) { var nums = sysconfig.Default3.Split(","); for (int i = 0; i < nums.Length; i++) { hour = Convert.ToInt16(nums[i]); if (!ShouldTriggerScaleTask(config, hour)) { continue; } //检查今天早上十点-十点五十九之间是否执行过 DateTime now1 = DateTime.Now; // 当天 10:00 开始 DateTime startTime1 = new DateTime(now1.Year, now1.Month, now1.Day, hour, 0, 0); // 当天 10:59 结束 DateTime endTime1 = new DateTime(now1.Year, now1.Month, now1.Day, hour, 59, 59); if (_wcstaskold.AsQueryable().Where(p => p.AddTime >= startTime1 && p.AddTime < endTime1 && p.BusType.Contains("砝码")).SplitTable(p => p.Take(2)).Any()) { continue; } isContinue = true; break; } } else { hour = Convert.ToInt16(sysconfig.Default3); if (!ShouldTriggerScaleTask(config, hour)) { result.ResCode = ResponseStatusCodeEnum.EquipInfoNotExist.GetHashCode(); result.ResMsg = "不在可执行范围内"; return result; } //检查今天早上十点-十点五十九之间是否执行过 DateTime now = DateTime.Now; // 当天 10:00 开始 DateTime startTime = new DateTime(now.Year, now.Month, now.Day, hour, 0, 0); // 当天 10:59 结束 DateTime endTime = new DateTime(now.Year, now.Month, now.Day, hour, 59, 59); if (_wcstaskold.AsQueryable().Where(p => p.AddTime >= startTime && p.AddTime < endTime && p.BusType.Contains("砝码")).SplitTable(p => p.Take(2)).Any()) { result.ResCode = ResponseStatusCodeEnum.EquipInfoNotExist.GetHashCode(); result.ResMsg = "本周期内已执行过"; return result; } isContinue = true; } } if (_wcstaskinfo.IsAny(p => p.AddrTo == deviceId && p.Status == TaskStatus.NewBuild)) { result.ResCode = ResponseStatusCodeEnum.EquipInfoNotExist.GetHashCode(); result.ResMsg = deviceId + "存在未执行任务,请勿重复申请"; return result; } if (!isContinue) { result.ResCode = ResponseStatusCodeEnum.EquipInfoNotExist.GetHashCode(); result.ResMsg = "不满足出库条件"; return result; } 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, }; locationlist = locationlist.Where(p => p.MatCode == matCode); if (!locationlist.Any() || locationlist == null) { result.ResCode = ResponseStatusCodeEnum.NotEnoughStock.GetHashCode(); result.ResMsg = matCode + "|" + ResponseStatusCodeEnum.NotEnoughStock.GetDescription(); return result; } 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()); if (_wcstaskold.AsQueryable().Where(p => p.BarCode == sotck.ContGrpBarCode && p.Status < TaskStatus.Finish).SplitTable(p => p.Take(2)).Any()) { result.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode(); result.ResMsg = sotck.ContGrpBarCode + "已经存在未完成的任务,请确认"; return result; } try { var wcs = new cpWCS_TaskInfo() { Type = TaskType.OutDepot, Status = TaskStatus.NewBuild, Priority = 0, Device = "SRM" + location.Tunnel, SrmStation = "8045",//TODO:输入五巷道原间隔版出库放货点设备号 AddrFrom = location.Code, AddrTo = deviceId, 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 = CpTaskBusType.TaskBusType_CP_WeightOut.GetDescription(), MatCode = matCode, MaterialCode = matCode, InvBarCode = location.InvBarCode, Grade = sotck.Grade }; var invflow = _mapper.Map(sotck); invflow.InvStateCode = InvState.InvEcecState_OutGoing.ToString(); invflow.AddTime = DateTime.Now; invflow.EditTime = 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 = deviceId + "砝码出库", }; _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()); result.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode(); result.ResMsg = ResponseStatusCodeEnum.DataSaveErr.GetDescription(); return result; } return result; } public bool ShouldTriggerScaleTask(string config,int hour) { DateTime now = DateTime.Now; DateTime todayAt10 = new DateTime(now.Year, now.Month, now.Day, hour, 0, 0); switch (config) { case "1": // 值为1: 时间是当天的早上十点触发 return now >= todayAt10 && now < todayAt10.AddMinutes(59); // 当前时间在10:00到11:59之间 case "2": // 值为2: 时间是当周周一的早上十点触发 int diff = DayOfWeek.Monday - now.DayOfWeek; DateTime nextMondayAt10 = now.AddDays(diff).Date.AddHours(10); return now >= nextMondayAt10 && now < nextMondayAt10.AddMinutes(59); // 当前时间在周一10:00到10:59之间 case "3": // 值为3: 时间是当月1号的早上十点触发 DateTime firstDayOfMonthAt10 = new DateTime(now.Year, now.Month, 1, 10, 0, 0); return now >= firstDayOfMonthAt10 && now < firstDayOfMonthAt10.AddMinutes(59); // 当前时间在每月1日10:00到10:59之间 default: return false; // 不满足条件,不触发 } } } }