using Infrastructure;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using ServiceReference1;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Diagnostics;
using System.Linq;
using System.Xml;
using WebApp;
using WebRepository;

namespace WebMvc
{
    /// <summary>
	/// 立库任务表
	/// </summary>
    [Area("task")]
    public class TaskController : BaseController
    {
        private readonly TaskApp _app;
        private IUnitWork _unitWork;

        public TaskController(IAuth authUtil, TaskApp app,IUnitWork unitWork) : base(authUtil)
        {
            _app = app.SetLoginInfo(_loginInfo);
            _unitWork = unitWork;
        }

        #region 视图功能
        /// <summary>
        /// 默认视图Action
        /// </summary>
        /// <returns></returns>
        [Authenticate]
        [ServiceFilter(typeof(OperLogFilter))]
        public ActionResult Index()
        {
            return View();
        }

        /// <summary>
        /// 出入库视图
        /// </summary>
        /// <returns></returns>
        [Authenticate]
        [ServiceFilter(typeof(OperLogFilter))]
        public ActionResult PalletInOut()
        {
            return View();
        }

        /// <summary>
        /// 切片机入库视图
        /// </summary>
        /// <returns></returns>
        [Authenticate]
        [ServiceFilter(typeof(OperLogFilter))]
        public ActionResult PalletIn()
        {
            return View();
        }

        /// <summary>
        /// 临时添加库内物料视图
        /// </summary>
        /// <returns></returns>
        [Authenticate]
        [ServiceFilter(typeof(OperLogFilter))]
        public ActionResult AddLocation()
        {
            return View();
        }

        /// <summary>
        /// PP片从铜箔入空板
        /// </summary>
        /// <returns></returns>
        [Authenticate]
        [ServiceFilter(typeof(OperLogFilter))]
        public ActionResult PPEmptyIn()
        {
            return View();
        }

        #endregion

        #region 获取数据
        /// <summary>
        /// 加载及分页查询
        /// </summary>
        /// <param name="pageRequest">表单请求信息</param>
        /// <param name="entity">请求条件实例</param>
        /// <returns></returns>
        [HttpPost]
        public string Load(PageReq pageRequest, Task entity)
        {
            return JsonHelper.Instance.Serialize(_app.Load(pageRequest, entity));
        }
        #endregion

        #region 提交数据
        /// <summary>
        /// 新增数据
        /// </summary>
        /// <param name="Table_entity">新增实例</param>
        /// <returns></returns>
        [HttpPost]
        [ServiceFilter(typeof(OperLogFilter))]
        public string Ins(Task Table_entity)
        {
            try
            {
                _app.Ins(Table_entity);
            }
            catch (Exception ex)
            {
                Result.Status = false;
                Result.Message = ex.Message;
            }
            return JsonHelper.Instance.Serialize(Result);
        }

        /// <summary>
        /// 修改数据
        /// </summary>
        /// <param name="Table_entity">修改实例</param>
        /// <returns></returns>
        [HttpPost]
        [ServiceFilter(typeof(OperLogFilter))]
        public string Upd(Task Table_entity)
        {
            try
            {
                _app.Upd(Table_entity);
            }
            catch (Exception ex)
            {
                Result.Status = false;
                Result.Message = ex.Message;
            }
            return JsonHelper.Instance.Serialize(Result);
        }

        [HttpPost]
        [ServiceFilter(typeof(OperLogFilter))]
        public string DelByIds(int[] ids)
        {
            try
            {
                _app.DelByIds(ids);
            }
            catch (Exception ex)
            {
                Result.Status = false;
                Result.Message = ex.Message;
            }
            return JsonHelper.Instance.Serialize(Result);
        }
        #endregion

        #region 导出数据
        /// <summary>
        /// 导出数据
        /// </summary>
        /// <param name="entity">请求条件实例</param>
        /// <returns></returns>
        [HttpPost]
        public string Export(Task entity)
        {
            return JsonHelper.Instance.Serialize(_app.ExportData(entity));
        }
        #endregion

        #region 导出模板
        /// <summary>
        /// 导出模板
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public string GetTemplate()
        {
            var result = new TableData();
            List<Task> listTask = new List<Task>();
            Task entity = _app.FindSingle(u => u.Id > 0);
            if (entity != null)
            {
                listTask.Add(entity);
            }
            else
            {
                listTask.Add(new Task());
            }
 
            result.data = listTask;
            result.count = listTask.Count;

            return JsonHelper.Instance.Serialize(result);
        }
        #endregion

        #region 导入数据
        /// <summary>
        /// 导入数据
        /// </summary>
        /// <param name="excelfile">表单提交的文件信息</param>
        /// <returns></returns>
        [HttpPost]
        public string Import(IFormFile excelfile)
        {
            try
            {
                Response result = _app.ImportIn(excelfile);
                if (!result.Status)
                {
                    Result.Status = false;
                    Result.Message = result.Message;
                }
            }
            catch (Exception ex)
            {
                Result.Status = false;
                Result.Message = ex.Message;
            }
            return JsonHelper.Instance.Serialize(Result);
        }
        #endregion

        #region 自定义方法
        /// <summary>
        /// 查询容器的第一个任务
        /// </summary>
        /// <param name="Code"></param>
        /// <returns></returns>
        [HttpPost]
        [ServiceFilter(typeof(OperLogFilter))]
        public string FindSourceCode(string Code)
        {
            TableData tab = new TableData();
            try
            {
                tab = _app.FindCode(Code);
            }
            catch (Exception ex)
            {
                tab.code = 300;
                tab.msg = ex.Message;
            }
            return JsonHelper.Instance.Serialize(tab);
        }
        /// <summary>
        /// 托盘回库
        /// </summary>
        /// <param name="containerCode"></param>
        /// <param name="IsFull"></param>
        /// <returns></returns>
        [HttpPost]
        [ServiceFilter(typeof(OperLogFilter))]
        public string BulidContainerBack(string containerCode, string IsFull)
        {
            return JsonHelper.Instance.Serialize(_app.ContainerBack(containerCode, IsFull));
        }
        /// <summary>
        /// 空板回库
        /// </summary>
        /// <param name="station">站台</param>
        /// <param name="type">托盘类型</param>
        /// <param name="containerCode">托盘号</param>
        /// <returns></returns>
        [HttpPost]
        [ServiceFilter(typeof(OperLogFilter))]
        public string BulidEmptyContainerBack(string station, string type, string containerCode )
        {
            return JsonHelper.Instance.Serialize(_app.EmptyContainerBack(station,containerCode, type));
        }
        /// <summary>
        /// 收(取)料完成
        /// </summary>
        /// <param name="taskDel"></param>
        /// <returns></returns>
        [HttpPost]
        [ServiceFilter(typeof(OperLogFilter))]
        public string FinishPick(TaskDetail taskDel)
        {
            return JsonHelper.Instance.Serialize(_app.FinishPickApp(taskDel));
        }
        /// <summary>
        /// 出库查看完成
        /// </summary>
        /// <param name="taskDel"></param>
        /// <returns></returns>
        [HttpPost]
        [ServiceFilter(typeof(OperLogFilter))]
        public string FinishCheck(TaskDetail taskDel)
        {
            return JsonHelper.Instance.Serialize(_app.FinishCheckApp(taskDel));
        }

        //取消任务
        [HttpPost]
        [ServiceFilter(typeof(OperLogFilter))]
        public string TaskCancel(List<Task> tasklist)
        {
            return JsonHelper.Instance.Serialize(_app.TaskCancelApp(tasklist));
        }

       
        #endregion

        //整托手动任务
        [HttpPost]
        [ServiceFilter(typeof(OperLogFilter))]
        public string HandTaskIn(string containerCode, string station,int isBuffer, string isPack, string isFold,string status)
        {
            return JsonHelper.Instance.Serialize(_app.HandTaskInApp(containerCode, station, isBuffer, isPack, isFold, status));
        }

        /// <summary>
        /// 手动添加物料库存
        /// </summary>
        /// <param name="containerCode">托盘号</param>
        /// <param name="station">站台号</param>
        /// <param name="material">料号</param>
        /// <param name="Lot">批号</param>
        /// <param name="num">数量</param>
        /// <param name="Batch">批次</param>
        /// <param name="Customer">客户编号</param>
        /// <param name="Typesetting">排版数量</param>
        /// <param name="Supplier">供应商</param>
        /// <param name="ResidualWeight">厚度</param>
        /// <param name="Retreat">退料人</param>
        /// <returns></returns>
        [HttpPost]
        [ServiceFilter(typeof(OperLogFilter))]
        public string AddInventory(string containerCode, string station, string material, string Lot, decimal num, string Batch, string Customer, string Typesetting, string Supplier, decimal ResidualWeight, string Retreat)
        {
            TableData tab = new TableData();
            string specification = "";
            string nameDescription = "";
            string unit = "";
            string Size = "";
            decimal NumberofSheets = -1;
            decimal Groupnum = -1;
            decimal time = -1;
            Stopwatch stopwatch = new Stopwatch();
            stopwatch.Start();
            //查询是否启用该接口
            WebStart webStart_get_ima_oa = _unitWork.Find<WebStart>(n => n.InterfaceNmae == "get_ima_oa").FirstOrDefault();
            //排除工单号回库和废铜箔回库
            if (Batch != "000" && material != "1111111111" && webStart_get_ima_oa != null)
            {
                if (webStart_get_ima_oa.IsStart)
                {
                    try
                    {
                        //webservice引用
                        TIPTOPServiceGateWayPortTypeClient C = new TIPTOPServiceGateWayPortTypeClient();
                        ConfigXmlDocument doc = new ConfigXmlDocument();
                        //读取传入的xml
                        var config = AppSettingsJson.GetAppSettings();
                        doc.Load(config.GetSection("NouYaWebService:Url").Value);
                        //将物料号填入
                        XmlNodeList ns = doc.SelectNodes("//Field");
                        foreach (XmlElement node in ns)
                        {
                            if (node.GetAttribute("name") == "ima01")
                            {
                                node.SetAttribute("value", material);
                            }
                        }
                        //调用方法
                        var response = C.get_ima_oa(doc.InnerXml);
                        //处理回传数据
                        doc.LoadXml(response);
                        XmlElement element = (XmlElement)doc.SelectSingleNode("//Status");
                        string code = element.GetAttribute("code");
                        string name = "";
                        string value = "";
                        if (code == "0")
                        {
                            XmlNodeList nodes = doc.SelectNodes("//Field");
                            foreach (XmlElement node in nodes)
                            {
                                name = node.GetAttribute("name");
                                value = node.GetAttribute("value");
                                if (name == "ima02")
                                {
                                    nameDescription = value;
                                }
                                else if (name == "ima021")
                                {
                                    specification = value;
                                }
                                else if (name == "ima25")
                                {
                                    unit = value;
                                }
                            }
                        }
                        else
                        {
                            string description = element.GetAttribute("description");
                            tab.code = 300;
                            tab.msg = "查找物料信息失败:" + description;
                            return JsonHelper.Instance.Serialize(tab);
                        }
                    }
                    catch (Exception ex)
                    {
                        tab.code = 300;
                        tab.msg = "查找物料信息失败:" + ex.Message;
                        return JsonHelper.Instance.Serialize(tab);
                    }
                }
            }

            //查询是否启用该接口
            WebStart webStart_get_sfb = _unitWork.Find<WebStart>(n => n.InterfaceNmae == "get_sfb").FirstOrDefault();
            //排除工单号回库和废铜箔回库
            if (Batch != "000" && containerCode.Contains("PP") && webStart_get_sfb != null)
            {
                if (webStart_get_sfb.IsStart)
                {
                    try
                    {
                        //webservice引用
                        ServiceReference2.TIPTOPServiceGateWayPortTypeClient C2 = new ServiceReference2.TIPTOPServiceGateWayPortTypeClient();
                        ConfigXmlDocument doc = new ConfigXmlDocument();
                        //读取传入的xml
                        var config = AppSettingsJson.GetAppSettings();
                        doc.Load(config.GetSection("NouYaWebPPService:Url").Value);
                        //将物料号填入
                        XmlNodeList ns = doc.SelectNodes("//Field");
                        foreach (XmlElement node in ns)
                        {
                            if (node.GetAttribute("name") == "sfb01")
                            {
                                node.SetAttribute("value", Lot);
                            }
                        }
                        //调用方法
                        var response = C2.get_sfb(doc.InnerXml);
                        //处理回传数据
                        doc.LoadXml(response);
                        string name = "";
                        string value = "";
                        XmlNodeList nodes = doc.SelectNodes("//Field ");
                        foreach (XmlElement node in nodes)
                        {
                            name = node.GetAttribute("name");
                            value = node.GetAttribute("value");
                            if (name == "sfbud10" && !string.IsNullOrEmpty(value))
                            {
                                Size = value;
                            }
                            else if (name == "sfbud11" && !string.IsNullOrEmpty(value))
                            {
                                NumberofSheets = num / decimal.Parse(value);
                            }
                            else if (name == "sfbud12" && !string.IsNullOrEmpty(value))
                            {
                                Groupnum = decimal.Parse(value);
                            }
                            else if (name == "sfb01")
                            {
                                if (value != Lot)
                                {
                                    tab.code = 300;
                                    tab.msg = "回传工单号不统一<" + value + ">";
                                    return JsonHelper.Instance.Serialize(tab);
                                }
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        tab.code = 300;
                        tab.msg = "查找物料信息失败:" + ex.Message;
                        return JsonHelper.Instance.Serialize(tab);
                    }
                }
            }
            stopwatch.Stop();
            double millisecond = stopwatch.ElapsedMilliseconds;
            time = decimal.Parse(millisecond.ToString());
            return JsonHelper.Instance.Serialize(_app.AddInventoryApp(containerCode, station, material, Lot, num, Batch, Customer, Typesetting, Supplier, ResidualWeight, Retreat, nameDescription, specification, unit,time,Size,NumberofSheets,Groupnum));
        }

        //站台到站台
        [HttpPost]
        [ServiceFilter(typeof(OperLogFilter))]
        public string StationToStation(string containerCode, string startStation, string endStation)
        {
            return JsonHelper.Instance.Serialize(_app.StationToStationApp(containerCode, startStation, endStation));
        }

        //通过站台查询库存
        [HttpPost]
        [ServiceFilter(typeof(OperLogFilter))]
        public string StationToInventory(string stationCode)
        {
            return JsonHelper.Instance.Serialize(_app.StationToInventoryApp(stationCode));
        }

        //空栈板出库
        [HttpPost]
        [ServiceFilter(typeof(OperLogFilter))]
        public string EmptyPalletOut(string station, string type)
        {
            return JsonHelper.Instance.Serialize(_app.EmptyPalletOutApp(station, type));
        }

        //比对托盘号,占用站台并创建容器
        [HttpPost]
        [ServiceFilter(typeof(OperLogFilter))]
        public string PalletIsNo(string Pallet, string station)
        {
            return JsonHelper.Instance.Serialize(_app.PalletIsNo(Pallet, station));
        }
        //通过站台查询已锁站台托盘号(暂存区专用)
        [HttpPost]
        [ServiceFilter(typeof(OperLogFilter))]
        public string SelStation(string station)
        {
            return JsonHelper.Instance.Serialize(_app.SelStation( station));
        }


    }
}