MainMachine_SelfAudit.cs 14.4 KB
using OnlineStore.Common;
using OnlineStore.LoadCSVLibrary;
using OnlineStore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using CodeLibrary;
using System.Security.Cryptography;
using System.Drawing;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Web;
using System.Xml.Linq;

namespace DeviceLibrary
{
    /// <summary>
    /// 盘点功能
    /// </summary>
    partial class MainMachine 
    {



        public  string selfAuditNo = "";
        public SelfAuditPosInfo currSAPos = null;

        public bool StartSelfAudit(string selfAuditNo,out string errmsg)
        {
            errmsg = "";
            if (!boxTransport.IsComplateOrFree)
            {
                errmsg = crc.GetString("Res0002", "料仓忙碌中,无法启动");
                return false;
            }
            SelfAuditMoveInfo.NextMoveStep(MoveStep.SA01_Start); 
            return true;
        }
        Task<SelfAuditPosInfo> GetSAPosTask = null;
        Task<string > UpdateResTask = null;

        private void SA02_GetPos()
        {
            SelfAuditMoveInfo.NextMoveStep(MoveStep.SA02_GetPos);
            SelfAuditMoveInfo.WaitList.Add(WaitResultInfo.WaitTime(1000));
            SelfAuditMoveInfo.log("开始获取盘点库位号"); 
            try
            {
                GetSAPosTask = Task.Run(new Func<SelfAuditPosInfo>(() =>
                {
                   currSAPos = ServerCM.getNetPos(Name, out string msg); 
                    return currSAPos;
                }));
            }
            catch (Exception ex)
            {
                LogUtil.error("SA02_GetPos 获取判断库位号出错:", ex);
            }
        }
        private void SA07_UpdateRes()
        {
            SelfAuditMoveInfo.NextMoveStep(MoveStep.SA07_UpdateRes);
            SelfAuditMoveInfo.WaitList.Add(WaitResultInfo.WaitTime(100));
            SelfAuditMoveInfo.log($"盘点{currSAPos.batchNo},库位号{currSAPos.posName},库存条码{currSAPos.barcode},实际条码{currSAPos.actBarcode},上传结果给服务器");
            try
            {
                UpdateResTask = Task.Run(new Func<string >(() =>
                {
                    string  msg= ServerCM.posValidationEnd(Name, currSAPos.posName,currSAPos.barcode,currSAPos.actBarcode );
                    return msg;
                }));
            }
            catch (Exception ex)
            {
                LogUtil.error("SA07_UpdateRes  上传结果出错:", ex);
            }

        }
        private bool InSelfAudit()
        {
            return SelfAuditMoveInfo.MoveStep != MoveStep.Wait;
        }
        void SelfAuditProcess()
        {
            if (CheckWait(SelfAuditMoveInfo))
                return; 
            switch (SelfAuditMoveInfo.MoveStep)
            {
                case MoveStep.Wait: 
                    if (selfAuditNo != "")
                    {
                       if( StartSelfAudit(selfAuditNo, out string errMsg))
                        {
                            SelfAuditMoveInfo.log("启动判断成功,批次号:" + selfAuditNo);
                        }
                        else
                        { 
                            SelfAuditMoveInfo.log("启动盘点失败,批次号:" + selfAuditNo+", "+errMsg);
                        } 
                    } 
                    break;
                case MoveStep.SA01_Start:
                    SA02_GetPos();
                    break;
                case MoveStep.SA02_GetPos:
                    if(GetSAPosTask== null|| GetSAPosTask.IsCompleted)
                    {
                        if(currSAPos==null||currSAPos.posName=="")
                        { 
                            SelfAuditMoveInfo.log($"未获取到盘点库位号,结束处理");
                            SelfAuditMoveInfo.EndMove();
                        }
                        else
                        {

                            ACStorePosition position = CSVPositionReader<ACStorePosition>.GetPositon(currSAPos.posName);
                            if (position == null)
                            { 
                                SelfAuditMoveInfo.log($"盘点库位号{currSAPos.posName},未找到库位信息,结束处理");
                                SelfAuditMoveInfo.EndMove();
                            }
                            else
                            { 
                                SelfAuditMoveInfo.NextMoveStep(MoveStep.SA03_WaitToPos);
                                SelfAuditMoveInfo.log("准备取目的库位");
                            }
                        }

                    }else if (SelfAuditMoveInfo.IsTimeOut())
                    { 
                        Msg.add(crc.GetString(L.wait_getselfauditPos, "等待获取盘点库位号超时"), MsgLevel.warning);
                        SelfAuditMoveInfo.log($"等待获取盘点库位号超时");
                    } 
                    break;
                     
                case MoveStep.SA03_WaitToPos:

                    ACStorePosition pos = CSVPositionReader<ACStorePosition>.GetPositon(currSAPos.posName);
                    bool result=   boxTransport.Start(null, new BoxStorePosition(Config, pos, new ReelParam(currSAPos.barcode)), StoreMoveType.SelfAudit);
                    if (result)
                    { 
                        SelfAuditMoveInfo.NextMoveStep(MoveStep.SA04_Pos);
                        SelfAuditMoveInfo.log("开始取目标库位点");
                    }
                    else if(SelfAuditMoveInfo.IsTimeOut())
                    {
                        Msg.add(crc.GetString(L.wat_startTosaPos, "等待去盘点库位超时"), MsgLevel.warning);
                        SelfAuditMoveInfo.log($"等待去盘点库位点超时");
                    }
                    break;

                case MoveStep.SA04_Pos:
                    if (boxTransport.IsComplateOrFree)
                    { 
                        SelfAuditMoveInfo.NextMoveStep(MoveStep.SA05_InPos);
                        SelfAuditMoveInfo.log("到达目标位置");
                    }
                    else if (SelfAuditMoveInfo.IsTimeOut())
                    {
                        Msg.add(crc.GetString(L.wat_waitInsaPos, "等待到达盘点库位超时"), MsgLevel.warning);
                        SelfAuditMoveInfo.log($"等待到达盘点库位超时");
                    }
                    break;
                case MoveStep.SA05_InPos:
                    SelfAuditMoveInfo.NextMoveStep(MoveStep.SA06_Check);
                    bool checkOk = false  ;
                    string msg = GetSelfAuditImg();
                    int ret = ReelCheckUtil.ReelCheck(SelfAuditMoveInfo.Name, msg);
                    checkOk = (ret == 1);
                    if (checkOk)
                    {
                        currSAPos.actBarcode = currSAPos.barcode;
                    }
                    else
                    {
                        currSAPos.actBarcode = "";
                    }
                    SelfAuditMoveInfo.log($"取图{msg},检测结果{ret}, 默认实际条码="+ currSAPos.actBarcode);

                    break;
                case MoveStep.SA06_Check:
                    SA07_UpdateRes();
                    break;
                case MoveStep.SA07_UpdateRes:
                    if(UpdateResTask==null|| UpdateResTask.IsCompleted)
                    {
                        SA02_GetPos();
                    }
                    break;
                case MoveStep.SA08_ToNext:
                    SelfAuditMoveInfo.NextMoveStep(MoveStep.SA09_Back);
                    SelfAuditMoveInfo.log("升降轴旋转轴返回待机点");
                    break;
                case MoveStep.SA09_Back:
                    SelfAuditMoveInfo.NextMoveStep(MoveStep.SA10_End);
                    SelfAuditMoveInfo.log("结束盘点");
                    break;
                default:
                    SelfAuditMoveInfo.log($"未找到对应步骤:{SelfAuditMoveInfo.MoveStep}");
                    break;
            }
        }


        #region 取图
        public static Bitmap StreamToBitmap(Stream stream)
        {
            try
            {
                BinaryFormatter bf = new BinaryFormatter();
                Bitmap bitmap = (Bitmap)bf.Deserialize(stream);
                return bitmap;
            }
            catch (Exception e)
            {
                LogUtil.error("StreamToBitmap :"+e.ToString());
            }
            return null;
        }
        public string GetSelfAuditImg()
        {
            string caName = Setting_Init.Device_SelfAudit_CameraName;
            try
            {
                if (ipCam == null)
                {
                    ipCam = new IPCamera();
                }
                string base64 = ipCam.GetImgBase64(caName);
                //LogUtil.info(base64);
                //if (base64 == "")
                //{
                //    base64 = File.ReadAllText(@"F:\inputStr.txt");
                //}
                if (base64 != null)
                {
                    //Bitmap bitmap = Base64StringToImage(base64);
                    //if (bitmap != null)
                    //{
                    //    string imgName = CodeManager.SaveIoFile("SelfAudit", caName, bitmap);
                    //    LogUtil.info("盘点取图完成,图片保存在:" + imgName);
                    //    return imgName;
                    //}


                    //try
                    //{
                    //    if (base64 != "")
                    //    {
                    //        string f1 = @"D:\inputStr.txt";
                    //        if (File.Exists(f1))
                    //        {
                    //            File.Delete(f1);
                    //        }
                    //        File.WriteAllText(f1, base64);
                    //    }
                    //}
                    //catch (Exception ex)
                    //{

                    //}

                    string dump = ParseBase64Str(base64);
                    //try
                    //{
                    //    if (dump != "")
                    //    {
                    //        string f2 = @"D:\dump.txt";
                    //        if (File.Exists(f2))
                    //        {
                    //            File.Delete(f2);
                    //        }
                    //        File.WriteAllText(f2, dump);
                    //    }
                    //}
                    //catch (Exception ex)
                    //{

                    //}
                    byte[] bt = Convert.FromBase64String(dump);
                    using (MemoryStream ms = new MemoryStream(bt))
                    {
                        Bitmap bmp = new Bitmap(ms);

                        string imgName = CodeManager.SaveIoFile("SelfAudit", caName, bmp);
                        LogUtil.info("盘点取图完成,图片保存在:" + imgName);
                        ms.Close();
                        return imgName;
                        //return bmp;
                    }
                }
            }
            catch (Exception e)
            {
                LogUtil.error($"{Name} 获取盘点图片出错:" + e.ToString());
            }
            return "";
        }
        //public string GetSelfAuditImg()
        //{
        //    string caName = Setting_Init.Device_SelfAudit_CameraName;
        //    try
        //    {
        //        if (ipCam == null)
        //        {
        //            ipCam = new IPCamera();
        //        }
        //        Stream returnData = ipCam.grabOneImgByStream(caName);
        //        if (returnData != null)
        //        {
        //            Bitmap bitmap = StreamToBitmap(returnData);
        //            if (bitmap != null)
        //            {
        //                string imgName = CodeManager.SaveImageToFile("SelfAudit", caName, bitmap);
        //                LogUtil.info("盘点取图完成,图片保存在:" + imgName);
        //                return imgName;
        //            }
        //        }
        //    }
        //    catch (Exception e)
        //    {
        //        LogUtil.error($"{Name} 获取盘点图片出错:" + e.ToString());
        //    }
        //    return "";
        //}
        private  string ParseBase64Str(string base64)
        {
            if (base64 == null) return "";
            string dump = base64.Trim('"', '"').Replace("%", "").Replace(",", "").Replace(" ", "+").Replace("\\", "");
            if (dump.Length % 4 > 0)
            {
                if (dump.EndsWith("="))
                {
                    dump = dump.TrimEnd('=');
                }
                dump = dump.PadRight(dump.Length + 4 - dump.Length % 4, '=');
            }
            return dump;
        }
        //base64编码的文本转为图片  
        private   Bitmap Base64StringToImage(string inputStr)
        {
            try
            { 
                try
                {
                    if (inputStr != "")
                    {
                        string f1 = @"D:\inputStr.txt";
                        if (File.Exists(f1)){
                            File.Delete(f1);
                        }
                        File.WriteAllText(f1, inputStr);
                    }
                }catch( Exception ex)
                {

                }

                string dump = ParseBase64Str(inputStr);
                try
                {
                    if (dump != "")
                    {
                        string f2 = @"D:\dump.txt";
                        if (File.Exists(f2))
                        {
                            File.Delete(f2);
                        }
                        File.WriteAllText(f2, dump);
                    }
                }
                catch (Exception ex)
                {

                }
                byte[] bt = Convert.FromBase64String(dump); 
                using (MemoryStream ms = new MemoryStream(bt))
                {
                    Bitmap bmp = new Bitmap(ms);

                    ms.Close();
                    return bmp;
                }
            }
            catch (Exception ex)
            {
                LogUtil.error("Base64StringToImage 转换失败/nException:" + ex.ToString());
                return null;
            }
        }
        #endregion
    }
}