using DBFactory;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Text;
using System.Web.Http;
using WcfControlMonitorLib;

namespace SDWebApi.Controllers
{
    [RoutePrefix("api/wcs")]
    public class thirdParty : ApiController
    {
        static DBOperator dbo = CStaticClass.dbo;
        static DBOperator dboMan = CStaticClass.dboM;
        static String ERROR = String.Empty;
        [HttpPost]
        [Route("receiveWmsTask")]
        // POST api/<controller>
        public string receiveWmsTaskController([FromBody] string value)
        {
            dbo.TransBegin(IsolationLevel.ReadCommitted);
            try
            {
                //var body = this.Request.Body;
                //int length = (int)body.Length;
                //byte[] data = new byte[length];
                //body.Read(data, 0, length);
                //string jsonStr = System.Text.Encoding.Default.GetString(value);
                CommonClassLib.CCarryConvert.WriteLog("WEBAPI", "收到报文", value.ToString(), "");

                CCallService.WMS_WCS_PARAM_OUT_MOVE wms_wcs = Model.JsonHelper.Deserialize<CCallService.WMS_WCS_PARAM_OUT_MOVE>(value);
                //  CCallService.WCS_WMS_PARAM_OUT_MOVE wcs_wms = new CCallService.WCS_WMS_PARAM_OUT_MOVE();  //返回的报文
                CCallService.OUT_MOVE_RES answer_outdata = new CCallService.OUT_MOVE_RES();//返回数据
                string err = string.Empty;
                string returnJson = string.Empty;
                DataView dv = new DataView();
                CCallService.OUT_MOVE_RES outReturn = new CCallService.OUT_MOVE_RES();
                if (wms_wcs != null)
                {
                    List<CCallService.OUT_MOVE_DATA> outdata = wms_wcs.tasks; //任务信息
                    int isOk = 0;
                    // CCallService.OUT_MOVE_RES outReturn = new CCallService.OUT_MOVE_RES();
                    foreach (var task in outdata)
                    {

                        IO_CONTROL outtask = new IO_CONTROL(task, wms_wcs.msgTime, wms_wcs.priority.ToString());

                        if (outtask.Insert_IOCONTROL() == false)
                        {
                            isOk++;
                            outReturn.data += "ID'" + task.taskId.ToString() + "'任务下发失败:";
                        }
                        if (isOk == 0)
                        {
                            outReturn.code = 0;
                            outReturn.msg = "";
                        }
                        else
                        {
                            outReturn.code = 1;
                            outReturn.msg = "任务接收失败";
                        }
                    }

                }
                returnJson = Model.JsonHelper.Serializer(outReturn);
                CommonClassLib.CCarryConvert.WriteLog("WEBAPI", "返回报文", returnJson, "");
                dbo.TransCommit();
                return returnJson;
            }
            catch (Exception ex)
            {
                string errorjson = Model.JsonHelper.Serializer(new
                {
                    code = 1,
                    msg = "WCS解析json异常",
                    data = ex.Message.ToString()
                });
                CommonClassLib.CCarryConvert.WriteLog("WEBAPI", "返回报文", ex.Message.ToString(), "");
                dbo.TransRollback();
                return errorjson;
            }
        }

        // PUT api/<controller>/5
        public void Put(int id, [FromBody] string value)
        {
        }

        // DELETE api/<controller>/5
        public void Delete(int id)
        {
        }
    }

    #region 向 IO_CONTROL 插入出库倒库任务等 
    public class IO_CONTROL
    {
        static DBOperator dbo = CStaticClass.dbo;
        static DBOperator dboMan = CStaticClass.dboM;
        string wms_id;
        int relative_id;
        string barcode;
        string startdevice;
        string enddevice;
        string begintime;
        int control_type;
        string warehouse = "1";
        string tasklevel;
        int needAgv = 0;
        public StringBuilder error_code = new StringBuilder();

        StringBuilder sql = new StringBuilder();

        public IO_CONTROL(CCallService.OUT_MOVE_DATA outdata, string time, string level)//出库 移库
        {
            error_code.Clear();
            wms_id = outdata.taskId;
            relative_id = -1;
            barcode = outdata.containerCode;
            if (outdata.taskType == 2 || outdata.taskType == 3)
            { //起点是库位
                startdevice = outdata.startRow.ToString("D2") + "-" + outdata.startColumn.ToString("D2") + "-" + outdata.startLayer.ToString("D2");
                enddevice = outdata.endNode;
            }
            else if (outdata.taskType == 1 || outdata.taskType == 4) //终点是库位
            {
                startdevice = outdata.startNode;
                enddevice = outdata.endRow.ToString("D2") + "-" + outdata.endColumn.ToString("D2") + "-" + outdata.endLayer.ToString("D2");
            }
            control_type = outdata.taskType;
            string dTime1 = DateTime.Now.ToString("u");
            begintime = dTime1.Substring(0, dTime1.Length - 1);
            tasklevel = level;
            // needAgv = outdata.carryType == 2 ? 1 : 0;
        }
        public IO_CONTROL(CCallService.WMS_WCS_PARAM_IN indata, string time, string level)//入库
        {
            error_code.Clear();
            wms_id = indata.taskId;
            relative_id = -1;
            barcode = indata.containerCode;
            if (indata.taskType == 2 || indata.taskType == 3)
            { //起点是库位
              // startdevice = outdata.startRow.ToString("D2") + "-" + outdata.startColumn.ToString("D2") + "-" + outdata.startLayer.ToString("D2");
                enddevice = indata.endNode;
            }
            else if (indata.taskType == 1 || indata.taskType == 4) //终点是库位
            {
                startdevice = indata.startNode;
                enddevice = indata.endRow.ToString("D2") + "-" + indata.endColumn.ToString("D2") + "-" + indata.endLayer.ToString("D2");
            }
            control_type = 1;
            string dTime1 = DateTime.Now.ToString("u");
            begintime = dTime1.Substring(0, dTime1.Length - 1);
            tasklevel = level;

        }

        //检查参数是否正确
        bool CheckData()
        {
            Dictionary<string, WEBAPI_CKECKING> all_checking = new Dictionary<string, WEBAPI_CKECKING>();

            #region 从数据库中读取要检测的SQL
            sql.Clear();
            sql.Append("select * from WEBAPI_CKECKING");
            DataView dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
            for (int i = 0; i < dv.Count; i++)
            {
                WEBAPI_CKECKING wac = new WEBAPI_CKECKING();

                wac.check_id = dv[i]["CKECK_ID"].ToString();
                wac.check_name = dv[i]["CKECK_NAME"].ToString();
                wac.sql = dv[i]["SQL"].ToString();
                wac.des = dv[i]["DESCRIPTION"].ToString();

                all_checking.Add(wac.check_name, wac);
            }
            #endregion

            error_code.Clear();

            #region 检查是否重复,CONTROL_ID, 托盘码重复, 起始货位重复,终止货位重复(结果大于零)

            sql.Clear();
            sql.Append(string.Format(all_checking["CONTROL_ID_REPEAT"].sql, wms_id));
            if (dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView.Count > 0)
            {
                error_code.Append(";").Append(all_checking["CONTROL_ID_REPEAT"].des);  //fid重复
            }

            //sql.Clear();
            //sql.Append(string.Format(all_checking["BARCODE_REPEAT"].sql, barcode));
            //if (dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView.Count > 0)
            //{
            //    error_code.Append(";").Append(all_checking["BARCODE_REPEAT"].des);  //托盘条码重复
            //}
            if (string.IsNullOrEmpty(tasklevel))
            {
                error_code.Append(";").Append("任务优先级为空");
            }
            if (string.IsNullOrEmpty(wms_id))
            {
                error_code.Append(";").Append("任务号为空");
            }
            if (string.IsNullOrEmpty(barcode))
            {
                error_code.Append(";").Append("条码为空");
            }

            if (int.TryParse(this.wms_id, out int controlid) == false)
            {
                error_code.Append(";").Append(all_checking["CONTROL_ID_NOT_NUM"].des);  //controlid不为数字
            }


            if (control_type == 2)//出库任务
            {

                sql.Clear();
                sql.Append(string.Format(all_checking["START_CEEE_REPEAT"].sql, startdevice, control_type));
                if (dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView.Count > 0)
                {
                    error_code.Append(";").Append(all_checking["START_CEEE_REPEAT"].des);  //起始货位重复
                }
                if (this.startdevice.Length != 8)
                {
                    error_code.Append(";").Append("起点").Append(all_checking["CELL_LENGTH_ERROR"].des);  //起点货位编码长度错误
                }
                sql.Clear();
                sql.Append(string.Format(all_checking["CELL_NOT_EXIST"].sql, startdevice));
                if (dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView.Count == 0)
                {
                    error_code.Append(";").Append("起点").Append(all_checking["CELL_NOT_EXIST"].des);  //起点货位不存在

                }

                int endGate = 0;
                if (int.TryParse(this.enddevice, out endGate) == false)
                {
                    error_code.Append(";").Append(all_checking["END_GATE_ERROR"].des);  //终点站台不正确,无法转为整数
                }

                sql.Clear();
                sql.Append(string.Format(all_checking["END_GATE_NOT_EXIST"].sql, enddevice));
                if (dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView.Count == 0)
                {
                    error_code.Append(";").Append(all_checking["END_GATE_NOT_EXIST"].des);  //终点站台不存在
                }

            }

            if (control_type == 1)//入库任务
            {
                sql.Clear();
                sql.Append(string.Format(all_checking["END_CEEE_REPEAT"].sql, enddevice, control_type));
                if (dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView.Count > 0)
                {
                    error_code.Append(";").Append(all_checking["END_CEEE_REPEAT"].des);  //终点货位重复
                }
                if (this.enddevice.Length != 8)
                {
                    error_code.Append(";").Append("终点").Append(all_checking["CELL_LENGTH_ERROR"].des);  //终点货位编码长度错误
                }

                sql.Clear();
                sql.Append(string.Format(all_checking["CELL_NOT_EXIST"].sql, enddevice));
                if (dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView.Count == 0)
                {
                    error_code.Append(";").Append("终点").Append(all_checking["CELL_NOT_EXIST"].des);  //终点货位不存在
                }
                sql.Clear();
                sql.Append(string.Format(all_checking["START_GATE_NOT_EXIST"].sql, startdevice));
                if (dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView.Count == 0)
                {
                    error_code.Append(";").Append(all_checking["START_GATE_NOT_EXIST"].des);  //起点站台不存在
                }
            }
            #region 校验代码需优化20250310
            if (control_type == 3) //移库任务
            {
                if (this.startdevice.Length != 8)
                {
                    error_code.Append(";").Append("起点").Append(all_checking["CELL_LENGTH_ERROR"].des);  //终点货位编码长度错误
                }
                if (this.enddevice.Length != 8)
                {
                    error_code.Append(";").Append("终点").Append(all_checking["CELL_LENGTH_ERROR"].des);  //终点货位编码长度错误
                }

                sql.Clear();
                sql.Append(string.Format(all_checking["CELL_NOT_EXIST"].sql, startdevice));
                if (dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView.Count == 0)
                {
                    error_code.Append(";").Append("起点").Append(all_checking["CELL_NOT_EXIST"].des);  //起点货位不存在

                }
                sql.Clear();
                sql.Append(string.Format(all_checking["CELL_NOT_EXIST"].sql, enddevice));
                if (dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView.Count == 0)
                {
                    error_code.Append(";").Append("终点").Append(all_checking["CELL_NOT_EXIST"].des);  //终点货位不存在
                }

                //移库任务如果不同层,校验不要移
                if (startdevice.Substring(6, 2) != enddevice.Substring(6, 2))
                {
                    error_code.Append(";").Append("移库任务起点终点层值不同");
                }
                if (startdevice == enddevice)
                {
                    error_code.Append(";").Append("移库任务起点终点相同");
                }

            }
            #endregion
            #endregion

            //检查托盘码

            if (error_code.Length == 0)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        //
        public bool Insert_IOCONTROL()
        {
            if (CheckData() == true)
            {
                try
                {
                    sql.Clear();
                    sql.Append(string.Format("INSERT INTO IO_CONTROL (CONTROL_ID, RELATIVE_CONTROL_ID, MANAGE_ID, STOCK_BARCODE, CONTROL_TASK_TYPE, CONTROL_TASK_LEVEL," +
                        " START_WAREHOUSE_CODE, START_DEVICE_CODE, END_WAREHOUSE_CODE, END_DEVICE_CODE, CONTROL_BEGIN_TIME,CONTROL_STATUS,NeedAgv) " +
                        "VALUES( {0},'{1}','{2}', '{3}', '{4}', '{5}', '{6}', '{7}', '{8}', '{9}', '{10}',{11})",
                        wms_id, -1, 0, barcode, control_type, tasklevel, warehouse, startdevice, warehouse, enddevice, begintime, 0, needAgv));
                    dbo.ExceSQL(sql.ToString());
                    return true;
                }
                catch (Exception ex)
                {
                    error_code.Append("WCS插入IO_ONTROL表失败!");
                    return false;
                }
            }

            return false;
        }


    }
    #endregion

}