AC_BOX_Bean_ScanCode.cs 12.2 KB
using Asa;
using OnlineStore.Common;
using OnlineStore.LoadCSVLibrary;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace OnlineStore.DeviceLibrary
{
    public partial class AC_BOX_Bean
    {
        #region 扫码获取库位 

        /// <summary>
        /// 数据接收
        /// </summary>
        /// <param name="message"></param>
        private bool GetPosIdByCode()
        {
            try
            {
                if (LastWidth <= 0)
                {
                    LastWidth = 7;
                }
                //string message = StoreManager.ProcessCode(LastWidth, LastHeight, LastScanCodes);
                string message = MoveInfo.shelfLockDatas[MoveInfo.currShelfIndex].barcode;
                if (message.Equals("") || string.IsNullOrEmpty(message))
                {
                    CodeMsg = "未扫到二维码";
                    LogInfo("未扫到二维码");
                    return false;
                }

                if (storeRunStatus.Equals(StoreRunStatus.Wait))
                {
                    LogInfo("二维码【 " + message + "】,设备未启动,不需要发送服务器");
                    return false;
                }
                // CodeMsg = "收到二维码【 " + message + "】,发送给服务器获取入库PosID";
                LogUtil.info(Name + "二维码【 " + message + "】,发送给服务器获取入库PosID");
                //发送扫码内容到服务器进行入库操作
                Operation operation = getLineBoxStatus();
                operation.op = 1;
                operation.data = new Dictionary<string, string>() { { "code", message }, { "boxId", 1.ToString() }, { ParamDefine.rfid, CurrShelfID } };
                string server = Setting_Init.http_server;
                Operation resultOperation = HttpHelper.PostJson(StoreManager.GetPostApi(server), operation, false);
                if (resultOperation == null)
                {
                    CodeMsg = "二维码【" + message + "】没有收到服务器反馈";
                    LogInfo("二维码【 " + message + "】没有收到服务器反馈!");
                    return false;
                }
                else if (!string.IsNullOrEmpty(resultOperation.msg))
                {
                    //如果有提示消息,直接显示提示
                    LogInfo("二维码【 " + message + "】  :" + resultOperation.msg);
                    return false;
                }


                if (resultOperation.op.Equals(1))
                {
                    Dictionary<string, string> data = resultOperation.data;
                    if (data != null && data.ContainsKey(ParamDefine.posId) && data.ContainsKey(ParamDefine.plateH) && data.ContainsKey(ParamDefine.plateW))
                    {
                        //服务器返回时有:posId库位编号,plateW:料盘宽度,plateH:料盘高度,
                        //postId格式BoxId#位置
                        string posId = data[ParamDefine.posId];
                        int plateW = FormUtil.GetIntData(data, ParamDefine.plateW);
                        int plateH = FormUtil.GetIntData(data, ParamDefine.plateH); 
                        int storeId = InOutParam.GetPosStoreId(posId);
                        //根据发送的posId获取位置列表
                        ACBoxPosition position = CSVPositionReader<ACBoxPosition>.GetPositon(posId);
                        if (position == null)
                        {   //出入库没有找到服务器发送的库位,需要打印日志方便查询原因
                            WarnMsg = "入库未找到库位:二维码【" + message + "】库位【" + posId + "】 ";
                            LogUtil.error(Name + "收到服务器入库命令:入库未找到库位:二维码【" + message + "】库位【" + posId + "】");
                            return false;
                        }
                        int p2 = Config.GetComP2(plateH).TargetComP2(); ;
                        int p3 = p2 + Config.GetCom_P3_P2(plateW);
                        LogInfo(" 收到服务器入库命令:库位号【" + posId + "】二维码【" + message + "】设置入库参数,压紧位置["+p2+"]["+p3+"] , 开始入库!"); 
                        MoveInfo.MoveParam.UpdatePosId(message, posId, plateW, plateH, p2, p3);
                        return true;
                    }
                }
                else if (resultOperation.op.Equals(2))
                {
                    ReviceOutStoreProcess(resultOperation);
                }
                else if (resultOperation.op.Equals(5))
                {
                    humBean.ProcessHumidityCMD(resultOperation);
                }
                else
                {
                    LogUtil.error("收到服务器命令:op=" + resultOperation.op + ",未找到对应处理");
                }
            }
            catch (Exception ex)
            {
                LogUtil.error(Name + "GetPosIdByCode" + ex.StackTrace);
            }
            return false;
        }

        /// <summary>
        /// 扫码枪数据接收
        /// </summary>
        /// <param name="codeResultType">扫码结果</param>
        /// <returns></returns>

        public enum CodeResultType
        {
            /// <summary>
            /// 未扫到二维码
            /// </summary>
            NoCode,
            /// <summary>
            /// 设备未启动
            /// </summary>
            DeviceNotOpen,
            /// <summary>
            ///未收到服务器反馈
            /// </summary>
            NotResponseFromServer,
            WarnMsg,
            /// <summary>
            /// 未找到库位
            /// </summary>
            NotFoundPos,
            /// <summary>
            /// 不属于该仓位
            /// </summary>
            NotPosForPutIn,
            Error,
            Success
        }

        private bool GetPosIdByCode(int rfidLoc, out CodeResultType codeResultType)
        {
            try
            {
                if (LastWidth <= 0)
                {
                    LastWidth = 7;
                }
                string message = StoreManager.ProcessCode(LastWidth, LastHeight, LastScanCodes);
                if (message.Equals("") || string.IsNullOrEmpty(message))
                {
                    CodeMsg = "未扫到二维码";
                    LogInfo("未扫到二维码");
                    codeResultType = CodeResultType.NoCode;
                    return false;
                }

                if (storeRunStatus.Equals(StoreRunStatus.Wait))
                {
                    LogInfo("二维码【 " + message + "】,设备未启动,不需要发送服务器");
                    codeResultType = CodeResultType.DeviceNotOpen;
                    return false;
                }
                // CodeMsg = "收到二维码【 " + message + "】,发送给服务器获取入库PosID";
                LogUtil.debug (Name + "二维码【 " + message + "】,发送给服务器获取入库PosID");

                //查询该料盘所在料仓以及仓位
                StoreManager.ResultType resultType = StoreManager.GetPosForPutIn(Name, Config, message, CurrShelfID, rfidLoc, out bool isLockInfoMatch);

                if (resultType == StoreManager.ResultType.Error)
                {
                    codeResultType = CodeResultType.Error;
                    return false;
                }
                else if(resultType == StoreManager.ResultType.NotInThisBox)
                {
                    codeResultType = CodeResultType.NotPosForPutIn;
                    return false;
                }
                if (!isLockInfoMatch && MoveInfo.IsShelfLocked)//锁定信息不匹配则从第一层开始重新取料,一个料架只重新开始一次
                {
                    MoveInfo.IsShelfLocked = false;
                    MoveInfo.currShelfIndex = -1;
                    LogUtil.info(Name + "该锁定料架" + CurrShelfID + "上的料盘信息不匹配,即将从开始位置循环取料");
                }
                //发送扫码内容到服务器进行入库操作
                Operation operation = getLineBoxStatus();
                operation.op = 1;
                operation.data = new Dictionary<string, string>() { { "code", message }, { "boxId", 1.ToString() }, { ParamDefine.rfid, CurrShelfID } };
                string server = Setting_Init.http_server;
                Operation resultOperation = HttpHelper.PostJson(StoreManager.GetPostApi(server), operation, false);
                if (resultOperation == null)
                {
                    CodeMsg = "二维码【" + message + "】没有收到服务器反馈";
                    LogInfo("二维码【 " + message + "】没有收到服务器反馈!");
                    codeResultType = CodeResultType.NotResponseFromServer;
                    return false;
                }
                else if (!string.IsNullOrEmpty(resultOperation.msg))
                {
                    //如果有提示消息,直接显示提示
                    LogInfo("二维码【 " + message + "】  :" + resultOperation.msg);
                    codeResultType = CodeResultType.WarnMsg;
                    return false;
                }


                if (resultOperation.op.Equals(1))
                {
                    Dictionary<string, string> data = resultOperation.data;
                    if (data != null && data.ContainsKey(ParamDefine.posId) && data.ContainsKey(ParamDefine.plateH) && data.ContainsKey(ParamDefine.plateW))
                    {
                        //服务器返回时有:posId库位编号,plateW:料盘宽度,plateH:料盘高度,
                        //postId格式BoxId#位置
                        string posId = data[ParamDefine.posId];
                        int plateW = FormUtil.GetIntData(data, ParamDefine.plateW);
                        int plateH = FormUtil.GetIntData(data, ParamDefine.plateH);
                        int storeId = InOutParam.GetPosStoreId(posId);
                        //根据发送的posId获取位置列表
                        ACBoxPosition position = CSVPositionReader<ACBoxPosition>.GetPositon(posId);
                        if (position == null)
                        {   //出入库没有找到服务器发送的库位,需要打印日志方便查询原因
                            WarnMsg = "入库未找到库位:二维码【" + message + "】库位【" + posId + "】 ";
                            LogUtil.error(Name + "收到服务器入库命令:入库未找到库位:二维码【" + message + "】库位【" + posId + "】");
                            codeResultType = CodeResultType.NotFoundPos;
                            return false;
                        }
                        int p2 = Config.GetComP2(plateH).TargetComP2(); ;
                        int p3 = p2 + Config.GetCom_P3_P2(plateW);
                        LogInfo(" 收到服务器入库命令:库位号【" + posId + "】二维码【" + message + "】设置入库参数,压紧位置[" + p2 + "][" + p3 + "] , 开始入库!"); 
                        MoveInfo.MoveParam.UpdatePosId(message, posId, plateW, plateH, p2, p3);
                        codeResultType = CodeResultType.Success;
                        return true;
                    }
                }
                else if (resultOperation.op.Equals(2))
                {
                    ReviceOutStoreProcess(resultOperation);
                }
                else if (resultOperation.op.Equals(5))
                {
                    humBean.ProcessHumidityCMD(resultOperation);
                }
                else
                {
                    LogUtil.error("收到服务器命令:op=" + resultOperation.op + ",未找到对应处理");
                }
            }
            catch (Exception ex)
            {
                LogUtil.error(Name + "GetPosIdByCode" + ex.StackTrace);
            }
            codeResultType = CodeResultType.Error;
            return false;
        }

        #endregion

    }
}