using System;
using System.Collections.Generic;
using System.Linq;
using ChangKeTec.Wms.Models.Enums;
using CK.SCP.Models;
using CK.SCP.Models.Enums;

namespace ChangKeTec.Wms.Models.Wms
{

    public partial class TB_INSPECT
    {
        public override string ToString()
        {
            return EntitiesHelper.GetPropertiesString(this);
        }

    }

    public partial class TB_CHECK_DETAIL
    {
        public override string ToString()
        {
            return EntitiesHelper.GetPropertiesString(this);
        }
    }

    public partial class TB_PICK_FACT
    {
        public override string ToString()
        {
            return EntitiesHelper.GetPropertiesString(this);
        }

        public TB_MATERIAL_RECEIVE ToMaterialReceive(TF_PO_DETAIL poDetail)
        {


            var part = WmsCache.GetPart(PartCode);
            if (part == null)
            {
                throw new WmsException(ErrorCode.DataNotFound, PartCode, "零件号未找到");
            }
            return new TB_MATERIAL_RECEIVE
            {
                BarCode = BarCode,
                PartCode = PartCode,
                Batch = Batch,
                FromLocCode = FromLocCode,
                ToLocCode = ToLocCode,
                Qty = Qty,
                State = State,
                VendBatch = VendBatch,
                PoBillNum = poDetail.BillNum,
                PoLineNum = poDetail.LineNum,
                PoUnit = poDetail.PoUnit,
                LocUnit = part.Unit
            };
        }

        public TB_STOCK_MOVE ToStockMove()
        {
            var part = WmsCache.GetPart(PartCode);
            if (part == null)
            {
                throw new WmsException(ErrorCode.DataNotFound, PartCode, "零件号未找到");
            }
            return new TB_STOCK_MOVE
            {
                BillNum = BillNum,
                BarCode = BarCode,
                PartCode = PartCode,
                FromBatch = Batch,
                ToBatch = Batch,
                FromLocCode = FromLocCode,
                ToLocCode = ToLocCode,
                Qty = Qty,
                FromState = State,
                ToState = State,
                VendBatch = VendBatch,
                VendId = VendId,
                FromEqptCode = EqptCode,
                ToEqptCode = ""
            };
        }


        public TB_STOCK_MOVE ToStockMove(string  asnNumb, EnumStockState toState)
        {
            var part = WmsCache.GetPart(PartCode);
            if (part == null)
            {
                throw new WmsException(ErrorCode.DataNotFound, PartCode, "零件号未找到");
            }
            return new TB_STOCK_MOVE
            {
                BillNum= BillNum,
                BarCode = BarCode,            
                PartCode = PartCode,
                FromBatch = Batch,
                ToBatch = asnNumb,
                FromLocCode = FromLocCode,
                ToLocCode = ToLocCode,
                Qty = Qty,
                FromState = State,
                ToState = toState,
                VendBatch = VendBatch,
                VendId = VendId,
                FromEqptCode = EqptCode,
                ToEqptCode = "",
                ToBarCode = BarCode.Substring(0,BarCode.IndexOf('.')+1) + asnNumb
            };
        }


    }

    public partial class TB_PICK_INVOICE
    {
        public override string ToString()
        {
            return EntitiesHelper.GetPropertiesString(this);
        }


    }

    public partial class TB_MATERIAL_BACK
    {
        public override string ToString()
        {
            return EntitiesHelper.GetPropertiesString(this);
        }

        public TB_STOCK_MOVE ToStockMove()
        {

            return new TB_STOCK_MOVE
            {
                BarCode = BarCode,
                PartCode = PartCode,
                FromBatch = FromBatch,
                ToBatch = ToBatch,//TODO 来源批次为空批
                FromLocCode = FromLocCode,
                ToLocCode = ToLocCode,
                Qty = Qty,
                FromEqptCode = EqptCode,
                ToEqptCode = EqptCode,
                FromState = State,
                ToState = State,
                //                Unit =  WmsCache.GetUnit(this.PartCode),
                //                ProduceDate = this.ProduceDate,
                VendBatch = VendBatch,
                VendId = VendId
            };

        }
    }

    public partial class TB_MATERIAL_RETURN
    {
        public override string ToString()
        {
            return EntitiesHelper.GetPropertiesString(this);
        }

        public TS_STOCK_DETAIL ToStockDetailOut(TB_BILL bill)
        {
            return new TS_STOCK_DETAIL
            {
                BarCode = BarCode,
                PartCode = PartCode,

                Batch = Batch,
                EqptCode = EqptCode,
                LocCode = FromLocCode,
                AreaCode = WmsCache.GetAreaCode(FromLocCode),
                Qty = Qty,
                UpdateQty = -Qty, //出库更新数量为负
                VendId = bill.VendId,
                State = State,
                ProduceDate = ProduceDate,
                OverdueDate = ProduceDate.AddDays(WmsCache.GetValidateDays(PartCode)),
                VendBatch = VendBatch
            };
        }
    }

    public partial class TB_PRODUCT_REPAIR
    {
        public override string ToString()
        {
            return EntitiesHelper.GetPropertiesString(this);
        }

        public TB_STOCK_MOVE ToStockMove()
        {

            return new TB_STOCK_MOVE
            {
                BarCode = BarCode,
                PartCode = PartCode,
                FromBatch = Batch,
                ToBatch = Batch,
                FromLocCode = FromLocCode,
                ToLocCode = ToLocCode,
                Qty = Qty,
                FromEqptCode = EqptCode,
                ToEqptCode = EqptCode,
                FromState = State,
                ToState = State
                //                Unit =  WmsCache.GetUnit(this.PartCode),
                //                ProduceDate = this.ProduceDate,
            };

        }

        public TS_STOCK_DETAIL ToStockDetailIn(WmsEntities db,string partcode, EnumStockState state)
        {
            var stockDetail =
                db.TS_STOCK_DETAIL.SingleOrDefault(
                    p => p.BarCode == BarCode && p.PartCode == partcode && p.LocCode == ToLocCode && p.State == State);
            if (stockDetail != null)
            {
                var detailIn = stockDetail.Clone();
                detailIn.Qty = Qty;
                detailIn.UpdateQty = Qty;
                detailIn.EqptCode = EqptCode;
                return detailIn;
            }
            return new TS_STOCK_DETAIL
            {
                BarCode = BarCode,
                PartCode = partcode,
                Batch = Batch,
                EqptCode = EqptCode,
                LocCode = ToLocCode,
                AreaCode = WmsCache.GetAreaCode(ToLocCode),
                Qty = Qty,
                UpdateQty = Qty,
                State = state,
                ReceiveDate = DateTime.Now,
                Remark = PartCode,
            };

        }
    }

 /*   public partial class TB_PRODUCT_RETURN
    {
        public override string ToString()
        {
            return EntitiesHelper.GetPropertiesString(this);
        }

        public TS_STOCK_DETAIL ToStockDetailIn(TB_BILL bill)
        {
            return new TS_STOCK_DETAIL
            {
                BarCode = BarCode,
                PartCode = PartCode,

                Batch = Batch,
                EqptCode = EqptCode,
                LocCode = ToLocCode,
                AreaCode = WmsCache.GetAreaCode(ToLocCode),
                Qty = Qty,
                UpdateQty = Qty,
                VendId = bill.VendId,
                ProduceDate = ProduceDate,
                OverdueDate = ProduceDate.AddDays(WmsCache.GetValidateDays(PartCode)),
                State = EnumStockState.隔离
            };
        }

        public TB_STOCK_MOVE ToStockMove()
        {

            return new TB_STOCK_MOVE
            {
                BarCode = BarCode,
                PartCode = PartCode,
                FromBatch = Batch,
                ToBatch = Batch,
                FromLocCode = FromLocCode,
                ToLocCode = ToLocCode,
                Qty = Qty,
                FromEqptCode = EqptCode,
                ToEqptCode = EqptCode,
                FromState = State,
                ToState = State
                //                Unit =  WmsCache.GetUnit(this.PartCode),
                //                ProduceDate = this.ProduceDate,
            };
        }
    }*/

    public partial class TB_OTHER_INOUT
    {
        public override string ToString()
        {
            return EntitiesHelper.GetPropertiesString(this);
        }

        public TS_STOCK_DETAIL ToStockDetailIn(TB_BILL bill)
        {
            var part = WmsCache.GetPart(PartCode);
            if (part == null)
            {
                throw new WmsException(ErrorCode.DataNotFound, PartCode, "零件号未找到");
            }
            return new TS_STOCK_DETAIL
            {
                BarCode = BarCode,
                PartCode = PartCode,

                Batch = Batch,
                EqptCode = EqptCode,
                LocCode = ToLocCode,
                AreaCode = WmsCache.GetAreaCode(ToLocCode),
                Qty = Qty,
                UpdateQty = Qty,
                VendId = bill.VendId,
                ProduceDate = ProduceDate,
                OverdueDate = ProduceDate.AddDays(WmsCache.GetValidateDays(PartCode)),
                State = State,
                ReceiveDate = DateTime.Now,
                VendBatch = Batch,
                Remark = Remark

            };
        }

        public TS_STOCK_DETAIL ToStockDetailOut(TB_BILL bill)
        {
            return new TS_STOCK_DETAIL
            {
                BarCode = BarCode,
                PartCode = PartCode,

                Batch = Batch,
                EqptCode = EqptCode,
                LocCode = FromLocCode,
                AreaCode = WmsCache.GetAreaCode(FromLocCode),
                Qty = Qty,
                UpdateQty = -Qty, //出库更新数量为负
                VendId = bill.VendId,
                ProduceDate = ProduceDate,
                OverdueDate = ProduceDate.AddDays(WmsCache.GetValidateDays(PartCode)),
                State = State,
                ReceiveDate = DateTime.Now,
                VendBatch = Batch

            };
        }
    }

    public partial class TA_PAYMENT_DAY
    {
        public override string ToString()
        {
            return EntitiesHelper.GetPropertiesString(this);
        }
    }

    public partial class TS_VIN_PART
    {
        public override string ToString()
        {
            return EntitiesHelper.GetPropertiesString(this);
        }



        public TB_PRODUCT_SELL ToProductSell(string erpSoNum, TS_STOCK_DETAIL detail)
        {
            return new TB_PRODUCT_SELL
            {
                SoBillNum = erpSoNum,
                BarCode = detail.BarCode + "." + CustPartCode,
                PartCode = CustPartCode,
                Batch = VinCode,
                FromLocCode = detail.LocCode,
                Qty = Qty,
                EqptCode = detail.EqptCode,
                State = VinState
            };
        }
    }

    public partial class TS_VIN_STOCK
    {
        public override string ToString()
        {
            return EntitiesHelper.GetPropertiesString(this);
        }
        public TS_VIN_STOCK Clone()
        {
            return new TS_VIN_STOCK
            {
                PartCode = PartCode,
                VinCode = VinCode,
                LocCode = LocCode,
                ProjectId = ProjectId,
                EqptCode = EqptCode,
                PlanOrderId = PlanOrderId,
                Qty = Qty,
                Amount = Amount,
                ReceiveDate = ReceiveDate,
                SendDate = SendDate,
                BalanceDate = BalanceDate,
                VinState = VinState
            };
        }

        public VinStockIn ToStockIn(decimal inQty, EnumStockState vinState)
        {
            return new VinStockIn
            {
                PartCode = PartCode,
                VinCode = VinCode,
                LocCode = LocCode,
                InQty = inQty,
                VinState = vinState,
                TemplateDetail = this
            };
        }

        public VinStockOut ToStockOut(decimal outQty)
        {
            return new VinStockOut
            {
                PartCode = PartCode,
                VinCode = VinCode,
                LocCode = LocCode,
                OutQty = outQty,
                VinState = VinState
            };
        }
    }

    public partial class TS_STOCK_DETAIL
    {
        //        public EnumStockState StockState => (EnumStockState) State;
        //
        //        public string DescStockState => EnumHelper.GetDesc(EnumStockState);

        public override string ToString()
        {
            return EntitiesHelper.GetPropertiesString(this);
        }

        public TS_VIN ToTsVinSell(string erpSoNum, string operName)
        {
            return new TS_VIN
            {
                CreateOper = operName,
                CreateTime = DateTime.Now,
                SourceId = erpSoNum,
                EqptCode = EqptCode,
                VinCode = Batch,
                Batch = Batch,
                Flag = 2,
                PlanOrderId = PlanOrderId,
                PartCode = PartCode,
                ProjectId = WmsCache.GetProjectId(PartCode)
            };
        }

        public TB_PRODUCT_SELL ToProductSell(string erpSoNum, decimal qty)
        {
            return new TB_PRODUCT_SELL
            {
                SoBillNum = erpSoNum,
                BarCode = BarCode,
                PartCode = PartCode,
                Batch = Batch,
                FromLocCode = LocCode,
                Qty = qty,
                EqptCode = EqptCode,
                State = 0,
                Remark = ""
            };
        }

        public TB_CHECK_DETAIL ToCheckDetail(TB_CHECK_LOC locBill)
        {
            return new TB_CHECK_DETAIL
            {
                BillNum = locBill.BillNum,
                BillLocCode = locBill.LocCode,
                BookLocCode = locBill.LocCode,
                CheckLocCode = "",
                OperName = "",
                BarCode = BarCode,
                PartCode = PartCode,
                Batch = Batch,
                EqptCode = EqptCode??"",
                BookQty = Qty,
                CheckQty = 0,
                ReCheckQty = 0,
                CheckTime = WmsCache.GetServerTimeString(),
                State = State,
                VendId = VendId,
                VendBatch = VendBatch,
                ProduceDate = ProduceDate,
                
//                EnumCheckState = EnumCheckState.新增,
            };
        }

        public TS_STOCK_DETAIL Clone()
        {
            return new TS_STOCK_DETAIL
            {
                BarCode = BarCode,
                LocCode = LocCode,
                AreaCode = AreaCode,
                PartCode = PartCode,
                Batch = Batch,
                VendId = VendId,
                EqptCode = EqptCode,
                PlanOrderId = PlanOrderId,
                State = State,
                Qty = 0,
                Amount = Amount,
                ProduceDate = ProduceDate,
                OverdueDate = OverdueDate,
                UpdateTime = UpdateTime,
                UpdateQty = 0,
                TracebackCode = TracebackCode,
                ReceiveDate = ReceiveDate,
                VendBatch = VendBatch,

                VinState = VinState
            };
        }

        public TS_STOCK_CUST ToCust()
        {
            return new TS_STOCK_CUST
            {
                BarCode = BarCode,
                LocCode = LocCode,
                AreaCode = AreaCode,
                PartCode = PartCode,
                Batch = Batch,
                VendId = VendId,
                EqptCode = EqptCode,
                PlanOrderId = PlanOrderId,
                State = State,
                Qty = 0,
                Amount = Amount,
                ProduceDate = ProduceDate,
                OverdueDate = OverdueDate,
                UpdateTime = UpdateTime,
                UpdateQty = 0,
                TracebackCode = TracebackCode,
                ReceiveDate = ReceiveDate,
                VendBatch = VendBatch,

                VinState = VinState
            };
        }



        public TB_STOCK_MOVE ToStockMove( EnumStockState toState)
        {
            return new TB_STOCK_MOVE
            {                 BarCode = BarCode,
                PartCode = PartCode,
                FromBatch = Batch,
                ToBatch = Batch,
                FromLocCode = LocCode,
                ToLocCode = LocCode,
                Qty = Qty,
                FromState = State,
                ToState = toState,
                VendBatch = VendBatch,
                VendId = VendId,
                FromEqptCode = EqptCode,
                ToEqptCode = EqptCode,
                ToBarCode = BarCode
            };
        }


        public StockIn ToStockIn(decimal inQty, EnumStockState state, string remark,EnumTransType transType)
        {
            return new StockIn
            {
                BarCode = BarCode,
                PartCode = PartCode,
                Batch = Batch,
                LocCode = LocCode,
                State = state,
                InQty = inQty,
                Remark = remark,
                TemplateDetail = this,
                TransType = transType

            };
        }


        public StockOut ToStockOut(decimal outQty,EnumTransType transType)
        {
            return new StockOut
            {
                BarCode = BarCode,
                PartCode = PartCode,
                Batch = Batch,
                LocCode = LocCode,
                State = State,
                OutQty = outQty,
                TransType = transType

            };
        }

        public TS_STOCK_DETAIL ToNewStockDetail()
        {
            return new TS_STOCK_DETAIL
            {
                BarCode = PartCode,
                LocCode = LocCode,
                AreaCode = AreaCode,
                PartCode = PartCode,
                Batch = Batch,
                VendId = VendId,
                EqptCode = EqptCode,
                PlanOrderId = PlanOrderId,
                State = State,
                Qty = 0,
                Amount = Amount,
                ProduceDate = ProduceDate,
                OverdueDate = OverdueDate,
                UpdateTime = UpdateTime,
                UpdateQty = 0,
                TracebackCode = TracebackCode,
                ReceiveDate = ReceiveDate,
                VendBatch = VendBatch,

                VinState = VinState

            };
        }
    }

    public class EnumTransType
    {
        public static implicit operator TransType(EnumTransType v)
        {
            throw new NotImplementedException();
        }
    }

    public partial class TB_BILL
    {

        public override string ToString()
        {
            return EntitiesHelper.GetPropertiesString(this);
        }

        public TB_BILL ToInspectBill(EnumSubBillType subBillType)
        {
            return new TB_BILL
            {
                //                BillNum = "IS."+this.BillNum,
                SourceBillNum = BillNum,
                SourceBillNum2 = SourceBillNum,
                BillType = EnumBillType.Inspect,
                OperName = OperName,
                VendId = VendId,
                SubBillType = subBillType,
                GUID = Guid.NewGuid(),
            };
        }
    }

    public partial class TB_MATERIAL_RECEIVE
    {

        public override string ToString()
        {
            return EntitiesHelper.GetPropertiesString(this);
        }

        public TS_STOCK_DETAIL ToStockDetailIn(TB_BILL bill)
        {
            var part = WmsCache.GetPart(PartCode);
            if (part == null)
            {
                throw new WmsException(ErrorCode.DataNotFound, PartCode, "零件未找到");
            }
            var stock = new TS_STOCK_DETAIL
            {
                BarCode = BarCode,
                PartCode = PartCode,
                Batch = Batch,
                EqptCode = EqptCode,
                LocCode = ToLocCode,
                AreaCode = WmsCache.GetAreaCode(ToLocCode),
                Qty = Qty,
                UpdateQty = Qty,
                VendId = bill.VendId,
                ProduceDate = ProduceDate,
                OverdueDate = (ProduceDate).AddDays(WmsCache.GetValidateDays(PartCode)),
                ReceiveDate = ReceiveDate,
                VendBatch = VendBatch,
                Remark = Remark
            };

            stock.State = part.InspectType == (int)InspectType.No ? EnumStockState.合格 : EnumStockState.待检;


            return stock;
        }

        public TB_INSPECT ToInspect(TB_BILL bill)
        {

            return new TB_INSPECT
            {
                BarCode = BarCode,
                PartCode = PartCode,
                Batch = Batch,
                LocCode = ToLocCode,
                InspectType = WmsCache.GetInspectType(PartCode),
                ReceiveQty = Qty,
                SampleQty = Qty,
                InspQty = Qty,
                PassQty = 0,
                VendBatch = VendBatch,
                VendId = VendId,
                PoBillNum = PoBillNum,
                PoLine = PoLineNum,
                State = State,
            };
        }

        public TB_PICK_FACT ToPickFact(TB_BILL bill, string fromLocCode,string toLocCode)
        {
            return new TB_PICK_FACT
            {
                BarCode = BarCode,
                PartCode = PartCode,
                Batch = Batch,
                FromLocCode = fromLocCode,
                ToLocCode = toLocCode,
                Qty = Qty,
                EqptCode = EqptCode,
                State = EnumStockState.合格,
                VendId = bill.VendId,
                VendBatch = VendBatch,
                Remark = Remark
                
            };
        }

    }

    public partial class TB_PRODUCT_RECEIVE
    {

        public override string ToString()
        {
            return EntitiesHelper.GetPropertiesString(this);
        }

        public TS_STOCK_DETAIL ToStockDetailIn()
        {
            var part = WmsCache.GetPart(PartCode);
            if (part == null)
            {
                throw new WmsException(ErrorCode.DataNotFound, PartCode, $"零件号 {PartCode} 未找到");
            }
            if (part.State != PartState.A.ToString())
            {
                throw new WmsException(ErrorCode.DataNotFound, PartCode, $"零件状态 {part.State} 无法收货");
            }

            var detail = new TS_STOCK_DETAIL
            {
                BarCode = BarCode,
                PartCode = PartCode,

                Batch = Batch,
                EqptCode = EqptCode,
                LocCode = ToLocCode,
                AreaCode = WmsCache.GetAreaCode(ToLocCode),
                Qty = Qty,
                UpdateQty = Qty,
                ProduceDate = ProduceDate,
                OverdueDate = (ProduceDate).AddDays(WmsCache.GetValidateDays(PartCode)),
                ReceiveDate = ReceiveDate,

                VendId = LineId,
                TracebackCode = TraceBackCode,
                Remark = Remark
            };
            if (GoodQty > 0)
            {
                if (WmsCache.Config.成品生成报检单)
                {
                    detail.State = part.InspectType == (int) InspectType.No ? EnumStockState.合格 : EnumStockState.待检;
                }
                else
                {
                    detail.State = EnumStockState.合格;
                }
            }
            else if (ScrapQty > 0)
                detail.State = EnumStockState.生产报废;
            else if (InvalidQty > 0)
                detail.State = EnumStockState.其它报废;

          
            return detail;
        }

        public TB_INSPECT ToInspect()
        {

            return new TB_INSPECT
            {
                BarCode = BarCode,
                PartCode = PartCode,
                Batch = Batch,
                LocCode = ToLocCode,
                InspectType = WmsCache.GetInspectType(PartCode),
                ReceiveQty = Qty,
                InspQty = Qty,
                SampleQty = Qty,
                PassQty = 0,
                State = State,
            };
        }

        public TS_STOCK_DETAIL ToStockDetailOut()
        {
            var part = WmsCache.GetPart(PartCode);
            if (part == null)
            {
                throw new WmsException(ErrorCode.DataNotFound, PartCode, $"零件号 {PartCode} 未找到");
            }
            if (part.State != PartState.A.ToString())
            {
                throw new WmsException(ErrorCode.DataNotFound, PartCode, $"零件状态 {part.State} 无法收货");
            }

            var detail = new TS_STOCK_DETAIL
            {
                BarCode = BarCode,
                PartCode = PartCode,

                Batch = Batch,
                EqptCode = EqptCode,
                LocCode = ToLocCode,
                AreaCode = WmsCache.GetAreaCode(ToLocCode),
                Qty = Qty,
                UpdateQty = Qty,
                ProduceDate = ProduceDate,
                OverdueDate = (ProduceDate).AddDays(WmsCache.GetValidateDays(PartCode)),
                ReceiveDate = ReceiveDate,
                State = EnumStockState.合格,
                VendId = LineId,
                TracebackCode = TraceBackCode,
                Remark = Remark
            };


            return detail;
        }
    }

    public partial class TB_PRODUCT_SELL
    {

        public override string ToString()
        {
            return EntitiesHelper.GetPropertiesString(this);
        }

        public TS_STOCK_DETAIL ToStockDetailOut()
        {
            return new TS_STOCK_DETAIL
            {
                BarCode = BarCode,
                PartCode = PartCode,

                Batch = Batch,
                EqptCode = EqptCode,
                LocCode = FromLocCode,
                AreaCode = WmsCache.GetAreaCode(FromLocCode),
                Qty = Qty,
                UpdateQty = -Qty,  //出库更新数量为负
                State = EnumStockState.合格,
                VendBatch = Batch


            };
        }

    }

    public partial class TB_STOCK_MOVE
    {

        public override string ToString()
        {
            return EntitiesHelper.GetPropertiesString(this);
        }

        private TS_STOCK_DETAIL ToStockDetailIn(TS_STOCK_DETAIL stockDetail )
        {
            if (stockDetail == null)
                return new TS_STOCK_DETAIL
                {
                    BarCode =string.IsNullOrEmpty(ToBarCode)?BarCode:ToBarCode,
                    PartCode = PartCode,
                    Batch = ToBatch,
                    EqptCode = ToEqptCode,
                    LocCode = ToLocCode,
                    AreaCode = WmsCache.GetAreaCode(ToLocCode),
                    Qty = Qty,
                    UpdateQty = Qty,
                    //                ProduceDate = this.ProduceDate,
                    //                OverdueDate = (this.ProduceDate).AddDays(WmsCache.GetValidateDays(this.PartCode)),
                    State = ToState,
                    ReceiveDate = DateTime.Now,
                    VendBatch = VendBatch,
                    VendId = VendId
                    //TODO 以下字段如何获取
                    //                TracebackCode = this.TracebackCode,
                    //                VinState = this.VinState,
                    //                Amount = this.Amount,
                    //                UpdateTime = this.UpdateTime,
                    //                PlanOrderId = this.PlanOrderId,
                };
            var detailIn = stockDetail.Clone();
            detailIn.Qty = Qty;
            detailIn.UpdateQty = Qty;
            detailIn.EqptCode = ToEqptCode;
            return detailIn;
        }

        public StockOut ToStockOut()
        {
            return new StockOut
            {
                BarCode = BarCode,
                PartCode = PartCode,
                Batch = FromBatch,
                LocCode = FromLocCode,
                State = FromState,
                OutQty = Qty,
                //TransType = EnumTransType.None,
            };
        }

        public StockIn ToStockIn(TS_STOCK_DETAIL stockDetail)
        {
            //取得目标库位信息
            string area = WmsCache.GetAreaCode(ToLocCode);

            //获得设定的库存状态
            var state = ToState;

            //集中特殊处理的库位对应的状态
            if (area == EnumStoreArea.HOLD.ToString())
            {
                state = EnumStockState.隔离;
            }
            else if (area == EnumStoreArea.SCRAP.ToString())
            {
                state = EnumStockState.生产报废;
            }
            else if (area == EnumStoreArea.INVALID.ToString())
            {
                state = EnumStockState.其它报废;
            }

            //生成对应的入库信息
            var stockIn = new StockIn
            {
                BarCode =string.IsNullOrEmpty(ToBarCode)?BarCode:ToBarCode,
                PartCode = PartCode,
                LocCode = ToLocCode,
                State = state,
                InQty = Qty,
                Remark = Remark,
                TemplateDetail = ToStockDetailIn(stockDetail),
                //TransType = EnumTransType.None
            };
            if (WmsCache.Config.线边库去批 && area == EnumStoreArea.WIP.ToString())
            {
                var part = WmsCache.GetPart(stockIn.TemplateDetail.PartCode);

                var barcode = stockIn.TemplateDetail.PartCode + WmsCache.Config.空批次编号;
                if (part.ManageType == EnumManageType.单包装)
                    barcode += ".";
                stockIn.BarCode = barcode;
                stockIn.TemplateDetail.BarCode = barcode;
                stockIn.TemplateDetail.Batch = "";
            }

            return stockIn;
        }

        public TB_INSPECT ToInspect()
        {

            return new TB_INSPECT
            {
                BarCode = BarCode,
                PartCode = PartCode,
                Batch = ToBatch,
                LocCode = ToLocCode,
//                InspectType = WmsCache.GetInspectType(PartCode),
                InspectType = InspectType.All,
                ReceiveQty = Qty,
                InspQty = Qty,
                SampleQty = Qty,
                PassQty = 0,
                State = ToState,
            };
        }
    }

    public partial class TB_PACK_UNPACK
    {

        public override string ToString()
        {
            return EntitiesHelper.GetPropertiesString(this);
        }

        public TS_STOCK_DETAIL ToStockDetailOut()
        {
            return new TS_STOCK_DETAIL
            {
                BarCode = FromBarCode,
                PartCode = PartCode,

                Batch = Batch,
                EqptCode = FromEqptCode,
                LocCode = FromLocCode,
                AreaCode = WmsCache.GetAreaCode(FromLocCode),
                Qty = Qty,
                UpdateQty = -Qty, //出库更新数量为负
                ProduceDate = ProduceDate,
                OverdueDate = ProduceDate.AddDays(WmsCache.GetValidateDays(PartCode)),
                State = State,
                ReceiveDate = DateTime.Now,
                VendBatch = Batch


            };
        }


        public TS_STOCK_DETAIL ToStockDetailIn(WmsEntities db)
        {

            var stockDetail = db.TS_STOCK_DETAIL.SingleOrDefault(p => p.BarCode == ToBarCode &&p.PartCode==PartCode && p.LocCode == ToLocCode && p.State == State);
            if (stockDetail != null)
            {
                var detailIn = stockDetail.Clone();
                detailIn.Qty = Qty;
                detailIn.UpdateQty = Qty;
                detailIn.EqptCode = ToEqptCode;
                return detailIn;
            }
            return new TS_STOCK_DETAIL
            {
                BarCode = ToBarCode,
                PartCode = PartCode,

                Batch = Batch,
                EqptCode = ToEqptCode,
                LocCode = ToLocCode,
                AreaCode = WmsCache.GetAreaCode(ToLocCode),
                Qty = Qty,
                UpdateQty = Qty,
                ReceiveDate = DateTime.Now,
                ProduceDate = ProduceDate,
                OverdueDate = (ProduceDate).AddDays(WmsCache.GetValidateDays(PartCode)),
                State = State,

                VendBatch = VendBatch,
                VendId = VendId
                //TODO 以下字段如何获取
                //                                    TracebackCode = this.TracebackCode,
                //                                    VinState = this.VinState,
                //                                    Amount = this.Amount,
                //                                    UpdateTime = this.UpdateTime,
                //                                    PlanOrderId = this.PlanOrderId,
            };
        }

        public StockOut ToStockOut()
        {
            return new StockOut
            {
                BarCode = FromBarCode,
                PartCode = PartCode,
                Batch = Batch,
                LocCode = FromLocCode,
                State = State,
                OutQty = Qty,
                //TransType = EnumTransType.None,
            };
        }

        public StockIn ToStockIn(WmsEntities db)
        {
            return new StockIn
            {
                BarCode = ToBarCode,
                PartCode = PartCode,
                Batch = Batch,
                LocCode = ToLocCode,
                State = State,
                InQty = Qty,
                TemplateDetail = ToStockDetailIn(db),
                Remark = Remark,
                //TransType = EnumTransType.None
            };
        }
    }

    public partial class TL_OPER
    {
        public override string ToString()
        {
            return EntitiesHelper.GetPropertiesString(this);
        }
    }

    public partial class TA_PART
    {

        public override string ToString()
        {
            return EntitiesHelper.GetPropertiesString(this);
        }

        public TA_PART_S ToS()
        {
            return new TA_PART_S
            {
                PartCode = PartCode,
                ErpPartCode = ErpPartCode,
                PartDesc1 = PartDesc1,
                PartDesc2 = PartDesc2,
                ProjectId = ProjectId,
                Unit = Unit,
                PartKind = PartKind,
                ManageType = ManageType,
                InspectType = InspectType,
                State = State,
                Configuration = Configuration,
                LinesidePackQty = LinesidePackQty,
                PartType = PartType,
                DefaultReceiveLocCode = DefaultReceiveLocCode,
                DistributionType = DistributionType,
                PartGroup = PartGroup,
                StockPackQty = StockPackQty
            };

        }
    }


    public partial class TA_STORE_LOCATION
    {
        public override string ToString()
        {
            return EntitiesHelper.GetPropertiesString(this);
        }
    }

    public partial class TA_BILLTYPE
    {
        public override string ToString()
        {
            return EntitiesHelper.GetPropertiesString(this);
        }
    }

    public partial class TA_CONFIG
    {
        public override string ToString()
        {
            return EntitiesHelper.GetPropertiesString(this);
        }
    }

    public partial class TS_INTERFACE
    {
        public override string ToString()
        {
            return EntitiesHelper.GetPropertiesString(this);
        }
    }

    public partial class TS_VIN
    {
        public override string ToString()
        {
            return EntitiesHelper.GetPropertiesString(this);
        }

        public TB_BILL ToBill(EnumBillType billType)
        {
            return new TB_BILL
            {
                BillType = billType,
                OperName = CreateOper,
                SourceBillNum = VinCode,
                SourceBillNum2 = PlanOrderId,
                ProjectId = ProjectId,
                StartTime = CreateTime.ToString(),
                GUID = Guid.NewGuid(),
            };
        }

        public TS_STOCK_DETAIL ToStockDetailIn(string toLocCode, decimal amount)
        {
            //            var tsStockDetail = new TS_STOCK_DETAIL
            //            {
            //                BarCode = this.VinCode + "." + this.PartCode,
            //                PlanOrderId = this.PlanOrderId,
            //
            //                PartCode = this.PartCode,
            //                Batch = this.Batch,
            //                EqptCode = this.EqptCode,
            //                LocCode = toLocCode,
            //                UpdateTime = DateTime.Now,
            //                //                State = (int)VinState.Received,
            //                Amount = amount,
            //                Qty = 0,
            //                UpdateQty = 1,
            //            };
            //            var part = WmsCache.GetPart( this.PartCode);
            return new TS_STOCK_DETAIL
            {
                BarCode = GetBarCode(),
                PlanOrderId = PlanOrderId,

                PartCode = PartCode,
                Batch = Batch,
                EqptCode = EqptCode,
                LocCode = toLocCode,
                AreaCode = WmsCache.GetAreaCode(toLocCode),
                UpdateTime = DateTime.Now,
                Amount = amount,
                Qty = 1,
                UpdateQty = 1,
                ProduceDate = CreateTime,
                OverdueDate = CreateTime.AddDays(WmsCache.GetValidateDays(PartCode)),
                State = EnumStockState.合格,
                ReceiveDate = DateTime.Now,
                VinState = (int)VinState.Received,
                Remark = ""
            };

        }

        public TS_VIN_HIS ToVinHis()
        {
            return new TS_VIN_HIS
            {
                SourceId = SourceId,
                EqptCode = EqptCode,
                CreateOper = CreateOper,
                CreateTime = CreateTime,
                Flag = Flag,
                VinCode = VinCode,
                PartCode = PartCode,
                ProjectId = WmsCache.GetProjectId(PartCode),
                PlanOrderId = PlanOrderId,
                Batch = Batch,
                ExecTime = DateTime.Now,
                ErrorCode = ErrorCode,
                ErrorText = ErrorText
            };
        }

        public string GetBarCode()
        {
            return PartCode.Trim() + "." + Batch.Trim();
        }
    }

    public partial class TS_VIN_HIS
    {
        public override string ToString()
        {
            return EntitiesHelper.GetPropertiesString(this);
        }

    }

    public partial class TS_SORT_DETAIL
    {
        public override string ToString()
        {
            return EntitiesHelper.GetPropertiesString(this);
        }
        public TS_VIN ToTsVinReceive(string operName)
        {
            return new TS_VIN
            {
                CreateOper = operName,
                CreateTime = DateTime.Now,
                SourceId = BillNum,
                EqptCode = "",
                VinCode = VinCode,
                Batch = VinCode,
                Flag = 0,
                PlanOrderId = SeqNum,
                PartCode = PartCode,
                ProjectId = ProjectId
            };
        }

        public TS_VIN ToTsVinDeliver(string operName)
        {
            return new TS_VIN
            {
                CreateOper = operName,
                CreateTime = DateTime.Now,
                SourceId = BillNum,
                EqptCode = "",
                VinCode = VinCode,
                Batch = VinCode,
                Flag = 1,
                PlanOrderId = SeqNum,
                PartCode = PartCode,
                ProjectId = ProjectId
            };
        }

    }

    public partial class TR_BALANCE_COMPARE_VIN
    {
        public override string ToString()
        {
            return EntitiesHelper.GetPropertiesString(this);
        }
    }

    public partial class TA_VENDER
    {
        public override string ToString()
        {
            return EntitiesHelper.GetPropertiesString(this);
        }

    }

    public partial class TS_UNI_API
    {
        public override string ToString()
        {
            return EntitiesHelper.GetPropertiesString(this);
        }

        public TS_UNI_API_HIS ToHis()
        {
            return new TS_UNI_API_HIS
            {
                InterfaceType = InterfaceType,
                TableName = TableName,
                BillType = BillType,
                SubBillType = SubBillType,
                BillNum = BillNum,
                PartCode = PartCode,
                Batch = Batch,
                FromLoc = FromLoc,
                ToLoc = ToLoc,
                FromErpLoc = FromErpLoc,
                ToErpLoc = ToErpLoc,
                Qty = Qty,
                GoodQty = GoodQty,
                ScrapQty = ScrapQty,
                InvalidQty = InvalidQty,
                State = State,
                CreateOper = CreateOper,
                CreateTime = CreateTime,
                PutTime = PutTime,
                CustId = CustId,
                VendId = VendId,
                PoUnit = PoUnit,
                LocUnit = LocUnit,
                ValidDate = ValidDate,
                ErpBillNum = ErpBillNum,
                ErpLineNum = ErpLineNum,
                EqptCode = EqptCode,
                EqptType = EqptType,
                VendBatch = VendBatch,
                WorklineId = WorklineId,
                ProcessId = ProcessId,
                SourceBillNum = SourceBillNum
            };
        }
    }

    public partial class TB_OFFICE_RECIVE
    {
        public StockIn ToStockIn(decimal inQty, TS_STOCK_DETAIL stockdetail, string remark = "")
        {
            return new StockIn
            {
                BarCode = PartCode,
                PartCode = PartCode,
                Batch = Batch,
                LocCode = ToLocCode,
                State = stockdetail.State,
                InQty = ReciveQty,
                Remark = remark,
                TemplateDetail = stockdetail,
                //TransType = EnumTransType.None
            };
        }
    }

    public partial class TB_OFFICE_OUT
    {
        public StockOut ToStockOut(TS_STOCK_DETAIL stockdetail)
        {
            return new StockOut()
            {
                BarCode = PartCode,
                PartCode = PartCode,
                Batch = Batch,
                LocCode = FromLocCode,
                State = stockdetail.State,
                OutQty = OutQty,
                //TransType = EnumTransType.Out
            };
        }
    }
}