using Model.ModelDto.DataDto;
using SqlSugar;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using WMS.DAL;
using WMS.Entity.BllCheckEntity;
using WMS.Entity.Context;
using WMS.Entity.DataEntity;
using WMS.Entity.SysEntity;
using WMS.IBLL.IBllCheckServer;

namespace WMS.BLL.BllCheckServer
{
    public class StockFreectSetve : DbHelper<BllStockCheck>, IStockFreectSetve
    {
        private static readonly SqlSugarScope Db = DataContext.Db;
        public StockFreectSetve() : base(Db)
        {
        }

        #region 冻结\解冻

        public List<DataStock> ByTypeGetDataStockType(string SkuNo, int type)
        {
            try
            {
                var list = Db.Queryable<DataStock>().Where(a => a.IsDel == "0" && a.SkuNo != "100099" && type == 1 ? (a.Qty - a.LockQty - a.FrozenQty) > 0 : type == 2 ? a.FrozenQty > 0 : a.Id < 0).ToList();
                //var sku = Db.Queryable<SysMaterials>().WhereIF(!string.IsNullOrWhiteSpace(SkuNo), a => a.SkuNo.Contains(SkuNo)).Where(a => list.Contains(a.SkuNo)).ToList();

                return list;
            }
            catch (Exception ex)
            {

                throw ex;
            }
        }

        /// <summary>
        /// 获取库存冻结信息
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public List<FreezeUnfreezeInfoDto> GetDataFreezeList(FreezeUnfreezeInfoDto model)
        {
            try
            {
                string str = "select info.SkuNo,info.SkuName,info.LotNo,info.LotText,info.SupplierLot,info.Qty,info.FrozenQty,info.Demo,info.status,info.Standard,info.Type,info.CreateTime,users.UserName from DataFreezeUnfreezeInfo info left join SysUserInfor users on info.CreateUser = users.Id where info.IsDel = '0' and users.IsDel = '0' and info.Status = 1";
                #region 验证条件
                //验证物料号是否为空
                if (!string.IsNullOrWhiteSpace(model.SkuNo))
                {
                    str += $" and info.SkuNo like '%{model.SkuNo}%'";
                }
                //验证物料名称是否为空
                if (!string.IsNullOrWhiteSpace(model.SkuName))
                {
                    str += $" and info.SkuName like '%{model.SkuName}%'";
                }
                //验证批次是否为空
                if (!string.IsNullOrWhiteSpace(model.LotNo))
                {
                    str += $" and info.LotNo like '%{model.LotNo}%'";
                }
                // 验证类型是否为空
                if (!string.IsNullOrWhiteSpace(model.Type))
                {
                    str += $" and info.Type = '{model.Type}'";
                }
                // 验证原因是否为空
                if (!string.IsNullOrWhiteSpace(model.Demo))
                {
                    str += $" and info.Demo = '{model.Demo}'";
                }
                //验证结束时间是否为空
                if (!string.IsNullOrWhiteSpace(model.StartTime))
                {
                    str += $" and info.CreateTime < '{model.StartTime}'";
                }
                //验证结束时间是否为空
                if (!string.IsNullOrWhiteSpace(model.EndTime))
                {
                    model.EndTime = (DateTime.Parse(model.EndTime).AddDays(1)).ToString();
                    str += $" and info.CreateTime < '{model.EndTime}'";
                }
                #endregion

                List<FreezeUnfreezeInfoDto> list = Db.Ado.SqlQuery<FreezeUnfreezeInfoDto>(str);
                return list;

            }
            catch (Exception ex)
            {

                throw ex;
            }
        }

        /// <summary>
        /// 获取库存解冻信息
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public List<FreezeUnfreezeInfoDto> GetDataUnFreezeList(FreezeUnfreezeInfoDto model)
        {
            try
            {
                string str = "select info.SkuNo,info.SkuName,info.LotNo,info.LotText,info.SupplierLot,info.Qty,info.FrozenQty,info.Demo,info.status,info.Standard,info.Type,info.CreateTime,users.UserName from DataFreezeUnfreezeInfo info left join SysUserInfor users on info.CreateUser = users.Id where info.IsDel = '0' and users.IsDel = '0' and info.Status = 2";

                #region 验证条件
                //验证物料号是否为空
                if (!string.IsNullOrWhiteSpace(model.SkuNo))
                {
                    str += $" and info.SkuNo like '%{model.SkuNo}%'";
                }
                //验证物料名称是否为空
                if (!string.IsNullOrWhiteSpace(model.SkuName))
                {
                    str += $" and info.SkuName like '%{model.SkuName}%'";
                }
                //验证批次是否为空
                if (!string.IsNullOrWhiteSpace(model.LotNo))
                {
                    str += $" and info.LotNo like '%{model.LotNo}%'";
                }
                // 验证类型是否为空
                if (!string.IsNullOrWhiteSpace(model.Type))
                {
                    str += $" and info.Type = '{model.Type}'";
                }
                // 验证原因是否为空
                if (!string.IsNullOrWhiteSpace(model.Demo))
                {
                    str += $" and info.Demo = '{model.Demo}'";
                }
                //验证结束时间是否为空
                if (!string.IsNullOrWhiteSpace(model.StartTime))
                {
                    str += $" and info.CreateTime < '{model.StartTime}'";
                }
                //验证结束时间是否为空
                if (!string.IsNullOrWhiteSpace(model.EndTime))
                {
                    model.EndTime = (DateTime.Parse(model.EndTime).AddDays(1)).ToString();
                    str += $" and info.CreateTime < '{model.EndTime}'";
                }
                #endregion

                var list = Db.Ado.SqlQuery<FreezeUnfreezeInfoDto>(str);
                return list;
            }
            catch (Exception ex)
            {

                throw ex;
            }
        }

        /// <summary>
        /// 添加冻结\解冻信息
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public string InsertDataFreezeInfo(FreezeUnfreezeInfoDto model)
        {
            try
            {
                string errStr = "";
                var TimeStr = Db.GetDate();
                //验证批次与物料是否为异常
                var stock = Db.Queryable<DataStock>().First(a => a.IsDel == "0" && a.LotNo == model.LotNo && a.SkuNo == model.SkuNo);
                //当前物料或批次存在异常
                if (stock == null)
                {
                    errStr = "-1:当前物料或批次存在异常!";
                    return errStr;
                }
                //验证物料信息是否存在异常
                var sku = Db.Queryable<SysMaterials>().First(a => a.IsDel == "0" && a.SkuNo == model.SkuNo);
                if (sku == null)
                {
                    errStr = "-1:当前物料信息存在异常!";
                    return errStr;
                }
                //冻结
                if (model.Status == 1)
                {
                    //验证冻结数量是否小于当前库存-锁定-冻结数量
                    if (model.FrozenQty <= 0)
                    {
                        errStr = "-1:当前想要冻结的数量不可为0!";
                        return errStr;
                    }
                    //验证冻结数量是否小于当前库存-锁定-冻结数量
                    if (model.FrozenQty > (stock.Qty - stock.LockQty - stock.FrozenQty))
                    {
                        errStr = "-1:当前想要冻结的数量大于库存可冻结数量!";
                        return errStr;
                    }
                    //验证原因是否为空
                    if (string.IsNullOrWhiteSpace(model.Demo))
                    {
                        errStr = "-1:冻结原因不可为空!";
                        return errStr;
                    }
                    

                }
                // 解冻
                else if (model.Status == 2)
                {
                    //验证冻结数量是否小于当前库存-锁定-冻结数量
                    if (model.FrozenQty <= 0)
                    {
                        errStr = "-1:当前想要冻结的数量不可为0!";
                        return errStr;
                    }
                    //验证冻结数量是否小于当前库存冻结数量
                    if (model.FrozenQty > model.Qty)
                    {
                        errStr = "-1:当前想要解冻的数量必须小于库存冻结数量!";
                        return errStr;
                    }

                }

                Db.BeginTran(); //开启

                //添加冻结\解冻信息
                DataFreezeUnfreezeInfo list = new DataFreezeUnfreezeInfo()
                {
                    SkuNo = model.SkuNo, //物料编码
                    SkuName = model.SkuName, //物料名称
                    Standard = stock.Standard, //è§„æ ¼
                    Type = sku.Type, //物料类型
                    Qty = stock.Qty, //库存当前数量
                    FrozenQty = model.FrozenQty, //冻结数量
                    LotNo = stock.LotNo, //批次
                    LotText = stock.LotText, //批次描述
                    SupplierLot = stock.SupplierLot, //供货批次
                    Status = model.Status, //状态
                    Demo = model.Demo, //原因

                    IsDel = "0",
                    CreateTime = TimeStr, //æ—¶é—´
                    CreateUser = model.CreateUser, //冻结人
                };

                //修改库存信息
                if (model.Status == 1)
                {
                    stock.FrozenQty += (decimal)model.FrozenQty;
                }
                if (model.Status == 2)
                {
                    stock.FrozenQty -= (decimal)model.FrozenQty;
                }

                Db.Insertable(list).ExecuteCommand();
                Db.Updateable(stock).ExecuteCommand();


                Db.CommitTran(); //提交

                errStr = model.Status == 0 ? "添加冻结信息成功!" : "添加解冻信息成功!";
                return errStr;
            }
            catch (Exception ex)
            {
                Db.RollbackTran(); //回滚

                throw ex;
            }
        }

        #endregion
    }
}