|  | @@ -66,7 +66,7 @@ namespace wms.service.Service
 | 
	
		
			
				|  |  |          ///  容器表
 | 
	
		
			
				|  |  |          /// </summary>
 | 
	
		
			
				|  |  |          private Repository<BaseContinfo> _baseContinfo => new Repository<BaseContinfo>();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | +        
 | 
	
		
			
				|  |  |          /// <summary>
 | 
	
		
			
				|  |  |          ///  环形库码垛缓存信息
 | 
	
		
			
				|  |  |          /// </summary>
 | 
	
	
		
			
				|  | @@ -1346,6 +1346,347 @@ namespace wms.service.Service
 | 
	
		
			
				|  |  |              return res;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +        /// <summary>
 | 
	
		
			
				|  |  | +        ///  重绕区组盘信息
 | 
	
		
			
				|  |  | +        /// </summary>
 | 
	
		
			
				|  |  | +        /// <param name="reqDto"></param>
 | 
	
		
			
				|  |  | +        /// <returns></returns>
 | 
	
		
			
				|  |  | +        public SRes CreateMaterialPalletWarehouTask2(RewindFullPalletTaskRequest reqDto)
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            var res = new SRes() { ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(), ResMsg = "失败" };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            //获取工字轮任务信息
 | 
	
		
			
				|  |  | +            var taskInfo = _taskrepository.AsQueryable().With(SqlWith.NoLock).First(x => x.BarCode == reqDto.TrayCode && x.Status < TaskStatus.Finish);
 | 
	
		
			
				|  |  | +            if (taskInfo != null)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
 | 
	
		
			
				|  |  | +                res.ResMsg = reqDto.TrayCode + "已有任务,请联系智能制造人员进行处理!!!!!!";
 | 
	
		
			
				|  |  | +                return res;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            //托盘
 | 
	
		
			
				|  |  | +            var container = _baseContinfo.GetSingle(p => p.ContBarCode == reqDto.TrayCode);
 | 
	
		
			
				|  |  | +            if (container == null)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                var insertcon = new BaseContinfo()
 | 
	
		
			
				|  |  | +                {
 | 
	
		
			
				|  |  | +                    ContBarCode = reqDto.TrayCode,
 | 
	
		
			
				|  |  | +                    Name = reqDto.TrayCode,
 | 
	
		
			
				|  |  | +                    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 trayCode = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == reqDto.TrayCode);
 | 
	
		
			
				|  |  | +            if (trayCode != null && trayCode.InvStateCode == InvState.InvEcecState_In.ToString())
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
 | 
	
		
			
				|  |  | +                res.ResMsg = "该托盘条码号已在库中,请检查条码号是否重复";
 | 
	
		
			
				|  |  | +                return res;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            if (trayCode != null && trayCode.InvStateCode == InvState.InvEcecState_OutGoing.ToString())
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
 | 
	
		
			
				|  |  | +                res.ResMsg = "该托盘条码号存在出库中任务,请检查上一个任务是否已经完成";
 | 
	
		
			
				|  |  | +                return res;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            var SpoolNoGroup = reqDto.SpoolGroup.Select(x => x.SpoolCode).ToList();
 | 
	
		
			
				|  |  | +            var stackHeaderSet = new List<BillBomsetgrp>();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            #region 校验工字轮信息并获取对应垛型
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            foreach (var spool in reqDto.SpoolGroup)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                var spoolNr = _baseContinfo.GetSingle(p => p.ContBarCode == spool.SpoolCode);
 | 
	
		
			
				|  |  | +                if (spoolNr == null)
 | 
	
		
			
				|  |  | +                {
 | 
	
		
			
				|  |  | +                    var insertcon = new BaseContinfo()
 | 
	
		
			
				|  |  | +                    {
 | 
	
		
			
				|  |  | +                        ContBarCode = spool.SpoolCode,
 | 
	
		
			
				|  |  | +                        Name = spool.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 == spool.MatCode);
 | 
	
		
			
				|  |  | +                if (mater == null)
 | 
	
		
			
				|  |  | +                {
 | 
	
		
			
				|  |  | +                    res.ResCode = ResponseStatusCodeEnum.MaterInfoNotExist.GetHashCode();
 | 
	
		
			
				|  |  | +                    res.ResMsg = ResponseStatusCodeEnum.MaterInfoNotExist.GetDescription();
 | 
	
		
			
				|  |  | +                    return res;
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                //工字轮库存
 | 
	
		
			
				|  |  | +                var stock = _billInvnowrepository.GetSingle(p => p.HWBarCode == spool.SpoolCode);
 | 
	
		
			
				|  |  | +                if (stock != null && stock.InvStateCode == InvState.InvEcecState_In.ToString())
 | 
	
		
			
				|  |  | +                {
 | 
	
		
			
				|  |  | +                    res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
 | 
	
		
			
				|  |  | +                    res.ResMsg = "该工字轮条码号已在库中,请检查工字轮条码号是否重复";
 | 
	
		
			
				|  |  | +                    return res;
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                if (stock != null && stock.InvStateCode == InvState.InvEcecState_OutGoing.ToString())
 | 
	
		
			
				|  |  | +                {
 | 
	
		
			
				|  |  | +                    res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
 | 
	
		
			
				|  |  | +                    res.ResMsg = "该工字轮条码号存在出库中任务,请检查上一个任务是否已经完成";
 | 
	
		
			
				|  |  | +                    return res;
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                //通过投入物料找到垛型编码
 | 
	
		
			
				|  |  | +                var stackDetail = _billBomsetinfoRepository.GetFirst(p => p.MatCode == spool.MatCode && p.IsStop == 0);
 | 
	
		
			
				|  |  | +                if (stackDetail == null)
 | 
	
		
			
				|  |  | +                {
 | 
	
		
			
				|  |  | +                    res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
 | 
	
		
			
				|  |  | +                    res.ResMsg = reqDto.SpoolGroup + "没有对应的垛型信息,物料编码" + spool.MatCode;
 | 
	
		
			
				|  |  | +                    return res;
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                //获取垛型主表
 | 
	
		
			
				|  |  | +                var stack = _BillBomsetgrpRepository.GetSingle(p => p.Id == stackDetail.BomSetHdrId && p.IsStop == 0);
 | 
	
		
			
				|  |  | +                stackHeaderSet.Add(stack);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            if (stackHeaderSet.GroupBy(x=>x.Id).Count()!=1)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
 | 
	
		
			
				|  |  | +                res.ResMsg = "扫描托盘不属于同一个垛型,请手动处理后重新组盘";
 | 
	
		
			
				|  |  | +                return res;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            #endregion
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            var stackHeader = stackHeaderSet.First();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +          
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            try
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                _db.BeginTran();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                #region 删除所有工字轮信息,并创建新信息
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                _billInvinitrepository.Delete(x => SpoolNoGroup.Contains(x.ContGrpBarCode));
 | 
	
		
			
				|  |  | +                _billSpoolTransrepository.Delete(x => SpoolNoGroup.Contains(x.ConBarCode));
 | 
	
		
			
				|  |  | +                var materiel = _basematerrepository.GetSingle(p => p.Code == stackHeader.ProMaterCode);
 | 
	
		
			
				|  |  | +                var wareHouse = _basewarehouserepository.GetFirst(x => x.Code == "1"); //TODO:1换成满托平库满盘Code
 | 
	
		
			
				|  |  | +                var barInfoList = new List<BillInvinit>();
 | 
	
		
			
				|  |  | +                var invNowList = new List<BillInvnow>();
 | 
	
		
			
				|  |  | +                var invFlowList=new List<BillInvflow>();
 | 
	
		
			
				|  |  | +                foreach (var spool in reqDto.SpoolGroup)
 | 
	
		
			
				|  |  | +                {
 | 
	
		
			
				|  |  | +                    var mater = _basematerrepository.GetSingle(p => p.Code == spool.MatCode);
 | 
	
		
			
				|  |  | +                    //工字轮需要用到的托盘类型
 | 
	
		
			
				|  |  | +                    var fJPalletType = FJPalletType.Pallet09;
 | 
	
		
			
				|  |  | +                    if (spool.SpoolType != "WS09") fJPalletType = FJPalletType.PalletNo09;
 | 
	
		
			
				|  |  | +                    var barinfo = InitInvinitInfo(spool, wareHouse, stackHeader, mater, materiel, fJPalletType);
 | 
	
		
			
				|  |  | +                    barInfoList.Add(barinfo);
 | 
	
		
			
				|  |  | +                    //删除因异常导致残留的对应库存信息
 | 
	
		
			
				|  |  | +                    _billInvnowrepository.Delete(x => x.ContGrpBarCode == barinfo.ContGrpBarCode || x.HWBarCode == barinfo.ContGrpBarCode);
 | 
	
		
			
				|  |  | +                    
 | 
	
		
			
				|  |  | +                    //将条码表映射到库存表
 | 
	
		
			
				|  |  | +                    var invnow = _mapper.Map<BillInvnow>(barinfo);
 | 
	
		
			
				|  |  | +                    invnow.IsTorsChk = true;
 | 
	
		
			
				|  |  | +                    invnow.AddTime = DateTime.Now;
 | 
	
		
			
				|  |  | +                    invnow.InvStateCode = FJInvState.InvEcecState_BuildUp.ToString();
 | 
	
		
			
				|  |  | +                    invnow.ContGrpBarCode = reqDto.TrayCode;
 | 
	
		
			
				|  |  | +                    invnow.Id = IdFactory.NewId();
 | 
	
		
			
				|  |  | +                    invnow.WarehouseId = wareHouse.Id;
 | 
	
		
			
				|  |  | +                    invNowList.Add(invnow);
 | 
	
		
			
				|  |  | +                    
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                if (!_billInvinitrepository.InsertRange(barInfoList))
 | 
	
		
			
				|  |  | +                {
 | 
	
		
			
				|  |  | +                    _db.RollbackTran();
 | 
	
		
			
				|  |  | +                    res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();
 | 
	
		
			
				|  |  | +                    res.ResMsg = "重绕满托存储条码信息失败";
 | 
	
		
			
				|  |  | +                    return res;
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                if (!_billInvnowrepository.InsertRange(invNowList))
 | 
	
		
			
				|  |  | +                {
 | 
	
		
			
				|  |  | +                    _db.RollbackTran();
 | 
	
		
			
				|  |  | +                    res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();
 | 
	
		
			
				|  |  | +                    res.ResMsg = "重绕满托存储库存信息失败";
 | 
	
		
			
				|  |  | +                    return res;
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                if (!_billInvflow.InsertRange(invFlowList))
 | 
	
		
			
				|  |  | +                {
 | 
	
		
			
				|  |  | +                    _db.RollbackTran();
 | 
	
		
			
				|  |  | +                    res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();
 | 
	
		
			
				|  |  | +                    res.ResMsg = "重绕满托存储库存流水信息失败";
 | 
	
		
			
				|  |  | +                    return res;
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                //创建入库记录
 | 
	
		
			
				|  |  | +                var createStockInWcsTaskReqest = new FJCreateStockInWcsTaskRequest
 | 
	
		
			
				|  |  | +                {
 | 
	
		
			
				|  |  | +                    BusType = FJTaskBusType.重绕满托入库.GetDescription(),
 | 
	
		
			
				|  |  | +                    ContGrpBarCode = reqDto.TrayCode,
 | 
	
		
			
				|  |  | +                    Qty = 1,
 | 
	
		
			
				|  |  | +                    Floor = 1,
 | 
	
		
			
				|  |  | +                    MatCode = "",
 | 
	
		
			
				|  |  | +                    EquCode = "",
 | 
	
		
			
				|  |  | +                    Type = TaskType.EnterDepot,
 | 
	
		
			
				|  |  | +                    DocCode = "",
 | 
	
		
			
				|  |  | +                    WorkBench = "",
 | 
	
		
			
				|  |  | +                    WarehouseCode = wareHouse.Code,
 | 
	
		
			
				|  |  | +                };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                //下发wcs任务 - 分解方法
 | 
	
		
			
				|  |  | +                var taskRes = CreateStockInWcsTask(createStockInWcsTaskReqest,"A" , true);
 | 
	
		
			
				|  |  | +                if (taskRes.ResCode != 200)
 | 
	
		
			
				|  |  | +                {
 | 
	
		
			
				|  |  | +                    _db.RollbackTran();
 | 
	
		
			
				|  |  | +                    res.ResCode = taskRes.ResCode;
 | 
	
		
			
				|  |  | +                    res.ResMsg = taskRes.ResMsg;
 | 
	
		
			
				|  |  | +                    return res;
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                _db.CommitTran();
 | 
	
		
			
				|  |  | +                #endregion
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            catch (Exception e)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                _db.RollbackTran();
 | 
	
		
			
				|  |  | +                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
 | 
	
		
			
				|  |  | +                res.ResMsg = e.Message;
 | 
	
		
			
				|  |  | +                return res;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();
 | 
	
		
			
				|  |  | +            res.ResMsg = ResponseStatusCodeEnum.Sucess.ToString();
 | 
	
		
			
				|  |  | +            return res;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        /// <summary>
 | 
	
		
			
				|  |  | +        ///  创建退料任务
 | 
	
		
			
				|  |  | +        /// </summary>
 | 
	
		
			
				|  |  | +        /// <param name="reqDto"></param>
 | 
	
		
			
				|  |  | +        /// <returns></returns>
 | 
	
		
			
				|  |  | +        public SRes MaterialReturnTaskCreator(MaterialReturnTaskCreatorRequest reqDto)
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            var res = new SRes() { ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(), ResMsg = "失败" };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            //获取工字轮任务信息
 | 
	
		
			
				|  |  | +            var taskInfo = _taskrepository.AsQueryable().With(SqlWith.NoLock).First(x => x.BarCode == reqDto.TrayCode && x.Status < TaskStatus.Finish);
 | 
	
		
			
				|  |  | +            if (taskInfo != null)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
 | 
	
		
			
				|  |  | +                res.ResMsg = reqDto.TrayCode + "已有任务,请联系智能制造人员进行处理!!!!!!";
 | 
	
		
			
				|  |  | +                return res;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            //托盘
 | 
	
		
			
				|  |  | +            var container = _baseContinfo.GetSingle(p => p.ContBarCode == reqDto.TrayCode);
 | 
	
		
			
				|  |  | +            if (container == null)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                var insertcon = new BaseContinfo()
 | 
	
		
			
				|  |  | +                {
 | 
	
		
			
				|  |  | +                    ContBarCode = reqDto.TrayCode,
 | 
	
		
			
				|  |  | +                    Name = reqDto.TrayCode,
 | 
	
		
			
				|  |  | +                    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 trayCode = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == reqDto.TrayCode);
 | 
	
		
			
				|  |  | +            if (trayCode != null && trayCode.InvStateCode == InvState.InvEcecState_In.ToString())
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
 | 
	
		
			
				|  |  | +                res.ResMsg = "该托盘条码号已在库中,请检查条码号是否重复";
 | 
	
		
			
				|  |  | +                return res;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            if (trayCode != null && trayCode.InvStateCode == InvState.InvEcecState_OutGoing.ToString())
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
 | 
	
		
			
				|  |  | +                res.ResMsg = "该托盘条码号存在出库中任务,请检查上一个任务是否已经完成";
 | 
	
		
			
				|  |  | +                return res;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            var mac = _basemachinforepository.GetFirst(x => x.MachNo == reqDto.LocCode);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            try
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                _db.BeginTran();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                var wareHouse = _basewarehouserepository.GetFirst(x => x.Code == "1"); //TODO:1换成退料平库满盘Code
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                //创建入库记录
 | 
	
		
			
				|  |  | +                var createStockInWcsTaskReqest = new FJCreateStockInWcsTaskRequest
 | 
	
		
			
				|  |  | +                {
 | 
	
		
			
				|  |  | +                    BusType = FJTaskBusType.帘线退料重绕.GetDescription(),
 | 
	
		
			
				|  |  | +                    ContGrpBarCode = reqDto.TrayCode,
 | 
	
		
			
				|  |  | +                    Qty = 1,
 | 
	
		
			
				|  |  | +                    Floor = 1,
 | 
	
		
			
				|  |  | +                    MatCode = "",
 | 
	
		
			
				|  |  | +                    EquCode = "",
 | 
	
		
			
				|  |  | +                    Type = TaskType.EnterDepot,
 | 
	
		
			
				|  |  | +                    DocCode = "",
 | 
	
		
			
				|  |  | +                    WorkBench = mac.Station, //TODO:是否是AGV站台
 | 
	
		
			
				|  |  | +                    WarehouseCode = wareHouse.Code,
 | 
	
		
			
				|  |  | +                };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                //下发wcs任务 - 分解方法
 | 
	
		
			
				|  |  | +                var taskRes = CreateStockInWcsTask(createStockInWcsTaskReqest, "A", true);
 | 
	
		
			
				|  |  | +                if (taskRes.ResCode != 200)
 | 
	
		
			
				|  |  | +                {
 | 
	
		
			
				|  |  | +                    _db.RollbackTran();
 | 
	
		
			
				|  |  | +                    res.ResCode = taskRes.ResCode;
 | 
	
		
			
				|  |  | +                    res.ResMsg = taskRes.ResMsg;
 | 
	
		
			
				|  |  | +                    return res;
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                _db.CommitTran();
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            catch (Exception e)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                _db.RollbackTran();
 | 
	
		
			
				|  |  | +                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
 | 
	
		
			
				|  |  | +                res.ResMsg = e.StackTrace;
 | 
	
		
			
				|  |  | +                return res;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();
 | 
	
		
			
				|  |  | +            res.ResMsg = ResponseStatusCodeEnum.Sucess.ToString();
 | 
	
		
			
				|  |  | +            return res;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |          public SRes ManualBuildStockTrans(ManualBuildStockTransRequest reqDto)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  |              var res = new SRes();
 | 
	
	
		
			
				|  | @@ -1508,7 +1849,6 @@ namespace wms.service.Service
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  |                  _logger.LogInformation(reqDto.SpoolCode + "没有对应的垛型信息,物料编码" + reqDto.MatCode);
 | 
	
		
			
				|  |  |                  _billInvinitrepository.Delete(x => x.ContGrpBarCode == billSpoolTrans.ConBarCode);
 | 
	
		
			
				|  |  | -                _billInvinitrepository.Delete(x => x.ContGrpBarCode == billSpoolTrans.ConBarCode);
 | 
	
		
			
				|  |  |                  _billSpoolTransrepository.Delete(x => x.ConBarCode == billSpoolTrans.ConBarCode);
 | 
	
		
			
				|  |  |                  _logger.LogInformation($"找不到垛形信息时删除缓存信息{billSpoolTrans.ConBarCode}");
 | 
	
		
			
				|  |  |                  var task = _taskrepository.GetSingle(x => x.BarCode == billSpoolTrans.ConBarCode);
 | 
	
	
		
			
				|  | @@ -2364,7 +2704,7 @@ namespace wms.service.Service
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                  //找到所有的立库/虚拟货位
 | 
	
		
			
				|  |  | -                var warehouse = _basewarehouserepository.GetList(x => x.TypeNum == FjLocationType.Storage||x.TypeNum==FjLocationType.Virtual).Select(x => x.Id).ToList();
 | 
	
		
			
				|  |  | +                var warehouse = _basewarehouserepository.GetList(x => x.TypeNum == FjLocationType.Storage||x.TypeNum==FjLocationType.Virtual||x.TypeNum==FjLocationType.Pingku).Select(x => x.Id).ToList();
 | 
	
		
			
				|  |  |                  var task = _wcstaskoldrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.WorkBench == mach.Station && p.Status < TaskStatus.Finish).SplitTable(tabs => tabs.Take(2));
 | 
	
		
			
				|  |  |                  if (task != null && task.Any())
 | 
	
		
			
				|  |  |                  {
 | 
	
	
		
			
				|  | @@ -3575,184 +3915,6 @@ namespace wms.service.Service
 | 
	
		
			
				|  |  |              return res;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        /// <summary>
 | 
	
		
			
				|  |  | -        /// 分配分拣库
 | 
	
		
			
				|  |  | -        /// </summary>
 | 
	
		
			
				|  |  | -        /// <param name="code">工字轮条码</param>
 | 
	
		
			
				|  |  | -        /// <returns></returns>
 | 
	
		
			
				|  |  | -        public SRes AllocationWarehouseSort(string code)
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -            //开始分配分拣库
 | 
	
		
			
				|  |  | -            var res = new SRes();
 | 
	
		
			
				|  |  | -            //找到码垛工字轮信息
 | 
	
		
			
				|  |  | -            var spoolTrans = _billSpoolTransrepository.GetSingle(p => p.ConBarCode == code);
 | 
	
		
			
				|  |  | -            if (spoolTrans == null)
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                //创建容器信息
 | 
	
		
			
				|  |  | -                var cont = new BillSpoolTrans
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    ConBarCode = code,
 | 
	
		
			
				|  |  | -                    AddWho = "WMS",
 | 
	
		
			
				|  |  | -                    AddTime = DateTime.Now,
 | 
	
		
			
				|  |  | -                    WorkOrder = "20230210",
 | 
	
		
			
				|  |  | -                    MatCode = "shilatest01"
 | 
	
		
			
				|  |  | -                };
 | 
	
		
			
				|  |  | -                //加载新的容器信息
 | 
	
		
			
				|  |  | -                if (!_billSpoolTransrepository.Insert(cont))
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();
 | 
	
		
			
				|  |  | -                    res.ResMsg = "RFID载具初始化失败";
 | 
	
		
			
				|  |  | -                    return res;
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | -                spoolTrans = _billSpoolTransrepository.GetSingle(p => p.ConBarCode == code);
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -            if (!spoolTrans.WarehouseCode.IsNullOrEmpty())
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
 | 
	
		
			
				|  |  | -                res.ResMsg = "已完成分库";
 | 
	
		
			
				|  |  | -                return res;
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            //验证容器是否存在
 | 
	
		
			
				|  |  | -            res = _mapper.Map<CopperLineResponse>(CheckContinfo(code, FJContainerType.ContainerType_IShapedWheel));
 | 
	
		
			
				|  |  | -            if (res.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode()) return res;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            //验证任务信息
 | 
	
		
			
				|  |  | -            res = _mapper.Map<CopperLineResponse>(CheckNoFinishTask(code));
 | 
	
		
			
				|  |  | -            if (res.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode()) return res;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            //验证是否条码信息
 | 
	
		
			
				|  |  | -            var invini = _billInvinitrepository.GetSingle(p => p.HWBarCode == code);
 | 
	
		
			
				|  |  | -            if (invini != null && invini.InvStateCode == FJInvState.InvEcecState_In.ToString())
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
 | 
	
		
			
				|  |  | -                res.ResMsg = code + "该托盘号已在库中,请检查托盘号是否重复";
 | 
	
		
			
				|  |  | -                return res;
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -            if (invini != null && invini.InvStateCode == InvState.InvEcecState_OutGoing.ToString())
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
 | 
	
		
			
				|  |  | -                res.ResMsg = code + "该托盘号存在出库中任务,请检查上一个任务是否已经完成";
 | 
	
		
			
				|  |  | -                return res;
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -            if (invini != null)
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                res.ResCode = ResponseStatusCodeEnum.GroupStockDetailMaterialBarCodeExist.GetHashCode();
 | 
	
		
			
				|  |  | -                res.ResMsg = ResponseStatusCodeEnum.GroupStockDetailMaterialBarCodeExist.GetDescription();
 | 
	
		
			
				|  |  | -                return res;
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            //通过订单找到对应的机台信息
 | 
	
		
			
				|  |  | -            var macList = _basemachinforepository.GetList(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) //当前订单对应一个仓库信息
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                var sort = int.Parse(wareList.First().Substring(0, 1));
 | 
	
		
			
				|  |  | -                _billSpoolTransrepository.UpdateModelColumns(p => new BillSpoolTrans
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    WarehouseCode = wareList.First(),
 | 
	
		
			
				|  |  | -                    WarehouseSort = sort,
 | 
	
		
			
				|  |  | -                    Direct = wareList.First().Substring(1, 1),
 | 
	
		
			
				|  |  | -                    EditTime = DateTime.Now
 | 
	
		
			
				|  |  | -                }, p => p.ConBarCode == spoolTrans.ConBarCode);
 | 
	
		
			
				|  |  | -                spoolTrans.WarehouseCode = wareList.First();
 | 
	
		
			
				|  |  | -                spoolTrans.WarehouseSort = sort;
 | 
	
		
			
				|  |  | -                spoolTrans.Direct = wareList.First().Substring(1, 1);
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -            else //当前订单对应多个仓库信息
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                //TODO:怎么计算当前订单在当前仓库需要码多少托,跟据当前仓库已有订单需要的托盘数量计算各订单在可用码垛工位占比,再计算当前托盘该码什么跺
 | 
	
		
			
				|  |  | -                var wareTempList = macList.Select(p => new { p.WarehouseCode, p.WorkOrder, p.BillCode, }).Distinct();
 | 
	
		
			
				|  |  | -                var wareHouseList = _basewarehouserepository.GetList().Select(p => p.Id);
 | 
	
		
			
				|  |  | -                foreach (var warehouse in wareHouseList)
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    //var stackdetaillist = _billBomsetinfoRepository.AsQueryable().Where(p => p == warehouse);
 | 
	
		
			
				|  |  | -                    //getMatProport(spoolTrans.MatCode, warehouse);
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            //TODO:此处条码号应当使用材料号,测试时使用条码
 | 
	
		
			
				|  |  | -            var barInfo = _billInvinitrepository.GetSingle(p => p.HWBarCode == code);
 | 
	
		
			
				|  |  | -            if (barInfo == null)
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                var wareHosue = _basewarehouserepository.GetSingle(p => p.Code == spoolTrans.WarehouseCode);
 | 
	
		
			
				|  |  | -                barInfo = new BillInvinit
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    InvBarCode = code,
 | 
	
		
			
				|  |  | -                    WarehouseId = wareHosue.Id,
 | 
	
		
			
				|  |  | -                    HWBarCode = code,
 | 
	
		
			
				|  |  | -                    ExecStateCode = FJInvLockState.InvState_Normal.GetDescription(),
 | 
	
		
			
				|  |  | -                    ExecDocsTypeCode = FJDocType.FullWheelPalletizing.GetDescription(),
 | 
	
		
			
				|  |  | -                    InvInOut = FJInvInOutType.In,
 | 
	
		
			
				|  |  | -                    ExecWho = "WCS",
 | 
	
		
			
				|  |  | -                    EditTime = DateTime.Now,
 | 
	
		
			
				|  |  | -                    InvStateCode = FJInvState.InvEcecState_BuildUp.ToString(),
 | 
	
		
			
				|  |  | -                    SuppCode = "",
 | 
	
		
			
				|  |  | -                    Size = 1,
 | 
	
		
			
				|  |  | -                    MatCode = spoolTrans.MatCode,
 | 
	
		
			
				|  |  | -                    AddTime = DateTime.Now,
 | 
	
		
			
				|  |  | -                };
 | 
	
		
			
				|  |  | -                _billInvinitrepository.InsertReturnEntity(barInfo);
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            //开始生成WCS
 | 
	
		
			
				|  |  | -            var createStockInWcsTaskReqest = new FJCreateStockInWcsTaskRequest
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                BusType = FJTaskBusType.二楼组盘.GetDescription(),
 | 
	
		
			
				|  |  | -                ContGrpBarCode = code,
 | 
	
		
			
				|  |  | -                Qty = 1,
 | 
	
		
			
				|  |  | -                WarehouseCode = spoolTrans.WarehouseCode,
 | 
	
		
			
				|  |  | -                Floor = 2,
 | 
	
		
			
				|  |  | -                MatCode = spoolTrans.MatCode,
 | 
	
		
			
				|  |  | -                EquCode = "Robot",
 | 
	
		
			
				|  |  | -                Type = TaskType.SetPlate,
 | 
	
		
			
				|  |  | -                DocCode = spoolTrans.WorkOrder
 | 
	
		
			
				|  |  | -            };
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            //下发wcs任务 - 分解方法
 | 
	
		
			
				|  |  | -            var taskRes = CreateStockInWcsTask(createStockInWcsTaskReqest);
 | 
	
		
			
				|  |  | -            if (taskRes.ResCode != 200)
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                res.ResCode = taskRes.ResCode;
 | 
	
		
			
				|  |  | -                res.ResMsg = taskRes.ResMsg;
 | 
	
		
			
				|  |  | -                return res;
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -            RedisHelper.Set($"AllocationWarehouseSort:{code}", JsonConvert.SerializeObject(new MainlineDiversion
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                TaskId = taskRes.ResData.ID,
 | 
	
		
			
				|  |  | -                WarehouseCode = spoolTrans.WarehouseCode
 | 
	
		
			
				|  |  | -            }));
 | 
	
		
			
				|  |  | -            return res;
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        /// <summary>
 | 
	
		
			
				|  |  | -        ///  计算物料在该仓库的比例
 | 
	
		
			
				|  |  | -        /// </summary>
 | 
	
		
			
				|  |  | -        /// <param name="matcode">物料编号</param>
 | 
	
		
			
				|  |  | -        /// <param name="warehouseId"></param>
 | 
	
		
			
				|  |  | -        /// <returns></returns>
 | 
	
		
			
				|  |  | -        public decimal getMatProport(string matcode, long warehouseId)
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -            //计算此仓库所有该物料的量 已组盘/已入库
 | 
	
		
			
				|  |  | -            var stackLisk = _billInvnowrepository.AsQueryable()
 | 
	
		
			
				|  |  | -                                                 .Count(v => v.WarehouseId == warehouseId
 | 
	
		
			
				|  |  | -                                                          && v.MatCode == matcode
 | 
	
		
			
				|  |  | -                                                          && (v.ExecStateCode == FJInvState.InvEcecState_BuildUp.ToString() || v.ExecStateCode == FJInvState.InvEcecState_In.ToString()));
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            //每的单子(每盘的数量)
 | 
	
		
			
				|  |  | -            //var stackdetaillist = _billBomsetinfoRepository.AsQueryable().Where(p => p.WarehouseId == warehouseId);
 | 
	
		
			
				|  |  | -            return 0;
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |          #endregion 满轮主线
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          #region 环形库
 | 
	
	
		
			
				|  | @@ -4899,102 +5061,6 @@ namespace wms.service.Service
 | 
	
		
			
				|  |  |              return res;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        /// <summary>
 | 
	
		
			
				|  |  | -        ///  计算出库任务
 | 
	
		
			
				|  |  | -        /// </summary>
 | 
	
		
			
				|  |  | -        public void CalculateOutBoundTasks()
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -            //获取所有的环形库有货库位信息
 | 
	
		
			
				|  |  | -            var wareCellList = _basewarecellrepository.GetList(x => x.WarehouseCode.Contains("R") && x.StateNum == FjLocationState.Full).GroupBy(x => x.WarehouseId);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            foreach (var wareCells in wareCellList)
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                //获取当前仓库对应的订单所有的订单
 | 
	
		
			
				|  |  | -                var docs = _billdocrepository.GetList(x => x.IsStop == 0 && wareCells.Key == x.WarehouseId);
 | 
	
		
			
				|  |  | -                foreach (var doc in docs) //开始处理当前仓库每个订单相关信息
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    //找到对应的垛形信息
 | 
	
		
			
				|  |  | -                    var bomSetGrp = _BillBomsetgrpRepository.GetSingle(x => doc.SetGrpCode == x.Code);
 | 
	
		
			
				|  |  | -                    var bomSetGrpInfo = _billBomsetinfoRepository.GetList(x => x.BomSetHdrId == bomSetGrp.Id);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -                    //是否可以码垛,默认可以码垛
 | 
	
		
			
				|  |  | -                    var isPalletize = true;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -                    #region 计算当前垛形需要的货物是否已满足数量
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -                    var bomSetGrpMatCodes = bomSetGrpInfo.Select(x => x.MatCode).ToList();
 | 
	
		
			
				|  |  | -                    foreach (var matCode in bomSetGrpMatCodes)
 | 
	
		
			
				|  |  | -                    {
 | 
	
		
			
				|  |  | -                        var wareCellSum = wareCells.Count(x => matCode == x.ContGrpBarCode);
 | 
	
		
			
				|  |  | -                        if (wareCellSum == bomSetGrpInfo.Count(x => x.MatCode == matCode)) continue;
 | 
	
		
			
				|  |  | -                        isPalletize = false;
 | 
	
		
			
				|  |  | -                        //TODO:暂时未计算物料超时处理方案
 | 
	
		
			
				|  |  | -                        break;
 | 
	
		
			
				|  |  | -                    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -                    #endregion 计算当前垛形需要的货物是否已满足数量
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -                    //开始计算出库任务
 | 
	
		
			
				|  |  | -                    if (isPalletize)
 | 
	
		
			
				|  |  | -                    {
 | 
	
		
			
				|  |  | -                        //TODO:货物序号暂不做处理直接使用累计数值
 | 
	
		
			
				|  |  | -                        short index = 1;
 | 
	
		
			
				|  |  | -                        //开始为各种物料生成对应的出库任务
 | 
	
		
			
				|  |  | -                        try
 | 
	
		
			
				|  |  | -                        {
 | 
	
		
			
				|  |  | -                            _db.BeginTran();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -                            foreach (var matCode in bomSetGrpMatCodes)
 | 
	
		
			
				|  |  | -                            {
 | 
	
		
			
				|  |  | -                                #region 生成这种物料所需要的出库任务信息
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -                                var sum = bomSetGrpInfo.Count(x => x.MatCode == matCode);
 | 
	
		
			
				|  |  | -                                var cells = wareCells.Where(x => x.ContGrpBarCode == matCode)
 | 
	
		
			
				|  |  | -                                    .OrderBy(x => x.Col)
 | 
	
		
			
				|  |  | -                                    .ThenBy(x => x.Layer)
 | 
	
		
			
				|  |  | -                                    .ThenBy(x => x.Depth)
 | 
	
		
			
				|  |  | -                                    .Take(sum);
 | 
	
		
			
				|  |  | -                                foreach (var cell in cells)
 | 
	
		
			
				|  |  | -                                {
 | 
	
		
			
				|  |  | -                                    //更新货位信息
 | 
	
		
			
				|  |  | -                                    _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = FjLocationState.StockOut }, p => p.Id == cell.Id);
 | 
	
		
			
				|  |  | -                                    //更新库存信息
 | 
	
		
			
				|  |  | -                                    var sotck = _billInvnowrepository.GetSingle(x => x.ContGrpBarCode == cell.ContGrpBarCode);
 | 
	
		
			
				|  |  | -                                    _billInvnowrepository.UpdateModelColumns(p => new BillInvnow() { InvStateCode = InvState.InvEcecState_OutGoing.ToString(), EditTime = DateTime.Now }, p => p.HWBarCode == cell.ContGrpBarCode);
 | 
	
		
			
				|  |  | -                                    //更新流水信息
 | 
	
		
			
				|  |  | -                                    var invflow = _mapper.Map<BillInvflow>(sotck);
 | 
	
		
			
				|  |  | -                                    invflow.InvStateCode = InvState.InvEcecState_OutGoing.ToString();
 | 
	
		
			
				|  |  | -                                    invflow.AddTime = DateTime.Now;
 | 
	
		
			
				|  |  | -                                    invflow.Id = IdFactory.NewId();
 | 
	
		
			
				|  |  | -                                    _billInvflow.Insert(invflow);
 | 
	
		
			
				|  |  | -                                    //添加出库任务
 | 
	
		
			
				|  |  | -                                    RingCreateStockOutWcsTask(new FJCreateStockOutWcsTaskRequest()
 | 
	
		
			
				|  |  | -                                    {
 | 
	
		
			
				|  |  | -                                        ContGrpBarCode = cell.ContGrpBarCode,
 | 
	
		
			
				|  |  | -                                        CellNo = cell.Code,
 | 
	
		
			
				|  |  | -                                        EquCode = "",
 | 
	
		
			
				|  |  | -                                        Floor = 2,
 | 
	
		
			
				|  |  | -                                        ProdLine = index,
 | 
	
		
			
				|  |  | -                                        //Qty = sotck.LengthQty,
 | 
	
		
			
				|  |  | -                                        //Tunnel = temploc.Tunnel.ToString(),
 | 
	
		
			
				|  |  | -                                        WarehouseCode = cell.WarehouseCode,
 | 
	
		
			
				|  |  | -                                        BusType = FJTaskBusType.环形库出库码垛任务
 | 
	
		
			
				|  |  | -                                    });
 | 
	
		
			
				|  |  | -                                    index++;
 | 
	
		
			
				|  |  | -                                }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -                                #endregion 生成这种物料所需要的出库任务信息
 | 
	
		
			
				|  |  | -                            }
 | 
	
		
			
				|  |  | -                        }
 | 
	
		
			
				|  |  | -                        catch (Exception e)
 | 
	
		
			
				|  |  | -                        {
 | 
	
		
			
				|  |  | -                            _db.CommitTran();
 | 
	
		
			
				|  |  | -                        }
 | 
	
		
			
				|  |  | -                    }
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |          /// <summary>
 | 
	
		
			
				|  |  |          ///  环形库创建WCS出库任务
 | 
	
		
			
				|  |  |          /// </summary>
 | 
	
	
		
			
				|  | @@ -5695,6 +5761,162 @@ namespace wms.service.Service
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          #region 巷道及货位分配
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +        /// <summary>
 | 
	
		
			
				|  |  | +        ///  获取平库可用货位
 | 
	
		
			
				|  |  | +        /// </summary>
 | 
	
		
			
				|  |  | +        /// <param name="reqEntity"></param>
 | 
	
		
			
				|  |  | +        /// <returns></returns>
 | 
	
		
			
				|  |  | +        public SRes<FJApplyStockInLocResponse> FindAvailableFlatStorageSlot(FJApplyStockInLocRequest reqEntity)
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            var res = new SRes<FJApplyStockInLocResponse>()
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode(),
 | 
	
		
			
				|  |  | +                ResMsg = ResponseStatusCodeEnum.Sucess.GetDescription(),
 | 
	
		
			
				|  |  | +                ResData = new FJApplyStockInLocResponse()
 | 
	
		
			
				|  |  | +            };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            //检擦任务是否异常
 | 
	
		
			
				|  |  | +            var wcstask = _wcstaskoldrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.Id == reqEntity.TaskNum).SplitTable(tabs => tabs.Take(2)).First(); ;
 | 
	
		
			
				|  |  | +            if (wcstask == null)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
 | 
	
		
			
				|  |  | +                res.ResMsg = ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
 | 
	
		
			
				|  |  | +                return res;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            if (wcstask.Type == TaskType.OutDepot)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
 | 
	
		
			
				|  |  | +                res.ResMsg = "该任务是出库任务,不能分配货位;任务号" + wcstask.Id;
 | 
	
		
			
				|  |  | +                return res;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            if (!string.IsNullOrEmpty(wcstask.AddrTo) && wcstask.AddrTo != "SRM")//如果目标地址不是堆垛机
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                res.ResData.TunnelNum = wcstask.Tunnel;
 | 
	
		
			
				|  |  | +                res.ResData.CellNo = wcstask.AddrTo;
 | 
	
		
			
				|  |  | +                return res;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            //验证仓库信息
 | 
	
		
			
				|  |  | +            var warehouse = _basewarehouserepository.GetFirst(p => p.Code == wcstask.WarehouseCode);
 | 
	
		
			
				|  |  | +            if (warehouse == null)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                res.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode();
 | 
	
		
			
				|  |  | +                res.ResMsg = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription();
 | 
	
		
			
				|  |  | +                return res;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            //验证库存
 | 
	
		
			
				|  |  | +            var stock = _billInvnowrepository.GetFirst(p => p.ContGrpBarCode == wcstask.BarCode.Trim() && p.InvStateCode == InvState.InvEcecState_BuildUp.ToString());
 | 
	
		
			
				|  |  | +            if (stock == null)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                if (wcstask.BusType == FJTaskBusType.帘线退料重绕.GetDescription())
 | 
	
		
			
				|  |  | +                {
 | 
	
		
			
				|  |  | +                    var nov = new BillInvnow()
 | 
	
		
			
				|  |  | +                    {
 | 
	
		
			
				|  |  | +                        WarehouseId = warehouse.Id,
 | 
	
		
			
				|  |  | +                        ContGrpBarCode = wcstask.BarCode,
 | 
	
		
			
				|  |  | +                        ContGrpId = IdFactory.NewId(),
 | 
	
		
			
				|  |  | +                        BoxBarCode = "",
 | 
	
		
			
				|  |  | +                        InvStateCode = InvState.InvEcecState_BuildUp.ToString(),
 | 
	
		
			
				|  |  | +                        ExecStateCode = InvLockState.InvState_Normal.ToString(),
 | 
	
		
			
				|  |  | +                        MatId = default,
 | 
	
		
			
				|  |  | +                        MatCode = "",
 | 
	
		
			
				|  |  | +                        MatName = "",
 | 
	
		
			
				|  |  | +                        RFIDBarCode = wcstask.BarCode,
 | 
	
		
			
				|  |  | +                        HWBarCode = wcstask.BarCode,
 | 
	
		
			
				|  |  | +                        HWTypeCode = "",
 | 
	
		
			
				|  |  | +                        InvInOut = FJInvInOutType.In,
 | 
	
		
			
				|  |  | +                        Size = 1,
 | 
	
		
			
				|  |  | +                        ContGrpType = FJContGrpType.EmptyPal,
 | 
	
		
			
				|  |  | +                        LengthQty = 0 //存放托盘数量
 | 
	
		
			
				|  |  | +                    };
 | 
	
		
			
				|  |  | +                    _db.BeginTran();
 | 
	
		
			
				|  |  | +                    _billInvnowrepository.Insert(nov);
 | 
	
		
			
				|  |  | +                    _billInvflow.Insert(_mapper.Map<BillInvflow>(nov));
 | 
	
		
			
				|  |  | +                    _db.CommitTran();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                else
 | 
	
		
			
				|  |  | +                {
 | 
	
		
			
				|  |  | +                    res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
 | 
	
		
			
				|  |  | +                    res.ResMsg = "没有库存信息";
 | 
	
		
			
				|  |  | +                    return res;
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            //预留货位数量
 | 
	
		
			
				|  |  | +            var emptyLoc = _basewarecellrepository.GetList(p => p.IsStop == 0
 | 
	
		
			
				|  |  | +                                                                && p.StateNum == FjLocationState.Empty
 | 
	
		
			
				|  |  | +                                                                && p.TypeNum == FjLocationType.Storage
 | 
	
		
			
				|  |  | +                                                                && p.WarehouseId == warehouse.Id);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            //找到可用货位
 | 
	
		
			
				|  |  | +            var loc1ist = _basewarecellrepository.Context
 | 
	
		
			
				|  |  | +                         .Queryable<BaseWarecell>()
 | 
	
		
			
				|  |  | +                         .Where((loc1) => loc1.IsStop == 0
 | 
	
		
			
				|  |  | +                                            && loc1.StateNum == FjLocationState.Empty
 | 
	
		
			
				|  |  | +                                            && loc1.TypeNum == FjLocationType.Storage
 | 
	
		
			
				|  |  | +                                            && loc1.Tunnel == reqEntity.TunnelNum
 | 
	
		
			
				|  |  | +                                            && loc1.WarehouseId == warehouse.Id
 | 
	
		
			
				|  |  | +                                            && loc1.Depth == 1)
 | 
	
		
			
				|  |  | +                         .Where((loc1) => loc1.Tunnel == reqEntity.TunnelNum)
 | 
	
		
			
				|  |  | +                         .Select((loc1) => new
 | 
	
		
			
				|  |  | +                         {
 | 
	
		
			
				|  |  | +                             loc1.Code,
 | 
	
		
			
				|  |  | +                             loc1.Id,
 | 
	
		
			
				|  |  | +                             loc1.Row,
 | 
	
		
			
				|  |  | +                             loc1.Col,
 | 
	
		
			
				|  |  | +                             loc1.Layer,
 | 
	
		
			
				|  |  | +                             loc1.Tunnel,
 | 
	
		
			
				|  |  | +                         }).ToList();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            if (loc1ist.Any())
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                var resloc = loc1ist.ToList().OrderBy(x=>x.Code).First();
 | 
	
		
			
				|  |  | +                res.ResData.TunnelNum = resloc.Tunnel.ToString();
 | 
	
		
			
				|  |  | +                res.ResData.WarehuoseId = warehouse.Id;
 | 
	
		
			
				|  |  | +                res.ResData.CellNo = resloc.Code;
 | 
	
		
			
				|  |  | +                res.ResData.Row = resloc.Row;
 | 
	
		
			
				|  |  | +                res.ResData.Colomn = resloc.Col;
 | 
	
		
			
				|  |  | +                res.ResData.Layer = resloc.Layer;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                try
 | 
	
		
			
				|  |  | +                {
 | 
	
		
			
				|  |  | +                    _db.BeginTran();
 | 
	
		
			
				|  |  | +                    var task = _wcstaskoldrepository.AsQueryable().With("WITH(READPAST,ROWLOCK)").Where(x => x.Id == wcstask.Id).SplitTable(x => x.Take(2)).First();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                    //更新货位
 | 
	
		
			
				|  |  | +                    _basewarecellrepository.UpdateModelColumns(
 | 
	
		
			
				|  |  | +                        p => new BaseWarecell()
 | 
	
		
			
				|  |  | +                        {
 | 
	
		
			
				|  |  | +                            StateNum = FjLocationState.StockIn,
 | 
	
		
			
				|  |  | +                            ContGrpBarCode = "",
 | 
	
		
			
				|  |  | +                            ContGrpId = 0,
 | 
	
		
			
				|  |  | +                            EditTime = DateTime.Now
 | 
	
		
			
				|  |  | +                        },
 | 
	
		
			
				|  |  | +                        p => p.Code == res.ResData.CellNo && res.ResData.WarehuoseId == p.WarehouseId);
 | 
	
		
			
				|  |  | +                    _wcstaskoldrepository.UpdateSplitTableModelColumns(x => new WCS_TaskOld()
 | 
	
		
			
				|  |  | +                    {
 | 
	
		
			
				|  |  | +                        AddrTo = res.ResData.CellNo
 | 
	
		
			
				|  |  | +                    }, x => x.Id == task.Id);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                    _db.CommitTran();
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                catch (Exception ex)
 | 
	
		
			
				|  |  | +                {
 | 
	
		
			
				|  |  | +                    _db.RollbackTran();
 | 
	
		
			
				|  |  | +                    _logger.LogInformation(ex.ToString());
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                return res;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            res.ResCode = ResponseStatusCodeEnum.NotEnoughLocation.GetHashCode();
 | 
	
		
			
				|  |  | +            res.ResMsg = ResponseStatusCodeEnum.NotEnoughLocation.GetDescription();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            return res;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |          /// <summary>
 | 
	
		
			
				|  |  |          /// 分配货位
 | 
	
		
			
				|  |  |          /// </summary>
 | 
	
	
		
			
				|  | @@ -6601,7 +6823,9 @@ namespace wms.service.Service
 | 
	
		
			
				|  |  |                          //更新库存
 | 
	
		
			
				|  |  |                          _billInvnowrepository.UpdateModelColumns(p => new BillInvnow() { PutRow = 0, PutCol = 0, PutLayer = 0 }, p => p.InvStateCode == InvState.InvEcecState_OutGoing.ToString() && p.ContGrpBarCode == wcstask.BarCode);
 | 
	
		
			
				|  |  |                          break;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | +                    case FjLocationType.Pingku:
 | 
	
		
			
				|  |  | +                        _billInvnowrepository.UpdateModelColumns(p => new BillInvnow() { PutRow = 0, PutCol = 0, PutLayer = 0 }, p => p.InvStateCode == InvState.InvEcecState_OutGoing.ToString() && p.ContGrpBarCode == wcstask.BarCode);
 | 
	
		
			
				|  |  | +                        break;
 | 
	
		
			
				|  |  |                      case FjLocationType.RingLibrary:
 | 
	
		
			
				|  |  |                          //更新库存
 | 
	
		
			
				|  |  |                          _billInvnowrepository.UpdateModelColumns(p => new BillInvnow() { PutRow = 0, PutCol = 0, PutLayer = 0, InvStateCode = FJInvState.InvEcecState_BuildUp.ToString() },
 | 
	
	
		
			
				|  | @@ -6902,7 +7126,54 @@ namespace wms.service.Service
 | 
	
		
			
				|  |  |                                  break;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                              case FjLocationType.Pingku:
 | 
	
		
			
				|  |  | -                                result.ResMsg = task.Id + "没有平库";
 | 
	
		
			
				|  |  | +                                _billInvnowrepository.Delete(p => stocklist.Select(p => p.Id).ToList().Contains(p.Id));
 | 
	
		
			
				|  |  | +                                 hWBarCode = stocklist.Select(p => p.HWBarCode).ToList();
 | 
	
		
			
				|  |  | +                                _billInvinitrepository.Delete(p => hWBarCode.Contains(p.HWBarCode) && p.InvStateCode == InvState.InvEcecState_OutGoing.ToString());
 | 
	
		
			
				|  |  | +                                 contGrpBarCode = stocklist.Select(p => p.ContGrpBarCode).ToList();
 | 
	
		
			
				|  |  | +                                _billInvinitrepository.Delete(p => contGrpBarCode.Contains(p.ContGrpBarCode) && p.InvStateCode == InvState.InvEcecState_OutGoing.ToString());
 | 
	
		
			
				|  |  | +                                _billSpoolTransrepository.Delete(p => stocklist.Select(p => p.HWBarCode).ToList().Contains(p.ConBarCode));
 | 
	
		
			
				|  |  | +                                _logger.LogInformation($"删除缓存信息{JsonConvert.SerializeObject(stocklist.Select(x => x.HWBarCode).ToList())}");
 | 
	
		
			
				|  |  | +                                //更新货位信息
 | 
	
		
			
				|  |  | +                                _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell()
 | 
	
		
			
				|  |  | +                                {
 | 
	
		
			
				|  |  | +                                    StateNum = FjLocationState.Empty,
 | 
	
		
			
				|  |  | +                                    ContGrpBarCode = "",
 | 
	
		
			
				|  |  | +                                    ContGrpId = 0,
 | 
	
		
			
				|  |  | +                                    EditTime = DateTime.Now
 | 
	
		
			
				|  |  | +                                }, p => p.StateNum == FjLocationState.StockOut && p.ContGrpBarCode == task.BarCode && p.Code.Contains(task.AddrFrom) && p.WarehouseCode == task.WarehouseCode);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                                //更新流水信息
 | 
	
		
			
				|  |  | +                                _billInvflow.InsertRange(flowlist);
 | 
	
		
			
				|  |  | +                                //添加反馈信息
 | 
	
		
			
				|  |  | +                                 pushtype = fjFackbeekType.InterfaceType_FJ_StockOut.ToString();
 | 
	
		
			
				|  |  | +                                 list = new List<BillPushinfo>();
 | 
	
		
			
				|  |  | +                                foreach (var item in stocklist)
 | 
	
		
			
				|  |  | +                                {
 | 
	
		
			
				|  |  | +                                    list.Add(new BillPushinfo
 | 
	
		
			
				|  |  | +                                    {
 | 
	
		
			
				|  |  | +                                        DocsNo = item.ExecDocsNo,
 | 
	
		
			
				|  |  | +                                        TypeCode = pushtype,
 | 
	
		
			
				|  |  | +                                        RFIDBarCode = item.ContGrpBarCode,
 | 
	
		
			
				|  |  | +                                        HWBarCode = item.HWBarCode,
 | 
	
		
			
				|  |  | +                                        CLBarCode = item.CLBarCode,
 | 
	
		
			
				|  |  | +                                        WarehouseId = wareHouse.Id,
 | 
	
		
			
				|  |  | +                                        WarehouseCode = wareHouse.Code,
 | 
	
		
			
				|  |  | +                                        WareCellId = 0,
 | 
	
		
			
				|  |  | +                                        WareCellCode = task.AddrTo,
 | 
	
		
			
				|  |  | +                                        MatId = item.MatId,
 | 
	
		
			
				|  |  | +                                        MatCode = item.MatCode,
 | 
	
		
			
				|  |  | +                                        MatName = item.MatName,
 | 
	
		
			
				|  |  | +                                        TolWQty = item.TolWQty,
 | 
	
		
			
				|  |  | +                                        NetWQty = item.NetWQty,
 | 
	
		
			
				|  |  | +                                        TareWQty = item.TareWQty,
 | 
	
		
			
				|  |  | +                                        ReqNo = Guid.NewGuid().ToString()
 | 
	
		
			
				|  |  | +                                    });
 | 
	
		
			
				|  |  | +                                }
 | 
	
		
			
				|  |  | +                                if (stocklist.First().ContGrpType == FJContGrpType.Material)
 | 
	
		
			
				|  |  | +                                {
 | 
	
		
			
				|  |  | +                                    _billPushinforepository.InsertRange(list);
 | 
	
		
			
				|  |  | +                                }
 | 
	
		
			
				|  |  | +                                _db.CommitTran();
 | 
	
		
			
				|  |  |                                  break;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                              case FjLocationType.Virtual:
 |