using HHWCS.Model;
using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SystemLogHelper;
using LEDhelp;

namespace HHWCS.Bll
{
    public class Bll : IBll
    {   
        public static void Main(String[] args)
        {
            //string str = "";
            //for (int i = 1; i < 3; i++)
            //{
            //    for (int j = 1; j < 33; j++)
            //    {
            //        for (int k = 1; k < 6; k++)
            //        {
            //            str += String.Format("INSERT INTO `huaheng`.`location` (`code`, `warehouseId`, `warehouseCode`, `row`, `line`, `layer`, `grid`, `roadway`, `type`, `containerId`, `containerCode`, `zoneId`, `zoneCode`, `status`, `lastCycleCountDate`, `created`, `createdBy`, `lastUpdated`, `lastUpdatedBy`, `enable`, `deleted`, `userDef1`, `userDef2`, `userDef3`, `userDef4`, `userDef5`) VALUES ('{0}', '1', 'CS0001', '{1}', '{2}', '{3}', '0', '1', 'LK', NULL, NULL, NULL, NULL, 'empty', NULL, '2018-08-24 11:31:27', NULL, '2018-08-24 14:31:46', NULL, b'01', b'00', NULL, NULL, NULL, NULL, NULL);\r\n", "A" + i.ToString().PadLeft(2, '0') + j.ToString().PadLeft(2, '0') + k.ToString().ToString().PadLeft(2, '0'), i, j, k);
            //        }
            //    }
            //}
            //LogExecute.WriteInfoLog(str);
            //Console.WriteLine(str);
            //object a = false;
            //object b = "abc";
            //object c = 1;
            //object d = (byte)1;
            //object a =Convert.ToBoolean("True");
            //object b = Convert.ToInt32("1");
            //object c = Convert.ToByte("1");
            //object d = Convert.ToBoolean("0");

            //Console.WriteLine(a.GetType()+" - "+a);
            //Console.WriteLine(b.GetType() +" - "+b);
            //Console.WriteLine(c.GetType()+" - "+c);
            //Console.WriteLine(d.GetType()+ " - " + d);
            //Console.WriteLine(d);
            //byte a = 0b00010001;
            //Console.WriteLine(a);
            //LEDhelp.LEDHelper led = new LEDhelp.LEDHelper("192.168.10.110", 5005, 1);
            //led.SendLedInfo("dfadffgsdgsdfgs\\ndfgsdfgdfg16\\n开发机构涉及地方\\n管理会计师对方了国家\\n受到了房价太高迫而价格\\n破手机而苹果就是独立\\n开发背景来看笑话\\nVB哦时间的反馈给解释答复");
            //Bll bll = new Bll();
            //var a = bll.GetTaskDetailsByTaskId(150);
            //a.Data.ForEach(t => Console.WriteLine(t.ToString()));

            //Queue<string> q = new Queue<string>();
            //LEDHelper led = new LEDHelper("192.168.10.110", 5005, 1);
            //LEDHelper led2 = new LEDHelper("192.168.10.110", 5005, 1);
            //Task.Run(async () =>
            //{
            //    while (true)
            //    {
            //        await Task.Delay(3000);
            //        if (q.Count > 0)
            //        {
            //            led2.SendLedInfo(q.Dequeue()); 
            //        }
            //    }
            //});
            //String read = "";
            //while (read != "exit")
            //{
            //    read = Console.ReadLine();
            //    //led.SendLedInfo(read);
            //    q.Enqueue(read);
            //}
            Console.Read();
        }

        #region Login

        public async Task<BllResult> Login(string userName, string password)
        {
            return BllResultFactory.Sucess(null, "默认成功");
        }

        #endregion

        #region Task

        public BllResult<List<TaskDetailEntity>> GetTaskDetailsByTaskId(int taskId)
        {
            try
            {
                string sql = $"SELECT td.*,m.`name` materialName FROM task_detail td join material m on td.materialCode = m.`code` and td.warehouseId = m.warehouseId where td.taskId = {taskId}";
                var ds = MySqlHelper.ExecuteDataset(AppCommon.ConnectionString, sql);
                if (ds == null || ds.Tables.Count == 0 || ds.Tables[0].Rows.Count == 0)
                {
                    return BllResultFactory.Error<List<TaskDetailEntity>>(null, "没有数据");
                }
                var list = ds.Tables[0].AsEnumerable().Select(t => new TaskDetailEntity()
                {
                    Id = Convert.ToInt32(t["id"]),
                    TaskId = (int)t["taskId"],
                    WarehouseId = (int)t["warehouseId"],
                    WarehouseCode = t["warehouseCode"] is DBNull ? null : t["warehouseCode"].ToString(),
                    AllocationId = t["allocationId"] is DBNull ? -1 : Convert.ToInt32(t["allocationId"]),
                    MaterialCode = t["materialCode"] is DBNull ? null : t["materialCode"].ToString(),
                    ContainerCode = t["containerCode"] is DBNull ? null : t["containerCode"].ToString(),
                    SourceLocation = t["sourceLocation"] is DBNull ? null : t["sourceLocation"].ToString(),
                    DestinationLocation = t["destinationLocation"] is DBNull ? null : t["destinationLocation"].ToString(),
                    Qty = t["qty"] is DBNull ? 0 : Convert.ToInt32(t["qty"]),
                    Status = Convert.ToInt32(t["status"]),
                    Endtime = t["endTime"] is DBNull ? null : (DateTime?)(t["endTime"]),
                    LastUpdated = t["lastUpdated"] is DBNull ? null : (DateTime?)t["lastUpdated"],
                    LastUpdateBy = t["lastUpdatedBy"] is DBNull ? "" : t["lastUpdatedBy"].ToString(),
                    Deleted =Convert.ToBoolean(t["deleted"]),
                    MaterialName = t["materialName"] is DBNull ? null : t["materialName"].ToString()
                }).ToList();
                return BllResultFactory.Sucess<List<TaskDetailEntity>>(list, "成功");

            }
            catch (Exception ex)
            {
                return BllResultFactory.Error<List<TaskDetailEntity>>(null, "查询失败");
            }
        }

        /// <summary>
        /// 处理空出
        /// </summary>
        /// <param name="v"></param>
        /// <param name="task"></param>
        /// <returns></returns>
        public BllResult EmptyOutHandle(string v, string status, TaskEntity task)
        {
            try
            {
                string sql = $"UPDATE task set isEmptyOut ={v} ,lastStatus = {status},firstStatus={status}  where id = {task.Id}";
                int i = MySqlHelper.ExecuteNonQuery(AppCommon.ConnectionString, sql);
                if (i == 0)
                {
                    UpdateLocationStatus(task.DestinationLocation, AppCommon.WarehouseId, "empty", AppCommon.ConnectionString);
                    UpdateLocationStatus(task.SourceLocation, AppCommon.WarehouseId, "empty", AppCommon.ConnectionString);
                    return BllResultFactory.Error(null, "更新失败");
                }
                else
                {
                    return BllResultFactory.Sucess(null, "成功");
                }
            }
            catch (Exception ex)
            {
                return BllResultFactory.Error(null, "空出处理失败:" + ex.ToString());
            }
        }

        /// <summary>
        /// 处理重入
        /// </summary>
        /// <param name="location"></param>
        /// <param name="task"></param>
        /// <returns></returns>
        public BllResult TaskDoubleInHandle(string flag, String location, int taskId)
        {
            try
            {
                string sql = $"update task set isDoubleIn = {flag},secondDestinationLocation = '{location}' WHERE id = {taskId}";
                int i = MySqlHelper.ExecuteNonQuery(AppCommon.ConnectionString, sql);
                if (i == 0)
                {
                    return BllResultFactory.Error(null, "更新失败");
                }
                else
                {
                    UpdateLocationStatus(location, AppCommon.WarehouseId, "lock", AppCommon.ConnectionString);
                    return BllResultFactory.Sucess(null, "更新成功");
                }
            }
            catch (Exception ex)
            {
                return BllResultFactory.Error(null, "更新失败:" + ex.ToString());
            }
        }

        public BllResult<List<TaskEntity>> GetTasks(string status, string taskNo, string pallet, DateTime? beginTime, DateTime? endTime)
        {
            try
            {
                String sql = "select * from task where 1=1 ";
                if (!String.IsNullOrEmpty(status))
                {
                    sql += " and lastStatus = '" + status + "'";
                }
                if (!String.IsNullOrEmpty(taskNo))
                {
                    sql += " and id = " + taskNo;
                }
                if (!String.IsNullOrEmpty(pallet))
                {
                    sql += " and containerCode = '" + pallet + "'";
                }
                if (beginTime != null)
                {
                    sql += " and created>='" + beginTime.ToString() + "'";
                }
                if (endTime != null)
                {
                    sql += " and created<='" + endTime.ToString() + "'";
                }
                sql += " ORDER BY lastUpdated ";

                DataSet ds = MySqlHelper.ExecuteDataset(AppCommon.ConnectionString, sql);
                if (ds == null || ds.Tables.Count == 0 || ds.Tables[0].Rows.Count == 0)
                {
                    return BllResultFactory.Error<List<TaskEntity>>(null, "未找到数据");
                }
                return BllResultFactory.Sucess<List<TaskEntity>>(ds.Tables[0].AsEnumerable().Select(x => new TaskEntity
                {
                    Id = (int)x["id"],
                    WarehouseId = Convert.ToInt32(x["warehouseId"]),
                    WarehouseCode = x["warehouseCode"]?.ToString(),
                    CompanyId = x["companyId"] is DBNull ? null : (int?)x["companyId"],
                    Priority = Convert.ToInt32(x["priority"]),
                    Type = Convert.ToInt32(x["type"]),
                    Station = x["station"] is DBNull ? null : (int?)x["station"],
                    ContainerId = x["containerId"] is DBNull ? null : (int?)x["containerId"],
                    ContainerCode = x["containerCode"]?.ToString(),
                    SourceLocation = x["sourceLocation"]?.ToString(),
                    DestinationLocation = x["destinationLocation"]?.ToString(),
                    FirstStatus = Convert.ToInt32(x["firstStatus"]),
                    LastStatus = Convert.ToInt32(x["lastStatus"]),
                    Created = x["created"] is DBNull ? null : (DateTime?)x["created"],
                    CreatedBy = x["createdBy"]?.ToString(),
                    BeginTime = x["beginTime"] is DBNull ? null : (DateTime?)x["beginTime"],
                    EndTime = x["endTime"] is DBNull ? null : (DateTime?)x["endTime"],
                    LastUpdated = x["lastUpdated"] is DBNull ? null : (DateTime?)x["lastUpdated"],
                    IsDoubleIn = Convert.ToInt32(x["isDoubleIn"]),
                    SecondDestinationLocation = x["secondDestinationLocation"] is DBNull ? null : x["secondDestinationLocation"].ToString()

                }).OrderByDescending(t => t.Created).ToList(), "成功");
            }
            catch (Exception ex)
            {
                return BllResultFactory.Error<List<TaskEntity>>(null, "获取任务出现异常:" + ex.ToString());
            }
        }

        public virtual BllResult SendTaskToWCS(int id)
        {
            try
            {
                var tasks = GetTasks(null, id.ToString(), null, null, null);
                if (!tasks.Success)
                {
                    return BllResultFactory.Error(null, "未找到任务");
                }
                var task = tasks.Data[0];
                if (task.LastStatus != 0)
                {
                    return BllResultFactory.Error(null, "任务状态不允许下发");
                }
                string sql = "update task set lastStatus = 10,firstStatus=10 where id = " + id;
                int i = MySqlHelper.ExecuteNonQuery(AppCommon.ConnectionString, sql);
                if (i > 0)
                {
                    return BllResultFactory.Sucess(null, "成功");
                }
                else
                {
                    return BllResultFactory.Error(null, "更新失败");
                }
            }
            catch (Exception ex)
            {
                return BllResultFactory.Error(null, "更新出现异常:" + ex.ToString());
            }
        }

        /// <summary>
        /// 创建任务
        /// </summary>
        /// <param name="palletCode"></param>
        /// <param name="station"></param>
        /// <param name="sourceLocation"></param>
        /// <param name="destinationLocation"></param>
        /// <param name="status"></param>
        /// <param name="type"></param>
        /// <param name="priority"></param>
        /// <returns>注意,任务实体没有返回</returns>
        public BllResult<TaskEntity> CreatTask(string palletCode, int station, string sourceLocation, string destinationLocation, int status, int type, int priority)
        {
            MySqlConnection mySqlConnection = new MySqlConnection(AppCommon.ConnectionString);
            MySqlTransaction tran = null;
            try
            {
                //检查参数
                if (!String.IsNullOrEmpty(palletCode))
                {
                    //校验托盘,查看托盘是否存在任务未完成
                    int result = Convert.ToInt32(MySqlHelper.ExecuteScalar(AppCommon.ConnectionString, "SELECT count(*) from task where containerCode = @pallet and `lastStatus`<40 and warehouseId= @warehouseId", new MySqlParameter("@pallet", palletCode), new MySqlParameter("@warehouseId", AppCommon.WarehouseId)));
                    if (result > 0)
                    {
                        return BllResultFactory.Error<TaskEntity>(null, "托盘已存在任务");
                    }
                }
                if (type == 100 || type == 500 || type == 800)
                {
                    if (String.IsNullOrEmpty(destinationLocation))
                    {
                        return BllResultFactory.Error<TaskEntity>(null, "对于整盘入库、空盘入库和移库目标库位不能为空");
                    }
                    else if (String.IsNullOrEmpty(palletCode))
                    {
                        return BllResultFactory.Error<TaskEntity>(null, "对于整盘入库、空盘入库和移库托盘号不能为空");
                    }
                    else
                    {
                        var temp = CheckLocationForCreateTaskIn(destinationLocation, AppCommon.WarehouseId);
                        if (!temp.Success)
                        {
                            return temp;
                        }
                    }
                }
                if (type == 200 || type == 300 || type == 400 || type==900 || type == 600 || type == 700 || type == 800)
                {
                    if (String.IsNullOrEmpty(sourceLocation))
                    {
                        return BllResultFactory.Error<TaskEntity>(null, "对于补充入库、整盘出库、分拣出库、空盘出库、出库查看、盘点和移库源库位不能为空");
                    }
                    else
                    {
                        //校验库位
                        var temp = GetAllLocations(null, null, null, null, null, null, sourceLocation);
                        if (!temp.Success)
                        {
                            return BllResultFactory.Error<TaskEntity>(null, "未找到" + sourceLocation);
                        }
                        var location = temp.Data[0];
                        if (location.Status != "empty")
                        {
                            return BllResultFactory.Error<TaskEntity>(null, sourceLocation + "非空闲");
                        }
                        if (string.IsNullOrEmpty(location.ContainerCode))
                        {
                            return BllResultFactory.Error<TaskEntity>(null, sourceLocation + "没有托盘");
                        }
                        if (string.IsNullOrEmpty(palletCode))
                        {
                            palletCode = location.ContainerCode;
                        }
                        else
                        {
                            if (palletCode != location.ContainerCode)
                            {
                                return BllResultFactory.Error<TaskEntity>(null, sourceLocation + "库位托盘为" + location.ContainerCode + "与录入的" + palletCode + "不一致");
                            }
                        }

                    }
                }
                mySqlConnection.Open();
                tran = mySqlConnection.BeginTransaction();
                string sql = "insert into task(containerCode,station,sourceLocation,destinationLocation,lastStatus,firstStatus,type,priority,warehouseId,warehouseCode,created,createdBy) " +
                    " VALUES(@pallet, @station, @sourceLocation, @destinationLocation, @lastStatus,@firstStatus, @type, @priority, @warehouseId,@warehouseCode, NOW(),@createdBy)";
                List<MySqlParameter> mySqlParameters = new List<MySqlParameter>();
                mySqlParameters.Add(new MySqlParameter("@pallet", palletCode));
                mySqlParameters.Add(new MySqlParameter("@station", station));
                mySqlParameters.Add(new MySqlParameter("@sourceLocation", sourceLocation));
                mySqlParameters.Add(new MySqlParameter("@destinationLocation", destinationLocation));
                mySqlParameters.Add(new MySqlParameter("@lastStatus", status));
                mySqlParameters.Add(new MySqlParameter("@firstStatus", status));
                mySqlParameters.Add(new MySqlParameter("@type", type));
                mySqlParameters.Add(new MySqlParameter("@priority", priority));
                mySqlParameters.Add(new MySqlParameter("@warehouseId", AppCommon.WarehouseId));
                mySqlParameters.Add(new MySqlParameter("@createdBy", AppCommon.User.UserName));
                mySqlParameters.Add(new MySqlParameter("@warehouseCode", AppCommon.WarehouseCode));
                int i = MySqlHelper.ExecuteNonQuery(mySqlConnection, sql, mySqlParameters.ToArray());
                if (i == 1)
                {
                    if (type == 100 || type == 500 || type == 800)
                    {
                        var temp = UpdateLocationStatus(destinationLocation, AppCommon.WarehouseId, "lock", mySqlConnection);
                        if (!temp.Success)
                        {
                            tran.Rollback();
                            return BllResultFactory.Sucess<TaskEntity>(null, "创建任务失败,更新货位状态失败");
                        }
                    }
                    if (type == 200 || type == 300 || type == 400 || type == 900 || type == 600 || type == 700 || type == 800)
                    {
                        var temp = UpdateLocationStatus(sourceLocation, AppCommon.WarehouseId, "lock", mySqlConnection);
                        if (!temp.Success)
                        {
                            tran.Rollback();
                            return BllResultFactory.Sucess<TaskEntity>(null, "创建任务失败,更新货位状态失败");
                        }
                    }
                    //更新货位状态为预定
                    tran.Commit();
                    return BllResultFactory.Sucess<TaskEntity>(null, "成功");
                }
                else
                {
                    tran.Rollback();
                    return BllResultFactory.Error<TaskEntity>(null, "插入任务失败");
                }
            }
            catch (Exception ex)
            {
                tran?.Rollback();
                return BllResultFactory.Error<TaskEntity>(null, "出现异常:" + ex.ToString());
            }
            finally
            {
                mySqlConnection.Close();
                mySqlConnection.Dispose();
            }
        }

        public BllResult<TaskEntity> CheckLocationForCreateTaskIn(String code, int warehouseId)
        {
            //校验库位
            var ds = MySqlHelper.ExecuteDataset(AppCommon.ConnectionString, "SELECT * from location where `code` = @code and warehouseId = @warehouseId", new MySqlParameter("@code", code), new MySqlParameter("@warehouseId", AppCommon.WarehouseId));
            if (ds == null || ds.Tables.Count == 0 || ds.Tables[0].Rows.Count == 0)
            {
                return BllResultFactory.Error<TaskEntity>(null, "没有找到库位");
            }
            var dr = ds.Tables[0].AsEnumerable().FirstOrDefault();
            if (dr["status"].ToString() != "empty")
            {
                return BllResultFactory.Error<TaskEntity>(null, "目标库位非空闲");
            }
            if (!String.IsNullOrEmpty(dr["containerCode"].ToString()))
            {
                return BllResultFactory.Error<TaskEntity>(null, "目标库位已有货,请不要重入");
            }
            return BllResultFactory.Sucess<TaskEntity>(null, "OK");
        }

        public BllResult SetTaskStatus(int taskId, int status)
        {
            try
            {
                string sql = "update task set lastStatus =" + status + ",firstStatus=" + status + " where id =" + taskId;
                int i = MySqlHelper.ExecuteNonQuery(AppCommon.ConnectionString, sql);
                if (i > 0)
                {
                    return BllResultFactory.Sucess(null, "更新成功");
                }
                else
                {
                    return BllResultFactory.Error(null, "更新失败");
                }
            }
            catch (Exception ex)
            {
                return BllResultFactory.Error(null, "更新出现异常:" + ex.ToString());
            }

        }

        /// <summary>
        /// 更新货位状态
        /// </summary>
        /// <param name="locationCode"></param>
        /// <param name="warehouseId"></param>
        /// <param name="newStatus"></param>
        /// <returns></returns>
        public BllResult<int> UpdateLocationStatus(String locationCode, int warehouseId, String newStatus, MySqlConnection mySqlConnection)
        {
            string sql = "update location set `status` = @status where code = @code;";
            List<MySqlParameter> mySqlParameters = new List<MySqlParameter>();
            mySqlParameters.Add(new MySqlParameter("@status", newStatus));
            mySqlParameters.Add(new MySqlParameter("@code", locationCode));
            //mySqlParameters.Add(new MySqlParameter("@warehouseId", warehouseId));
            int i = MySqlHelper.ExecuteNonQuery(mySqlConnection, sql, mySqlParameters.ToArray());
            if (i != 1)
            {
                return BllResultFactory.Error<int>(0, "失败");
            }
            else
            {
                return BllResultFactory.Sucess<int>(0, "成功");
            }
        }

        /// <summary>
        /// 更新货位状态
        /// </summary>
        /// <param name="locationCode"></param>
        /// <param name="warehouseId"></param>
        /// <param name="newStatus"></param>
        /// <returns></returns>
        public BllResult<int> UpdateLocationStatus(String locationCode, int warehouseId, String newStatus, String mySqlConnection)
        {
            string sql = "update location set `status` = @status where code = @code;";
            List<MySqlParameter> mySqlParameters = new List<MySqlParameter>();
            mySqlParameters.Add(new MySqlParameter("@status", newStatus));
            mySqlParameters.Add(new MySqlParameter("@code", locationCode));
            //mySqlParameters.Add(new MySqlParameter("@warehouseId", warehouseId));
            int i = MySqlHelper.ExecuteNonQuery(mySqlConnection, sql, mySqlParameters.ToArray());
            if (i != 1)
            {
                return BllResultFactory.Error<int>(0, "失败");
            }
            else
            {
                return BllResultFactory.Sucess<int>(0, "成功");
            }
        }

        /// <summary>
        /// 完成任务
        /// todo:事物管理
        /// </summary>
        /// <param name="task"></param>
        public virtual BllResult CompleteTask(string taskId)
        {
            try
            {
                var tasks = GetTasks(null, taskId, null, null, null);
                if (!tasks.Success)
                {
                    return BllResultFactory.Error(null, "未找到任务");
                }
                var task = tasks.Data[0];
                if (task.LastStatus == 40)
                {
                    return BllResultFactory.Error(null, "任务已完成请不要重复完成");
                }
                //入库任务将托盘更新到货位上、更新任务状态、更新货位状态
                //整入、空入
                if (task.Type == 100 || task.Type == 500)
                {
                    //更新货位状态为空闲
                    var location = GetAllLocations(null, null, null, null, null, null, task.DestinationLocation).Data[0];
                    var temp = UpdateLocationStatus(location.Code, task.WarehouseId, "empty", AppCommon.ConnectionString);
                    if (task.IsDoubleIn == 1)
                    {
                        //
                        UpdateLocationStatus(task.SecondDestinationLocation, task.WarehouseId, "empty", AppCommon.ConnectionString);
                        SetLocationPallet(task.SecondDestinationLocation, task.ContainerCode);
                    }
                    else
                    {
                        //更新托盘到货位上
                        SetLocationPallet(location.Code, task.ContainerCode);
                    }
                    //更新任务状态
                    SetTaskStatus(task.Id, 40);
                }
                //补入、分拣、盘点
                if (task.Type == 200 || task.Type == 400 || task.Type == 900 || task.Type == 700)
                {
                    //更新货位状态为空闲
                    var location = GetAllLocations(null, null, null, null, null, null, task.SourceLocation).Data[0];
                    var temp = UpdateLocationStatus(location.Code, task.WarehouseId, "empty", AppCommon.ConnectionString);
                    if (task.IsDoubleIn == 1)
                    {
                        UpdateLocationStatus(task.SecondDestinationLocation, task.WarehouseId, "empty", AppCommon.ConnectionString);
                        SetLocationPallet(task.SecondDestinationLocation, task.ContainerCode);
                        //清除原来货位上的托盘
                        SetLocationPallet(location.Code, "");
                    }
                    else
                    {
                        //更新托盘到货位上
                        SetLocationPallet(location.Code, task.ContainerCode);
                    }
                    //更新任务状态
                    SetTaskStatus(task.Id, 40);
                }
                if (task.Type == 300 || task.Type == 600)
                {
                    //整出、空出
                    //更新货位状态为空闲
                    var location = GetAllLocations(null, null, null, null, null, null, task.SourceLocation).Data[0];
                    var temp = UpdateLocationStatus(location.Code, task.WarehouseId, "empty", AppCommon.ConnectionString);
                    //清理货位上托盘
                    SetLocationPallet(location.Code, "");
                    //更新任务状态
                    SetTaskStatus(task.Id, 40);
                }
                if (task.Type == 800)
                {
                    //更新货位状态为空闲
                    var location = GetAllLocations(null, null, null, null, null, null, task.SourceLocation).Data[0];
                    var location2 = GetAllLocations(null, null, null, null, null, null, task.DestinationLocation).Data[0];
                    var temp = UpdateLocationStatus(location.Code, task.WarehouseId, "empty", AppCommon.ConnectionString);
                    var temp2 = UpdateLocationStatus(location2.Code, task.WarehouseId, "empty", AppCommon.ConnectionString);
                    //清理货位上托盘
                    SetLocationPallet(location.Code, "");
                    if (task.IsDoubleIn == 1)
                    {
                        UpdateLocationStatus(task.SecondDestinationLocation, task.WarehouseId, "empty", AppCommon.ConnectionString);
                        SetLocationPallet(task.SecondDestinationLocation, task.ContainerCode);
                    }
                    else
                    {
                        //新增目标货位上的托盘
                        SetLocationPallet(location2.Code, task.ContainerCode);
                    }
                    //更新任务状态
                    SetTaskStatus(task.Id, 40);
                }
                return BllResultFactory.Sucess(null, "完成任务成功");
            }
            catch (Exception ex)
            {
                return BllResultFactory.Error(null, "完成任务发生异常:" + ex.ToString());
            }

        }

        /// <summary>
        /// 删除任务,只有生成未执行的任务可以删除
        /// </summary>
        /// <param name="taskId"></param>
        /// <returns></returns>
        public BllResult DeleteTask(int taskId)
        {
            try
            {
                var tasks = GetTasks(null, taskId.ToString(), null, null, null);
                if (!tasks.Success)
                {
                    return BllResultFactory.Error(null, "未找到任务");
                }
                var task = tasks.Data[0];
                if (task.LastStatus != 0)
                {
                    return BllResultFactory.Error(null, "任务状态不允许删除");
                }
                string sql = "DELETE from task where id = " + taskId;
                int i = MySqlHelper.ExecuteNonQuery(AppCommon.ConnectionString, sql);
                if (i > 0)
                {
                    return BllResultFactory.Sucess(null, "删除成功");
                }
                else
                {
                    return BllResultFactory.Error(null, "删除失败");
                }
            }
            catch (Exception ex)
            {
                return BllResultFactory.Error(null, "删除任务出现异常:" + ex.ToString());
            }

        }

        /// <summary>
        /// 根据托盘号获取一条未完成的任务
        /// </summary>
        /// <param name="palletCode"></param>
        /// <returns></returns>
        public BllResult<TaskEntity> GetTaskUncompleteByPalletCode(string palletCode)
        {
            try
            {
                string sql = "SELECT * from task where `lastStatus`<40 and containerCode = '" + palletCode + "'";
                var ds = MySqlHelper.ExecuteDataset(AppCommon.ConnectionString, sql);
                if (ds == null || ds.Tables.Count == 0 || ds.Tables[0].Rows.Count == 0)
                {
                    return BllResultFactory.Error<TaskEntity>(null, "未找到数据");
                }
                return BllResultFactory.Sucess<TaskEntity>(ds.Tables[0].AsEnumerable().Select(x => new TaskEntity
                {
                    Id = (int)x["id"],
                    WarehouseId = Convert.ToInt32(x["warehouseId"]),
                    WarehouseCode = x["warehouseCode"]?.ToString(),
                    CompanyId = x["companyId"] is DBNull ? null : (int?)x["companyId"],
                    Priority = Convert.ToInt32(x["priority"]),
                    Type = Convert.ToInt32(x["type"]),
                    Station = x["station"] is DBNull ? null : (int?)x["station"],
                    ContainerId = x["containerId"] is DBNull ? null : (int?)x["containerId"],
                    ContainerCode = x["containerCode"]?.ToString(),
                    SourceLocation = x["sourceLocation"]?.ToString(),
                    DestinationLocation = x["destinationLocation"]?.ToString(),
                    LastStatus = Convert.ToInt32(x["lastStatus"]),
                    Created = x["created"] is DBNull ? null : (DateTime?)x["created"],
                    CreatedBy = x["createdBy"]?.ToString(),
                    BeginTime = x["beginTime"] is DBNull ? null : (DateTime?)x["beginTime"],
                    EndTime = x["endTime"] is DBNull ? null : (DateTime?)x["endTime"],
                    LastUpdated = x["lastUpdated"] is DBNull ? null : (DateTime?)x["lastUpdated"],
                }).OrderByDescending(t => t.Created).ToList()[0], "成功");
            }
            catch (Exception ex)
            {
                return BllResultFactory.Error<TaskEntity>(null, "获取数据出现异常:" + ex.ToString());
            }
        }

        /// <summary>
        /// todo:根据空托盘创建一条空托盘入库任务,暂时不实现
        /// </summary>
        /// <param name="palletCode"></param>
        /// <returns></returns>
        public BllResult CreatePalletIn(string palletCode)
        {
            return null;
        }

        #endregion

        #region Device

        public BllResult<List<DeviceEntity>> GetAllDevice()
        {
            try
            {
                string sql = "select * from devicelist where enable = 1";
                var ds = MySqlHelper.ExecuteDataset(AppCommon.ConnectionString, sql);
                if (ds == null || ds.Tables.Count == 0 || ds.Tables[0].Rows.Count == 0)
                {
                    return BllResultFactory.Error<List<DeviceEntity>>(null, "没有数据");
                }
                var list = ds.Tables[0].AsEnumerable().Select(t => new DeviceEntity
                {
                    Id = (int)t["id"],
                    Code = t["code"].ToString(),
                    Name = t["name"].ToString(),
                    Type = (int)t["type"],
                    IP = t["ip"].ToString(),
                    S7_Connect = t["S7_Connect"].ToString(),
                    GroupName = t["groupName"].ToString(),
                    Enable = Convert.ToBoolean(t["enable"]),
                    DeviceTypeId = (int)t["deviceTypeId"],
                    Roadway = t["roadway"] is DBNull ? -1 : Convert.ToInt32(t["roadway"]),
                    SelfAddress = t["selfAddress"] is DBNull ? -1 : Convert.ToInt32(t["selfAddress"]),
                    BackAddress = t["backAddress"] is DBNull ? null : t["backAddress"].ToString()
                }).ToList();
                return BllResultFactory.Sucess<List<DeviceEntity>>(list, "成功");

            }
            catch (Exception ex)
            {
                return BllResultFactory.Error<List<DeviceEntity>>(null, "异常:" + ex.ToString());
            }
        }

        public BllResult<List<DeviceAddressEntity>> GetAllDeviceAddress()
        {
            try
            {
                string sql = "select * from deviceaddress where enable = 1";
                var ds = MySqlHelper.ExecuteDataset(AppCommon.ConnectionString, sql);
                if (ds == null || ds.Tables.Count == 0 || ds.Tables[0].Rows.Count == 0)
                {
                    return BllResultFactory.Error<List<DeviceAddressEntity>>(null, "没有数据");
                }
                var list = ds.Tables[0].AsEnumerable().Select(t => new DeviceAddressEntity
                {
                    Id = (int)t["id"],
                    DeviceId = t["deviceId"] is DBNull ? null : (int?)t["deviceId"],
                    DevicePropId = t["devicePropId"] is DBNull ? null : (int?)t["devicePropId"],
                    DevicePropCode = t["devicePropCode"].ToString(),
                    ServerHandle = (int)t["serverHandle"],
                    Address = t["address"].ToString(),
                    value = t["value"].ToString(),
                    Enable = Convert.ToBoolean(t["enable"])
                }).ToList();
                return BllResultFactory.Sucess<List<DeviceAddressEntity>>(list, "成功");
            }
            catch (Exception ex)
            {
                return BllResultFactory.Error<List<DeviceAddressEntity>>(null, "异常:" + ex.ToString());
            }

        }

        public BllResult<List<DevicePropEntity>> GetAllDeviceProp()
        {
            try
            {
                string sql = "select * from deviceprop where enable=1";
                var ds = MySqlHelper.ExecuteDataset(AppCommon.ConnectionString, sql);
                if (ds == null || ds.Tables.Count == 0 || ds.Tables[0].Rows.Count == 0)
                {
                    return BllResultFactory.Error<List<DevicePropEntity>>(null, "没有数据");
                }
                var list = ds.Tables[0].AsEnumerable().Select(t => new DevicePropEntity
                {
                    Id = (int)t["id"],
                    DeviceTypeId = (int)t["deviceTypeId"],
                    Code = t["code"].ToString(),
                    Name = t["name"].ToString(),
                    Type = t["type"].ToString(),
                    Description = t["description"].ToString(),
                    Enable = Convert.ToBoolean(t["enable"]),
                    IsMonitor = t["isMonitor"] is DBNull ? null : (int?)t["isMonitor"],
                    MonitorCompareValue = t["monitorCompareValue"] is DBNull ? null : t["monitorCompareValue"].ToString(),
                    MonitorFailure = t["monitorFailure"] is DBNull ? null : t["monitorFailure"].ToString(),
                    MonitorNormal = t["monitorNormal"] is DBNull ? null : t["monitorNormal"].ToString(),

                }).ToList();
                return BllResultFactory.Sucess<List<DevicePropEntity>>(list, "成功");
            }
            catch (Exception ex)
            {
                return BllResultFactory.Error<List<DevicePropEntity>>(null, "异常:" + ex.ToString());
            }
        }

        public BllResult<List<DeviceTypeEntity>> GetAllDeviceType()
        {
            try
            {
                string sql = "select * from devicetype where enable=1";
                var ds = MySqlHelper.ExecuteDataset(AppCommon.ConnectionString, sql);
                if (ds == null || ds.Tables.Count == 0 || ds.Tables[0].Rows.Count == 0)
                {
                    return BllResultFactory.Error<List<DeviceTypeEntity>>(null, "没有数据");
                }
                var list = ds.Tables[0].AsEnumerable().Select(t => new DeviceTypeEntity
                {
                    Id = (int)t["id"],
                    Code = t["code"].ToString(),
                    Name = t["name"].ToString(),
                    Description = t["description"].ToString(),
                    Enable = Convert.ToBoolean(t["enable"])
                }).ToList();
                return BllResultFactory.Sucess<List<DeviceTypeEntity>>(list, "成功");
            }
            catch (Exception ex)
            {
                return BllResultFactory.Error<List<DeviceTypeEntity>>(null, "异常:" + ex.ToString());
            }
        }

        #endregion

        #region location

        public BllResult SetLocationPallet(string locationCode, string palletCode)
        {
            try
            {
                if (String.IsNullOrEmpty(locationCode) || palletCode == null)
                {
                    return BllResultFactory.Error(null, "参数不全");
                }
                string sql = "update location set containerCode ='" + palletCode + "' where code ='" + locationCode + "'";
                int i = MySqlHelper.ExecuteNonQuery(AppCommon.ConnectionString, sql);
                if (i > 0)
                {
                    return BllResultFactory.Sucess(null, "更新成功");
                }
                else
                {
                    return BllResultFactory.Error(null, "更新失败");
                }
            }
            catch (Exception ex)
            {
                return BllResultFactory.Error(null, "更新出现异常:" + ex.ToString());
            }
        }

        public BllResult<List<LocationEntity>> GetAllLocations(String containerCode, string row, string column, string layer, string roadway, string status, string code)
        {
            try
            {
                string sql = "select * from location where 1=1 ";
                if (!String.IsNullOrEmpty(containerCode))
                {
                    sql += " and containerCode = '" + containerCode + "'";
                }
                if (!String.IsNullOrEmpty(row))
                {
                    sql += " and row =" + row;
                }
                if (!String.IsNullOrEmpty(column))
                {
                    sql += " and line =" + column;
                }
                if (!String.IsNullOrEmpty(layer))
                {
                    sql += " and layer =" + layer;
                }
                if (!String.IsNullOrEmpty(roadway))
                {
                    sql += " and roadway =" + roadway;
                }
                if (!String.IsNullOrEmpty(status) && status != "all")
                {
                    sql += " and status = '" + status + "'";
                }
                if (!String.IsNullOrEmpty(code))
                {
                    sql += " and code ='" + code + "'";
                }

                var ds = MySqlHelper.ExecuteDataset(AppCommon.ConnectionString, sql);
                if (ds == null || ds.Tables.Count == 0 || ds.Tables[0].Rows.Count == 0)
                {
                    return BllResultFactory.Error<List<LocationEntity>>(null, "没有数据");
                }

                var list = ds.Tables[0].AsEnumerable().Select(t => new LocationEntity
                {
                    Id = (int)t["id"],
                    Code = t["code"].ToString(),
                    WarehouseCode = t["warehouseCode"].ToString(),
                    Row = Convert.ToInt32(t["row"]),
                    Line = Convert.ToInt32(t["line"]),
                    Layer = Convert.ToInt32(t["layer"]),
                    Grid = t["grid"] is DBNull ? 0 : Convert.ToInt32(t["grid"]),
                    Roadway = (int)t["roadway"],
                    ContainerCode = t["containerCode"] is DBNull ? "" : t["containerCode"].ToString(),
                    Status = t["status"].ToString()
                }).ToList();
                return BllResultFactory.Sucess<List<LocationEntity>>(list, "成功");
            }
            catch (Exception ex)
            {
                return BllResultFactory.Error<List<LocationEntity>>(null, "访问异常:" + ex.ToString());
            }
        }

        #endregion

        #region pallet

        public BllResult<List<ContainerEntity>> GetAllContainer(string code, bool isInLocation, bool isPrint)
        {
            try
            {
                string sql = "select * from container t where 1=1 ";
                if (!String.IsNullOrEmpty(code))
                {
                    sql += " and t.code = '" + code + "'";
                }
                if (isPrint)
                {
                    sql += " and t.printCount > 0";
                }
                if (isInLocation)
                {
                    sql += " and EXISTS(SELECT * from location where containerCode = t.`code`);";
                }
                var ds = MySqlHelper.ExecuteDataset(AppCommon.ConnectionString, sql);
                if (ds == null || ds.Tables.Count == 0 || ds.Tables[0].Rows.Count == 0)
                {
                    return BllResultFactory.Error<List<ContainerEntity>>(null, "没有数据");
                }
                var list = ds.Tables[0].AsEnumerable().Select(t => new ContainerEntity
                {
                    Id = (int)t["id"],
                    Code = t["code"].ToString(),
                    Status = t["status"] is DBNull ? "" : t["status"].ToString(),
                    PrintCount = (int)t["printCount"],
                    Enable = Convert.ToBoolean(t["enable"])
                }).ToList();
                return BllResultFactory.Sucess<List<ContainerEntity>>(list, "成功");
            }
            catch (Exception ex)
            {
                return BllResultFactory.Error<List<ContainerEntity>>(null, "访问异常:" + ex.ToString());
            }

        }

        /// <summary>
        /// todo: 托盘添加
        /// </summary>
        /// <param name="code"></param>
        /// <param name="warehouseCode"></param>
        /// <param name="warehouseId"></param>
        /// <param name="containerTypeId"></param>
        /// <returns></returns>
        public BllResult CreateContainer(string code, string warehouseCode, int warehouseId, int containerTypeId)
        {
            try
            {
                string sql = $"insert into container(code ,warehouseId,warehouseCode,containerTypeId,status) values ('{code}',{warehouseId},'{warehouseCode}',{containerTypeId},1)";
                int i = MySqlHelper.ExecuteNonQuery(AppCommon.ConnectionString, sql);
                if (i == 0)
                {
                    return BllResultFactory.Error(null, "插入失败");
                }
                else
                {
                    return BllResultFactory.Sucess(null, "插入成功");
                }
            }
            catch (Exception ex)
            {
                return BllResultFactory.Error(null, "异常:" + ex.ToString());
            }
        }

        public BllResult UpdatePallet(string code, string print, string status)
        {
            try
            {
                if (String.IsNullOrEmpty(print) && String.IsNullOrEmpty(status))
                {
                    return BllResultFactory.Error(null, "数据不全");
                }
                string sql = "update container set ";
                bool flag = false;
                if (!String.IsNullOrEmpty(print))
                {
                    sql += "printCount = printCount+" + print;
                    flag = true;
                }
                if (!String.IsNullOrEmpty(status))
                {
                    if (flag)
                    {
                        sql += ", ";
                    }
                    sql += "`status` = '" + status + "'";
                }
                sql += " where code ='" + code + "'";
                int i = MySqlHelper.ExecuteNonQuery(AppCommon.ConnectionString, sql);
                if (i > 0)
                {
                    return BllResultFactory.Sucess(null, "成功");
                }
                else
                {
                    return BllResultFactory.Error(null, "更新失败");
                }
            }
            catch (Exception ex)
            {
                return BllResultFactory.Error(null, "更新打印次数出现异常:" + ex.ToString());
            }

        }

        #endregion

        #region 字符串和Byte之间的转化
        /// <summary>
        /// 数字和字节之间互转
        /// </summary>
        /// <param name="num"></param>
        /// <returns></returns>
        public int IntToBitConverter(int num)
        {
            int temp = 0;
            byte[] bytes = BitConverter.GetBytes(num);//将int32转换为字节数组
            temp = BitConverter.ToInt32(bytes, 0);//将字节数组内容再转成int32类型
            return temp;
        }

        /// <summary>
        /// 将字符串转为16进制字符,允许中文
        /// </summary>
        /// <param name="s"></param>
        /// <param name="encode"></param>
        /// <returns></returns>
        public string StringToHexString(string s, Encoding encode, string spanString)
        {
            byte[] b = encode.GetBytes(s);//按照指定编码将string编程字节数组
            string result = string.Empty;
            for (int i = 0; i < b.Length; i++)//逐字节变为16进制字符
            {
                result += Convert.ToString(b[i], 16) + spanString;
            }
            return result;
        }
        /// <summary>
        /// 将16进制字符串转为字符串
        /// </summary>
        /// <param name="hs"></param>
        /// <param name="encode"></param>
        /// <returns></returns>
        public string HexStringToString(string hs, Encoding encode)
        {
            string strTemp = "";
            byte[] b = new byte[hs.Length / 2];
            for (int i = 0; i < hs.Length / 2; i++)
            {
                strTemp = hs.Substring(i * 2, 2);
                b[i] = Convert.ToByte(strTemp, 16);
            }
            //按照指定编码将字节数组变为字符串
            return encode.GetString(b);
        }
        /// <summary>
        /// byte[]转为16进制字符串
        /// </summary>
        /// <param name="bytes"></param>
        /// <returns></returns>
        public string ByteToHexStr(byte[] bytes)
        {
            string returnStr = "";
            if (bytes != null)
            {
                for (int i = 0; i < bytes.Length; i++)
                {
                    returnStr += bytes[i].ToString("X2");
                }
            }
            return returnStr;
        }
        /// <summary>
        /// 将16进制的字符串转为byte[]
        /// </summary>
        /// <param name="hexString"></param>
        /// <returns></returns>
        public byte[] StrToHexByte(string hexString)
        {
            hexString = hexString.Replace(" ", "");
            if ((hexString.Length % 2) != 0)
                hexString += " ";
            byte[] returnBytes = new byte[hexString.Length / 2];
            for (int i = 0; i < returnBytes.Length; i++)
                returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16);
            return returnBytes;
        }

        public string ASCIIToString(short[] ints)
        {
            String str = "";
            foreach (var item in ints)
            {
                str += Chr(item);
            }
            return str;
        }

        public string Chr(int asciiCode)
        {
            if (asciiCode >= 0 && asciiCode <= 255)
            {
                System.Text.ASCIIEncoding asciiEncoding = new System.Text.ASCIIEncoding();
                byte[] byteArray = new byte[] { (byte)asciiCode };
                string strCharacter = asciiEncoding.GetString(byteArray);
                return (strCharacter);
            }
            else
            {
                throw new Exception("ASCII Code is not valid.");
            }
        }

        public byte[] StringToASCII(string str)
        {
            System.Text.ASCIIEncoding asciiEncoding = new System.Text.ASCIIEncoding();
            return asciiEncoding.GetBytes(str.PadRight(20, ' '));
        }

        public short Asc(string character)
        {
            if (character.Length == 1)
            {
                System.Text.ASCIIEncoding asciiEncoding = new System.Text.ASCIIEncoding();
                short intAsciiCode = (short)asciiEncoding.GetBytes(character)[0];
                return (intAsciiCode);
            }
            else
            {
                throw new Exception("Character is not valid.");
            }

        }


        #endregion

        #region Common

        public BllResult HeartBeat()
        {
            return BllResultFactory.Sucess(null, "默认实现");
        }


        #endregion
    }
}