예제 #1
0
        public static CalResult AreaBCalculate(LableCode lc, string dateShiftNo, IEnumerable <LableCode> cacheq, Action <string> onlog)
        {
            var cre = new CacheResult {
                CResult = new CalResult(CacheState.Cache, lc, null)
            };

            // 创建新板号
            var pinfo = GetPanelNo(cre.CResult.CodeCome, dateShiftNo);

            var fp = FloorPerformance.None;
            List <LableCode> layerLabels;

            // 解决在缓存位,同一交地出现多个不同板号的情况.
            if (pinfo == null)
            {
                pinfo = new PanelInfo(cre.CResult.CodeCome.PanelNo);
                cre.CResult.CodeCome.PanelNo = pinfo.PanelNo;
                cre.CResult.CodeCome.Floor   = pinfo.CurrFloor;
            }
            #region 缓存布卷板号和层号的修正
            var cachedRolls = FrmMain.taskQ.CacheSide.Where(x => x.labelcode != null && x.labelcode.ToLocation == lc.ToLocation)
                              .Select(x => x.labelcode)
                              .ToList();
            foreach (LableCode tmp in cachedRolls)
            {
                tmp.PanelNo = pinfo.PanelNo;
                tmp.Floor   = pinfo.CurrFloor;
            }
            #endregion

            // 取当前交地、当前板、当前层所有标签。
            layerLabels = LableCode.GetLableCodesOfRecentFloor(cre.CResult.CodeCome.ToLocation, pinfo.PanelNo, pinfo.CurrFloor);
            cre         = CalculateCacheState(cre.CResult, pinfo, layerLabels, onlog);

            if (cre.SideState.state == SideFullState.FULL || cre.SideState.state == SideFullState.EXCEED)
            {
                fp = SetFullFlag(CalculateFloorIndex(layerLabels), pinfo);
            }

            var msg = $"";
            switch (cre.CResult.state)
            {
            case CacheState.Go:
                CalculatePosition(layerLabels, cre.CResult.CodeCome, cre.SideState == null ? SideFullState.NO_FULL : cre.SideState.state);
                break;

            case CacheState.GetThenCache:
            case CacheState.CacheAndGet:
                CalculatePosition(layerLabels, cre.CResult.CodeFromCache, cre.SideState == null ? SideFullState.NO_FULL : cre.SideState.state);
                break;

            case CacheState.GoThenGet:
                //计算位置坐标, 赋予层号
                cre.CResult.CodeCome.Floor = cre.CResult.CodeFromCache.Floor;
                CalculatePosition(layerLabels, cre.CResult.CodeCome, cre.CResult.CodeFromCache, cre.SideState == null ? SideFullState.NO_FULL : cre.SideState.state);
                break;

            case CacheState.GetThenGo:
                cre.CResult.CodeCome.Floor = cre.CResult.CodeFromCache.Floor;
                CalculatePosition(layerLabels, cre.CResult.CodeFromCache, cre.CResult.CodeCome, cre.SideState == null ? SideFullState.NO_FULL : cre.SideState.state);
                break;

            case CacheState.Cache:
                var cancachesum = (pinfo.OddStatus ? 0 : 1) + (pinfo.EvenStatus ? 0 : 1);
                var cachelcs    = FrmMain.taskQ.CacheSide.Count(x => x.labelcode != null && x.labelcode.ToLocation == lc.ToLocation);

                var go = CanIgo(cacheq, cre.CResult, cancachesum - cachelcs);
                if (go)
                {
                    cre.CResult.state = CacheState.Go;
                    bool isfull = IsPanelFull(cre.CResult.CodeCome);
                    CalculatePosition(layerLabels, cre.CResult.CodeCome, isfull ? SideFullState.FULL : SideFullState.NO_FULL);

                    if (isfull)
                    {
                        fp = SetFullFlag(cre.CResult.CodeCome.FloorIndex, pinfo);
                    }

                    msg = $"cache change go";
                }
                break;

            default:
                break;
            }

            // 记录层最后一卷
            if (fp == FloorPerformance.BothFinish)
            {
                if (cre.CResult.state == CacheState.Go)
                {
                    // 在没有缓存的情况下满板。
                    cre.CResult.CodeCome.Status = (int)LableState.FloorLastRoll;
                    cre.CResult.CodeCome.Remark = $"{cre.CResult.CodeCome.Remark} floor last roll";
                }
                else if (cre.CResult.state == CacheState.GetThenGo)
                {
                    cre.CResult.CodeCome.Status = (int)LableState.FloorLastRoll;
                    cre.CResult.CodeCome.Remark = $"{cre.CResult.CodeCome.Remark} floor last roll";
                }
                else if (cre.SideState.state == SideFullState.EXCEED)
                {
                    if (cre.CResult.CodeFromCache != null)
                    {
                        cre.CResult.CodeFromCache.Status = (int)LableState.FloorLastRoll;
                        cre.CResult.CodeFromCache.Remark = $"{cre.CResult.CodeFromCache.Remark} floor last roll";
                    }
                    else
                    {
                        cre.CResult.CodeCome.Status = (int)LableState.FloorLastRoll;
                        cre.CResult.CodeCome.Remark = $"{cre.CResult.CodeCome.Remark} floor last roll*{cre.CResult.state}";
                    }
                }
                else
                {
                    cre.CResult.CodeFromCache.Status = (int)LableState.FloorLastRoll;
                    cre.CResult.CodeFromCache.Remark = $"{cre.CResult.CodeFromCache.Remark} floor last roll";
                }
            }

            if (!PanelGen.HasPanelNo(pinfo.PanelNo))
            {
                LableCode.Update(cre.CResult.CodeCome);
            }

            if (cre.SideState.state == SideFullState.EXCEED)
            {
                msg             = $"{msg} EXCEED";
                pinfo.HasExceed = true;
            }

            if (cre.CResult.CodeFromCache != null)
            {
                if (fp == FloorPerformance.BothFinish && cre.SideState.state == SideFullState.EXCEED)  //层满上超出处理
                {
                    LableCode.UpdateEdgeExceed(fp, pinfo, cre.CResult.CodeCome, cre.CResult.CodeFromCache);
                }
                else
                {
                    LableCode.Update(fp, pinfo, cre.CResult.CodeCome, cre.CResult.CodeFromCache);
                }
            }
            else
            {
                LableCode.Update(fp, pinfo, cre.CResult.CodeCome);
            }

            cre.CResult.message = msg;
            return(cre.CResult);
        }