using AutoMapper; using Microsoft.Extensions.Logging; using Newtonsoft.Json; using SqlSugar; using SqlSugar.Extensions; using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using WCS.Entity.fj; using wms.dataservice.IDataSetvice; using wms.dto; using wms.dto.request; using wms.dto.request.fj; using wms.dto.response; using wms.dto.response.fj; using wms.service.IService; using wms.sqlsugar; using wms.sqlsugar.model; using wms.sqlsugar.model.fj; using wms.util.Check; using wms.util.Ext; namespace wms.service.Service { /// /// 分拣服务 /// public class FJService : IFJService { private readonly IMapper _mapper; private readonly ILogger _logger; private readonly IFJDataService _IFJDataService; public FJService(IMapper mapper, ILogger logger, IFJDataService IFJDataService) { _mapper = mapper; _logger = logger; _IFJDataService = IFJDataService; } private ITenant _db => SqlSugarHelper.Db;//处理事务 #region 初始化仓储 private Repository _docrepository => new Repository(); private Repository _sysconfigrepository => new Repository(); private Repository _materrepository => new Repository(); private Repository _billTaskrepository => new Repository(); private Repository _baseWareHouserepository => new Repository(); private Repository _billBarcoderepository => new Repository(); private Repository _billFbackPushrepository => new Repository(); private Repository _fjBillBomInfoRepository => new Repository(); private Repository _fjBillWetStackRepository => new Repository(); /// /// 容器表 /// private Repository _baseContinfo => new Repository(); private RepositoryTask _taskrepository => new RepositoryTask(); /// /// 库存表 /// private Repository _billInvnowrepository => new Repository(); /// /// 条码表 /// private Repository _billInvinitrepository => new Repository(); /// /// 物料表 /// private Repository _basematerrepository => new Repository(); /// /// 码垛工字轮信息 /// private Repository _billSpoolTransrepository => new Repository(); private Repository _billBominfoRepository => new Repository(); private Repository _billBomsetinfoRepository => new Repository(); /// /// 单据表 /// private Repository _billdocrepository => new Repository(); /// /// 任务历史表 /// private RepositoryTask _wcstaskoldrepository => new RepositoryTask(); private Repository _billInvflow => new Repository(); private Repository _billPushinforepository => new Repository(); /// /// 货位表 /// private Repository _basewarecellrepository => new Repository(); /// /// 仓库表 /// private Repository _basewarehouserepository => new Repository(); private RepositoryTask _taskdetailrepository => new RepositoryTask(); /// /// 机台表 /// private Repository _basemachinforepository => new Repository(); #endregion 初始化仓储 /// /// 添加单据 /// /// public bool Add(fjBillDocument 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 fjSysConfig GetSysConfigByCode(string code) { //Repository _billdtrepository = new Repository(); return _sysconfigrepository.GetSingle(p => p.Code == code); } /// /// 获取物料信息 /// /// /// public fjBaseMater GetBaseMaterByExpression(Expression> WhereExpression) { return _materrepository.GetSingle(WhereExpression); } /// /// 获取配置信息 /// /// /// public fjSysConfig GetSysConfigByExpression(Expression> WhereExpression) { return _sysconfigrepository.GetSingle(WhereExpression); } /// /// 获取单据信息 /// /// /// public fjBillDocument GetBillDocumentByExpression(Expression> WhereExpression) { return _docrepository.GetSingle(WhereExpression); } /// /// 获取反馈信息 /// /// /// public List GetBillFeedbackList(Expression> WhereExpression) { return _billFbackPushrepository.GetList(WhereExpression); } ///// ///// 获取单据信息 ///// ///// ///// //public fjBillDocument 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); } /// /// 更新hjBillFeedbackPush表字段 /// /// /// public bool UpdateBillFeedbackPushModelColumns(UpdateModelColumns updateModel) { return _billFbackPushrepository.Update(updateModel.Columns, updateModel.WhereExpression); } public SRes DeleteDoc(Expression> whereExpression) { var res = new SRes(); res.ResData = _docrepository.Delete(whereExpression); return res; } public bool SyncMaterInfo(List ResData) { foreach (var item in ResData) { if (_materrepository.IsAny(p => p.Code == item.MatCode)) { _materrepository.UpdateModelColumns(p => new fjBaseMater() { IsHold = item.IsHold, HoldDuration = item.HoldDuration }, p => p.Code == item.MatCode); } else { var model = _mapper.Map(item); _materrepository.Insert(model); } } return true; } public bool SyncMachineInfo(List ResData) { foreach (var item in ResData) { if (_basemachinforepository.IsAny(p => p.MachNo == item.MacCode)) { _basemachinforepository.UpdateModelColumns(p => new BillMachinfo() { GrpCode = item.MacGroup, Direction = item.Direction, Station = item.LocCode, EditTime = DateTime.Now }, p => p.MachNo == item.MacCode); } else { var model = _mapper.Map(item); _basemachinforepository.Insert(model); } } return true; } /// /// 帘线工单信息传输 /// /// /// public SRes CurtainProductionOrder(CurtainProductionOrderRequest reqDto) { var res = new SRes(); var doc = _billdocrepository.GetSingle(p => p.DocsNo == reqDto.BillCode); if (doc == null) { doc = new BillDocsinfo(); doc.WarehouseId = 0; doc.ReqNo = reqDto.BillCode; doc.DocsNo = reqDto.BillCode; doc.TypeNum = DocType.DocType_FJ_CurtainProduction.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; } } _basemachinforepository.UpdateModelColumns(p => new BillMachinfo() { BillCode = reqDto.BillCode, WorkOrder = reqDto.WorkOrder, PlanQty = reqDto.PlanQty, EditTime = DateTime.Now }, p => reqDto.WbList.Contains(p.MachNo)); return res; } /// /// 工单启动验证 /// /// /// public SRes CurtainOrderStartCheck(CurtainOrderStartCheckRequest reqDto) { var res = new SRes(); var wetStack = _billBominfoRepository.GetSingle(p => p.BillCode == reqDto.BillCode); if (wetStack == null) { res.ResCode = 0; res.ResMsg = reqDto.BillCode + "没有配置垛型信息,请先配置垛型"; return res; } return res; } #region 湿拉工字轮/帘线芯股信息初始化 /// /// 湿拉工字轮/帘线芯股信息初始化 /// /// /// public SRes SpoolMaterialInfoTrans(SpoolMaterialInfoTransRequest reqDto) { var res = new SRes(); var container = _baseContinfo.GetSingle(p => p.ContBarCode == reqDto.SpoolCode); if (container == null) { var insertcon = new BaseContinfo() { ContBarCode = reqDto.SpoolCode, Name = reqDto.SpoolCode, TypeCode = ContainerType.ContainerType_Spool.ToString(), PrintQty = 1, IsStop = 0, WarehouseId = 0, WeightQty = 0, AddWho = "wms", AddTime = DateTime.Now }; //新加载具信息 if (!_baseContinfo.Insert(insertcon)) { res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode(); res.ResMsg = "工字轮载具初始化失败"; return res; } } var mater = _basematerrepository.GetSingle(p => p.Code == reqDto.MatCode); if (mater == null) { res.ResCode = ResponseStatusCodeEnum.MaterInfoNotExist.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.MaterInfoNotExist.GetDescription(); return res; } BillSpoolTrans billSpoolTrans = new BillSpoolTrans(); billSpoolTrans.ConBarCode = reqDto.SpoolCode; billSpoolTrans.BillCode = reqDto.BillCode; billSpoolTrans.WorkOrder = reqDto.WorkOrder; billSpoolTrans.AddTime = DateTime.Now; var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == reqDto.SpoolCode); if (stock != null && stock.InvStateCode == InvState.InvEcecState_In.ToString()) { billSpoolTrans.ErrType = 1; billSpoolTrans.Memo = "该工字轮条码号已在库中,请检查RFID号是否重复"; } if (stock != null && stock.InvStateCode == InvState.InvEcecState_OutGoing.ToString()) { billSpoolTrans.ErrType = 1; billSpoolTrans.Memo = "该工字轮条码号存在出库中任务,请检查上一个任务是否已经完成"; } //条码验证 var barstock = _billInvnowrepository.GetSingle(p => p.InvBarCode == reqDto.MatBarCode); if (barstock != null && barstock.InvStateCode == InvState.InvEcecState_In.ToString()) { billSpoolTrans.ErrType = 1; billSpoolTrans.Memo = "该材料号已在库中,请检查是否重复"; } if (barstock != null && barstock.ContGrpBarCode != reqDto.SpoolCode) { billSpoolTrans.ErrType = 1; billSpoolTrans.Memo = reqDto.MatBarCode + "该材料号已经绑定" + barstock.ContGrpBarCode + ",请检查是否重复"; } var barinfo = _billInvinitrepository.GetSingle(p => p.InvBarCode == reqDto.MatBarCode); if (barinfo == null) { barinfo = new BillInvinit() { InvBarCode = reqDto.MatBarCode, WarehouseId = 0, ContGrpId = IdFactory.NewId(), ContGrpBarCode = reqDto.SpoolCode, ExecStateCode = InvLockState.InvState_Normal.ToString(), ExecDocsNo = reqDto.WorkOrder, 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 = reqDto.BillCode, InDocsRowNo = reqDto.MatBarCode, SuppCode = "", MatId = mater.Id, MatCode = mater.Code, MatName = mater.Name, LengthQty = reqDto.Length, TareWQty = reqDto.Weight, ProductTime = reqDto.ProductDate, RFIDBarCode = "", ProductLineNo = "", Grade = reqDto.Grade, HWBarCode = "", HWTypeCode = reqDto.SpoolType,//工字轮类型 IsFast = reqDto.IsFast, IsRework = false, CLBarCode = reqDto.MatBarCode, Size = 1, AddTime = DateTime.Now, BackReason = "", IsBack = reqDto.IsBack, SilkTypeCode = reqDto.SilkType, IsCore = reqDto.BusType == "2", }; _billInvinitrepository.InsertReturnEntity(barinfo); _billSpoolTransrepository.InsertReturnEntity(billSpoolTrans); } return res; } #endregion 湿拉工字轮/帘线芯股信息初始化 /// /// 分配分拣库 /// /// public bool AllocationWarehouseSort(AllocationWarehouseSortRequest reqDto) { return true; } /// /// 二次扫码分配输送地址 /// /// /// public SRes AllocationConveyorSort(AllocationConveyorSortRequest reqDto) { var res = new SRes(); var baritem = _billSpoolTransrepository.GetFirst(p => p.ConBarCode == reqDto.BarCode); //判断当前库是否有mix垛型 var mixrow = _billBomsetinfoRepository.AsQueryable().Where(p => p.IsMixRow == 1 && p.WarehouseCode == baritem.WarehouseCode); if (mixrow == null || !mixrow.Any()) { var matcodelist = _billBomsetinfoRepository.AsQueryable().Where(p => p.WarehouseCode == baritem.WarehouseCode); var curmatrate = matcodelist.Where(p => p.MatCode == baritem.MatCode).Count() / matcodelist.Count(); //需要的总量 } else { } var translist = _billSpoolTransrepository.AsQueryable().Where(p => p.WarehouseCode == baritem.WarehouseCode).ToList(); foreach (var item in translist.GroupBy(p => p.ConveyorSort)) { } return res; } /// /// 帘线领料出库 /// /// /// public SRes CurtainProductionStockOut(CurtainProductionStockOutRequest 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 doc = _docrepository.GetSingle(p => p.DocNo == reqDto.BillCode); if (doc == null) { doc = new fjBillDocument(); doc.WarehouseId = warehosue.Id; //保存单据信息 doc.ReqNo = reqDto.ReqId; doc.DocNo = reqDto.BillCode; doc.TypeCode = DocType.DocType_FJ_CurtainProductionStockOut.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; } } return res; } public SRes ProductionBack(FjProductionBackRequest reqDto) { var res = new SRes(); return res; } public SRes ProductionLeftFeedBack(string doccode) { var res = new SRes(); return res; } public SRes ErrorMaterialStockOut(FjErrorMaterialStockOutRequest reqDto) { var res = new SRes(); return res; } public SRes BGradeMaterialStockOut(BGradeMaterialStockOutRequest reqDto) { var res = new SRes(); return res; } public SRes StockChange(FjStockChangeRequest reqDto) { var res = new SRes(); return res; } #region 空托盘入库 /// /// 一楼空托盘人工入库任务创建 /// /// /// public SRes OneFloorWorkerBuildEmptyPalletsStock(FJBuildEmptyPalletsStockRequest reqDto) { var res = new SRes(); var req = _mapper.Map(reqDto); req.Floor = 1; req.BusType = FJTaskBusType.OneLayerManualPallets; //TODO:条码长度待定 if (reqDto.PalletCode.Length != 12) { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = "MES上传的RFID长度不等于12位"; return res; } res = FJEmptyPalletsStockIn(req); return res; } /// /// 分拣库空托盘入库 /// /// /// public SRes FJEmptyPalletsStockIn(FJBuildEmptyPalletsStockDto reqDto) { var res = new CopperLineResponse(); FJTaskBusType BusType = reqDto.BusType; //验证业务类型 if (reqDto.BusType <= FJTaskBusType.def || reqDto.BusType > FJTaskBusType.OneLayerAutoPallets) { res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode(); res.ResMsg = "指令类型" + reqDto.BusType + ResponseStatusCodeEnum.ErrParam.GetDescription(); return res; } //验证是否有空余货位 res = (CopperLineResponse)IsThereAnySpaceVacancy(); if (res.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode()) return res; //检查仓库是否存在 res = (CopperLineResponse)CheckWareCode(reqDto.WareCode); if (res.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode()) return res; //验证容器是否存在 res = (CopperLineResponse)CheckContinfo(reqDto.PalletCode, FJContainerType.ContainerType_Pallet); if (res.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode()) return res; //验证托盘是否有未结束的任务 res = (CopperLineResponse)CheckNoFinishTask(reqDto.PalletCode); if (res.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode()) return res; //验证是否存在库存信息 res = (CopperLineResponse)CheckInvnow(reqDto.PalletCode); if (res.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode()) return res; //保存条码信息 空托盘条码即条码表条码 var barinfo = _billInvinitrepository.GetSingle(p => p.InvBarCode == reqDto.PalletCode); if (barinfo == null) { var warehosue = _basewarehouserepository.GetSingle(p => p.Code == reqDto.WareCode); barinfo = new BillInvinit() { InvBarCode = reqDto.PalletCode, WarehouseId = warehosue.Id, ContGrpId = IdFactory.NewId(), ContGrpBarCode = reqDto.PalletCode, ExecStateCode = FJInvLockState.InvState_Normal.ToString(), ExecDocsTypeCode = FJDocType.DocType_FJ_EmptyPalletsStockIn.GetHashCode().ToString(), InvInOut = FJInvInOutType.In.GetHashCode(), ExecWho = "WCS", EditTime = DateTime.Now, InvStateCode = FJInvState.InvEcecState_BuildUp.ToString(), SuppCode = "", Size = 1, AddTime = DateTime.Now, }; barinfo = _billInvinitrepository.InsertReturnEntity(barinfo); } //生成库存信息-分解方法 var createStockRes = CreateStock(new List() { barinfo }, reqDto.PalletCode, FJContainerType.ContainerType_Pallet); if (createStockRes.ResCode != 200) { res.ResCode = createStockRes.ResCode; res.ResMsg = createStockRes.ResMsg; return res; } var createStockInWcsTaskReqest = new FJCreateStockInWcsTaskRequest() { BusType = BusType.GetDescription(), ContGrpBarCode = reqDto.PalletCode, ContGrpId = createStockRes.ResData.ContGrpId, Qty = reqDto.PalletNum.ObjToDecimal(), EquCode = reqDto.StartLoc, WarehouseCode = reqDto.WareCode, Floor = reqDto.Floor, }; //下发wcs任务 - 分解方法 var taskres = CreateStockInWcsTask(createStockInWcsTaskReqest); if (taskres.ResCode != 200) { res.ResCode = taskres.ResCode; res.ResMsg = taskres.ResMsg; return res; } //生成流水数据-分解方法 CreateInvFlow(new List() { createStockRes.ResData }); return res; } #endregion 空托盘入库 #region 满轮同WCS交互 #region 主线 /// /// 工字轮/芯股进入主线扫码 /// /// public SRes EnteMainLine(FJEnteMainLineRequest reqDto) { var res = new SRes(); try { RedisHelper.LPush(nameof(EnteMainLine), reqDto.IShapedWheelCodes); res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.Sucess.GetDescription(); } catch (Exception ex) { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = ex.Message; } return res; } /// /// 分配分拣库 /// /// /// public SRes AllocationWarehouseSort(string code) { var res = new SRes(); //找到码垛工字轮信息 var spoolTrans = _billSpoolTransrepository.GetSingle(p => p.ConBarCode == code); //通过订单找到对应的机台信息 var maclist = _basemachinforepository.AsQueryable().Where(p => p.WorkOrder == spoolTrans.WorkOrder); var warelist = maclist.Select(p => p.WarehouseCode).Distinct().OrderBy(v => v); //找到机台对应的仓库信息 if (!warelist.Any()) //当前订单没有对应仓库信息 { _billSpoolTransrepository.UpdateModelColumns(p => new BillSpoolTrans() { ErrType = 1, ErrMsg = "没有配置机台信息", EditTime = DateTime.Now }, p => p.ConBarCode == spoolTrans.ConBarCode); } else if (warelist.Count() == 1) //当前订单对应一个仓库信息 { int sort = int.Parse(warelist.First().Substring(0, 1)); _billSpoolTransrepository.UpdateModelColumns(p => new BillSpoolTrans() { WarehouseSort = sort, Direct = warelist.First().Substring(1, 1), EditTime = DateTime.Now }, p => p.ConBarCode == spoolTrans.ConBarCode); } else //当前订单对应多个仓库信息 { var waretemplist = maclist.Select(p => new { p.WarehouseCode, p.WorkOrder, p.BillCode, p.PlanQty }).Distinct(); var warehouselist = _basewarehouserepository.GetList().Select(p => p.Code); foreach (var warehouse in warehouselist) { var stackdetaillist = _billBomsetinfoRepository.AsQueryable().Where(p => p.WarehouseCode == warehouse); getMatProport(spoolTrans.MatCode, warehouse); } //根据垛型及库存比例分配 //找出该物料类型在每个库所要求的所有量 //找出该物料库存在当前库所有 } return res; } /// /// 计算物料在该仓库的比例 /// /// 物料编号 /// 仓库编号 /// public decimal getMatProport(string matcode, string warehousecode) { //计算此仓库所有该物料的量 //每的单子(每盘的数量) var stackdetaillist = _billBomsetinfoRepository.AsQueryable().Where(p => p.WarehouseCode == warehousecode); return 0; } #endregion 主线 #endregion 满轮同WCS交互 public SRes BomInfoTrans(BomInfoTransRequest reqDto) { var res = new SRes(); return res; } public SRes FJ1NorthAutoGenerateLocation() { SRes res = new SRes(); BaseWarehouse BaseWarearea = new BaseWarehouse() { Id = IdFactory.NewId(), IsStop = 0, Code = "fj1northhouse", Name = "分拣库1北", AddTime = DateTime.Now , AddWho = "admin", EditTime = DateTime.Now, EditWho = "admin", TypeNum = 1 }; var baseWareareaEntity = _basewarehouserepository.InsertReturnEntity(BaseWarearea); var dbBaseWarecellLists = _basewarehouserepository.AsQueryable().ToList(); var shelfcode = ""; var list = new List(); var codes = new List(); for (int row = 1; row <= 2; row++) //行 { //shelfcode = "L"; ////1 2 是R, 3 4 是 L //if (row == 1 || row == 2 || row == 5 || row == 6 || row == 9 || row == 10) //{ // shelfcode = "R"; //} //// 23 深度1 , 1 4 5 8 9 12深度2 //int depth = 1; //if (row == 1 || row == 4 || row == 5 || row == 8 || row == 9 || row == 12) //{ // depth = 2; //} int tunnel = 1; //12行 48列9层 for (int layer = 1; layer <= 10; layer++) //层 { for (int col = 1; col <= 10; col++) //列 { var code = row.ToString().PadLeft(2, '0') + "-" + col.ToString().PadLeft(2, '0') + "-" + layer.ToString().PadLeft(2, '0') + "-" + tunnel; codes.Add(code); var name = row.ToString() + "行" + col.ToString() + "列" + layer.ToString() + "层"; list.Add(new BaseWarecell { Id = IdFactory.NewId(), WarehouseId = baseWareareaEntity.Id, WareAreaId = 1669154208777113600, IsStop = 0, Code = code, Name = name, StateNum = 1, TypeNum = 1, Size = 1, Shelf = tunnel.ToString() + shelfcode, WarehouseCode = "fj1northhouse", Row = row, Col = col, Layer = layer, Depth = 1, Tunnel = tunnel, SCRel = "SRM" + tunnel.ToString().PadLeft(2, '0'), ContGrpId = 0, ContGrpBarCode = "", Memo = "", AddWho = "admin", AddTime = DateTime.Now, EditWho = "admin", EditTime = DateTime.Now, }); } } } _basewarecellrepository.InsertRange(list); return res; } public SRes FJSouthAutoGenerateLocation() { SRes res = new SRes(); BaseWarehouse BaseWarearea = new BaseWarehouse() { Id = IdFactory.NewId(), IsStop = 0, Code = "fj1southhouse", Name = "分拣库1南", AddTime = DateTime.Now , AddWho = "admin", EditTime = DateTime.Now, EditWho = "admin", TypeNum = 1 }; var baseWareareaEntity = _basewarehouserepository.InsertReturnEntity(BaseWarearea); var dbBaseWarecellLists = _basewarehouserepository.AsQueryable().ToList(); var shelfcode = ""; var list = new List(); var codes = new List(); for (int row = 1; row <= 2; row++) //行 { //shelfcode = "L"; ////1 2 是R, 3 4 是 L //if (row == 1 || row == 2 || row == 5 || row == 6 || row == 9 || row == 10) //{ // shelfcode = "R"; //} //// 23 深度1 , 1 4 5 8 9 12深度2 //int depth = 1; //if (row == 1 || row == 4 || row == 5 || row == 8 || row == 9 || row == 12) //{ // depth = 2; //} int tunnel = 1; //12行 48列9层 for (int layer = 1; layer <= 10; layer++) //层 { for (int col = 11; col <= 20; col++) //列 { var code = row.ToString().PadLeft(2, '0') + "-" + col.ToString().PadLeft(2, '0') + "-" + layer.ToString().PadLeft(2, '0') + "-" + tunnel; codes.Add(code); var name = row.ToString() + "行" + col.ToString() + "列" + layer.ToString() + "层"; list.Add(new BaseWarecell { Id = IdFactory.NewId(), WarehouseId = baseWareareaEntity.Id, WareAreaId = 1669154208777113600, IsStop = 0, Code = code, Name = name, StateNum = 1, TypeNum = 1, Size = 1, Shelf = tunnel.ToString() + shelfcode, WarehouseCode = "fj1southhouse", Row = row, Col = col, Layer = layer, Depth = 1, Tunnel = tunnel, SCRel = "SRM" + tunnel.ToString().PadLeft(2, '0'), ContGrpId = 0, ContGrpBarCode = "", Memo = "", AddWho = "admin", AddTime = DateTime.Now, EditWho = "admin", EditTime = DateTime.Now, }); } } } _basewarecellrepository.InsertRange(list); return res; } #region 容器、物料、条码、库存检测及创建,创建流水信息 /// /// 检查容器是否存在,不存在则创建 /// /// 容器条码 /// 容器类型 /// public SRes CheckContinfo(string contBarCode, FJContainerType fjContainerType) { SRes res = new SRes(); var container = _baseContinfo.GetSingle(x => x.ContBarCode == contBarCode); if (container == null) { //创建容器信息 var cont = new BaseContinfo { ContBarCode = contBarCode, Name = contBarCode, TypeCode = fjContainerType.ToString(), PrintQty = 1, IsStop = 0, WarehouseId = 0, AddWho = "WMS", AddTime = DateTime.Now }; //加载新的容器信息 if (!_baseContinfo.Insert(cont)) { res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode(); res.ResMsg = "RFID载具初始化失败"; return res; } } else if (container.IsStop != 0) { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = "容器已停用"; return res; } res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode(); return res; } /// /// 跟据库存信息创建流水信息 /// /// 库存信息 /// 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 CreateInvFlow(BillInvnow bar) { var res = new SRes(); var flow = _mapper.Map(bar); flow.AddTime = DateTime.Now; flow.Id = IdFactory.NewId(); _billInvflow.Insert(flow); return res; } /// /// 是否有空余货位 /// /// public SRes IsThereAnySpaceVacancy() { var res = new SRes(); //验证有剩余货位 if (_basewarecellrepository.GetList(p => p.IsStop == 0 && p.StateNum == FJLocationState.LocationState_Empty.GetHashCode()).Count() < 2) { res.ResCode = ResponseStatusCodeEnum.NotEnoughLocation.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.NotEnoughLocation.GetDescription(); return res; } res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode(); return res; } /// /// 检查传入的仓库是否存在 /// /// 仓库编号 /// public SRes CheckWareCode(string wareCode) { var res = new SRes(); //验证是否有对应仓库 var warehosue = _basewarehouserepository.GetSingle(p => p.Code == wareCode); if (warehosue == null) { res.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription(); return res; } res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode(); return res; } /// /// 验证空托盘是否有未结束的任务 /// /// /// public SRes CheckNoFinishTask(string PalletCode) { SRes res = new SRes(); //验证当前托盘是否有未结束的任务 var task = _wcstaskoldrepository.AsQueryable().Where(p => p.BarCode == PalletCode && p.Status < TaskStatus.Finish).SplitTable(p => p.Take(2)).First(); if (task != null && task.ID > 0) { switch (task.Type) { case TaskType.SetPlate: res.ResCode = ResponseStatusCodeEnum.WcsTaskExist.GetHashCode(); res.ResMsg = PalletCode + "该号组盘任务还未完成,请先完成组盘任务"; return res; case TaskType.EnterDepot: if (task.Status > TaskStatus.WaitingToExecute && task.Status < TaskStatus.Finish) { res.ResCode = ResponseStatusCodeEnum.WcsTaskExist.GetHashCode(); res.ResMsg = PalletCode + "已有进行中任务,请检查托盘条码是否重复"; return res; } res.ResCode = ResponseStatusCodeEnum.WcsTaskExist.GetHashCode(); res.ResMsg = PalletCode + "任务已创建,请勿重复申请"; return res; case TaskType.OutDepot: res.ResCode = ResponseStatusCodeEnum.WcsTaskExist.GetHashCode(); res.ResMsg = PalletCode + "该号出库任务还未完成,请先完成出库任务"; return res; case TaskType.TransferDepot: res.ResCode = ResponseStatusCodeEnum.WcsTaskExist.GetHashCode(); res.ResMsg = PalletCode + "该号移库任务还未完成,请先完成移库任务"; return res; case TaskType.Delivery: res.ResCode = ResponseStatusCodeEnum.WcsTaskExist.GetHashCode(); res.ResMsg = PalletCode + "该号输送任务还未完成,请先完成输送任务"; return res; case TaskType.EmptyInit: res.ResCode = ResponseStatusCodeEnum.WcsTaskExist.GetHashCode(); res.ResMsg = PalletCode + "该号空轮初始化任务还未完成,请先完成空轮初始化任务"; return res; } } res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode(); return res; } /// /// 检查是否存在库存信息 /// /// 编码 /// public SRes CheckInvnow(string code) { SRes res = new SRes(); //验证是否没有库存信息 var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == code); if (stock != null && stock.InvStateCode == FJInvState.InvEcecState_In.ToString()) { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = code + "该托盘号已在库中,请检查托盘号是否重复"; return res; } else if (stock != null && stock.InvStateCode == InvState.InvEcecState_OutGoing.ToString()) { res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(); res.ResMsg = code + "该托盘号存在出库中任务,请检查上一个任务是否已经完成"; return res; } else if (stock != null) { res.ResCode = ResponseStatusCodeEnum.GroupStockDetailMaterialBarCodeExist.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.GroupStockDetailMaterialBarCodeExist.GetDescription(); return res; } res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode(); return res; } /// /// 创建库存信息 /// 不验证容器是否存在 /// 不验证容器是否有未结束的任务 /// 不验条码信息是否存在 /// /// 条码集合 /// 容器编号 /// 容器类型 /// public SRes CreateStock(List barList, string containerBarcode, FJContainerType containerType) { var res = new SRes(); if (string.IsNullOrEmpty(containerBarcode)) { res.ResCode = ResponseStatusCodeEnum.ContainerCodeNotEmpty.GetHashCode(); res.ResMsg = ResponseStatusCodeEnum.ContainerCodeNotEmpty.GetDescription(); return res; } //将条码表映射到库存表 var stocklist = _mapper.Map>(barList); foreach (var item in stocklist) { item.AddTime = DateTime.Now; item.Id = IdFactory.NewId(); } if (!_billInvnowrepository.InsertRange(stocklist)) { res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode(); res.ResMsg = "托盘库存信息存储失败"; return res; } res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode(); res.ResDataList = stocklist; return res; } /// /// 创建WCS任务 /// /// /// public SRes CreateStockInWcsTask(FJCreateStockInWcsTaskRequest 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; } #endregion 容器、物料、条码、库存检测及创建,创建流水信息 } }