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